Contract 0x0000000000000000000000000000000000001005 6

 
My Name Tag:
Not Available, login to update

ContractCreator:
GENESIS at txn GENESIS_0000000000000000000000000000000000001005
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x00870eb93c185eff04afc41319a72f1e8ee400d1171ef0a3c424df50d3081a1aClaim Relayer Re...112426982021-09-26 5:40:141 hr 6 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x7c4ea2142b0699a3094fa9b0b6e8466b6e20a90fad70fd5b44ebc9319b0e2f0eClaim Relayer Re...112410322021-09-26 4:16:152 hrs 30 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x43972ba6c93d19a5ca71173a202206f9995b38bb5b9ac03abfb83642cdbf71fcClaim Relayer Re...112398172021-09-26 3:15:133 hrs 31 mins ago0x8e22839bb1e34dbabfae9509b0a35d2a82a575d2 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x811a65264c5d2939d0f18b9751a86981a142e7e1a0d15ffe5a67e0204dbcaa4dClaim Relayer Re...112393332021-09-26 2:50:133 hrs 56 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xda75ed9f86d62698e7b436b8762111b75b8687e55ea26907f3cd55ea5f094732Claim Relayer Re...112384142021-09-26 2:04:134 hrs 42 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000108654122
0xfa22930618906b5186feda0a3e920c37534a7e8c47e5e73861f8a3b558638decClaim Relayer Re...112376952021-09-26 1:28:155 hrs 18 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x6b00d8ee3186a4fbad6f187ad445076bfb07b5332ad6ce560be00827bacd629eClaim Relayer Re...112364952021-09-26 0:28:146 hrs 18 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x259fc3b282fb4e1ce7d65bc6e043f345cf0be5a7fedec459c3d0f2c9c0a5aa15Claim Relayer Re...112348352021-09-25 23:05:127 hrs 41 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xa7bb3582093383cc70cf96c0453494817f2374c9454dd48071d38e79cb7640caClaim Relayer Re...112339152021-09-25 22:19:128 hrs 27 mins ago0x8e22839bb1e34dbabfae9509b0a35d2a82a575d2 IN  BSC: Relayer Incentivize0 BNB0.000108764736
0x8ffc117767b833a4048a2876520206f6c0f905c4cb482deaff94770ee5e4120eClaim Relayer Re...112335752021-09-25 22:02:128 hrs 44 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x841fc429b48cfb460bae8581ba2964207d1371e9b68577fa72792adeb51b9cabClaim Relayer Re...112329152021-09-25 21:29:129 hrs 17 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xc5034a2dbb236e8cb4e785dd420f3e1cd7284e14e8aa94ddec78148f59d8158aClaim Relayer Re...112323552021-09-25 21:01:129 hrs 45 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000111692533
0x05594447979dbd29100e97139c343b677443e323c5c21e5454ab0b0c4a71d765Claim Relayer Re...112313552021-09-25 20:11:1210 hrs 35 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000109456009
0x75bc324fd63b4138da947b230d3a1cbbb5a968ead73185ad302d4ec42e898eb7Claim Relayer Re...112302182021-09-25 19:14:1211 hrs 32 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000114185171
0x47a88332f1de6aa995a7f38fc7caed385be6536db21be90a2b24209cdd70316fClaim Relayer Re...112295982021-09-25 18:43:1212 hrs 3 mins ago0x8e22839bb1e34dbabfae9509b0a35d2a82a575d2 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xf8a92756dbca19732393f492963266bf9c342d5838d361cbca01a3840cd9c175Claim Relayer Re...112293582021-09-25 18:31:1212 hrs 15 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000111216692
0x233ed0f9d1c78ec420bcf6d06f80eab0d80d2dc317051bc6d3a9b159fa52016dClaim Relayer Re...112290082021-09-25 18:13:1212 hrs 33 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xeda2d627b6c4bb6aa1a5a0a49a12f56f3d6ae6aed3f58d8d749c5b13aa29365fClaim Relayer Re...112281902021-09-25 17:32:1213 hrs 14 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x82a0178583b944c8412e724eeccfa698b349b5affbeba6711dd495d32820c80cClaim Relayer Re...112270852021-09-25 16:36:1214 hrs 10 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x6c4d666e31785ba944d24ca9cc80140e9736216eefb95701361c107cf43ab1efClaim Relayer Re...112263322021-09-25 15:57:1114 hrs 49 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x8aded0a449660a9302df53eb2ddbafe8066854af4a7aad1f613001fa6959bd41Claim Relayer Re...112254532021-09-25 15:13:1315 hrs 33 mins ago0x8e22839bb1e34dbabfae9509b0a35d2a82a575d2 IN  BSC: Relayer Incentivize0 BNB0.000115495709
0xe2655e6e590dbaf39381f10460f1db3cdd9f8acee52a1c0d346df234ec788ac3Claim Relayer Re...112253132021-09-25 15:06:1315 hrs 40 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x19d50b74e6def4975b528dc95978b3ebeeec7b4f41608b0951ad1ff02e44ab68Claim Relayer Re...112252932021-09-25 15:05:1315 hrs 41 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xab2639d8979b2a16cf09bc4e66b9869bc5f6d7a8d8802627504928b2bdbd8f6aClaim Relayer Re...112244532021-09-25 14:23:1316 hrs 23 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x7bdcb37ffe22502d4382acf013a7a679c8badee0d9a62ada4a5e94023dcc51e7Claim Relayer Re...112232922021-09-25 13:23:1217 hrs 23 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x333d44b1bc3035c90537320b367373d3dc059573804bf93b2f19890f57406761112440022021-09-26 6:46:0645 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x333d44b1bc3035c90537320b367373d3dc059573804bf93b2f19890f57406761112440022021-09-26 6:46:0645 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xb0cd36c968e8b1e8f3640810aae1fb266f0206ee12552f46462301beeabc93b7112440012021-09-26 6:46:0348 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xb0cd36c968e8b1e8f3640810aae1fb266f0206ee12552f46462301beeabc93b7112440012021-09-26 6:46:0348 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x21c6fa285f46b3aaafeba32730ba913db136a0bd932d323610bd762d3b1c78eb112439982021-09-26 6:45:5457 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x21c6fa285f46b3aaafeba32730ba913db136a0bd932d323610bd762d3b1c78eb112439982021-09-26 6:45:5457 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xd5aab9d9a3469b933bf7dec3db9e0b3049e57f523c1b26b91759e2429055b57c112439982021-09-26 6:45:5457 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xd5aab9d9a3469b933bf7dec3db9e0b3049e57f523c1b26b91759e2429055b57c112439982021-09-26 6:45:5457 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xf68751f7e36f941c2dbfdea620e8a304c982fef1f749bb9b857fa4728a721352112439962021-09-26 6:45:481 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xf68751f7e36f941c2dbfdea620e8a304c982fef1f749bb9b857fa4728a721352112439962021-09-26 6:45:481 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xf4231d2141635b204e99599bab132220919cf571028b11f895fd03d4f1acab93112439942021-09-26 6:45:421 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xf4231d2141635b204e99599bab132220919cf571028b11f895fd03d4f1acab93112439942021-09-26 6:45:421 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x55d1d3cf532193a7e678077ab184de5ea52c5b01ae133b776eebef2ebdeba5dc112439942021-09-26 6:45:421 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x55d1d3cf532193a7e678077ab184de5ea52c5b01ae133b776eebef2ebdeba5dc112439942021-09-26 6:45:421 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x3e560a7777803bd32f9fc25be9bb491a50dc666c01de265087897ead1220c3a7112439872021-09-26 6:45:211 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x3e560a7777803bd32f9fc25be9bb491a50dc666c01de265087897ead1220c3a7112439872021-09-26 6:45:211 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xb21c3982ba79062e68949cfd62f2494e82292442478a5db3b2e7b8234449cbb8112439872021-09-26 6:45:211 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xb21c3982ba79062e68949cfd62f2494e82292442478a5db3b2e7b8234449cbb8112439872021-09-26 6:45:211 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x381bec6cec34ae0f5884d1783d5a7c476d9a2178a94e4c7a501a786c3080e339112439852021-09-26 6:45:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x381bec6cec34ae0f5884d1783d5a7c476d9a2178a94e4c7a501a786c3080e339112439852021-09-26 6:45:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xc192c9a8243d2b1d121df5567f9dead2dea69eb4016fce268e665718755d16b1112439852021-09-26 6:45:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xc192c9a8243d2b1d121df5567f9dead2dea69eb4016fce268e665718755d16b1112439852021-09-26 6:45:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xed94d7572194d76fd386723102a08cc6d56f66983529382748dc50f358008fe1112439832021-09-26 6:45:091 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xed94d7572194d76fd386723102a08cc6d56f66983529382748dc50f358008fe1112439832021-09-26 6:45:091 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x1a5b28cbbdc8ee51cce4032612427010760f600b3639b8ec450d873fbf2ad548112439832021-09-26 6:45:091 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RelayerIncentivize

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-01
*/

// File: contracts/interface/IRelayerIncentivize.sol

pragma solidity 0.6.4;

interface IRelayerIncentivize {

    function addReward(address payable headerRelayerAddr, address payable packageRelayer, uint256 amount, bool fromSystemReward) external returns (bool);

}

// File: contracts/interface/ISystemReward.sol

pragma solidity 0.6.4;

interface ISystemReward {
  function claimRewards(address payable to, uint256 amount) external returns(uint256 actualAmount);
}

// File: contracts/interface/IRelayerHub.sol

pragma solidity 0.6.4;

interface IRelayerHub {
  function isRelayer(address sender) external view returns (bool);
}

// File: contracts/interface/ILightClient.sol

pragma solidity 0.6.4;

interface ILightClient {

  function isHeaderSynced(uint64 height) external view returns (bool);

  function getAppHash(uint64 height) external view returns (bytes32);

  function getSubmitter(uint64 height) external view returns (address payable);

}

// File: contracts/System.sol

pragma solidity 0.6.4;




contract System {

  bool public alreadyInit;

  uint32 public constant CODE_OK = 0;
  uint32 public constant ERROR_FAIL_DECODE = 100;

  uint8 constant public BIND_CHANNELID = 0x01;
  uint8 constant public TRANSFER_IN_CHANNELID = 0x02;
  uint8 constant public TRANSFER_OUT_CHANNELID = 0x03;
  uint8 constant public STAKING_CHANNELID = 0x08;
  uint8 constant public GOV_CHANNELID = 0x09;
  uint8 constant public SLASH_CHANNELID = 0x0b;
  uint16 constant public bscChainID = 0x0038;

  address public constant VALIDATOR_CONTRACT_ADDR = 0x0000000000000000000000000000000000001000;
  address public constant SLASH_CONTRACT_ADDR = 0x0000000000000000000000000000000000001001;
  address public constant SYSTEM_REWARD_ADDR = 0x0000000000000000000000000000000000001002;
  address public constant LIGHT_CLIENT_ADDR = 0x0000000000000000000000000000000000001003;
  address public constant TOKEN_HUB_ADDR = 0x0000000000000000000000000000000000001004;
  address public constant INCENTIVIZE_ADDR=0x0000000000000000000000000000000000001005;
  address public constant RELAYERHUB_CONTRACT_ADDR = 0x0000000000000000000000000000000000001006;
  address public constant GOV_HUB_ADDR = 0x0000000000000000000000000000000000001007;
  address public constant TOKEN_MANAGER_ADDR = 0x0000000000000000000000000000000000001008;
  address public constant CROSS_CHAIN_CONTRACT_ADDR = 0x0000000000000000000000000000000000002000;


  modifier onlyCoinbase() {
    require(msg.sender == block.coinbase, "the message sender must be the block producer");
    _;
  }

  modifier onlyNotInit() {
    require(!alreadyInit, "the contract already init");
    _;
  }

  modifier onlyInit() {
    require(alreadyInit, "the contract not init yet");
    _;
  }

  modifier onlySlash() {
    require(msg.sender == SLASH_CONTRACT_ADDR, "the message sender must be slash contract");
    _;
  }

  modifier onlyTokenHub() {
    require(msg.sender == TOKEN_HUB_ADDR, "the message sender must be token hub contract");
    _;
  }

  modifier onlyGov() {
    require(msg.sender == GOV_HUB_ADDR, "the message sender must be governance contract");
    _;
  }

  modifier onlyValidatorContract() {
    require(msg.sender == VALIDATOR_CONTRACT_ADDR, "the message sender must be validatorSet contract");
    _;
  }

  modifier onlyCrossChainContract() {
    require(msg.sender == CROSS_CHAIN_CONTRACT_ADDR, "the message sender must be cross chain contract");
    _;
  }

  modifier onlyRelayerIncentivize() {
    require(msg.sender == INCENTIVIZE_ADDR, "the message sender must be incentivize contract");
    _;
  }

  modifier onlyRelayer() {
    require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).isRelayer(msg.sender), "the msg sender is not a relayer");
    _;
  }

  modifier onlyTokenManager() {
    require(msg.sender == TOKEN_MANAGER_ADDR, "the msg sender must be tokenManager");
    _;
  }

  // Not reliable, do not use when need strong verify
  function isContract(address addr) internal view returns (bool) {
    uint size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }
}

// File: contracts/lib/SafeMath.sol

pragma solidity 0.6.4;

/**
 * Copyright (c) 2016-2019 zOS Global Limited
 * @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) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }
}

// File: contracts/lib/Memory.sol

pragma solidity 0.6.4;

library Memory {

    // Size of a word, in bytes.
    uint internal constant WORD_SIZE = 32;
    // Size of the header of a 'bytes' array.
    uint internal constant BYTES_HEADER_SIZE = 32;
    // Address of the free memory pointer.
    uint internal constant FREE_MEM_PTR = 0x40;

    // Compares the 'len' bytes starting at address 'addr' in memory with the 'len'
    // bytes starting at 'addr2'.
    // Returns 'true' if the bytes are the same, otherwise 'false'.
    function equals(uint addr, uint addr2, uint len) internal pure returns (bool equal) {
        assembly {
            equal := eq(keccak256(addr, len), keccak256(addr2, len))
        }
    }

    // Compares the 'len' bytes starting at address 'addr' in memory with the bytes stored in
    // 'bts'. It is allowed to set 'len' to a lower value then 'bts.length', in which case only
    // the first 'len' bytes will be compared.
    // Requires that 'bts.length >= len'
    function equals(uint addr, uint len, bytes memory bts) internal pure returns (bool equal) {
        require(bts.length >= len);
        uint addr2;
        assembly {
            addr2 := add(bts, /*BYTES_HEADER_SIZE*/32)
        }
        return equals(addr, addr2, len);
    }

    function compareStrings(string memory a, string memory b) internal pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    // Copy 'len' bytes from memory address 'src', to address 'dest'.
    // This function does not check the or destination, it only copies
    // the bytes.
    function copy(uint src, uint dest, uint len) internal pure {
        // Copy word-length chunks while possible
        for (; len >= WORD_SIZE; len -= WORD_SIZE) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += WORD_SIZE;
            src += WORD_SIZE;
        }

        // Copy remaining bytes
        uint mask = 256 ** (WORD_SIZE - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    // Returns a memory pointer to the provided bytes array.
    function ptr(bytes memory bts) internal pure returns (uint addr) {
        assembly {
            addr := bts
        }
    }

    // Returns a memory pointer to the data portion of the provided bytes array.
    function dataPtr(bytes memory bts) internal pure returns (uint addr) {
        assembly {
            addr := add(bts, /*BYTES_HEADER_SIZE*/32)
        }
    }

    // This function does the same as 'dataPtr(bytes memory)', but will also return the
    // length of the provided bytes array.
    function fromBytes(bytes memory bts) internal pure returns (uint addr, uint len) {
        len = bts.length;
        assembly {
            addr := add(bts, /*BYTES_HEADER_SIZE*/32)
        }
    }

    // Creates a 'bytes memory' variable from the memory address 'addr', with the
    // length 'len'. The function will allocate new memory for the bytes array, and
    // the 'len bytes starting at 'addr' will be copied into that new memory.
    function toBytes(uint addr, uint len) internal pure returns (bytes memory bts) {
        bts = new bytes(len);
        uint btsptr;
        assembly {
            btsptr := add(bts, /*BYTES_HEADER_SIZE*/32)
        }
        copy(addr, btsptr, len);
    }

    // Get the word stored at memory address 'addr' as a 'uint'.
    function toUint(uint addr) internal pure returns (uint n) {
        assembly {
            n := mload(addr)
        }
    }

    // Get the word stored at memory address 'addr' as a 'bytes32'.
    function toBytes32(uint addr) internal pure returns (bytes32 bts) {
        assembly {
            bts := mload(addr)
        }
    }
}

// File: contracts/lib/BytesToTypes.sol

pragma solidity 0.6.4;

/**
 * @title BytesToTypes
 * Copyright (c) 2016-2020 zpouladzade/Seriality
 * @dev The BytesToTypes contract converts the memory byte arrays to the standard solidity types
 * @author [email protected]
 */

library BytesToTypes {
    

    function bytesToAddress(uint _offst, bytes memory _input) internal pure returns (address _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 
    
    function bytesToBool(uint _offst, bytes memory _input) internal pure returns (bool _output) {
        
        uint8 x;
        assembly {
            x := mload(add(_input, _offst))
        }
        x==0 ? _output = false : _output = true;
    }   
        
    function getStringSize(uint _offst, bytes memory _input) internal pure returns(uint size) {
        
        assembly{
            
            size := mload(add(_input,_offst))
            let chunk_count := add(div(size,32),1) // chunk_count = size/32 + 1
            
            if gt(mod(size,32),0) {// if size%32 > 0
                chunk_count := add(chunk_count,1)
            } 
            
             size := mul(chunk_count,32)// first 32 bytes reseves for size in strings
        }
    }

    function bytesToString(uint _offst, bytes memory _input, bytes memory _output) internal pure {

        uint size = 32;
        assembly {
            
            let chunk_count
            
            size := mload(add(_input,_offst))
            chunk_count := add(div(size,32),1) // chunk_count = size/32 + 1
            
            if gt(mod(size,32),0) {
                chunk_count := add(chunk_count,1)  // chunk_count++
            }
               
            for { let index:= 0 }  lt(index , chunk_count) { index := add(index,1) } {
                mstore(add(_output,mul(index,32)),mload(add(_input,_offst)))
                _offst := sub(_offst,32)           // _offst -= 32
            }
        }
    }

    function bytesToBytes32(uint _offst, bytes memory  _input, bytes32 _output) internal pure {
        
        assembly {
            mstore(_output , add(_input, _offst))
            mstore(add(_output,32) , add(add(_input, _offst),32))
        }
    }
    
    function bytesToInt8(uint _offst, bytes memory  _input) internal pure returns (int8 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }
    
    function bytesToInt16(uint _offst, bytes memory _input) internal pure returns (int16 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt24(uint _offst, bytes memory _input) internal pure returns (int24 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt32(uint _offst, bytes memory _input) internal pure returns (int32 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt40(uint _offst, bytes memory _input) internal pure returns (int40 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt48(uint _offst, bytes memory _input) internal pure returns (int48 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt56(uint _offst, bytes memory _input) internal pure returns (int56 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt64(uint _offst, bytes memory _input) internal pure returns (int64 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt72(uint _offst, bytes memory _input) internal pure returns (int72 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt80(uint _offst, bytes memory _input) internal pure returns (int80 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt88(uint _offst, bytes memory _input) internal pure returns (int88 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt96(uint _offst, bytes memory _input) internal pure returns (int96 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }
	
	function bytesToInt104(uint _offst, bytes memory _input) internal pure returns (int104 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }
    
    function bytesToInt112(uint _offst, bytes memory _input) internal pure returns (int112 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt120(uint _offst, bytes memory _input) internal pure returns (int120 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt128(uint _offst, bytes memory _input) internal pure returns (int128 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt136(uint _offst, bytes memory _input) internal pure returns (int136 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt144(uint _offst, bytes memory _input) internal pure returns (int144 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt152(uint _offst, bytes memory _input) internal pure returns (int152 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt160(uint _offst, bytes memory _input) internal pure returns (int160 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt168(uint _offst, bytes memory _input) internal pure returns (int168 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt176(uint _offst, bytes memory _input) internal pure returns (int176 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt184(uint _offst, bytes memory _input) internal pure returns (int184 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt192(uint _offst, bytes memory _input) internal pure returns (int192 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt200(uint _offst, bytes memory _input) internal pure returns (int200 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt208(uint _offst, bytes memory _input) internal pure returns (int208 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt216(uint _offst, bytes memory _input) internal pure returns (int216 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt224(uint _offst, bytes memory _input) internal pure returns (int224 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt232(uint _offst, bytes memory _input) internal pure returns (int232 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt240(uint _offst, bytes memory _input) internal pure returns (int240 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt248(uint _offst, bytes memory _input) internal pure returns (int248 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

    function bytesToInt256(uint _offst, bytes memory _input) internal pure returns (int256 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    }

	function bytesToUint8(uint _offst, bytes memory _input) internal pure returns (uint8 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint16(uint _offst, bytes memory _input) internal pure returns (uint16 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint24(uint _offst, bytes memory _input) internal pure returns (uint24 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint32(uint _offst, bytes memory _input) internal pure returns (uint32 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint40(uint _offst, bytes memory _input) internal pure returns (uint40 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint48(uint _offst, bytes memory _input) internal pure returns (uint48 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint56(uint _offst, bytes memory _input) internal pure returns (uint56 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint64(uint _offst, bytes memory _input) internal pure returns (uint64 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint72(uint _offst, bytes memory _input) internal pure returns (uint72 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint80(uint _offst, bytes memory _input) internal pure returns (uint80 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint88(uint _offst, bytes memory _input) internal pure returns (uint88 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

	function bytesToUint96(uint _offst, bytes memory _input) internal pure returns (uint96 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 
	
	function bytesToUint104(uint _offst, bytes memory _input) internal pure returns (uint104 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint112(uint _offst, bytes memory _input) internal pure returns (uint112 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint120(uint _offst, bytes memory _input) internal pure returns (uint120 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint128(uint _offst, bytes memory _input) internal pure returns (uint128 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint136(uint _offst, bytes memory _input) internal pure returns (uint136 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint144(uint _offst, bytes memory _input) internal pure returns (uint144 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint152(uint _offst, bytes memory _input) internal pure returns (uint152 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint160(uint _offst, bytes memory _input) internal pure returns (uint160 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint168(uint _offst, bytes memory _input) internal pure returns (uint168 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint176(uint _offst, bytes memory _input) internal pure returns (uint176 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint184(uint _offst, bytes memory _input) internal pure returns (uint184 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint192(uint _offst, bytes memory _input) internal pure returns (uint192 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint200(uint _offst, bytes memory _input) internal pure returns (uint200 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint208(uint _offst, bytes memory _input) internal pure returns (uint208 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint216(uint _offst, bytes memory _input) internal pure returns (uint216 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint224(uint _offst, bytes memory _input) internal pure returns (uint224 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint232(uint _offst, bytes memory _input) internal pure returns (uint232 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint240(uint _offst, bytes memory _input) internal pure returns (uint240 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint248(uint _offst, bytes memory _input) internal pure returns (uint248 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 

    function bytesToUint256(uint _offst, bytes memory _input) internal pure returns (uint256 _output) {
        
        assembly {
            _output := mload(add(_input, _offst))
        }
    } 
    
}

// File: contracts/interface/IParamSubscriber.sol

pragma solidity 0.6.4;

interface IParamSubscriber {
    function updateParam(string calldata key, bytes calldata value) external;
}

// File: contracts/RelayerIncentivize.sol

pragma solidity 0.6.4;








contract RelayerIncentivize is IRelayerIncentivize, System, IParamSubscriber {

  using SafeMath for uint256;

  uint256 public constant ROUND_SIZE=100;
  uint256 public constant MAXIMUM_WEIGHT=40;

  uint256 public constant HEADER_RELAYER_REWARD_RATE_MOLECULE = 1;
  uint256 public constant HEADER_RELAYER_REWARD_RATE_DENOMINATOR = 5;
  uint256 public constant CALLER_COMPENSATION_MOLECULE = 1;
  uint256 public constant CALLER_COMPENSATION_DENOMINATOR = 80;

  uint256 public headerRelayerRewardRateMolecule;
  uint256 public headerRelayerRewardRateDenominator;
  uint256 public callerCompensationMolecule;
  uint256 public callerCompensationDenominator;

  mapping(address => uint256) public headerRelayersSubmitCount;
  address payable[] public headerRelayerAddressRecord;

  mapping(address => uint256) public packageRelayersSubmitCount;
  address payable[] public packageRelayerAddressRecord;

  uint256 public collectedRewardForHeaderRelayer=0;
  uint256 public collectedRewardForTransferRelayer=0;

  uint256 public roundSequence=0;
  uint256 public countInRound=0;

  mapping(address => uint256) public relayerRewardVault;

  uint256 public dynamicExtraIncentiveAmount;

  event distributeCollectedReward(uint256 sequence, uint256 roundRewardForHeaderRelayer, uint256 roundRewardForTransferRelayer);
  event paramChange(string key, bytes value);
  event rewardToRelayer(address relayer, uint256 amount);

  function init() onlyNotInit external {
    require(!alreadyInit, "already initialized");
    headerRelayerRewardRateMolecule=HEADER_RELAYER_REWARD_RATE_MOLECULE;
    headerRelayerRewardRateDenominator=HEADER_RELAYER_REWARD_RATE_DENOMINATOR;
    callerCompensationMolecule=CALLER_COMPENSATION_MOLECULE;
    callerCompensationDenominator=CALLER_COMPENSATION_DENOMINATOR;
    alreadyInit = true;
  }

  receive() external payable{}

  
  function addReward(address payable headerRelayerAddr, address payable packageRelayer, uint256 amount, bool fromSystemReward) onlyInit onlyCrossChainContract external override returns (bool) {
  
    uint256 actualAmount;
    if (fromSystemReward) {
      actualAmount = ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(address(uint160(INCENTIVIZE_ADDR)), amount.add(dynamicExtraIncentiveAmount));
    } else {
      actualAmount = ISystemReward(TOKEN_HUB_ADDR).claimRewards(address(uint160(INCENTIVIZE_ADDR)), amount);
      if (dynamicExtraIncentiveAmount > 0) {
          actualAmount = actualAmount.add(ISystemReward(SYSTEM_REWARD_ADDR).claimRewards(address(uint160(INCENTIVIZE_ADDR)), dynamicExtraIncentiveAmount));
      }
    }

    countInRound++;

    uint256 reward = calculateRewardForHeaderRelayer(actualAmount);
    collectedRewardForHeaderRelayer = collectedRewardForHeaderRelayer.add(reward);
    collectedRewardForTransferRelayer = collectedRewardForTransferRelayer.add(actualAmount).sub(reward);

    if (headerRelayersSubmitCount[headerRelayerAddr]==0) {
      headerRelayerAddressRecord.push(headerRelayerAddr);
    }
    headerRelayersSubmitCount[headerRelayerAddr]++;

    if (packageRelayersSubmitCount[packageRelayer]==0) {
      packageRelayerAddressRecord.push(packageRelayer);
    }
    packageRelayersSubmitCount[packageRelayer]++;

    if (countInRound>=ROUND_SIZE) {
      emit distributeCollectedReward(roundSequence, collectedRewardForHeaderRelayer, collectedRewardForTransferRelayer);

      uint256 callerHeaderReward = distributeHeaderRelayerReward();
      uint256 callerPackageReward = distributePackageRelayerReward();

      relayerRewardVault[packageRelayer] = relayerRewardVault[packageRelayer].add(callerHeaderReward).add(callerPackageReward);

      roundSequence++;
      countInRound = 0;
    }
    return true;
  }

  function claimRelayerReward(address relayerAddr) external {
     uint256 reward = relayerRewardVault[relayerAddr];
     require(reward > 0, "no relayer reward");
     relayerRewardVault[relayerAddr] = 0;
     address payable recipient = address(uint160(relayerAddr));
     if (!recipient.send(reward)) {
        address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR));
        systemPayable.transfer(reward);
        emit rewardToRelayer(SYSTEM_REWARD_ADDR, reward);
        return;
     }
     emit rewardToRelayer(relayerAddr, reward);
  }

  function calculateRewardForHeaderRelayer(uint256 reward) internal view returns (uint256) {
    return reward.mul(headerRelayerRewardRateMolecule).div(headerRelayerRewardRateDenominator);
  }

  function distributeHeaderRelayerReward() internal returns (uint256) {
    uint256 totalReward = collectedRewardForHeaderRelayer;

    uint256 totalWeight=0;
    address payable[] memory relayers = headerRelayerAddressRecord;
    uint256[] memory relayerWeight = new uint256[](relayers.length);
    for (uint256 index = 0; index < relayers.length; index++) {
      address relayer = relayers[index];
      uint256 weight = calculateHeaderRelayerWeight(headerRelayersSubmitCount[relayer]);
      relayerWeight[index] = weight;
      totalWeight = totalWeight.add(weight);
    }

    uint256 callerReward = totalReward.mul(callerCompensationMolecule).div(callerCompensationDenominator);
    totalReward = totalReward.sub(callerReward);
    uint256 remainReward = totalReward;
    for (uint256 index = 1; index < relayers.length; index++) {
      uint256 reward = relayerWeight[index].mul(totalReward).div(totalWeight);
      relayerRewardVault[relayers[index]] = relayerRewardVault[relayers[index]].add(reward);
      remainReward = remainReward.sub(reward);
    }
    relayerRewardVault[relayers[0]] = relayerRewardVault[relayers[0]].add(remainReward);

    collectedRewardForHeaderRelayer = 0;
    for (uint256 index = 0; index < relayers.length; index++) {
      delete headerRelayersSubmitCount[relayers[index]];
    }
    delete headerRelayerAddressRecord;
    return callerReward;
  }

  function distributePackageRelayerReward() internal returns (uint256) {
    uint256 totalReward = collectedRewardForTransferRelayer;

    uint256 totalWeight=0;
    address payable[] memory relayers = packageRelayerAddressRecord;
    uint256[] memory relayerWeight = new uint256[](relayers.length);
    for (uint256 index = 0; index < relayers.length; index++) {
      address relayer = relayers[index];
      uint256 weight = calculateTransferRelayerWeight(packageRelayersSubmitCount[relayer]);
      relayerWeight[index] = weight;
      totalWeight = totalWeight + weight;
    }

    uint256 callerReward = totalReward.mul(callerCompensationMolecule).div(callerCompensationDenominator);
    totalReward = totalReward.sub(callerReward);
    uint256 remainReward = totalReward;
    for (uint256 index = 1; index < relayers.length; index++) {
      uint256 reward = relayerWeight[index].mul(totalReward).div(totalWeight);
      relayerRewardVault[relayers[index]] = relayerRewardVault[relayers[index]].add(reward);
      remainReward = remainReward.sub(reward);
    }
    relayerRewardVault[relayers[0]] = relayerRewardVault[relayers[0]].add(remainReward);

    collectedRewardForTransferRelayer = 0;
    for (uint256 index = 0; index < relayers.length; index++) {
      delete packageRelayersSubmitCount[relayers[index]];
    }
    delete packageRelayerAddressRecord;
    return callerReward;
  }

  function calculateTransferRelayerWeight(uint256 count) public pure returns(uint256) {
    if (count <= MAXIMUM_WEIGHT) {
      return count;
    } else if (MAXIMUM_WEIGHT < count && count <= 2*MAXIMUM_WEIGHT) {
      return MAXIMUM_WEIGHT;
    } else if (2*MAXIMUM_WEIGHT < count && count <= (2*MAXIMUM_WEIGHT + 3*MAXIMUM_WEIGHT/4)) {
      return 3*MAXIMUM_WEIGHT - count;
    } else {
      return count/4;
    }
  }

  function calculateHeaderRelayerWeight(uint256 count) public pure returns(uint256) {
    if (count <= MAXIMUM_WEIGHT) {
      return count;
    } else {
      return MAXIMUM_WEIGHT;
    }
  }

  function updateParam(string calldata key, bytes calldata value) override external onlyGov{
    require(alreadyInit, "contract has not been initialized");
    if (Memory.compareStrings(key,"headerRelayerRewardRateMolecule")) {
      require(value.length == 32, "length of headerRelayerRewardRateMolecule mismatch");
      uint256 newHeaderRelayerRewardRateMolecule = BytesToTypes.bytesToUint256(32, value);
      require(newHeaderRelayerRewardRateMolecule <= headerRelayerRewardRateDenominator, "new headerRelayerRewardRateMolecule shouldn't be greater than headerRelayerRewardRateDenominator");
      headerRelayerRewardRateMolecule = newHeaderRelayerRewardRateMolecule;
    } else if (Memory.compareStrings(key,"headerRelayerRewardRateDenominator")) {
      require(value.length == 32, "length of rewardForValidatorSetChange mismatch");
      uint256 newHeaderRelayerRewardRateDenominator = BytesToTypes.bytesToUint256(32, value);
      require(newHeaderRelayerRewardRateDenominator != 0 && newHeaderRelayerRewardRateDenominator >= headerRelayerRewardRateMolecule, "the new headerRelayerRewardRateDenominator must not be zero and no less than headerRelayerRewardRateMolecule");
      headerRelayerRewardRateDenominator = newHeaderRelayerRewardRateDenominator;
    } else if (Memory.compareStrings(key,"callerCompensationMolecule")) {
      require(value.length == 32, "length of rewardForValidatorSetChange mismatch");
      uint256 newCallerCompensationMolecule = BytesToTypes.bytesToUint256(32, value);
      require(newCallerCompensationMolecule <= callerCompensationDenominator, "new callerCompensationMolecule shouldn't be greater than callerCompensationDenominator");
      callerCompensationMolecule = newCallerCompensationMolecule;
    } else if (Memory.compareStrings(key,"callerCompensationDenominator")) {
      require(value.length == 32, "length of rewardForValidatorSetChange mismatch");
      uint256 newCallerCompensationDenominator = BytesToTypes.bytesToUint256(32, value);
      require(newCallerCompensationDenominator != 0 && newCallerCompensationDenominator >= callerCompensationMolecule, "the newCallerCompensationDenominator must not be zero and no less than callerCompensationMolecule");
      callerCompensationDenominator = newCallerCompensationDenominator;
    } else if (Memory.compareStrings(key,"dynamicExtraIncentiveAmount")) {
      require(value.length == 32, "length of dynamicExtraIncentiveAmount mismatch");
      uint256 newDynamicExtraIncentiveAmount = BytesToTypes.bytesToUint256(32, value);
      require(newDynamicExtraIncentiveAmount >= 0 , "the newDynamicExtraIncentiveAmount must be no less than zero");
      dynamicExtraIncentiveAmount = newDynamicExtraIncentiveAmount;
    } else {
      require(false, "unknown param");
    }
    emit paramChange(key, value);
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sequence","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundRewardForHeaderRelayer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundRewardForTransferRelayer","type":"uint256"}],"name":"distributeCollectedReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"paramChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rewardToRelayer","type":"event"},{"inputs":[],"name":"BIND_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CALLER_COMPENSATION_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CALLER_COMPENSATION_MOLECULE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CODE_OK","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CROSS_CHAIN_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERROR_FAIL_DECODE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOV_HUB_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEADER_RELAYER_REWARD_RATE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEADER_RELAYER_REWARD_RATE_MOLECULE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INCENTIVIZE_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIGHT_CLIENT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYERHUB_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASH_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLASH_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_REWARD_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_HUB_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_MANAGER_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_IN_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_OUT_CHANNELID","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_CONTRACT_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"headerRelayerAddr","type":"address"},{"internalType":"address payable","name":"packageRelayer","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"fromSystemReward","type":"bool"}],"name":"addReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"alreadyInit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bscChainID","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"calculateHeaderRelayerWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"calculateTransferRelayerWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"callerCompensationDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callerCompensationMolecule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"relayerAddr","type":"address"}],"name":"claimRelayerReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectedRewardForHeaderRelayer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectedRewardForTransferRelayer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"countInRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicExtraIncentiveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"headerRelayerAddressRecord","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"headerRelayerRewardRateDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"headerRelayerRewardRateMolecule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"headerRelayersSubmitCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"packageRelayerAddressRecord","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"packageRelayersSubmitCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayerRewardVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roundSequence","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"updateParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006009556000600a556000600b556000600c5534801561002457600080fd5b5061240d806100346000396000f3fe6080604052600436106102815760003560e01c8063930e1b091161014f578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107b5578063e89a3020146107e8578063f9a2bbc714610812578063fc3e590814610827578063fd6a68791461083c578063fdd31fcd1461085157610288565b8063bd4cc83014610722578063c81b16621461074c578063d0ab528a14610761578063dc927faf14610776578063dcae76ab1461078b578063e1c7392a146107a057610288565b8063a78abc1611610113578063a78abc16146105d3578063a7c6a59d146105e8578063ab51bb96146105fd578063ac43175114610612578063ace9fcc2146106e3578063af400681146106f857610288565b8063930e1b091461054c57806396713da91461057f5780639dc0926214610594578063a1a11bf5146105a9578063a3c3c0ad146105be57610288565b806343756e5c116101f35780636f93d2e6116101ac5780636f93d2e61461048457806370fd5bad146104e357806374f2272d146104f857806375d47a0a1461050d5780637942fd05146105225780637e146cc51461053757610288565b806343756e5c146103ef578063493279b1146104045780634bf6c8821461043057806351e8067214610445578063541333071461045a5780636e47b4821461046f57610288565b806312950c461161024557806312950c46146103215780631b20087c146103365780631c6433121461034b5780633a9756121461028d5780633dffc3871461039157806340bb43c0146103bc57610288565b8063081e9d131461028d57806308f2ec06146102b4578063093f2fc4146102c95780630bee7a67146102de57806310e06a761461030c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610884565b60408051918252519081900360200190f35b3480156102c057600080fd5b506102a2610889565b3480156102d557600080fd5b506102a261088e565b3480156102ea57600080fd5b506102f3610893565b6040805163ffffffff9092168252519081900360200190f35b34801561031857600080fd5b506102a2610898565b34801561032d57600080fd5b506102a261089e565b34801561034257600080fd5b506102a26108a4565b34801561035757600080fd5b506103756004803603602081101561036e57600080fd5b50356108aa565b604080516001600160a01b039092168252519081900360200190f35b34801561039d57600080fd5b506103a6610884565b6040805160ff9092168252519081900360200190f35b3480156103c857600080fd5b506102a2600480360360208110156103df57600080fd5b50356001600160a01b03166108d1565b3480156103fb57600080fd5b506103756108e3565b34801561041057600080fd5b506104196108e9565b6040805161ffff9092168252519081900360200190f35b34801561043c57600080fd5b506103a66108ee565b34801561045157600080fd5b506103756108f3565b34801561046657600080fd5b506102a2610893565b34801561047b57600080fd5b506103756108f9565b34801561049057600080fd5b506104cf600480360360808110156104a757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108ff565b604080519115158252519081900360200190f35b3480156104ef57600080fd5b506103a6610d91565b34801561050457600080fd5b506102a2610d96565b34801561051957600080fd5b50610375610d9c565b34801561052e57600080fd5b506103a6610da2565b34801561054357600080fd5b506102a2610da7565b34801561055857600080fd5b506102a26004803603602081101561056f57600080fd5b50356001600160a01b0316610dac565b34801561058b57600080fd5b506103a6610dbe565b3480156105a057600080fd5b50610375610dc3565b3480156105b557600080fd5b50610375610dc9565b3480156105ca57600080fd5b506102a2610dcf565b3480156105df57600080fd5b506104cf610dd5565b3480156105f457600080fd5b506102a2610dde565b34801561060957600080fd5b506102f3610de4565b34801561061e57600080fd5b506106e16004803603604081101561063557600080fd5b81019060208101813564010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9193909290916020810190356401000000008111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460018302840111640100000000831117156106d657600080fd5b509092509050610de9565b005b3480156106ef57600080fd5b506102a2611537565b34801561070457600080fd5b506102a26004803603602081101561071b57600080fd5b503561153d565b34801561072e57600080fd5b506102a26004803603602081101561074557600080fd5b5035611598565b34801561075857600080fd5b506103756115b1565b34801561076d57600080fd5b506102a26115b7565b34801561078257600080fd5b506103756115bd565b34801561079757600080fd5b506102a26115c3565b3480156107ac57600080fd5b506106e16115c9565b3480156107c157600080fd5b506106e1600480360360208110156107d857600080fd5b50356001600160a01b0316611692565b3480156107f457600080fd5b506103756004803603602081101561080b57600080fd5b50356117eb565b34801561081e57600080fd5b506103756117f8565b34801561083357600080fd5b506103a66117fe565b34801561084857600080fd5b50610375611803565b34801561085d57600080fd5b506102a26004803603602081101561087457600080fd5b50356001600160a01b0316611809565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b600681815481106108b757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200081565b61100581565b6000805460ff16610957576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109975760405162461bcd60e51b815260040180806020018281038252602f815260200180612377602f913960400191505060405180910390fd5b60008215610a4a576110026001600160a01b0316639a99b4f06110056109c8600e548861181b90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a1757600080fd5b505af1158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b50519050610b59565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a9457600080fd5b505af1158015610aa8573d6000803e3d6000fd5b505050506040513d6020811015610abe57600080fd5b5051600e5490915015610b5957600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b569161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b5051829063ffffffff61181b16565b90505b600c805460010190556000610b6d8261187e565b600954909150610b83908263ffffffff61181b16565b600955600a54610bab908290610b9f908563ffffffff61181b16565b9063ffffffff6118a716565b600a556001600160a01b038716600090815260056020526040902054610c1757600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610c9557600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610d8457600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d0f6118e9565b90506000610d1b611bcd565b6001600160a01b0389166000908152600d6020526040902054909150610d59908290610d4d908563ffffffff61181b16565b9063ffffffff61181b16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e295760405162461bcd60e51b815260040180806020018281038252602e8152602001806122bc602e913960400191505060405180910390fd5b60005460ff16610e6a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ea6021913960400191505060405180910390fd5b610ede84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611e4b9050565b15610fab5760208114610f225760405162461bcd60e51b81526004018080602001828103825260328152602001806123a66032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610f6091858580838501838280828437600092019190915250611f3292505050565b9050600254811115610fa35760405162461bcd60e51b81526004018080602001828103825260608152602001806121956060913960600191505060405180910390fd5b6001556114a5565b61100484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051606081019091526022808252909250905061229a6020830139611e4b565b156110dc57602081146110485760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161108691858580838501838280828437600092019190915250611f3292505050565b9050801580159061109957506001548110155b6110d45760405162461bcd60e51b815260040180806020018281038252606c81526020018061230b606c913960800191505060405180910390fd5b6002556114a5565b61115084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611e4b9050565b1561121d57602081146111945760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111d291858580838501838280828437600092019190915250611f3292505050565b90506004548111156112155760405162461bcd60e51b81526004018080602001828103825260568152602001806121f56056913960600191505060405180910390fd5b6003556114a5565b61129184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611e4b9050565b1561136957602081146112d55760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161131391858580838501838280828437600092019190915250611f3292505050565b9050801580159061132657506003548110155b6113615760405162461bcd60e51b81526004018080602001828103825260618152602001806121066061913960800191505060405180910390fd5b6004556114a5565b6113dd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611e4b9050565b1561146857602081146114215760405162461bcd60e51b815260040180806020018281038252602e815260200180612167602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161145f91858580838501838280828437600092019190915250611f3292505050565b600e55506114a5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161154e575080611593565b81602810801561155f575060508211155b1561156c57506028611593565b60508211801561157d5750606e8211155b1561158d57506078819003611593565b50600481045b919050565b6000602882116115a9575080611593565b506028611593565b61100281565b600e5481565b61100381565b60095481565b60005460ff1615611621576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561166f576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806116f1576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117a15760405161100290819084156108fc029085906000818181858888f1935050505015801561175b573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506117e8565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108b757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611875576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061187860025461189b60015485611f3790919063ffffffff16565b9063ffffffff611f9016565b600061187583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fd2565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561194557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611927575b5050505050905060608151604051908082528060200260200182016040528015611979578160200160208202803683370190505b50905060005b8251811015611a0657600083828151811061199657fe5b6020026020010151905060006119d060056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611598565b9050808484815181106119df57fe5b60209081029190910101526119fa868263ffffffff61181b16565b9550505060010161197f565b506000611a2460045461189b60035488611f3790919063ffffffff16565b9050611a36858263ffffffff6118a716565b94508460015b8451811015611b0d576000611a718761189b8a888681518110611a5b57fe5b6020026020010151611f3790919063ffffffff16565b9050611abe81600d6000898681518110611a8757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461181b90919063ffffffff16565b600d6000888581518110611ace57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b02838263ffffffff6118a716565b925050600101611a3c565b50611b2381600d600087600081518110611a8757fe5b600d600086600081518110611b3457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611bb55760056000868381518110611b8757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611b6e565b50611bc2600660006120ce565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c2957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0b575b5050505050905060608151604051908082528060200260200182016040528015611c5d578160200160208202803683370190505b50905060005b8251811015611cdc576000838281518110611c7a57fe5b602002602001015190506000611cb460076000846001600160a01b03166001600160a01b031681526020019081526020016000205461153d565b905080848481518110611cc357fe5b6020908102919091010152949094019350600101611c63565b506000611cfa60045461189b60035488611f3790919063ffffffff16565b9050611d0c858263ffffffff6118a716565b94508460015b8451811015611d96576000611d318761189b8a888681518110611a5b57fe5b9050611d4781600d6000898681518110611a8757fe5b600d6000888581518110611d5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611d8b838263ffffffff6118a716565b925050600101611d12565b50611dac81600d600087600081518110611a8757fe5b600d600086600081518110611dbd57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e3e5760076000868381518110611e1057fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611df7565b50611bc2600860006120ce565b6000816040516020018082805190602001908083835b60208310611e805780518252601f199092019160209182019101611e61565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611eee5780518252601f199092019160209182019101611ecf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611f4657506000611878565b82820282848281611f5357fe5b04146118755760405162461bcd60e51b81526004018080602001828103825260218152602001806122796021913960400191505060405180910390fd5b600061187583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612069565b600081848411156120615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561202657818101518382015260200161200e565b50505050905090810190601f1680156120535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561202657818101518382015260200161200e565b5060008385816120c457fe5b0495945050505050565b50805460008255906000526020600020908101906117e89190611bca91905b8082111561210157600081556001016120ed565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220e98544a55cfad5eae2f3157896ecf02194000e9989e5532d0612e6103680773664736f6c63430006040033

Deployed ByteCode Sourcemap

29323:10906:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;29531:63:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29531:63:0;;;:::i;:::-;;;;;;;;;;;;;;;;29483:41;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29483:41:0;;;:::i;29731:60::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29731:60:0;;;:::i;1155:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1155:46:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30358:30;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30358:30:0;;;:::i;29798:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29798:46:0;;;:::i;30393:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30393:29:0;;;:::i;30065:51::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30065:51:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30065:51:0;;:::i;:::-;;;;-1:-1:-1;;;;;30065:51:0;;;;;;;;;;;;;;1208:43;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1208:43:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30123:61;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30123:61:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30123:61:0;-1:-1:-1;;;;;30123:61:0;;:::i;1660:88::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1660:88:0;;;:::i;1514:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1514:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1367:46;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1367:46:0;;;:::i;2388:94::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2388:94:0;;;:::i;29440:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29440:38:0;;;:::i;2024:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2024:83:0;;;:::i;31223:1896::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31223:1896:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;31223:1896:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1256:50;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1256:50:0;;;:::i;29903:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29903:41:0;;;:::i;2296:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2296:87:0;;;:::i;1465:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1465:44:0;;;:::i;29599:66::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29599:66:0;;;:::i;30000:60::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30000:60:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30000:60:0;-1:-1:-1;;;;;30000:60:0;;:::i;1418:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1418:42:0;;;:::i;2210:81::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2210:81:0;;;:::i;2112:93::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2112:93:0;;;:::i;30301:50::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30301:50:0;;;:::i;1086:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1086:23:0;;;:::i;29949:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29949:44:0;;;:::i;1116:34::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1116:34:0;;;:::i;37383:2843::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37383:2843:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;37383:2843:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37383:2843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37383:2843:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;37383:2843:0;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37383:2843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37383:2843:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;37383:2843:0;;-1:-1:-1;37383:2843:0;-1:-1:-1;37383:2843:0;:::i;:::-;;29849:49;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29849:49:0;;;:::i;36747:428::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36747:428:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36747:428:0;;:::i;37181:196::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37181:196:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37181:196:0;;:::i;1753:87::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1753:87:0;;;:::i;30489:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30489:42:0;;;:::i;1845:86::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1845:86:0;;;:::i;30248:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30248:48:0;;;:::i;30776:403::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30776:403:0;;;:::i;33125:566::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33125:566:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33125:566:0;-1:-1:-1;;;;;33125:566:0;;:::i;30189:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30189:52:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30189:52:0;;:::i;1563:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1563:92:0;;;:::i;1311:51::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1311:51:0;;;:::i;1936:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1936:83:0;;;:::i;30429:53::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30429:53:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30429:53:0;-1:-1:-1;;;;;30429:53:0;;:::i;29531:63::-;29593:1;29531:63;:::o;29483:41::-;29522:2;29483:41;:::o;29731:60::-;29789:2;29731:60;:::o;1155:46::-;1198:3;1155:46;:::o;30358:30::-;;;;:::o;29798:46::-;;;;:::o;30393:29::-;;;;:::o;30065:51::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30065:51:0;;-1:-1:-1;30065:51:0;:::o;30123:61::-;;;;;;;;;;;;;:::o;1660:88::-;1706:42;1660:88;:::o;1514:42::-;1550:6;1514:42;:::o;1367:46::-;1409:4;1367:46;:::o;2388:94::-;2440:42;2388:94;:::o;2024:83::-;2065:42;2024:83;:::o;31223:1896::-;31407:4;2763:11;;;;2755:49;;;;;-1:-1:-1;;;2755:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3434:10:::1;2440:42;3434:39;3426:99;;;;-1:-1:-1::0;;;3426:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31424:20:::2;31455:16;31451:513;;;1798:42;-1:-1:-1::0;;;;;31497:46:0::2;;2065:42;31580:39;31591:27;;31580:6;:10;;:39;;;;:::i;:::-;31497:123;;;;;;;;;;;;;-1:-1:-1::0;;;;;31497:123:0::2;-1:-1:-1::0;;;;;31497:123:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;31497:123:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;31497:123:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;31497:123:0;;-1:-1:-1;31451:513:0::2;;;31658:86;::::0;;-1:-1:-1;;;31658:86:0;;2065:42:::2;31658:86;::::0;::::2;::::0;;;;;;;;;1977:42:::2;::::0;31658::::2;::::0;:86;;;;;::::2;::::0;;;;;;;;-1:-1:-1;1977:42:0;31658:86;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;31658:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;31658:86:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;31658:86:0;31757:27:::2;::::0;31658:86;;-1:-1:-1;31757:31:0;31753:204:::2;;31918:27;::::0;31835:111:::2;::::0;;-1:-1:-1;;;31835:111:0;;2065:42:::2;31835:111;::::0;::::2;::::0;;;;;;;;;31818:129:::2;::::0;1798:42:::2;::::0;31835:46:::2;::::0;:111;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;1798:42:0;31835:111;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;31835:111:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;31835:111:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;31835:111:0;31818:12;;:129:::2;:16;:129;:::i;:::-;31803:144;;31753:204;31972:12;:14:::0;;::::2;;::::0;;:12:::2;32012:45;32044:12:::0;32012:31:::2;:45::i;:::-;32098:31;::::0;31995:62;;-1:-1:-1;32098:43:0::2;::::0;31995:62;32098:43:::2;:35;:43;:::i;:::-;32064:31;:77:::0;32184:33:::2;::::0;:63:::2;::::0;32240:6;;32184:51:::2;::::0;32222:12;32184:51:::2;:37;:51;:::i;:::-;:55:::0;:63:::2;:55;:63;:::i;:::-;32148:33;:99:::0;-1:-1:-1;;;;;32260:44:0;::::2;;::::0;;;:25:::2;:44;::::0;;;;;32256:120:::2;;32318:26;27:10:-1::0;;39:1:::2;23:18:::0;::::2;45:23:::0;;-1:-1;32318:50:0;;;;;::::2;::::0;;-1:-1:-1;;;;;;32318:50:0::2;-1:-1:-1::0;;;;;32318:50:0;::::2;;::::0;;32256:120:::2;-1:-1:-1::0;;;;;32382:44:0;;::::2;;::::0;;;:25:::2;:44;::::0;;;;;;;:46;;::::2;;::::0;;32441:42;;::::2;::::0;;:26:::2;:42:::0;;;;32437:116:::2;;32497:27;27:10:-1::0;;39:1:::2;23:18:::0;::::2;45:23:::0;;-1:-1;32497:48:0;;;;;::::2;::::0;;-1:-1:-1;;;;;;32497:48:0::2;-1:-1:-1::0;;;;;32497:48:0;::::2;;::::0;;32437:116:::2;-1:-1:-1::0;;;;;32559:42:0;::::2;;::::0;;;:26:::2;:42;::::0;;;;:44;;::::2;;::::0;;32616:12:::2;::::0;29475:3:::2;-1:-1:-1::0;32612:484:0::2;;32682:13;::::0;32697:31:::2;::::0;32730:33:::2;::::0;32656:108:::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;::::2;::::0;;;;;;;::::2;32775:26;32804:31;:29;:31::i;:::-;32775:60;;32844:27;32874:32;:30;:32::i;:::-;-1:-1:-1::0;;;;;32954:34:0;::::2;;::::0;;;:18:::2;:34;::::0;;;;;32844:62;;-1:-1:-1;32954:83:0::2;::::0;32844:62;;32954:58:::2;::::0;32993:18;32954:58:::2;:38;:58;:::i;:::-;:62:::0;:83:::2;:62;:83;:::i;:::-;-1:-1:-1::0;;;;;32917:34:0;::::2;;::::0;;;:18:::2;:34;::::0;;;;:120;;;;33048:13:::2;:15:::0;;::::2;;::::0;;33072:12:::2;:16:::0;-1:-1:-1;;32612:484:0::2;-1:-1:-1::0;33109:4:0::2;::::0;31223:1896;-1:-1:-1;;;;;;31223:1896:0:o;1256:50::-;1302:4;1256:50;:::o;29903:41::-;;;;:::o;2296:87::-;2341:42;2296:87;:::o;1465:44::-;1505:4;1465:44;:::o;29599:66::-;29664:1;29599:66;:::o;30000:60::-;;;;;;;;;;;;;:::o;1418:42::-;1456:4;1418:42;:::o;2210:81::-;2249:42;2210:81;:::o;2112:93::-;2163:42;2112:93;:::o;30301:50::-;;;;:::o;1086:23::-;;;;;;:::o;29949:44::-;;;;:::o;1116:34::-;1149:1;1116:34;:::o;37383:2843::-;3130:10;2249:42;3130:26;3122:85;;;;-1:-1:-1;;;3122:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37487:11:::1;::::0;::::1;;37479:57;;;;-1:-1:-1::0;;;37479:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37547:60;37569:3;;37547:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;37547:60:0::1;::::0;;;;::::1;::::0;;;137:4:-1::1;37547:60:0::0;;::::1;;::::0;::::1;::::0;;-1:-1:-1;37547:21:0::1;::::0;-1:-1:-1;37547:60:0:i:1;:::-;37543:2643;;;37642:2;37626:18:::0;::::1;37618:81;;;;-1:-1:-1::0;;;37618:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37753:38;::::0;;37781:2:::1;37753:38;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;37708:42:::1;::::0;37753:38:::1;::::0;37785:5;;;37753:38;;::::1;37785:5:::0;;;;37753:38;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37753:27:0::1;::::0;-1:-1:-1;;;37753:38:0:i:1;:::-;37708:83;;37846:34;;37808;:72;;37800:181;;;;-1:-1:-1::0;;;37800:181:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37990:31;:68:::0;37543:2643:::1;;;38076:63;38098:3;;38076:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;38076:63:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;-1:-1:-1;38076:63:0;-1:-1:-1;38076:63:0::1;;::::0;::::1;;:21;:63::i;:::-;38072:2114;;;38174:2;38158:18:::0;::::1;38150:77;;;;-1:-1:-1::0;;;38150:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38284:38;::::0;;38312:2:::1;38284:38;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;38236:45:::1;::::0;38284:38:::1;::::0;38316:5;;;38284:38;;::::1;38316:5:::0;;;;38284:38;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38284:27:0::1;::::0;-1:-1:-1;;;38284:38:0:i:1;:::-;38236:86:::0;-1:-1:-1;38339:42:0;;;::::1;::::0;:118:::1;;;38426:31;;38385:37;:72;;38339:118;38331:239;;;;-1:-1:-1::0;;;38331:239:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38579:34;:74:::0;38072:2114:::1;;;38671:55;38693:3;;38671:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;38671:55:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;-1:-1:-1;38671:21:0::1;::::0;-1:-1:-1;38671:55:0:i:1;:::-;38667:1519;;;38761:2;38745:18:::0;::::1;38737:77;;;;-1:-1:-1::0;;;38737:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38863:38;::::0;;38891:2:::1;38863:38;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;38823:37:::1;::::0;38863:38:::1;::::0;38895:5;;;38863:38;;::::1;38895:5:::0;;;;38863:38;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38863:27:0::1;::::0;-1:-1:-1;;;38863:38:0:i:1;:::-;38823:78;;38951:29;;38918;:62;;38910:161;;;;-1:-1:-1::0;;;38910:161:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39080:26;:58:::0;38667:1519:::1;;;39156:58;39178:3;;39156:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;39156:58:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;-1:-1:-1;39156:21:0::1;::::0;-1:-1:-1;39156:58:0:i:1;:::-;39152:1034;;;39249:2;39233:18:::0;::::1;39225:77;;;;-1:-1:-1::0;;;39225:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39354:38;::::0;;39382:2:::1;39354:38;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;39311:40:::1;::::0;39354:38:::1;::::0;39386:5;;;39354:38;;::::1;39386:5:::0;;;;39354:38;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39354:27:0::1;::::0;-1:-1:-1;;;39354:38:0:i:1;:::-;39311:81:::0;-1:-1:-1;39409:37:0;;;::::1;::::0;:103:::1;;;39486:26;;39450:32;:62;;39409:103;39401:213;;;;-1:-1:-1::0;;;39401:213:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39623:29;:64:::0;39152:1034:::1;;;39705:56;39727:3;;39705:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;;39705:56:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;-1:-1:-1;39705:21:0::1;::::0;-1:-1:-1;39705:56:0:i:1;:::-;39701:485;;;39796:2;39780:18:::0;::::1;39772:77;;;;-1:-1:-1::0;;;39772:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39899:38;::::0;;39927:2:::1;39899:38;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;39858::::1;::::0;39899::::1;::::0;39931:5;;;39899:38;;::::1;39931:5:::0;;;;39899:38;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39899:27:0::1;::::0;-1:-1:-1;;;39899:38:0:i:1;:::-;40064:27;:60:::0;-1:-1:-1;39701:485:0::1;;;40147:31;::::0;;-1:-1:-1;;;40147:31:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40147:31:0;;;;;;;;;;;;;::::1;;40197:23;40209:3;;40214:5;;40197:23;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;137:4:::1;117:14;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;40197:23:0::0;;::::1;::::0;;;;;::::1;;::::0;-1:-1:-1;40197:23:0;;;;;1:33:-1::1;99:1;81:16:::0;;::::1;74:27:::0;40197:23:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;40197:23:0::0;;::::1;::::0;-1:-1:-1;40197:23:0;;-1:-1:-1;;;;;;;40197:23:0::1;37383:2843:::0;;;;:::o;29849:49::-;;;;:::o;36747:428::-;36822:7;29522:2;36842:5;:23;36838:332;;-1:-1:-1;36883:5:0;36876:12;;36838:332;36923:5;29522:2;36906:22;:51;;;;-1:-1:-1;36941:16:0;36932:25;;;36906:51;36902:268;;;-1:-1:-1;29522:2:0;36968:21;;36902:268;37007:16;:24;-1:-1:-1;37007:76:0;;;;-1:-1:-1;37045:37:0;37035:48;;;37007:76;37003:167;;;-1:-1:-1;37101:16:0;:24;;;37094:31;;37003:167;-1:-1:-1;37161:1:0;37155:7;;37003:167;36747:428;;;:::o;37181:196::-;37254:7;29522:2;37274:5;:23;37270:102;;-1:-1:-1;37315:5:0;37308:12;;37270:102;-1:-1:-1;29522:2:0;37343:21;;1753:87;1798:42;1753:87;:::o;30489:42::-;;;;:::o;1845:86::-;1889:42;1845:86;:::o;30248:48::-;;;;:::o;30776:403::-;2667:11;;;;2666:12;2658:50;;;;;-1:-1:-1;;;2658:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30829:11:::1;::::0;::::1;;30828:12;30820:44;;;::::0;;-1:-1:-1;;;30820:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30820:44:0;;;;;;;;;;;;;::::1;;29593:1;30871:67:::0;;;29664:1:::1;30945:34;:73:::0;31025:26:::1;:55:::0;;;29789:2:::1;31087:29;:61:::0;-1:-1:-1;31155:18:0;;-1:-1:-1;;31155:18:0::1;::::0;;::::1;::::0;;30776:403::o;33125:566::-;-1:-1:-1;;;;;33208:31:0;;33191:14;33208:31;;;:18;:31;;;;;;33255:10;33247:40;;;;;-1:-1:-1;;;33247:40:0;;;;;;;;;;;;-1:-1:-1;;;33247:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33295:31:0;;33329:1;33295:31;;;:18;:31;;;;;;:35;;;33408:22;33314:11;;33295:31;33408:22;;;;;33423:6;;33408:22;33329:1;33408:22;33423:6;33295:31;33408:22;;;;;;;33403:234;;33522:30;;1798:42;;;;33522:30;;;;;33545:6;;33443:29;33522:30;33443:29;33522:30;33545:6;1798:42;33522:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;33568:43:0;;;1798:42;33568:43;;;;;;;;;;;;;;;;;;;;;33622:7;;;;;33403:234;33649:36;;;-1:-1:-1;;;;;33649:36:0;;;;;;;;;;;;;;;;;;;;;;;33125:566;;;;:::o;30189:52::-;;;;;;;;;;1563:92;1613:42;1563:92;:::o;1311:51::-;1358:4;1311:51;:::o;1936:83::-;1977:42;1936:83;:::o;30429:53::-;;;;;;;;;;;;;:::o;5141:181::-;5199:7;5231:5;;;5255:6;;;;5247:46;;;;;-1:-1:-1;;;5247:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5313:1;-1:-1:-1;5141:181:0;;;;;:::o;33697:192::-;33777:7;33800:83;33848:34;;33800:43;33811:31;;33800:6;:10;;:43;;;;:::i;:::-;:47;:83;:47;:83;:::i;5597:136::-;5655:7;5682:43;5686:1;5689;5682:43;;;;;;;;;;;;;;;;;:3;:43::i;33895:1416::-;33992:31;;34096:26;34060:62;;;;;;;;;;;;;;;;;;;33954:7;;33992:31;33954:7;;34060:33;;:62;;34096:26;34060:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34060:62:0;;;;;;;;;;;;;;;;;;;;;;;34129:30;34176:8;:15;34162:30;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;34162:30:0;-1:-1:-1;34129:63:0;-1:-1:-1;34204:13:0;34199:282;34231:8;:15;34223:5;:23;34199:282;;;34266:15;34284:8;34293:5;34284:15;;;;;;;;;;;;;;34266:33;;34308:14;34325:64;34354:25;:34;34380:7;-1:-1:-1;;;;;34354:34:0;-1:-1:-1;;;;;34354:34:0;;;;;;;;;;;;;34325:28;:64::i;:::-;34308:81;;34421:6;34398:13;34412:5;34398:20;;;;;;;;;;;;;;;;;:29;34450:23;:11;34466:6;34450:23;:15;:23;:::i;:::-;34436:37;-1:-1:-1;;;34248:7:0;;34199:282;;;;34489:20;34512:78;34560:29;;34512:43;34528:26;;34512:11;:15;;:43;;;;:::i;:78::-;34489:101;-1:-1:-1;34611:29:0;:11;34489:101;34611:29;:15;:29;:::i;:::-;34597:43;-1:-1:-1;34597:43:0;34709:1;34688:288;34720:8;:15;34712:5;:23;34688:288;;;34755:14;34772:54;34814:11;34772:37;34797:11;34772:13;34786:5;34772:20;;;;;;;;;;;;;;:24;;:37;;;;:::i;:54::-;34755:71;;34873:47;34913:6;34873:18;:35;34892:8;34901:5;34892:15;;;;;;;;;;;;;;-1:-1:-1;;;;;34873:35:0;-1:-1:-1;;;;;34873:35:0;;;;;;;;;;;;;:39;;:47;;;;:::i;:::-;34835:18;:35;34854:8;34863:5;34854:15;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34835:35:0;;;;;;;;;;;-1:-1:-1;34835:35:0;:85;34944:24;:12;34961:6;34944:24;:16;:24;:::i;:::-;34929:39;-1:-1:-1;;34737:7:0;;34688:288;;;;35016:49;35052:12;35016:18;:31;35035:8;35044:1;35035:11;;;;;;;35016:49;34982:18;:31;35001:8;35010:1;35001:11;;;;;;;;;;;;;;-1:-1:-1;;;;;34982:31:0;-1:-1:-1;;;;;34982:31:0;;;;;;;;;;;;:83;;;;35108:1;35074:31;:35;;;;35121:13;35137:1;35121:17;;35116:124;35148:8;:15;35140:5;:23;35116:124;;;35190:25;:42;35216:8;35225:5;35216:15;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35190:42:0;;;;;;;;;;;-1:-1:-1;35190:42:0;;;35183:49;35165:7;;35116:124;;;-1:-1:-1;35246:33:0;35253:26;;35246:33;:::i;:::-;-1:-1:-1;35293:12:0;-1:-1:-1;;;;;33895:1416:0;;:::o;35317:1424::-;35415:33;;35521:27;35485:63;;;;;;;;;;;;;;;;;;;35377:7;;35415:33;35377:7;;35485:33;;:63;;35521:27;35485:63;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35485:63:0;;;;;;;;;;;;;;;;;;;;;;;35555:30;35602:8;:15;35588:30;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;35588:30:0;-1:-1:-1;35555:63:0;-1:-1:-1;35630:13:0;35625:282;35657:8;:15;35649:5;:23;35625:282;;;35692:15;35710:8;35719:5;35710:15;;;;;;;;;;;;;;35692:33;;35734:14;35751:67;35782:26;:35;35809:7;-1:-1:-1;;;;;35782:35:0;-1:-1:-1;;;;;35782:35:0;;;;;;;;;;;;;35751:30;:67::i;:::-;35734:84;;35850:6;35827:13;35841:5;35827:20;;;;;;;;;;;;;;;;;:29;35879:20;;;;;-1:-1:-1;35674:7:0;;35625:282;;;;35915:20;35938:78;35986:29;;35938:43;35954:26;;35938:11;:15;;:43;;;;:::i;:78::-;35915:101;-1:-1:-1;36037:29:0;:11;35915:101;36037:29;:15;:29;:::i;:::-;36023:43;-1:-1:-1;36023:43:0;36135:1;36114:288;36146:8;:15;36138:5;:23;36114:288;;;36181:14;36198:54;36240:11;36198:37;36223:11;36198:13;36212:5;36198:20;;;;;;;:54;36181:71;;36299:47;36339:6;36299:18;:35;36318:8;36327:5;36318:15;;;;;;;36299:47;36261:18;:35;36280:8;36289:5;36280:15;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36261:35:0;;;;;;;;;;;-1:-1:-1;36261:35:0;:85;36370:24;:12;36387:6;36370:24;:16;:24;:::i;:::-;36355:39;-1:-1:-1;;36163:7:0;;36114:288;;;;36442:49;36478:12;36442:18;:31;36461:8;36470:1;36461:11;;;;;;;36442:49;36408:18;:31;36427:8;36436:1;36427:11;;;;;;;;;;;;;;-1:-1:-1;;;;;36408:31:0;-1:-1:-1;;;;;36408:31:0;;;;;;;;;;;;:83;;;;36536:1;36500:33;:37;;;;36549:13;36565:1;36549:17;;36544:125;36576:8;:15;36568:5;:23;36544:125;;;36618:26;:43;36645:8;36654:5;36645:15;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36618:43:0;;;;;;;;;;;-1:-1:-1;36618:43:0;;;36611:50;36593:7;;36544:125;;;-1:-1:-1;36675:34:0;36682:27;;36675:34;:::i;10936:183::-;11017:4;11106:1;11088:21;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11088:21:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11088:21:0;;;11078:32;;;;;;11070:1;11052:21;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11052:21:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11052:21:0;;;11042:32;;;;;;:68;11034:77;;10936:183;;;;:::o;28833:198::-;28993:19;28987:26;;28961:63::o;6471:471::-;6529:7;6774:6;6770:47;;-1:-1:-1;6804:1:0;6797:8;;6770:47;6841:5;;;6845:1;6841;:5;:1;6865:5;;;;;:10;6857:56;;;;-1:-1:-1;;;6857:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7410:132;7468:7;7495:39;7499:1;7502;7495:39;;;;;;;;;;;;;;;;;:3;:39::i;6028:192::-;6114:7;6150:12;6142:6;;;;6134:29;;;;-1:-1:-1;;;6134:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6134:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6186:5:0;;;6028:192::o;8030:345::-;8116:7;8218:12;8211:5;8203:28;;;;-1:-1:-1;;;8203:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8203:28:0;;8242:9;8258:1;8254;:5;;;;;;;8030:345;-1:-1:-1;;;;;8030:345:0:o;29323:10906::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://e98544a55cfad5eae2f3157896ecf02194000e9989e5532d0612e61036807736
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.