Contract 0x71Eaf68c2A23b7Bd78Db4987c3eCdB41c3b3b388 9

 
Txn Hash Method
Block
From
To
Value
0x8af2b06dbc7eeae0318061b7bf54074d5acb523cd93455204fbf278955ea3a6fClaim132190442024-04-16 0:30:353 hrs 54 mins ago0x06b16991b53632c2362267579ae7c4863c72fdb8 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000050888370.0188
0x26b34458c570d1034c7088d840532284c8d7824a3a8295fde67fc64cb11cb4adClaim131847352024-04-15 5:26:5722 hrs 57 mins ago0xb05cf01231cf2ff99499682e64d3780d57c80fdd IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000044399630.0164
0x9c5aed269f7f48d3fb933e132e67bd586e075d3c80905d63bead96ffe1e4cc23Claim131801742024-04-15 2:54:551 day 1 hr ago0xdc18517d7f2effc6cce195f5a2bf64ab52367ad3 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000042001870.0155
0x314d4c099500da4c129ce0c6b81fa67151e04fb1b5862b0c506e2509497a0f00Claim131801592024-04-15 2:54:251 day 1 hr ago0xdc18517d7f2effc6cce195f5a2bf64ab52367ad3 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.000004065270.015
0xc07064232fca342c6b8f4d56c10b149550b8d63bd050e11ebed930233cb6cdf3Claim131725542024-04-14 22:40:551 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000091273140.0266
0x8d41cf166c66e37c32f82613e8b42158ce8e87f720081db4174d8d0c27184876Claim131725252024-04-14 22:39:571 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000089774790.0266
0xdbf190db4539baf90e78e5bb60d6e5e1bad12f29dab317d52df1cc520c1f2be3Claim131725112024-04-14 22:39:291 day 5 hrs ago0x3808107710de74cc83e3c165a28bb3a2779742e9 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000087963330.0265
0x13fa9327fce60d183606f9fb3a63840f4d8238fff6e84e788e72dffe3872c8bdClaim131722702024-04-14 22:31:271 day 5 hrs ago0x6a9696899e5b114342882c358ffc7c4e620e88df IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000076498520.0266
0xf4bfa0e52be13249d1f3c079d22d4714406d8f3a19efa173ec7b1071dfdc5c48Claim131663922024-04-14 19:15:311 day 9 hrs ago0x35fb78bfb4452e7fa0ef231d2ec5268b463e4f62 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000134552660.049798309
0x48f7df7d2dc4db4b01b64b6e9d21c206e807183aeac48026f8b637739e13367fClaim131663632024-04-14 19:14:331 day 9 hrs ago0x35fb78bfb4452e7fa0ef231d2ec5268b463e4f62 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000135695970.050219237
0xa1fa268c5f9231c1766e519c10c84555d7f564dd46d748722d221dbdd07c8ba7Claim131336082024-04-14 1:02:432 days 3 hrs ago0x3f0dff6014836fa3e7308c1ed7b46b9b101977ea IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000082159070.03032405
0x6393eddfe7e6e1260eb4a5cdd6ca623167fcf154628efdcfd98189c87ea67923Claim131075642024-04-13 10:34:352 days 17 hrs ago0x3f888f4e16a08c6b3745ddbade98e24569852fa4 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000081405290.0269
0xc0db6c0f601e98875bac29f9254ee2d7f7e65f733b323dd594467443a51bd116Claim131012142024-04-13 7:02:552 days 21 hrs ago0x3d6991085ab1ae3926cb96f25684c40a364b6856 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000038932040.013782368
0xda354af709676f462cb16eb49699e21667afdc3be0570d0ff1d18b58546eeadfClaim130421142024-04-11 22:12:554 days 6 hrs ago0xae20c76535338da755a124ff50280b782765f0f9 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0001885444260.3849
0x0ebd8d3253b3df84e27b8d8a4546be22ad69e95cca230175ac053adfcd1b7fbaClaim130355362024-04-11 18:33:394 days 9 hrs ago0x56e08babb8bf928bd8571d2a2a78235ae57ae5bd IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000622888460.221914569
0xf3eb989c08609f1b7118821e0f5330d7e97028d6a69c89afe351321c37c02eb2Claim130332362024-04-11 17:16:594 days 11 hrs ago0x0b776552c1aef1dc33005dd25acda22493b6615d IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000448896130.1662
0xc39f23ae61bc1623d455c62c93f26224f3cc94c64f7a2894ff5b37fadad235c6Claim130331762024-04-11 17:14:594 days 11 hrs ago0x0b776552c1aef1dc33005dd25acda22493b6615d IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000481431370.1714
0xac89261f6d295d5d711c51fa1bbdba0f273279c77da47f665f684f23785338a4Claim130306752024-04-11 15:51:374 days 12 hrs ago0x99378ebb997245aa14bfb8a28ac9619f0713cf6c IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000877587580.3251
0xe93922f0cbabcf66983979a31ef4e2b628ad747f91777051b33754b6c226c184Claim130266862024-04-11 13:38:394 days 14 hrs ago0x50149b01f19c2d4a403b1fe4469c117a5cedb4fc IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000225234910.0801
0x9d533bc28b228530de51b8ece46934e912017cda800caa66e0414d9d85f6b910Claim130225782024-04-11 11:21:434 days 17 hrs ago0x02706c602c59f86cc2ebd9ae662a25987a7c7986 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000211275370.0752
0xbd9741d6e733748dd2e8a6b748f263375f51ee30486f703e392a2c70bd8c2bf7Claim130213802024-04-11 10:41:474 days 17 hrs ago0x452eef5b538e3fed4fca31326678a0a51e0e335d IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000265732210.0946
0x9c3478c34f45c6384b6c8e56de7a09c3734a66c49e5e8f3cd1c97ea17fb6dc13Claim130212962024-04-11 10:38:594 days 17 hrs ago0x452eef5b538e3fed4fca31326678a0a51e0e335d IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000272547480.095
0x7c724c59548a4682b048a7a45e27daa643d1889f2c1ed3bd72cf8e1373af7d80Claim130211972024-04-11 10:35:414 days 17 hrs ago0x6f0b20443d05038dd24d0dba77a6fe368773c730 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000284308780.0991
0x729852687826aa4aad35404831cf96fe9125cd43bea30b5ded12d4dc54eaf650Claim130138622024-04-11 6:31:114 days 21 hrs ago0xd25f3ff4d63179800dce837dc5412dac1ba6133f IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000163546190.0425
0xb9773264f2e3f71cb17a8a46230bfc9fad392c9684c954f852353d2966dc1558Claim130128432024-04-11 5:57:134 days 22 hrs ago0xef3ccef2239cee4d61a3b939165f28303708bce2 IN  0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b3880 ETH0.0000123083820.0438
[ Download CSV Export 
Latest 2 internal transactions
Parent Txn Hash Block From To Value
0xbcfc947ab363faf708fec6af65408fd15bff05a0895c475c5b7f507b72ee68a719626602023-07-30 10:57:47260 days 17 hrs ago 0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b388 0xd386a121991e51eab5e3433bf5b1cf4c8884b47a0 ETH
0xbcfc947ab363faf708fec6af65408fd15bff05a0895c475c5b7f507b72ee68a719626602023-07-30 10:57:47260 days 17 hrs ago 0x71eaf68c2a23b7bd78db4987c3ecdb41c3b3b388 0x91f85d68b413de823684c891db515b0390a025120 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardsDistributor

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-08-02
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)



/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}


interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}


interface IRewardsDistributor {
    function checkpoint_token() external;
    function checkpoint_total_supply() external;
}



interface IVotingEscrow {

    struct Point {
        int128 bias;
        int128 slope; // # -dweight / dt
        uint256 ts;
        uint256 blk; // block
    }

    function token() external view returns (address);
    function team() external returns (address);
    function epoch() external view returns (uint);
    function point_history(uint loc) external view returns (Point memory);
    function user_point_history(uint tokenId, uint loc) external view returns (Point memory);
    function user_point_epoch(uint tokenId) external view returns (uint);

    function ownerOf(uint) external view returns (address);
    function isApprovedOrOwner(address, uint) external view returns (bool);
    function transferFrom(address, address, uint) external;

    function voting(uint tokenId) external;
    function abstain(uint tokenId) external;
    function attach(uint tokenId) external;
    function detach(uint tokenId) external;

    function checkpoint() external;
    function deposit_for(uint tokenId, uint value) external;
    function create_lock_for(uint, uint, address) external returns (uint);

    function balanceOfNFT(uint) external view returns (uint);
    function totalSupply() external view returns (uint);
}


/*

@title Curve Fee Distribution modified for ve(3,3) emissions
@author Curve Finance, andrecronje
@license MIT

*/

contract RewardsDistributor is IRewardsDistributor {

    event CheckpointToken(
        uint time,
        uint tokens
    );

    event Claimed(
        uint tokenId,
        uint amount,
        uint claim_epoch,
        uint max_epoch
    );

    uint constant WEEK = 7 * 86400;

    uint public start_time;
    uint public time_cursor;
    mapping(uint => uint) public time_cursor_of;
    mapping(uint => uint) public user_epoch_of;

    uint public last_token_time;
    uint[1000000000000000] public tokens_per_week;

    address public voting_escrow;
    address public token;
    uint public token_last_balance;

    uint[1000000000000000] public ve_supply;

    address public depositor;

    constructor(address _voting_escrow) {
        uint _t = block.timestamp / WEEK * WEEK;
        start_time = _t;
        last_token_time = _t;
        time_cursor = _t;
        address _token = IVotingEscrow(_voting_escrow).token();
        token = _token;
        voting_escrow = _voting_escrow;
        depositor = msg.sender;
        require(IERC20(_token).approve(_voting_escrow, type(uint).max));
    }

    function timestamp() external view returns (uint) {
        return block.timestamp / WEEK * WEEK;
    }

    function _checkpoint_token() internal {
        uint token_balance = IERC20(token).balanceOf(address(this));
        uint to_distribute = token_balance - token_last_balance;
        token_last_balance = token_balance;

        uint t = last_token_time;
        uint since_last = block.timestamp - t;
        last_token_time = block.timestamp;
        uint this_week = t / WEEK * WEEK;
        uint next_week = 0;

        for (uint i = 0; i < 20; i++) {
            next_week = this_week + WEEK;
            if (block.timestamp < next_week) {
                if (since_last == 0 && block.timestamp == t) {
                    tokens_per_week[this_week] += to_distribute;
                } else {
                    tokens_per_week[this_week] += to_distribute * (block.timestamp - t) / since_last;
                }
                break;
            } else {
                if (since_last == 0 && next_week == t) {
                    tokens_per_week[this_week] += to_distribute;
                } else {
                    tokens_per_week[this_week] += to_distribute * (next_week - t) / since_last;
                }
            }
            t = next_week;
            this_week = next_week;
        }
        emit CheckpointToken(block.timestamp, to_distribute);
    }

    function checkpoint_token() external {
        assert(msg.sender == depositor);
        _checkpoint_token();
    }

    function _find_timestamp_epoch(address ve, uint _timestamp) internal view returns (uint) {
        uint _min = 0;
        uint _max = IVotingEscrow(ve).epoch();
        for (uint i = 0; i < 128; i++) {
            if (_min >= _max) break;
            uint _mid = (_min + _max + 2) / 2;
            IVotingEscrow.Point memory pt = IVotingEscrow(ve).point_history(_mid);
            if (pt.ts <= _timestamp) {
                _min = _mid;
            } else {
                _max = _mid - 1;
            }
        }
        return _min;
    }

    function _find_timestamp_user_epoch(address ve, uint tokenId, uint _timestamp, uint max_user_epoch) internal view returns (uint) {
        uint _min = 0;
        uint _max = max_user_epoch;
        for (uint i = 0; i < 128; i++) {
            if (_min >= _max) break;
            uint _mid = (_min + _max + 2) / 2;
            IVotingEscrow.Point memory pt = IVotingEscrow(ve).user_point_history(tokenId, _mid);
            if (pt.ts <= _timestamp) {
                _min = _mid;
            } else {
                _max = _mid -1;
            }
        }
        return _min;
    }

    function ve_for_at(uint _tokenId, uint _timestamp) external view returns (uint) {
        address ve = voting_escrow;
        uint max_user_epoch = IVotingEscrow(ve).user_point_epoch(_tokenId);
        uint epoch = _find_timestamp_user_epoch(ve, _tokenId, _timestamp, max_user_epoch);
        IVotingEscrow.Point memory pt = IVotingEscrow(ve).user_point_history(_tokenId, epoch);
        return Math.max(uint(int256(pt.bias - pt.slope * (int128(int256(_timestamp - pt.ts))))), 0);
    }

    function _checkpoint_total_supply() internal {
        address ve = voting_escrow;
        uint t = time_cursor;
        uint rounded_timestamp = block.timestamp / WEEK * WEEK;
        IVotingEscrow(ve).checkpoint();

        for (uint i = 0; i < 20; i++) {
            if (t > rounded_timestamp) {
                break;
            } else {
                uint epoch = _find_timestamp_epoch(ve, t);
                IVotingEscrow.Point memory pt = IVotingEscrow(ve).point_history(epoch);
                int128 dt = 0;
                if (t > pt.ts) {
                    dt = int128(int256(t - pt.ts));
                }
                ve_supply[t] = Math.max(uint(int256(pt.bias - pt.slope * dt)), 0);
            }
            t += WEEK;
        }
        time_cursor = t;
    }

    function checkpoint_total_supply() external {
        _checkpoint_total_supply();
    }

    function _claim(uint _tokenId, address ve, uint _last_token_time) internal returns (uint) {
        uint user_epoch = 0;
        uint to_distribute = 0;

        uint max_user_epoch = IVotingEscrow(ve).user_point_epoch(_tokenId);
        uint _start_time = start_time;

        if (max_user_epoch == 0) return 0;

        uint week_cursor = time_cursor_of[_tokenId];
        if (week_cursor == 0) {
            user_epoch = _find_timestamp_user_epoch(ve, _tokenId, _start_time, max_user_epoch);
        } else {
            user_epoch = user_epoch_of[_tokenId];
        }

        if (user_epoch == 0) user_epoch = 1;

        IVotingEscrow.Point memory user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);

        if (week_cursor == 0) week_cursor = (user_point.ts + WEEK - 1) / WEEK * WEEK;
        if (week_cursor >= last_token_time) return 0;
        if (week_cursor < _start_time) week_cursor = _start_time;

        IVotingEscrow.Point memory old_user_point;

        for (uint i = 0; i < 50; i++) {
            if (week_cursor >= _last_token_time) break;

            if (week_cursor >= user_point.ts && user_epoch <= max_user_epoch) {
                user_epoch += 1;
                old_user_point = user_point;
                if (user_epoch > max_user_epoch) {
                    user_point = IVotingEscrow.Point(0,0,0,0);
                } else {
                    user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);
                }
            } else {
                int128 dt = int128(int256(week_cursor - old_user_point.ts));
                uint balance_of = Math.max(uint(int256(old_user_point.bias - dt * old_user_point.slope)), 0);
                if (balance_of == 0 && user_epoch > max_user_epoch) break;
                if (balance_of != 0) {
                    to_distribute += balance_of * tokens_per_week[week_cursor] / ve_supply[week_cursor];
                }
                week_cursor += WEEK;
            }
        }

        user_epoch = Math.min(max_user_epoch, user_epoch - 1);
        user_epoch_of[_tokenId] = user_epoch;
        time_cursor_of[_tokenId] = week_cursor;

        emit Claimed(_tokenId, to_distribute, user_epoch, max_user_epoch);

        return to_distribute;
    }

    function _claimable(uint _tokenId, address ve, uint _last_token_time) internal view returns (uint) {
        uint user_epoch = 0;
        uint to_distribute = 0;

        uint max_user_epoch = IVotingEscrow(ve).user_point_epoch(_tokenId);
        uint _start_time = start_time;

        if (max_user_epoch == 0) return 0;

        uint week_cursor = time_cursor_of[_tokenId];
        if (week_cursor == 0) {
            user_epoch = _find_timestamp_user_epoch(ve, _tokenId, _start_time, max_user_epoch);
        } else {
            user_epoch = user_epoch_of[_tokenId];
        }

        if (user_epoch == 0) user_epoch = 1;

        IVotingEscrow.Point memory user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);

        if (week_cursor == 0) week_cursor = (user_point.ts + WEEK - 1) / WEEK * WEEK;
        if (week_cursor >= last_token_time) return 0;
        if (week_cursor < _start_time) week_cursor = _start_time;

        IVotingEscrow.Point memory old_user_point;

        for (uint i = 0; i < 50; i++) {
            if (week_cursor >= _last_token_time) break;

            if (week_cursor >= user_point.ts && user_epoch <= max_user_epoch) {
                user_epoch += 1;
                old_user_point = user_point;
                if (user_epoch > max_user_epoch) {
                    user_point = IVotingEscrow.Point(0,0,0,0);
                } else {
                    user_point = IVotingEscrow(ve).user_point_history(_tokenId, user_epoch);
                }
            } else {
                int128 dt = int128(int256(week_cursor - old_user_point.ts));
                uint balance_of = Math.max(uint(int256(old_user_point.bias - dt * old_user_point.slope)), 0);
                if (balance_of == 0 && user_epoch > max_user_epoch) break;
                if (balance_of != 0) {
                    to_distribute += balance_of * tokens_per_week[week_cursor] / ve_supply[week_cursor];
                }
                week_cursor += WEEK;
            }
        }

        return to_distribute;
    }

    function claimable(uint _tokenId) external view returns (uint) {
        uint _last_token_time = last_token_time / WEEK * WEEK;
        return _claimable(_tokenId, voting_escrow, _last_token_time);
    }

    function claim(uint _tokenId) external returns (uint) {
        if (block.timestamp >= time_cursor) _checkpoint_total_supply();
        uint _last_token_time = last_token_time;
        _last_token_time = _last_token_time / WEEK * WEEK;
        uint amount = _claim(_tokenId, voting_escrow, _last_token_time);
        if (amount != 0) {
            IVotingEscrow(voting_escrow).deposit_for(_tokenId, amount);
            token_last_balance -= amount;
        }
        return amount;
    }

    function claim_many(uint[] memory _tokenIds) external returns (bool) {
        if (block.timestamp >= time_cursor) _checkpoint_total_supply();
        uint _last_token_time = last_token_time;
        _last_token_time = _last_token_time / WEEK * WEEK;
        address _voting_escrow = voting_escrow;
        uint total = 0;

        for (uint i = 0; i < _tokenIds.length; i++) {
            uint _tokenId = _tokenIds[i];
            if (_tokenId == 0) break;
            uint amount = _claim(_tokenId, _voting_escrow, _last_token_time);
            if (amount != 0) {
                IVotingEscrow(_voting_escrow).deposit_for(_tokenId, amount);
                total += amount;
            }
        }
        if (total != 0) {
            token_last_balance -= total;
        }

        return true;
    }

    // Once off event on contract initialize
    function setDepositor(address _depositor) external {
        require(msg.sender == depositor);
        depositor = _depositor;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_voting_escrow","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"CheckpointToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claim_epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"max_epoch","type":"uint256"}],"name":"Claimed","type":"event"},{"inputs":[],"name":"checkpoint_token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpoint_total_supply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claim_many","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"last_token_time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"setDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start_time","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"time_cursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"time_cursor_of","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token_last_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens_per_week","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"user_epoch_of","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"ve_for_at","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ve_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voting_escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162001b9e38038062001b9e83398101604081905262000034916200019f565b600062093a80620000468142620001d1565b620000529190620001f4565b90508060008190555080600481905550806001819055506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d091906200019f565b66038d7ea4c6800680546001600160a01b038381166001600160a01b0319928316811790935566038d7ea4c6800580549188169183168217905566071afd498d00088054909216331790915560405163095ea7b360e01b8152600481019190915260001960248201529192509063095ea7b3906044016020604051808303816000875af115801562000166573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018c919062000222565b6200019657600080fd5b50505062000246565b600060208284031215620001b257600080fd5b81516001600160a01b0381168114620001ca57600080fd5b9392505050565b600082620001ef57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156200021d57634e487b7160e01b600052601160045260246000fd5b500290565b6000602082840312156200023557600080fd5b81518015158114620001ca57600080fd5b61194880620002566000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063834ee417116100ad578063d4dafba811610071578063d4dafba81461024a578063dfe050311461025d578063edf5999714610276578063f2c098b714610289578063fc0c546a1461029c57600080fd5b8063834ee417146101ed578063b21ed502146101f6578063b80777ea146101fe578063c7c4ff4614610206578063d1d58b251461023757600080fd5b8063379607f5116100f4578063379607f514610194578063486d25fe146101a757806368809889146101c75780637f58e8f8146101da578063811a40fe146101e357600080fd5b8063127dcbd31461012657806316aea5c0146101425780631f1db0431461016257806322b04bfc14610185575b600080fd5b61012f60015481565b6040519081526020015b60405180910390f35b61012f610150366004611566565b60036020526000908152604090205481565b6101756101703660046115c6565b6102b5565b6040519015158152602001610139565b61012f66038d7ea4c680075481565b61012f6101a2366004611566565b6103fb565b61012f6101b5366004611566565b60026020526000908152604090205481565b61012f6101d536600461166c565b6104e5565b61012f60045481565b6101eb610628565b005b61012f60005481565b6101eb610652565b61012f61065a565b66071afd498d00085461021f906001600160a01b031681565b6040516001600160a01b039091168152602001610139565b61012f610245366004611566565b610679565b61012f610258366004611566565b6106b9565b66038d7ea4c680055461021f906001600160a01b031681565b61012f610284366004611566565b6106dc565b6101eb61029736600461168e565b6106f2565b66038d7ea4c680065461021f906001600160a01b031681565b600060015442106102c8576102c8610737565b60045462093a806102d981836116cd565b6102e391906116ef565b66038d7ea4c68005549091506001600160a01b03166000805b85518110156103cb5760008682815181106103195761031961170e565b602002602001015190508060000361033157506103cb565b600061033e8286886108da565b905080156103b657604051631dd33fc560e31b815260048101839052602481018290526001600160a01b0386169063ee99fe2890604401600060405180830381600087803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b5050505080846103b39190611724565b93505b505080806103c39061173c565b9150506102fc565b5080156103f0578066038d7ea4c6800760008282546103ea9190611755565b90915550505b506001949350505050565b6000600154421061040e5761040e610737565b60045462093a8061041f81836116cd565b61042991906116ef565b66038d7ea4c680055490915060009061044d9085906001600160a01b0316846108da565b905080156104de5766038d7ea4c6800554604051631dd33fc560e31b815260048101869052602481018390526001600160a01b039091169063ee99fe2890604401600060405180830381600087803b1580156104a857600080fd5b505af11580156104bc573d6000803e3d6000fd5b505050508066038d7ea4c6800760008282546104d89190611755565b90915550505b9392505050565b66038d7ea4c680055460405163391044d760e21b8152600481018490526000916001600160a01b0316908290829063e441135c90602401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d919061176c565b9050600061056d83878785610cfe565b6040516309bb79ed60e11b815260048101889052602481018290529091506000906001600160a01b03851690631376f3da90604401608060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e3919061179c565b905061061d8160400151876105f89190611755565b8260200151610607919061180e565b825161061391906118ac565b600f0b6000610df2565b979650505050505050565b66071afd498d0008546001600160a01b03163314610648576106486118fc565b610650610e08565b565b610650610737565b600062093a8061066a81426116cd565b61067491906116ef565b905090565b60008062093a808060045461068e91906116cd565b61069891906116ef565b66038d7ea4c68005549091506104de9084906001600160a01b031683611065565b66038d7ea4c680088166038d7ea4c6800081106106d557600080fd5b0154905081565b60058166038d7ea4c6800081106106d557600080fd5b66071afd498d0008546001600160a01b0316331461070f57600080fd5b66071afd498d000880546001600160a01b0319166001600160a01b0392909216919091179055565b66038d7ea4c68005546001546001600160a01b0390911690600062093a8061075f81426116cd565b61076991906116ef565b9050826001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a657600080fd5b505af11580156107ba573d6000803e3d6000fd5b5050505060005b60148110156108d2578183116108d25760006107dd8585611402565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0387169063d1febfb990602401608060405180830381865afa158015610828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084c919061179c565b90506000816040015186111561086e57604082015161086b9087611755565b90505b61088d818360200151610881919061180e565b835161061391906118ac565b66038d7ea4c680088766038d7ea4c6800081106108ac576108ac61170e565b01555050506108be62093a8084611724565b9250806108ca8161173c565b9150506107c1565b505060015550565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c919061176c565b600080549192508290036109675760009450505050506104de565b600088815260026020526040812054908190036109915761098a888a8486610cfe565b94506109a3565b60008981526003602052604090205494505b846000036109b057600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa1580156109ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a23919061179c565b905081600003610a685762093a8080600162093a808460400151610a479190611724565b610a519190611755565b610a5b91906116cd565b610a6591906116ef565b91505b6004548210610a8057600096505050505050506104de565b82821015610a8c578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b6032811015610c735789841015610c735782604001518410158015610ad65750858811155b15610b9c57610ae6600189611724565b975082915085881115610b255760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250610c61565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b95919061179c565b9250610c61565b6000826040015185610bae9190611755565b90506000610bd1846020015183610bc5919061180e565b855161061391906118ac565b905080158015610be05750878a115b15610bec575050610c73565b8015610c4f5766038d7ea4c680088666038d7ea4c680008110610c1157610c1161170e565b015460058766038d7ea4c680008110610c2c57610c2c61170e565b0154610c3890836116ef565b610c4291906116cd565b610c4c908a611724565b98505b610c5c62093a8087611724565b955050505b80610c6b8161173c565b915050610ab1565b50610c8885610c8360018a611755565b611557565b60008c8152600360209081526040808320849055600282529182902086905581518e8152908101899052908101829052606081018790529097507fcae2990aa9af8eb1c64713b7eddb3a80bf18e49a94a13fe0d0002b5d61d58f009060800160405180910390a150939998505050505050505050565b60008082815b6080811015610de65781831015610de65760006002610d238486611724565b610d2e906002611724565b610d3891906116cd565b6040516309bb79ed60e11b8152600481018a9052602481018290529091506000906001600160a01b038b1690631376f3da90604401608060405180830381865afa158015610d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dae919061179c565b905087816040015111610dc357819450610dd1565b610dce600183611755565b93505b50508080610dde9061173c565b915050610d04565b50909695505050505050565b6000818311610e0157816104de565b5090919050565b66038d7ea4c68006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b919061176c565b9050600066038d7ea4c680075482610e939190611755565b66038d7ea4c680078390556004549091506000610eb08242611755565b426004559050600062093a80610ec681856116cd565b610ed091906116ef565b90506000805b601481101561102357610eec62093a8084611724565b915081421015610f755783158015610f0357508442145b15610f3d578560058466038d7ea4c680008110610f2257610f2261170e565b016000828254610f329190611724565b909155506110239050565b83610f488642611755565b610f5290886116ef565b610f5c91906116cd565b60058466038d7ea4c680008110610f2257610f2261170e565b83158015610f8257508482145b15610fbc578560058466038d7ea4c680008110610fa157610fa161170e565b016000828254610fb19190611724565b9091555061100a9050565b83610fc78684611755565b610fd190886116ef565b610fdb91906116cd565b60058466038d7ea4c680008110610ff457610ff461170e565b0160008282546110049190611724565b90915550505b819450819250808061101b9061173c565b915050610ed6565b5060408051428152602081018790527fce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6910160405180910390a1505050505050565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa1580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061176c565b600080549192508290036110f25760009450505050506104de565b6000888152600260205260408120549081900361111c57611115888a8486610cfe565b945061112e565b60008981526003602052604090205494505b8460000361113b57600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa15801561118a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae919061179c565b9050816000036111f35762093a8080600162093a8084604001516111d29190611724565b6111dc9190611755565b6111e691906116cd565b6111f091906116ef565b91505b600454821061120b57600096505050505050506104de565b82821015611217578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b60328110156113f257898410156113f257826040015184101580156112615750858811155b1561132757611271600189611724565b9750829150858811156112b05760405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525092506113e0565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa1580156112fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611320919061179c565b92506113e0565b60008260400151856113399190611755565b90506000611350846020015183610bc5919061180e565b90508015801561135f5750878a115b1561136b5750506113f2565b80156113ce5766038d7ea4c680088666038d7ea4c6800081106113905761139061170e565b015460058766038d7ea4c6800081106113ab576113ab61170e565b01546113b790836116ef565b6113c191906116cd565b6113cb908a611724565b98505b6113db62093a8087611724565b955050505b806113ea8161173c565b91505061123c565b50949a9950505050505050505050565b600080600090506000846001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146d919061176c565b905060005b608081101561154d578183101561154d57600060026114918486611724565b61149c906002611724565b6114a691906116cd565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0389169063d1febfb990602401608060405180830381865afa1580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611515919061179c565b90508681604001511161152a57819450611538565b611535600183611755565b93505b505080806115459061173c565b915050611472565b5090949350505050565b6000818310610e0157816104de565b60006020828403121561157857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156115be576115be61157f565b604052919050565b600060208083850312156115d957600080fd5b823567ffffffffffffffff808211156115f157600080fd5b818501915085601f83011261160557600080fd5b8135818111156116175761161761157f565b8060051b9150611628848301611595565b818152918301840191848101908884111561164257600080fd5b938501935b8385101561166057843582529385019390850190611647565b98975050505050505050565b6000806040838503121561167f57600080fd5b50508035926020909101359150565b6000602082840312156116a057600080fd5b81356001600160a01b03811681146104de57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000826116ea57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611709576117096116b7565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115611737576117376116b7565b500190565b60006001820161174e5761174e6116b7565b5060010190565b600082821015611767576117676116b7565b500390565b60006020828403121561177e57600080fd5b5051919050565b8051600f81900b811461179757600080fd5b919050565b6000608082840312156117ae57600080fd5b6040516080810181811067ffffffffffffffff821117156117d1576117d161157f565b6040526117dd83611785565b81526117eb60208401611785565b602082015260408301516040820152606083015160608201528091505092915050565b600081600f0b83600f0b60016001607f1b0360008213600084138383048511828216161561183e5761183e6116b7565b6f7fffffffffffffffffffffffffffffff19600085128281168783058712161561186a5761186a6116b7565b60008712925085820587128484161615611886576118866116b7565b8585058712818416161561189c5761189c6116b7565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156118d7576118d76116b7565b8160016001607f1b030183138116156118f2576118f26116b7565b5090039392505050565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220df39fa4149f6a026a6d05b7f018116456ad78482d46afe7b6da486093c631dbd64736f6c634300080d003300000000000000000000000091f85d68b413de823684c891db515b0390a02512

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063834ee417116100ad578063d4dafba811610071578063d4dafba81461024a578063dfe050311461025d578063edf5999714610276578063f2c098b714610289578063fc0c546a1461029c57600080fd5b8063834ee417146101ed578063b21ed502146101f6578063b80777ea146101fe578063c7c4ff4614610206578063d1d58b251461023757600080fd5b8063379607f5116100f4578063379607f514610194578063486d25fe146101a757806368809889146101c75780637f58e8f8146101da578063811a40fe146101e357600080fd5b8063127dcbd31461012657806316aea5c0146101425780631f1db0431461016257806322b04bfc14610185575b600080fd5b61012f60015481565b6040519081526020015b60405180910390f35b61012f610150366004611566565b60036020526000908152604090205481565b6101756101703660046115c6565b6102b5565b6040519015158152602001610139565b61012f66038d7ea4c680075481565b61012f6101a2366004611566565b6103fb565b61012f6101b5366004611566565b60026020526000908152604090205481565b61012f6101d536600461166c565b6104e5565b61012f60045481565b6101eb610628565b005b61012f60005481565b6101eb610652565b61012f61065a565b66071afd498d00085461021f906001600160a01b031681565b6040516001600160a01b039091168152602001610139565b61012f610245366004611566565b610679565b61012f610258366004611566565b6106b9565b66038d7ea4c680055461021f906001600160a01b031681565b61012f610284366004611566565b6106dc565b6101eb61029736600461168e565b6106f2565b66038d7ea4c680065461021f906001600160a01b031681565b600060015442106102c8576102c8610737565b60045462093a806102d981836116cd565b6102e391906116ef565b66038d7ea4c68005549091506001600160a01b03166000805b85518110156103cb5760008682815181106103195761031961170e565b602002602001015190508060000361033157506103cb565b600061033e8286886108da565b905080156103b657604051631dd33fc560e31b815260048101839052602481018290526001600160a01b0386169063ee99fe2890604401600060405180830381600087803b15801561038f57600080fd5b505af11580156103a3573d6000803e3d6000fd5b5050505080846103b39190611724565b93505b505080806103c39061173c565b9150506102fc565b5080156103f0578066038d7ea4c6800760008282546103ea9190611755565b90915550505b506001949350505050565b6000600154421061040e5761040e610737565b60045462093a8061041f81836116cd565b61042991906116ef565b66038d7ea4c680055490915060009061044d9085906001600160a01b0316846108da565b905080156104de5766038d7ea4c6800554604051631dd33fc560e31b815260048101869052602481018390526001600160a01b039091169063ee99fe2890604401600060405180830381600087803b1580156104a857600080fd5b505af11580156104bc573d6000803e3d6000fd5b505050508066038d7ea4c6800760008282546104d89190611755565b90915550505b9392505050565b66038d7ea4c680055460405163391044d760e21b8152600481018490526000916001600160a01b0316908290829063e441135c90602401602060405180830381865afa158015610539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055d919061176c565b9050600061056d83878785610cfe565b6040516309bb79ed60e11b815260048101889052602481018290529091506000906001600160a01b03851690631376f3da90604401608060405180830381865afa1580156105bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e3919061179c565b905061061d8160400151876105f89190611755565b8260200151610607919061180e565b825161061391906118ac565b600f0b6000610df2565b979650505050505050565b66071afd498d0008546001600160a01b03163314610648576106486118fc565b610650610e08565b565b610650610737565b600062093a8061066a81426116cd565b61067491906116ef565b905090565b60008062093a808060045461068e91906116cd565b61069891906116ef565b66038d7ea4c68005549091506104de9084906001600160a01b031683611065565b66038d7ea4c680088166038d7ea4c6800081106106d557600080fd5b0154905081565b60058166038d7ea4c6800081106106d557600080fd5b66071afd498d0008546001600160a01b0316331461070f57600080fd5b66071afd498d000880546001600160a01b0319166001600160a01b0392909216919091179055565b66038d7ea4c68005546001546001600160a01b0390911690600062093a8061075f81426116cd565b61076991906116ef565b9050826001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156107a657600080fd5b505af11580156107ba573d6000803e3d6000fd5b5050505060005b60148110156108d2578183116108d25760006107dd8585611402565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0387169063d1febfb990602401608060405180830381865afa158015610828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084c919061179c565b90506000816040015186111561086e57604082015161086b9087611755565b90505b61088d818360200151610881919061180e565b835161061391906118ac565b66038d7ea4c680088766038d7ea4c6800081106108ac576108ac61170e565b01555050506108be62093a8084611724565b9250806108ca8161173c565b9150506107c1565b505060015550565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa158015610928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094c919061176c565b600080549192508290036109675760009450505050506104de565b600088815260026020526040812054908190036109915761098a888a8486610cfe565b94506109a3565b60008981526003602052604090205494505b846000036109b057600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa1580156109ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a23919061179c565b905081600003610a685762093a8080600162093a808460400151610a479190611724565b610a519190611755565b610a5b91906116cd565b610a6591906116ef565b91505b6004548210610a8057600096505050505050506104de565b82821015610a8c578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b6032811015610c735789841015610c735782604001518410158015610ad65750858811155b15610b9c57610ae6600189611724565b975082915085881115610b255760405180608001604052806000600f0b81526020016000600f0b81526020016000815260200160008152509250610c61565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b95919061179c565b9250610c61565b6000826040015185610bae9190611755565b90506000610bd1846020015183610bc5919061180e565b855161061391906118ac565b905080158015610be05750878a115b15610bec575050610c73565b8015610c4f5766038d7ea4c680088666038d7ea4c680008110610c1157610c1161170e565b015460058766038d7ea4c680008110610c2c57610c2c61170e565b0154610c3890836116ef565b610c4291906116cd565b610c4c908a611724565b98505b610c5c62093a8087611724565b955050505b80610c6b8161173c565b915050610ab1565b50610c8885610c8360018a611755565b611557565b60008c8152600360209081526040808320849055600282529182902086905581518e8152908101899052908101829052606081018790529097507fcae2990aa9af8eb1c64713b7eddb3a80bf18e49a94a13fe0d0002b5d61d58f009060800160405180910390a150939998505050505050505050565b60008082815b6080811015610de65781831015610de65760006002610d238486611724565b610d2e906002611724565b610d3891906116cd565b6040516309bb79ed60e11b8152600481018a9052602481018290529091506000906001600160a01b038b1690631376f3da90604401608060405180830381865afa158015610d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dae919061179c565b905087816040015111610dc357819450610dd1565b610dce600183611755565b93505b50508080610dde9061173c565b915050610d04565b50909695505050505050565b6000818311610e0157816104de565b5090919050565b66038d7ea4c68006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b919061176c565b9050600066038d7ea4c680075482610e939190611755565b66038d7ea4c680078390556004549091506000610eb08242611755565b426004559050600062093a80610ec681856116cd565b610ed091906116ef565b90506000805b601481101561102357610eec62093a8084611724565b915081421015610f755783158015610f0357508442145b15610f3d578560058466038d7ea4c680008110610f2257610f2261170e565b016000828254610f329190611724565b909155506110239050565b83610f488642611755565b610f5290886116ef565b610f5c91906116cd565b60058466038d7ea4c680008110610f2257610f2261170e565b83158015610f8257508482145b15610fbc578560058466038d7ea4c680008110610fa157610fa161170e565b016000828254610fb19190611724565b9091555061100a9050565b83610fc78684611755565b610fd190886116ef565b610fdb91906116cd565b60058466038d7ea4c680008110610ff457610ff461170e565b0160008282546110049190611724565b90915550505b819450819250808061101b9061173c565b915050610ed6565b5060408051428152602081018790527fce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6910160405180910390a1505050505050565b60405163391044d760e21b8152600481018490526000908190819081906001600160a01b0387169063e441135c90602401602060405180830381865afa1580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061176c565b600080549192508290036110f25760009450505050506104de565b6000888152600260205260408120549081900361111c57611115888a8486610cfe565b945061112e565b60008981526003602052604090205494505b8460000361113b57600194505b6040516309bb79ed60e11b8152600481018a9052602481018690526000906001600160a01b038a1690631376f3da90604401608060405180830381865afa15801561118a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae919061179c565b9050816000036111f35762093a8080600162093a8084604001516111d29190611724565b6111dc9190611755565b6111e691906116cd565b6111f091906116ef565b91505b600454821061120b57600096505050505050506104de565b82821015611217578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b60328110156113f257898410156113f257826040015184101580156112615750858811155b1561132757611271600189611724565b9750829150858811156112b05760405180608001604052806000600f0b81526020016000600f0b815260200160008152602001600081525092506113e0565b6040516309bb79ed60e11b8152600481018d9052602481018990526001600160a01b038c1690631376f3da90604401608060405180830381865afa1580156112fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611320919061179c565b92506113e0565b60008260400151856113399190611755565b90506000611350846020015183610bc5919061180e565b90508015801561135f5750878a115b1561136b5750506113f2565b80156113ce5766038d7ea4c680088666038d7ea4c6800081106113905761139061170e565b015460058766038d7ea4c6800081106113ab576113ab61170e565b01546113b790836116ef565b6113c191906116cd565b6113cb908a611724565b98505b6113db62093a8087611724565b955050505b806113ea8161173c565b91505061123c565b50949a9950505050505050505050565b600080600090506000846001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146d919061176c565b905060005b608081101561154d578183101561154d57600060026114918486611724565b61149c906002611724565b6114a691906116cd565b60405163d1febfb960e01b8152600481018290529091506000906001600160a01b0389169063d1febfb990602401608060405180830381865afa1580156114f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611515919061179c565b90508681604001511161152a57819450611538565b611535600183611755565b93505b505080806115459061173c565b915050611472565b5090949350505050565b6000818310610e0157816104de565b60006020828403121561157857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156115be576115be61157f565b604052919050565b600060208083850312156115d957600080fd5b823567ffffffffffffffff808211156115f157600080fd5b818501915085601f83011261160557600080fd5b8135818111156116175761161761157f565b8060051b9150611628848301611595565b818152918301840191848101908884111561164257600080fd5b938501935b8385101561166057843582529385019390850190611647565b98975050505050505050565b6000806040838503121561167f57600080fd5b50508035926020909101359150565b6000602082840312156116a057600080fd5b81356001600160a01b03811681146104de57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000826116ea57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611709576117096116b7565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115611737576117376116b7565b500190565b60006001820161174e5761174e6116b7565b5060010190565b600082821015611767576117676116b7565b500390565b60006020828403121561177e57600080fd5b5051919050565b8051600f81900b811461179757600080fd5b919050565b6000608082840312156117ae57600080fd5b6040516080810181811067ffffffffffffffff821117156117d1576117d161157f565b6040526117dd83611785565b81526117eb60208401611785565b602082015260408301516040820152606083015160608201528091505092915050565b600081600f0b83600f0b60016001607f1b0360008213600084138383048511828216161561183e5761183e6116b7565b6f7fffffffffffffffffffffffffffffff19600085128281168783058712161561186a5761186a6116b7565b60008712925085820587128484161615611886576118866116b7565b8585058712818416161561189c5761189c6116b7565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156118d7576118d76116b7565b8160016001607f1b030183138116156118f2576118f26116b7565b5090039392505050565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220df39fa4149f6a026a6d05b7f018116456ad78482d46afe7b6da486093c631dbd64736f6c634300080d0033

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

00000000000000000000000091f85d68b413de823684c891db515b0390a02512

-----Decoded View---------------
Arg [0] : _voting_escrow (address): 0x91F85d68B413dE823684c891db515B0390a02512

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000091f85d68b413de823684c891db515b0390a02512


Deployed ByteCode Sourcemap

15431:11456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15764:23;;;;;;;;;160:25:1;;;148:2;133:18;15764:23:0;;;;;;;;15844:42;;;;;;:::i;:::-;;;;;;;;;;;;;;25869:826;;;;;;:::i;:::-;;:::i;:::-;;;1909:14:1;;1902:22;1884:41;;1872:2;1857:18;25869:826:0;1744:187:1;16045:30:0;;;;;;25363:498;;;;;;:::i;:::-;;:::i;15794:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19308:492;;;;;;:::i;:::-;;:::i;15895:27::-;;;;;;18015:117;;;:::i;:::-;;15735:22;;;;;;20621:89;;;:::i;16589:105::-;;;:::i;16132:24::-;;;;;-1:-1:-1;;;;;16132:24:0;;;;;;-1:-1:-1;;;;;2353:32:1;;;2335:51;;2323:2;2308:18;16132:24:0;2189:203:1;25149:206:0;;;;;;:::i;:::-;;:::i;16084:39::-;;;;;;:::i;:::-;;:::i;15983:28::-;;;;;-1:-1:-1;;;;;15983:28:0;;;15929:45;;;;;;:::i;:::-;;:::i;26749:135::-;;;;;;:::i;:::-;;:::i;16018:20::-;;;;;-1:-1:-1;;;;;16018:20:0;;;25869:826;25932:4;25972:11;;25953:15;:30;25949:62;;25985:26;:24;:26::i;:::-;26046:15;;15717:9;26091:23;15717:9;26046:15;26091:23;:::i;:::-;:30;;;;:::i;:::-;26157:13;;26072:49;;-1:-1:-1;;;;;;26157:13:0;26132:22;;26208:376;26229:9;:16;26225:1;:20;26208:376;;;26267:13;26283:9;26293:1;26283:12;;;;;;;;:::i;:::-;;;;;;;26267:28;;26314:8;26326:1;26314:13;26310:24;;26329:5;;;26310:24;26349:11;26363:50;26370:8;26380:14;26396:16;26363:6;:50::i;:::-;26349:64;-1:-1:-1;26432:11:0;;26428:145;;26464:59;;-1:-1:-1;;;26464:59:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;-1:-1:-1;;;;;26464:41:0;;;;;3494:18:1;;26464:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26551:6;26542:15;;;;;:::i;:::-;;;26428:145;26252:332;;26247:3;;;;;:::i;:::-;;;;26208:376;;;-1:-1:-1;26598:10:0;;26594:70;;26647:5;26625:18;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;26594:70:0;-1:-1:-1;26683:4:0;;25869:826;-1:-1:-1;;;;25869:826:0:o;25363:498::-;25411:4;25451:11;;25432:15;:30;25428:62;;25464:26;:24;:26::i;:::-;25525:15;;15717:9;25570:23;15717:9;25525:15;25570:23;:::i;:::-;:30;;;;:::i;:::-;25642:13;;25551:49;;-1:-1:-1;25611:11:0;;25625:49;;25632:8;;-1:-1:-1;;;;;25642:13:0;25551:49;25625:6;:49::i;:::-;25611:63;-1:-1:-1;25689:11:0;;25685:145;;25731:13;;25717:58;;-1:-1:-1;;;25717:58:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;-1:-1:-1;;;;;25731:13:0;;;;25717:40;;3494:18:1;;25717:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25812:6;25790:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;25685:145:0;25847:6;25363:498;-1:-1:-1;;;25363:498:0:o;19308:492::-;19412:13;;19458:44;;-1:-1:-1;;;19458:44:0;;;;;160:25:1;;;19382:4:0;;-1:-1:-1;;;;;19412:13:0;;19382:4;;19412:13;;19458:34;;133:18:1;;19458:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19436:66;;19513:10;19526:68;19553:2;19557:8;19567:10;19579:14;19526:26;:68::i;:::-;19637:53;;-1:-1:-1;;;19637:53:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;19513:81:0;;-1:-1:-1;19605:29:0;;-1:-1:-1;;;;;19637:36:0;;;;;3494:18:1;;19637:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19605:85;;19708:84;19778:2;:5;;;19765:10;:18;;;;:::i;:::-;19739:2;:8;;;:47;;;;:::i;:::-;19729:7;;:57;;;;:::i;:::-;19722:65;;19790:1;19708:8;:84::i;:::-;19701:91;19308:492;-1:-1:-1;;;;;;;19308:492:0:o;18015:117::-;18084:9;;-1:-1:-1;;;;;18084:9:0;18070:10;:23;18063:31;;;;:::i;:::-;18105:19;:17;:19::i;:::-;18015:117::o;20621:89::-;20676:26;:24;:26::i;16589:105::-;16633:4;15717:9;16657:22;15717:9;16657:15;:22;:::i;:::-;:29;;;;:::i;:::-;16650:36;;16589:105;:::o;25149:206::-;25206:4;25223:21;15717:9;;25247:15;;:22;;;;:::i;:::-;:29;;;;:::i;:::-;25315:13;;25223:53;;-1:-1:-1;25294:53:0;;25305:8;;-1:-1:-1;;;;;25315:13:0;25223:53;25294:10;:53::i;16084:39::-;;;;;;;;;;;;;;;-1:-1:-1;16084:39:0;:::o;15929:45::-;;;;;;;;;;;26749:135;26833:9;;-1:-1:-1;;;;;26833:9:0;26819:10;:23;26811:32;;;;;;26854:9;:22;;-1:-1:-1;;;;;;26854:22:0;-1:-1:-1;;;;;26854:22:0;;;;;;;;;;26749:135::o;19808:805::-;19877:13;;;19910:11;-1:-1:-1;;;;;19877:13:0;;;;19864:10;15717:9;19957:22;15717:9;19957:15;:22;:::i;:::-;:29;;;;:::i;:::-;19932:54;;20011:2;-1:-1:-1;;;;;19997:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20045:6;20040:540;20061:2;20057:1;:6;20040:540;;;20093:17;20089:1;:21;20131:5;20085:460;20177:10;20190:28;20212:2;20216:1;20190:21;:28::i;:::-;20269:38;;-1:-1:-1;;;20269:38:0;;;;;160:25:1;;;20177:41:0;;-1:-1:-1;20237:29:0;;-1:-1:-1;;;;;20269:31:0;;;;;133:18:1;;20269:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20237:70;;20326:9;20366:2;:5;;;20362:1;:9;20358:88;;;20419:5;;;;20415:9;;:1;:9;:::i;:::-;20396:30;;20358:88;20479:50;20521:2;20510;:8;;;:13;;;;:::i;:::-;20500:7;;:23;;;;:::i;20479:50::-;20464:9;20474:1;20464:12;;;;;;;:::i;:::-;;:65;-1:-1:-1;;;20559:9:0;15717;20559;;:::i;:::-;;-1:-1:-1;20065:3:0;;;;:::i;:::-;;;;20040:540;;;-1:-1:-1;;20590:11:0;:15;-1:-1:-1;19808:805:0:o;20718:2323::-;20906:44;;-1:-1:-1;;;20906:44:0;;;;;160:25:1;;;20802:4:0;;;;;;;;-1:-1:-1;;;;;20906:34:0;;;;;133:18:1;;20906:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20961:16;20980:10;;20884:66;;-1:-1:-1;21007:19:0;;;21003:33;;21035:1;21028:8;;;;;;;;21003:33;21049:16;21068:24;;;:14;:24;;;;;;;21107:16;;;21103:200;;21153:69;21180:2;21184:8;21194:11;21207:14;21153:26;:69::i;:::-;21140:82;;21103:200;;;21268:23;;;;:13;:23;;;;;;;-1:-1:-1;21103:200:0;21319:10;21333:1;21319:15;21315:35;;21349:1;21336:14;;21315:35;21403:58;;-1:-1:-1;;;21403:58:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;21363:37:0;;-1:-1:-1;;;;;21403:36:0;;;;;3494:18:1;;21403:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21363:98;;21478:11;21493:1;21478:16;21474:76;;15717:9;;21534:1;15717:9;21511:10;:13;;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;21510:33;;;;:::i;:::-;:40;;;;:::i;:::-;21496:54;;21474:76;21580:15;;21565:11;:30;21561:44;;21604:1;21597:8;;;;;;;;;;21561:44;21634:11;21620;:25;21616:56;;;21661:11;21647:25;;21616:56;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21739:1022:0;21760:2;21756:1;:6;21739:1022;;;21803:16;21788:11;:31;21784:42;21821:5;21784:42;21862:10;:13;;;21847:11;:28;;:60;;;;;21893:14;21879:10;:28;;21847:60;21843:907;;;21928:15;21942:1;21928:15;;:::i;:::-;;;21979:10;21962:27;;22025:14;22012:10;:27;22008:237;;;22077:28;;;;;;;;22097:1;22077:28;;;;;;22099:1;22077:28;;;;;;22101:1;22077:28;;;;22103:1;22077:28;;;22064:41;;21843:907;;22008:237;22167:58;;-1:-1:-1;;;22167:58:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;-1:-1:-1;;;;;22167:36:0;;;;;3494:18:1;;22167:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22154:71;;21843:907;;;22285:9;22325:14;:17;;;22311:11;:31;;;;:::i;:::-;22285:59;;22363:15;22381:74;22429:14;:20;;;22424:2;:25;;;;:::i;:::-;22402:19;;:47;;;;:::i;22381:74::-;22363:92;-1:-1:-1;22478:15:0;;:46;;;;;22510:14;22497:10;:27;22478:46;22474:57;;;22526:5;;;;22474:57;22554:15;;22550:147;;22655:9;22665:11;22655:22;;;;;;;:::i;:::-;;;22624:15;22640:11;22624:28;;;;;;;:::i;:::-;;;22611:41;;:10;:41;:::i;:::-;:66;;;;:::i;:::-;22594:83;;;;:::i;:::-;;;22550:147;22715:19;15717:9;22715:19;;:::i;:::-;;;22266:484;;21843:907;21764:3;;;;:::i;:::-;;;;21739:1022;;;-1:-1:-1;22786:40:0;22795:14;22811;22824:1;22811:10;:14;:::i;:::-;22786:8;:40::i;:::-;22837:23;;;;:13;:23;;;;;;;;:36;;;22884:14;:24;;;;;;:38;;;22940:60;;6501:25:1;;;6542:18;;;6535:34;;;6585:18;;;6578:34;;;6643:2;6628:18;;6621:34;;;22837:36:0;;-1:-1:-1;22940:60:0;;6488:3:1;6473:19;22940:60:0;;;;;;;-1:-1:-1;23020:13:0;;20718:2323;-1:-1:-1;;;;;;;;;20718:2323:0:o;18703:597::-;18826:4;;18879:14;18826:4;18904:367;18925:3;18921:1;:7;18904:367;;;18962:4;18954;:12;18950:23;18968:5;18950:23;18988:9;19020:1;19001:11;19008:4;19001;:11;:::i;:::-;:15;;19015:1;19001:15;:::i;:::-;19000:21;;;;:::i;:::-;19068:51;;-1:-1:-1;;;19068:51:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;18988:33:0;;-1:-1:-1;19036:29:0;;-1:-1:-1;;;;;19068:36:0;;;;;3494:18:1;;19068:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19036:83;;19147:10;19138:2;:5;;;:19;19134:126;;19185:4;19178:11;;19134:126;;;19237:7;19243:1;19237:4;:7;:::i;:::-;19230:14;;19134:126;18935:336;;18930:3;;;;;:::i;:::-;;;;18904:367;;;-1:-1:-1;19288:4:0;;18703:597;-1:-1:-1;;;;;;18703:597:0:o;437:106::-;495:7;526:1;522;:5;:13;;534:1;522:13;;;-1:-1:-1;530:1:0;;515:20;-1:-1:-1;437:106:0:o;16702:1305::-;16779:5;;16772:38;;-1:-1:-1;;;16772:38:0;;16804:4;16772:38;;;2335:51:1;16751:18:0;;-1:-1:-1;;;;;16779:5:0;;16772:23;;2308:18:1;;16772:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16751:59;;16821:18;16858;;16842:13;:34;;;;:::i;:::-;16887:18;:34;;;16943:15;;16821:55;;-1:-1:-1;16934:6:0;16987:19;16943:15;16987;:19;:::i;:::-;17035:15;17017;:33;16969:37;-1:-1:-1;17061:14:0;15717:9;17078:8;15717:9;17078:1;:8;:::i;:::-;:15;;;;:::i;:::-;17061:32;;17104:14;17140:6;17135:802;17156:2;17152:1;:6;17135:802;;;17192:16;15717:9;17192;:16;:::i;:::-;17180:28;;17245:9;17227:15;:27;17223:639;;;17279:15;;:39;;;;;17317:1;17298:15;:20;17279:39;17275:260;;;17373:13;17343:15;17359:9;17343:26;;;;;;;:::i;:::-;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;17553:5:0;;-1:-1:-1;17553:5:0;17275:260;17505:10;17482:19;17500:1;17482:15;:19;:::i;:::-;17465:37;;:13;:37;:::i;:::-;:50;;;;:::i;:::-;17435:15;17451:9;17435:26;;;;;;;:::i;17223:639::-;17603:15;;:33;;;;;17635:1;17622:9;:14;17603:33;17599:248;;;17691:13;17661:15;17677:9;17661:26;;;;;;;:::i;:::-;;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;17599:248:0;;-1:-1:-1;17599:248:0;;17817:10;17800:13;17812:1;17800:9;:13;:::i;:::-;17783:31;;:13;:31;:::i;:::-;:44;;;;:::i;:::-;17753:15;17769:9;17753:26;;;;;;;:::i;:::-;;;:74;;;;;;;:::i;:::-;;;;-1:-1:-1;;17599:248:0;17880:9;17876:13;;17916:9;17904:21;;17160:3;;;;;:::i;:::-;;;;17135:802;;;-1:-1:-1;17952:47:0;;;17968:15;3521:25:1;;3577:2;3562:18;;3555:34;;;17952:47:0;;3494:18:1;17952:47:0;;;;;;;16740:1267;;;;;;16702:1305::o;23049:2092::-;23246:44;;-1:-1:-1;;;23246:44:0;;;;;160:25:1;;;23142:4:0;;;;;;;;-1:-1:-1;;;;;23246:34:0;;;;;133:18:1;;23246:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23301:16;23320:10;;23224:66;;-1:-1:-1;23347:19:0;;;23343:33;;23375:1;23368:8;;;;;;;;23343:33;23389:16;23408:24;;;:14;:24;;;;;;;23447:16;;;23443:200;;23493:69;23520:2;23524:8;23534:11;23547:14;23493:26;:69::i;:::-;23480:82;;23443:200;;;23608:23;;;;:13;:23;;;;;;;-1:-1:-1;23443:200:0;23659:10;23673:1;23659:15;23655:35;;23689:1;23676:14;;23655:35;23743:58;;-1:-1:-1;;;23743:58:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;23703:37:0;;-1:-1:-1;;;;;23743:36:0;;;;;3494:18:1;;23743:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23703:98;;23818:11;23833:1;23818:16;23814:76;;15717:9;;23874:1;15717:9;23851:10;:13;;;:20;;;;:::i;:::-;:24;;;;:::i;:::-;23850:33;;;;:::i;:::-;:40;;;;:::i;:::-;23836:54;;23814:76;23920:15;;23905:11;:30;23901:44;;23944:1;23937:8;;;;;;;;;;23901:44;23974:11;23960;:25;23956:56;;;24001:11;23987:25;;23956:56;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24079:1022:0;24100:2;24096:1;:6;24079:1022;;;24143:16;24128:11;:31;24124:42;24161:5;24124:42;24202:10;:13;;;24187:11;:28;;:60;;;;;24233:14;24219:10;:28;;24187:60;24183:907;;;24268:15;24282:1;24268:15;;:::i;:::-;;;24319:10;24302:27;;24365:14;24352:10;:27;24348:237;;;24417:28;;;;;;;;24437:1;24417:28;;;;;;24439:1;24417:28;;;;;;24441:1;24417:28;;;;24443:1;24417:28;;;24404:41;;24183:907;;24348:237;24507:58;;-1:-1:-1;;;24507:58:0;;;;;3521:25:1;;;3562:18;;;3555:34;;;-1:-1:-1;;;;;24507:36:0;;;;;3494:18:1;;24507:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24494:71;;24183:907;;;24625:9;24665:14;:17;;;24651:11;:31;;;;:::i;:::-;24625:59;;24703:15;24721:74;24769:14;:20;;;24764:2;:25;;;;:::i;24721:74::-;24703:92;-1:-1:-1;24818:15:0;;:46;;;;;24850:14;24837:10;:27;24818:46;24814:57;;;24866:5;;;;24814:57;24894:15;;24890:147;;24995:9;25005:11;24995:22;;;;;;;:::i;:::-;;;24964:15;24980:11;24964:28;;;;;;;:::i;:::-;;;24951:41;;:10;:41;:::i;:::-;:66;;;;:::i;:::-;24934:83;;;;:::i;:::-;;;24890:147;25055:19;15717:9;25055:19;;:::i;:::-;;;24606:484;;24183:907;24104:3;;;;:::i;:::-;;;;24079:1022;;;-1:-1:-1;25120:13:0;;23049:2092;-1:-1:-1;;;;;;;;;;23049:2092:0:o;18140:555::-;18223:4;18240:9;18252:1;18240:13;;18264:9;18290:2;-1:-1:-1;;;;;18276:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18264:37;;18317:6;18312:354;18333:3;18329:1;:7;18312:354;;;18370:4;18362;:12;18358:23;18376:5;18358:23;18396:9;18428:1;18409:11;18416:4;18409;:11;:::i;:::-;:15;;18423:1;18409:15;:::i;:::-;18408:21;;;;:::i;:::-;18476:37;;-1:-1:-1;;;18476:37:0;;;;;160:25:1;;;18396:33:0;;-1:-1:-1;18444:29:0;;-1:-1:-1;;;;;18476:31:0;;;;;133:18:1;;18476:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18444:69;;18541:10;18532:2;:5;;;:19;18528:127;;18579:4;18572:11;;18528:127;;;18631:8;18638:1;18631:4;:8;:::i;:::-;18624:15;;18528:127;18343:323;;18338:3;;;;;:::i;:::-;;;;18312:354;;;-1:-1:-1;18683:4:0;;18140:555;-1:-1:-1;;;;18140:555:0:o;619:106::-;677:7;708:1;704;:5;:13;;716:1;704:13;;196:180:1;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;381:127::-;442:10;437:3;433:20;430:1;423:31;473:4;470:1;463:15;497:4;494:1;487:15;513:275;584:2;578:9;649:2;630:13;;-1:-1:-1;;626:27:1;614:40;;684:18;669:34;;705:22;;;666:62;663:88;;;731:18;;:::i;:::-;767:2;760:22;513:275;;-1:-1:-1;513:275:1:o;793:946::-;877:6;908:2;951;939:9;930:7;926:23;922:32;919:52;;;967:1;964;957:12;919:52;1007:9;994:23;1036:18;1077:2;1069:6;1066:14;1063:34;;;1093:1;1090;1083:12;1063:34;1131:6;1120:9;1116:22;1106:32;;1176:7;1169:4;1165:2;1161:13;1157:27;1147:55;;1198:1;1195;1188:12;1147:55;1234:2;1221:16;1256:2;1252;1249:10;1246:36;;;1262:18;;:::i;:::-;1308:2;1305:1;1301:10;1291:20;;1331:28;1355:2;1351;1347:11;1331:28;:::i;:::-;1393:15;;;1463:11;;;1459:20;;;1424:12;;;;1491:19;;;1488:39;;;1523:1;1520;1513:12;1488:39;1547:11;;;;1567:142;1583:6;1578:3;1575:15;1567:142;;;1649:17;;1637:30;;1600:12;;;;1687;;;;1567:142;;;1728:5;793:946;-1:-1:-1;;;;;;;;793:946:1:o;1936:248::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;-1:-1:-1;;2104:23:1;;;2174:2;2159:18;;;2146:32;;-1:-1:-1;1936:248:1:o;2397:286::-;2456:6;2509:2;2497:9;2488:7;2484:23;2480:32;2477:52;;;2525:1;2522;2515:12;2477:52;2551:23;;-1:-1:-1;;;;;2603:31:1;;2593:42;;2583:70;;2649:1;2646;2639:12;2688:127;2749:10;2744:3;2740:20;2737:1;2730:31;2780:4;2777:1;2770:15;2804:4;2801:1;2794:15;2820:217;2860:1;2886;2876:132;;2930:10;2925:3;2921:20;2918:1;2911:31;2965:4;2962:1;2955:15;2993:4;2990:1;2983:15;2876:132;-1:-1:-1;3022:9:1;;2820:217::o;3042:168::-;3082:7;3148:1;3144;3140:6;3136:14;3133:1;3130:21;3125:1;3118:9;3111:17;3107:45;3104:71;;;3155:18;;:::i;:::-;-1:-1:-1;3195:9:1;;3042:168::o;3215:127::-;3276:10;3271:3;3267:20;3264:1;3257:31;3307:4;3304:1;3297:15;3331:4;3328:1;3321:15;3600:128;3640:3;3671:1;3667:6;3664:1;3661:13;3658:39;;;3677:18;;:::i;:::-;-1:-1:-1;3713:9:1;;3600:128::o;3733:135::-;3772:3;3793:17;;;3790:43;;3813:18;;:::i;:::-;-1:-1:-1;3860:1:1;3849:13;;3733:135::o;3873:125::-;3913:4;3941:1;3938;3935:8;3932:34;;;3946:18;;:::i;:::-;-1:-1:-1;3983:9:1;;3873:125::o;4003:184::-;4073:6;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;-1:-1:-1;4165:16:1;;4003:184;-1:-1:-1;4003:184:1:o;4192:166::-;4270:13;;4323:2;4312:21;;;4302:32;;4292:60;;4348:1;4345;4338:12;4292:60;4192:166;;;:::o;4363:664::-;4455:6;4508:3;4496:9;4487:7;4483:23;4479:33;4476:53;;;4525:1;4522;4515:12;4476:53;4558:2;4552:9;4600:3;4592:6;4588:16;4670:6;4658:10;4655:22;4634:18;4622:10;4619:34;4616:62;4613:88;;;4681:18;;:::i;:::-;4717:2;4710:22;4756:39;4785:9;4756:39;:::i;:::-;4748:6;4741:55;4829:48;4873:2;4862:9;4858:18;4829:48;:::i;:::-;4824:2;4816:6;4812:15;4805:73;4932:2;4921:9;4917:18;4911:25;4906:2;4898:6;4894:15;4887:50;4991:2;4980:9;4976:18;4970:25;4965:2;4957:6;4953:15;4946:50;5015:6;5005:16;;;4363:664;;;;:::o;5032:698::-;5071:7;5119:1;5115:2;5104:17;5156:1;5152:2;5141:17;-1:-1:-1;;;;;5239:1:1;5234:3;5230:11;5269:1;5264:3;5260:11;5316:3;5312:2;5308:12;5303:3;5300:21;5295:2;5291;5287:11;5283:39;5280:65;;;5325:18;;:::i;:::-;-1:-1:-1;;5431:1:1;5422:11;;5449;;;5471:13;;;5462:23;;5445:41;5442:67;;;5489:18;;:::i;:::-;5537:1;5532:3;5528:11;5518:21;;5586:3;5582:2;5577:13;5572:3;5568:23;5563:2;5559;5555:11;5551:41;5548:67;;;5595:18;;:::i;:::-;5662:3;5658:2;5653:13;5648:3;5644:23;5639:2;5635;5631:11;5627:41;5624:67;;;5671:18;;:::i;:::-;-1:-1:-1;;;5711:13:1;;;;;5032:698;-1:-1:-1;;;;;5032:698:1:o;5735:398::-;5774:4;5819:1;5815:2;5804:17;5856:1;5852:2;5841:17;5886:1;5881:3;5877:11;5970:3;-1:-1:-1;;;;;5929:39:1;5925:49;5920:3;5916:59;5911:2;5904:10;5900:76;5897:102;;;5979:18;;:::i;:::-;6068:3;-1:-1:-1;;;;;6028:44:1;6023:3;6019:54;6015:2;6011:63;6008:89;;;6077:18;;:::i;:::-;-1:-1:-1;6114:13:1;;;5735:398;-1:-1:-1;;;5735:398:1:o;6138:127::-;6199:10;6194:3;6190:20;6187:1;6180:31;6230:4;6227:1;6220:15;6254:4;6251:1;6244:15

Swarm Source

ipfs://df39fa4149f6a026a6d05b7f018116456ad78482d46afe7b6da486093c631dbd
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.