Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 141 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Airdrop | 20711389 | 146 days ago | IN | 0 ETH | 0.00011809 | ||||
Claim Airdrop | 20711387 | 146 days ago | IN | 0 ETH | 0.00013748 | ||||
Claim Airdrop | 20583908 | 164 days ago | IN | 0 ETH | 0.00017438 | ||||
Claim Airdrop | 20154249 | 224 days ago | IN | 0 ETH | 0.00025288 | ||||
Claim Airdrop | 18982318 | 388 days ago | IN | 0 ETH | 0.00242578 | ||||
Claim Airdrop | 18945258 | 393 days ago | IN | 0 ETH | 0.00164637 | ||||
Claim Airdrop | 18458027 | 462 days ago | IN | 0 ETH | 0.00198419 | ||||
Claim Airdrop | 18367375 | 474 days ago | IN | 0 ETH | 0.00065821 | ||||
Claim Airdrop | 18285451 | 486 days ago | IN | 0 ETH | 0.00150337 | ||||
Claim Airdrop | 18191399 | 499 days ago | IN | 0 ETH | 0.00083655 | ||||
Claim Airdrop | 18191383 | 499 days ago | IN | 0 ETH | 0.00101071 | ||||
Claim Airdrop | 18191378 | 499 days ago | IN | 0 ETH | 0.00085458 | ||||
Claim Airdrop | 18070527 | 516 days ago | IN | 0 ETH | 0.00083631 | ||||
Claim Airdrop | 18070324 | 516 days ago | IN | 0 ETH | 0.00067642 | ||||
Claim Airdrop | 18070301 | 516 days ago | IN | 0 ETH | 0.00067951 | ||||
Claim Airdrop | 18044197 | 520 days ago | IN | 0 ETH | 0.001267 | ||||
Claim Airdrop | 17951155 | 533 days ago | IN | 0 ETH | 0.00181302 | ||||
Claim Airdrop | 17938705 | 534 days ago | IN | 0 ETH | 0.00266835 | ||||
Claim Airdrop | 17911374 | 538 days ago | IN | 0 ETH | 0.00151193 | ||||
Claim Airdrop | 17906474 | 539 days ago | IN | 0 ETH | 0.0017454 | ||||
Claim Airdrop | 17887136 | 542 days ago | IN | 0 ETH | 0.00121448 | ||||
Claim Airdrop | 17887135 | 542 days ago | IN | 0 ETH | 0.00244438 | ||||
Claim Airdrop | 17701636 | 568 days ago | IN | 0 ETH | 0.00077584 | ||||
Claim Airdrop | 17701628 | 568 days ago | IN | 0 ETH | 0.00079594 | ||||
Claim Airdrop | 17683989 | 570 days ago | IN | 0 ETH | 0.00186498 |
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16849364 | 688 days ago | Contract Creation | 0 ETH | |||
16849364 | 688 days ago | Contract Creation | 0 ETH | |||
16849364 | 688 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ERC20Token
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; import { StorageBase } from './StorageBase.sol'; import { NonReentrant } from './NonReentrant.sol'; import { ERC20TokenAutoProxy } from './ERC20TokenAutoProxy.sol'; import { LibClaimAirdrop } from './libraries/LibClaimAirdrop.sol'; import { IERC20Token } from './interfaces/IERC20Token.sol'; import { IGovernedProxy } from './interfaces/IGovernedProxy.sol'; import { IERC20TokenStorage } from './interfaces/IERC20TokenStorage.sol'; import { IGovernedContract } from './interfaces/IGovernedContract.sol'; import { IERC20TokenGovernedProxy } from './interfaces/IERC20TokenGovernedProxy.sol'; contract ERC20TokenStorage is StorageBase, IERC20TokenStorage { string private name; string private symbol; uint8 private decimals; address private airdropService; // Signs ERC20 airdrop rewards claims address private eRC721ManagerProxy; // Can burn tokens // ERC20 airdrops lastClaimNonce mappings are stored by airdropId mapping(bytes4 => mapping(address => uint256)) private airdropLastClaimNonce; constructor( address _airdropService, address _eRC721ManagerProxy, string memory _name, string memory _symbol, uint8 _decimals ) public { airdropService = _airdropService; eRC721ManagerProxy = _eRC721ManagerProxy; name = _name; symbol = _symbol; decimals = _decimals; } function getName() external view returns (string memory _name) { _name = name; } function getSymbol() external view returns (string memory _symbol) { _symbol = symbol; } function getDecimals() external view returns (uint8 _decimals) { _decimals = decimals; } function getAirdropService() external view returns (address _airdropService) { _airdropService = airdropService; } function getERC721ManagerProxy() external view returns (address _eRC721ManagerProxy) { _eRC721ManagerProxy = eRC721ManagerProxy; } function getAirdropLastClaimNonce(bytes4 airdropId, address _user) external view returns (uint256 _lastClaimNonce) { _lastClaimNonce = airdropLastClaimNonce[airdropId][_user]; } function setName(string calldata _name) external requireOwner { name = _name; } function setSymbol(string calldata _symbol) external requireOwner { symbol = _symbol; } function setDecimals(uint8 _decimals) external requireOwner { decimals = _decimals; } function setAirdropService(address _airdropService) external requireOwner { airdropService = _airdropService; } function setERC721ManagerProxy(address _eRC721ManagerProxy) external requireOwner { eRC721ManagerProxy = _eRC721ManagerProxy; } function setAirdropLastClaimNonce( bytes4 airdropId, address _user, uint256 _lastClaimNonce ) external requireOwner { airdropLastClaimNonce[airdropId][_user] = _lastClaimNonce; } } contract ERC20Token is NonReentrant, ERC20TokenAutoProxy, IERC20Token { // Data for migration //--------------------------------- ERC20TokenStorage public eRC20TokenStorage; //--------------------------------- modifier onlyERC20TokenOwner() { require(_callerAddress() == owner, 'ERC20Token: FORBIDDEN'); _; } modifier onlyERC20TokenOwnerOrERC721Manager() { require( _callerAddress() == owner || msg.sender == address( IGovernedProxy(address(uint160(eRC20TokenStorage.getERC721ManagerProxy()))) .impl() ), 'ERC20Token: FORBIDDEN' ); _; } constructor( address _proxy, // If set to address(0), ERC20TokenGovernedProxy will be deployed by ERC20TokenAutoProxy address _airdropService, address _eRC721ManagerProxy, address _owner, string memory _name, string memory _symbol, uint8 _decimals ) public ERC20TokenAutoProxy(_proxy, this, _owner) { // Deploy ERC20 Token storage eRC20TokenStorage = new ERC20TokenStorage( _airdropService, _eRC721ManagerProxy, _name, _symbol, _decimals ); } // Governance functions // // This function allows to set sporkProxy address after deployment in order to enable upgrades function setSporkProxy(address payable _sporkProxy) public onlyERC20TokenOwner { IERC20TokenGovernedProxy(proxy).setSporkProxy(_sporkProxy); } // This function is called in order to upgrade to a new implementation function destroy(IGovernedContract _newImpl) external requireProxy { eRC20TokenStorage.setOwner(_newImpl); _destroyERC20(_newImpl); _destroy(_newImpl); } // This function would be called on the new implementation if necessary for the upgrade function migrate(IGovernedContract _oldImpl) external requireProxy { _migrateERC20(address(_oldImpl)); _migrate(_oldImpl); } // Getter functions // function name() external view returns (string memory _name) { _name = eRC20TokenStorage.getName(); } function symbol() external view returns (string memory _symbol) { _symbol = eRC20TokenStorage.getSymbol(); } function decimals() external view returns (uint8 _decimals) { _decimals = eRC20TokenStorage.getDecimals(); } function getAirdropService() external view returns (address _airdropService) { _airdropService = eRC20TokenStorage.getAirdropService(); } function getAirdropLastClaimNonce(bytes4 airdropId, address _user) external view returns (uint256 _lastClaimNonce) { _lastClaimNonce = eRC20TokenStorage.getAirdropLastClaimNonce(airdropId, _user); } // Setter functions // function setName(string calldata _name) external onlyERC20TokenOwner { eRC20TokenStorage.setName(_name); } function setSymbol(string calldata _symbol) external onlyERC20TokenOwner { eRC20TokenStorage.setSymbol(_symbol); } function setDecimals(uint8 _decimals) external onlyERC20TokenOwner { eRC20TokenStorage.setDecimals(_decimals); } function setAirdropService(address _airdropService) external onlyERC20TokenOwner { eRC20TokenStorage.setAirdropService(_airdropService); } function setERC721ManagerProxy(address _eRC721ManagerProxy) external onlyERC20TokenOwner { eRC20TokenStorage.setERC721ManagerProxy(_eRC721ManagerProxy); } // Mint/burn functions // function mint(address recipient, uint256 amount) external onlyERC20TokenOwner { _mint(recipient, amount); IERC20TokenGovernedProxy(proxy).emitTransfer(address(0x0), recipient, amount); } function burn(address account, uint256 amount) external onlyERC20TokenOwnerOrERC721Manager { _burn(account, amount); IERC20TokenGovernedProxy(proxy).emitTransfer(account, address(0x0), amount); } // ERC20 airdrop and airdrop referral rewards claim function function claimAirdrop( uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce, bytes calldata airdropServiceSignature ) external noReentry { // Get rewards recipient address address recipient = _callerAddress(); // Make sure claim has not been processed yet require( lastClaimNonce == eRC20TokenStorage.getAirdropLastClaimNonce(airdropId, recipient), 'ERC20Token: invalid lastClaimNonce value' ); // Check that claimNonce > lastClaimNonce require( lastClaimNonce < claimNonce, 'ERC20Token: claimNonce must be larger than lastClaimNonce' ); // Validate airdrop claim LibClaimAirdrop.validateClaim( recipient, // Referral rewards claim recipient address claimAmountAirdrop, // Claim amount corresponding to ERC20 airdrop claimAmountReferral1, // Claim amount corresponding to first level of ERC20 airdrop referral rewards claimAmountReferral2, // Claim amount corresponding to second level of ERC20 airdrop referral rewards claimAmountReferral3, // Claim amount corresponding to third level of ERC20 airdrop referral rewards airdropId, // Airdrop campaign Id lastClaimNonce, // Recipient's last claim nonce claimNonce, // Recipient's current claim nonce airdropServiceSignature, // Claim signature from ERC20 airdrop service proxy, // Verifying contract address eRC20TokenStorage.getAirdropService() // Airdrop service address ); // Update recipient's last claim nonce to current claim nonce eRC20TokenStorage.setAirdropLastClaimNonce(airdropId, recipient, claimNonce); // Mint total claim amount to recipient mintAirdropClaim( recipient, claimAmountAirdrop, claimAmountReferral1, claimAmountReferral2, claimAmountReferral3 ); // Emit AirdropRewardsClaimed event IERC20TokenGovernedProxy(proxy).emitAirdropRewardsClaimed( recipient, claimAmountAirdrop, claimAmountReferral1, claimAmountReferral2, claimAmountReferral3, airdropId, lastClaimNonce, claimNonce, airdropServiceSignature ); } function mintAirdropClaim( address recipient, uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3 ) private { // Calculate total claim amount uint256 totalClaimAmount = claimAmountAirdrop .add(claimAmountReferral1) .add(claimAmountReferral2) .add(claimAmountReferral3); // Mint total claim amount to recipient _mint(recipient, totalClaimAmount); // Emit Transfer event IERC20TokenGovernedProxy(proxy).emitTransfer(address(0x0), recipient, totalClaimAmount); } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; /** * @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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; library LibSignature { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert('LibSignature: invalid ECDSA signature length'); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, 'LibSignature: invalid ECDSA signature `s` value' ); // If the signature is valid (and not malleable), return the signer address // v > 30 is a special case, we need to adjust hash with '\x19Ethereum Signed Message:\n32' // and v = v - 4 address signer; if (v > 30) { require(v - 4 == 27 || v - 4 == 28, 'LibSignature: invalid ECDSA signature `v` value'); signer = ecrecover(toEthSignedMessageHash(hash), v - 4, r, s); } else { require(v == 27 || v == 28, 'LibSignature: invalid ECDSA signature `v` value'); signer = ecrecover(hash, v, r, s); } require(signer != address(0), 'LibSignature: invalid ECDSA signature'); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', hash)); } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; library LibEIP712 { // Calculates EIP712 encoding for a hash struct in this EIP712 Domain. // Note that we use the verifying contract's proxy address here instead of the verifying contract's address, // so that users signatures remain valid when we upgrade the ERC20Token contract function hashEIP712Message(bytes32 hashStruct, address verifyingContractProxy) internal pure returns (bytes32 result) { uint256 chainId; assembly { chainId := chainid() } bytes32 eip712DomainHash = keccak256( abi.encode( keccak256( 'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)' ), keccak256(bytes('Energi')), keccak256(bytes('1')), chainId, verifyingContractProxy ) ); result = keccak256(abi.encodePacked('\x19\x01', eip712DomainHash, hashStruct)); } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; import { LibEIP712 } from './LibEIP712.sol'; import { LibSignature } from './LibSignature.sol'; library LibClaimAirdrop { bytes32 constant AIRDROP_CLAIM_TYPEHASH = keccak256( 'ERC20Claim(address recipient,uint256 claimAmountAirdrop,uint256 claimAmountReferral1,uint256 claimAmountReferral2,uint256 claimAmountReferral3,bytes4 airdropId,uint256 lastClaimNonce,uint256 claimNonce)' ); function hashClaim( address recipient, uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce ) internal pure returns (bytes32) { return keccak256( abi.encode( AIRDROP_CLAIM_TYPEHASH, recipient, claimAmountAirdrop, claimAmountReferral1, claimAmountReferral2, claimAmountReferral3, airdropId, lastClaimNonce, claimNonce ) ); } function validateClaim( address recipient, uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce, bytes memory airdropServiceSignature, address verifyingContractProxy, address airdropService ) internal pure { // Generate EIP712 hashStruct of airdropClaim bytes32 hashStruct = hashClaim( recipient, claimAmountAirdrop, claimAmountReferral1, claimAmountReferral2, claimAmountReferral3, airdropId, lastClaimNonce, claimNonce ); // Verify claim EIP712 hashStruct signature if ( LibSignature.recover( LibEIP712.hashEIP712Message(hashStruct, verifyingContractProxy), airdropServiceSignature ) != airdropService ) { revert('LibClaimAirdrop: EIP-712 airdrop service signature verification error'); } } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; import { IProposal } from './IProposal.sol'; import { IGovernedContract } from './IGovernedContract.sol'; contract IUpgradeProposal is IProposal { function impl() external view returns (IGovernedContract); }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; import { IGovernedContract } from './IGovernedContract.sol'; import { IUpgradeProposal } from './IUpgradeProposal.sol'; interface ISporkRegistry { function createUpgradeProposal( IGovernedContract _impl, uint256 _period, address payable _fee_payer ) external payable returns (IUpgradeProposal); function consensusGasLimits() external view returns (uint256 callGas, uint256 xferGas); }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; interface IProposal { function parent() external view returns (address); function created_block() external view returns (uint256); function deadline() external view returns (uint256); function fee_payer() external view returns (address payable); function fee_amount() external view returns (uint256); function accepted_weight() external view returns (uint256); function rejected_weight() external view returns (uint256); function total_weight() external view returns (uint256); function quorum_weight() external view returns (uint256); function isFinished() external view returns (bool); function isAccepted() external view returns (bool); function withdraw() external; function destroy() external; function collect() external; function voteAccept() external; function voteReject() external; function setFee() external payable; function canVote(address owner) external view returns (bool); }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; interface IOwnedERC20 { function owner() external view returns (address _owner); function setOwner(address _owner) external; function mint(address recipient, uint256 amount) external; function burn(address recipient, uint256 amount) external; }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; import { IGovernedContract } from './IGovernedContract.sol'; import { IUpgradeProposal } from './IUpgradeProposal.sol'; interface IGovernedProxy { event UpgradeProposal(IGovernedContract indexed impl, IUpgradeProposal proposal); event Upgraded(IGovernedContract indexed impl, IUpgradeProposal proposal); function impl() external view returns (IGovernedContract); function proposeUpgrade(IGovernedContract _newImpl, uint256 _period) external payable returns (IUpgradeProposal); function upgrade(IUpgradeProposal _proposal) external; function upgradeProposalImpl(IUpgradeProposal _proposal) external view returns (IGovernedContract new_impl); function listUpgradeProposals() external view returns (IUpgradeProposal[] memory proposals); function collectUpgradeProposal(IUpgradeProposal _proposal) external; function() external payable; }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; interface IGovernedERC20Storage { function setBalance(address _owner, uint256 _amount) external; function setAllowance( address _owner, address _spender, uint256 _amount ) external; function setTotalSupply(uint256 _amount) external; function getBalance(address _account) external view returns (uint256 balance); function getAllowance(address _owner, address _spender) external view returns (uint256 allowance); function getTotalSupply() external view returns (uint256 totalSupply); }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IGovernedERC20 { function erc20Storage() external view returns (address _erc20Storage); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer( address sender, address recipient, uint256 amount ) external returns (bool); function approve( address owner, address spender, uint256 amount ) external returns (bool); function transferFrom( address spender, address sender, address recipient, uint256 amount ) external returns (bool); function increaseAllowance( address sender, address spender, uint256 addedValue ) external returns (bool); function decreaseAllowance( address sender, address spender, uint256 subtractedValue ) external returns (bool); }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; /** * Genesis version of GovernedContract interface. * * Base Consensus interface for upgradable contracts. * Unlike common approach, the implementation is NOT expected to be * called through delegatecall() to minimize risks of shared storage. * * NOTE: it MUST NOT change after blockchain launch! */ interface IGovernedContract { // Return actual proxy address for secure validation function proxy() external view returns (address); // It must check that the caller is the proxy // and copy all required data from the old address. function migrate(IGovernedContract _oldImpl) external; // It must check that the caller is the proxy // and self destruct to the new address. function destroy(IGovernedContract _newImpl) external; // function () external payable; // This line (from original Energi IGovernedContract) is commented because it // makes truffle migrations fail }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; interface IERC20TokenStorage { function getName() external view returns (string memory _name); function getSymbol() external view returns (string memory _symbol); function getDecimals() external view returns (uint8 _decimals); function getAirdropService() external view returns (address _airdropService); function getAirdropLastClaimNonce(bytes4 airdropId, address _user) external view returns (uint256 _lastClaimNonce); function getERC721ManagerProxy() external view returns (address _eRC721ManagerProxy); function setName(string calldata _name) external; function setSymbol(string calldata _symbol) external; function setDecimals(uint8 _decimals) external; function setAirdropService(address _airdropService) external; function setAirdropLastClaimNonce( bytes4 airdropId, address _user, uint256 _lastClaimNonce ) external; function setERC721ManagerProxy(address _eRC721ManagerProxy) external; }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; interface IERC20TokenGovernedProxy { event AirdropRewardsClaimed( address indexed recipient, uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce, bytes airdropServiceSignature ); // ERC20 events event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function setSporkProxy(address payable _sporkProxy) external; function emitAirdropRewardsClaimed( address recipient, uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce, bytes calldata airdropServiceSignature ) external; function emitTransfer( address from, address to, uint256 value ) external; // ERC20 standard interface function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function decimals() external view returns (uint256 _decimals); function balanceOf(address account) external view returns (uint256 _balance); function allowance(address owner, address spender) external view returns (uint256 _allowance); function totalSupply() external view returns (uint256 _totalSupply); function approve(address spender, uint256 value) external returns (bool result); function transfer(address to, uint256 value) external returns (bool result); function transferFrom( address from, address to, uint256 value ) external returns (bool result); function increaseAllowance(address spender, uint256 addedValue) external returns (bool result); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool result); }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; interface IERC20Token { function eRC20TokenStorage() external view returns (address _eRC20TokenStorage); function name() external view returns (string memory _name); function symbol() external view returns (string memory _symbol); function decimals() external view returns (uint8 _decimals); function getAirdropService() external view returns (address _airdropService); function getAirdropLastClaimNonce(bytes4 airdropId, address _user) external view returns (uint256 _lastClaimNonce); // Setter functions // function setName(string calldata _name) external; function setSymbol(string calldata _symbol) external; function setDecimals(uint8 _decimals) external; function setAirdropService(address _airdropService) external; function setERC721ManagerProxy(address _eRC721ManagerProxy) external; // Mint/burn functions // function mint(address recipient, uint256 amount) external; function burn(address account, uint256 amount) external; // ERC20 airdrop and airdrop referral rewards claim function function claimAirdrop( uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce, bytes calldata airdropServiceSignature ) external; }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; import { IGovernedContract } from './interfaces/IGovernedContract.sol'; /** * Base for contract storage (SC-14). * * NOTE: it MUST NOT change after blockchain launch! */ contract StorageBase { address payable internal owner; modifier requireOwner() { require(msg.sender == address(owner), 'Not owner!'); _; } constructor() public { owner = msg.sender; } function setOwner(IGovernedContract _newOwner) external requireOwner { owner = address(uint160(address(_newOwner))); } function kill() external requireOwner { selfdestruct(msg.sender); } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; import { Context } from './Context.sol'; import { Ownable } from './Ownable.sol'; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Context, Ownable { /** * @dev Emitted when pause() is called. * @param account of contract owner issuing the event. * @param unpauseBlock block number when contract will be unpaused. */ event Paused(address account, uint256 unpauseBlock); /** * @dev Emitted when pause is lifted by unpause() by * @param account. */ event Unpaused(address account); /** * @dev state variable */ uint256 public blockNumberWhenToUnpause = 0; constructor(address _owner) public Ownable(_owner) {} /** * @dev Modifier to make a function callable only when the contract is not * paused. It checks whether the current block number * has already reached blockNumberWhenToUnpause. */ modifier whenNotPaused() { require( block.number >= blockNumberWhenToUnpause, 'Pausable: Revert - Code execution is still paused' ); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require( block.number < blockNumberWhenToUnpause, 'Pausable: Revert - Code execution is not paused' ); _; } /** * @dev Triggers or extends pause state. * * Requirements: * * - @param blocks needs to be greater than 0. */ function pause(uint256 blocks) external onlyOwner { require( blocks > 0, 'Pausable: Revert - Pause did not activate. Please enter a positive integer.' ); blockNumberWhenToUnpause = block.number + blocks; emit Paused(_msgSender(), blockNumberWhenToUnpause); } /** * @dev Returns to normal code execution. */ function unpause() external onlyOwner { blockNumberWhenToUnpause = block.number; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of 'user permissions'. */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor(address _owner) public { owner = _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner, 'Ownable: Not owner'); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0), 'Ownable: Zero address not allowed'); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; /** * A little helper to protect contract from being re-entrant in state * modifying functions. */ contract NonReentrant { uint256 private entry_guard; modifier noReentry() { require(entry_guard == 0, 'Reentry'); entry_guard = 1; _; entry_guard = 0; } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; import { Pausable } from './Pausable.sol'; import { GovernedContract } from './GovernedContract.sol'; import { StorageBase } from './StorageBase.sol'; import { Context } from './Context.sol'; import { IGovernedERC20 } from './interfaces/IGovernedERC20.sol'; import { IGovernedContract } from './interfaces/IGovernedContract.sol'; import { IGovernedERC20Storage } from './interfaces/IGovernedERC20Storage.sol'; import { SafeMath } from './libraries/SafeMath.sol'; /** * Permanent storage of GovernedERC20 data. */ contract GovernedERC20Storage is StorageBase, IGovernedERC20Storage { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; function setBalance(address _owner, uint256 _amount) external requireOwner { _balances[_owner] = _amount; } function setAllowance( address _owner, address _spender, uint256 _amount ) external requireOwner { _allowances[_owner][_spender] = _amount; } function setTotalSupply(uint256 _amount) external requireOwner { _totalSupply = _amount; } function getBalance(address _account) external view returns (uint256 balance) { balance = _balances[_account]; } function getAllowance(address _owner, address _spender) external view returns (uint256 allowance) { allowance = _allowances[_owner][_spender]; } function getTotalSupply() external view returns (uint256 totalSupply) { totalSupply = _totalSupply; } } contract GovernedERC20 is Pausable, GovernedContract, IGovernedERC20 { using SafeMath for uint256; // Data for migration //--------------------------------- GovernedERC20Storage public erc20Storage; //--------------------------------- constructor(address _proxy, address _owner) public Pausable(_owner) GovernedContract(_proxy) { erc20Storage = new GovernedERC20Storage(); } // IGovernedContract //--------------------------------- // This function would be called by GovernedProxy on an old implementation to replace it with a new one function _destroyERC20(IGovernedContract _newImpl) internal { erc20Storage.setOwner(_newImpl); } //--------------------------------- // This function would be called on the new implementation if necessary for the upgrade function _migrateERC20(address _oldImpl) internal { erc20Storage = GovernedERC20Storage(IGovernedERC20(_oldImpl).erc20Storage()); } // ERC20 //--------------------------------- /** * @dev See {IERC20-totalSupply}. */ function totalSupply() external view returns (uint256) { return erc20Storage.getTotalSupply(); } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) external view returns (uint256) { return erc20Storage.getBalance(account); } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) external view returns (uint256) { return erc20Storage.getAllowance(owner, spender); } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer( address sender, address recipient, uint256 amount ) external requireProxy returns (bool) { _transfer(sender, recipient, amount); return true; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve( address owner, address spender, uint256 amount ) external requireProxy returns (bool) { _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom( address spender, address sender, address recipient, uint256 amount ) external requireProxy returns (bool) { _transfer(sender, recipient, amount); uint256 approveAmount = erc20Storage.getAllowance(sender, spender).sub( amount, 'ERC20Token ERC20: transfer amount exceeds allowance' ); _approve(sender, spender, approveAmount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance( address owner, address spender, uint256 addedValue ) external requireProxy returns (bool) { uint256 approveAmount = erc20Storage.getAllowance(owner, spender).add(addedValue); _approve(owner, spender, approveAmount); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance( address owner, address spender, uint256 subtractedValue ) external requireProxy returns (bool) { uint256 approveAmount = erc20Storage.getAllowance(owner, spender).sub( subtractedValue, 'ERC20Token ERC20: decreased allowance below zero' ); _approve(owner, spender, approveAmount); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal whenNotPaused { require(sender != address(0), 'ERC20Token ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20Token ERC20: transfer to the zero address'); erc20Storage.setBalance( sender, erc20Storage.getBalance(sender).sub( amount, 'ERC20Token ERC20: transfer amount exceeds balance' ) ); erc20Storage.setBalance(recipient, erc20Storage.getBalance(recipient).add(amount)); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal whenNotPaused { require(account != address(0), 'ERC20Token ERC20: mint to the zero address'); erc20Storage.setTotalSupply(erc20Storage.getTotalSupply().add(amount)); erc20Storage.setBalance(account, erc20Storage.getBalance(account).add(amount)); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal whenNotPaused { require(account != address(0), 'ERC20Token ERC20: burn from the zero address'); erc20Storage.setBalance( account, erc20Storage.getBalance(account).sub( amount, 'ERC20Token ERC20: burn amount exceeds balance' ) ); erc20Storage.setTotalSupply(erc20Storage.getTotalSupply().sub(amount)); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal whenNotPaused { require(owner != address(0), 'ERC20Token ERC20: approve from the zero address'); require(spender != address(0), 'ERC20Token ERC20: approve to the zero address'); erc20Storage.setAllowance(owner, spender, amount); } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; import { IGovernedContract } from './interfaces/IGovernedContract.sol'; /** * Genesis version of GovernedContract common base. * * Base Consensus interface for upgradable contracts. * Unlike common approach, the implementation is NOT expected to be * called through delegatecall() to minimize risks of shared storage. * * NOTE: it MUST NOT change after blockchain launch! */ contract GovernedContract is IGovernedContract { address public proxy; constructor(address _proxy) public { proxy = _proxy; } modifier requireProxy() { require(msg.sender == proxy, 'Governed Contract: Not proxy'); _; } function getProxy() internal view returns (address _proxy) { _proxy = proxy; } // Function overridden in child contract function migrate(IGovernedContract _oldImpl) external requireProxy { _migrate(_oldImpl); } // Function overridden in child contract function destroy(IGovernedContract _newImpl) external requireProxy { _destroy(_newImpl); } // solium-disable-next-line no-empty-blocks function _migrate(IGovernedContract) internal {} function _destroy(IGovernedContract _newImpl) internal { selfdestruct(address(uint160(address(_newImpl)))); } function _callerAddress() internal view returns (address payable) { if (msg.sender == proxy) { // This is guarantee of the GovernedProxy // solium-disable-next-line security/no-tx-origin return tx.origin; } else { return msg.sender; } } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core // Energi Governance system is the fundamental part of Energi Core. // NOTE: It's not allowed to change the compiler due to byte-to-byte // match requirement. pragma solidity 0.5.16; import { NonReentrant } from './NonReentrant.sol'; import { SafeMath } from './libraries/SafeMath.sol'; import { IERC20TokenGovernedProxy } from './interfaces/IERC20TokenGovernedProxy.sol'; import { IGovernedContract } from './interfaces/IGovernedContract.sol'; import { IGovernedProxy } from './interfaces/IGovernedProxy.sol'; import { IUpgradeProposal } from './interfaces/IUpgradeProposal.sol'; import { ISporkRegistry } from './interfaces/ISporkRegistry.sol'; import { IGovernedERC20 } from './interfaces/IGovernedERC20.sol'; import { IOwnedERC20 } from './interfaces/IOwnedERC20.sol'; import { IERC20Token } from './interfaces/IERC20Token.sol'; /** * SC-9: This contract has no chance of being updated. It must be stupid simple. * * If another upgrade logic is required in the future - it can be done as proxy stage II. */ contract ERC20TokenGovernedProxy is IERC20TokenGovernedProxy, IGovernedProxy, NonReentrant { using SafeMath for uint256; IGovernedContract public impl; IGovernedContract public implementation; // only used for block explorers to detect contract as a proxy IGovernedProxy public spork_proxy; mapping(address => IGovernedContract) public upgrade_proposals; IUpgradeProposal[] public upgrade_proposal_list; modifier senderOrigin() { // Internal calls are expected to use impl directly. // That's due to use of call() instead of delegatecall() on purpose. // solium-disable-next-line security/no-tx-origin require(tx.origin == msg.sender, 'Only direct calls are allowed!'); _; } modifier onlyImpl() { require(msg.sender == address(impl), 'Only calls from impl are allowed!'); _; } constructor(IGovernedContract _impl) public { impl = _impl; implementation = _impl; // to allow block explorers to find the impl contract } function setSporkProxy(address payable _sporkProxy) external onlyImpl { spork_proxy = IGovernedProxy(_sporkProxy); } function emitAirdropRewardsClaimed( address recipient, uint256 claimAmountAirdrop, uint256 claimAmountReferral1, uint256 claimAmountReferral2, uint256 claimAmountReferral3, bytes4 airdropId, uint256 lastClaimNonce, uint256 claimNonce, bytes calldata airdropServiceSignature ) external onlyImpl { emit AirdropRewardsClaimed( recipient, claimAmountAirdrop, claimAmountReferral1, claimAmountReferral2, claimAmountReferral3, airdropId, lastClaimNonce, claimNonce, airdropServiceSignature ); } function emitTransfer( address from, address to, uint256 value ) external onlyImpl { emit Transfer(from, to, value); } function emitApproval( address owner, address spender, uint256 value ) external onlyImpl { emit Approval(owner, spender, value); } // ERC20 standard functions // function name() external view returns (string memory _name) { _name = IERC20Token(address(uint160(address(impl)))).name(); } function symbol() external view returns (string memory _symbol) { _symbol = IERC20Token(address(uint160(address(impl)))).symbol(); } function decimals() external view returns (uint256 _decimals) { _decimals = IERC20Token(address(uint160(address(impl)))).decimals(); } function balanceOf(address account) external view returns (uint256 _balance) { _balance = IGovernedERC20(address(uint160(address(impl)))).balanceOf(account); } function allowance(address owner, address spender) external view returns (uint256 _allowance) { _allowance = IGovernedERC20(address(uint160(address(impl)))).allowance(owner, spender); } function totalSupply() external view returns (uint256 _totalSupply) { _totalSupply = IGovernedERC20(address(uint160(address(impl)))).totalSupply(); } function approve(address spender, uint256 value) external returns (bool result) { result = IGovernedERC20(address(uint160(address(impl)))).approve( msg.sender, spender, value ); emit Approval(msg.sender, spender, value); } function transfer(address to, uint256 value) external returns (bool result) { result = IGovernedERC20(address(uint160(address(impl)))).transfer(msg.sender, to, value); emit Transfer(msg.sender, to, value); } function transferFrom( address from, address to, uint256 value ) external returns (bool result) { result = IGovernedERC20(address(uint160(address(impl)))).transferFrom( msg.sender, from, to, value ); emit Transfer(from, to, value); uint256 newApproveAmount = IGovernedERC20(address(uint160(address(impl)))).allowance( from, msg.sender ); emit Approval(from, msg.sender, newApproveAmount); } function increaseAllowance(address spender, uint256 addedValue) external returns (bool result) { result = IGovernedERC20(address(uint160(address(impl)))).increaseAllowance( msg.sender, spender, addedValue ); uint256 newApproveAmount = IGovernedERC20(address(uint160(address(impl)))).allowance( msg.sender, spender ); emit Approval(msg.sender, spender, newApproveAmount); } function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool result) { result = IGovernedERC20(address(uint160(address(impl)))).decreaseAllowance( msg.sender, spender, subtractedValue ); uint256 newApproveAmount = IGovernedERC20(address(uint160(address(impl)))).allowance( msg.sender, spender ); emit Approval(msg.sender, spender, newApproveAmount); } // OwnedERC20 functions // function mint(address recipient, uint256 amount) external { IOwnedERC20(address(uint160(address(impl)))).mint(recipient, amount); } function burn(address recipient, uint256 amount) external { IOwnedERC20(address(uint160(address(impl)))).burn(recipient, amount); } // Governance functions // /** * Pre-create a new contract first. * Then propose upgrade based on that. */ function proposeUpgrade(IGovernedContract _newImpl, uint256 _period) external payable senderOrigin noReentry returns (IUpgradeProposal) { require(_newImpl != impl, 'Already active!'); require(_newImpl.proxy() == address(this), 'Wrong proxy!'); ISporkRegistry spork_reg = ISporkRegistry(address(spork_proxy.impl())); IUpgradeProposal proposal = spork_reg.createUpgradeProposal.value(msg.value)( _newImpl, _period, msg.sender ); upgrade_proposals[address(proposal)] = _newImpl; upgrade_proposal_list.push(proposal); emit UpgradeProposal(_newImpl, proposal); return proposal; } /** * Once proposal is accepted, anyone can activate that. */ function upgrade(IUpgradeProposal _proposal) external noReentry { IGovernedContract new_impl = upgrade_proposals[address(_proposal)]; require(new_impl != impl, 'Already active!'); // in case it changes in the flight require(address(new_impl) != address(0), 'Not registered!'); require(_proposal.isAccepted(), 'Not accepted!'); IGovernedContract old_impl = impl; new_impl.migrate(old_impl); impl = new_impl; implementation = new_impl; old_impl.destroy(new_impl); // SECURITY: prevent downgrade attack _cleanupProposal(_proposal); // Return fee ASAP _proposal.destroy(); emit Upgraded(new_impl, _proposal); } /** * Map proposal to implementation */ function upgradeProposalImpl(IUpgradeProposal _proposal) external view returns (IGovernedContract new_impl) { new_impl = upgrade_proposals[address(_proposal)]; } /** * Lists all available upgrades */ function listUpgradeProposals() external view returns (IUpgradeProposal[] memory proposals) { uint256 len = upgrade_proposal_list.length; proposals = new IUpgradeProposal[](len); for (uint256 i = 0; i < len; ++i) { proposals[i] = upgrade_proposal_list[i]; } return proposals; } /** * Once proposal is reject, anyone can start collect procedure. */ function collectUpgradeProposal(IUpgradeProposal _proposal) external noReentry { IGovernedContract new_impl = upgrade_proposals[address(_proposal)]; require(address(new_impl) != address(0), 'Not registered!'); _proposal.collect(); delete upgrade_proposals[address(_proposal)]; _cleanupProposal(_proposal); } function _cleanupProposal(IUpgradeProposal _proposal) internal { delete upgrade_proposals[address(_proposal)]; uint256 len = upgrade_proposal_list.length; for (uint256 i = 0; i < len; ++i) { if (upgrade_proposal_list[i] == _proposal) { upgrade_proposal_list[i] = upgrade_proposal_list[len - 1]; upgrade_proposal_list.pop(); break; } } } /** * Related to above */ function proxy() external view returns (address) { return address(this); } /** * SECURITY: prevent on-behalf-of calls */ function transferFrom( address, address, address, uint256 ) external pure { revert('Good try'); } /** * SECURITY: prevent on-behalf-of calls */ function increaseAllowance( address, address, uint256 ) external pure { revert('Good try'); } /** * SECURITY: prevent on-behalf-of calls */ function decreaseAllowance( address, address, uint256 ) external pure { revert('Good try'); } /** * SECURITY: prevent on-behalf-of calls */ function transfer( address, address, uint256 ) external pure { revert('Good try'); } /** * SECURITY: prevent on-behalf-of calls */ function approve( address, address, uint256 ) external pure { revert('Good try'); } /** * SECURITY: prevent on-behalf-of calls */ function migrate(IGovernedContract) external pure { revert('Good try'); } /** * SECURITY: prevent on-behalf-of calls */ function destroy(IGovernedContract) external pure { revert('Good try'); } /** * Proxy all other calls to implementation. */ function() external payable senderOrigin { // SECURITY: senderOrigin() modifier is mandatory // A dummy delegatecall opcode in the fallback function is necessary for // block explorers to pick up the Energi proxy-implementation pattern if (false) { (bool success, bytes memory data) = address(0).delegatecall( abi.encodeWithSignature('') ); require( success && !success && data.length == 0 && data.length != 0, 'ERC20TokenGovernedProxy: delegatecall cannot be used' ); } IGovernedContract impl_m = impl; // solium-disable-next-line security/no-inline-assembly assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize) let res := call(sub(gas, 10000), impl_m, callvalue, ptr, calldatasize, 0, 0) // NOTE: returndatasize should allow repeatable calls // what should save one opcode. returndatacopy(ptr, 0, returndatasize) switch res case 0 { revert(ptr, returndatasize) } default { return(ptr, returndatasize) } } } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; import { IGovernedContract } from './interfaces/IGovernedContract.sol'; import { GovernedERC20 } from './GovernedERC20.sol'; import { ERC20TokenGovernedProxy } from './ERC20TokenGovernedProxy.sol'; contract ERC20TokenAutoProxy is GovernedERC20 { constructor( address _proxy, IGovernedContract _impl, address _owner ) public GovernedERC20(_proxy, _owner) { if (_proxy == address(0)) { _proxy = address(new ERC20TokenGovernedProxy(_impl)); } proxy = _proxy; } }
// SPDX-License-Identifier: MIT // Copyright 2023 Energi Core pragma solidity 0.5.16; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _txOrigin() internal view returns (address payable) { return tx.origin; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_proxy","type":"address"},{"internalType":"address","name":"_airdropService","type":"address"},{"internalType":"address","name":"_eRC721ManagerProxy","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"unpauseBlock","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blockNumberWhenToUnpause","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"claimAmountAirdrop","type":"uint256"},{"internalType":"uint256","name":"claimAmountReferral1","type":"uint256"},{"internalType":"uint256","name":"claimAmountReferral2","type":"uint256"},{"internalType":"uint256","name":"claimAmountReferral3","type":"uint256"},{"internalType":"bytes4","name":"airdropId","type":"bytes4"},{"internalType":"uint256","name":"lastClaimNonce","type":"uint256"},{"internalType":"uint256","name":"claimNonce","type":"uint256"},{"internalType":"bytes","name":"airdropServiceSignature","type":"bytes"}],"name":"claimAirdrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IGovernedContract","name":"_newImpl","type":"address"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eRC20TokenStorage","outputs":[{"internalType":"contract ERC20TokenStorage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"erc20Storage","outputs":[{"internalType":"contract GovernedERC20Storage","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"airdropId","type":"bytes4"},{"internalType":"address","name":"_user","type":"address"}],"name":"getAirdropLastClaimNonce","outputs":[{"internalType":"uint256","name":"_lastClaimNonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAirdropService","outputs":[{"internalType":"address","name":"_airdropService","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IGovernedContract","name":"_oldImpl","type":"address"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proxy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_airdropService","type":"address"}],"name":"setAirdropService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"setDecimals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_eRC721ManagerProxy","type":"address"}],"name":"setERC721ManagerProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_sporkProxy","type":"address"}],"name":"setSporkProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006002553480156200001657600080fd5b506040516200693638038062006936833981810160405260e08110156200003c57600080fd5b81516020830151604080850151606086015160808701805193519597949692959194919392820192846401000000008211156200007857600080fd5b9083019060208201858111156200008e57600080fd5b8251640100000000811182820188101715620000a957600080fd5b82525081516020918201929091019080838360005b83811015620000d8578181015183820152602001620000be565b50505050905090810190601f168015620001065780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200012a57600080fd5b9083019060208201858111156200014057600080fd5b82516401000000008111828201881017156200015b57600080fd5b82525081516020918201929091019080838360005b838110156200018a57818101518382015260200162000170565b50505050905090810190601f168015620001b85780820380516001836020036101000a031916815260200191505b50604081905260209190910151600180546001600160a01b03808a166001600160a01b03199283161790925560038054928d1692909116919091179055925088915030908690839082906200020d906200041d565b604051809103906000f0801580156200022a573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b03928316179055851615159150620002959050578160405162000263906200042b565b6001600160a01b03909116815260405190819003602001906000f08015801562000291573d6000803e3d6000fd5b5092505b82600360006101000a8154816001600160a01b0302191690836001600160a01b031602179055505050508585848484604051620002d29062000439565b6001600160a01b038087168252851660208083019190915260ff8316608083015260a06040830181815286519184019190915285519091606084019160c085019188019080838360005b83811015620003365781810151838201526020016200031c565b50505050905090810190601f168015620003645780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015620003995781810151838201526020016200037f565b50505050905090810190601f168015620003c75780820380516001836020036101000a031916815260200191505b50975050505050505050604051809103906000f080158015620003ee573d6000803e3d6000fd5b50600580546001600160a01b0319166001600160a01b0392909216919091179055506200044795505050505050565b61043e806200376683390190565b6121878062003ba483390190565b610c0b8062005d2b83390190565b61330f80620004576000396000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c80638d2c45f51161010f578063ce5494bb116100a2578063e62c204d11610071578063e62c204d14610757578063ec5568891461077d578063f2fde38b14610785578063fee24e50146107ab576101ef565b8063ce5494bb14610697578063d73b1dc9146106bd578063dd62ed3e146106f3578063e1f21c6714610721576101ef565b8063b51fa167116100de578063b51fa1671461057d578063b84c824614610585578063beabacc8146105f3578063c47f002714610629576101ef565b80638d2c45f51461051b5780638da5cb5b1461054157806395d89b41146105495780639dc29fac14610551576101ef565b806340c10f19116101875780636d5af8bc116101565780636d5af8bc1461040a57806370a08231146104305780637a1395aa146104565780638002a4d214610476576101ef565b806340c10f191461037c5780634bc597b9146103a8578063590d9ac3146103cc5780636c43a2ca146103d4576101ef565b806318160ddd116101c357806318160ddd14610306578063236cfcdd14610320578063313ce567146103565780633f4ba83a14610374576101ef565b8062f55d9d146101f457806306fdde031461021c578063136439dd1461029957806315dacbea146102b6575b600080fd5b61021a6004803603602081101561020a57600080fd5b50356001600160a01b03166107b3565b005b61022461087b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025e578181015183820152602001610246565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61021a600480360360208110156102af57600080fd5b50356109b0565b6102f2600480360360808110156102cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610a9a565b604080519115158252519081900360200190f35b61030e610bbf565b60408051918252519081900360200190f35b61030e6004803603604081101561033657600080fd5b5080356001600160e01b03191690602001356001600160a01b0316610c41565b61035e610cd5565b6040805160ff9092168252519081900360200190f35b61021a610d1a565b61021a6004803603604081101561039257600080fd5b506001600160a01b038135169060200135610db8565b6103b0610e94565b604080516001600160a01b039092168252519081900360200190f35b6103b0610ea3565b6102f2600480360360608110156103ea57600080fd5b506001600160a01b03813581169160208101359091169060400135610eb2565b61021a6004803603602081101561042057600080fd5b50356001600160a01b0316610fb2565b61030e6004803603602081101561044657600080fd5b50356001600160a01b0316611078565b61021a6004803603602081101561046c57600080fd5b503560ff166110fd565b61021a600480360361010081101561048d57600080fd5b8135916020810135916040820135916060810135916001600160e01b03196080830135169160a08101359160c08201359190810190610100810160e0820135600160201b8111156104dd57600080fd5b8201836020820111156104ef57600080fd5b803590602001918460018302840111600160201b8311171561051057600080fd5b5090925090506111a9565b61021a6004803603602081101561053157600080fd5b50356001600160a01b031661155a565b6103b0611605565b610224611614565b61021a6004803603604081101561056757600080fd5b506001600160a01b038135169060200135611659565b61030e611814565b61021a6004803603602081101561059b57600080fd5b810190602081018135600160201b8111156105b557600080fd5b8201836020820111156105c757600080fd5b803590602001918460018302840111600160201b831117156105e857600080fd5b50909250905061181a565b6102f26004803603606081101561060957600080fd5b506001600160a01b038135811691602081013590911690604001356118ee565b61021a6004803603602081101561063f57600080fd5b810190602081018135600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460018302840111600160201b8311171561068c57600080fd5b509092509050611953565b61021a600480360360208110156106ad57600080fd5b50356001600160a01b0316611a27565b6102f2600480360360608110156106d357600080fd5b506001600160a01b03813581169160208101359091169060400135611a86565b61030e6004803603604081101561070957600080fd5b506001600160a01b0381358116916020013516611b4e565b6102f26004803603606081101561073757600080fd5b506001600160a01b03813581169160208101359091169060400135611ba9565b61021a6004803603602081101561076d57600080fd5b50356001600160a01b0316611c04565b6103b0611caf565b61021a6004803603602081101561079b57600080fd5b50356001600160a01b0316611cbe565b6103b0611db3565b6003546001600160a01b03163314610800576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b600554604080516313af403560e01b81526001600160a01b038481166004830152915191909216916313af403591602480830192600092919082900301818387803b15801561084e57600080fd5b505af1158015610862573d6000803e3d6000fd5b5050505061086f81611df8565b61087881611e4a565b50565b600554604080516305f5f79f60e21b815290516060926001600160a01b0316916317d7de7c916004808301926000929190829003018186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156108fd57600080fd5b8101908080516040519392919084600160201b82111561091c57600080fd5b90830190602082018581111561093157600080fd5b8251600160201b81118282018810171561094a57600080fd5b82525081516020918201929091019080838360005b8381101561097757818101518382015260200161095f565b50505050905090810190601f1680156109a45780820380516001836020036101000a031916815260200191505b50604052505050905090565b6001546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b60008111610a435760405162461bcd60e51b815260040180806020018281038252604b815260200180612eb2604b913960600191505060405180910390fd5b4381016002557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d610a72611e56565b600254604080516001600160a01b03909316835260208301919091528051918290030190a150565b6003546000906001600160a01b03163314610aea576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b610af5848484611e5a565b6000610ba683604051806060016040528060338152602001612dbc603391396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528c8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b505afa158015610b81573d6000803e3d6000fd5b505050506040513d6020811015610b9757600080fd5b5051919063ffffffff6120de16565b9050610bb3858783612175565b50600195945050505050565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4e41b226040518163ffffffff1660e01b815260040160206040518083038186803b158015610c0f57600080fd5b505afa158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b505190505b90565b6005546040805163236cfcdd60e01b81526001600160e01b0319851660048201526001600160a01b0384811660248301529151600093929092169163236cfcdd91604480820192602092909190829003018186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d6020811015610ccc57600080fd5b50519392505050565b60055460408051633c05076160e21b815290516000926001600160a01b03169163f0141d84916004808301926020929190829003018186803b158015610c0f57600080fd5b6001546001600160a01b03163314610d6e576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b436002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610d9b611e56565b604080516001600160a01b039092168252519081900360200190a1565b6001546001600160a01b0316610dcc6122a1565b6001600160a01b031614610e15576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b610e1f82826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b03868116602484015260448301869052925192909316926323de66519260648084019382900301818387803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050505050565b6004546001600160a01b031681565b6005546001600160a01b031681565b6003546000906001600160a01b03163314610f02576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6004805460408051630af4187d60e01b81526001600160a01b038881169482019490945286841660248201529051600093610f9a938793911691630af4187d91604480820192602092909190829003018186803b158015610f6257600080fd5b505afa158015610f76573d6000803e3d6000fd5b505050506040513d6020811015610f8c57600080fd5b50519063ffffffff61249816565b9050610fa7858583612175565b506001949350505050565b6001546001600160a01b0316610fc66122a1565b6001600160a01b03161461100f576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051631b56be2f60e21b81526001600160a01b03848116600483015291519190921691636d5af8bc91602480830192600092919082900301818387803b15801561105d57600080fd5b505af1158015611071573d6000803e3d6000fd5b5050505050565b600480546040805163f8b2cb4f60e01b81526001600160a01b038581169482019490945290516000939092169163f8b2cb4f91602480820192602092909190829003018186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d60208110156110f557600080fd5b505192915050565b6001546001600160a01b03166111116122a1565b6001600160a01b03161461115a576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051633d09cad560e11b815260ff8416600482015290516001600160a01b0390921691637a1395aa9160248082019260009290919082900301818387803b15801561105d57600080fd5b600054156111e8576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160009081556111f76122a1565b6005546040805163236cfcdd60e01b81526001600160e01b03198a1660048201526001600160a01b038085166024830152915193945091169163236cfcdd91604480820192602092909190829003018186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d602081101561128057600080fd5b505185146112bf5760405162461bcd60e51b8152600401808060200182810382526028815260200180612e8a6028913960400191505060405180910390fd5b8385106112fd5760405162461bcd60e51b815260040180806020018281038252603981526020018061308a6039913960400191505060405180910390fd5b6113bb818b8b8b8b8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060035460055460408051630fee24e560e41b815290516001600160a01b03938416955092909116925063fee24e50916004808301926020929190829003018186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d60208110156113b457600080fd5b50516124f9565b60055460408051635521f9b960e01b81526001600160e01b0319891660048201526001600160a01b0384811660248301526044820188905291519190921691635521f9b991606480830192600092919082900301818387803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b50505050611445818b8b8b8b61257d565b600360009054906101000a90046001600160a01b03166001600160a01b03166390d6001a828c8c8c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401808b6001600160a01b03166001600160a01b031681526020018a8152602001898152602001888152602001878152602001866001600160e01b0319166001600160e01b0319168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509b505050505050505050505050600060405180830381600087803b15801561153257600080fd5b505af1158015611546573d6000803e3d6000fd5b505060008055505050505050505050505050565b6001546001600160a01b031661156e6122a1565b6001600160a01b0316146115b7576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60035460408051638d2c45f560e01b81526001600160a01b03848116600483015291519190921691638d2c45f591602480830192600092919082900301818387803b15801561105d57600080fd5b6001546001600160a01b031681565b60055460408051631507040160e01b815290516060926001600160a01b0316916315070401916004808301926000929190829003018186803b1580156108c057600080fd5b6001546001600160a01b031661166d6122a1565b6001600160a01b031614806117715750600560009054906101000a90046001600160a01b03166001600160a01b031663925c5b626040518163ffffffff1660e01b815260040160206040518083038186803b1580156116cb57600080fd5b505afa1580156116df573d6000803e3d6000fd5b505050506040513d60208110156116f557600080fd5b505160408051638abf607760e01b815290516001600160a01b0390921691638abf607791600480820192602092909190829003018186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d602081101561176357600080fd5b50516001600160a01b031633145b6117b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6117ba8282612626565b600354604080516323de665160e01b81526001600160a01b0385811660048301526000602483018190526044830186905292519316926323de66519260648084019391929182900301818387803b158015610e7857600080fd5b60025481565b6001546001600160a01b031661182e6122a1565b6001600160a01b031614611877576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b600554604051635c26412360e11b8152602060048201908152602482018490526001600160a01b039092169163b84c824691859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546000906001600160a01b0316331461193e576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484611e5a565b5060019392505050565b6001546001600160a01b03166119676122a1565b6001600160a01b0316146119b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460405163c47f002760e01b8152602060048201908152602482018490526001600160a01b039092169163c47f002791859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546001600160a01b03163314611a74576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611a7d81612859565b61087881610878565b6003546000906001600160a01b03163314611ad6576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6000610f9a83604051806060016040528060308152602001612f48603091396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528a8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b6004805460408051630af4187d60e01b81526001600160a01b03868116948201949094528484166024820152905160009390921691630af4187d91604480820192602092909190829003018186803b158015610ca257600080fd5b6003546000906001600160a01b03163314611bf9576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484612175565b6001546001600160a01b0316611c186122a1565b6001600160a01b031614611c61576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6005546040805163e62c204d60e01b81526001600160a01b0384811660048301529151919092169163e62c204d91602480830192600092919082900301818387803b15801561105d57600080fd5b6003546001600160a01b031681565b6001546001600160a01b03163314611d12576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b6001600160a01b038116611d575760405162461bcd60e51b8152600401808060200182810382526021815260200180612efd6021913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60055460408051630fee24e560e41b815290516000926001600160a01b03169163fee24e50916004808301926020929190829003018186803b158015610c0f57600080fd5b60048054604080516313af403560e01b81526001600160a01b0385811694820194909452905192909116916313af40359160248082019260009290919082900301818387803b15801561105d57600080fd5b806001600160a01b0316ff5b3390565b600254431015611e9b5760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b038316611ee05760405162461bcd60e51b81526004018080602001828103825260308152602001806131156030913960400191505060405180910390fd5b6001600160a01b038216611f255760405162461bcd60e51b815260040180806020018281038252602e8152602001806131e3602e913960400191505060405180910390fd5b600454604080516060810190915260318082526001600160a01b039092169163e30443bc918691611fab918691612f786020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038d8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612072918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156120c157600080fd5b505af11580156120d5573d6000803e3d6000fd5b50505050505050565b6000818484111561216d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213257818101518382015260200161211a565b50505050905090810190601f16801561215f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6002544310156121b65760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0383166121fb5760405162461bcd60e51b815260040180806020018281038252602f815260200180612ffb602f913960400191505060405180910390fd5b6001600160a01b0382166122405760405162461bcd60e51b815260040180806020018281038252602d8152602001806130e8602d913960400191505060405180910390fd5b6004805460408051633691826360e21b81526001600160a01b03878116948201949094528584166024820152604481018590529051929091169163da46098c9160648082019260009290919082900301818387803b1580156120c157600080fd5b6003546000906001600160a01b03163314156122be575032610c3e565b5033610c3e565b6002544310156123065760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b03821661234b5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f1e602a913960400191505060405180910390fd5b60048054604080516362720d9160e11b815290516001600160a01b039092169263f7ea7a3d9261239b928692869263c4e41b22928083019260209291829003018186803b158015610f6257600080fd5b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123d157600080fd5b505af11580156123e5573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612449918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e7857600080fd5b6000828201838110156124f2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600061250b8c8c8c8c8c8c8c8c6128e0565b9050816001600160a01b031661252a6125248386612970565b86612a7e565b6001600160a01b03161461256f5760405162461bcd60e51b81526004018080602001828103825260458152602001806131456045913960600191505060405180910390fd5b505050505050505050505050565b60006125a1826125958581898963ffffffff61249816565b9063ffffffff61249816565b90506125ad86826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b038a8116602484015260448301869052925192909316926323de66519260648084019382900301818387803b15801561260657600080fd5b505af115801561261a573d6000803e3d6000fd5b50505050505050505050565b6002544310156126675760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0382166126ac5760405162461bcd60e51b815260040180806020018281038252602c81526020018061318a602c913960400191505060405180910390fd5b6004546040805160608101909152602d8082526001600160a01b039092169163e30443bc9185916127329186916131b66020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038c8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b505060048054604080516362720d9160e11b815290516001600160a01b03909216945063f7ea7a3d9350612823928692869263c4e41b229281810192602092909190829003018186803b1580156127eb57600080fd5b505afa1580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b50519063ffffffff612ae816565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e7857600080fd5b806001600160a01b0316634bc597b96040518163ffffffff1660e01b815260040160206040518083038186803b15801561289257600080fd5b505afa1580156128a6573d6000803e3d6000fd5b505050506040513d60208110156128bc57600080fd5b5051600480546001600160a01b0319166001600160a01b0390921691909117905550565b6000604051808061321160ca9139604080519182900360ca0182206020808401919091526001600160a01b039c909c1682820152606082019a909a526080810198909852505060a086019490945260c08501929092526001600160e01b03191660e08401526101008301526101208083019190915282518083039091018152610140909101909152805191012090565b60405160009046908290806052612fa982396040805191829003605201822082820182526006835265456e6572676960d01b6020938401528151808301835260018152603160f81b908401528151808401919091527fab646ac92b857c23e54eb792495c5eb5881f612f4dfd8c0ad27072e703f1e8c9818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101959095526001600160a01b0390961660a0808601919091528651808603909101815260c08501875280519082012061190160f01b60e086015260e2850152610102808501979097528551808503909701875261012290930190945250835193019290922092915050565b60008151604114612ac05760405162461bcd60e51b815260040180806020018281038252602c815260200180612e0f602c913960400191505060405180910390fd5b60208201516040830151606084015160001a612ade86828585612b2a565b9695505050505050565b60006124f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120de565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612b8b5760405162461bcd60e51b815260040180806020018281038252602f815260200180612e5b602f913960400191505060405180910390fd5b6000601e8560ff161115612c68576004850360ff16601b1480612bb457506004850360ff16601c145b612bef5760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6001612bfa87612d6a565b60048703868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612c57573d6000803e3d6000fd5b505050602060405103519050612d1c565b8460ff16601b1480612c7d57508460ff16601c145b612cb85760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6040805160008152602080820180845289905260ff8816828401526060820187905260808201869052915160019260a0808401939192601f1981019281900390910190855afa158015612d0f573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116612d615760405162461bcd60e51b81526004018080602001828103825260258152602001806130c36025913960400191505060405180910390fd5b95945050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c90910190915281519101209056fe4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433230546f6b656e3a20464f5242494444454e00000000000000000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206c656e677468476f7665726e656420436f6e74726163743a204e6f742070726f7879000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206073602076616c75654552433230546f6b656e3a20696e76616c6964206c617374436c61696d4e6f6e63652076616c75655061757361626c653a20526576657274202d20506175736520646964206e6f742061637469766174652e20506c6561736520656e746572206120706f73697469766520696e74656765722e4f776e61626c653a205a65726f2061646472657373206e6f7420616c6c6f7765644552433230546f6b656e2045524332303a206d696e7420746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294552433230546f6b656e2045524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206076602076616c75655061757361626c653a20526576657274202d20436f646520657865637574696f6e206973207374696c6c207061757365644552433230546f6b656e3a20636c61696d4e6f6e6365206d757374206265206c6172676572207468616e206c617374436c61696d4e6f6e63654c69625369676e61747572653a20696e76616c6964204543445341207369676e61747572654552433230546f6b656e2045524332303a20617070726f766520746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734c6962436c61696d41697264726f703a204549502d3731322061697264726f702073657276696365207369676e617475726520766572696669636174696f6e206572726f724552433230546f6b656e2045524332303a206275726e2066726f6d20746865207a65726f20616464726573734552433230546f6b656e2045524332303a206275726e20616d6f756e7420657863656564732062616c616e63654552433230546f6b656e2045524332303a207472616e7366657220746f20746865207a65726f20616464726573734552433230436c61696d286164647265737320726563697069656e742c75696e7432353620636c61696d416d6f756e7441697264726f702c75696e7432353620636c61696d416d6f756e74526566657272616c312c75696e7432353620636c61696d416d6f756e74526566657272616c322c75696e7432353620636c61696d416d6f756e74526566657272616c332c6279746573342061697264726f7049642c75696e74323536206c617374436c61696d4e6f6e63652c75696e7432353620636c61696d4e6f6e636529a265627a7a723158203708bd5c1812477eed2284dbba068121108ec29e81ed5e93fd2b454d46bbb7b964736f6c634300051000326080604052600080546001600160a01b03191633179055610419806100256000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063da46098c1161005b578063da46098c14610105578063e30443bc1461013b578063f7ea7a3d14610167578063f8b2cb4f1461018457610088565b80630af4187d1461008d57806313af4035146100cd57806341c0e1b5146100f5578063c4e41b22146100fd575b600080fd5b6100bb600480360360408110156100a357600080fd5b506001600160a01b03813581169160200135166101aa565b60408051918252519081900360200190f35b6100f3600480360360208110156100e357600080fd5b50356001600160a01b03166101d5565b005b6100f3610243565b6100bb610292565b6100f36004803603606081101561011b57600080fd5b506001600160a01b03813581169160208101359091169060400135610298565b6100f36004803603604081101561015157600080fd5b506001600160a01b038135169060200135610310565b6100f36004803603602081101561017d57600080fd5b5035610378565b6100bb6004803603602081101561019a57600080fd5b50356001600160a01b03166103c9565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b03163314610221576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461028f576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b33ff5b60035490565b6000546001600160a01b031633146102e4576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6001600160a01b0392831660009081526002602090815260408083209490951682529290925291902055565b6000546001600160a01b0316331461035c576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6001600160a01b03909116600090815260016020526040902055565b6000546001600160a01b031633146103c4576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600355565b6001600160a01b03166000908152600160205260409020549056fea265627a7a72315820a96c05ad5e9e2e183e1e9275f4eb5f365b33d20a3c9e68a7ac47d6516bcdfda464736f6c63430005100032608060405234801561001057600080fd5b506040516121873803806121878339818101604052602081101561003357600080fd5b5051600180546001600160a01b039092166001600160a01b03199283168117909155600280549092161790556121198061006e6000396000f3fe6080604052600436106102035760003560e01c80636fa09ab011610118578063a9059cbb116100a0578063d73b1dc91161006f578063d73b1dc91461070c578063dd62ed3e14610a42578063dd6a851d14610a7d578063e1f21c671461070c578063ec55688914610a9257610203565b8063a9059cbb146109a4578063b364595e146109dd578063beabacc81461070c578063ce5494bb1461037d57610203565b806390d6001a116100e757806390d6001a1461082757806395d89b41146108ea5780639dc29fac146108ff578063a1b0e47614610938578063a457c2d71461096b57610203565b80636fa09ab01461078257806370a08231146107ac5780638abf6077146107df5780638d2c45f5146107f457610203565b8063313ce5671161019b5780635687f2b81161016a5780635687f2b8146106885780635b6dee4c146106cb5780635c60da1b146106f75780636c43a2ca1461070c5780636d5b6c441461074f57610203565b8063313ce567146105b257806332e3a905146105c7578063395093511461061657806340c10f191461064f57610203565b806315dacbea116101d757806315dacbea146104bc57806318160ddd1461050557806323b872dd1461052c57806323de66511461056f57610203565b8062f55d9d1461037d57806306fdde03146103b25780630900f0101461043c578063095ea7b31461046f575b323314610257576040805162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206469726563742063616c6c732061726520616c6c6f776564210000604482015290519081900360640190fd5b610345565b6020831061027b5780518252601f19909201916020918201910161025c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146102db576040519150601f19603f3d011682016040523d82523d6000602084013e6102e0565b606091505b50915091508180156102f0575081155b80156102fb57508051155b80156103075750805115155b6103425760405162461bcd60e51b81526004018080602001828103825260348152602001806120706034913960400191505060405180910390fd5b50505b6001546040516001600160a01b03909116903660008237600080368334866127105a03f13d6000833e808015610379573d83f35b3d83fd5b34801561038957600080fd5b506103b0600480360360208110156103a057600080fd5b50356001600160a01b0316610aa7565b005b3480156103be57600080fd5b506103c7610adf565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104015781810151838201526020016103e9565b50505050905090810190601f16801561042e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044857600080fd5b506103b06004803603602081101561045f57600080fd5b50356001600160a01b0316610c16565b34801561047b57600080fd5b506104a86004803603604081101561049257600080fd5b506001600160a01b038135169060200135610f46565b604080519115158252519081900360200190f35b3480156104c857600080fd5b506103b0600480360360808110156104df57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610aa7565b34801561051157600080fd5b5061051a611009565b60408051918252519081900360200190f35b34801561053857600080fd5b506104a86004803603606081101561054f57600080fd5b506001600160a01b0381358116916020810135909116906040013561107f565b34801561057b57600080fd5b506103b06004803603606081101561059257600080fd5b506001600160a01b03813581169160208101359091169060400135611216565b3480156105be57600080fd5b5061051a6112af565b3480156105d357600080fd5b506105fa600480360360208110156105ea57600080fd5b50356001600160a01b0316611328565b604080516001600160a01b039092168252519081900360200190f35b34801561062257600080fd5b506104a86004803603604081101561063957600080fd5b506001600160a01b038135169060200135611343565b34801561065b57600080fd5b506103b06004803603604081101561067257600080fd5b506001600160a01b03813516906020013561148c565b34801561069457600080fd5b506103b0600480360360608110156106ab57600080fd5b506001600160a01b038135811691602081013590911690604001356114fd565b6105fa600480360360408110156106e157600080fd5b506001600160a01b038135169060200135611584565b34801561070357600080fd5b506105fa6118d7565b34801561071857600080fd5b506103b06004803603606081101561072f57600080fd5b506001600160a01b03813581169160208101359091169060400135610aa7565b34801561075b57600080fd5b506105fa6004803603602081101561077257600080fd5b50356001600160a01b03166118e6565b34801561078e57600080fd5b506105fa600480360360208110156107a557600080fd5b5035611904565b3480156107b857600080fd5b5061051a600480360360208110156107cf57600080fd5b50356001600160a01b031661192b565b3480156107eb57600080fd5b506105fa6119ae565b34801561080057600080fd5b506103b06004803603602081101561081757600080fd5b50356001600160a01b03166119bd565b34801561083357600080fd5b506103b0600480360361012081101561084b57600080fd5b6001600160a01b03823516916020810135916040820135916060810135916080820135916001600160e01b031960a0820135169160c08201359160e08101359181019061012081016101008201356401000000008111156108ab57600080fd5b8201836020820111156108bd57600080fd5b803590602001918460018302840111640100000000831117156108df57600080fd5b509092509050611a28565b3480156108f657600080fd5b506103c7611b33565b34801561090b57600080fd5b506103b06004803603604081101561092257600080fd5b506001600160a01b038135169060200135611b78565b34801561094457600080fd5b506103b06004803603602081101561095b57600080fd5b50356001600160a01b0316611bcd565b34801561097757600080fd5b506104a86004803603604081101561098e57600080fd5b506001600160a01b038135169060200135611cfa565b3480156109b057600080fd5b506104a8600480360360408110156109c757600080fd5b506001600160a01b038135169060200135611d59565b3480156109e957600080fd5b506109f2611e2e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a2e578181015183820152602001610a16565b505050509050019250505060405180910390f35b348015610a4e57600080fd5b5061051a60048036036040811015610a6557600080fd5b506001600160a01b0381358116916020013516611ec8565b348015610a8957600080fd5b506105fa611f54565b348015610a9e57600080fd5b506105fa611f63565b6040805162461bcd60e51b8152602060048201526008602482015267476f6f642074727960c01b604482015290519081900360640190fd5b600154604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301926000929190829003018186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610b6157600080fd5b8101908080516040519392919084640100000000821115610b8157600080fd5b908301906020820185811115610b9657600080fd5b8251640100000000811182820188101715610bb057600080fd5b82525081516020918201929091019080838360005b83811015610bdd578181015183820152602001610bc5565b50505050905090810190601f168015610c0a5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60005415610c55576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160008181556001600160a01b038084168252600460205260409091205491549181169116811415610cc1576040805162461bcd60e51b815260206004820152600f60248201526e416c7265616479206163746976652160881b604482015290519081900360640190fd5b6001600160a01b038116610d0e576040805162461bcd60e51b815260206004820152600f60248201526e4e6f7420726567697374657265642160881b604482015290519081900360640190fd5b816001600160a01b0316635051a5ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d4757600080fd5b505afa158015610d5b573d6000803e3d6000fd5b505050506040513d6020811015610d7157600080fd5b5051610db4576040805162461bcd60e51b815260206004820152600d60248201526c4e6f742061636365707465642160981b604482015290519081900360640190fd5b6001546040805163ce5494bb60e01b81526001600160a01b03928316600482018190529151919284169163ce5494bb9160248082019260009290919082900301818387803b158015610e0557600080fd5b505af1158015610e19573d6000803e3d6000fd5b5050600180546001600160a01b038087166001600160a01b031992831681179093556002805490921683179091556040805162f55d9d60e01b8152600481019390935251908516935062f55d9d9250602480830192600092919082900301818387803b158015610e8857600080fd5b505af1158015610e9c573d6000803e3d6000fd5b50505050610ea983611f67565b826001600160a01b03166383197ef06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ee457600080fd5b505af1158015610ef8573d6000803e3d6000fd5b5050604080516001600160a01b038781168252915191861693507f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c7925081900360200190a250506000805550565b6001546040805163e1f21c6760e01b81523360048201526001600160a01b038581166024830152604482018590529151600093929092169163e1f21c679160648082019260209290919082900301818787803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d6020811015610fcf57600080fd5b50516040805184815290519192506001600160a01b0385169133916000805160206120c5833981519152919081900360200190a392915050565b600154604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561104e57600080fd5b505afa158015611062573d6000803e3d6000fd5b505050506040513d602081101561107857600080fd5b5051919050565b60015460408051630aed65f560e11b81523360048201526001600160a01b038681166024830152858116604483015260648201859052915160009392909216916315dacbea9160848082019260209290919082900301818787803b1580156110e657600080fd5b505af11580156110fa573d6000803e3d6000fd5b505050506040513d602081101561111057600080fd5b50516040805184815290519192506001600160a01b0380861692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a360015460408051636eb1769f60e11b81526001600160a01b0387811660048301523360248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b1580156111b057600080fd5b505afa1580156111c4573d6000803e3d6000fd5b505050506040513d60208110156111da57600080fd5b505160408051828152905191925033916001600160a01b038816916000805160206120c5833981519152919081900360200190a3509392505050565b6001546001600160a01b0316331461125f5760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6001546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d602081101561131e57600080fd5b505160ff16919050565b6004602052600090815260409020546001600160a01b031681565b60015460408051633621d16560e11b81523360048201526001600160a01b0385811660248301526044820185905291516000939290921691636c43a2ca9160648082019260209290919082900301818787803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b505050506040513d60208110156113cc57600080fd5b505160015460408051636eb1769f60e11b81523360048201526001600160a01b0387811660248301529151939450600093919092169163dd62ed3e916044808301926020929190829003018186803b15801561142757600080fd5b505afa15801561143b573d6000803e3d6000fd5b505050506040513d602081101561145157600080fd5b50516040805182815290519192506001600160a01b0386169133916000805160206120c5833981519152919081900360200190a35092915050565b600154604080516340c10f1960e01b81526001600160a01b03858116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b1580156114e157600080fd5b505af11580156114f5573d6000803e3d6000fd5b505050505050565b6001546001600160a01b031633146115465760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b816001600160a01b0316836001600160a01b03166000805160206120c5833981519152836040518082815260200191505060405180910390a3505050565b60003233146115da576040805162461bcd60e51b815260206004820152601e60248201527f4f6e6c79206469726563742063616c6c732061726520616c6c6f776564210000604482015290519081900360640190fd5b60005415611619576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b60016000819055546001600160a01b0384811691161415611673576040805162461bcd60e51b815260206004820152600f60248201526e416c7265616479206163746976652160881b604482015290519081900360640190fd5b306001600160a01b0316836001600160a01b031663ec5568896040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b657600080fd5b505afa1580156116ca573d6000803e3d6000fd5b505050506040513d60208110156116e057600080fd5b50516001600160a01b03161461172c576040805162461bcd60e51b815260206004820152600c60248201526b57726f6e672070726f78792160a01b604482015290519081900360640190fd5b60035460408051638abf607760e01b815290516000926001600160a01b031691638abf6077916004808301926020929190829003018186803b15801561177157600080fd5b505afa158015611785573d6000803e3d6000fd5b505050506040513d602081101561179b57600080fd5b5051604080516362877ccd60e01b81526001600160a01b038781166004830152602482018790523360448301529151929350600092918416916362877ccd913491606480830192602092919082900301818588803b1580156117fc57600080fd5b505af1158015611810573d6000803e3d6000fd5b50505050506040513d602081101561182757600080fd5b50516001600160a01b0380821660008181526004602090815260408083208054958c166001600160a01b031996871681179091556005805460018101825594527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db09093018054909516841790945583519283529251939450927f812eb2689eecf94cfb55caf4a123ea76c6d93eef07dd54a5273b7a4949f7d763929181900390910190a260008055949350505050565b6002546001600160a01b031681565b6001600160a01b039081166000908152600460205260409020541690565b6005818154811061191157fe5b6000918252602090912001546001600160a01b0316905081565b600154604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561197c57600080fd5b505afa158015611990573d6000803e3d6000fd5b505050506040513d60208110156119a657600080fd5b505192915050565b6001546001600160a01b031681565b6001546001600160a01b03163314611a065760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314611a715760405162461bcd60e51b81526004018080602001828103825260218152602001806120a46021913960400191505060405180910390fd5b896001600160a01b03167f928751aabde843c1f88d22d1392d97ac696d9d71f6904a5a195bd37c489939348a8a8a8a8a8a8a8a8a604051808a8152602001898152602001888152602001878152602001866001600160e01b0319166001600160e01b0319168152602001858152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039c50909a5050505050505050505050a250505050505050505050565b600154604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301926000929190829003018186803b158015610b2457600080fd5b60015460408051632770a7eb60e21b81526001600160a01b0385811660048301526024820185905291519190921691639dc29fac91604480830192600092919082900301818387803b1580156114e157600080fd5b60005415611c0c576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160009081556001600160a01b03808316825260046020526040909120541680611c70576040805162461bcd60e51b815260206004820152600f60248201526e4e6f7420726567697374657265642160881b604482015290519081900360640190fd5b816001600160a01b031663e52253816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611cab57600080fd5b505af1158015611cbf573d6000803e3d6000fd5b5050506001600160a01b038316600090815260046020526040902080546001600160a01b031916905550611cf282611f67565b505060008055565b6001546040805163d73b1dc960e01b81523360048201526001600160a01b038581166024830152604482018590529151600093929092169163d73b1dc99160648082019260209290919082900301818787803b1580156113a257600080fd5b600154604080516317d5759960e31b81523360048201526001600160a01b038581166024830152604482018590529151600093929092169163beabacc89160648082019260209290919082900301818787803b158015611db857600080fd5b505af1158015611dcc573d6000803e3d6000fd5b505050506040513d6020811015611de257600080fd5b50516040805184815290519192506001600160a01b0385169133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a392915050565b60055460408051828152602080840282010190915260609190818015611e5e578160200160208202803883390190505b50915060005b81811015611ec35760058181548110611e7957fe5b9060005260206000200160009054906101000a90046001600160a01b0316838281518110611ea357fe5b6001600160a01b0390921660209283029190910190910152600101611e64565b505090565b60015460408051636eb1769f60e11b81526001600160a01b03858116600483015284811660248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b50519392505050565b6003546001600160a01b031681565b3090565b6001600160a01b038116600090815260046020526040812080546001600160a01b0319169055600554905b8181101561206a57826001600160a01b031660058281548110611fb157fe5b6000918252602090912001546001600160a01b031614156120625760056001830381548110611fdc57fe5b600091825260209091200154600580546001600160a01b03909216918390811061200257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600580548061203b57fe5b600082815260209020810160001990810180546001600160a01b031916905501905561206a565b600101611f92565b50505056fe4552433230546f6b656e476f7665726e656450726f78793a2064656c656761746563616c6c2063616e6e6f7420626520757365644f6e6c792063616c6c732066726f6d20696d706c2061726520616c6c6f776564218c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a723158202a0e4f802cfdc1a7b12d8d094db9ece470d5e9adedbbfef5cbce0c72c988f84064736f6c6343000510003260806040523480156200001157600080fd5b5060405162000c0b38038062000c0b833981810160405260a08110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b50604052602090810151600080546001600160a01b03199081163317909155600380546001600160a01b038b811661010002610100600160a81b03199092169190911790915560048054918a169190921617905585519093506200020e925060019186019062000244565b5081516200022490600290602085019062000244565b506003805460ff191660ff9290921691909117905550620002e992505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028757805160ff1916838001178555620002b7565b82800160010185558215620002b7579182015b82811115620002b75782518255916020019190600101906200029a565b50620002c5929150620002c9565b5090565b620002e691905b80821115620002c55760008155600101620002d0565b90565b61091280620002f96000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80637a1395aa1161008c578063c47f002711610066578063c47f002714610302578063e62c204d14610372578063f0141d8414610398578063fee24e50146103b6576100ea565b80637a1395aa1461024e578063925c5b621461026e578063b84c824614610292576100ea565b8063236cfcdd116100c8578063236cfcdd1461019c57806341c0e1b5146101e45780635521f9b9146101ec5780636d5af8bc14610228576100ea565b806313af4035146100ef578063150704011461011757806317d7de7c14610194575b600080fd5b6101156004803603602081101561010557600080fd5b50356001600160a01b03166103be565b005b61011f61042c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610159578181015183820152602001610141565b50505050905090810190601f1680156101865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61011f6104bf565b6101d2600480360360408110156101b257600080fd5b5080356001600160e01b03191690602001356001600160a01b031661051f565b60408051918252519081900360200190f35b610115610551565b6101156004803603606081101561020257600080fd5b506001600160e01b0319813516906001600160a01b0360208201351690604001356105a0565b6101156004803603602081101561023e57600080fd5b50356001600160a01b031661061d565b6101156004803603602081101561026457600080fd5b503560ff16610691565b6102766106f3565b604080516001600160a01b039092168252519081900360200190f35b610115600480360360208110156102a857600080fd5b8101906020810181356401000000008111156102c357600080fd5b8201836020820111156102d557600080fd5b803590602001918460018302840111640100000000831117156102f757600080fd5b509092509050610702565b6101156004803603602081101561031857600080fd5b81019060208101813564010000000081111561033357600080fd5b82018360208201111561034557600080fd5b8035906020019184600183028401116401000000008311171561036757600080fd5b50909250905061075f565b6101156004803603602081101561038857600080fd5b50356001600160a01b03166107b7565b6103a0610825565b6040805160ff9092168252519081900360200190f35b61027661082e565b6000546001600160a01b0316331461040a576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156104b55780601f1061048a576101008083540402835291602001916104b5565b820191906000526020600020905b81548152906001019060200180831161049857829003601f168201915b5050505050905090565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104b55780601f1061048a576101008083540402835291602001916104b5565b6001600160e01b031990911660009081526005602090815260408083206001600160a01b039094168352929052205490565b6000546001600160a01b0316331461059d576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b33ff5b6000546001600160a01b031633146105ec576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6001600160e01b031990921660009081526005602090815260408083206001600160a01b0390941683529290522055565b6000546001600160a01b03163314610669576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600380546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000546001600160a01b031633146106dd576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b6003805460ff191660ff92909216919091179055565b6004546001600160a01b031690565b6000546001600160a01b0316331461074e576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b61075a60028383610842565b505050565b6000546001600160a01b031633146107ab576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b61075a60018383610842565b6000546001600160a01b03163314610803576040805162461bcd60e51b815260206004820152600a6024820152694e6f74206f776e65722160b01b604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60035460ff1690565b60035461010090046001600160a01b031690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106108835782800160ff198235161785556108b0565b828001600101855582156108b0579182015b828111156108b0578235825591602001919060010190610895565b506108bc9291506108c0565b5090565b6108da91905b808211156108bc57600081556001016108c6565b9056fea265627a7a723158200fc338f9d34cf0ecc1b4331aa199443966291e3abc3efcfde170fc91bbbf87b864736f6c63430005100032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f8f9c3ff6d89671fcbc0b97c815dd77d83e541000000000000000000000000746d6afd192a9b2caa1fd437c5053c9f441e0eea000000000000000000000000069994c2670428aae9990c041ffbbd589952377700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c447261676f6e20426c6f6f64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024442000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ef5760003560e01c80638d2c45f51161010f578063ce5494bb116100a2578063e62c204d11610071578063e62c204d14610757578063ec5568891461077d578063f2fde38b14610785578063fee24e50146107ab576101ef565b8063ce5494bb14610697578063d73b1dc9146106bd578063dd62ed3e146106f3578063e1f21c6714610721576101ef565b8063b51fa167116100de578063b51fa1671461057d578063b84c824614610585578063beabacc8146105f3578063c47f002714610629576101ef565b80638d2c45f51461051b5780638da5cb5b1461054157806395d89b41146105495780639dc29fac14610551576101ef565b806340c10f19116101875780636d5af8bc116101565780636d5af8bc1461040a57806370a08231146104305780637a1395aa146104565780638002a4d214610476576101ef565b806340c10f191461037c5780634bc597b9146103a8578063590d9ac3146103cc5780636c43a2ca146103d4576101ef565b806318160ddd116101c357806318160ddd14610306578063236cfcdd14610320578063313ce567146103565780633f4ba83a14610374576101ef565b8062f55d9d146101f457806306fdde031461021c578063136439dd1461029957806315dacbea146102b6575b600080fd5b61021a6004803603602081101561020a57600080fd5b50356001600160a01b03166107b3565b005b61022461087b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025e578181015183820152602001610246565b50505050905090810190601f16801561028b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61021a600480360360208110156102af57600080fd5b50356109b0565b6102f2600480360360808110156102cc57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610a9a565b604080519115158252519081900360200190f35b61030e610bbf565b60408051918252519081900360200190f35b61030e6004803603604081101561033657600080fd5b5080356001600160e01b03191690602001356001600160a01b0316610c41565b61035e610cd5565b6040805160ff9092168252519081900360200190f35b61021a610d1a565b61021a6004803603604081101561039257600080fd5b506001600160a01b038135169060200135610db8565b6103b0610e94565b604080516001600160a01b039092168252519081900360200190f35b6103b0610ea3565b6102f2600480360360608110156103ea57600080fd5b506001600160a01b03813581169160208101359091169060400135610eb2565b61021a6004803603602081101561042057600080fd5b50356001600160a01b0316610fb2565b61030e6004803603602081101561044657600080fd5b50356001600160a01b0316611078565b61021a6004803603602081101561046c57600080fd5b503560ff166110fd565b61021a600480360361010081101561048d57600080fd5b8135916020810135916040820135916060810135916001600160e01b03196080830135169160a08101359160c08201359190810190610100810160e0820135600160201b8111156104dd57600080fd5b8201836020820111156104ef57600080fd5b803590602001918460018302840111600160201b8311171561051057600080fd5b5090925090506111a9565b61021a6004803603602081101561053157600080fd5b50356001600160a01b031661155a565b6103b0611605565b610224611614565b61021a6004803603604081101561056757600080fd5b506001600160a01b038135169060200135611659565b61030e611814565b61021a6004803603602081101561059b57600080fd5b810190602081018135600160201b8111156105b557600080fd5b8201836020820111156105c757600080fd5b803590602001918460018302840111600160201b831117156105e857600080fd5b50909250905061181a565b6102f26004803603606081101561060957600080fd5b506001600160a01b038135811691602081013590911690604001356118ee565b61021a6004803603602081101561063f57600080fd5b810190602081018135600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460018302840111600160201b8311171561068c57600080fd5b509092509050611953565b61021a600480360360208110156106ad57600080fd5b50356001600160a01b0316611a27565b6102f2600480360360608110156106d357600080fd5b506001600160a01b03813581169160208101359091169060400135611a86565b61030e6004803603604081101561070957600080fd5b506001600160a01b0381358116916020013516611b4e565b6102f26004803603606081101561073757600080fd5b506001600160a01b03813581169160208101359091169060400135611ba9565b61021a6004803603602081101561076d57600080fd5b50356001600160a01b0316611c04565b6103b0611caf565b61021a6004803603602081101561079b57600080fd5b50356001600160a01b0316611cbe565b6103b0611db3565b6003546001600160a01b03163314610800576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b600554604080516313af403560e01b81526001600160a01b038481166004830152915191909216916313af403591602480830192600092919082900301818387803b15801561084e57600080fd5b505af1158015610862573d6000803e3d6000fd5b5050505061086f81611df8565b61087881611e4a565b50565b600554604080516305f5f79f60e21b815290516060926001600160a01b0316916317d7de7c916004808301926000929190829003018186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156108fd57600080fd5b8101908080516040519392919084600160201b82111561091c57600080fd5b90830190602082018581111561093157600080fd5b8251600160201b81118282018810171561094a57600080fd5b82525081516020918201929091019080838360005b8381101561097757818101518382015260200161095f565b50505050905090810190601f1680156109a45780820380516001836020036101000a031916815260200191505b50604052505050905090565b6001546001600160a01b03163314610a04576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b60008111610a435760405162461bcd60e51b815260040180806020018281038252604b815260200180612eb2604b913960600191505060405180910390fd5b4381016002557fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d610a72611e56565b600254604080516001600160a01b03909316835260208301919091528051918290030190a150565b6003546000906001600160a01b03163314610aea576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b610af5848484611e5a565b6000610ba683604051806060016040528060338152602001612dbc603391396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528c8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b505afa158015610b81573d6000803e3d6000fd5b505050506040513d6020811015610b9757600080fd5b5051919063ffffffff6120de16565b9050610bb3858783612175565b50600195945050505050565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663c4e41b226040518163ffffffff1660e01b815260040160206040518083038186803b158015610c0f57600080fd5b505afa158015610c23573d6000803e3d6000fd5b505050506040513d6020811015610c3957600080fd5b505190505b90565b6005546040805163236cfcdd60e01b81526001600160e01b0319851660048201526001600160a01b0384811660248301529151600093929092169163236cfcdd91604480820192602092909190829003018186803b158015610ca257600080fd5b505afa158015610cb6573d6000803e3d6000fd5b505050506040513d6020811015610ccc57600080fd5b50519392505050565b60055460408051633c05076160e21b815290516000926001600160a01b03169163f0141d84916004808301926020929190829003018186803b158015610c0f57600080fd5b6001546001600160a01b03163314610d6e576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b436002557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610d9b611e56565b604080516001600160a01b039092168252519081900360200190a1565b6001546001600160a01b0316610dcc6122a1565b6001600160a01b031614610e15576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b610e1f82826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b03868116602484015260448301869052925192909316926323de66519260648084019382900301818387803b158015610e7857600080fd5b505af1158015610e8c573d6000803e3d6000fd5b505050505050565b6004546001600160a01b031681565b6005546001600160a01b031681565b6003546000906001600160a01b03163314610f02576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6004805460408051630af4187d60e01b81526001600160a01b038881169482019490945286841660248201529051600093610f9a938793911691630af4187d91604480820192602092909190829003018186803b158015610f6257600080fd5b505afa158015610f76573d6000803e3d6000fd5b505050506040513d6020811015610f8c57600080fd5b50519063ffffffff61249816565b9050610fa7858583612175565b506001949350505050565b6001546001600160a01b0316610fc66122a1565b6001600160a01b03161461100f576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051631b56be2f60e21b81526001600160a01b03848116600483015291519190921691636d5af8bc91602480830192600092919082900301818387803b15801561105d57600080fd5b505af1158015611071573d6000803e3d6000fd5b5050505050565b600480546040805163f8b2cb4f60e01b81526001600160a01b038581169482019490945290516000939092169163f8b2cb4f91602480820192602092909190829003018186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d60208110156110f557600080fd5b505192915050565b6001546001600160a01b03166111116122a1565b6001600160a01b03161461115a576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460408051633d09cad560e11b815260ff8416600482015290516001600160a01b0390921691637a1395aa9160248082019260009290919082900301818387803b15801561105d57600080fd5b600054156111e8576040805162461bcd60e51b81526020600482015260076024820152665265656e74727960c81b604482015290519081900360640190fd5b600160009081556111f76122a1565b6005546040805163236cfcdd60e01b81526001600160e01b03198a1660048201526001600160a01b038085166024830152915193945091169163236cfcdd91604480820192602092909190829003018186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d602081101561128057600080fd5b505185146112bf5760405162461bcd60e51b8152600401808060200182810382526028815260200180612e8a6028913960400191505060405180910390fd5b8385106112fd5760405162461bcd60e51b815260040180806020018281038252603981526020018061308a6039913960400191505060405180910390fd5b6113bb818b8b8b8b8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060035460055460408051630fee24e560e41b815290516001600160a01b03938416955092909116925063fee24e50916004808301926020929190829003018186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d60208110156113b457600080fd5b50516124f9565b60055460408051635521f9b960e01b81526001600160e01b0319891660048201526001600160a01b0384811660248301526044820188905291519190921691635521f9b991606480830192600092919082900301818387803b15801561142057600080fd5b505af1158015611434573d6000803e3d6000fd5b50505050611445818b8b8b8b61257d565b600360009054906101000a90046001600160a01b03166001600160a01b03166390d6001a828c8c8c8c8c8c8c8c8c6040518b63ffffffff1660e01b8152600401808b6001600160a01b03166001600160a01b031681526020018a8152602001898152602001888152602001878152602001866001600160e01b0319166001600160e01b0319168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509b505050505050505050505050600060405180830381600087803b15801561153257600080fd5b505af1158015611546573d6000803e3d6000fd5b505060008055505050505050505050505050565b6001546001600160a01b031661156e6122a1565b6001600160a01b0316146115b7576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60035460408051638d2c45f560e01b81526001600160a01b03848116600483015291519190921691638d2c45f591602480830192600092919082900301818387803b15801561105d57600080fd5b6001546001600160a01b031681565b60055460408051631507040160e01b815290516060926001600160a01b0316916315070401916004808301926000929190829003018186803b1580156108c057600080fd5b6001546001600160a01b031661166d6122a1565b6001600160a01b031614806117715750600560009054906101000a90046001600160a01b03166001600160a01b031663925c5b626040518163ffffffff1660e01b815260040160206040518083038186803b1580156116cb57600080fd5b505afa1580156116df573d6000803e3d6000fd5b505050506040513d60208110156116f557600080fd5b505160408051638abf607760e01b815290516001600160a01b0390921691638abf607791600480820192602092909190829003018186803b15801561173957600080fd5b505afa15801561174d573d6000803e3d6000fd5b505050506040513d602081101561176357600080fd5b50516001600160a01b031633145b6117b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6117ba8282612626565b600354604080516323de665160e01b81526001600160a01b0385811660048301526000602483018190526044830186905292519316926323de66519260648084019391929182900301818387803b158015610e7857600080fd5b60025481565b6001546001600160a01b031661182e6122a1565b6001600160a01b031614611877576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b600554604051635c26412360e11b8152602060048201908152602482018490526001600160a01b039092169163b84c824691859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546000906001600160a01b0316331461193e576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484611e5a565b5060019392505050565b6001546001600160a01b03166119676122a1565b6001600160a01b0316146119b0576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b60055460405163c47f002760e01b8152602060048201908152602482018490526001600160a01b039092169163c47f002791859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050600060405180830381600087803b158015610e7857600080fd5b6003546001600160a01b03163314611a74576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611a7d81612859565b61087881610878565b6003546000906001600160a01b03163314611ad6576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b6000610f9a83604051806060016040528060308152602001612f48603091396004805460408051630af4187d60e01b81526001600160a01b038c8116948201949094528a8416602482015290519290911691630af4187d91604480820192602092909190829003018186803b158015610b6d57600080fd5b6004805460408051630af4187d60e01b81526001600160a01b03868116948201949094528484166024820152905160009390921691630af4187d91604480820192602092909190829003018186803b158015610ca257600080fd5b6003546000906001600160a01b03163314611bf9576040805162461bcd60e51b815260206004820152601c6024820152600080516020612e3b833981519152604482015290519081900360640190fd5b611949848484612175565b6001546001600160a01b0316611c186122a1565b6001600160a01b031614611c61576040805162461bcd60e51b81526020600482015260156024820152600080516020612def833981519152604482015290519081900360640190fd5b6005546040805163e62c204d60e01b81526001600160a01b0384811660048301529151919092169163e62c204d91602480830192600092919082900301818387803b15801561105d57600080fd5b6003546001600160a01b031681565b6001546001600160a01b03163314611d12576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102737ba1037bbb732b960711b604482015290519081900360640190fd5b6001600160a01b038116611d575760405162461bcd60e51b8152600401808060200182810382526021815260200180612efd6021913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60055460408051630fee24e560e41b815290516000926001600160a01b03169163fee24e50916004808301926020929190829003018186803b158015610c0f57600080fd5b60048054604080516313af403560e01b81526001600160a01b0385811694820194909452905192909116916313af40359160248082019260009290919082900301818387803b15801561105d57600080fd5b806001600160a01b0316ff5b3390565b600254431015611e9b5760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b038316611ee05760405162461bcd60e51b81526004018080602001828103825260308152602001806131156030913960400191505060405180910390fd5b6001600160a01b038216611f255760405162461bcd60e51b815260040180806020018281038252602e8152602001806131e3602e913960400191505060405180910390fd5b600454604080516060810190915260318082526001600160a01b039092169163e30443bc918691611fab918691612f786020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038d8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ffa57600080fd5b505af115801561200e573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612072918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156120c157600080fd5b505af11580156120d5573d6000803e3d6000fd5b50505050505050565b6000818484111561216d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213257818101518382015260200161211a565b50505050905090810190601f16801561215f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6002544310156121b65760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0383166121fb5760405162461bcd60e51b815260040180806020018281038252602f815260200180612ffb602f913960400191505060405180910390fd5b6001600160a01b0382166122405760405162461bcd60e51b815260040180806020018281038252602d8152602001806130e8602d913960400191505060405180910390fd5b6004805460408051633691826360e21b81526001600160a01b03878116948201949094528584166024820152604481018590529051929091169163da46098c9160648082019260009290919082900301818387803b1580156120c157600080fd5b6003546000906001600160a01b03163314156122be575032610c3e565b5033610c3e565b6002544310156123065760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b03821661234b5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f1e602a913960400191505060405180910390fd5b60048054604080516362720d9160e11b815290516001600160a01b039092169263f7ea7a3d9261239b928692869263c4e41b22928083019260209291829003018186803b158015610f6257600080fd5b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123d157600080fd5b505af11580156123e5573d6000803e3d6000fd5b5050600480546040805163f8b2cb4f60e01b81526001600160a01b0388811694820194909452905192909116935063e30443bc92508591612449918691869163f8b2cb4f916024808301926020929190829003018186803b158015610f6257600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610e7857600080fd5b6000828201838110156124f2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600061250b8c8c8c8c8c8c8c8c6128e0565b9050816001600160a01b031661252a6125248386612970565b86612a7e565b6001600160a01b03161461256f5760405162461bcd60e51b81526004018080602001828103825260458152602001806131456045913960600191505060405180910390fd5b505050505050505050505050565b60006125a1826125958581898963ffffffff61249816565b9063ffffffff61249816565b90506125ad86826122c5565b600354604080516323de665160e01b81526000600482018190526001600160a01b038a8116602484015260448301869052925192909316926323de66519260648084019382900301818387803b15801561260657600080fd5b505af115801561261a573d6000803e3d6000fd5b50505050505050505050565b6002544310156126675760405162461bcd60e51b81526004018080602001828103825260318152602001806130596031913960400191505060405180910390fd5b6001600160a01b0382166126ac5760405162461bcd60e51b815260040180806020018281038252602c81526020018061318a602c913960400191505060405180910390fd5b6004546040805160608101909152602d8082526001600160a01b039092169163e30443bc9185916127329186916131b66020830139600480546040805163f8b2cb4f60e01b81526001600160a01b038c8116948201949094529051929091169163f8b2cb4f91602480820192602092909190829003018186803b158015610b6d57600080fd5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b505060048054604080516362720d9160e11b815290516001600160a01b03909216945063f7ea7a3d9350612823928692869263c4e41b229281810192602092909190829003018186803b1580156127eb57600080fd5b505afa1580156127ff573d6000803e3d6000fd5b505050506040513d602081101561281557600080fd5b50519063ffffffff612ae816565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610e7857600080fd5b806001600160a01b0316634bc597b96040518163ffffffff1660e01b815260040160206040518083038186803b15801561289257600080fd5b505afa1580156128a6573d6000803e3d6000fd5b505050506040513d60208110156128bc57600080fd5b5051600480546001600160a01b0319166001600160a01b0390921691909117905550565b6000604051808061321160ca9139604080519182900360ca0182206020808401919091526001600160a01b039c909c1682820152606082019a909a526080810198909852505060a086019490945260c08501929092526001600160e01b03191660e08401526101008301526101208083019190915282518083039091018152610140909101909152805191012090565b60405160009046908290806052612fa982396040805191829003605201822082820182526006835265456e6572676960d01b6020938401528151808301835260018152603160f81b908401528151808401919091527fab646ac92b857c23e54eb792495c5eb5881f612f4dfd8c0ad27072e703f1e8c9818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101959095526001600160a01b0390961660a0808601919091528651808603909101815260c08501875280519082012061190160f01b60e086015260e2850152610102808501979097528551808503909701875261012290930190945250835193019290922092915050565b60008151604114612ac05760405162461bcd60e51b815260040180806020018281038252602c815260200180612e0f602c913960400191505060405180910390fd5b60208201516040830151606084015160001a612ade86828585612b2a565b9695505050505050565b60006124f283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120de565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612b8b5760405162461bcd60e51b815260040180806020018281038252602f815260200180612e5b602f913960400191505060405180910390fd5b6000601e8560ff161115612c68576004850360ff16601b1480612bb457506004850360ff16601c145b612bef5760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6001612bfa87612d6a565b60048703868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612c57573d6000803e3d6000fd5b505050602060405103519050612d1c565b8460ff16601b1480612c7d57508460ff16601c145b612cb85760405162461bcd60e51b815260040180806020018281038252602f81526020018061302a602f913960400191505060405180910390fd5b6040805160008152602080820180845289905260ff8816828401526060820187905260808201869052915160019260a0808401939192601f1981019281900390910190855afa158015612d0f573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116612d615760405162461bcd60e51b81526004018080602001828103825260258152602001806130c36025913960400191505060405180910390fd5b95945050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c90910190915281519101209056fe4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433230546f6b656e3a20464f5242494444454e00000000000000000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206c656e677468476f7665726e656420436f6e74726163743a204e6f742070726f7879000000004c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206073602076616c75654552433230546f6b656e3a20696e76616c6964206c617374436c61696d4e6f6e63652076616c75655061757361626c653a20526576657274202d20506175736520646964206e6f742061637469766174652e20506c6561736520656e746572206120706f73697469766520696e74656765722e4f776e61626c653a205a65726f2061646472657373206e6f7420616c6c6f7765644552433230546f6b656e2045524332303a206d696e7420746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4552433230546f6b656e2045524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294552433230546f6b656e2045524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734c69625369676e61747572653a20696e76616c6964204543445341207369676e6174757265206076602076616c75655061757361626c653a20526576657274202d20436f646520657865637574696f6e206973207374696c6c207061757365644552433230546f6b656e3a20636c61696d4e6f6e6365206d757374206265206c6172676572207468616e206c617374436c61696d4e6f6e63654c69625369676e61747572653a20696e76616c6964204543445341207369676e61747572654552433230546f6b656e2045524332303a20617070726f766520746f20746865207a65726f20616464726573734552433230546f6b656e2045524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734c6962436c61696d41697264726f703a204549502d3731322061697264726f702073657276696365207369676e617475726520766572696669636174696f6e206572726f724552433230546f6b656e2045524332303a206275726e2066726f6d20746865207a65726f20616464726573734552433230546f6b656e2045524332303a206275726e20616d6f756e7420657863656564732062616c616e63654552433230546f6b656e2045524332303a207472616e7366657220746f20746865207a65726f20616464726573734552433230436c61696d286164647265737320726563697069656e742c75696e7432353620636c61696d416d6f756e7441697264726f702c75696e7432353620636c61696d416d6f756e74526566657272616c312c75696e7432353620636c61696d416d6f756e74526566657272616c322c75696e7432353620636c61696d416d6f756e74526566657272616c332c6279746573342061697264726f7049642c75696e74323536206c617374436c61696d4e6f6e63652c75696e7432353620636c61696d4e6f6e636529a265627a7a723158203708bd5c1812477eed2284dbba068121108ec29e81ed5e93fd2b454d46bbb7b964736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f8f9c3ff6d89671fcbc0b97c815dd77d83e541000000000000000000000000746d6afd192a9b2caa1fd437c5053c9f441e0eea000000000000000000000000069994c2670428aae9990c041ffbbd589952377700000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c447261676f6e20426c6f6f64000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024442000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _proxy (address): 0x0000000000000000000000000000000000000000
Arg [1] : _airdropService (address): 0x21F8F9c3Ff6D89671fcBC0b97c815dD77D83E541
Arg [2] : _eRC721ManagerProxy (address): 0x746D6Afd192a9b2caA1fd437C5053c9F441e0EEa
Arg [3] : _owner (address): 0x069994C2670428AAE9990C041FFbBD5899523777
Arg [4] : _name (string): Dragon Blood
Arg [5] : _symbol (string): DB
Arg [6] : _decimals (uint8): 18
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000021f8f9c3ff6d89671fcbc0b97c815dd77d83e541
Arg [2] : 000000000000000000000000746d6afd192a9b2caa1fd437c5053c9f441e0eea
Arg [3] : 000000000000000000000000069994c2670428aae9990c041ffbbd5899523777
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [8] : 447261676f6e20426c6f6f640000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 4442000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.