Contract 0x0000000000000000000000000000000000001005 6

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xec0c2ea3269cfd881e6821e394b8000756a4a9a8a26988436f79f712f303ac3dClaim Relayer Re...110754162021-09-20 9:29:072 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x3b33e7c27fe34d4f562509388f0a34eac1fd9d43ffb9e76f8b7ba0d6712e25edClaim Relayer Re...110738562021-09-20 8:11:061 hr 20 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x0d0a355df4c082ef88e390b0a84281034e3631f1318987f8287683ccccb240ddClaim Relayer Re...110736372021-09-20 8:00:081 hr 30 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x8f4adeb65f4970851d25c7c51354cb3058d686735ef142fcfda9e742d0fec5dcClaim Relayer Re...110730772021-09-20 7:32:081 hr 58 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000111856394
0x96a747bdd5338d78606c4afcaba6e09358e277ea494080abaac5cd2f003abe76Claim Relayer Re...110718372021-09-20 6:30:063 hrs 1 min ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x3ad5b14a4dd6c30e29c2c52be5bd5a1bae526c64a6ed3c06cc097ca9482ef099Claim Relayer Re...110715372021-09-20 6:15:063 hrs 16 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x22c92e55353c7499685c2dabc04cacf1d16543bbf1b014f46beea698a7330d57Claim Relayer Re...110714572021-09-20 6:11:063 hrs 20 mins ago0x4e1ff312802dc14b44991ec7c08181777963dc55 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xb2143b9a4be9e4af6daa9b2aa9081ba716901ccd7f1844febfea9b2343c0b92eClaim Relayer Re...110696972021-09-20 4:43:064 hrs 48 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xbdca3941a19d62b178a0e10423914ce23e742952a29910860efaa9a193f76d96Claim Relayer Re...110695372021-09-20 4:35:064 hrs 56 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x96e487f78d95f9c2564c6b289d8343c85551c40c3060980b7c6faa485c73fa1cClaim Relayer Re...110687772021-09-20 3:57:065 hrs 34 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x828cf0015726d624566e4159ed0aeb95cd6a8087da9a99cb70522bef2aa235f5Claim Relayer Re...110676972021-09-20 3:03:056 hrs 28 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x4087bb203267a3bcea69641c2915e3ed98ac49e5bf9b0a824be11f68d29dba6fClaim Relayer Re...110671972021-09-20 2:38:056 hrs 53 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x2942accc998df0c443fd599deabc035e691c1b144d6f4177f0acd80edaa8962aClaim Relayer Re...110671172021-09-20 2:34:056 hrs 57 mins ago0x4e1ff312802dc14b44991ec7c08181777963dc55 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x38b2731c5daa8cb99c4612503ca6b6ed3f7eb16c66797276f205e06dbdb6d24eClaim Relayer Re...110651372021-09-20 0:55:058 hrs 36 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000111922853
0x1d4bc69dffb9f9ad75b000e6bc66f978508a0b9d3b86d4e34c3aa064413cdd38Claim Relayer Re...110649772021-09-20 0:47:058 hrs 44 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xcfe53b1f7e4566eded0a83d4f34c8796baeca5a4b879feb82928e25edd591965Claim Relayer Re...110641382021-09-20 0:05:069 hrs 26 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xba35a46de23dad125c8b720e301e724f2dbb071377804c5b597fd9771f562f09Claim Relayer Re...110629782021-09-19 23:07:0610 hrs 24 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000111006985
0x7135834a24aed86b50a6b22d51316949b70d2053730794987f5991f0f56e6670Claim Relayer Re...110628782021-09-19 23:02:0610 hrs 29 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xdd475f84b02789acd42cede401a6208c4c70936c811459f9d9e970d8c420aa5fClaim Relayer Re...110625972021-09-19 22:48:0310 hrs 43 mins ago0x4e1ff312802dc14b44991ec7c08181777963dc55 IN  BSC: Relayer Incentivize0 BNB0.000114990997
0x33f903d0a43df7dd2054f30830de21a967e42d4e73fa0e6017f929741f217c94Claim Relayer Re...110613582021-09-19 21:46:0611 hrs 45 mins ago0x912e36eb8b7786fb70921feb41b0f2bfa1d2c62d IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xc1bacf5fc9a4129f8e15a4744a02f725097c8e718b9395ed20c6dd383f587364Claim Relayer Re...110613182021-09-19 21:44:0611 hrs 47 mins ago0x16d4566bbcc261f636dec48958bb570ed9d52989 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x1ff38a24dc29afaff9da0427d5139221482c610f94a4bc32e2a53b702190f18bClaim Relayer Re...110604182021-09-19 20:59:0612 hrs 32 mins ago0xf7c969a09d42db65e96095053fa7400d857867f1 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x1bc3e162fdb9843562fb87e9cf51add7bee98197c256eb149db4726b225c5bf0Claim Relayer Re...110595982021-09-19 20:18:0613 hrs 13 mins ago0x92127fe28cc84ff8b0867046b27459d7a9a9a4ac IN  BSC: Relayer Incentivize0 BNB0.000107681532
0xecaf3c1122c1735e64fec27170c755b4925bb4233aa5b8589d64442f494efac4Claim Relayer Re...110594782021-09-19 20:12:0613 hrs 19 mins ago0x3d2a79190e8a5910793ec946f7976bef974b8931 IN  BSC: Relayer Incentivize0 BNB0.000107681532
0x257534d3dd2b3a65b49d536b50fe9ede7672750adff76123e991c061aebe6e62Claim Relayer Re...110591382021-09-19 19:55:0513 hrs 36 mins ago0x4e1ff312802dc14b44991ec7c08181777963dc55 IN  BSC: Relayer Incentivize0 BNB0.000107681532
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2825576d93360b64340252170f9507c9249b7d39ef6fcacc7cff496ebd42a780110754442021-09-20 9:30:3136 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x2825576d93360b64340252170f9507c9249b7d39ef6fcacc7cff496ebd42a780110754442021-09-20 9:30:3136 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xf4d8b375a6bddc4ccd1bd47f2f181dcc8c94aac515e8fe6a9919d394c93a3092110754442021-09-20 9:30:3136 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xf4d8b375a6bddc4ccd1bd47f2f181dcc8c94aac515e8fe6a9919d394c93a3092110754442021-09-20 9:30:3136 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x14a4444e21b7490dad7d5069042fd8e3025cb87aae52d0a18f57ea5b975965ce110754422021-09-20 9:30:2542 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x14a4444e21b7490dad7d5069042fd8e3025cb87aae52d0a18f57ea5b975965ce110754422021-09-20 9:30:2542 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xf05657d02472ce3d2dd6347b1749b87cb8ed5ba182ce6d2a56311eb609711c4d110754402021-09-20 9:30:1948 secs ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xf05657d02472ce3d2dd6347b1749b87cb8ed5ba182ce6d2a56311eb609711c4d110754402021-09-20 9:30:1948 secs ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x41786d77e22bf3df73641500f720bba6339821ac1e32919831c777824b751d37110754362021-09-20 9:30:071 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x41786d77e22bf3df73641500f720bba6339821ac1e32919831c777824b751d37110754362021-09-20 9:30:071 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xa755d12af4a1b136dbbd7f2d9769f6e41426398850ec39a83dfd1f4b42a72849110754362021-09-20 9:30:071 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xa755d12af4a1b136dbbd7f2d9769f6e41426398850ec39a83dfd1f4b42a72849110754362021-09-20 9:30:071 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x13f8b9a786e1f733f4f5dd695cd4134e1e89e467865554e3c9ac4b9c7f08f915110754302021-09-20 9:29:491 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x13f8b9a786e1f733f4f5dd695cd4134e1e89e467865554e3c9ac4b9c7f08f915110754302021-09-20 9:29:491 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x2aa40855c3679fad4edd031916f19830dae2536d11426df2a52377e1a756eb18110754302021-09-20 9:29:491 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x2aa40855c3679fad4edd031916f19830dae2536d11426df2a52377e1a756eb18110754302021-09-20 9:29:491 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x4ed335a98180157a90b5437730bc88fb903a63d471b82a4509ef03e4cec7326f110754242021-09-20 9:29:311 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x4ed335a98180157a90b5437730bc88fb903a63d471b82a4509ef03e4cec7326f110754242021-09-20 9:29:311 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x29ff753fce24905daa40c774b10af99fdca56c4f93f1aac7157d647be8474b3e110754242021-09-20 9:29:311 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x29ff753fce24905daa40c774b10af99fdca56c4f93f1aac7157d647be8474b3e110754242021-09-20 9:29:311 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x488aaf0f2f415b7319d44382473e693b3b8863436224ae1629a6504640e52f89110754242021-09-20 9:29:311 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x488aaf0f2f415b7319d44382473e693b3b8863436224ae1629a6504640e52f89110754242021-09-20 9:29:311 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xc014e59ec2907807b34055bab38978d2625eb5fe3f866cc517864ea365f87038110754242021-09-20 9:29:311 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xc014e59ec2907807b34055bab38978d2625eb5fe3f866cc517864ea365f87038110754242021-09-20 9:29:311 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xf39b68371a3f0f93890596e81636b1e79c6307cd016757e5176fcecb549e3f62110754222021-09-20 9:29:251 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.