ETH Price: $2,905.62 (-0.67%)

Contract

0x4c5770abF8897e487671348cd59A2abf9F20D81B

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Swap282226692026-01-23 13:53:262 days ago1769176406IN
Dyson Finance: Farm
0 ETH0.000004030.03967617
Swap281990112026-01-22 23:50:123 days ago1769125812IN
Dyson Finance: Farm
0 ETH0.000003830.03778729
Swap279982292026-01-18 7:01:068 days ago1768719666IN
Dyson Finance: Farm
0 ETH0.000003390.03337568
Swap279583472026-01-17 8:42:548 days ago1768639374IN
Dyson Finance: Farm
0 ETH0.000003220.03178822
Swap279154332026-01-16 8:37:069 days ago1768552626IN
Dyson Finance: Farm
0 ETH0.000003220.03178775
Swap278671142026-01-15 5:33:5011 days ago1768455230IN
Dyson Finance: Farm
0 ETH0.000003230.03178706
Swap277810142026-01-13 5:28:5213 days ago1768282132IN
Dyson Finance: Farm
0 ETH0.000003220.03178752
Swap276949422026-01-11 5:19:5615 days ago1768108796IN
Dyson Finance: Farm
0 ETH0.000002710.03212626
Swap276517972026-01-10 5:15:0616 days ago1768022106IN
Dyson Finance: Farm
0 ETH0.000003230.03178636
Swap276086912026-01-09 5:10:2417 days ago1767935424IN
Dyson Finance: Farm
0 ETH0.000003230.03178706
Swap275655752026-01-08 5:03:1018 days ago1767848590IN
Dyson Finance: Farm
0 ETH0.000003220.03178845
Swap275315192026-01-07 10:02:0218 days ago1767780122IN
Dyson Finance: Farm
0 ETH0.000003930.03311807
Swap275192782026-01-07 3:02:0019 days ago1767754920IN
Dyson Finance: Farm
0 ETH0.000003230.03178682
Swap274763712026-01-06 2:30:0220 days ago1767666602IN
Dyson Finance: Farm
0 ETH0.000003220.03178799
Swap273964162026-01-04 2:04:3422 days ago1767492274IN
Dyson Finance: Farm
0 ETH0.000003220.03178822
Swap273196692026-01-02 0:54:0624 days ago1767315246IN
Dyson Finance: Farm
0 ETH0.000003230.03178636
Swap273122582026-01-01 19:50:1624 days ago1767297016IN
Dyson Finance: Farm
0 ETH0.000003390.03337617
Swap272477832025-12-31 0:39:5826 days ago1767141598IN
Dyson Finance: Farm
0 ETH0.000002710.03212659
Swap271756922025-12-29 0:20:5828 days ago1766967658IN
Dyson Finance: Farm
0 ETH0.000003220.03178799
Swap271415542025-12-27 22:12:2229 days ago1766873542IN
Dyson Finance: Farm
0 ETH0.000002850.03373432
Swap271047112025-12-26 17:07:1230 days ago1766768832IN
Dyson Finance: Farm
0 ETH0.000003230.03178587
Swap270709812025-12-25 16:19:5231 days ago1766679592IN
Dyson Finance: Farm
0 ETH0.000003230.03178612
Swap270357192025-12-24 15:03:3632 days ago1766588616IN
Dyson Finance: Farm
0 ETH0.000002710.03212626
Swap270009392025-12-23 14:46:4433 days ago1766501204IN
Dyson Finance: Farm
0 ETH0.000003220.03178822
Swap269639372025-12-22 14:23:2034 days ago1766413400IN
Dyson Finance: Farm
0 ETH0.000003220.03178752
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
283187352026-01-26 3:03:505 hrs ago1769396630
Dyson Finance: Farm
0 ETH
283187352026-01-26 3:03:505 hrs ago1769396630
Dyson Finance: Farm
0 ETH
283187352026-01-26 3:03:505 hrs ago1769396630
Dyson Finance: Farm
0 ETH
283187262026-01-26 3:03:285 hrs ago1769396608
Dyson Finance: Farm
0 ETH
283187262026-01-26 3:03:285 hrs ago1769396608
Dyson Finance: Farm
0 ETH
283187262026-01-26 3:03:285 hrs ago1769396608
Dyson Finance: Farm
0 ETH
283187182026-01-26 3:03:105 hrs ago1769396590
Dyson Finance: Farm
0 ETH
283187182026-01-26 3:03:105 hrs ago1769396590
Dyson Finance: Farm
0 ETH
283187182026-01-26 3:03:105 hrs ago1769396590
Dyson Finance: Farm
0 ETH
283187082026-01-26 3:02:465 hrs ago1769396566
Dyson Finance: Farm
0 ETH
283187082026-01-26 3:02:465 hrs ago1769396566
Dyson Finance: Farm
0 ETH
283187082026-01-26 3:02:465 hrs ago1769396566
Dyson Finance: Farm
0 ETH
283187002026-01-26 3:02:285 hrs ago1769396548
Dyson Finance: Farm
0 ETH
283187002026-01-26 3:02:285 hrs ago1769396548
Dyson Finance: Farm
0 ETH
283187002026-01-26 3:02:285 hrs ago1769396548
Dyson Finance: Farm
0 ETH
282874642026-01-25 6:52:1225 hrs ago1769323932
Dyson Finance: Farm
0 ETH
282874642026-01-25 6:52:1225 hrs ago1769323932
Dyson Finance: Farm
0 ETH
282874642026-01-25 6:52:1225 hrs ago1769323932
Dyson Finance: Farm
0 ETH
282811632026-01-25 2:57:2629 hrs ago1769309846
Dyson Finance: Farm
0 ETH
282811632026-01-25 2:57:2629 hrs ago1769309846
Dyson Finance: Farm
0 ETH
282811632026-01-25 2:57:2629 hrs ago1769309846
Dyson Finance: Farm
0 ETH
282811542026-01-25 2:57:0429 hrs ago1769309824
Dyson Finance: Farm
0 ETH
282811542026-01-25 2:57:0429 hrs ago1769309824
Dyson Finance: Farm
0 ETH
282811542026-01-25 2:57:0429 hrs ago1769309824
Dyson Finance: Farm
0 ETH
282811452026-01-25 2:56:4429 hrs ago1769309804
Dyson Finance: Farm
0 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Farm

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-3.0-only

import "interface/IAgency.sol";
import "interface/IERC20Mintable.sol";
import "interface/IGauge.sol";
import "./lib/ABDKMath64x64.sol";
import "./lib/TransferHelper.sol";

/// @title Contract for Dyson user to earn extra rewards.
/// A Pair and a Gauge contract together form a pool.
/// This contract will record reward related info about each pools.
/// Each Pair will trigger `Farm.grantSP` upon user deposit,
/// it will add to user's SP balance.
/// User can call `Farm.swap` to swap SP token to gov token, i.e., DYSON token.
contract Farm {
    using ABDKMath64x64 for *;
    using TransferHelper for address;

    int128 private constant MAX_AP_RATIO = 2**64;
    uint private constant BONUS_BASE_UNIT = 1e18;
    /// @notice Cooldown before user can swap his SP to gov token
    uint private constant CD = 6000;
    IAgency public immutable agency;
    /// @notice Governance token, i.e., DYSON token
    IERC20Mintable public immutable gov;

    address public owner;

    /// @member weight A parameter in the exchange formula when converting localSP to globalSP or converting globalSP to DYSON.
    /// The higher the weight, the lower the reward
    /// @member rewardRate Pool reward rate. The higher the rate, the faster the reserve grows
    /// @member lastUpdateTime Last time the pool reserve is updated
    /// @member lastReserve The pool reserve amount when last updated
    /// @member gauge Gauge contract of the pool which records the pool's weight and rewardRate
    struct Pool {
        uint weight;
        uint rewardRate;
        uint lastUpdateTime;
        uint lastReserve;
        address gauge;
    }

    /// @notice The special pool for gov token
    Pool public globalPool;

    /// Param poolId Id of the pool. Note that pool id is the address of Pair contract
    mapping(address => Pool) public pools;
    /// @notice User's SP balance
    mapping(address => uint) public balanceOf;
    /// @notice Timestamp when user's cooldown ends
    mapping(address => uint) public cooldown;

    event TransferOwnership(address newOwner);
    event RateUpdated(address indexed poolId, uint rewardRate, uint weight);
    event GrantSP(address indexed user, address indexed poolId, uint amountIn, uint amountOut);
    event Swap(address indexed user, address indexed parent, uint amountIn, uint amountOut);

    constructor(address _owner, address _agency, address _gov) {
        require(_owner != address(0), "owner cannot be zero");
        owner = _owner;
        agency = IAgency(_agency);
        gov = IERC20Mintable(_gov);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "forbidden");
        _;
    }

    function transferOwnership(address _owner) external onlyOwner {
        require(_owner != address(0), "owner cannot be zero");
        owner = _owner;

        emit TransferOwnership(_owner);
    }

    /// @notice rescue token stucked in this contract
    /// @param tokenAddress Address of token to be rescued
    /// @param to Address that will receive token
    /// @param amount Amount of token to be rescued
    function rescueERC20(address tokenAddress, address to, uint256 amount) onlyOwner external {
        tokenAddress.safeTransfer(to, amount);
    }

    /// @dev Set the Gauge contract for given pool
    /// @param poolId Pool Id, i.e., address of the Pair contract
    /// @param gauge address of the Gauge contract
    function setPool(address poolId, address gauge) external onlyOwner {
        Pool storage pool = pools[poolId];
        pool.gauge = gauge;
        pool.lastReserve = getCurrentPoolReserve(poolId);
        pool.lastUpdateTime = block.timestamp;
        pool.rewardRate = IGauge(gauge).nextRewardRate();
        pool.weight = IGauge(gauge).weight();
        emit RateUpdated(poolId, pool.rewardRate, pool.weight);
    }

    /// @dev Update given pool's `weight` and `rewardRate`, triggered by the pool's Gauge contract
    /// @param poolId Pool Id, i.e., address of the Pair contract
    /// @param rewardRate New `rewardRate`
    /// @param weight New `weight`
    function setPoolRewardRate(address poolId, uint rewardRate, uint weight) external {
        Pool storage pool = pools[poolId];
        require(pool.gauge == msg.sender, "not gauge");
        pool.lastReserve = getCurrentPoolReserve(poolId);
        pool.lastUpdateTime = block.timestamp;
        pool.rewardRate = rewardRate;
        pool.weight = weight;
        emit RateUpdated(poolId, rewardRate, weight);
    }

    /// @notice Update gov token pool's `rewardRate` and `weight`
    /// @param rewardRate New `rewardRate`
    /// @param weight New `weight`
    function setGlobalRewardRate(uint rewardRate, uint weight) external onlyOwner {
        globalPool.lastReserve = getCurrentGlobalReserve();
        globalPool.lastUpdateTime = block.timestamp;
        globalPool.rewardRate = rewardRate;
        globalPool.weight = weight;
        emit RateUpdated(address(this), rewardRate, weight);
    }

    /// @notice Get current reserve amount of given pool
    /// @param poolId Pool Id, i.e., address of the Pair contract
    /// @return reserve Current reserve amount
    function getCurrentPoolReserve(address poolId) public view returns (uint reserve) {
        Pool storage pool = pools[poolId];
        reserve = (block.timestamp - pool.lastUpdateTime) * pool.rewardRate + pool.lastReserve;
    }

    /// @notice Get current reserve amount of gov token pool
    /// @return reserve Current reserve amount
    function getCurrentGlobalReserve() public view returns (uint reserve) {
        reserve = (block.timestamp - globalPool.lastUpdateTime) * globalPool.rewardRate + globalPool.lastReserve;
    }

    /// @dev Calculate reward amount with given amount, reserve amount and weight:
    /// reward = reserve * (1 - 2^(-amount/w))
    /// @param _reserve Reserve amount
    /// @param _amount LocalSP or GlobalSP amount
    /// @param _w Weight
    /// @return reward Reward amount in either globalSP or gov token
    function _calcRewardAmount(uint _reserve, uint _amount, uint _w) internal pure returns (uint reward) {
        int128 r = _amount.divu(_w);
        int128 e = (-r).exp_2();
        reward = (MAX_AP_RATIO - e).mulu(_reserve);
    }

    /// @notice Triggered by Pair contract to grant user SP upon user deposit
    /// If user also stake his sGov token, i.e., sDYSON token in the pool's Gauge contract, he will receive bouns localSP.
    /// @dev The pool's `lastReserve` and `lastUpdateTime` are updated each time `grantSP` is triggered 
    /// @param to User's address
    /// @param amount Amount of localSP
    function grantSP(address to, uint amount) external {
        if(agency.whois(to) == 0) return;
        Pool storage pool = pools[msg.sender];
        // check pool bonus
        uint bonus = IGauge(pool.gauge).bonus(to);
        if (bonus > 0) amount = amount * (bonus + BONUS_BASE_UNIT) / BONUS_BASE_UNIT;
        // swap localSP to globalSP
        uint reserve = getCurrentPoolReserve(msg.sender);
        uint SPAmount = _calcRewardAmount(reserve, amount, pool.weight);

        pool.lastReserve = reserve - SPAmount;
        pool.lastUpdateTime = block.timestamp;
        balanceOf[to] += SPAmount;
        emit GrantSP(to, msg.sender, amount, SPAmount);
    }

    /// @notice Swap given `user`'s SP to gov token.
    /// This can be done by a third party.
    /// User can only swap if his cooldown has ended. Cooldown time depends on user's generation in the referral system.
    /// User need to register in the referral system to be able to swap.
    /// User's referrer will receive 1/3 of user's SP upon swap.
    function swap(address user) external returns (uint amountOut) {
        require(block.timestamp > cooldown[user], "cd");
        if(agency.whois(user) == 0) return 0;
        (address ref, uint gen) = agency.userInfo(user);
        cooldown[user] = block.timestamp + (gen + 1) * CD;

        // swap sp to token
        uint reserve = getCurrentGlobalReserve();

        uint amountIn = balanceOf[user];
        balanceOf[user] = 0;
        require(amountIn > 0 ,"no sp");

        amountOut = _calcRewardAmount(reserve, amountIn, globalPool.weight);

        globalPool.lastReserve = reserve - amountOut;
        globalPool.lastUpdateTime = block.timestamp;
        // referral
        balanceOf[ref] += amountIn / 3;
        // mint token
        gov.mint(user, amountOut);
        emit Swap(user, ref, amountIn, amountOut);
    }

}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IAgency {
    struct Agent {
        address owner;
        uint gen;
        uint birth;
        uint parentId;
        uint[] childrenId;
    }

    event TransferOwnership(address newOwner);
    event Register(uint indexed referrer, uint referee);
    event Sign(address indexed signer, bytes32 digest);

    function REGISTER_ONCE_TYPEHASH() external view returns (bytes32);
    function REGISTER_PARENT_TYPEHASH() external view returns (bytes32);
    function MAX_NUM_CHILDREN() external view returns (uint);
    function REGISTER_DELAY() external view returns (uint);
    function TRANSFER_CD() external view returns (uint);
    function agentNFT() external view returns (address);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function whois(address agent) external view returns (uint);
    function oneTimeCodes(address once) external view returns (bool);
    function presign(address agent, bytes32 digest) external view returns (bool);
    function isController(address agent) external view returns (bool);
    function owner() external view returns (address);

    function userInfo(address agent) external view returns (address ref, uint gen);
    function transfer(address from, address to, uint id) external returns (bool);
    function totalSupply() external view returns (uint);
    function getAgent(uint id) external view returns (address, uint, uint, uint, uint[] memory);
    function transferOwnership(address owner) external;
    function addController(address _controller) external;
    function removeController(address _controller) external;
    function rescueERC20(address tokenAddress, address to, uint256 amount) external;
    function adminAdd(address newUser) external returns (uint id);
    function register(bytes memory parentSig, bytes memory onceSig, uint deadline) payable external returns (uint id);
    function sign(bytes32 digest) external;
    function getHashTypedData(bytes32 structHash) external view returns (bytes32);
    function transferCooldown(uint id) external view returns (uint);
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

import "./IERC20.sol";

interface IERC20Mintable is IERC20 {
    function mint(address to, uint amount) external returns (bool);
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IGauge {
    event TransferOwnership(address newOwner);
    event Deposit(address indexed user, uint indexed week, uint amount);
    event ApplyWithdrawal(address indexed user, uint indexed week, uint amount);
    event Withdraw(address indexed user, uint amount);

    struct Checkpoint {
        uint week;
        uint amount;
    }

    function farm() external view returns (address);
    function SGOV() external view returns (address);
    function poolId() external view returns (address);
    function genesis() external view returns (uint);
    function weight() external view returns (uint);
    function totalSupply() external view returns (uint);
    function base() external view returns (uint);
    function slope() external view returns (uint);
    function thisWeek() external view returns (uint);
    function owner() external view returns (address);
    function numCheckpoints(address account) external view returns (uint);
    function checkpoints(address account, uint index) external view returns (uint week, uint amount);
    function pendingWithdrawal(address account) external view returns (uint);
    function weekToWithdraw(address account) external view returns (uint);
    function transferOwnership(address _owner) external;
    function rescueERC20(address tokenAddress, address to, uint256 amount) external;
    function setParams(uint _weight, uint _base, uint _slope) external;
    function balanceOf(address account) external view returns (uint);
    function balanceOfAt(address account, uint week) external view returns (uint);
    function totalSupplyAt(uint week) external view returns (uint);
    function tick() external;
    function nextRewardRate() external view returns (uint newRewardRate);
    function deposit(uint amount, address to) external;
    function applyWithdrawal(uint amount) external;
    function withdraw() external returns (uint amount);
    function bonus(address user) external view returns (uint _bonus);
}

pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

library ABDKMath64x64 {
    /*
     * Minimum value signed 64.64-bit fixed point number may have.
     * -2^127
     */
    int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

    /*
     * Maximum value signed 64.64-bit fixed point number may have.
     * 2^127-1
     */
    int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

    /**
     * Calculate x * y rounding down, where x is signed 64.64 fixed point number
     * and y is unsigned 256-bit integer number.  Revert on overflow.
     *
     * @param x signed 64.64 fixed point number
     * @param y unsigned 256-bit integer number
     * @return unsigned 256-bit integer number
     */
    function mulu (int128 x, uint256 y) internal pure returns (uint256) {
        unchecked {
            if (y == 0) return 0;

            require (x >= 0);

            uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
            uint256 hi = uint256 (int256 (x)) * (y >> 128);

            require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
            hi <<= 64;

            require (hi <=
                0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo);
            return hi + lo;
        }
    }

    /**
     * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
     * integer numbers.  Revert on overflow or when y is zero.
     *
     * @param x unsigned 256-bit integer number
     * @param y unsigned 256-bit integer number
     * @return signed 64.64-bit fixed point number
     */
    function divu (uint256 x, uint256 y) internal pure returns (int128) {
        unchecked {
            require (y != 0);
            uint128 result = divuu (x, y);
            require (result <= uint128 (MAX_64x64));
            return int128 (result);
        }
    }

    /**
     * Calculate binary exponent of x.  Revert on overflow.
     *
     * @param x signed 64.64-bit fixed point number
     * @return signed 64.64-bit fixed point number
     */
    function exp_2 (int128 x) internal pure returns (int128) {
        unchecked {
            require (x < 0x400000000000000000); // Overflow

            if (x < -0x400000000000000000) return 0; // Underflow

            uint256 result = 0x80000000000000000000000000000000;

            if (x & 0x8000000000000000 > 0)
                result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
            if (x & 0x4000000000000000 > 0)
                result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
            if (x & 0x2000000000000000 > 0)
                result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
            if (x & 0x1000000000000000 > 0)
                result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
            if (x & 0x800000000000000 > 0)
                result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
            if (x & 0x400000000000000 > 0)
                result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
            if (x & 0x200000000000000 > 0)
                result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
            if (x & 0x100000000000000 > 0)
                result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
            if (x & 0x80000000000000 > 0)
                result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
            if (x & 0x40000000000000 > 0)
                result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
            if (x & 0x20000000000000 > 0)
                result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
            if (x & 0x10000000000000 > 0)
                result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
            if (x & 0x8000000000000 > 0)
                result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
            if (x & 0x4000000000000 > 0)
                result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
            if (x & 0x2000000000000 > 0)
                result = result * 0x1000162E525EE054754457D5995292026 >> 128;
            if (x & 0x1000000000000 > 0)
                result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
            if (x & 0x800000000000 > 0)
                result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
            if (x & 0x400000000000 > 0)
                result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
            if (x & 0x200000000000 > 0)
                result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128;
            if (x & 0x100000000000 > 0)
                result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
            if (x & 0x80000000000 > 0)
                result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
            if (x & 0x40000000000 > 0)
                result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
            if (x & 0x20000000000 > 0)
                result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
            if (x & 0x10000000000 > 0)
                result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
            if (x & 0x8000000000 > 0)
                result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
            if (x & 0x4000000000 > 0)
                result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
            if (x & 0x2000000000 > 0)
                result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
            if (x & 0x1000000000 > 0)
                result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
            if (x & 0x800000000 > 0)
                result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
            if (x & 0x400000000 > 0)
                result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
            if (x & 0x200000000 > 0)
                result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
            if (x & 0x100000000 > 0)
                result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
            if (x & 0x80000000 > 0)
                result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
            if (x & 0x40000000 > 0)
                result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
            if (x & 0x20000000 > 0)
                result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128;
            if (x & 0x10000000 > 0)
                result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
            if (x & 0x8000000 > 0)
                result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
            if (x & 0x4000000 > 0)
                result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
            if (x & 0x2000000 > 0)
                result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
            if (x & 0x1000000 > 0)
                result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128;
            if (x & 0x800000 > 0)
                result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
            if (x & 0x400000 > 0)
                result = result * 0x100000000002C5C85FDF477B662B26945 >> 128;
            if (x & 0x200000 > 0)
                result = result * 0x10000000000162E42FEFA3AE53369388C >> 128;
            if (x & 0x100000 > 0)
                result = result * 0x100000000000B17217F7D1D351A389D40 >> 128;
            if (x & 0x80000 > 0)
                result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
            if (x & 0x40000 > 0)
                result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
            if (x & 0x20000 > 0)
                result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128;
            if (x & 0x10000 > 0)
                result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
            if (x & 0x8000 > 0)
                result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
            if (x & 0x4000 > 0)
                result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128;
            if (x & 0x2000 > 0)
                result = result * 0x1000000000000162E42FEFA39F02B772C >> 128;
            if (x & 0x1000 > 0)
                result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
            if (x & 0x800 > 0)
                result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
            if (x & 0x400 > 0)
                result = result * 0x100000000000002C5C85FDF473DEA871F >> 128;
            if (x & 0x200 > 0)
                result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128;
            if (x & 0x100 > 0)
                result = result * 0x100000000000000B17217F7D1CF79E949 >> 128;
            if (x & 0x80 > 0)
                result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
            if (x & 0x40 > 0)
                result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
            if (x & 0x20 > 0)
                result = result * 0x100000000000000162E42FEFA39EF366F >> 128;
            if (x & 0x10 > 0)
                result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128;
            if (x & 0x8 > 0)
                result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
            if (x & 0x4 > 0)
                result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
            if (x & 0x2 > 0)
                result = result * 0x1000000000000000162E42FEFA39EF358 >> 128;
            if (x & 0x1 > 0)
                result = result * 0x10000000000000000B17217F7D1CF79AB >> 128;

            result >>= uint256 (int256 (63 - (x >> 64)));
            require (result <= uint256 (int256 (MAX_64x64)));

            return int128 (int256 (result));
        }
    }

    /**
     * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
     * integer numbers.  Revert on overflow or when y is zero.
     *
     * @param x unsigned 256-bit integer number
     * @param y unsigned 256-bit integer number
     * @return unsigned 64.64-bit fixed point number
     */
    function divuu (uint256 x, uint256 y) private pure returns (uint128) {
        unchecked {
            require (y != 0);

            uint256 result;

            if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
                result = (x << 64) / y;
            else {
                uint256 msb = 192;
                uint256 xc = x >> 192;
                if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
                if (xc >= 0x10000) { xc >>= 16; msb += 16; }
                if (xc >= 0x100) { xc >>= 8; msb += 8; }
                if (xc >= 0x10) { xc >>= 4; msb += 4; }
                if (xc >= 0x4) { xc >>= 2; msb += 2; }
                if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

                result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1);
                require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

                uint256 hi = result * (y >> 128);
                uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

                uint256 xh = x >> 192;
                uint256 xl = x << 64;

                if (xl < lo) xh -= 1;
                xl -= lo; // We rely on overflow behavior here
                lo = hi << 128;
                if (xl < lo) xh -= 1;
                xl -= lo; // We rely on overflow behavior here

                assert (xh == hi >> 128);

                result += xl / y;
            }

            require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
            return uint128 (result);
        }
    }
}

pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: approve failed');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transfer failed');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transferFrom failed');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'transferHelper: ETH transfer failed');
    }
}

pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "interface/=src/interface/",
    "util/=src/util/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_agency","type":"address"},{"internalType":"address","name":"_gov","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"poolId","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"GrantSP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolId","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"}],"name":"RateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"parent","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"inputs":[],"name":"agency","outputs":[{"internalType":"contract IAgency","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentGlobalReserve","outputs":[{"internalType":"uint256","name":"reserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolId","type":"address"}],"name":"getCurrentPoolReserve","outputs":[{"internalType":"uint256","name":"reserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalPool","outputs":[{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"lastReserve","type":"uint256"},{"internalType":"address","name":"gauge","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"contract IERC20Mintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"grantSP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"lastUpdateTime","type":"uint256"},{"internalType":"uint256","name":"lastReserve","type":"uint256"},{"internalType":"address","name":"gauge","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"setGlobalRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolId","type":"address"},{"internalType":"address","name":"gauge","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolId","type":"address"},{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"name":"setPoolRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162001f9438038062001f948339810160408190526200003491620000d8565b6001600160a01b0383166200008f5760405162461bcd60e51b815260206004820152601460248201527f6f776e65722063616e6e6f74206265207a65726f000000000000000000000000604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b039485161790559082166080521660a05262000122565b80516001600160a01b0381168114620000d357600080fd5b919050565b600080600060608486031215620000ee57600080fd5b620000f984620000bb565b92506200010960208501620000bb565b91506200011960408501620000bb565b90509250925092565b60805160a051611e30620001646000396000818161013001526105a70152600081816101c30152818161037d0152818161041b01526108aa0152611e306000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063b2118a8d11610066578063b2118a8d146102b4578063b222e0c2146102c7578063f2fde38b146102e7578063f531c1fa146102fa57600080fd5b806370a08231146102285780638da5cb5b146102485780639975ac2f1461025b578063a4063dbc1461026e57600080fd5b80634dfb841e116100d35780634dfb841e146101e55780634e847fc7146101fa57806352edeea11461020d57806353c487181461022057600080fd5b806303438dd01461010557806312d43a511461012b578063391157841461016a5780633b91ee26146101be575b600080fd5b610118610113366004611b28565b61030d565b6040519081526020015b60405180910390f35b6101527f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610122565b60015460025460035460045460055461018d94939291906001600160a01b031685565b6040805195865260208601949094529284019190915260608301526001600160a01b0316608082015260a001610122565b6101527f000000000000000000000000000000000000000000000000000000000000000081565b6101f86101f3366004611b45565b610674565b005b6101f8610208366004611b67565b6106f6565b6101f861021b366004611ba0565b61088b565b610118610a85565b610118610236366004611b28565b60076020526000908152604090205481565b600054610152906001600160a01b031681565b610118610269366004611b28565b610ab6565b61018d61027c366004611b28565b60066020526000908152604090208054600182015460028301546003840154600490940154929391929091906001600160a01b031685565b6101f86102c2366004611bcc565b610b02565b6101186102d5366004611b28565b60086020526000908152604090205481565b6101f86102f5366004611b28565b610b45565b6101f8610308366004611c0d565b610c10565b6001600160a01b038116600090815260086020526040812054421161035e5760405162461bcd60e51b815260206004820152600260248201526118d960f21b60448201526064015b60405180910390fd5b604051632a5ccc1f60e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690632a5ccc1f90602401602060405180830381865afa1580156103c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e89190611c42565b6000036103f757506000919050565b604051630cacd00160e11b81526001600160a01b03838116600483015260009182917f00000000000000000000000000000000000000000000000000000000000000001690631959a002906024016040805180830381865afa158015610461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104859190611c5b565b9092509050611770610498826001611c9f565b6104a29190611cb2565b6104ac9042611c9f565b6001600160a01b0385166000908152600860205260408120919091556104d0610a85565b6001600160a01b03861660009081526007602052604081208054919055909150806105255760405162461bcd60e51b815260206004820152600560248201526406e6f2073760dc1b6044820152606401610355565b6105358282600160000154610cd3565b94506105418583611cc9565b6004554260039081556105549082611cf2565b6001600160a01b0385166000908152600760205260408120805490919061057c908490611c9f565b90915550506040516340c10f1960e01b81526001600160a01b038781166004830152602482018790527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044016020604051808303816000875af11580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190611d14565b50836001600160a01b0316866001600160a01b03167ffa2dda1cc1b86e41239702756b13effbc1a092b5c57e3ad320fbe4f3b13fe2358388604051610663929190918252602082015260400190565b60405180910390a350505050919050565b6000546001600160a01b0316331461069e5760405162461bcd60e51b815260040161035590611d36565b6106a6610a85565b6004554260035560028290556001819055604080518381526020810183905230917f6778305c6589874c7b48651fd6414793c4ac2fdf49403e5270649e087046a83b910160405180910390a25050565b6000546001600160a01b031633146107205760405162461bcd60e51b815260040161035590611d36565b6001600160a01b0382811660009081526006602052604090206004810180546001600160a01b0319169284169290921790915561075c83610ab6565b8160030181905550428160020181905550816001600160a01b031663715fda7b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cf9190611c42565b8160010181905550816001600160a01b031663a1aab33f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108399190611c42565b80825560018201546040805191825260208201929092526001600160a01b038516917f6778305c6589874c7b48651fd6414793c4ac2fdf49403e5270649e087046a83b910160405180910390a2505050565b604051632a5ccc1f60e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690632a5ccc1f90602401602060405180830381865afa1580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190611c42565b600003610920575050565b33600090815260066020526040808220600480820154925163d8cb4aa360e01b81526001600160a01b0387811692820192909252919392169063d8cb4aa390602401602060405180830381865afa15801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190611c42565b905080156109d557670de0b6b3a76400006109be8183611c9f565b6109c89085611cb2565b6109d29190611cf2565b92505b60006109e033610ab6565b905060006109f382868660000154610cd3565b90506109ff8183611cc9565b60038501554260028501556001600160a01b03861660009081526007602052604081208054839290610a32908490611c9f565b9091555050604080518681526020810183905233916001600160a01b038916917f56536211b22c049bb6a07a838731505301d35c7502ae3f2c7a54fc7b03248258910160405180910390a3505050505050565b6004546002546003546000929190610a9d9042611cc9565b610aa79190611cb2565b610ab19190611c9f565b905090565b6001600160a01b0381166000908152600660205260408120600381015460018201546002830154610ae79042611cc9565b610af19190611cb2565b610afb9190611c9f565b9392505050565b6000546001600160a01b03163314610b2c5760405162461bcd60e51b815260040161035590611d36565b610b406001600160a01b0384168383610d24565b505050565b6000546001600160a01b03163314610b6f5760405162461bcd60e51b815260040161035590611d36565b6001600160a01b038116610bbc5760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b6044820152606401610355565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6001600160a01b03808416600090815260066020526040902060048101549091163314610c6b5760405162461bcd60e51b81526020600482015260096024820152686e6f7420676175676560b81b6044820152606401610355565b610c7484610ab6565b60038201554260028201556001810183905581815560408051848152602081018490526001600160a01b038616917f6778305c6589874c7b48651fd6414793c4ac2fdf49403e5270649e087046a83b910160405180910390a250505050565b600080610ce08484610e3f565b90506000610cf8610cf083611d59565b600f0b610e82565b9050610d1a86610d118368010000000000000000611d7f565b600f0b90611940565b9695505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610d809190611db5565b6000604051808303816000865af19150503d8060008114610dbd576040519150601f19603f3d011682016040523d82523d6000602084013e610dc2565b606091505b5091509150818015610dec575080511580610dec575080806020019051810190610dec9190611d14565b610e385760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c6564006044820152606401610355565b5050505050565b600081600003610e4e57600080fd5b6000610e5a84846119ab565b905060016001607f1b036001600160801b0382161115610e7957600080fd5b90505b92915050565b60006840000000000000000082600f0b12610e9c57600080fd5b683fffffffffffffffff1982600f0b1215610eb957506000919050565b6001607f1b60006780000000000000008416600f0b1315610eeb5770016a09e667f3bcc908b2fb1366ea957d3e0260801c5b60008367400000000000000016600f0b1315610f18577001306fe0a31b7152de8d5a46305c85edec0260801c5b60008367200000000000000016600f0b1315610f45577001172b83c7d517adcdf7c8c50eb14a791f0260801c5b60008367100000000000000016600f0b1315610f725770010b5586cf9890f6298b92b71842a983630260801c5b60008367080000000000000016600f0b1315610f9f577001059b0d31585743ae7c548eb68ca417fd0260801c5b60008367040000000000000016600f0b1315610fcc57700102c9a3e778060ee6f7caca4f7a29bde80260801c5b60008367020000000000000016600f0b1315610ff95770010163da9fb33356d84a66ae336dcdfa3f0260801c5b60008367010000000000000016600f0b131561102657700100b1afa5abcbed6129ab13ec11dc95430260801c5b600083668000000000000016600f0b13156110525770010058c86da1c09ea1ff19d294cf2f679b0260801c5b600083664000000000000016600f0b131561107e577001002c605e2e8cec506d21bfc89a23a00f0260801c5b600083662000000000000016600f0b13156110aa57700100162f3904051fa128bca9c55c31e5df0260801c5b600083661000000000000016600f0b13156110d6577001000b175effdc76ba38e31671ca9397250260801c5b600083660800000000000016600f0b131561110257700100058ba01fb9f96d6cacd4b180917c3d0260801c5b600083660400000000000016600f0b131561112e5770010002c5cc37da9491d0985c348c68e7b30260801c5b600083660200000000000016600f0b131561115a577001000162e525ee054754457d59952920260260801c5b600083660100000000000016600f0b13156111865770010000b17255775c040618bf4a4ade83fc0260801c5b6000836580000000000016600f0b13156111b1577001000058b91b5bc9ae2eed81e9b7d4cfab0260801c5b6000836540000000000016600f0b13156111dc57700100002c5c89d5ec6ca4d7c8acc017b7c90260801c5b6000836520000000000016600f0b13156112075770010000162e43f4f831060e02d839a9d16d0260801c5b6000836510000000000016600f0b131561123257700100000b1721bcfc99d9f890ea069117630260801c5b6000836508000000000016600f0b131561125d5770010000058b90cf1e6d97f9ca14dbcc16280260801c5b6000836504000000000016600f0b1315611288577001000002c5c863b73f016468f6bac5ca2b0260801c5b6000836502000000000016600f0b13156112b357700100000162e430e5a18f6119e3c02282a50260801c5b6000836501000000000016600f0b13156112de577001000000b1721835514b86e6d96efd1bfe0260801c5b60008364800000000016600f0b131561130857700100000058b90c0b48c6be5df846c5b2ef0260801c5b60008364400000000016600f0b13156113325770010000002c5c8601cc6b9e94213c72737a0260801c5b60008364200000000016600f0b131561135c577001000000162e42fff037df38aa2b219f060260801c5b60008364100000000016600f0b13156113865770010000000b17217fba9c739aa5819f44f90260801c5b60008364080000000016600f0b13156113b0577001000000058b90bfcdee5acd3c1cedc8230260801c5b60008364040000000016600f0b13156113da57700100000002c5c85fe31f35a6a30da1be500260801c5b60008364020000000016600f0b13156114045770010000000162e42ff0999ce3541b9fffcf0260801c5b60008364010000000016600f0b131561142e57700100000000b17217f80f4ef5aadda455540260801c5b600083638000000016600f0b13156114575770010000000058b90bfbf8479bd5a81b51ad0260801c5b600083634000000016600f0b1315611480577001000000002c5c85fdf84bd62ae30a74cc0260801c5b600083632000000016600f0b13156114a957700100000000162e42fefb2fed257559bdaa0260801c5b600083631000000016600f0b13156114d2577001000000000b17217f7d5a7716bba4a9ae0260801c5b600083630800000016600f0b13156114fb57700100000000058b90bfbe9ddbac5e109cce0260801c5b600083630400000016600f0b13156115245770010000000002c5c85fdf4b15de6f17eb0d0260801c5b600083630200000016600f0b131561154d577001000000000162e42fefa494f1478fde050260801c5b600083630100000016600f0b13156115765770010000000000b17217f7d20cf927c8e94c0260801c5b6000836280000016600f0b131561159e577001000000000058b90bfbe8f71cb4e4b33d0260801c5b6000836240000016600f0b13156115c657700100000000002c5c85fdf477b662b269450260801c5b6000836220000016600f0b13156115ee5770010000000000162e42fefa3ae53369388c0260801c5b6000836210000016600f0b131561161657700100000000000b17217f7d1d351a389d400260801c5b6000836208000016600f0b131561163e5770010000000000058b90bfbe8e8b2d3d4ede0260801c5b6000836204000016600f0b1315611666577001000000000002c5c85fdf4741bea6e77e0260801c5b6000836202000016600f0b131561168e57700100000000000162e42fefa39fe95583c20260801c5b6000836201000016600f0b13156116b6577001000000000000b17217f7d1cfb72b45e10260801c5b60008361800016600f0b13156116dd57700100000000000058b90bfbe8e7cc35c3f00260801c5b60008361400016600f0b13156117045770010000000000002c5c85fdf473e242ea380260801c5b60008361200016600f0b131561172b577001000000000000162e42fefa39f02b772c0260801c5b60008361100016600f0b13156117525770010000000000000b17217f7d1cf7d83c1a0260801c5b60008361080016600f0b1315611779577001000000000000058b90bfbe8e7bdcbe2e0260801c5b60008361040016600f0b13156117a057700100000000000002c5c85fdf473dea871f0260801c5b60008361020016600f0b13156117c75770010000000000000162e42fefa39ef44d910260801c5b60008361010016600f0b13156117ee57700100000000000000b17217f7d1cf79e9490260801c5b600083608016600f0b13156118145770010000000000000058b90bfbe8e7bce5440260801c5b600083604016600f0b131561183a577001000000000000002c5c85fdf473de6eca0260801c5b600083602016600f0b131561186057700100000000000000162e42fefa39ef366f0260801c5b600083601016600f0b1315611886577001000000000000000b17217f7d1cf79afa0260801c5b600083600816600f0b13156118ac57700100000000000000058b90bfbe8e7bcd6d0260801c5b600083600416600f0b13156118d25770010000000000000002c5c85fdf473de6b20260801c5b600083600216600f0b13156118f8577001000000000000000162e42fefa39ef3580260801c5b600083600116600f0b131561191e5770010000000000000000b17217f7d1cf79ab0260801c5b600f83810b60401d603f03900b1c60016001607f1b03811115610e7c57600080fd5b60008160000361195257506000610e7c565b600083600f0b121561196357600080fd5b600f83900b6001600160801b038316810260401c90608084901c026001600160c01b0381111561199257600080fd5b60401b81198111156119a357600080fd5b019392505050565b6000816000036119ba57600080fd5b60006001600160c01b0384116119e55782604085901b816119dd576119dd611cdc565b049050611afc565b60c084811c64010000000081106119fe576020918201911c5b620100008110611a10576010918201911c5b6101008110611a21576008918201911c5b60108110611a31576004918201911c5b60048110611a41576002918201911c5b60028110611a50576001820191505b60bf820360018603901c6001018260ff0387901b81611a7157611a71611cdc565b0492506001600160801b03831115611a8857600080fd5b608085901c83026001600160801b038616840260c088901c604089901b82811015611ab4576001820391505b608084901b92900382811015611acb576001820391505b829003608084901c8214611ae157611ae1611de4565b888181611af057611af0611cdc565b04870196505050505050505b6001600160801b03811115610e7957600080fd5b6001600160a01b0381168114611b2557600080fd5b50565b600060208284031215611b3a57600080fd5b8135610e7981611b10565b60008060408385031215611b5857600080fd5b50508035926020909101359150565b60008060408385031215611b7a57600080fd5b8235611b8581611b10565b91506020830135611b9581611b10565b809150509250929050565b60008060408385031215611bb357600080fd5b8235611bbe81611b10565b946020939093013593505050565b600080600060608486031215611be157600080fd5b8335611bec81611b10565b92506020840135611bfc81611b10565b929592945050506040919091013590565b600080600060608486031215611c2257600080fd5b8335611c2d81611b10565b95602085013595506040909401359392505050565b600060208284031215611c5457600080fd5b5051919050565b60008060408385031215611c6e57600080fd5b8251611c7981611b10565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e7c57610e7c611c89565b8082028115828204841417610e7c57610e7c611c89565b81810381811115610e7c57610e7c611c89565b634e487b7160e01b600052601260045260246000fd5b600082611d0f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d2657600080fd5b81518015158114610e7957600080fd5b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b600081600f0b60016001607f1b03198103611d7657611d76611c89565b60000392915050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff19811260016001607f1b0382131715610e7c57610e7c611c89565b6000825160005b81811015611dd65760208186018101518583015201611dbc565b506000920191825250919050565b634e487b7160e01b600052600160045260246000fdfea264697066735822122029cf062b34baec1e8222eb66ef99e1b1d41f96fcf6c4c606f7de4df2321e2a1a64736f6c634300081100330000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b400000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b83

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c806370a0823111610097578063b2118a8d11610066578063b2118a8d146102b4578063b222e0c2146102c7578063f2fde38b146102e7578063f531c1fa146102fa57600080fd5b806370a08231146102285780638da5cb5b146102485780639975ac2f1461025b578063a4063dbc1461026e57600080fd5b80634dfb841e116100d35780634dfb841e146101e55780634e847fc7146101fa57806352edeea11461020d57806353c487181461022057600080fd5b806303438dd01461010557806312d43a511461012b578063391157841461016a5780633b91ee26146101be575b600080fd5b610118610113366004611b28565b61030d565b6040519081526020015b60405180910390f35b6101527f00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b8381565b6040516001600160a01b039091168152602001610122565b60015460025460035460045460055461018d94939291906001600160a01b031685565b6040805195865260208601949094529284019190915260608301526001600160a01b0316608082015260a001610122565b6101527f0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b481565b6101f86101f3366004611b45565b610674565b005b6101f8610208366004611b67565b6106f6565b6101f861021b366004611ba0565b61088b565b610118610a85565b610118610236366004611b28565b60076020526000908152604090205481565b600054610152906001600160a01b031681565b610118610269366004611b28565b610ab6565b61018d61027c366004611b28565b60066020526000908152604090208054600182015460028301546003840154600490940154929391929091906001600160a01b031685565b6101f86102c2366004611bcc565b610b02565b6101186102d5366004611b28565b60086020526000908152604090205481565b6101f86102f5366004611b28565b610b45565b6101f8610308366004611c0d565b610c10565b6001600160a01b038116600090815260086020526040812054421161035e5760405162461bcd60e51b815260206004820152600260248201526118d960f21b60448201526064015b60405180910390fd5b604051632a5ccc1f60e01b81526001600160a01b0383811660048301527f0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b41690632a5ccc1f90602401602060405180830381865afa1580156103c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e89190611c42565b6000036103f757506000919050565b604051630cacd00160e11b81526001600160a01b03838116600483015260009182917f0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b41690631959a002906024016040805180830381865afa158015610461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104859190611c5b565b9092509050611770610498826001611c9f565b6104a29190611cb2565b6104ac9042611c9f565b6001600160a01b0385166000908152600860205260408120919091556104d0610a85565b6001600160a01b03861660009081526007602052604081208054919055909150806105255760405162461bcd60e51b815260206004820152600560248201526406e6f2073760dc1b6044820152606401610355565b6105358282600160000154610cd3565b94506105418583611cc9565b6004554260039081556105549082611cf2565b6001600160a01b0385166000908152600760205260408120805490919061057c908490611c9f565b90915550506040516340c10f1960e01b81526001600160a01b038781166004830152602482018790527f00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b8316906340c10f19906044016020604051808303816000875af11580156105f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106149190611d14565b50836001600160a01b0316866001600160a01b03167ffa2dda1cc1b86e41239702756b13effbc1a092b5c57e3ad320fbe4f3b13fe2358388604051610663929190918252602082015260400190565b60405180910390a350505050919050565b6000546001600160a01b0316331461069e5760405162461bcd60e51b815260040161035590611d36565b6106a6610a85565b6004554260035560028290556001819055604080518381526020810183905230917f6778305c6589874c7b48651fd6414793c4ac2fdf49403e5270649e087046a83b910160405180910390a25050565b6000546001600160a01b031633146107205760405162461bcd60e51b815260040161035590611d36565b6001600160a01b0382811660009081526006602052604090206004810180546001600160a01b0319169284169290921790915561075c83610ab6565b8160030181905550428160020181905550816001600160a01b031663715fda7b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cf9190611c42565b8160010181905550816001600160a01b031663a1aab33f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108399190611c42565b80825560018201546040805191825260208201929092526001600160a01b038516917f6778305c6589874c7b48651fd6414793c4ac2fdf49403e5270649e087046a83b910160405180910390a2505050565b604051632a5ccc1f60e01b81526001600160a01b0383811660048301527f0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b41690632a5ccc1f90602401602060405180830381865afa1580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190611c42565b600003610920575050565b33600090815260066020526040808220600480820154925163d8cb4aa360e01b81526001600160a01b0387811692820192909252919392169063d8cb4aa390602401602060405180830381865afa15801561097f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a39190611c42565b905080156109d557670de0b6b3a76400006109be8183611c9f565b6109c89085611cb2565b6109d29190611cf2565b92505b60006109e033610ab6565b905060006109f382868660000154610cd3565b90506109ff8183611cc9565b60038501554260028501556001600160a01b03861660009081526007602052604081208054839290610a32908490611c9f565b9091555050604080518681526020810183905233916001600160a01b038916917f56536211b22c049bb6a07a838731505301d35c7502ae3f2c7a54fc7b03248258910160405180910390a3505050505050565b6004546002546003546000929190610a9d9042611cc9565b610aa79190611cb2565b610ab19190611c9f565b905090565b6001600160a01b0381166000908152600660205260408120600381015460018201546002830154610ae79042611cc9565b610af19190611cb2565b610afb9190611c9f565b9392505050565b6000546001600160a01b03163314610b2c5760405162461bcd60e51b815260040161035590611d36565b610b406001600160a01b0384168383610d24565b505050565b6000546001600160a01b03163314610b6f5760405162461bcd60e51b815260040161035590611d36565b6001600160a01b038116610bbc5760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b6044820152606401610355565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6001600160a01b03808416600090815260066020526040902060048101549091163314610c6b5760405162461bcd60e51b81526020600482015260096024820152686e6f7420676175676560b81b6044820152606401610355565b610c7484610ab6565b60038201554260028201556001810183905581815560408051848152602081018490526001600160a01b038616917f6778305c6589874c7b48651fd6414793c4ac2fdf49403e5270649e087046a83b910160405180910390a250505050565b600080610ce08484610e3f565b90506000610cf8610cf083611d59565b600f0b610e82565b9050610d1a86610d118368010000000000000000611d7f565b600f0b90611940565b9695505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691610d809190611db5565b6000604051808303816000865af19150503d8060008114610dbd576040519150601f19603f3d011682016040523d82523d6000602084013e610dc2565b606091505b5091509150818015610dec575080511580610dec575080806020019051810190610dec9190611d14565b610e385760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c6564006044820152606401610355565b5050505050565b600081600003610e4e57600080fd5b6000610e5a84846119ab565b905060016001607f1b036001600160801b0382161115610e7957600080fd5b90505b92915050565b60006840000000000000000082600f0b12610e9c57600080fd5b683fffffffffffffffff1982600f0b1215610eb957506000919050565b6001607f1b60006780000000000000008416600f0b1315610eeb5770016a09e667f3bcc908b2fb1366ea957d3e0260801c5b60008367400000000000000016600f0b1315610f18577001306fe0a31b7152de8d5a46305c85edec0260801c5b60008367200000000000000016600f0b1315610f45577001172b83c7d517adcdf7c8c50eb14a791f0260801c5b60008367100000000000000016600f0b1315610f725770010b5586cf9890f6298b92b71842a983630260801c5b60008367080000000000000016600f0b1315610f9f577001059b0d31585743ae7c548eb68ca417fd0260801c5b60008367040000000000000016600f0b1315610fcc57700102c9a3e778060ee6f7caca4f7a29bde80260801c5b60008367020000000000000016600f0b1315610ff95770010163da9fb33356d84a66ae336dcdfa3f0260801c5b60008367010000000000000016600f0b131561102657700100b1afa5abcbed6129ab13ec11dc95430260801c5b600083668000000000000016600f0b13156110525770010058c86da1c09ea1ff19d294cf2f679b0260801c5b600083664000000000000016600f0b131561107e577001002c605e2e8cec506d21bfc89a23a00f0260801c5b600083662000000000000016600f0b13156110aa57700100162f3904051fa128bca9c55c31e5df0260801c5b600083661000000000000016600f0b13156110d6577001000b175effdc76ba38e31671ca9397250260801c5b600083660800000000000016600f0b131561110257700100058ba01fb9f96d6cacd4b180917c3d0260801c5b600083660400000000000016600f0b131561112e5770010002c5cc37da9491d0985c348c68e7b30260801c5b600083660200000000000016600f0b131561115a577001000162e525ee054754457d59952920260260801c5b600083660100000000000016600f0b13156111865770010000b17255775c040618bf4a4ade83fc0260801c5b6000836580000000000016600f0b13156111b1577001000058b91b5bc9ae2eed81e9b7d4cfab0260801c5b6000836540000000000016600f0b13156111dc57700100002c5c89d5ec6ca4d7c8acc017b7c90260801c5b6000836520000000000016600f0b13156112075770010000162e43f4f831060e02d839a9d16d0260801c5b6000836510000000000016600f0b131561123257700100000b1721bcfc99d9f890ea069117630260801c5b6000836508000000000016600f0b131561125d5770010000058b90cf1e6d97f9ca14dbcc16280260801c5b6000836504000000000016600f0b1315611288577001000002c5c863b73f016468f6bac5ca2b0260801c5b6000836502000000000016600f0b13156112b357700100000162e430e5a18f6119e3c02282a50260801c5b6000836501000000000016600f0b13156112de577001000000b1721835514b86e6d96efd1bfe0260801c5b60008364800000000016600f0b131561130857700100000058b90c0b48c6be5df846c5b2ef0260801c5b60008364400000000016600f0b13156113325770010000002c5c8601cc6b9e94213c72737a0260801c5b60008364200000000016600f0b131561135c577001000000162e42fff037df38aa2b219f060260801c5b60008364100000000016600f0b13156113865770010000000b17217fba9c739aa5819f44f90260801c5b60008364080000000016600f0b13156113b0577001000000058b90bfcdee5acd3c1cedc8230260801c5b60008364040000000016600f0b13156113da57700100000002c5c85fe31f35a6a30da1be500260801c5b60008364020000000016600f0b13156114045770010000000162e42ff0999ce3541b9fffcf0260801c5b60008364010000000016600f0b131561142e57700100000000b17217f80f4ef5aadda455540260801c5b600083638000000016600f0b13156114575770010000000058b90bfbf8479bd5a81b51ad0260801c5b600083634000000016600f0b1315611480577001000000002c5c85fdf84bd62ae30a74cc0260801c5b600083632000000016600f0b13156114a957700100000000162e42fefb2fed257559bdaa0260801c5b600083631000000016600f0b13156114d2577001000000000b17217f7d5a7716bba4a9ae0260801c5b600083630800000016600f0b13156114fb57700100000000058b90bfbe9ddbac5e109cce0260801c5b600083630400000016600f0b13156115245770010000000002c5c85fdf4b15de6f17eb0d0260801c5b600083630200000016600f0b131561154d577001000000000162e42fefa494f1478fde050260801c5b600083630100000016600f0b13156115765770010000000000b17217f7d20cf927c8e94c0260801c5b6000836280000016600f0b131561159e577001000000000058b90bfbe8f71cb4e4b33d0260801c5b6000836240000016600f0b13156115c657700100000000002c5c85fdf477b662b269450260801c5b6000836220000016600f0b13156115ee5770010000000000162e42fefa3ae53369388c0260801c5b6000836210000016600f0b131561161657700100000000000b17217f7d1d351a389d400260801c5b6000836208000016600f0b131561163e5770010000000000058b90bfbe8e8b2d3d4ede0260801c5b6000836204000016600f0b1315611666577001000000000002c5c85fdf4741bea6e77e0260801c5b6000836202000016600f0b131561168e57700100000000000162e42fefa39fe95583c20260801c5b6000836201000016600f0b13156116b6577001000000000000b17217f7d1cfb72b45e10260801c5b60008361800016600f0b13156116dd57700100000000000058b90bfbe8e7cc35c3f00260801c5b60008361400016600f0b13156117045770010000000000002c5c85fdf473e242ea380260801c5b60008361200016600f0b131561172b577001000000000000162e42fefa39f02b772c0260801c5b60008361100016600f0b13156117525770010000000000000b17217f7d1cf7d83c1a0260801c5b60008361080016600f0b1315611779577001000000000000058b90bfbe8e7bdcbe2e0260801c5b60008361040016600f0b13156117a057700100000000000002c5c85fdf473dea871f0260801c5b60008361020016600f0b13156117c75770010000000000000162e42fefa39ef44d910260801c5b60008361010016600f0b13156117ee57700100000000000000b17217f7d1cf79e9490260801c5b600083608016600f0b13156118145770010000000000000058b90bfbe8e7bce5440260801c5b600083604016600f0b131561183a577001000000000000002c5c85fdf473de6eca0260801c5b600083602016600f0b131561186057700100000000000000162e42fefa39ef366f0260801c5b600083601016600f0b1315611886577001000000000000000b17217f7d1cf79afa0260801c5b600083600816600f0b13156118ac57700100000000000000058b90bfbe8e7bcd6d0260801c5b600083600416600f0b13156118d25770010000000000000002c5c85fdf473de6b20260801c5b600083600216600f0b13156118f8577001000000000000000162e42fefa39ef3580260801c5b600083600116600f0b131561191e5770010000000000000000b17217f7d1cf79ab0260801c5b600f83810b60401d603f03900b1c60016001607f1b03811115610e7c57600080fd5b60008160000361195257506000610e7c565b600083600f0b121561196357600080fd5b600f83900b6001600160801b038316810260401c90608084901c026001600160c01b0381111561199257600080fd5b60401b81198111156119a357600080fd5b019392505050565b6000816000036119ba57600080fd5b60006001600160c01b0384116119e55782604085901b816119dd576119dd611cdc565b049050611afc565b60c084811c64010000000081106119fe576020918201911c5b620100008110611a10576010918201911c5b6101008110611a21576008918201911c5b60108110611a31576004918201911c5b60048110611a41576002918201911c5b60028110611a50576001820191505b60bf820360018603901c6001018260ff0387901b81611a7157611a71611cdc565b0492506001600160801b03831115611a8857600080fd5b608085901c83026001600160801b038616840260c088901c604089901b82811015611ab4576001820391505b608084901b92900382811015611acb576001820391505b829003608084901c8214611ae157611ae1611de4565b888181611af057611af0611cdc565b04870196505050505050505b6001600160801b03811115610e7957600080fd5b6001600160a01b0381168114611b2557600080fd5b50565b600060208284031215611b3a57600080fd5b8135610e7981611b10565b60008060408385031215611b5857600080fd5b50508035926020909101359150565b60008060408385031215611b7a57600080fd5b8235611b8581611b10565b91506020830135611b9581611b10565b809150509250929050565b60008060408385031215611bb357600080fd5b8235611bbe81611b10565b946020939093013593505050565b600080600060608486031215611be157600080fd5b8335611bec81611b10565b92506020840135611bfc81611b10565b929592945050506040919091013590565b600080600060608486031215611c2257600080fd5b8335611c2d81611b10565b95602085013595506040909401359392505050565b600060208284031215611c5457600080fd5b5051919050565b60008060408385031215611c6e57600080fd5b8251611c7981611b10565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e7c57610e7c611c89565b8082028115828204841417610e7c57610e7c611c89565b81810381811115610e7c57610e7c611c89565b634e487b7160e01b600052601260045260246000fd5b600082611d0f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d2657600080fd5b81518015158114610e7957600080fd5b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b600081600f0b60016001607f1b03198103611d7657611d76611c89565b60000392915050565b600f82810b9082900b036f7fffffffffffffffffffffffffffffff19811260016001607f1b0382131715610e7c57610e7c611c89565b6000825160005b81811015611dd65760208186018101518583015201611dbc565b506000920191825250919050565b634e487b7160e01b600052600160045260246000fdfea264697066735822122029cf062b34baec1e8222eb66ef99e1b1d41f96fcf6c4c606f7de4df2321e2a1a64736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b400000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b83

-----Decoded View---------------
Arg [0] : _owner (address): 0x7e6d097A7D948454eA253d3610bD93bB9c508B3a
Arg [1] : _agency (address): 0x3a666DbA5DDE8dAABFaAf2A931ac41f55f1Ac6b4
Arg [2] : _gov (address): 0x65e413F21BF468Fed23996A8E701dD67FDf22B83

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a
Arg [1] : 0000000000000000000000003a666dba5dde8daabfaaf2a931ac41f55f1ac6b4
Arg [2] : 00000000000000000000000065e413f21bf468fed23996a8e701dd67fdf22b83


Block Transaction Gas Used Reward
view all blocks sequenced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

This contract manages all business logic related to Dyson Point calculations and controls the minting of DYSN tokens.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.