Contract 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413

Contract Overview

Balance:
0 ETH
Txn Hash Method
Block
From
To
Value
0x65af6842308d3e82cf31fcb3c58076f4a5fd225ccff49cbc29c70476cd5fc31dUnstake Escrow120827372023-07-17 11:32:2270 days 8 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.000075167231.00000005
0x2513310baa652705e3802612d5be9971177d8771850286cfb262bfaa1b5f0709Stake Escrow120827282023-07-17 11:32:0470 days 8 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000797565191.00000005
0xd61a291bf2bedb350171e98fc96e306e148aeae2643d1abbec11e5ae82f25544Vest120804202023-07-17 10:15:0870 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0002357376230.388801306
0xaf0dea1f43bef7c414d98eef2dfc49f7db7e848cc86be26a88da15f72d4ebdbcUnstake Escrow120804052023-07-17 10:14:3870 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0002043576030.388801306
0x25423015ae2d9dd4a28a79eedbac0c75b8cafbad6eb63a94d6621ef26701f32fStake Escrow120804002023-07-17 10:14:2870 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0001965395770.388801306
0xd7374fe83170b1704520a0b728f41f52c99484028cdaaa96170fa76f0dc65b2bUnstake Escrow120792652023-07-17 9:36:3870 days 10 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.000082668330.0300001
0xb22efb64628fa2dcd83ea02804e267cb7857f45fc40ce2ecd4d0ae1abed06fc2Stake Escrow120792582023-07-17 9:36:2470 days 10 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.000082787040.0300001
0x4cd928672da0b902a67ce0f91ccfa272a80cf899bd3f08cbff58e5bec28ef984Unstake Escrow120788242023-07-17 9:21:5670 days 10 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000462038220.03000005
0xa4b7371020b59a880dfcbb0c3507db57f3c86f02b5bbba27d53b5dd64a1a6d7eVest120784612023-07-17 9:09:5070 days 10 hrs ago0x64af258f8522bb9dd2c2b648b9cbbcdbe986b0bf IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000988890841.000000045
0x1e1435512c5d2049df38fefabcc5658d650f26bc070984c046752ae76fcabcf5Stake Escrow119566812023-07-14 13:30:3073 days 6 hrs ago0xf5cad67a16bb2db15ba76d665e62b2eb641de451 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000300889090.00100005
0xee9fb87b4937b9c2911c0232b385324e839d81c99a66f7106ab5b3c6e927b920Unstake Escrow116621252023-07-07 17:51:5880 days 1 hr ago0x043e7c673f2bd9c62e69921395bfd1f97acc0a78 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0001974600063.0000001
0x190acc5cfdf8fd16d23cfcfcb3cbf0b3233f4681fc6b138ebc0539d7b57d462aUnstake Escrow52395482023-02-09 1:46:04228 days 17 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.000000131640.002
0x9f26f1e204a1ff0f1911a6eec028c19e934b044d4479cdbca12dca9a26761872Stake Escrow52395412023-02-09 1:45:50228 days 17 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000001395540.002
0x8fb26d1a3da17f4aeec2c90b0f30d716eeea2ab00e26c2e00a6b442330483de1Stake Escrow31476442022-12-02 18:22:03297 days 1 hr ago0x043e7c673f2bd9c62e69921395bfd1f97acc0a78 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH00.000000001
0x0b27f1c2958d9cc55c3200fc1a8db0cc6eada4ed8232e64a6deeb60a7ed79131Vest30708922022-11-29 16:22:56300 days 3 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000508478510.000000001
0x7e00c23c9a6c8807c69a08b058a5c1f6cc4368bd2a10c996e7909e7a053cfb62Vest28631492022-11-22 13:21:10307 days 6 hrs ago0x64af258f8522bb9dd2c2b648b9cbbcdbe986b0bf IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0008860526290.000000001
0xc5d1110746ab3ebf301cca9adc1385da363a5587dd15552763c5408f95126b82Stake Escrow28555052022-11-22 10:22:38307 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0006353283610.000000001
0xdf92b978d91be36a22fcdda5dcab04466be8c39a9e4dd8185437092947775e10Unstake Escrow28554992022-11-22 10:22:18307 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0006353283610.000000001
0xd18211e92e267a7b40bab4e4e7ece531df493920cf334c99b426c54a3a6e5e96Stake Escrow28553812022-11-22 10:20:35307 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0005408415980.000000001
0xe654ecbbc696c0f6cb34fd1faf6086222a3d7fac52075c0058a9d62a33570629Unstake Escrow28553582022-11-22 10:20:00307 days 9 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0005408415980.000000001
0xb1a93ee8bdff5dfb26fa3bb3262a7c465343774925fec685736ccbf2bce9ee7bVest27931402022-11-20 0:57:52309 days 18 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH00.000000001
0x6f058fe725f8e82d76ce0ee5d3c24211a581bb0fca826c2d51d79711ceb18a57Stake Escrow27929992022-11-20 0:40:39309 days 19 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000000000030.000000001
0x6b60c8a8b11f19ede6d06bac2bc7548b1c9b729abe0abebc32d72265305030caVest27929962022-11-20 0:40:24309 days 19 hrs ago0xc2ecd777d06ffdf8b3179286beabf52b67e9d991 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0000000000030.000000001
0xb858b60d9f796c7dd7fdea486a034a8fc7e2fcd5bbcc99402a8157d050d72eb7Unstake Escrow27682442022-11-18 14:10:18311 days 5 hrs ago0xf5cad67a16bb2db15ba76d665e62b2eb641de451 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0004613159430.000000001
0x72efdd1504f911ebdf30573b454e8d23afbdc1270e4a1ea1473d583e098341b0Stake Escrow27682262022-11-18 14:09:10311 days 5 hrs ago0xf5cad67a16bb2db15ba76d665e62b2eb641de451 IN  0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH0.0005158648520.000000001
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x65af6842308d3e82cf31fcb3c58076f4a5fd225ccff49cbc29c70476cd5fc31d120827372023-07-17 11:32:2270 days 8 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x2513310baa652705e3802612d5be9971177d8771850286cfb262bfaa1b5f0709120827282023-07-17 11:32:0470 days 8 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x2513310baa652705e3802612d5be9971177d8771850286cfb262bfaa1b5f0709120827282023-07-17 11:32:0470 days 8 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xd61a291bf2bedb350171e98fc96e306e148aeae2643d1abbec11e5ae82f25544120804202023-07-17 10:15:0870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0xda0c33402fc1e10d18c532f0ed9c1a6c5c9e386c0 ETH
0xd61a291bf2bedb350171e98fc96e306e148aeae2643d1abbec11e5ae82f25544120804202023-07-17 10:15:0870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0xda0c33402fc1e10d18c532f0ed9c1a6c5c9e386c0 ETH
0xd61a291bf2bedb350171e98fc96e306e148aeae2643d1abbec11e5ae82f25544120804202023-07-17 10:15:0870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xd61a291bf2bedb350171e98fc96e306e148aeae2643d1abbec11e5ae82f25544120804202023-07-17 10:15:0870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xaf0dea1f43bef7c414d98eef2dfc49f7db7e848cc86be26a88da15f72d4ebdbc120804052023-07-17 10:14:3870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x25423015ae2d9dd4a28a79eedbac0c75b8cafbad6eb63a94d6621ef26701f32f120804002023-07-17 10:14:2870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x25423015ae2d9dd4a28a79eedbac0c75b8cafbad6eb63a94d6621ef26701f32f120804002023-07-17 10:14:2870 days 9 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xd7374fe83170b1704520a0b728f41f52c99484028cdaaa96170fa76f0dc65b2b120792652023-07-17 9:36:3870 days 10 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xb22efb64628fa2dcd83ea02804e267cb7857f45fc40ce2ecd4d0ae1abed06fc2120792582023-07-17 9:36:2470 days 10 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xb22efb64628fa2dcd83ea02804e267cb7857f45fc40ce2ecd4d0ae1abed06fc2120792582023-07-17 9:36:2470 days 10 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x4cd928672da0b902a67ce0f91ccfa272a80cf899bd3f08cbff58e5bec28ef984120788242023-07-17 9:21:5670 days 10 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x5ff865609d58671539777f9f268d8356b564f4035bd58ebb2a70c7d0721569ac119578322023-07-14 14:08:5273 days 5 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0xda0c33402fc1e10d18c532f0ed9c1a6c5c9e386c0 ETH
0x5ff865609d58671539777f9f268d8356b564f4035bd58ebb2a70c7d0721569ac119578322023-07-14 14:08:5273 days 5 hrs ago 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH
0x1e1435512c5d2049df38fefabcc5658d650f26bc070984c046752ae76fcabcf5119566812023-07-14 13:30:3073 days 6 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x1e1435512c5d2049df38fefabcc5658d650f26bc070984c046752ae76fcabcf5119566812023-07-14 13:30:3073 days 6 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0xc91ae8ea14f16376dec6ecb6e7a101631c95e2e7f288b046742724ca7c1e66f5119561802023-07-14 13:13:4873 days 6 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0xda0c33402fc1e10d18c532f0ed9c1a6c5c9e386c0 ETH
0xc91ae8ea14f16376dec6ecb6e7a101631c95e2e7f288b046742724ca7c1e66f5119561802023-07-14 13:13:4873 days 6 hrs ago 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH
0x46b5f1a539ec7eca324e9d77373d4e45a7dc2c8605499fdd415e1840dfc14e20116728102023-07-07 23:48:0879 days 19 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0xda0c33402fc1e10d18c532f0ed9c1a6c5c9e386c0 ETH
0x46b5f1a539ec7eca324e9d77373d4e45a7dc2c8605499fdd415e1840dfc14e20116728102023-07-07 23:48:0879 days 19 hrs ago 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa4130 ETH
0xee9fb87b4937b9c2911c0232b385324e839d81c99a66f7106ab5b3c6e927b920116621252023-07-07 17:51:5880 days 1 hr ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x190acc5cfdf8fd16d23cfcfcb3cbf0b3233f4681fc6b138ebc0539d7b57d462a52395482023-02-09 1:46:04228 days 17 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
0x9f26f1e204a1ff0f1911a6eec028c19e934b044d4479cdbca12dca9a2676187252395412023-02-09 1:45:50228 days 17 hrs ago 0xafd87d1a62260bd5714c55a1bb4057bdc8dfa413 0x1653a3a3c4ccee0538685f1600a30df5e3ee830a0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardEscrow

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : RewardEscrow.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma experimental ABIEncoderV2;

// Inheritance
import "./utils/Owned.sol";
import "./interfaces/IRewardEscrow.sol";

// Libraries
import "./libraries/SafeDecimalMath.sol";

// Internal references
import "./interfaces/IERC20.sol";
import "./interfaces/IKwenta.sol";
import "./interfaces/IStakingRewards.sol";

contract RewardEscrow is Owned, IRewardEscrow {
    using SafeDecimalMath for uint;

    /* ========== CONSTANTS/IMMUTABLES ========== */

    /* Max escrow duration */
    uint public constant MAX_DURATION = 2 * 52 weeks; // Default max 2 years duration

    IKwenta private immutable kwenta;

    /* ========== STATE VARIABLES ========== */

    IStakingRewards public stakingRewards;

    mapping(address => mapping(uint256 => VestingEntries.VestingEntry)) public vestingSchedules;

    mapping(address => uint256[]) public accountVestingEntryIDs;

    // Counter for new vesting entry ids 
    uint256 public nextEntryId;

    // An account's total escrowed KWENTA balance to save recomputing this for fee extraction purposes
    mapping(address => uint256) override public totalEscrowedAccountBalance;

    // An account's total vested reward KWENTA 
    mapping(address => uint256) override public totalVestedAccountBalance;

    // The total remaining escrowed balance, for verifying the actual KWENTA balance of this contract against
    uint256 public totalEscrowedBalance;

    // notice treasury address may change
    address public treasuryDAO;

    /* ========== MODIFIERS ========== */
    modifier onlyStakingRewards() {
        require(msg.sender == address(stakingRewards), "Only the StakingRewards can perform this action");
        _;
    }

    /* ========== EVENTS ========== */
    event Vested(address indexed beneficiary, uint value);
    event VestingEntryCreated(address indexed beneficiary, uint value, uint duration, uint entryID);
    event StakingRewardsSet(address rewardEscrow);
    event TreasuryDAOSet(address treasuryDAO);

    /* ========== CONSTRUCTOR ========== */

    constructor(address _owner, address _kwenta) Owned(_owner) {
        nextEntryId = 1;

        // set the Kwenta contract address as we need to transfer KWENTA when the user vests
        kwenta = IKwenta(_kwenta);
    }

    /* ========== SETTERS ========== */

    /*
    * @notice Function used to define the StakingRewards to use
    */
    function setStakingRewards(address _stakingRewards) public onlyOwner {
        require(address(stakingRewards) == address(0), "Staking Rewards already set");
        stakingRewards = IStakingRewards(_stakingRewards);
        emit StakingRewardsSet(address(_stakingRewards));
    }

    /// @notice set treasuryDAO address
    /// @dev only owner may change address
    function setTreasuryDAO(address _treasuryDAO) external onlyOwner {
        require(_treasuryDAO != address(0), "RewardEscrow: Zero Address");
        treasuryDAO = _treasuryDAO;
        emit TreasuryDAOSet(treasuryDAO);
    }

    /* ========== VIEW FUNCTIONS ========== */

    /**
     * @notice helper function to return kwenta address
     */
    function getKwentaAddress() override external view returns (address) {
        return address(kwenta);
    }

    /**
     * @notice A simple alias to totalEscrowedAccountBalance: provides ERC20 balance integration.
     */
    function balanceOf(address account) override public view returns (uint) {
        return totalEscrowedAccountBalance[account];
    }

    /**
     * @notice The number of vesting dates in an account's schedule.
     */
    function numVestingEntries(address account) override external view returns (uint) {
        return accountVestingEntryIDs[account].length;
    }

    /**
     * @notice Get a particular schedule entry for an account.
     * @return endTime the vesting entry object 
     * @return escrowAmount rate per second emission.
     */
    function getVestingEntry(address account, uint256 entryID) override external view returns (uint64 endTime, uint256 escrowAmount, uint256 duration) {
        endTime = vestingSchedules[account][entryID].endTime;
        escrowAmount = vestingSchedules[account][entryID].escrowAmount;
        duration = vestingSchedules[account][entryID].duration;
    }

    function getVestingSchedules(
        address account,
        uint256 index,
        uint256 pageSize
    ) override external view returns (VestingEntries.VestingEntryWithID[] memory) {
        uint256 endIndex = index + pageSize;

        // If index starts after the endIndex return no results
        if (endIndex <= index) {
            return new VestingEntries.VestingEntryWithID[](0);
        }

        // If the page extends past the end of the accountVestingEntryIDs, truncate it.
        if (endIndex > accountVestingEntryIDs[account].length) {
            endIndex = accountVestingEntryIDs[account].length;
        }

        uint256 n = endIndex - index;
        VestingEntries.VestingEntryWithID[] memory vestingEntries = new VestingEntries.VestingEntryWithID[](n);
        for (uint256 i; i < n; i++) {
            uint256 entryID = accountVestingEntryIDs[account][i + index];

            VestingEntries.VestingEntry memory entry = vestingSchedules[account][entryID];

            vestingEntries[i] = VestingEntries.VestingEntryWithID({
                endTime: uint64(entry.endTime),
                escrowAmount: entry.escrowAmount,
                entryID: entryID
            });
        }
        return vestingEntries;
    }

    function getAccountVestingEntryIDs(
        address account,
        uint256 index,
        uint256 pageSize
    ) override external view returns (uint256[] memory) {
        uint256 endIndex = index + pageSize;

        // If the page extends past the end of the accountVestingEntryIDs, truncate it.
        if (endIndex > accountVestingEntryIDs[account].length) {
            endIndex = accountVestingEntryIDs[account].length;
        }
        if (endIndex <= index) {
            return new uint256[](0);
        }

        uint256 n = endIndex - index;
        uint256[] memory page = new uint256[](n);
        for (uint256 i; i < n; i++) {
            page[i] = accountVestingEntryIDs[account][i + index];
        }
        return page;
    }

    function getVestingQuantity(address account, uint256[] calldata entryIDs) override external view returns (uint total, uint totalFee) {
        for (uint i = 0; i < entryIDs.length; i++) {
            VestingEntries.VestingEntry memory entry = vestingSchedules[account][entryIDs[i]];

            /* Skip entry if escrowAmount == 0 */
            if (entry.escrowAmount != 0) {
                (uint256 quantity, uint256 fee) = _claimableAmount(entry);

                /* add quantity to total */
                total += quantity;
                totalFee += fee;
            }
        }
    }

    function getVestingEntryClaimable(address account, uint256 entryID) override external view returns (uint quantity, uint fee) {
        VestingEntries.VestingEntry memory entry = vestingSchedules[account][entryID];
        (quantity, fee) = _claimableAmount(entry);
    }

    function _claimableAmount(VestingEntries.VestingEntry memory _entry) internal view returns (uint256 quantity, uint256 fee) {
        uint256 escrowAmount = _entry.escrowAmount;

        if (escrowAmount != 0) {
            /* Full escrow amounts claimable if block.timestamp equal to or after entry endTime */
            if (block.timestamp >= _entry.endTime) {
                quantity = escrowAmount;
            } else {
                fee = _earlyVestFee(_entry);
                quantity = escrowAmount - fee;
            }
        }
    }

    function _earlyVestFee(VestingEntries.VestingEntry memory _entry) internal view returns (uint256 earlyVestFee) {
        uint timeUntilVest = _entry.endTime - block.timestamp;
        // Fee starts at 90% and falls linearly
        uint initialFee = _entry.escrowAmount * 9 / 10;
        earlyVestFee = initialFee * timeUntilVest / _entry.duration;
    }

    function _isEscrowStaked(address _account) internal view returns (bool) {
        return stakingRewards.escrowedBalanceOf(_account) > 0;
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    /**
     * Vest escrowed amounts that are claimable
     * Allows users to vest their vesting entries based on msg.sender
     */

    function vest(uint256[] calldata entryIDs) override external {
        uint256 total;
        uint256 totalFee;
        for (uint i = 0; i < entryIDs.length; i++) {
            VestingEntries.VestingEntry storage entry = vestingSchedules[msg.sender][entryIDs[i]];

            /* Skip entry if escrowAmount == 0 already vested */
            if (entry.escrowAmount != 0) {
                (uint256 quantity, uint256 fee) = _claimableAmount(entry);

                /* update entry to remove escrowAmount */
                entry.escrowAmount = 0;

                /* add quantity to total */
                total += quantity;
                totalFee += fee;
            }
        }

        /* Transfer vested tokens. Will revert if total > totalEscrowedAccountBalance */
        if (total != 0) {
            // Withdraw staked escrowed kwenta if needed for reward
            if (_isEscrowStaked(msg.sender)) {
                uint totalWithFee = total + totalFee;
                uint unstakedEscrow = totalEscrowedAccountBalance[msg.sender] - stakingRewards.escrowedBalanceOf(msg.sender);
                if (totalWithFee > unstakedEscrow) {
                    uint amountToUnstake = totalWithFee - unstakedEscrow;
                    unstakeEscrow(amountToUnstake);
                }
            }

            // Send any fee to Treasury
            if (totalFee != 0) {
                _reduceAccountEscrowBalances(msg.sender, totalFee);
                require(
                    IKwenta(address(kwenta))
                        .transfer(treasuryDAO, totalFee), 
                        "RewardEscrow: Token Transfer Failed"
                );
            }

            // Transfer kwenta
            _transferVestedTokens(msg.sender, total);
        }
        
    }

    /**
     * @notice Create an escrow entry to lock KWENTA for a given duration in seconds
     * @dev This call expects that the depositor (msg.sender) has already approved the Reward escrow contract
     * to spend the the amount being escrowed.
     */
    function createEscrowEntry(
        address beneficiary,
        uint256 deposit,
        uint256 duration
    ) override external {
        require(beneficiary != address(0), "Cannot create escrow with address(0)");

        /* Transfer KWENTA from msg.sender */
        require(IERC20(kwenta).transferFrom(msg.sender, address(this), deposit), "Token transfer failed");

        /* Append vesting entry for the beneficiary address */
        _appendVestingEntry(beneficiary, deposit, duration);
    }

    /**
     * @notice Add a new vesting entry at a given time and quantity to an account's schedule.
     * @dev A call to this should accompany a previous successful call to kwenta.transfer(rewardEscrow, amount),
     * to ensure that when the funds are withdrawn, there is enough balance.
     * @param account The account to append a new vesting entry to.
     * @param quantity The quantity of KWENTA that will be escrowed.
     * @param duration The duration that KWENTA will be emitted.
     */
    function appendVestingEntry(
        address account,
        uint256 quantity,
        uint256 duration
    ) override external onlyStakingRewards {
        _appendVestingEntry(account, quantity, duration);
    }

    /**
     * @notice Stakes escrowed KWENTA.
     * @dev No tokens are transfered during this process, but the StakingRewards escrowed balance is updated.
     * @param _amount The amount of escrowed KWENTA to be staked.
     */
    function stakeEscrow(uint256 _amount) override external {
        require(_amount + stakingRewards.escrowedBalanceOf(msg.sender) <= totalEscrowedAccountBalance[msg.sender], "Insufficient unstaked escrow");
        stakingRewards.stakeEscrow(msg.sender, _amount);
    }

    /**
     * @notice Unstakes escrowed KWENTA.
     * @dev No tokens are transfered during this process, but the StakingRewards escrowed balance is updated.
     * @param _amount The amount of escrowed KWENTA to be unstaked.
     */
    function unstakeEscrow(uint256 _amount) override public {
        stakingRewards.unstakeEscrow(msg.sender, _amount);
    }

    /* Transfer vested tokens and update totalEscrowedAccountBalance, totalVestedAccountBalance */
    function _transferVestedTokens(address _account, uint256 _amount) internal {
        _reduceAccountEscrowBalances(_account, _amount);
        totalVestedAccountBalance[_account] += _amount;
        IERC20(address(kwenta)).transfer(_account, _amount);
        emit Vested(_account, _amount);
    }

    function _reduceAccountEscrowBalances(address _account, uint256 _amount) internal {
        // Reverts if amount being vested is greater than the account's existing totalEscrowedAccountBalance
        totalEscrowedBalance -= _amount;
        totalEscrowedAccountBalance[_account] -= _amount;
    }

    /* ========== INTERNALS ========== */

    function _appendVestingEntry(
        address account,
        uint256 quantity,
        uint256 duration
    ) internal {
        /* No empty or already-passed vesting entries allowed. */
        require(quantity != 0, "Quantity cannot be zero");
        require(duration > 0 && duration <= MAX_DURATION, "Cannot escrow with 0 duration OR above max_duration");

        /* There must be enough balance in the contract to provide for the vesting entry. */
        totalEscrowedBalance += quantity;

        require(
            totalEscrowedBalance <= IERC20(address(kwenta)).balanceOf(address(this)),
            "Must be enough balance in the contract to provide for the vesting entry"
        );

        /* Escrow the tokens for duration. */
        uint endTime = block.timestamp + duration;

        /* Add quantity to account's escrowed balance */
        totalEscrowedAccountBalance[account] += quantity;

        uint entryID = nextEntryId;
        vestingSchedules[account][entryID] = VestingEntries.VestingEntry({endTime: uint64(endTime), escrowAmount: quantity, duration: duration});

        accountVestingEntryIDs[account].push(entryID);

        /* Increment the next entry id. */
        nextEntryId++;

        emit VestingEntryCreated(account, quantity, duration, entryID);
    }
}

File 2 of 13 : Owned.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// https://docs.synthetix.io/contracts/source/contracts/owned
contract Owned {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) {
        require(_owner != address(0), "Owner address cannot be 0");
        owner = _owner;
        emit OwnerChanged(address(0), _owner);
    }

    function nominateNewOwner(address _owner) external onlyOwner {
        nominatedOwner = _owner;
        emit OwnerNominated(_owner);
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
        emit OwnerChanged(owner, nominatedOwner);
        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    modifier onlyOwner {
        _onlyOwner();
        _;
    }

    function _onlyOwner() private view {
        require(msg.sender == owner, "Only the contract owner may perform this action");
    }

    event OwnerNominated(address newOwner);
    event OwnerChanged(address oldOwner, address newOwner);
}

File 3 of 13 : IRewardEscrow.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library VestingEntries {
    struct VestingEntry {
        uint64 endTime;
        uint256 escrowAmount;
        uint256 duration;
    }
    struct VestingEntryWithID {
        uint64 endTime;
        uint256 escrowAmount;
        uint256 entryID;
    }
}

interface IRewardEscrow {
    // Views
    function getKwentaAddress() external view returns (address);

    function balanceOf(address account) external view returns (uint256);

    function numVestingEntries(address account) external view returns (uint256);

    function totalEscrowedAccountBalance(address account)
        external
        view
        returns (uint256);

    function totalVestedAccountBalance(address account)
        external
        view
        returns (uint256);

    function getVestingQuantity(address account, uint256[] calldata entryIDs)
        external
        view
        returns (uint256, uint256);

    function getVestingSchedules(
        address account,
        uint256 index,
        uint256 pageSize
    ) external view returns (VestingEntries.VestingEntryWithID[] memory);

    function getAccountVestingEntryIDs(
        address account,
        uint256 index,
        uint256 pageSize
    ) external view returns (uint256[] memory);

    function getVestingEntryClaimable(address account, uint256 entryID)
        external
        view
        returns (uint256, uint256);

    function getVestingEntry(address account, uint256 entryID)
        external
        view
        returns (
            uint64,
            uint256,
            uint256
        );

    // Mutative functions
    function vest(uint256[] calldata entryIDs) external;

    function createEscrowEntry(
        address beneficiary,
        uint256 deposit,
        uint256 duration
    ) external;

    function appendVestingEntry(
        address account,
        uint256 quantity,
        uint256 duration
    ) external;

    function stakeEscrow(uint256 _amount) external;

    function unstakeEscrow(uint256 _amount) external;
}

File 4 of 13 : SafeDecimalMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// https://docs.synthetix.io/contracts/source/libraries/safedecimalmath
library SafeDecimalMath {
    /* Number of decimal places in the representations. */
    uint8 public constant decimals = 18;
    uint8 public constant highPrecisionDecimals = 27;

    /* The number representing 1.0. */
    uint256 public constant UNIT = 10**uint256(decimals);

    /* The number representing 1.0 for higher fidelity numbers. */
    uint256 public constant PRECISE_UNIT = 10**uint256(highPrecisionDecimals);
    uint256 private constant UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR =
        10**uint256(highPrecisionDecimals - decimals);

    /**
     * @return Provides an interface to UNIT.
     */
    function unit() external pure returns (uint256) {
        return UNIT;
    }

    /**
     * @return Provides an interface to PRECISE_UNIT.
     */
    function preciseUnit() external pure returns (uint256) {
        return PRECISE_UNIT;
    }

    /**
     * @return The result of multiplying x and y, interpreting the operands as fixed-point
     * decimals.
     *
     * @dev A unit factor is divided out after the product of x and y is evaluated,
     * so that product must be less than 2**256. As this is an integer division,
     * the internal division always rounds down. This helps save on gas. Rounding
     * is more expensive on gas.
     */
    function multiplyDecimal(uint256 x, uint256 y)
        internal
        pure
        returns (uint256)
    {
        /* Divide by UNIT to remove the extra factor introduced by the product. */
        return (x * y) / UNIT;
    }

    /**
     * @return The result of safely dividing x and y. The return value is a high
     * precision decimal.
     *
     * @dev y is divided after the product of x and the standard precision unit
     * is evaluated, so the product of x and UNIT must be less than 2**256. As
     * this is an integer division, the result is always rounded down.
     * This helps save on gas. Rounding is more expensive on gas.
     */
    function divideDecimal(uint256 x, uint256 y)
        internal
        pure
        returns (uint256)
    {
        /* Reintroduce the UNIT factor that will be divided out by y. */
        return (x * UNIT) / y;
    }

    /**
     * @dev Convert a standard decimal representation to a high precision one.
     */
    function decimalToPreciseDecimal(uint256 i)
        internal
        pure
        returns (uint256)
    {
        return i * UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR;
    }

    /**
     * @dev Convert a high precision decimal to a standard decimal representation.
     */
    function preciseDecimalToDecimal(uint256 i)
        internal
        pure
        returns (uint256)
    {
        uint256 quotientTimesTen = i /
            (UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR / 10);

        if (quotientTimesTen % 10 >= 5) {
            quotientTimesTen += 10;
        }

        return quotientTimesTen / 10;
    }

    // Computes `a - b`, setting the value to 0 if b > a.
    function floorsub(uint256 a, uint256 b) internal pure returns (uint256) {
        return b >= a ? 0 : a - b;
    }
}

File 5 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.9.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 6 of 13 : IKwenta.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

interface IKwenta is IERC20 {

    function mint(address account, uint amount) external;

    function burn(uint amount) external;

    function setSupplySchedule(address _supplySchedule) external;

}

File 7 of 13 : IStakingRewards.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IStakingRewards {
    /// VIEWS
    // token state
    function totalSupply() external view returns (uint256);
    // staking state
    function balanceOf(address account) external view returns (uint256);
    function escrowedBalanceOf(address account) external view returns (uint256);
    function nonEscrowedBalanceOf(address account) external view returns (uint256);
    // rewards
    function getRewardForDuration() external view returns (uint256);
    function rewardPerToken() external view returns (uint256);
    function lastTimeRewardApplicable() external view returns (uint256);
    function earned(address account) external view returns (uint256);

    /// MUTATIVE
    // Staking/Unstaking
    function stake(uint256 amount) external;
    function unstake(uint256 amount) external;
    function stakeEscrow(address account, uint256 amount) external;
    function unstakeEscrow(address account, uint256 amount) external;
    function exit() external;
    // claim rewards
    function getReward() external;
    // settings
    function notifyRewardAmount(uint256 reward) external;
    function setRewardsDuration(uint256 _rewardsDuration) external;
    // pausable
    function pauseStakingRewards() external;
    function unpauseStakingRewards() external;
    // misc.
    function recoverERC20(address tokenAddress, uint256 tokenAmount) external;
}

File 8 of 13 : RewardEscrow.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.6.0;

import "../contracts/RewardEscrow.sol";

contract $RewardEscrow is RewardEscrow {
    constructor(address _owner, address _kwenta) RewardEscrow(_owner, _kwenta) {}

    function $_claimableAmount(VestingEntries.VestingEntry calldata _entry) external view returns (uint256, uint256) {
        return super._claimableAmount(_entry);
    }

    function $_earlyVestFee(VestingEntries.VestingEntry calldata _entry) external view returns (uint256) {
        return super._earlyVestFee(_entry);
    }

    function $_isEscrowStaked(address _account) external view returns (bool) {
        return super._isEscrowStaked(_account);
    }

    function $_transferVestedTokens(address _account,uint256 _amount) external {
        return super._transferVestedTokens(_account,_amount);
    }

    function $_reduceAccountEscrowBalances(address _account,uint256 _amount) external {
        return super._reduceAccountEscrowBalances(_account,_amount);
    }

    function $_appendVestingEntry(address account,uint256 quantity,uint256 duration) external {
        return super._appendVestingEntry(account,quantity,duration);
    }
}

File 9 of 13 : IERC20.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.6.0;

import "../../contracts/interfaces/IERC20.sol";

abstract contract $IERC20 is IERC20 {
    constructor() {}
}

File 10 of 13 : IKwenta.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.6.0;

import "../../contracts/interfaces/IKwenta.sol";

abstract contract $IKwenta is IKwenta {
    constructor() {}
}

File 11 of 13 : IRewardEscrow.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.6.0;

import "../../contracts/interfaces/IRewardEscrow.sol";

contract $VestingEntries {
    constructor() {}
}

abstract contract $IRewardEscrow is IRewardEscrow {
    constructor() {}
}

File 12 of 13 : IStakingRewards.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.6.0;

import "../../contracts/interfaces/IStakingRewards.sol";

abstract contract $IStakingRewards is IStakingRewards {
    constructor() {}
}

File 13 of 13 : Owned.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.6.0;

import "../../contracts/utils/Owned.sol";

contract $Owned is Owned {
    constructor(address _owner) Owned(_owner) {}
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_kwenta","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardEscrow","type":"address"}],"name":"StakingRewardsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryDAO","type":"address"}],"name":"TreasuryDAOSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Vested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"entryID","type":"uint256"}],"name":"VestingEntryCreated","type":"event"},{"inputs":[],"name":"MAX_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"accountVestingEntryIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"appendVestingEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"deposit","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"createEscrowEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"getAccountVestingEntryIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKwentaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"entryID","type":"uint256"}],"name":"getVestingEntry","outputs":[{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"entryID","type":"uint256"}],"name":"getVestingEntryClaimable","outputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"entryIDs","type":"uint256[]"}],"name":"getVestingQuantity","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"pageSize","type":"uint256"}],"name":"getVestingSchedules","outputs":[{"components":[{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"entryID","type":"uint256"}],"internalType":"struct VestingEntries.VestingEntryWithID[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEntryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numVestingEntries","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingRewards","type":"address"}],"name":"setStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryDAO","type":"address"}],"name":"setTreasuryDAO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingRewards","outputs":[{"internalType":"contract IStakingRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalEscrowedAccountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEscrowedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalVestedAccountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"entryIDs","type":"uint256[]"}],"name":"vest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingSchedules","outputs":[{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint256","name":"escrowAmount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b50604051620036cd380380620036cd833981810160405281019062000037919062000186565b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a29062000232565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000826040516200011f92919062000205565b60405180910390a15060016005819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050620002e1565b6000815190506200018081620002c7565b92915050565b60008060408385031215620001a0576200019f62000299565b5b6000620001b0858286016200016f565b9250506020620001c3858286016200016f565b9150509250929050565b620001d88162000265565b82525050565b6000620001ed60198362000254565b9150620001fa826200029e565b602082019050919050565b60006040820190506200021c6000830185620001cd565b6200022b6020830184620001cd565b9392505050565b600060208201905081810360008301526200024d81620001de565b9050919050565b600082825260208201905092915050565b6000620002728262000279565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b7f4f776e657220616464726573732063616e6e6f74206265203000000000000000600082015250565b620002d28162000265565b8114620002de57600080fd5b50565b60805160601c6133b16200031c600039600081816105bc01528181610ac20152818161156201528181611d80015261224701526133b16000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c806370a08231116100f9578063a86c3cde11610097578063b1724b4611610071578063b1724b4614610530578063e6b2cf6c1461054e578063eac624891461056c578063eddaee921461059c576101c3565b8063a86c3cde146104c6578063ad18e97e146104e2578063ae58254914610500576101c3565b806379ba5097116100d357806379ba5097146104665780638da5cb5b14610470578063a0416ed31461048e578063a46eddcf146104aa576101c3565b806370a08231146103e857806371e780f314610418578063773ab39f14610436576101c3565b806334c7fec9116101665780636154c343116101405780636154c3431461034b57806364b87a701461037d5780636dc05bd31461039b5780636fb83a57146103cc576101c3565b806334c7fec9146102df57806345626bd6146102fb57806353a47bb71461032d576101c3565b8063204b676a116101a2578063204b676a1461021e578063227d517a1461024e57806330104c5f1461027e578063326a3cfb146102af576101c3565b80624d37e2146101c85780631627540c146101e65780631bb47b4414610202575b600080fd5b6101d06105b8565b6040516101dd919061299d565b60405180910390f35b61020060048036038101906101fb919061247d565b6105e0565b005b61021c6004803603810190610217919061254a565b610663565b005b6102386004803603810190610233919061247d565b610703565b6040516102459190612c20565b60405180910390f35b6102686004803603810190610263919061247d565b61074f565b6040516102759190612c20565b60405180910390f35b6102986004803603810190610293919061250a565b610767565b6040516102a6929190612c3b565b60405180910390f35b6102c960048036038101906102c4919061247d565b610828565b6040516102d69190612c20565b60405180910390f35b6102f960048036038101906102f4919061259d565b610840565b005b6103156004803603810190610310919061250a565b610be0565b60405161032493929190612c9b565b60405180910390f35b610335610c2b565b604051610342919061299d565b60405180910390f35b6103656004803603810190610360919061250a565b610c51565b60405161037493929190612c9b565b60405180910390f35b610385610d73565b6040516103929190612a85565b60405180910390f35b6103b560048036038101906103b091906124aa565b610d99565b6040516103c3929190612c3b565b60405180910390f35b6103e660048036038101906103e1919061247d565b610ec0565b005b61040260048036038101906103fd919061247d565b610fd4565b60405161040f9190612c20565b60405180910390f35b61042061101d565b60405161042d9190612c20565b60405180910390f35b610450600480360381019061044b919061254a565b611023565b60405161045d9190612a41565b60405180910390f35b61046e61131b565b005b6104786114cc565b604051610485919061299d565b60405180910390f35b6104a860048036038101906104a3919061254a565b6114f0565b005b6104c460048036038101906104bf919061247d565b61165e565b005b6104e060048036038101906104db9190612617565b611773565b005b6104ea611805565b6040516104f7919061299d565b60405180910390f35b61051a6004803603810190610515919061250a565b61182b565b6040516105279190612c20565b60405180910390f35b61053861185c565b6040516105459190612c20565b60405180910390f35b610556611864565b6040516105639190612c20565b60405180910390f35b6105866004803603810190610581919061254a565b61186a565b6040516105939190612a63565b60405180910390f35b6105b660048036038101906105b19190612617565b611a75565b005b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6105e8611c3e565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051610658919061299d565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ea90612aa0565b60405180910390fd5b6106fe838383611cce565b505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60076020528060005260406000206000915090505481565b6000806000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206040518060600160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820154815260200160028201548152505090506108188161206a565b8093508194505050509250929050565b60066020528060005260406000206000915090505481565b60008060005b84849050811015610968576000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008787858181106108a7576108a6612fa3565b5b9050602002013581526020019081526020016000209050600081600101541461095457600080610927836040518060600160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820154815260200160028201548152505061206a565b915091506000836001018190555081866109419190612d55565b9550808561094f9190612d55565b945050505b50808061096090612efc565b915050610846565b5060008214610bda5761097a336120bc565b15610aae576000818361098d9190612d55565b90506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663057a601b336040518263ffffffff1660e01b81526004016109ec919061299d565b60206040518083038186803b158015610a0457600080fd5b505afa158015610a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3c9190612644565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a869190612e36565b905080821115610aab5760008183610a9e9190612e36565b9050610aa981611773565b505b50505b60008114610bcf57610ac03382612172565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401610b3d929190612a18565b602060405180830381600087803b158015610b5757600080fd5b505af1158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906125ea565b610bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc590612ae0565b60405180910390fd5b5b610bd933836121e5565b5b50505050565b6003602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900467ffffffffffffffff16908060010154908060020154905083565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060000160009054906101000a900467ffffffffffffffff169250600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020600101549150600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206002015490509250925092565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b84849050811015610eb7576000600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878785818110610e0057610dff612fa3565b5b9050602002013581526020019081526020016000206040518060600160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820154815260200160028201548152505090506000816020015114610ea357600080610e808361206a565b915091508186610e909190612d55565b95508085610e9e9190612d55565b945050505b508080610eaf90612efc565b915050610d9f565b50935093915050565b610ec8611c3e565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5090612ba0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb63c81227c62f4cb3e2b1120e3afbf3a2ed5dd8b9d99b8bef7275b084e6a98cb81604051610fc9919061299d565b60405180910390a150565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60085481565b6060600082846110339190612d55565b905083811161109957600067ffffffffffffffff81111561105757611056612fd2565b5b60405190808252806020026020018201604052801561109057816020015b61107d6123a8565b8152602001906001900390816110755790505b50915050611314565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081111561112957600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b600084826111379190612e36565b905060008167ffffffffffffffff81111561115557611154612fd2565b5b60405190808252806020026020018201604052801561118e57816020015b61117b6123a8565b8152602001906001900390816111735790505b50905060005b8281101561130c576000600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002088836111e99190612d55565b815481106111fa576111f9612fa3565b5b906000526020600020015490506000600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060600160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820154815260200160028201548152505090506040518060600160405280826000015167ffffffffffffffff16815260200182602001518152602001838152508484815181106112ec576112eb612fa3565b5b60200260200101819052505050808061130490612efc565b915050611194565b508093505050505b9392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290612ac0565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405161141e9291906129b8565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155790612b20565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016115bd939291906129e1565b602060405180830381600087803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160f91906125ea565b61164e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164590612b80565b60405180910390fd5b611659838383611cce565b505050565b611666611c3e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90612be0565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd780e06c55efd6b3157e8c26704d2fd7bd2750bd9d0e71d2e5f675572dfad7a2600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051611768919061299d565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c7da1633836040518363ffffffff1660e01b81526004016117d0929190612a18565b600060405180830381600087803b1580156117ea57600080fd5b505af11580156117fe573d6000803e3d6000fd5b5050505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6004602052816000526040600020818154811061184757600080fd5b90600052602060002001600091509150505481565b6303bfc40081565b60055481565b60606000828461187a9190612d55565b9050600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081111561190c57600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b83811161196557600067ffffffffffffffff81111561192e5761192d612fd2565b5b60405190808252806020026020018201604052801561195c5781602001602082028036833780820191505090505b50915050611a6e565b600084826119739190612e36565b905060008167ffffffffffffffff81111561199157611990612fd2565b5b6040519080825280602002602001820160405280156119bf5781602001602082028036833780820191505090505b50905060005b82811015611a6657600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208782611a189190612d55565b81548110611a2957611a28612fa3565b5b9060005260206000200154828281518110611a4757611a46612fa3565b5b6020026020010181815250508080611a5e90612efc565b9150506119c5565b508093505050505b9392505050565b600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663057a601b336040518263ffffffff1660e01b8152600401611b10919061299d565b60206040518083038186803b158015611b2857600080fd5b505afa158015611b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b609190612644565b82611b6b9190612d55565b1115611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390612c00565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663985134fb33836040518363ffffffff1660e01b8152600401611c09929190612a18565b600060405180830381600087803b158015611c2357600080fd5b505af1158015611c37573d6000803e3d6000fd5b5050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc390612bc0565b60405180910390fd5b565b6000821415611d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0990612b40565b60405180910390fd5b600081118015611d2657506303bfc4008111155b611d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5c90612b00565b60405180910390fd5b8160086000828254611d779190612d55565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611dd7919061299d565b60206040518083038186803b158015611def57600080fd5b505afa158015611e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e279190612644565b6008541115611e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6290612b60565b60405180910390fd5b60008142611e799190612d55565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eca9190612d55565b925050819055506000600554905060405180606001604052808367ffffffffffffffff16815260200185815260200184815250600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506020820151816001015560408201518160020155905050600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556005600081548092919061200c90612efc565b91905055508473ffffffffffffffffffffffffffffffffffffffff167fc11d912f381a0760d4ed857b120f217d7571b1c550471b92880b0b94b1d42bee85858460405161205b93929190612c64565b60405180910390a25050505050565b600080600083602001519050600081146120b657836000015167ffffffffffffffff16421061209b578092506120b5565b6120a484612344565b915081816120b29190612e36565b92505b5b50915091565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663057a601b846040518263ffffffff1660e01b815260040161211a919061299d565b60206040518083038186803b15801561213257600080fd5b505afa158015612146573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216a9190612644565b119050919050565b80600860008282546121849190612e36565b9250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121da9190612e36565b925050819055505050565b6121ef8282612172565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461223e9190612d55565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016122a0929190612a18565b602060405180830381600087803b1580156122ba57600080fd5b505af11580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f291906125ea565b508173ffffffffffffffffffffffffffffffffffffffff167ed5958799b183a7b738d3ad5e711305293dd5076a37a4e3b7e6611dea6114f3826040516123389190612c20565b60405180910390a25050565b60008042836000015167ffffffffffffffff166123619190612e36565b90506000600a600985602001516123789190612ddc565b6123829190612dab565b9050836040015182826123959190612ddc565b61239f9190612dab565b92505050919050565b6040518060600160405280600067ffffffffffffffff16815260200160008152602001600081525090565b6000813590506123e281613336565b92915050565b60008083601f8401126123fe576123fd613006565b5b8235905067ffffffffffffffff81111561241b5761241a613001565b5b6020830191508360208202830111156124375761243661300b565b5b9250929050565b60008151905061244d8161334d565b92915050565b60008135905061246281613364565b92915050565b60008151905061247781613364565b92915050565b60006020828403121561249357612492613015565b5b60006124a1848285016123d3565b91505092915050565b6000806000604084860312156124c3576124c2613015565b5b60006124d1868287016123d3565b935050602084013567ffffffffffffffff8111156124f2576124f1613010565b5b6124fe868287016123e8565b92509250509250925092565b6000806040838503121561252157612520613015565b5b600061252f858286016123d3565b925050602061254085828601612453565b9150509250929050565b60008060006060848603121561256357612562613015565b5b6000612571868287016123d3565b935050602061258286828701612453565b925050604061259386828701612453565b9150509250925092565b600080602083850312156125b4576125b3613015565b5b600083013567ffffffffffffffff8111156125d2576125d1613010565b5b6125de858286016123e8565b92509250509250929050565b600060208284031215612600576125ff613015565b5b600061260e8482850161243e565b91505092915050565b60006020828403121561262d5761262c613015565b5b600061263b84828501612453565b91505092915050565b60006020828403121561265a57612659613015565b5b600061266884828501612468565b91505092915050565b600061267d838361291f565b60608301905092915050565b60006126958383612961565b60208301905092915050565b6126aa81612e6a565b82525050565b60006126bb82612cf2565b6126c58185612d22565b93506126d083612cd2565b8060005b838110156127015781516126e88882612671565b97506126f383612d08565b9250506001810190506126d4565b5085935050505092915050565b600061271982612cfd565b6127238185612d33565b935061272e83612ce2565b8060005b8381101561275f5781516127468882612689565b975061275183612d15565b925050600181019050612732565b5085935050505092915050565b61277581612ec6565b82525050565b6000612788602f83612d44565b91506127938261301a565b604082019050919050565b60006127ab603583612d44565b91506127b682613069565b604082019050919050565b60006127ce602383612d44565b91506127d9826130b8565b604082019050919050565b60006127f1603383612d44565b91506127fc82613107565b604082019050919050565b6000612814602483612d44565b915061281f82613156565b604082019050919050565b6000612837601783612d44565b9150612842826131a5565b602082019050919050565b600061285a604783612d44565b9150612865826131ce565b606082019050919050565b600061287d601583612d44565b915061288882613243565b602082019050919050565b60006128a0601b83612d44565b91506128ab8261326c565b602082019050919050565b60006128c3602f83612d44565b91506128ce82613295565b604082019050919050565b60006128e6601a83612d44565b91506128f1826132e4565b602082019050919050565b6000612909601c83612d44565b91506129148261330d565b602082019050919050565b606082016000820151612935600085018261297f565b5060208201516129486020850182612961565b50604082015161295b6040850182612961565b50505050565b61296a81612ea8565b82525050565b61297981612ea8565b82525050565b61298881612eb2565b82525050565b61299781612eb2565b82525050565b60006020820190506129b260008301846126a1565b92915050565b60006040820190506129cd60008301856126a1565b6129da60208301846126a1565b9392505050565b60006060820190506129f660008301866126a1565b612a0360208301856126a1565b612a106040830184612970565b949350505050565b6000604082019050612a2d60008301856126a1565b612a3a6020830184612970565b9392505050565b60006020820190508181036000830152612a5b81846126b0565b905092915050565b60006020820190508181036000830152612a7d818461270e565b905092915050565b6000602082019050612a9a600083018461276c565b92915050565b60006020820190508181036000830152612ab98161277b565b9050919050565b60006020820190508181036000830152612ad98161279e565b9050919050565b60006020820190508181036000830152612af9816127c1565b9050919050565b60006020820190508181036000830152612b19816127e4565b9050919050565b60006020820190508181036000830152612b3981612807565b9050919050565b60006020820190508181036000830152612b598161282a565b9050919050565b60006020820190508181036000830152612b798161284d565b9050919050565b60006020820190508181036000830152612b9981612870565b9050919050565b60006020820190508181036000830152612bb981612893565b9050919050565b60006020820190508181036000830152612bd9816128b6565b9050919050565b60006020820190508181036000830152612bf9816128d9565b9050919050565b60006020820190508181036000830152612c19816128fc565b9050919050565b6000602082019050612c356000830184612970565b92915050565b6000604082019050612c506000830185612970565b612c5d6020830184612970565b9392505050565b6000606082019050612c796000830186612970565b612c866020830185612970565b612c936040830184612970565b949350505050565b6000606082019050612cb0600083018661298e565b612cbd6020830185612970565b612cca6040830184612970565b949350505050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612d6082612ea8565b9150612d6b83612ea8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612da057612d9f612f45565b5b828201905092915050565b6000612db682612ea8565b9150612dc183612ea8565b925082612dd157612dd0612f74565b5b828204905092915050565b6000612de782612ea8565b9150612df283612ea8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2b57612e2a612f45565b5b828202905092915050565b6000612e4182612ea8565b9150612e4c83612ea8565b925082821015612e5f57612e5e612f45565b5b828203905092915050565b6000612e7582612e88565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000612ed182612ed8565b9050919050565b6000612ee382612eea565b9050919050565b6000612ef582612e88565b9050919050565b6000612f0782612ea8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f3a57612f39612f45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b7f4f6e6c7920746865205374616b696e67526577617264732063616e207065726660008201527f6f726d207468697320616374696f6e0000000000000000000000000000000000602082015250565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008201527f2063616e20616363657074206f776e6572736869700000000000000000000000602082015250565b7f526577617264457363726f773a20546f6b656e205472616e736665722046616960008201527f6c65640000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657363726f7720776974682030206475726174696f6e204f5260008201527f2061626f7665206d61785f6475726174696f6e00000000000000000000000000602082015250565b7f43616e6e6f742063726561746520657363726f7720776974682061646472657360008201527f7328302900000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e746974792063616e6e6f74206265207a65726f000000000000000000600082015250565b7f4d75737420626520656e6f7567682062616c616e636520696e2074686520636f60008201527f6e747261637420746f2070726f7669646520666f72207468652076657374696e60208201527f6720656e74727900000000000000000000000000000000000000000000000000604082015250565b7f546f6b656e207472616e73666572206661696c65640000000000000000000000600082015250565b7f5374616b696e67205265776172647320616c7265616479207365740000000000600082015250565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008201527f6f726d207468697320616374696f6e0000000000000000000000000000000000602082015250565b7f526577617264457363726f773a205a65726f2041646472657373000000000000600082015250565b7f496e73756666696369656e7420756e7374616b656420657363726f7700000000600082015250565b61333f81612e6a565b811461334a57600080fd5b50565b61335681612e7c565b811461336157600080fd5b50565b61336d81612ea8565b811461337857600080fd5b5056fea264697066735822122060bdfe4355d5adde91e1361131e9360410c2c51eec3a86d190766fdc7f02464064736f6c63430008070033000000000000000000000000652c46a302060b324a02d2d3e4a56e3da07fa91b000000000000000000000000da0c33402fc1e10d18c532f0ed9c1a6c5c9e386c

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

000000000000000000000000652c46a302060b324a02d2d3e4a56e3da07fa91b000000000000000000000000da0c33402fc1e10d18c532f0ed9c1a6c5c9e386c

-----Decoded View---------------
Arg [0] : _owner (address): 0x652c46a302060B324A02d2d3e4a56e3DA07FA91b
Arg [1] : _kwenta (address): 0xDA0C33402Fc1e10d18c532F0Ed9c1A6c5C9e386C

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000652c46a302060b324a02d2d3e4a56e3da07fa91b
Arg [1] : 000000000000000000000000da0c33402fc1e10d18c532f0ed9c1a6c5c9e386c


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading