Contract 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd39 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xb568a1b5a3ebcc00d692a1441722c9d6ee4bc3c948a6ad5b47954797b6cc490bApprove384761662022-11-16 6:42:2011 days 9 hrs ago0xb93eb3494bd859eee47bde92c97b9dbf70d1469f IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00001848
0xc9a63394250e6fce7b438abf6650af6836edc02c5f9586a467685f2333172331Approve372893332022-11-11 18:30:1315 days 21 hrs ago0x291e4ebb46c04d87c2fb10582b20e9258a1a83f8 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00003608
0x6d9fa6b9e11faf1f6fd8706d89cdabaaace2c727a469912610c78ee78f53fbffApprove372209462022-11-11 13:16:2716 days 2 hrs ago0x4e81276e61db7fddd1001ebd6ecbfa28e06a2136 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.0000296
0xc866bd878f1b73b33740408d7dc09d4fae6e37276fc023ecf15c44fa5827dd05Approve367295162022-11-09 21:29:3617 days 18 hrs ago0x5c5abb7047b27c70abec5a840f3d0c4c7759ce8f IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00117865
0x92c241ef18552e87beb8bc80bb375e6921e6e2e6f3440db62fc88434c4d8b633Approve348159342022-11-02 23:08:2524 days 16 hrs ago0x68db64a8cc0aea50b479bdd5bc3b3dd5e5821ed4 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00007992
0x0e9dfa8a03c19e9f24fa9cfe8d4e9b3cd1573b8384837936579f5129d78289ecApprove334187602022-10-28 19:06:3129 days 20 hrs ago0x55a1438b4b666c4359909ac902c41be09c3b821a IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00003989
0xb8781168db1d4d48bdfe0e7fa55505f60422b77e585f50c65cc304d87b315cd2Approve323284162022-10-25 0:28:0633 days 15 hrs ago0x8879610b84998f8b564949b21effa51c25f92217 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00001712
0x43d83c25112162eccfc1ce9589ebd335469f346e881e7829c32b167482606c8fApprove314006932022-10-20 23:21:1137 days 16 hrs ago0xed320bf569e5f3c4e9313391708ddbfc58e296bb IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00003921
0xd7b5f7a4587b2ad8831900386ab4b43bdd99f6e6c8f20b5ecad5e931ef9ebe1aApprove295589242022-10-11 12:58:0947 days 2 hrs ago0x3ce8093e028c01073ceb8dc0a020950ae26dfe9a IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00008894
0xf511fce6d566ed903b3c7edafb0d7eb6527d0891714e0f68b047c23b1814702aApprove288784772022-10-07 11:37:1151 days 4 hrs ago0x75f1694a994c44e714bad6916ef9e223f288364e IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00000813
0x615dc6c4343df479300f9cdb5bbba6f5f6eb25193e91c90aabb72fbd291cd166Transfer288376832022-10-07 7:45:3351 days 8 hrs ago0xbb451b18617a9981b57040f8ab256c8bcd7ea813 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00001017
0x0f40ec2da994344b27eab75a43aa3bf12c14bf8a5d9229c1a65e77636d5b00e8Approve279278962022-10-02 7:30:4756 days 8 hrs ago0xc4fb550fa8f2a6e5178711e56d5b48dedf897e5e IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00000553
0xd6fea347d1846ce2bebbbca4db52b61f83ceaad33b035db38a71e02c8e1456aaApprove242547302022-09-12 13:06:3176 days 2 hrs ago0x01280480bf9fd7c5991c7d5b7ef829ce7878a315 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00002528
0xa0caae6515369e82399b377e836bdb9a3fed597bdccb12a33374efa476906b19Approve241223602022-09-11 17:14:4376 days 22 hrs ago0x3cfecad11f3de1c2d67ec6fdf7fecdc38676f2c7 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00004393
0x85c01ac54c38487cf716539d4664227c1baeaab2ffc71662c267c97f8d1a4bc4Approve231837902022-09-06 15:07:1282 days 42 mins ago0xdb34edc8c96608c64126600e0470d65173e9e741 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00040381
0xd770756c4692c619d578431ca01dd3b2daaa2cb2901b685c2d648486d9f0008bApprove212006612022-08-25 1:26:1394 days 14 hrs ago0xe4c5e7ea3d8da7607a50d74c11b0d318a2ac9af8 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000066110396 ETH
0x45f0e01f7fde7612c6e760c53428f60df54d532d6f40a13e2e9b6bff95145eb7Approve212006542022-08-25 1:25:3094 days 14 hrs ago0xe4c5e7ea3d8da7607a50d74c11b0d318a2ac9af8 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000066301366 ETH
0x4c6f4261cdb1eb5af3e7bdfbe094ea27bb45d6421e51c8291723e06ca6e9a3deApprove210095042022-08-23 1:28:3396 days 14 hrs ago0x64bac0fc115ef0bb3e49eacafe89a8404dbb4c8a IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000080190552 ETH
0xb457672ea237a47b374dc50da66697c44c312398d30e3ad5255edd8ab3711cc8Approve210059182022-08-23 0:22:0896 days 15 hrs ago0x64bbbec4730bfd30fc7476a0b353f49b108b44f2 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000080421746 ETH
0xfd41fd9afcd63ae75f0eafacf1adee6a7424cc64ecfb49940bb8526c76ac6953Approve200529952022-08-12 3:16:25107 days 12 hrs ago0x612a4ac9e66353a3b371d9917f88124713c6d054 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000109212723 ETH
0x2f94b43cddf3bfc672031997192c7140b526a227550736323cfba3d1b57cea6cApprove198765822022-08-10 4:48:21109 days 11 hrs ago0x88b503c81a4fb9c9c5464dd3c6835fc34b2cc85d IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000078699468 ETH
0xc789a7518f34dd2df62a1d030b36d0939b991eeb25aed6703e94dc37acf863b8Approve197232132022-08-08 14:05:42111 days 1 hr ago0xb5f9b11d7738d64f737964061f9827d701853629 IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000052666025 ETH
0x709e1d7657b015c16a0544062eec78bfa844d12eba942d56bbd891bffa49d307Approve195898512022-08-07 3:41:01112 days 12 hrs ago0xf7e997e44fb2072367e3589f4540cb14d8688f2e IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.00003399275 ETH
0xa2b57d33a7d5adf666c160839060f88944fd43f77d044531349299c2e1ef2357Approve192327502022-08-02 22:58:41116 days 16 hrs ago0xa9ad824b3e8a277edec5f21798341f51569cfe2f IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000073777717 ETH
0xd35e9d1dc9fbbdf7721ec2cea621ebec41d41b246b18b97aa9e9ed0decf45116Approve192310412022-08-02 22:13:19116 days 17 hrs ago0xa9ad824b3e8a277edec5f21798341f51569cfe2f IN  0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH0.000073991824 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc1d55690d2e185391f26d5943219dd413510ce217259552564743a3ec497b68c242969402022-09-12 19:14:0375 days 20 hrs ago 0x79224825adaa232b4d41249884f44b8d7bb7de13 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xc1d55690d2e185391f26d5943219dd413510ce217259552564743a3ec497b68c242969402022-09-12 19:14:0375 days 20 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x493acf6e15c6cbca992d2ef8682a111c8017bb599736c482fc243154acf77652239911032022-09-10 20:24:3777 days 19 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x2e600c36ac47b998237299c8da29f58401f735585883736c725fc7621903aa52239910352022-09-10 20:23:4877 days 19 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x0d8b1780740febd46dd129f7b3c5dc55ed1935d59674e1bb1ef99ded2def1b5a239909682022-09-10 20:23:0577 days 19 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xe99ff4a9b7c25ffd14fa74ef2921aa760d263ac79a0e2f16b9d4687b233d569b198766272022-08-10 4:49:22109 days 11 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xbe2992989f40a46372495eb362252fc6070c7638db3ea0cf4500aa9c978add08198765982022-08-10 4:49:05109 days 11 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x6062ad9ec6eb9ce90e853350edcebf20ca65dbf8fa6a57d6f69f889db2a9fb55198765112022-08-10 4:47:15109 days 11 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xa4cd4b5d50d4b36df08259f445750e6e0f6a8a5edb8a551bf56dac3038d15b5e133221292022-05-31 5:49:28180 days 9 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xfab13a9182c61b7a7beeb2bf27a2ff377197f8c90f782c9e5a98a05bff7b8208127176992022-05-22 14:58:59189 days 50 mins ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x410338af9dd1ee4853554714e91f19338df89ff21cde0d4cb6a8c57ce5351990119648352022-05-13 8:08:03198 days 7 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x410338af9dd1ee4853554714e91f19338df89ff21cde0d4cb6a8c57ce5351990119648352022-05-13 8:08:03198 days 7 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x410338af9dd1ee4853554714e91f19338df89ff21cde0d4cb6a8c57ce5351990119648352022-05-13 8:08:03198 days 7 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xd4f75b5ce52d0577b2d46da4c6720cc2ad8f836b6559bbedbf8234d4b04d5a39111305532022-05-03 22:07:58207 days 17 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xd4f75b5ce52d0577b2d46da4c6720cc2ad8f836b6559bbedbf8234d4b04d5a39111305532022-05-03 22:07:58207 days 17 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xd4f75b5ce52d0577b2d46da4c6720cc2ad8f836b6559bbedbf8234d4b04d5a39111305532022-05-03 22:07:58207 days 17 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x9a8bc8052d96b17acf4123e7d2032d476a14723d420d40488e663c404dc1f44f98279392022-04-15 3:00:47226 days 12 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x9a8bc8052d96b17acf4123e7d2032d476a14723d420d40488e663c404dc1f44f98279392022-04-15 3:00:47226 days 12 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x9a8bc8052d96b17acf4123e7d2032d476a14723d420d40488e663c404dc1f44f98279392022-04-15 3:00:47226 days 12 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xcb60fb899fd0f86039a8a76e2b75a9ee2eba3e8915f90b39c3c07ac5aed3a17e95676622022-04-09 22:28:24231 days 17 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xcb60fb899fd0f86039a8a76e2b75a9ee2eba3e8915f90b39c3c07ac5aed3a17e95676622022-04-09 22:28:24231 days 17 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0xcb60fb899fd0f86039a8a76e2b75a9ee2eba3e8915f90b39c3c07ac5aed3a17e95676622022-04-09 22:28:24231 days 17 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x6e14022dc458fd00c6fc60441ecde4102dac314feed9551c1c1a37d508a1c82495174482022-04-08 19:08:35232 days 20 hrs ago 0x06b4dfabaf0fb0cf813526572cc86b2695c9d050 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x6e14022dc458fd00c6fc60441ecde4102dac314feed9551c1c1a37d508a1c82495174482022-04-08 19:08:35232 days 20 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
0x6e14022dc458fd00c6fc60441ecde4102dac314feed9551c1c1a37d508a1c82495174482022-04-08 19:08:35232 days 20 hrs ago 0x6f66764ce2ab34dc7acfeb11e9e3a66d96129efe 0xc45c51d423f5e2ad2e946e45d9ec7dcf04f9bd390 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
sZ2O

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 1 : sZ2O.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    /*
     * Expects percentage to be trailed by 00,
    */
    function percentageAmount( uint256 total_, uint8 percentage_ ) internal pure returns ( uint256 percentAmount_ ) {
        return div( mul( total_, percentage_ ), 1000 );
    }

    /*
     * Expects percentage to be trailed by 00,
    */
    function substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns ( uint256 result_ ) {
        return sub( total_, div( mul( total_, percentageToSub_ ), 1000 ) );
    }

    function percentageOfTotal( uint256 part_, uint256 total_ ) internal pure returns ( uint256 percent_ ) {
        return div( mul(part_, 100) , total_ );
    }

    /**
     * Taken from Hypersonic https://github.com/M2629/HyperSonic/blob/main/Math.sol
     * @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, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }

    function quadraticPricing( uint256 payment_, uint256 multiplier_ ) internal pure returns (uint256) {
        return sqrrt( mul( multiplier_, payment_ ) );
    }

  function bondingCurve( uint256 supply_, uint256 multiplier_ ) internal pure returns (uint256) {
      return mul( multiplier_, supply_ );
  }
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    // function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
    //     require(address(this).balance >= value, "Address: insufficient balance for call");
    //     return _functionCallWithValue(target, data, value, errorMessage);
    // }
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

  /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function addressToString(address _address) internal pure returns(string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = '0';
        _addr[1] = 'x';

        for(uint256 i = 0; i < 20; i++) {
            _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);

    }
}

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);
}

abstract contract ERC20
  is 
    IERC20
  {

  using SafeMath for uint256;

  // TODO comment actual hash value.
  bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
  // Present in ERC777
  mapping (address => uint256) internal _balances;

  // Present in ERC777
  mapping (address => mapping (address => uint256)) internal _allowances;

  // Present in ERC777
  uint256 internal _totalSupply;

  // Present in ERC777
  string internal _name;
    
  // Present in ERC777
  string internal _symbol;
    
  // Present in ERC777
  uint8 internal _decimals;

  /**
   * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
   * a default value of 18.
   *
   * To select a different value for {decimals}, use {_setupDecimals}.
   *
   * All three of these values are immutable: they can only be set once during
   * construction.
   */
  constructor (string memory name_, string memory symbol_, uint8 decimals_) {
    _name = name_;
    _symbol = symbol_;
    _decimals = decimals_;
  }

  /**
   * @dev Returns the name of the token.
   */
  // Present in ERC777
  function name() public view returns (string memory) {
    return _name;
  }

  /**
   * @dev Returns the symbol of the token, usually a shorter version of the
   * name.
   */
  // Present in ERC777
  function symbol() public view returns (string memory) {
    return _symbol;
  }

  /**
   * @dev Returns the number of decimals used to get its user representation.
   * For example, if `decimals` equals `2`, a balance of `505` tokens should
   * be displayed to a user as `5,05` (`505 / 10 ** 2`).
   *
   * Tokens usually opt for a value of 18, imitating the relationship between
   * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
   * called.
   *
   * NOTE: This information is only used for _display_ purposes: it in
   * no way affects any of the arithmetic of the contract, including
   * {IERC20-balanceOf} and {IERC20-transfer}.
   */
  // Present in ERC777
  function decimals() public view returns (uint8) {
    return _decimals;
  }

  /**
   * @dev See {IERC20-totalSupply}.
   */
  // Present in ERC777
  function totalSupply() public view override returns (uint256) {
    return _totalSupply;
  }

  /**
   * @dev See {IERC20-balanceOf}.
   */
  // Present in ERC777
  function balanceOf(address account) public view virtual override returns (uint256) {
    return _balances[account];
  }

  /**
   * @dev See {IERC20-transfer}.
   *
   * Requirements:
   *
   * - `recipient` cannot be the zero address.
   * - the caller must have a balance of at least `amount`.
   */
  // Overrideen in ERC777
  // Confirm that this behavior changes 
  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(msg.sender, recipient, amount);
    return true;
  }

    /**
     * @dev See {IERC20-allowance}.
     */
    // Present in ERC777
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    // Present in ERC777
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    // Present in ERC777
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

  /**
   * @dev Moves tokens `amount` from `sender` to `recipient`.
   *
   * This is internal function is equivalent to {transfer}, and can be used to
   * e.g. implement automatic token fees, slashing mechanisms, etc.
   *
   * Emits a {Transfer} event.
   *
   * Requirements:
   *
   * - `sender` cannot be the zero address.
   * - `recipient` cannot be the zero address.
   * - `sender` must have a balance of at least `amount`.
   */
  function _transfer(address sender, address recipient, uint256 amount) internal virtual {
    require(sender != address(0), "ERC20: transfer from the zero address");
    require(recipient != address(0), "ERC20: transfer to the zero address");

    _beforeTokenTransfer(sender, recipient, amount);

    _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    // Present in ERC777
    function _mint(address account_, uint256 ammount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, ammount_);
        _totalSupply = _totalSupply.add(ammount_);
        _balances[account_] = _balances[account_].add(ammount_);
        emit Transfer(address( this ), account_, ammount_);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    // Present in ERC777
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    // Present in ERC777
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    // Considering deprication to reduce size of bytecode as changing _decimals to internal acheived the same functionality.
    // function _setupDecimals(uint8 decimals_) internal {
    //     _decimals = decimals_;
    // }

  /**
   * @dev Hook that is called before any transfer of tokens. This includes
   * minting and burning.
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
   * will be to transferred to `to`.
   * - when `from` is zero, `amount` tokens will be minted for `to`.
   * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
   * - `from` and `to` are never both zero.
   *
   * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
   */
  // Present in ERC777
  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

interface IERC2612Permit {
    /**
     * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
     * given `owner`'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current ERC2612 nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(abi.encode(
            keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
            keccak256(bytes(name())),
            keccak256(bytes("1")), // Version
            chainID,
            address(this)
        ));
    }

    /**
     * @dev See {IERC2612Permit-permit}.
     *
     */
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
            keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    /**
     * @dev See {IERC2612Permit-nonces}.
     */
    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

interface IOwnable {
  function manager() external view returns (address);

  function renounceManagement() external;
  
  function pushManagement( address newOwner_ ) external;
  
  function pullManagement() external;
}

contract Ownable is IOwnable {

    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPushed( address(0), _owner );
    }

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

    modifier onlyManager() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceManagement() public virtual override onlyManager() {
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyManager() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }
    
    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

contract sZ2O is ERC20Permit, Ownable {

    using SafeMath for uint256;

    modifier onlyStakingContract() {
        require( msg.sender == stakingContract );
        _;
    }

    address public stakingContract;
    address public initializer;

    event LogSupply(uint256 indexed epoch, uint256 timestamp, uint256 totalSupply );
    event LogRebase( uint256 indexed epoch, uint256 rebase, uint256 index );
    event LogStakingContractUpdated( address stakingContract );

    struct Rebase {
        uint epoch;
        uint rebase; // 18 decimals
        uint totalStakedBefore;
        uint totalStakedAfter;
        uint amountRebased;
        uint index;
        uint blockNumberOccured;
    }
    Rebase[] public rebases;

    uint public INDEX;

    uint256 private constant MAX_UINT256 = ~uint256(0);
    uint256 private constant INITIAL_FRAGMENTS_SUPPLY = 5000000 * 10**9;

    // TOTAL_GONS is a multiple of INITIAL_FRAGMENTS_SUPPLY so that _gonsPerFragment is an integer.
    // Use the highest value that fits in a uint256 for max granularity.
    uint256 private constant TOTAL_GONS = MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);

    // MAX_SUPPLY = maximum integer < (sqrt(4*TOTAL_GONS + 1) - 1) / 2
    uint256 private constant MAX_SUPPLY = ~uint128(0);  // (2^128) - 1

    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;

    mapping ( address => mapping ( address => uint256 ) ) private _allowedValue;

    constructor() ERC20("Staked ZeroTwOhm", "sZ2O", 9) ERC20Permit() {
        initializer = msg.sender;
        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        _gonsPerFragment = TOTAL_GONS.div(_totalSupply);
    }

    function initialize( address stakingContract_ ) external returns ( bool ) {
        require( msg.sender == initializer );
        require( stakingContract_ != address(0) );
        stakingContract = stakingContract_;
        _gonBalances[ stakingContract ] = TOTAL_GONS;

        emit Transfer( address(0x0), stakingContract, _totalSupply );
        emit LogStakingContractUpdated( stakingContract_ );
        
        initializer = address(0);
        return true;
    }

    function setIndex( uint _INDEX ) external onlyManager() returns ( bool ) {
        require( INDEX == 0 );
        INDEX = gonsForBalance( _INDEX );
        return true;
    }

    /**
        @notice increases sZ2O supply to increase staking balances relative to profit_
        @param profit_ uint256
        @return uint256
     */
    function rebase( uint256 profit_, uint epoch_ ) public onlyStakingContract() returns ( uint256 ) {
        uint256 rebaseAmount;
        uint256 circulatingSupply_ = circulatingSupply();

        if ( profit_ == 0 ) {
            emit LogSupply( epoch_, block.timestamp, _totalSupply );
            emit LogRebase( epoch_, 0, index() );
            return _totalSupply;
        } else if ( circulatingSupply_ > 0 ){
            rebaseAmount = profit_.mul( _totalSupply ).div( circulatingSupply_ );
        } else {
            rebaseAmount = profit_;
        }

        _totalSupply = _totalSupply.add( rebaseAmount );

        if ( _totalSupply > MAX_SUPPLY ) {
            _totalSupply = MAX_SUPPLY;
        }

        _gonsPerFragment = TOTAL_GONS.div( _totalSupply );

        _storeRebase( circulatingSupply_, profit_, epoch_ );

        return _totalSupply;
    }

    /**
        @notice emits event with data about rebase
        @param previousCirculating_ uint
        @param profit_ uint
        @param epoch_ uint
        @return bool
     */
    function _storeRebase( uint previousCirculating_, uint profit_, uint epoch_ ) internal returns ( bool ) {
        uint rebasePercent = profit_.mul( 1e18 ).div( previousCirculating_ );

        rebases.push( Rebase ( {
            epoch: epoch_,
            rebase: rebasePercent, // 18 decimals
            totalStakedBefore: previousCirculating_,
            totalStakedAfter: circulatingSupply(),
            amountRebased: profit_,
            index: index(),
            blockNumberOccured: block.number
        }));
        
        emit LogSupply( epoch_, block.timestamp, _totalSupply );
        emit LogRebase( epoch_, rebasePercent, index() );

        return true;
    }

    function balanceOf( address who ) public view override returns ( uint256 ) {
        return _gonBalances[ who ].div( _gonsPerFragment );
    }

    function gonsForBalance( uint amount ) public view returns ( uint ) {
        return amount.mul( _gonsPerFragment );
    }

    function balanceForGons( uint gons ) public view returns ( uint ) {
        return gons.div( _gonsPerFragment );
    }

    // Staking contract holds excess sOHM
    function circulatingSupply() public view returns ( uint ) {
        return _totalSupply.sub( balanceOf( stakingContract ) );
    }

    function index() public view returns ( uint ) {
        return balanceForGons( INDEX );
    }

    function transfer( address to, uint256 value ) public override returns (bool) {
        uint256 gonValue = value.mul( _gonsPerFragment );
        _gonBalances[ msg.sender ] = _gonBalances[ msg.sender ].sub( gonValue );
        _gonBalances[ to ] = _gonBalances[ to ].add( gonValue );
        emit Transfer( msg.sender, to, value );
        return true;
    }

    function allowance( address owner_, address spender ) public view override returns ( uint256 ) {
        return _allowedValue[ owner_ ][ spender ];
    }

    function transferFrom( address from, address to, uint256 value ) public override returns ( bool ) {
       _allowedValue[ from ][ msg.sender ] = _allowedValue[ from ][ msg.sender ].sub( value );
       emit Approval( from, msg.sender,  _allowedValue[ from ][ msg.sender ] );

        uint256 gonValue = gonsForBalance( value );
        _gonBalances[ from ] = _gonBalances[from].sub( gonValue );
        _gonBalances[ to ] = _gonBalances[to].add( gonValue );
        emit Transfer( from, to, value );

        return true;
    }

    function approve( address spender, uint256 value ) public override returns (bool) {
         _allowedValue[ msg.sender ][ spender ] = value;
         emit Approval( msg.sender, spender, value );
         return true;
    }

    // What gets called in a permit
    function _approve( address owner, address spender, uint256 value ) internal override virtual {
        _allowedValue[owner][spender] = value;
        emit Approval( owner, spender, value );
    }

    function increaseAllowance( address spender, uint256 addedValue ) public override returns (bool) {
        _allowedValue[ msg.sender ][ spender ] = _allowedValue[ msg.sender ][ spender ].add( addedValue );
        emit Approval( msg.sender, spender, _allowedValue[ msg.sender ][ spender ] );
        return true;
    }

    function decreaseAllowance( address spender, uint256 subtractedValue ) public override returns (bool) {
        uint256 oldValue = _allowedValue[ msg.sender ][ spender ];
        if (subtractedValue >= oldValue) {
            _allowedValue[ msg.sender ][ spender ] = 0;
        } else {
            _allowedValue[ msg.sender ][ spender ] = oldValue.sub( subtractedValue );
        }
        emit Approval( msg.sender, spender, _allowedValue[ msg.sender ][ spender ] );
        return true;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 100
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakingContract","type":"address"}],"name":"LogStakingContractUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INDEX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gons","type":"uint256"}],"name":"balanceForGons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"gonsForBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakingContract_","type":"address"}],"name":"initialize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profit_","type":"uint256"},{"internalType":"uint256","name":"epoch_","type":"uint256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rebases","outputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"rebase","type":"uint256"},{"internalType":"uint256","name":"totalStakedBefore","type":"uint256"},{"internalType":"uint256","name":"totalStakedAfter","type":"uint256"},{"internalType":"uint256","name":"amountRebased","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"blockNumberOccured","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_INDEX","type":"uint256"}],"name":"setIndex","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252601081526f5374616b6564205a65726f54774f686d60801b602080830191825283518085019094526004845263735a324f60e01b9084015281519192916009916200006a916003919062000367565b5081516200008090600490602085019062000367565b506005805460ff191660ff92909216919091179055504690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000c4620001d5565b805160209182012060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606084015260808301939093523060a0808401919091528351808403909101815260c0909201928390528151910120600755600880546001600160a01b0319163317908190556001600160a01b0316906000907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a3600b80546001600160a01b031916331790556611c37937e080006002819055620001cc908060001906600019036200026f60201b620012b51790919060201c565b600e5562000413565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015620002655780601f10620002395761010080835404028352916020019162000265565b820191906000526020600020905b8154815290600101906020018083116200024757829003601f168201915b5050505050905090565b6000620002b983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620002c060201b60201c565b9392505050565b60008183620003505760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000314578181015183820152602001620002fa565b50505050905090810190601f168015620003425780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200035d57fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200039f5760008555620003ea565b82601f10620003ba57805160ff1916838001178555620003ea565b82800160010185558215620003ea579182015b82811115620003ea578251825591602001919060010190620003cd565b50620003f8929150620003fc565b5090565b5b80821115620003f85760008155600101620003fd565b6117b380620004236000396000f3fe608060405234801561001057600080fd5b506004361061019a5760003560e01c8063481c6a75116100e457806395d89b411161009257806395d89b41146104955780639ce110d71461049d578063a457c2d7146104a5578063a9059cbb146104d1578063c4d66de8146104fd578063d505accf14610523578063dd62ed3e14610574578063ee99205c146105a25761019a565b8063481c6a75146103a35780635a96ac0a146103c757806370a08231146103cf57806373c69eb7146103f55780637965d56d1461044a5780637ecebe00146104675780639358928b1461048d5761019a565b80632986c0e51161014c5780632986c0e5146102f65780632df75cb1146102fe57806330adf81f14610306578063313ce5671461030e5780633644e5151461032c578063395093511461033457806340a5737f1461036057806346f68ee91461037d5761019a565b8063058ecdb41461019f57806306fdde03146101d4578063089208d814610251578063095ea7b31461025b57806318160ddd1461029b5780631bd39674146102a357806323b872dd146102c0575b600080fd5b6101c2600480360360408110156101b557600080fd5b50803590602001356105aa565b60408051918252519081900360200190f35b6101dc6106f4565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102165781810151838201526020016101fe565b50505050905090810190601f1680156102435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61025961078a565b005b6102876004803603604081101561027157600080fd5b506001600160a01b038135169060200135610821565b604080519115158252519081900360200190f35b6101c2610875565b6101c2600480360360208110156102b957600080fd5b503561087b565b610287600480360360608110156102d657600080fd5b506001600160a01b03813581169160208101359091169060400135610892565b6101c26109ba565b6101c26109cc565b6101c26109d2565b6103166109f6565b6040805160ff9092168252519081900360200190f35b6101c26109ff565b6102876004803603604081101561034a57600080fd5b506001600160a01b038135169060200135610a05565b6102876004803603602081101561037657600080fd5b5035610a86565b6102596004803603602081101561039357600080fd5b50356001600160a01b0316610af7565b6103ab610be5565b604080516001600160a01b039092168252519081900360200190f35b610259610bf4565b6101c2600480360360208110156103e557600080fd5b50356001600160a01b0316610ca0565b6104126004803603602081101561040b57600080fd5b5035610cc8565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6101c26004803603602081101561046057600080fd5b5035610d1a565b6101c26004803603602081101561047d57600080fd5b50356001600160a01b0316610d31565b6101c2610d52565b6101dc610d77565b6103ab610dd8565b610287600480360360408110156104bb57600080fd5b506001600160a01b038135169060200135610de7565b610287600480360360408110156104e757600080fd5b506001600160a01b038135169060200135610ebe565b6102876004803603602081101561051357600080fd5b50356001600160a01b0316610f6c565b610259600480360360e081101561053957600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611053565b6101c26004803603604081101561058a57600080fd5b506001600160a01b038135811691602001351661127b565b6103ab6112a6565b600a546000906001600160a01b031633146105c457600080fd5b6000806105cf610d52565b90508461066557600254604080514281526020810192909252805186927f917acfbe39be6509ccf7fecb66a7e42ce2be1083c2d7dd3b9b7491dabddb8da492908290030190a2837f6012dbce857565c4a40974aa5de8373a761fc429077ef0c8c8611d1e20d63fb260006106416109ba565b6040805192835260208301919091528051918290030190a2600254925050506106ee565b80156106915761068a81610684600254886112fe90919063ffffffff16565b906112b5565b9150610695565b8491505b6002546106a29083611357565b60028190556001600160801b0310156106c1576001600160801b036002555b6002546106d790660e3d2cfe61ffff19906112b5565b600e556106e58186866113b1565b50600254925050505b92915050565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107805780601f1061075557610100808354040283529160200191610780565b820191906000526020600020905b81548152906001019060200180831161076357829003601f168201915b5050505050905090565b6008546001600160a01b031633146107d7576040805162461bcd60e51b8152602060048201819052602482015260008051602061171e833981519152604482015290519081900360640190fd5b6008546040516000916001600160a01b0316907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600880546001600160a01b0319169055565b3360008181526010602090815260408083206001600160a01b0387168085529083528184208690558151868152915193949093909260008051602061175e833981519152928290030190a350600192915050565b60025490565b60006106ee600e54836112fe90919063ffffffff16565b6001600160a01b03831660009081526010602090815260408083203384529091528120546108c090836114f8565b6001600160a01b03851660008181526010602090815260408083203380855290835292819020859055805194855251919360008051602061175e833981519152929081900390910190a360006109158361087b565b6001600160a01b0386166000908152600f602052604090205490915061093b90826114f8565b6001600160a01b038087166000908152600f6020526040808220939093559086168152205461096a9082611357565b6001600160a01b038086166000818152600f6020908152604091829020949094558051878152905191939289169260008051602061173e83398151915292918290030190a3506001949350505050565b60006109c7600d54610d1a565b905090565b600d5481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b60075481565b3360009081526010602090815260408083206001600160a01b0386168452909152812054610a339083611357565b3360008181526010602090815260408083206001600160a01b03891680855290835292819020859055805194855251919360008051602061175e833981519152929081900390910190a350600192915050565b6008546000906001600160a01b03163314610ad6576040805162461bcd60e51b8152602060048201819052602482015260008051602061171e833981519152604482015290519081900360640190fd5b600d5415610ae357600080fd5b610aec8261087b565b600d55506001919050565b6008546001600160a01b03163314610b44576040805162461bcd60e51b8152602060048201819052602482015260008051602061171e833981519152604482015290519081900360640190fd5b6001600160a01b038116610b895760405162461bcd60e51b81526004018080602001828103825260268152602001806116946026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031690565b6009546001600160a01b03163314610c3d5760405162461bcd60e51b81526004018080602001828103825260228152602001806116ba6022913960400191505060405180910390fd5b6009546008546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3600954600880546001600160a01b0319166001600160a01b03909216919091179055565b600e546001600160a01b0382166000908152600f602052604081205490916106ee91906112b5565b600c8181548110610cd857600080fd5b90600052602060002090600702016000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60006106ee600e54836112b590919063ffffffff16565b6001600160a01b03811660009081526006602052604081206106ee9061153a565b600a546000906109c790610d6e906001600160a01b0316610ca0565b600254906114f8565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107805780601f1061075557610100808354040283529160200191610780565b600b546001600160a01b031681565b3360009081526010602090815260408083206001600160a01b0386168452909152812054808310610e3b573360009081526010602090815260408083206001600160a01b0388168452909152812055610e6a565b610e4581846114f8565b3360009081526010602090815260408083206001600160a01b03891684529091529020555b3360008181526010602090815260408083206001600160a01b03891680855290835292819020548151908152905192939260008051602061175e833981519152929181900390910190a35060019392505050565b600080610ed6600e54846112fe90919063ffffffff16565b336000908152600f6020526040902054909150610ef390826114f8565b336000908152600f6020526040808220929092556001600160a01b03861681522054610f1f9082611357565b6001600160a01b0385166000818152600f602090815260409182902093909355805186815290519192339260008051602061173e8339815191529281900390910190a35060019392505050565b600b546000906001600160a01b03163314610f8657600080fd5b6001600160a01b038216610f9957600080fd5b600a80546001600160a01b0319166001600160a01b038481169190911780835581166000908152600f60209081526040808320660e3d2cfe61ffff199055935460025485519081529451931693919260008051602061173e8339815191529281900390910190a3604080516001600160a01b038416815290517f817c653428858ed536dc085c5d8273734c517b55de44b55f5c5877a75e3373a19181900360200190a15050600b80546001600160a01b0319169055600190565b834211156110a3576040805162461bcd60e51b81526020600482015260186024820152775065726d69743a206578706972656420646561646c696e6560401b604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9908990899089906110ec9061153a565b604080516020808201979097526001600160a01b0395861681830152939094166060840152608083019190915260a082015260c08082018990528251808303909101815260e08201835280519084012060075461190160f01b610100840152610102830152610122808301829052835180840390910181526101428301808552815191860191909120600091829052610162840180865281905260ff8a166101828501526101a284018990526101c28401889052935191955092936001926101e280820193601f1981019281900390910190855afa1580156111d2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906112085750896001600160a01b0316816001600160a01b0316145b6112435760405162461bcd60e51b81526004018080602001828103825260218152602001806116dc6021913960400191505060405180910390fd5b6001600160a01b038a1660009081526006602052604090206112649061153e565b61126f8a8a8a611547565b50505050505050505050565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b600a546001600160a01b031681565b60006112f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611597565b9392505050565b60008261130d575060006106ee565b8282028284828161131a57fe5b04146112f75760405162461bcd60e51b81526004018080602001828103825260218152602001806116fd6021913960400191505060405180910390fd5b6000828201838110156112f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000806113ca8561068486670de0b6b3a76400006112fe565b9050600c6040518060e001604052808581526020018381526020018781526020016113f3610d52565b81526020018681526020016114066109ba565b81524360209182015282546001818101855560009485529382902083516007909202019081558282015193810193909355604080830151600280860191909155606084015160038601556080840151600486015560a0840151600586015560c0909301516006909401939093559054825142815291820152815185927f917acfbe39be6509ccf7fecb66a7e42ce2be1083c2d7dd3b9b7491dabddb8da4928290030190a2827f6012dbce857565c4a40974aa5de8373a761fc429077ef0c8c8611d1e20d63fb2826114d56109ba565b6040805192835260208301919091528051918290030190a2506001949350505050565b60006112f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611639565b5490565b80546001019055565b6001600160a01b038084166000818152601060209081526040808320948716808452948252918290208590558151858152915160008051602061175e8339815191529281900390910190a3505050565b600081836116235760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156115e85781810151838201526020016115d0565b50505050905090810190601f1680156116155780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161162f57fe5b0495945050505050565b6000818484111561168b5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156115e85781810151838201526020016115d0565b50505090039056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c5a65726f537761705065726d69743a20496e76616c6964207369676e6174757265536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212202178be40c7541ec7e4ea6706b9246f2f1fcd1b63723f0663346f612e2e257e9064736f6c63430007050033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.