Contract 0x0000000000000000000000000000000000001005 6

 

Contract Overview

BSC: Relayer Incentivize
Balance:
33.253392622370022741 BNB

BNB Value:
$12,532.87 (@ $376.89/BNB)

Token:
My Name Tag:
Not Available, login to update

ContractCreator:
GENESIS at txn GENESIS_0000000000000000000000000000000000001005
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xadb91cdbf1f0f044c7642b4ea429a0f94f927fd087ad4bb9588ce5d31f198c0fClaim Relayer Re...145701462022-01-21 22:01:1749 mins ago0xcd5bb60460bc11e6fd6d6ee83e114c5f2d868ed4 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x1bd48ed2962ab1309eb31e0460e8204fa084ba002045b17906f4633142a3d5cdClaim Relayer Re...145700672022-01-21 21:57:1953 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x96f1edea34f80a25eea54a17bf528a70e2fad6b8cd7679de035cc1d8fe00e8f0Claim Relayer Re...145698032022-01-21 21:43:171 hr 7 mins ago0xf2e544cc51e488cf4d51b9f4efc6733c6eb56855 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x3d45a392bab58e35ae2ce613811f754d7cd60fe3e57125fe7a81b6abbda39817Claim Relayer Re...145693442022-01-21 21:20:171 hr 30 mins ago0x2b96fec3ae577bd41356362c339e514b68dbbcfd IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x02cfc6cce8b7f39f7bdb0cafb41daee3f9d32c00914f28f46e9c7c1e7bbdc754Claim Relayer Re...145693142022-01-21 21:18:471 hr 31 mins ago0x8bac29188a3851f99dee9db84c8b128adca8e701 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x9ed572e6dc5a9844dee843d98b39d52decf7334594d10856e6f9a42f76f58679Claim Relayer Re...145677432022-01-21 20:00:112 hrs 50 mins ago0xcd5bb60460bc11e6fd6d6ee83e114c5f2d868ed4 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xf021958acda54b35325a22afe0e41ac4fffc875c5188aeab062e73f80e5b820aClaim Relayer Re...145673042022-01-21 19:38:123 hrs 12 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xb281af8e571fef582243c1b37e4246033b7f16235b0fc646fbe2e50af7366f8aClaim Relayer Re...145667232022-01-21 19:09:093 hrs 41 mins ago0x2b96fec3ae577bd41356362c339e514b68dbbcfd IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xb5b7520814aec2fc6262f71a3bb1cb0b404267882561d860445e4b108267a287Claim Relayer Re...145660432022-01-21 18:35:094 hrs 15 mins ago0x8bac29188a3851f99dee9db84c8b128adca8e701 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x09534abb805d8b8b2428e7180055f7f509fb37746a98bf2ba59c6e3ad04f9c66Claim Relayer Re...145651662022-01-21 17:51:184 hrs 59 mins ago0xcd5bb60460bc11e6fd6d6ee83e114c5f2d868ed4 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x9b442af466605fdaf9afef62a2b2a247d1f8e0d24dfb59e7ccf594d079095447Claim Relayer Re...145640942022-01-21 16:57:055 hrs 53 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xb9e0ce633154a10dcaf91bc80b97c33dda7a3bfbda27c7b0e8def49fab7e3448Claim Relayer Re...145635642022-01-21 16:30:346 hrs 20 mins ago0x2b96fec3ae577bd41356362c339e514b68dbbcfd IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x6711fb259c3f8b583a1c8e4cdd7655f5aef064d38abc52545a718c23cc1abf13Claim Relayer Re...145635542022-01-21 16:30:046 hrs 20 mins ago0x8bac29188a3851f99dee9db84c8b128adca8e701 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x25dd39bdfc6feaedbf20a6da0580dbeb41dacce2e3524157348d707672655da9Claim Relayer Re...145629232022-01-21 15:58:316 hrs 52 mins ago0xcd5bb60460bc11e6fd6d6ee83e114c5f2d868ed4 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x7c54354911648b1d32a4745f62f33e9db0f0c84d19f0380080571150f2ebead9Claim Relayer Re...145624532022-01-21 15:35:017 hrs 15 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xb6594a498745e3ac397b9a891bf4cfab8b883d06f710d519b0eb2c5ee85102dfClaim Relayer Re...145620632022-01-21 15:15:317 hrs 35 mins ago0x8bac29188a3851f99dee9db84c8b128adca8e701 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xa648186d816d018b7c54002ebec51b24c51ecbfee644d3af4d86e44e9d563079Claim Relayer Re...145615242022-01-21 14:48:308 hrs 2 mins ago0x2b96fec3ae577bd41356362c339e514b68dbbcfd IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x7fce25f1541c732c32d779f4bccab2ece9cc9062f88c9c1451597d3f260d9c03Claim Relayer Re...145608632022-01-21 14:15:278 hrs 35 mins ago0xcd5bb60460bc11e6fd6d6ee83e114c5f2d868ed4 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xabf45408c1be3070dea67b9567fe149f32901b4a32481f523054cac809400065Claim Relayer Re...145604532022-01-21 13:54:278 hrs 56 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0x30af2f8223b79415e5a023d4a622bf66f1d4a9ca6d84c74e9f49c1b98c20bc1bClaim Relayer Re...145603532022-01-21 13:49:279 hrs 1 min ago0x8bac29188a3851f99dee9db84c8b128adca8e701 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xe30fd6fee6a72740078b6dab4b434dbe31813bec47fb68a793ca9549b0367846Claim Relayer Re...145590162022-01-21 12:42:3510 hrs 8 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000124839694
0x72796d92f54359ce8ca9029f34b2b6d07db088cf327e1fc44a6dd81a3d577769Claim Relayer Re...145590162022-01-21 12:42:3510 hrs 8 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000124839694
0x159686b8ee59ec6c1c748fc59d28d31f0da7c8b0ef8483879e2ddae61f30efe6Claim Relayer Re...145590162022-01-21 12:42:3510 hrs 8 mins ago0x4050e15a478122cd2e07acb374c09356bb04f9a5 IN  BSC: Relayer Incentivize0 BNB0.000118447532
0xb406bc853b47a5a97e7cd6b6c4c980e2b010a045553d139fa78479faf498c8efClaim Relayer Re...145589392022-01-21 12:38:4410 hrs 11 mins ago0x2b96fec3ae577bd41356362c339e514b68dbbcfd IN  BSC: Relayer Incentivize0 BNB0.000124839694
0xf7100939e52d335b0772cc6628ab45647c4c7199b3d8bc6572659501d56bd75bClaim Relayer Re...145589392022-01-21 12:38:4410 hrs 11 mins ago0x2b96fec3ae577bd41356362c339e514b68dbbcfd IN  BSC: Relayer Incentivize0 BNB0.000118447532
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2c01545fa286c17c7087f6fb0dce48c3e5daa34148e117f65c0490fe44d17b94145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x2c01545fa286c17c7087f6fb0dce48c3e5daa34148e117f65c0490fe44d17b94145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x3c2ff6fda29c072ebcfa95743b6768bb8a03dde1c169cc0b0aa1a6afd409cca1145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x3c2ff6fda29c072ebcfa95743b6768bb8a03dde1c169cc0b0aa1a6afd409cca1145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x2290257034f6acfb6a2d9410396746cb33bc5bcdad7a2de336a169775a49b1e5145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x2290257034f6acfb6a2d9410396746cb33bc5bcdad7a2de336a169775a49b1e5145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xee7b39a4d776c7ec4d3fb86a82b1c3b3297ab8ba540a5ecb90b592e044977c93145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xee7b39a4d776c7ec4d3fb86a82b1c3b3297ab8ba540a5ecb90b592e044977c93145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xeefe466ca8b9b2aef0a50277a1382d4c5a21a30c87e884156d3adb415f52aea3145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xeefe466ca8b9b2aef0a50277a1382d4c5a21a30c87e884156d3adb415f52aea3145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x0e60941840c5c16f197dbe3fb6628bda2dc041ec6403d87372c517ae67d8a113145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x0e60941840c5c16f197dbe3fb6628bda2dc041ec6403d87372c517ae67d8a113145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x0e92a2f0a47dd575b68cbf7254d1a7fe232a6fd64a690ac09eaac7392476ad6d145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x0e92a2f0a47dd575b68cbf7254d1a7fe232a6fd64a690ac09eaac7392476ad6d145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xd370d4d08b5c45318cf80e171bf2ba8eb1a262e56c781fa3609937915756f458145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xd370d4d08b5c45318cf80e171bf2ba8eb1a262e56c781fa3609937915756f458145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xd057736658f01590c649d23ebef2422644dbbe4ed2778ff4b6d33e9abb21235a145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xd057736658f01590c649d23ebef2422644dbbe4ed2778ff4b6d33e9abb21235a145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xa6d112ead431569412493b3cfa398abc17c2059c4c7daa2e4391a27f87585468145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xa6d112ead431569412493b3cfa398abc17c2059c4c7daa2e4391a27f87585468145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x68c2e12c30bafb5ffab7df9668d5452258a64e481956a338819ccc7155ff8360145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0x68c2e12c30bafb5ffab7df9668d5452258a64e481956a338819ccc7155ff8360145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0xa5de3564257c351e2404037ee3e40eca342c129a2da6b482d1196ff9b74eeebf145711002022-01-21 22:49:151 min ago BSC: System Reward BSC: Relayer Incentivize0.001 BNB
0xa5de3564257c351e2404037ee3e40eca342c129a2da6b482d1196ff9b74eeebf145711002022-01-21 22:49:151 min ago BSC: Token Hub BSC: Relayer Incentivize0.004 BNB
0x4a2fdc31650312d64384520b1419b847511f14c025d9ebebb9d9e437362557d1145711002022-01-21 22:49:151 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.