Skip to content

Artifacts

DISCLAIMER // NFA // DYOR

This analysis is based on observations of the contract behavior. We are not smart contract security experts. This document aims to explain what the contract appears to do based on the code. It should not be considered a comprehensive security audit or financial advice. Always verify critical information independently and consult with blockchain security professionals for important decisions.

⊙ generated by robots | curated by humans

METADATA
Contract Address 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3 (etherscan)
Network Ethereum Mainnet
Analysis Date 2026-01-24

Runtime Bytecode

The deployed contract bytecode fetched from the blockchain.

Source: Etherscan - Contract Code

Command:

export ETH_RPC_URL=https://eth.llamarpc.com
cast code 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3

Artifact:

0x608060405234801561000f575f5ffd5b50600436106100cd575f3560e01c80638da5cb5b1161008a578063b0ea6a7211610064578063b0ea6a72146101ea578063de7e88f91461021a578063f1ab99d61461024a578063f2fde38b1461027a576100cd565b80638da5cb5b14610180578063983becfb1461019e578063a51b9533146101ba576100cd565b80630b248c1c146100d15780631036bbe21461010257806352019b9814610120578063715018a61461013c5780637b1aa7de1461014657806380230aab14610164575b5f5ffd5b6100eb60048036038101906100e69190610cbc565b610296565b6040516100f9929190610cff565b60405180910390f35b61010a6102b6565b6040516101179190610d26565b60405180910390f35b61013a60048036038101906101359190610df5565b6102bd565b005b610144610525565b005b61014e610538565b60405161015b9190610eb4565b60405180910390f35b61017e60048036038101906101799190610ef7565b61053d565b005b610188610628565b6040516101959190610f74565b60405180910390f35b6101b860048036038101906101b39190610ef7565b61064f565b005b6101d460048036038101906101cf9190610cbc565b6106f5565b6040516101e19190610d26565b60405180910390f35b61020460048036038101906101ff9190610cbc565b610761565b6040516102119190610d26565b60405180910390f35b610234600480360381019061022f9190610f8d565b6107ce565b6040516102419190611082565b60405180910390f35b610264600480360381019061025f9190610f8d565b61093d565b6040516102719190611082565b60405180910390f35b610294600480360381019061028f91906110cc565b610aab565b005b6001602052805f5260405f205f91509050805f0154908060010154905082565b620f424081565b6102c5610b2f565b83839050868690501480156102df57508181905084849050145b61031e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031590611151565b60405180910390fd5b5f8686905090505f5f90505b818110156104da575f8888838181106103465761034561116f565b5b905060200201602081019061035b9190610cbc565b90505f8787848181106103715761037061116f565b5b9050602002013590505f86868581811061038e5761038d61116f565b5b905060200201359050606460ff168360ff1611156103e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d8906111e6565b60405180910390fd5b620f4240821115610427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041e9061124e565b60405180910390fd5b60405180604001604052808381526020018281525060015f8560ff1660ff1681526020019081526020015f205f820151815f015560208201518160010155905050818360ff167f2e856dead22947534483066a59b1e82009be0b73aafe9d16eecbad003e5f1b2a60405160405180910390a3808360ff167f96a5a1d14ea0d00a488e250d387c794e01dcb33de255a7b5a81562b34a8350c060405160405180910390a3505050808060010191505061032a565b507fecb7c99803676adc7e8aa6fe85d78f9e59786fa192949f3803d74545665159fc87878787878760405161051496959493929190611390565b60405180910390a150505050505050565b61052d610b2f565b6105365f610bb6565b565b606481565b610545610b2f565b606460ff168260ff16111561058f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610586906111e6565b60405180910390fd5b620f42408111156105d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cc9061124e565b60405180910390fd5b8060015f8460ff1660ff1681526020019081526020015f205f0181905550808260ff167f2e856dead22947534483066a59b1e82009be0b73aafe9d16eecbad003e5f1b2a60405160405180910390a35050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610657610b2f565b606460ff168260ff1611156106a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610698906111e6565b60405180910390fd5b8060015f8460ff1660ff1681526020019081526020015f2060010181905550808260ff167f96a5a1d14ea0d00a488e250d387c794e01dcb33de255a7b5a81562b34a8350c060405160405180910390a35050565b5f606460ff168260ff161115610740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610737906111e6565b60405180910390fd5b60015f8360ff1660ff1681526020019081526020015f205f01549050919050565b5f606460ff168260ff1611156107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a3906111e6565b60405180910390fd5b60015f8360ff1660ff1681526020019081526020015f20600101549050919050565b60608160ff168360ff161115610819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108109061142a565b60405180910390fd5b606460ff168260ff161115610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90611492565b60405180910390fd5b5f6001848461087291906114dd565b61087c9190611511565b60ff1690505f8167ffffffffffffffff81111561089c5761089b611545565b5b6040519080825280602002602001820160405280156108ca5781602001602082028036833780820191505090505b5090505f5f90505b82811015610931575f81876108e79190611511565b905060015f8260ff1660ff1681526020019081526020015f20600101548383815181106109175761091661116f565b5b6020026020010181815250505080806001019150506108d2565b50809250505092915050565b60608160ff168360ff161115610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f9061142a565b60405180910390fd5b606460ff168260ff1611156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990611492565b60405180910390fd5b5f600184846109e191906114dd565b6109eb9190611511565b60ff1690505f8167ffffffffffffffff811115610a0b57610a0a611545565b5b604051908082528060200260200182016040528015610a395781602001602082028036833780820191505090505b5090505f5f90505b82811015610a9f575f8187610a569190611511565b905060015f8260ff1660ff1681526020019081526020015f205f0154838381518110610a8557610a8461116f565b5b602002602001018181525050508080600101915050610a41565b50809250505092915050565b610ab3610b2f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b23575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b1a9190610f74565b60405180910390fd5b610b2c81610bb6565b50565b610b37610c77565b73ffffffffffffffffffffffffffffffffffffffff16610b55610628565b73ffffffffffffffffffffffffffffffffffffffff1614610bb457610b78610c77565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610bab9190610f74565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5ffd5b5f5ffd5b5f60ff82169050919050565b610c9b81610c86565b8114610ca5575f5ffd5b50565b5f81359050610cb681610c92565b92915050565b5f60208284031215610cd157610cd0610c7e565b5b5f610cde84828501610ca8565b91505092915050565b5f819050919050565b610cf981610ce7565b82525050565b5f604082019050610d125f830185610cf0565b610d1f6020830184610cf0565b9392505050565b5f602082019050610d395f830184610cf0565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112610d6057610d5f610d3f565b5b8235905067ffffffffffffffff811115610d7d57610d7c610d43565b5b602083019150836020820283011115610d9957610d98610d47565b5b9250929050565b5f5f83601f840112610db557610db4610d3f565b5b8235905067ffffffffffffffff811115610dd257610dd1610d43565b5b602083019150836020820283011115610dee57610ded610d47565b5b9250929050565b5f5f5f5f5f5f60608789031215610e0f57610e0e610c7e565b5b5f87013567ffffffffffffffff811115610e2c57610e2b610c82565b5b610e3889828a01610d4b565b9650965050602087013567ffffffffffffffff811115610e5b57610e5a610c82565b5b610e6789828a01610da0565b9450945050604087013567ffffffffffffffff811115610e8a57610e89610c82565b5b610e9689828a01610da0565b92509250509295509295509295565b610eae81610c86565b82525050565b5f602082019050610ec75f830184610ea5565b92915050565b610ed681610ce7565b8114610ee0575f5ffd5b50565b5f81359050610ef181610ecd565b92915050565b5f5f60408385031215610f0d57610f0c610c7e565b5b5f610f1a85828601610ca8565b9250506020610f2b85828601610ee3565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f5e82610f35565b9050919050565b610f6e81610f54565b82525050565b5f602082019050610f875f830184610f65565b92915050565b5f5f60408385031215610fa357610fa2610c7e565b5b5f610fb085828601610ca8565b9250506020610fc185828601610ca8565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b610ffd81610ce7565b82525050565b5f61100e8383610ff4565b60208301905092915050565b5f602082019050919050565b5f61103082610fcb565b61103a8185610fd5565b935061104583610fe5565b805f5b8381101561107557815161105c8882611003565b97506110678361101a565b925050600181019050611048565b5085935050505092915050565b5f6020820190508181035f83015261109a8184611026565b905092915050565b6110ab81610f54565b81146110b5575f5ffd5b50565b5f813590506110c6816110a2565b92915050565b5f602082840312156110e1576110e0610c7e565b5b5f6110ee848285016110b8565b91505092915050565b5f82825260208201905092915050565b7f4172726179206c656e677468206d69736d6174636800000000000000000000005f82015250565b5f61113b6015836110f7565b915061114682611107565b602082019050919050565b5f6020820190508181035f8301526111688161112f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f446179206f7574206f662072616e6765000000000000000000000000000000005f82015250565b5f6111d06010836110f7565b91506111db8261119c565b602082019050919050565b5f6020820190508181035f8301526111fd816111c4565b9050919050565b7f50657263656e74206f7574206f662072616e67650000000000000000000000005f82015250565b5f6112386014836110f7565b915061124382611204565b602082019050919050565b5f6020820190508181035f8301526112658161122c565b9050919050565b5f82825260208201905092915050565b5f819050919050565b61128e81610c86565b82525050565b5f61129f8383611285565b60208301905092915050565b5f6112b96020840184610ca8565b905092915050565b5f602082019050919050565b5f6112d8838561126c565b93506112e38261127c565b805f5b8581101561131b576112f882846112ab565b6113028882611294565b975061130d836112c1565b9250506001810190506112e6565b5085925050509392505050565b5f5ffd5b82818337505050565b5f6113408385610fd5565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561137357611372611328565b5b60208302925061138483858461132c565b82840190509392505050565b5f6060820190508181035f8301526113a981888a6112cd565b905081810360208301526113be818688611335565b905081810360408301526113d3818486611335565b9050979650505050505050565b7f7374617274203e20656e640000000000000000000000000000000000000000005f82015250565b5f611414600b836110f7565b915061141f826113e0565b602082019050919050565b5f6020820190508181035f83015261144181611408565b9050919050565b7f656e64206f7574206f662072616e6765000000000000000000000000000000005f82015250565b5f61147c6010836110f7565b915061148782611448565b602082019050919050565b5f6020820190508181035f8301526114a981611470565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6114e782610c86565b91506114f283610c86565b9250828203905060ff81111561150b5761150a6114b0565b5b92915050565b5f61151b82610c86565b915061152683610c86565b9250828201905060ff81111561153f5761153e6114b0565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffdfea2646970667358221220b4216b87166e62b939af5eef802447188462dd41007c5af310c3efa5f2f416cd64736f6c634300081e0033


Creation Bytecode

The full bytecode used to deploy the contract, including constructor code and arguments.

Source: Etherscan - Creation TX

Command:

export ETH_RPC_URL=https://eth.llamarpc.com
cast tx 0x3d9ef3bb6abcdfd4d917bdb4848e96eced3f6806eecee3539f0131409b2debbb input

Artifact:

Not retrieved during analysis. Use the command above to fetch from chain.


Reconstructed Source Code

Solidity source code reconstructed from bytecode analysis. This is an approximation based on function selectors, storage layout, and error messages found in the bytecode.

Not Verified Source

This is a reconstruction based on bytecode analysis and may not exactly match the original source code. It is provided for educational and analysis purposes only.

Source: Reconstructed from bytecode analysis using function selectors, storage slots, and error message strings.

Artifact:

// SPDX-License-Identifier: UNKNOWN
// Reconstructed from bytecode at 0x1aa0c77d207cd2e20dc00523ee0511ac6514aeb3
// Compiler: Solidity 0.8.30
// Deployed: Block 23,879,687 (November 25, 2025)

pragma solidity ^0.8.0;

contract SentinelDayPercentManager {

    // ============ State Variables ============

    address private _owner;

    mapping(uint8 => DaySchedule) private _daySchedules;

    struct DaySchedule {
        uint256 percent;  // Percentage in basis points (max 1,000,000 = 100%)
        uint256 amount;   // Amount for this day (purpose unknown)
    }

    // ============ Constants ============

    uint8 public constant MAX_DAY = 100;
    uint256 public constant MAX_PERCENT = 1_000_000;

    // ============ Events ============

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event DayPercentUpdated(uint8 indexed day, uint256 percent);
    event DayAmountUpdated(uint8 indexed day, uint256 amount);
    event BatchScheduleUpdated(uint8[] days, uint256[] percents, uint256[] amounts);

    // ============ Errors ============

    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);

    // ============ Modifiers ============

    modifier onlyOwner() {
        if (msg.sender != _owner) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
        _;
    }

    // ============ Constructor ============

    constructor() {
        if (msg.sender == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(msg.sender);
    }

    // ============ Admin Functions ============

    function batchSetDaySchedule(
        uint8[] calldata days,
        uint256[] calldata percents,
        uint256[] calldata amounts
    ) external onlyOwner {
        require(
            days.length == percents.length && percents.length == amounts.length,
            "Array length mismatch"
        );

        uint256 length = days.length;
        for (uint256 i = 0; i < length; i++) {
            uint8 day = days[i];
            uint256 percent = percents[i];
            uint256 amount = amounts[i];

            require(day <= MAX_DAY, "Day out of range");
            require(percent <= MAX_PERCENT, "Percent out of range");

            _daySchedules[day] = DaySchedule({
                percent: percent,
                amount: amount
            });

            emit DayPercentUpdated(day, percent);
            emit DayAmountUpdated(day, amount);
        }

        emit BatchScheduleUpdated(days, percents, amounts);
    }

    function setDayPercent(uint8 day, uint256 percent) external onlyOwner {
        require(day <= MAX_DAY, "Day out of range");
        require(percent <= MAX_PERCENT, "Percent out of range");

        _daySchedules[day].percent = percent;

        emit DayPercentUpdated(day, percent);
    }

    function setDayAmount(uint8 day, uint256 amount) external onlyOwner {
        require(day <= MAX_DAY, "Day out of range");

        _daySchedules[day].amount = amount;

        emit DayAmountUpdated(day, amount);
    }

    function renounceOwnership() external onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) external onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    // ============ View Functions ============

    function owner() public view returns (address) {
        return _owner;
    }

    function dayInfo(uint8 day) external view returns (uint256 percent, uint256 amount) {
        return (_daySchedules[day].percent, _daySchedules[day].amount);
    }

    function getPercent(uint8 day) external view returns (uint256) {
        require(day <= MAX_DAY, "Day out of range");
        return _daySchedules[day].percent;
    }

    function getAmount(uint8 day) external view returns (uint256) {
        require(day <= MAX_DAY, "Day out of range");
        return _daySchedules[day].amount;
    }

    function getPercentRange(uint8 start, uint8 end) external view returns (uint256[] memory) {
        require(start <= end, "start > end");
        require(end <= MAX_DAY, "end out of range");

        uint256 length = uint256(end - start) + 1;
        uint256[] memory percents = new uint256[](length);

        for (uint256 i = 0; i < length; i++) {
            uint8 day = start + uint8(i);
            percents[i] = _daySchedules[day].percent;
        }

        return percents;
    }

    function getAmountRange(uint8 start, uint8 end) external view returns (uint256[] memory) {
        require(start <= end, "start > end");
        require(end <= MAX_DAY, "end out of range");

        uint256 length = uint256(end - start) + 1;
        uint256[] memory amounts = new uint256[](length);

        for (uint256 i = 0; i < length; i++) {
            uint8 day = start + uint8(i);
            amounts[i] = _daySchedules[day].amount;
        }

        return amounts;
    }

    // ============ Internal Functions ============

    function _transferOwnership(address newOwner) internal {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


Additional Artifacts

Function Selector Mapping

Source: Extracted from bytecode PUSH4 instructions and verified via 4byte.directory.

Artifact:

# Admin Functions (Owner Only)
0x52019b98 | batchSetDaySchedule(uint8[],uint256[],uint256[])
0x80230aab | setDayPercent(uint8,uint256)
0x983becfb | setDayAmount(uint8,uint256)
0x715018a6 | renounceOwnership()
0xf2fde38b | transferOwnership(address)

# View Functions (Public)
0x8da5cb5b | owner()
0x0b248c1c | dayInfo(uint8)
0x1036bbe2 | MAX_PERCENT()
0x7b1aa7de | MAX_DAY()
0xa51b9533 | getPercent(uint8)
0xb0ea6a72 | getAmount(uint8)
0xde7e88f9 | getAmountRange(uint8,uint8)
0xf1ab99d6 | getPercentRange(uint8,uint8)


Event Signatures

Source: Derived from topic0 hashes observed in transaction logs and verified via keccak256 computation.

Artifact:

# Event: OwnershipTransferred(address,address)
Topic0: 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0
Parameters:
  - previousOwner (address, indexed)
  - newOwner (address, indexed)

# Event: DayPercentUpdated(uint8,uint256)
Topic0: 0x2e856dead22947534483066a59b1e82009be0b73aafe9d16eecbad003e5f1b2a
Parameters:
  - day (uint8, indexed)
  - percent (uint256)

# Event: DayAmountUpdated(uint8,uint256)
Topic0: 0x96a5a1d14ea0d00a488e250d387c794e01dcb33de255a7b5a81562b34a8350c0
Parameters:
  - day (uint8, indexed)
  - amount (uint256)

# Event: BatchScheduleUpdated(uint8[],uint256[],uint256[])
Topic0: 0xecb7c99803676adc7e8aa6fe85d78f9e59786fa192949f3803d74545665159fc
Parameters:
  - days (uint8[])
  - percents (uint256[])
  - amounts (uint256[])


Error Signatures

Source: Extracted from bytecode revert patterns and verified via selector computation.

Artifact:

# Error: OwnableUnauthorizedAccount(address)
Selector: 0x118cdaa7
Parameter: account (address)

# Error: OwnableInvalidOwner(address)
Selector: 0x1e4fbdf7
Parameter: owner (address)

# Revert Strings:
"Array length mismatch"
"Day out of range"
"Percent out of range"
"start > end"
"end out of range"


Reconstructed ABI

Source: Compiled from function selector mapping, event signatures, and error signatures.

Artifact:

[
  {
    "type": "constructor",
    "inputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "MAX_DAY",
    "inputs": [],
    "outputs": [{"name": "", "type": "uint8"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "MAX_PERCENT",
    "inputs": [],
    "outputs": [{"name": "", "type": "uint256"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "batchSetDaySchedule",
    "inputs": [
      {"name": "days", "type": "uint8[]"},
      {"name": "percents", "type": "uint256[]"},
      {"name": "amounts", "type": "uint256[]"}
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "dayInfo",
    "inputs": [{"name": "day", "type": "uint8"}],
    "outputs": [
      {"name": "percent", "type": "uint256"},
      {"name": "amount", "type": "uint256"}
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "getAmount",
    "inputs": [{"name": "day", "type": "uint8"}],
    "outputs": [{"name": "", "type": "uint256"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "getAmountRange",
    "inputs": [
      {"name": "start", "type": "uint8"},
      {"name": "end", "type": "uint8"}
    ],
    "outputs": [{"name": "", "type": "uint256[]"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "getPercent",
    "inputs": [{"name": "day", "type": "uint8"}],
    "outputs": [{"name": "", "type": "uint256"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "getPercentRange",
    "inputs": [
      {"name": "start", "type": "uint8"},
      {"name": "end", "type": "uint8"}
    ],
    "outputs": [{"name": "", "type": "uint256[]"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "owner",
    "inputs": [],
    "outputs": [{"name": "", "type": "address"}],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "renounceOwnership",
    "inputs": [],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "setDayAmount",
    "inputs": [
      {"name": "day", "type": "uint8"},
      {"name": "amount", "type": "uint256"}
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "setDayPercent",
    "inputs": [
      {"name": "day", "type": "uint8"},
      {"name": "percent", "type": "uint256"}
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "transferOwnership",
    "inputs": [{"name": "newOwner", "type": "address"}],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "event",
    "name": "BatchScheduleUpdated",
    "inputs": [
      {"name": "days", "type": "uint8[]", "indexed": false},
      {"name": "percents", "type": "uint256[]", "indexed": false},
      {"name": "amounts", "type": "uint256[]", "indexed": false}
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "DayAmountUpdated",
    "inputs": [
      {"name": "day", "type": "uint8", "indexed": true},
      {"name": "amount", "type": "uint256", "indexed": false}
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "DayPercentUpdated",
    "inputs": [
      {"name": "day", "type": "uint8", "indexed": true},
      {"name": "percent", "type": "uint256", "indexed": false}
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "OwnershipTransferred",
    "inputs": [
      {"name": "previousOwner", "type": "address", "indexed": true},
      {"name": "newOwner", "type": "address", "indexed": true}
    ],
    "anonymous": false
  },
  {
    "type": "error",
    "name": "OwnableInvalidOwner",
    "inputs": [{"name": "owner", "type": "address"}]
  },
  {
    "type": "error",
    "name": "OwnableUnauthorizedAccount",
    "inputs": [{"name": "account", "type": "address"}]
  }
]