Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60808060 | 18270843 | 300 days ago | IN | 0 ETH | 0.06290815 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
XBridge
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; import "./interfaces/IERC20.sol"; contract XBridge is OwnableUpgradeable, ReentrancyGuardUpgradeable { uint256 public listingFee; address public factory; address public tokenFeeCollector; address public listingFeeCollector; address[] public admin; struct tokenInfo { address token; uint256 chain; } mapping(address => bool) public isBase; mapping(address => bool) public isWrapped; mapping(uint256 => bool) public chainSupported; mapping(address => uint256) public feesForToken; mapping(address => uint256) public tokenChainId; mapping(address => address) public tokenToToken; mapping(address => bool) public excludeFeeFromListing; mapping(address => mapping(address => bool)) public isMintable; mapping(uint256 => mapping(address => uint256)) public inNonce; mapping(address => mapping(address => address)) public tokenOwner; mapping(address => mapping(address => uint256)) public tokenDeposited; mapping(address => mapping(address => uint256)) public tokenWithdrawn; mapping(uint256 => mapping(address => mapping(uint256 => bool))) public nonceProcessed; event Locked(address indexed user, address indexed inToken, address indexed outToken, uint256 amount, uint256 feeAmount, uint256 _nonce, uint256 isWrapped, uint256 srcId, uint256 dstId); event UnLocked(address indexed user, address indexed outToken, uint256 amount, uint256 feeAmount, uint256 _nonce, uint256 srcId, uint256 dstId); event TokenListed(address indexed baseToken, uint256 baseTokenChain, address indexed correspondingToken, uint256 correspondingTokenChain, bool isMintable, address indexed user); event TokenDelisted(address indexed baseToken, uint256 baseTokenChain, address indexed correspondingToken, uint256 correspondingTokenChain); event TokenDeposited(address indexed user, uint256 amount); event TokenWithdrawn(address indexed user, address indexed receiver, uint256 amount); event SignersChanged(address[] indexed newSigners); event ChainSupported(uint256 _chain, bool _supported); event FeeExcludedFromListing(address indexed user, bool ifExcluded); event TokenFee(address indexed _token, uint256 _fee); constructor() { _disableInitializers(); } function initialize(address[] memory _admin, uint256 _listingFee, address _tokenFeeCollector, address _listingFeeCollector) external initializer { require(_admin.length >= 3, "MINIMUM_SIGNERS_SHOULD_BE_3"); require(_listingFee > 0, "LISTING_FEE_CANT_BE_ZERO"); require(_tokenFeeCollector != address(0) && _listingFeeCollector != address(0), "CANT_PROVIDE_ZERO_ADDRESS"); __Ownable_init(); __ReentrancyGuard_init(); admin = _admin; listingFee = _listingFee; tokenFeeCollector = _tokenFeeCollector; listingFeeCollector = _listingFeeCollector; } /** * @dev cannot receive eth directly */ receive() external payable { revert("DIRECT_ETH_TRANSFER_NOT_SUPPORTED"); } /** * @dev cannot receive eth directly */ fallback() external payable { revert("DIRECT_ETH_TRANSFER_NOT_SUPPORTED"); } /** * @dev Lock the `_amount` of `inTokens` in the bridge contract for `dstId` chain. * @param inToken locking token address * @param _amount amount of token to lock * @param dstId destination chain on which user will claim token * Emits a {Locked} event. */ function lock(address inToken, uint256 _amount, uint256 dstId) external payable nonReentrant { require(_amount > 0, "AMOUNT_CANT_BE_ZERO"); require(inToken != address(0), "TOKEN_ADDRESS_CANT_BE_NULL"); require(inToken.code.length > 0, "TOKEN_NOT_ON_THIS_CHAIN"); address outToken = tokenToToken[inToken]; require(outToken != address(0), "UNSUPPORTED_TOKEN"); require(chainSupported[dstId], "INVALID_CHAIN"); uint256 srcId; assembly { srcId := chainid() } require(tokenChainId[inToken] == srcId, "UNSUPPORTED_TOKEN"); uint256 _isWrapped; if(isWrapped[inToken]) _isWrapped = 1; else _isWrapped = 0; address _user = msg.sender; uint256 tokenAmount; uint256 fee = feesForToken[inToken]; uint256 feesAmount; if(_isWrapped == 0) { (tokenAmount, feesAmount) = transferAndCalcAmountAndFees(inToken, _user, _amount, fee); emit Locked(_user, inToken, outToken, tokenAmount, feesAmount, inNonce[dstId][_user]++, _isWrapped, srcId, dstId); } else if(_isWrapped == 1) { (tokenAmount, feesAmount) = transferAndCalcAmountAndFees(inToken, _user, _amount, fee); burn(inToken, tokenAmount+feesAmount); emit Locked(_user, inToken, outToken, tokenAmount, feesAmount, inNonce[dstId][_user]++, _isWrapped, srcId, dstId); } } /** * @dev Unlock the `amount` of tokens corresponding to `inToken` * @param inToken locked token address * @param amount amount of token to unlock * @param feeAmount fee on locked amount on source chain * @param _nonce user lock nonce on source chain * @param _isWrapped 1 if inToken is mintable otherwise 0 * @param srcId source chain on which user has locked token * @param r[] r part of the signature of the signers * @param s[] s part of the signature of the signers * @param v[] v part of the signature of the signers * Emits a {unLocked} event. */ function unlock(address inToken, uint256 amount, uint256 feeAmount, uint256 _nonce, uint256 _isWrapped, uint256 srcId, bytes32[] memory r, bytes32[] memory s, uint8[] memory v) external payable nonReentrant { address user = msg.sender; require(inToken != address(0), "TOKEN_ADDRESS_CANT_BE_NULL"); require(user != address(0), "INVALID_RECEIVER"); require(amount > 0, "AMOUNT_CANT_BE_ZERO"); address outToken = tokenToToken[inToken]; require(outToken != address(0), "UNSUPPORTED_TOKEN"); require(!nonceProcessed[srcId][user][_nonce], "NONCE_ALREADY_PROCESSED"); require(chainSupported[srcId], "INVALID_CHAIN"); bool mintable = isMintable[inToken][outToken]; uint256 dstId; assembly { dstId := chainid() } require(tokenChainId[outToken] == dstId, "CLAIM_TOKEN_NOT_BINDED_WITH_THIS_CHAIN"); bool success = verify(address(this), user, inToken, outToken, _nonce, amount, feeAmount, _isWrapped, srcId, dstId, r, s, v); require(success, "INVALID_RECOVERED_SIGNER"); // inToken is base token then isWrapped = 0 // inToken is wrapped token then isWrapped = 1 nonceProcessed[srcId][user][_nonce] = true; if(_isWrapped == 0) { if(mintable) { if(feeAmount > 0) mint(outToken, tokenFeeCollector, feeAmount); mint(outToken, user, amount); } else { if(feeAmount > 0) { success = IERC20(outToken).transfer(tokenFeeCollector, feeAmount); if(!success) revert("TOKEN_FEE_COLLECTION_FAILED"); } success = IERC20(outToken).transfer(user, amount); if(!success) revert("TOKEN_TRANSFER_FAILED"); } } else if(_isWrapped == 1) { if(feeAmount > 0) { success = IERC20(outToken).transfer(tokenFeeCollector, feeAmount); if(!success) revert("TOKEN_FEE_COLLECTION_FAILED"); } success = IERC20(outToken).transfer(user, amount); if(!success) revert("TOKEN_TRANSFER_FAILED"); } emit UnLocked(user, outToken, amount, feeAmount, _nonce, srcId, dstId); } /** * @dev internal function to call mint function of the token address */ function mint(address token, address to, uint256 amount) internal { bytes memory init = returnHash(to, amount); if (init.length > 0) call(init, token); } /** * @dev internal function to call burn function of the token address */ function burn(address token, uint256 amount) internal { bytes memory init = returnHash(amount); if (init.length > 0) call(init, token); } /** * @dev function to calculate the fees amount and transfer token from user to this contract */ function transferAndCalcAmountAndFees(address token, address _user, uint256 amount, uint256 fee) private returns(uint256 tokenAmount, uint256 feeAmount) { uint256 beforeAmount = (IERC20(token).balanceOf(address(this))); bool success = IERC20(token).transferFrom(_user, address(this), amount); if(!success) revert("TRANSFER_FAILED_WHILE_LOCKING"); tokenAmount = (IERC20(token).balanceOf(address(this))) - beforeAmount; if(fee > 0) { feeAmount = tokenAmount * fee / 10000; tokenAmount -= feeAmount; } } /** * @dev function to verify the authenticity of the signatures provided in form of r[], s[] and v[] */ function verify(address dstContract, address user, address inToken, address outToken, uint256 nonce, uint256 amount, uint256 feeAmount, uint256 _isWrapped, uint256 srcId, uint256 dstId, bytes32[] memory sigR, bytes32[] memory sigS, uint8[] memory sigV) internal view returns (bool) { uint256 len = admin.length; require(sigR.length == len && sigS.length == len && sigV.length == len, "INVALID_NUMBER_OF_SIGNERS"); for(uint i=0; i<len; ++i) { bytes32 hash = prefixed(keccak256(abi.encodePacked(dstContract, user, inToken, outToken, nonce, amount, feeAmount, _isWrapped, srcId, dstId))); address signer = ecrecover(hash, sigV[i], sigR[i], sigS[i]); require(signer != address(0), "INVALID_SIGNATURE"); require(admin[i] == signer, "INVALID_VALIDATOR"); } return true; } /** * @dev making hash EIP-191 compatible */ function prefixed(bytes32 hash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev returning the encoded mint function to call */ function returnHash(address to, uint256 amount) internal pure returns(bytes memory data) { data = abi.encodeWithSignature("mint(address,uint256)", to, amount); } /** * @dev calling the `token` contract with `callData` */ function call(bytes memory callData, address token) internal { IERC20 _token = IERC20(payable(token)); assembly { if eq(call(gas(), _token, 0, add(callData, 0x20), mload(callData), 0, 0), 0) { revert(0, 0) } } } /** * @dev returning the encoded mint function to call */ function returnHash(uint256 amount) internal pure returns(bytes memory data) { data = abi.encodeWithSignature("burn(uint256)", amount); } /** * @dev token owner can list the pair of their token with their corresponding chain id * @param baseToken struct that contains token address and its corresponding chain id * @param correspondingToken struct that contains token address and its corresponding chain id * @param _isMintable if corresponding token address is mintable then its `true` otherwise `false` */ function listToken(tokenInfo memory baseToken, tokenInfo memory correspondingToken, bool _isMintable) external payable { address _baseToken = baseToken.token; address _correspondingToken = correspondingToken.token; require(_baseToken != address(0), "INVALID_ADDR"); require(_correspondingToken != address(0), "INVALID_ADDR"); uint256 baseLen; uint256 correspondingLen; if(_baseToken.code.length > 0) baseLen = 1; if(_correspondingToken.code.length > 0) correspondingLen = 1; // require(baseLen^correspondingLen > 0, "ONLY_ONE_TOKEN_SHOULD_BE_ON_THIS_CHAIN"); require(tokenToToken[_baseToken] == address(0) && tokenToToken[_correspondingToken] == address(0), "THIS_PAIR_ALREADY_LISTED"); isMintable[_baseToken][_correspondingToken] = _isMintable; isMintable[_correspondingToken][_baseToken] = _isMintable; tokenToToken[_baseToken] = _correspondingToken; tokenToToken[_correspondingToken] = _baseToken; isBase[_baseToken] = true; if(_isMintable) isWrapped[_correspondingToken] = true; else isWrapped[_correspondingToken] = false; tokenChainId[_baseToken] = baseToken.chain; tokenChainId[_correspondingToken] = correspondingToken.chain; tokenOwner[_baseToken][_correspondingToken] = msg.sender; tokenOwner[_correspondingToken][_baseToken] = msg.sender; if(!excludeFeeFromListing[msg.sender]) transferListingFee(listingFeeCollector, msg.sender, msg.value); emit TokenListed(_baseToken, baseToken.chain, _correspondingToken, correspondingToken.chain, _isMintable, msg.sender); } /** * @dev platform owner can delist the pair of the token * @param baseToken struct that contains token address and its corresponding chain id * @param correspondingToken struct that contains token address and its corresponding chain id */ function delistTokenByOwner(tokenInfo memory baseToken, tokenInfo memory correspondingToken) external onlyOwner { address _baseToken = baseToken.token; address _correspondingToken = correspondingToken.token; require(_baseToken != address(0), "INVALID_ADDR"); require(_correspondingToken != address(0), "INVALID_ADDR"); require(tokenToToken[_baseToken] != address(0) && tokenToToken[_correspondingToken] != address(0), "ALREADY_DELISTED"); delete tokenToToken[_baseToken]; delete tokenToToken[_correspondingToken]; tokenChainId[_baseToken] = 0; tokenChainId[_correspondingToken] = 0; emit TokenDelisted(_baseToken, baseToken.chain, _correspondingToken, correspondingToken.chain); } /** * @dev token lister can delist the pair of the token * @param baseToken struct that contains token address and its corresponding chain id * @param correspondingToken struct that contains token address and its corresponding chain id */ function delistTokenByUser(tokenInfo memory baseToken, tokenInfo memory correspondingToken) external { address _baseToken = baseToken.token; address _correspondingToken = correspondingToken.token; require(tokenOwner[_baseToken][_correspondingToken] == msg.sender, "NOT_TOKEN_OWNER"); require(tokenToToken[_baseToken] != address(0) && tokenToToken[_correspondingToken] != address(0), "ALREADY_DELISTED"); require(_baseToken != address(0), "INVALID_ADDR"); require(_correspondingToken != address(0), "INVALID_ADDR"); delete tokenToToken[_baseToken]; delete tokenToToken[_correspondingToken]; tokenChainId[_baseToken] = 0; tokenChainId[_correspondingToken] = 0; emit TokenDelisted(_baseToken, baseToken.chain, _correspondingToken, correspondingToken.chain); } /** * @dev take the listing fee while listing token */ function transferListingFee(address to, address _user, uint256 _value) private nonReentrant { require(to != address(0), "CANT_SEND_TO_NULL_ADDRESS"); require(_value >= listingFee, "INCREASE_LISTING_FEE"); (bool success, ) = payable(to).call{value:listingFee}(""); require(success, "LISTING_FEE_TRANSFER_FAILED"); uint256 remainingEth = _value - listingFee; if (remainingEth > 0) { (success,) = payable(_user).call{value: remainingEth}(""); require(success, "REFUND_REMAINING_ETHER_SENT_FAILED"); } } /** * @dev owner can change the listing fee */ function setListingFee(uint256 newFee) external onlyOwner { require(newFee != listingFee, "SAME_FEE_PROVIDED"); require(newFee >= 0, "INVALID_FEE"); listingFee = newFee; } /** * @dev owner can change the listing fee collector address */ function setListingFeeCollector(address collector) external onlyOwner { require(collector != address(0), "CANT_BE_NULL_ADDRESS"); listingFeeCollector = collector; } /** * @dev owner can exclude particular address to give the listing fee while listing token */ function setExcludeFeeFromListing(address user, bool ifExcluded) external onlyOwner { require(user != address(0), "CANT_BE_NULL_ADDRESS"); // require(!excludeFeeFromListing[user], "ALREADY_EXCLUDED"); bool _previousState = excludeFeeFromListing[user]; if(_previousState == ifExcluded) revert("ALREADY_SET"); else excludeFeeFromListing[user] = ifExcluded; emit FeeExcludedFromListing(user, ifExcluded); } /** * @dev owner can change the signer addresses */ function changeAdmin(address[] memory newAdmin) external onlyOwner { require(newAdmin.length >= 3, "VALIDATORS_ARE_LESS_THAN_3"); admin = newAdmin; emit SignersChanged(newAdmin); } /** * @dev owner can set fee for particular token for bridging */ function setFeeForToken(address token, uint256 fee) external onlyOwner { require(token != address(0), "INVALID_TOKEN"); require(fee < 10000, "FEE_CANT_BE_100%"); feesForToken[token] = fee; emit TokenFee(token, fee); } /** * @dev owner can set if particular chain is supported or not */ function setChainSupported(uint256 chainId, bool supported) external onlyOwner { require(chainId != 0, "INVALID_CHAIN_ID"); chainSupported[chainId] = supported; emit ChainSupported(chainId, supported); } /** * @dev owner can change the token fee collector address */ function setFeeCollector(address collector) external onlyOwner { require(collector != address(0), "INVALID_OWNER"); tokenFeeCollector = collector; } /** * @dev returns total number of signers that are verified while unlocking the tokens */ function getTotalSigners() external view returns(uint256) { return admin.length; } /** * @dev token lister has to deposit tokens if none of the listed token are mintable or burnable * @param token token address to deposit in bridge contract * @param amount amount of tokens to deposit in bridge contract */ function depositTokens(address token, uint256 amount) external { require(token.code.length > 0, "TOKEN_NOT_DEPLOYED_ON_THIS_CHAIN"); address _correspondingToken = tokenToToken[token]; require(_correspondingToken != address(0), "TOKEN_NOT_LISTED"); require(amount > 0, "AMOUNT_CANT_BE_ZERO"); address user = msg.sender; require(tokenOwner[token][_correspondingToken] == user, "ONLY_TOKEN_LISTER_CAN_DEPOSIT"); uint256 beforeBal = IERC20(token).balanceOf(address(this)); IERC20(token).transferFrom(user, address(this), amount); uint256 actualBal = IERC20(token).balanceOf(address(this)) - beforeBal; tokenDeposited[token][user] += actualBal; emit TokenDeposited(user, actualBal); } /** * @dev token lister can withdraw tokens * @param token token address to withdraw from bridge contract * @param receiver address to recive the withdrawn tokens * @param amount amount of tokens to deposit in bridge contract */ function withdrawTokens(address token, address receiver, uint256 amount) external { require(token.code.length > 0, "TOKEN_NOT_DEPLOYED_ON_THIS_CHAIN"); address _correspondingToken = tokenToToken[token]; require(_correspondingToken != address(0), "TOKEN_NOT_LISTED"); require(amount > 0, "AMOUNT_CANT_BE_ZERO"); address user = msg.sender; require(tokenOwner[token][_correspondingToken] == user, "ONLY_TOKEN_LISTER_CAN_WITHDRAW"); require(amount <= IERC20(token).balanceOf(address(this)), "CANT_WITHDRAW_MORE_THAN_AVAILABLE"); if(isWrapped[token]) revert("CANT_WITHDRAW_WRAPPED_TOKENS"); tokenWithdrawn[token][user] += amount; IERC20(token).transfer(receiver, amount); emit TokenWithdrawn(user, receiver, amount); } /** * @dev token lister can change their ownership of listing tokens * @param token token address to change its lister owner * @param newOwner new owner address */ function changeTokenLister(address token, address newOwner) external { require(token.code.length > 0, "TOKEN_NOT_DEPLOYED_ON_THIS_CHAIN"); require(newOwner != address(0), "NEW_OWNER_CANT_BE_NULL"); address _correspondingToken = tokenToToken[token]; require(_correspondingToken != address(0), "TOKEN_NOT_LISTED"); require(tokenOwner[token][_correspondingToken] == msg.sender, "ONLY_TOKEN_LISTER_CAN_CHANGE"); tokenOwner[token][_correspondingToken] = newOwner; tokenOwner[_correspondingToken][token] = newOwner; } /** * @dev returns the addresses of signers */ function getSigners() external view returns(address[] memory ) { return admin; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.2; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @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 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. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); function mint(address to, uint256 amount) external returns (bool); function burn(uint256 amount) external returns (bool); function transferOwnership(address newOwner) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_chain","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_supported","type":"bool"}],"name":"ChainSupported","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"ifExcluded","type":"bool"}],"name":"FeeExcludedFromListing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"inToken","type":"address"},{"indexed":true,"internalType":"address","name":"outToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"isWrapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"srcId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dstId","type":"uint256"}],"name":"Locked","type":"event"},{"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":true,"internalType":"address[]","name":"newSigners","type":"address[]"}],"name":"SignersChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseTokenChain","type":"uint256"},{"indexed":true,"internalType":"address","name":"correspondingToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"correspondingTokenChain","type":"uint256"}],"name":"TokenDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"TokenFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"baseTokenChain","type":"uint256"},{"indexed":true,"internalType":"address","name":"correspondingToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"correspondingTokenChain","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isMintable","type":"bool"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"TokenListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"outToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"srcId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dstId","type":"uint256"}],"name":"UnLocked","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainSupported","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdmin","type":"address[]"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"changeTokenLister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"internalType":"struct XBridge.tokenInfo","name":"baseToken","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"internalType":"struct XBridge.tokenInfo","name":"correspondingToken","type":"tuple"}],"name":"delistTokenByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"internalType":"struct XBridge.tokenInfo","name":"baseToken","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"internalType":"struct XBridge.tokenInfo","name":"correspondingToken","type":"tuple"}],"name":"delistTokenByUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludeFeeFromListing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feesForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSigners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSigners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"inNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_admin","type":"address[]"},{"internalType":"uint256","name":"_listingFee","type":"uint256"},{"internalType":"address","name":"_tokenFeeCollector","type":"address"},{"internalType":"address","name":"_listingFeeCollector","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWrapped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"internalType":"struct XBridge.tokenInfo","name":"baseToken","type":"tuple"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"internalType":"struct XBridge.tokenInfo","name":"correspondingToken","type":"tuple"},{"internalType":"bool","name":"_isMintable","type":"bool"}],"name":"listToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"listingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listingFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"inToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"dstId","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonceProcessed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bool","name":"supported","type":"bool"}],"name":"setChainSupported","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"ifExcluded","type":"bool"}],"name":"setExcludeFeeFromListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setFeeForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setListingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collector","type":"address"}],"name":"setListingFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenToToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"tokenWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"inToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_isWrapped","type":"uint256"},{"internalType":"uint256","name":"srcId","type":"uint256"},{"internalType":"bytes32[]","name":"r","type":"bytes32[]"},{"internalType":"bytes32[]","name":"s","type":"bytes32[]"},{"internalType":"uint8[]","name":"v","type":"uint8[]"}],"name":"unlock","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60808060405234620000c6576000549060ff8260081c1662000074575060ff8082160362000038575b6040516137529081620000cc8239f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a13862000028565b62461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b600080fdfe60806040526004361015610018575b3661243157612431565b60003560e01c806305a71b7314610288578063131dbd0914610283578063222615781461027e5780632a76bbee146102795780632cef7165146102745780633782e7be1461026f578063404d1d8a1461026a57806340f51dad14610265578063495ee13e146102605780634ff2255b1461025b5780635dae3014146102565780635e35359e1461025157806366168bd71461024c5780636a1b7ecc146102475780636db4cb7f146102425780636e899aa31461023d578063715018a6146102385780637453928514610233578063751327b21461022e5780637c242a0f1461022957806383215ed91461022457806387be6f5f1461021f5780638da5cb5b1461021a57806394cf795e14610215578063a42dce8014610210578063b1957cd31461020b578063b95058a014610206578063bc50b3ca14610201578063bd6d39c1146101fc578063bfb02da8146101f7578063c1b4a1e3146101f2578063c45a0155146101ed578063d152116b146101e8578063d599a1c6146101e3578063d9f6f049146101de578063e2ab691d146101d9578063ee74043d146101d4578063eff53901146101cf5763f2fde38b0361000e57611fb4565b611e89565b611e45565b611c0f565b611be6565b611b9d565b611a61565b611a38565b611921565b6118c9565b61188a565b6117ce565b611793565b611736565b6116b9565b611604565b6115db565b611555565b61136e565b61106b565b610ec8565b610e2d565b610dcc565b610d8d565b610d5c565b610d3e565b610b3c565b6108c6565b61088c565b610852565b610813565b6107c6565b6106c8565b61066f565b610651565b610501565b6103a5565b610342565b6102ea565b600435906001600160a01b03821682036102a357565b600080fd5b602435906001600160a01b03821682036102a357565b604435906001600160a01b03821682036102a357565b606435906001600160a01b03821682036102a357565b346102a35760403660031901126102a357602061033961030861028d565b6103106102a8565b6001600160a01b03918216600090815260a6855260408082209290931681526020919091522090565b54604051908152f35b346102a35760203660031901126102a35760043561035e612041565b609754811461036c57609755005b60405162461bcd60e51b815260206004820152601160248201527014d0535157d1915157d41493d592511151607a1b6044820152606490fd5b346102a35760603660031901126102a3576103e86103c16102a8565b60043560005260a860205260406000209060018060a01b0316600052602052604060002090565b604435600052602052602060ff604060002054166040519015158152f35b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761043857604052565b610406565b6060810190811067ffffffffffffffff82111761043857604052565b90601f8019910116810190811067ffffffffffffffff82111761043857604052565b67ffffffffffffffff81116104385760051b60200190565b81601f820112156102a3578035916104aa8361047b565b926104b86040519485610459565b808452602092838086019260051b8201019283116102a3578301905b8282106104e2575050505090565b81356001600160a01b03811681036102a35781529083019083016104d4565b346102a3576020806003193601126102a35767ffffffffffffffff6004358181116102a357610534903690600401610493565b9161053d612041565b600383511061060d57825191821161043857600160401b821161043857609b5482609b558083106105d8575b50609b600052828101906000805160206136fd8339815191529060005b8481106105bd57610596866134f5565b7f02ae5c14158ac00f040514a245154d1ffd6ed0b4dad8a0ce70130bd689d74525600080a2005b83516001600160a01b03168382015592810192600101610586565b6000609b8152836000805160206136fd83398151915292830192015b828110610602575050610569565b8181556001016105f4565b6064906040519062461bcd60e51b82526004820152601a60248201527f56414c494441544f52535f4152455f4c4553535f5448414e5f330000000000006044820152fd5b346102a35760003660031901126102a3576020609b54604051908152f35b346102a35760403660031901126102a357602061033961068d61028d565b6106956102a8565b6001600160a01b03918216600090815260a7855260408082209290931681526020919091522090565b801515036102a357565b346102a35760403660031901126102a3576106e161028d565b6024356106ed816106be565b6106f5612041565b6001600160a01b0382169161070b8315156134b2565b600083815260a2602052604090205460ff1615158215150361075a5760405162461bcd60e51b815260206004820152600b60248201526a1053149150511657d4d15560aa1b6044820152606490fd5b6001600160a01b0316600090815260a2602052604090207f6692a0f9d25aba8bdf9876d6e8dd1604bb556b6934531c78259502b8b2f5d7a2916107c1916107af9082905b9060ff801983541691151516179055565b60405190151581529081906020820190565b0390a2005b346102a35760203660031901126102a3576107df61028d565b6107e7612041565b6001600160a01b03166107fb8115156134b2565b6001600160601b0360a01b609a541617609a55600080f35b346102a35760203660031901126102a3576001600160a01b0361083461028d565b16600052609d602052602060ff604060002054166040519015158152f35b346102a35760203660031901126102a3576001600160a01b0361087361028d565b16600052609f6020526020604060002054604051908152f35b346102a35760203660031901126102a3576001600160a01b036108ad61028d565b1660005260a06020526020604060002054604051908152f35b346102a35760603660031901126102a3576108df61028d565b6108e76102a8565b90604435906108f8813b1515613538565b6001600160a01b038116600090815260a160205260409020610922905b546001600160a01b031690565b6001600160a01b039061098a9061093c8184161515613583565b610947851515612480565b82610983610915339361096c8860018060a01b031660005260a5602052604060002090565b9060018060a01b0316600052602052604060002090565b161461360e565b6040516370a0823160e01b8152306004820152818316926020918281602481885afa8015610ac5576109c791600091610b0f575b5086111561365a565b6001600160a01b0381166000908152609d602052604090206109eb905b5460ff1690565b610aca576001600160a01b0316600090815260a760205260409020610a1190339061096c565b610a1c8582546125d6565b905560405163a9059cbb60e01b81526001600160a01b038616600482015260248101859052928190849060449082906000905af1928315610ac5577f8210728e7c071f615b840ee026032693858fbcd5e5359e67e438c890f59e562093610a97575b505060405192835290921691339180602081015b0390a3005b81610ab692903d10610abe575b610aae8183610459565b810190612c87565b503880610a7e565b503d610aa4565b612c9f565b60405162461bcd60e51b815260206004820152601c60248201527f43414e545f57495448445241575f575241505045445f544f4b454e53000000006044820152606490fd5b610b2f9150843d8611610b35575b610b278183610459565b810190612d1a565b386109be565b503d610b1d565b346102a35760403660031901126102a357610b5561028d565b602435610b64823b1515613538565b6001600160a01b038216600090815260a160205260409020610b8590610915565b6001600160a01b0390610bd690610b9f8184161515613583565b610baa841515612480565b82610bcf610915339361096c8960018060a01b031660005260a5602052604060002090565b16146135c2565b6040516370a0823160e01b808252306004830152918416926020929091908382602481885afa918215610ac5578490600093610d1d575b506040516323b872dd60e01b815233600482015230602482015260448101949094529192918280606481015b03816000895af1918215610ac5578492610d00575b5060405190815230600482015293849060249082905afa8015610ac557610ca293610c8293600092610ce3575b5050612d29565b6001600160a01b03909216600090815260a660205260409020339061096c565b610cad8282546125d6565b905560405190815233907fbc7c8a4d8049a3f99a02f2a20640c206a2e4d3f2fa54fd20da9f01fda3620cda9080602081016107c1565b610cf99250803d10610b3557610b278183610459565b3880610c7b565b610d1690833d8511610abe57610aae8183610459565b5038610c4e565b610c399350610d3890823d8411610b3557610b278183610459565b92610c0d565b346102a35760003660031901126102a3576020609754604051908152f35b346102a35760203660031901126102a357600435600052609e602052602060ff604060002054166040519015158152f35b346102a35760203660031901126102a3576001600160a01b03610dae61028d565b16600052609c602052602060ff604060002054166040519015158152f35b346102a357600080600319360112610e2a57610de6612041565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b346102a35760003660031901126102a3576099546040516001600160a01b039091168152602090f35b60409060031901126102a35760405190610e6f8261041c565b816004356001600160a01b03811681036102a35781526020602435910152565b60409060431901126102a35760405190610ea88261041c565b816044356001600160a01b03811681036102a35781526020606435910152565b346102a35760803660031901126102a357610ee236610e56565b610eeb36610e8f565b90610ef4612041565b805182516001600160a01b039182169384937ffa35030c3c7d834268ab6e51b6af06e24b8f502f8fde9c54ed6ba28f36f0e3cb93919260209283929160009161101e91811690839061100390610f4b8c15156131b6565b83169b610f598d15156131b6565b6001600160a01b038116600090815260a160205260409020610f8a90610f7e90610915565b6001600160a01b031690565b15158061103c575b610f9b9061323d565b6001600160a01b038116600090815260a160205260409020610fc8905b80546001600160a01b0319169055565b6001600160a01b038416600090815260a160205260409020610fe990610fb8565b6001600160a01b0316600090815260a06020526040902090565b556001600160a01b0316600090815260a06020526040902090565b55015191015160408051928352602083019190915281908101610a92565b50610f9b611062610f7e6109158760018060a01b031660005260a1602052604060002090565b15159050610f92565b60a03660031901126102a35761108036610e56565b61110e6111037f2c77a82144bdfced090e1946cf209e1730d693834f2cc87a805d041417b34b476110b036610e8f565b608435906110bd826106be565b6112b76111a56111a56020806110d98b5160018060a01b031690565b8651909b906111c4908d906001600160a01b031696879160018060a01b038082169e8f15156131b6565b83169e8f15156131b6565b6001600160a01b038116600090815260a16020526040902061113390610f7e90610915565b1580611340575b611143906131f1565b6111678c61079e8561096c8560018060a01b031660005260a3602052604060002090565b61118b8c61079e8361096c8760018060a01b031660005260a3602052604060002090565b6001600160a01b0316600090815260a16020526040902090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038516600090815260a1602052604090206111e7908d906111a5565b6001600160a01b038c166000908152609c60205260409020611211905b805460ff19166001179055565b871561131b576001600160a01b0385166000908152609d6020526040902061123890611204565b0180516001600160a01b038c16600090815260a060205260409020919691550180516001600160a01b038416600090815260a060205260409020919a915561129a336111a58561096c8560018060a01b031660005260a5602052604060002090565b61096c339360018060a01b031660005260a5602052604060002090565b33600090815260a2602052604090206112d7906112d3906109e4565b1590565b6112fd575b519451604080519687526020870191909152901515908501523393606090a4005b609a54611316906001600160a01b0316349033906132ba565b6112dc565b6001600160a01b0385166000908152609d60205260409020805460ff19169055611238565b50611143611366610f7e6109158660018060a01b031660005260a1602052604060002090565b15905061113a565b346102a35760403660031901126102a35761138761028d565b61138f6102a8565b61139b823b1515613538565b6001600160a01b0381811615611451578261096c6111a5926114116113d861091561144f9860018060a01b031660005260a1602052604060002090565b916113e68184161515613583565b6114096109158461096c8860018060a01b031660005260a5602052604060002090565b1633146136b0565b611435856111a58361096c8760018060a01b031660005260a5602052604060002090565b6001600160a01b0316600090815260a56020526040902090565b005b60405162461bcd60e51b8152602060048201526016602482015275139155d7d3d5d3915497d0d0539517d09157d395531360521b6044820152606490fd5b81601f820112156102a3578035916114a68361047b565b926114b46040519485610459565b808452602092838086019260051b8201019283116102a3578301905b8282106114de575050505090565b813581529083019083016114d0565b81601f820112156102a3578035916115048361047b565b926115126040519485610459565b808452602092838086019260051b8201019283116102a3578301905b82821061153c575050505090565b813560ff811681036102a357815290830190830161152e565b6101203660031901126102a35761156a61028d565b67ffffffffffffffff9060c4358281116102a35761158c90369060040161148f565b60e4358381116102a3576115a490369060040161148f565b90610104359384116102a3576115c161144f9436906004016114ed565b9260a4359060843590606435906044359060243590612648565b346102a35760003660031901126102a3576033546040516001600160a01b039091168152602090f35b346102a357600080600319360112610e2a576040518091609b549081835260208093018092609b83526000805160206136fd83398151915290835b81811061169c5750505084611655910385610459565b60405193838594850191818652518092526040850193925b82811061167c57505050500390f35b83516001600160a01b03168552869550938101939281019260010161166d565b82546001600160a01b03168452928601926001928301920161163f565b346102a35760203660031901126102a3576116d261028d565b6116da612041565b6001600160a01b03168015611701576001600160601b0360a01b6099541617609955600080f35b60405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b6044820152606490fd5b346102a35760403660031901126102a357602060ff61178761175661028d565b61175e6102a8565b6001600160a01b03918216600090815260a3865260408082209290931681526020919091522090565b54166040519015158152f35b346102a35760203660031901126102a35760206001600160a01b03806117b761028d565b1660005260a1825260406000205416604051908152f35b346102a35760403660031901126102a3576004356024356117ee816106be565b6117f6612041565b811561185257816040917fe78910fc1a08062969a9edf6b274d453a04a1734507fabbd5bb445d5cb8eaeae93600052609e60205261184381846000209060ff801983541691151516179055565b825191825215156020820152a1005b60405162461bcd60e51b815260206004820152601060248201526f1253959053125117d0d210525397d25160821b6044820152606490fd5b346102a35760203660031901126102a3576001600160a01b036118ab61028d565b1660005260a2602052602060ff604060002054166040519015158152f35b346102a35760403660031901126102a35760206118e461028d565b6119176118ef6102a8565b6001600160a01b03928316600090815260a58552604080822092851682526020929092522090565b5416604051908152f35b346102a35760803660031901126102a35760043567ffffffffffffffff81116102a357611952903690600401610493565b6119ac61195d6102be565b6119656102d4565b906000549361198b60ff8660081c161580968197611a2a575b8115611a0a575b506120e2565b8461199e600160ff196000541617600055565b6119f1575b60243590612268565b6119b257005b6119c261ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b611a0561010061ff00196000541617600055565b6119a3565b303b15915081611a1c575b5038611985565b6001915060ff161438611a15565b600160ff821610915061197e565b346102a35760003660031901126102a3576098546040516001600160a01b039091168152602090f35b346102a35760403660031901126102a357611a7a61028d565b602435611a85612041565b6001600160a01b038216918215611b2857612710821015611af0576001600160a01b03166000908152609f602052604090207fe4427eddc01962bfd3d30c0f180ab69439b489e5cd0c9c607aed338f3edc3506916107c1918190556040519081529081906020820190565b60405162461bcd60e51b815260206004820152601060248201526f4645455f43414e545f42455f3130302560801b6044820152606490fd5b60405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b609b54811015611b9857609b6000526000805160206136fd8339815191520190600090565b611b5d565b346102a35760203660031901126102a357600435609b548110156102a357609b6000526000805160206136fd83398151915201546040516001600160a01b039091168152602090f35b346102a35760003660031901126102a357609a546040516001600160a01b039091168152602090f35b60603660031901126102a357611c2361028d565b602435604435611c316125f2565b611c3c821515612480565b6001600160a01b038381169290611c548415156124c2565b611c60853b151561250e565b6001600160a01b038516600090815260a160205260409020611c8190610915565b1693611c8e85151561255a565b611cad611ca86109e485600052609e602052604060002090565b61259a565b6001600160a01b038116600090815260a06020526040902054611cd190461461255a565b6001600160a01b0381166000908152609d60205260408120611cf2906109e4565b15611e3f57506001915b6001600160a01b0382166000908152609f60205260409020549183611db9577fa921fe040b86ab1aa7b07f5c8d9bc081d3082ffdcd001dd54bfb7ee1b186e66b9392611dab9592611d4e923390612d36565b949091611d693361096c8360005260a4602052604060002090565b92835493611d76856125e3565b905560405194859433984693879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b0390a45b61144f6001606555565b90929160018314611dd1575b50505050505050611daf565b611e1894611e05611e30927fa921fe040b86ab1aa7b07f5c8d9bc081d3082ffdcd001dd54bfb7ee1b186e66b963386612d36565b969093611e1288866125d6565b90612cf7565b611d693361096c8360005260a4602052604060002090565b0390a438808080808080611dc5565b91611cfc565b346102a35760403660031901126102a3576020610339611e636102a8565b60043560005260a4835260406000209060018060a01b0316600052602052604060002090565b346102a35760803660031901126102a357611ea336610e56565b611eac36610e8f565b81519091907ffa35030c3c7d834268ab6e51b6af06e24b8f502f8fde9c54ed6ba28f36f0e3cb906001600160a01b0316835190939060209081906001600160a01b031694600061101e611f186109158961096c8c60018060a01b031660005260a5602052604060002090565b6001600160a01b039890611f2f908a16331461327c565b6001600160a01b038a16600090815260a1602052604090208990611f5290610915565b16151580611f85575b611f649061323d565b826110038a8c169a611f778c15156131b6565b83169b610f9b8d15156131b6565b50611f64611fab610f7e6109158460018060a01b031660005260a1602052604060002090565b15159050611f5b565b346102a35760203660031901126102a357611fcd61028d565b611fd5612041565b6001600160a01b03811615611fed5761144f90612099565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6033546001600160a01b0316330361205557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b156120e957565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b1561214c57565b60405162461bcd60e51b815260206004820152601960248201527f43414e545f50524f564944455f5a45524f5f41444452455353000000000000006044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156121ba57565b612191565b80519067ffffffffffffffff821161043857600160401b821161043857609b5482609b55808310612233575b50609b6000526020908101906000805160206136fd8339815191529060005b848110612218575050505050565b83516001600160a01b0316838201559281019260010161220a565b6000609b8152836000805160206136fd83398151915292830192015b82811061225d5750506121eb565b81815560010161224f565b9291600384511061234d578115612308576122fa936122dd926122c0916122bb906122a66001600160a01b03868116151590816122fc575b50612145565b6122ae6123f2565b6122b6612415565b6121bf565b609755565b60018060a01b03166001600160601b0360a01b6099541617609955565b60018060a01b03166001600160601b0360a01b609a541617609a55565b565b905088161515386122a0565b60405162461bcd60e51b815260206004820152601860248201527f4c495354494e475f4645455f43414e545f42455f5a45524f00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d494e494d554d5f5349474e4552535f53484f554c445f42455f3300000000006044820152606490fd5b1561239957565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61240c60ff60005460081c1661240781612392565b612392565b6122fa33612099565b61242a60ff60005460081c1661240781612392565b6001606555565b60405162461bcd60e51b815260206004820152602160248201527f4449524543545f4554485f5452414e534645525f4e4f545f535550504f5254456044820152601160fa1b6064820152608490fd5b1561248757565b60405162461bcd60e51b8152602060048201526013602482015272414d4f554e545f43414e545f42455f5a45524f60681b6044820152606490fd5b156124c957565b60405162461bcd60e51b815260206004820152601a60248201527f544f4b454e5f414444524553535f43414e545f42455f4e554c4c0000000000006044820152606490fd5b1561251557565b60405162461bcd60e51b815260206004820152601760248201527f544f4b454e5f4e4f545f4f4e5f544849535f434841494e0000000000000000006044820152606490fd5b1561256157565b60405162461bcd60e51b81526020600482015260116024820152702aa729aaa82827a92a22a22faa27a5a2a760791b6044820152606490fd5b156125a157565b60405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa1a420a4a760991b6044820152606490fd5b919082018092116121ba57565b60001981146121ba5760010190565b600260655414612603576002606555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b97929390959196976126586125f2565b6001600160a01b039361266e82861615156124c2565b612679331515612b55565b612684881515612480565b6001600160a01b038216600090815260a160205260409020546001600160a01b0316948516996126b58b151561255a565b86336126cb8a60005260a8602052604060002090565b6001600160a01b039091166000908152602091909152604090206000918252602052604090205460ff16156126ff90612b94565b61271388600052609e602052604060002090565b5460ff166127209061259a565b6001600160a01b03838116600090815260a360209081526040808320938a1683529281528282205460a09091529190205460ff9091169590612763904614612be0565b4689868d8d8c8c339a309b6127779c612f92565b61278090612c3b565b83336127968760005260a8602052604060002090565b6001600160a01b03909116600090815260209190915260409020600091825260205260409020805460ff19166001179055806129ed57501561286257836128097ff3f7debab57cb669dc23552fd1d27d490d1a2a8a8750f60cf0d43a6f2ac04072956128389388612845575b3390612cab565b60405193849333974693869192608093969594919660a084019784526020840152604083015260608201520152565b0390a36122fa6001606555565b60995461285d908a906001600160a01b031683612cab565b612802565b5083612928575b60405163a9059cbb60e01b81523360048201526024810184905260208160448160008a5af1908115610ac55760009161290a575b50156128cd576128387ff3f7debab57cb669dc23552fd1d27d490d1a2a8a8750f60cf0d43a6f2ac0407293612809565b60405162461bcd60e51b81526020600482015260156024820152741513d2d15397d514905394d1915497d19052531151605a1b6044820152606490fd5b612922915060203d8111610abe57610aae8183610459565b3861289d565b60995461296f9060209086906001600160a01b03165b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b038160008a5af1908115610ac5576000916129cf575b506128695760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e5f4645455f434f4c4c454354494f4e5f4641494c454400000000006044820152606490fd5b6129e7915060203d8111610abe57610aae8183610459565b38612985565b90506001915014612a23575b6128387ff3f7debab57cb669dc23552fd1d27d490d1a2a8a8750f60cf0d43a6f2ac0407293612809565b83612abd575b60405163a9059cbb60e01b81523360048201526024810184905260208160448160008a5af1908115610ac557600091612a9f575b506129f95760405162461bcd60e51b81526020600482015260156024820152741513d2d15397d514905394d1915497d19052531151605a1b6044820152606490fd5b612ab7915060203d8111610abe57610aae8183610459565b38612a5d565b609954612ad79060209086906001600160a01b031661293e565b038160008a5af1908115610ac557600091612b37575b50612a295760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e5f4645455f434f4c4c454354494f4e5f4641494c454400000000006044820152606490fd5b612b4f915060203d8111610abe57610aae8183610459565b38612aed565b15612b5c57565b60405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b6044820152606490fd5b15612b9b57565b60405162461bcd60e51b815260206004820152601760248201527f4e4f4e43455f414c52454144595f50524f4345535345440000000000000000006044820152606490fd5b15612be757565b60405162461bcd60e51b815260206004820152602660248201527f434c41494d5f544f4b454e5f4e4f545f42494e4445445f574954485f544849536044820152652fa1a420a4a760d11b6064820152608490fd5b15612c4257565b60405162461bcd60e51b815260206004820152601860248201527f494e56414c49445f5245434f56455245445f5349474e455200000000000000006044820152606490fd5b908160209103126102a35751612c9c816106be565b90565b6040513d6000823e3d90fd5b6040516340c10f1960e01b60208201526001600160a01b0392909216602483015260448083019390935291815290612ce4606483610459565b8151612cee575050565b6122fa91613197565b60405191630852cd8d60e31b6020840152602483015260248252612ce48261043d565b908160209103126102a3575190565b919082039182116121ba57565b6040516370a0823160e01b80825230600483015294956000959094602094936001600160a01b031692908582602481875afa948515610ac5578692600096612e8b575b506040516323b872dd60e01b81526001600160a01b0390911660048201523060248201526044810191909152908180606481015b03816000875af1908115610ac557600091612e6e575b5015612e2957604051908152306004820152908390829060249082905afa908115610ac557612dfa93600092610ce3575050612d29565b9280612e035750565b839250612e17612e1f91612e2693956121a7565b612710900490565b8092612d29565b91565b60405162461bcd60e51b815260206004820152601d60248201527f5452414e534645525f4641494c45445f5748494c455f4c4f434b494e470000006044820152606490fd5b612e859150853d8711610abe57610aae8183610459565b38612dc3565b8392919650612ea990612dad943d8511610b3557610b278183610459565b95909192612d79565b15612eb957565b60405162461bcd60e51b815260206004820152601960248201527f494e56414c49445f4e554d4245525f4f465f5349474e455253000000000000006044820152606490fd5b8051821015611b985760209160051b010190565b15612f1957565b60405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b6044820152606490fd5b15612f5957565b60405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fab20a624a220aa27a960791b6044820152606490fd5b97938b9d9c999591969297938b9c609b54809e819051149182613147575b50508061313d575b612fc190612eb2565b60005b8d8110612fdf575060019e5050505050505050505050505050565b8f60008e8e6130db8f948f8f8f8f8f8f8f8f8f9d8f979860209f6130b39a6130836130ac9a8c9a6130a69a61309f9a8d9a6130999a613091986040519a6020998c9a8b019d8e98969492906101109a989694916001600160601b0319809481809460601b168d5260601b1660148c015260601b1660288a015260601b16603c88015260508701526070860152609085015260b084015260d083015260f08201520190565b03601f198101835282610459565b519020613154565b99612efe565b5160ff1690565b97612efe565b5192612efe565b5190604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa15610ac5576000516131389190613133906001600160a01b0316613109811515612f12565b61312d610f7e61311885611b73565b905460039190911b1c6001600160a01b031690565b14612f52565b6125e3565b612fc4565b508a518d14612fb8565b90915051148f8e90612fb0565b60405160208101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c81526131918161043d565b51902090565b805160009283926020019083906001600160a01b03165af1156102a357565b156131bd57565b60405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa0a2222960a11b6044820152606490fd5b156131f857565b60405162461bcd60e51b815260206004820152601860248201527f544849535f504149525f414c52454144595f4c495354454400000000000000006044820152606490fd5b1561324457565b60405162461bcd60e51b815260206004820152601060248201526f1053149150511657d111531254d5115160821b6044820152606490fd5b1561328357565b60405162461bcd60e51b815260206004820152600f60248201526e2727aa2faa27a5a2a72fa7aba722a960891b6044820152606490fd5b9190916132c56125f2565b6001600160a01b039081169182156133475761330f90613306609754946132ee8684101561338c565b60008080809881945af16133006133cf565b5061340f565b60975490612d29565b9081613324575b505050506122fa6001606555565b828092819261333e96165af16133386133cf565b5061345b565b38808080613316565b60405162461bcd60e51b815260206004820152601960248201527f43414e545f53454e445f544f5f4e554c4c5f41444452455353000000000000006044820152606490fd5b1561339357565b60405162461bcd60e51b8152602060048201526014602482015273494e4352454153455f4c495354494e475f46454560601b6044820152606490fd5b3d1561340a573d9067ffffffffffffffff821161043857604051916133fe601f8201601f191660200184610459565b82523d6000602084013e565b606090565b1561341657565b60405162461bcd60e51b815260206004820152601b60248201527f4c495354494e475f4645455f5452414e534645525f4641494c454400000000006044820152606490fd5b1561346257565b60405162461bcd60e51b815260206004820152602260248201527f524546554e445f52454d41494e494e475f45544845525f53454e545f4641494c604482015261115160f21b6064820152608490fd5b156134b957565b60405162461bcd60e51b815260206004820152601460248201527343414e545f42455f4e554c4c5f4144445245535360601b6044820152606490fd5b60405190818183925160208092019160005b828110613518575050505003902090565b83516001600160a01b031685528695509381019392810192600101613507565b1561353f57565b606460405162461bcd60e51b815260206004820152602060248201527f544f4b454e5f4e4f545f4445504c4f5945445f4f4e5f544849535f434841494e6044820152fd5b1561358a57565b60405162461bcd60e51b815260206004820152601060248201526f1513d2d15397d393d517d31254d5115160821b6044820152606490fd5b156135c957565b60405162461bcd60e51b815260206004820152601d60248201527f4f4e4c595f544f4b454e5f4c49535445525f43414e5f4445504f5349540000006044820152606490fd5b1561361557565b60405162461bcd60e51b815260206004820152601e60248201527f4f4e4c595f544f4b454e5f4c49535445525f43414e5f574954484452415700006044820152606490fd5b1561366157565b60405162461bcd60e51b815260206004820152602160248201527f43414e545f57495448445241575f4d4f52455f5448414e5f415641494c41424c6044820152604560f81b6064820152608490fd5b156136b757565b60405162461bcd60e51b815260206004820152601c60248201527f4f4e4c595f544f4b454e5f4c49535445525f43414e5f4348414e4745000000006044820152606490fdfebba9db4cdbea0a37c207bbb83e20f828cd4441c49891101dc94fd20dc8efc349a2646970667358221220fe49ae60540c7c9eaec23505d0f7ab2265236826541cc30c292e79e1c162dc2264736f6c63430008120033
Deployed Bytecode
0x60806040526004361015610018575b3661243157612431565b60003560e01c806305a71b7314610288578063131dbd0914610283578063222615781461027e5780632a76bbee146102795780632cef7165146102745780633782e7be1461026f578063404d1d8a1461026a57806340f51dad14610265578063495ee13e146102605780634ff2255b1461025b5780635dae3014146102565780635e35359e1461025157806366168bd71461024c5780636a1b7ecc146102475780636db4cb7f146102425780636e899aa31461023d578063715018a6146102385780637453928514610233578063751327b21461022e5780637c242a0f1461022957806383215ed91461022457806387be6f5f1461021f5780638da5cb5b1461021a57806394cf795e14610215578063a42dce8014610210578063b1957cd31461020b578063b95058a014610206578063bc50b3ca14610201578063bd6d39c1146101fc578063bfb02da8146101f7578063c1b4a1e3146101f2578063c45a0155146101ed578063d152116b146101e8578063d599a1c6146101e3578063d9f6f049146101de578063e2ab691d146101d9578063ee74043d146101d4578063eff53901146101cf5763f2fde38b0361000e57611fb4565b611e89565b611e45565b611c0f565b611be6565b611b9d565b611a61565b611a38565b611921565b6118c9565b61188a565b6117ce565b611793565b611736565b6116b9565b611604565b6115db565b611555565b61136e565b61106b565b610ec8565b610e2d565b610dcc565b610d8d565b610d5c565b610d3e565b610b3c565b6108c6565b61088c565b610852565b610813565b6107c6565b6106c8565b61066f565b610651565b610501565b6103a5565b610342565b6102ea565b600435906001600160a01b03821682036102a357565b600080fd5b602435906001600160a01b03821682036102a357565b604435906001600160a01b03821682036102a357565b606435906001600160a01b03821682036102a357565b346102a35760403660031901126102a357602061033961030861028d565b6103106102a8565b6001600160a01b03918216600090815260a6855260408082209290931681526020919091522090565b54604051908152f35b346102a35760203660031901126102a35760043561035e612041565b609754811461036c57609755005b60405162461bcd60e51b815260206004820152601160248201527014d0535157d1915157d41493d592511151607a1b6044820152606490fd5b346102a35760603660031901126102a3576103e86103c16102a8565b60043560005260a860205260406000209060018060a01b0316600052602052604060002090565b604435600052602052602060ff604060002054166040519015158152f35b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761043857604052565b610406565b6060810190811067ffffffffffffffff82111761043857604052565b90601f8019910116810190811067ffffffffffffffff82111761043857604052565b67ffffffffffffffff81116104385760051b60200190565b81601f820112156102a3578035916104aa8361047b565b926104b86040519485610459565b808452602092838086019260051b8201019283116102a3578301905b8282106104e2575050505090565b81356001600160a01b03811681036102a35781529083019083016104d4565b346102a3576020806003193601126102a35767ffffffffffffffff6004358181116102a357610534903690600401610493565b9161053d612041565b600383511061060d57825191821161043857600160401b821161043857609b5482609b558083106105d8575b50609b600052828101906000805160206136fd8339815191529060005b8481106105bd57610596866134f5565b7f02ae5c14158ac00f040514a245154d1ffd6ed0b4dad8a0ce70130bd689d74525600080a2005b83516001600160a01b03168382015592810192600101610586565b6000609b8152836000805160206136fd83398151915292830192015b828110610602575050610569565b8181556001016105f4565b6064906040519062461bcd60e51b82526004820152601a60248201527f56414c494441544f52535f4152455f4c4553535f5448414e5f330000000000006044820152fd5b346102a35760003660031901126102a3576020609b54604051908152f35b346102a35760403660031901126102a357602061033961068d61028d565b6106956102a8565b6001600160a01b03918216600090815260a7855260408082209290931681526020919091522090565b801515036102a357565b346102a35760403660031901126102a3576106e161028d565b6024356106ed816106be565b6106f5612041565b6001600160a01b0382169161070b8315156134b2565b600083815260a2602052604090205460ff1615158215150361075a5760405162461bcd60e51b815260206004820152600b60248201526a1053149150511657d4d15560aa1b6044820152606490fd5b6001600160a01b0316600090815260a2602052604090207f6692a0f9d25aba8bdf9876d6e8dd1604bb556b6934531c78259502b8b2f5d7a2916107c1916107af9082905b9060ff801983541691151516179055565b60405190151581529081906020820190565b0390a2005b346102a35760203660031901126102a3576107df61028d565b6107e7612041565b6001600160a01b03166107fb8115156134b2565b6001600160601b0360a01b609a541617609a55600080f35b346102a35760203660031901126102a3576001600160a01b0361083461028d565b16600052609d602052602060ff604060002054166040519015158152f35b346102a35760203660031901126102a3576001600160a01b0361087361028d565b16600052609f6020526020604060002054604051908152f35b346102a35760203660031901126102a3576001600160a01b036108ad61028d565b1660005260a06020526020604060002054604051908152f35b346102a35760603660031901126102a3576108df61028d565b6108e76102a8565b90604435906108f8813b1515613538565b6001600160a01b038116600090815260a160205260409020610922905b546001600160a01b031690565b6001600160a01b039061098a9061093c8184161515613583565b610947851515612480565b82610983610915339361096c8860018060a01b031660005260a5602052604060002090565b9060018060a01b0316600052602052604060002090565b161461360e565b6040516370a0823160e01b8152306004820152818316926020918281602481885afa8015610ac5576109c791600091610b0f575b5086111561365a565b6001600160a01b0381166000908152609d602052604090206109eb905b5460ff1690565b610aca576001600160a01b0316600090815260a760205260409020610a1190339061096c565b610a1c8582546125d6565b905560405163a9059cbb60e01b81526001600160a01b038616600482015260248101859052928190849060449082906000905af1928315610ac5577f8210728e7c071f615b840ee026032693858fbcd5e5359e67e438c890f59e562093610a97575b505060405192835290921691339180602081015b0390a3005b81610ab692903d10610abe575b610aae8183610459565b810190612c87565b503880610a7e565b503d610aa4565b612c9f565b60405162461bcd60e51b815260206004820152601c60248201527f43414e545f57495448445241575f575241505045445f544f4b454e53000000006044820152606490fd5b610b2f9150843d8611610b35575b610b278183610459565b810190612d1a565b386109be565b503d610b1d565b346102a35760403660031901126102a357610b5561028d565b602435610b64823b1515613538565b6001600160a01b038216600090815260a160205260409020610b8590610915565b6001600160a01b0390610bd690610b9f8184161515613583565b610baa841515612480565b82610bcf610915339361096c8960018060a01b031660005260a5602052604060002090565b16146135c2565b6040516370a0823160e01b808252306004830152918416926020929091908382602481885afa918215610ac5578490600093610d1d575b506040516323b872dd60e01b815233600482015230602482015260448101949094529192918280606481015b03816000895af1918215610ac5578492610d00575b5060405190815230600482015293849060249082905afa8015610ac557610ca293610c8293600092610ce3575b5050612d29565b6001600160a01b03909216600090815260a660205260409020339061096c565b610cad8282546125d6565b905560405190815233907fbc7c8a4d8049a3f99a02f2a20640c206a2e4d3f2fa54fd20da9f01fda3620cda9080602081016107c1565b610cf99250803d10610b3557610b278183610459565b3880610c7b565b610d1690833d8511610abe57610aae8183610459565b5038610c4e565b610c399350610d3890823d8411610b3557610b278183610459565b92610c0d565b346102a35760003660031901126102a3576020609754604051908152f35b346102a35760203660031901126102a357600435600052609e602052602060ff604060002054166040519015158152f35b346102a35760203660031901126102a3576001600160a01b03610dae61028d565b16600052609c602052602060ff604060002054166040519015158152f35b346102a357600080600319360112610e2a57610de6612041565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b346102a35760003660031901126102a3576099546040516001600160a01b039091168152602090f35b60409060031901126102a35760405190610e6f8261041c565b816004356001600160a01b03811681036102a35781526020602435910152565b60409060431901126102a35760405190610ea88261041c565b816044356001600160a01b03811681036102a35781526020606435910152565b346102a35760803660031901126102a357610ee236610e56565b610eeb36610e8f565b90610ef4612041565b805182516001600160a01b039182169384937ffa35030c3c7d834268ab6e51b6af06e24b8f502f8fde9c54ed6ba28f36f0e3cb93919260209283929160009161101e91811690839061100390610f4b8c15156131b6565b83169b610f598d15156131b6565b6001600160a01b038116600090815260a160205260409020610f8a90610f7e90610915565b6001600160a01b031690565b15158061103c575b610f9b9061323d565b6001600160a01b038116600090815260a160205260409020610fc8905b80546001600160a01b0319169055565b6001600160a01b038416600090815260a160205260409020610fe990610fb8565b6001600160a01b0316600090815260a06020526040902090565b556001600160a01b0316600090815260a06020526040902090565b55015191015160408051928352602083019190915281908101610a92565b50610f9b611062610f7e6109158760018060a01b031660005260a1602052604060002090565b15159050610f92565b60a03660031901126102a35761108036610e56565b61110e6111037f2c77a82144bdfced090e1946cf209e1730d693834f2cc87a805d041417b34b476110b036610e8f565b608435906110bd826106be565b6112b76111a56111a56020806110d98b5160018060a01b031690565b8651909b906111c4908d906001600160a01b031696879160018060a01b038082169e8f15156131b6565b83169e8f15156131b6565b6001600160a01b038116600090815260a16020526040902061113390610f7e90610915565b1580611340575b611143906131f1565b6111678c61079e8561096c8560018060a01b031660005260a3602052604060002090565b61118b8c61079e8361096c8760018060a01b031660005260a3602052604060002090565b6001600160a01b0316600090815260a16020526040902090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038516600090815260a1602052604090206111e7908d906111a5565b6001600160a01b038c166000908152609c60205260409020611211905b805460ff19166001179055565b871561131b576001600160a01b0385166000908152609d6020526040902061123890611204565b0180516001600160a01b038c16600090815260a060205260409020919691550180516001600160a01b038416600090815260a060205260409020919a915561129a336111a58561096c8560018060a01b031660005260a5602052604060002090565b61096c339360018060a01b031660005260a5602052604060002090565b33600090815260a2602052604090206112d7906112d3906109e4565b1590565b6112fd575b519451604080519687526020870191909152901515908501523393606090a4005b609a54611316906001600160a01b0316349033906132ba565b6112dc565b6001600160a01b0385166000908152609d60205260409020805460ff19169055611238565b50611143611366610f7e6109158660018060a01b031660005260a1602052604060002090565b15905061113a565b346102a35760403660031901126102a35761138761028d565b61138f6102a8565b61139b823b1515613538565b6001600160a01b0381811615611451578261096c6111a5926114116113d861091561144f9860018060a01b031660005260a1602052604060002090565b916113e68184161515613583565b6114096109158461096c8860018060a01b031660005260a5602052604060002090565b1633146136b0565b611435856111a58361096c8760018060a01b031660005260a5602052604060002090565b6001600160a01b0316600090815260a56020526040902090565b005b60405162461bcd60e51b8152602060048201526016602482015275139155d7d3d5d3915497d0d0539517d09157d395531360521b6044820152606490fd5b81601f820112156102a3578035916114a68361047b565b926114b46040519485610459565b808452602092838086019260051b8201019283116102a3578301905b8282106114de575050505090565b813581529083019083016114d0565b81601f820112156102a3578035916115048361047b565b926115126040519485610459565b808452602092838086019260051b8201019283116102a3578301905b82821061153c575050505090565b813560ff811681036102a357815290830190830161152e565b6101203660031901126102a35761156a61028d565b67ffffffffffffffff9060c4358281116102a35761158c90369060040161148f565b60e4358381116102a3576115a490369060040161148f565b90610104359384116102a3576115c161144f9436906004016114ed565b9260a4359060843590606435906044359060243590612648565b346102a35760003660031901126102a3576033546040516001600160a01b039091168152602090f35b346102a357600080600319360112610e2a576040518091609b549081835260208093018092609b83526000805160206136fd83398151915290835b81811061169c5750505084611655910385610459565b60405193838594850191818652518092526040850193925b82811061167c57505050500390f35b83516001600160a01b03168552869550938101939281019260010161166d565b82546001600160a01b03168452928601926001928301920161163f565b346102a35760203660031901126102a3576116d261028d565b6116da612041565b6001600160a01b03168015611701576001600160601b0360a01b6099541617609955600080f35b60405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b6044820152606490fd5b346102a35760403660031901126102a357602060ff61178761175661028d565b61175e6102a8565b6001600160a01b03918216600090815260a3865260408082209290931681526020919091522090565b54166040519015158152f35b346102a35760203660031901126102a35760206001600160a01b03806117b761028d565b1660005260a1825260406000205416604051908152f35b346102a35760403660031901126102a3576004356024356117ee816106be565b6117f6612041565b811561185257816040917fe78910fc1a08062969a9edf6b274d453a04a1734507fabbd5bb445d5cb8eaeae93600052609e60205261184381846000209060ff801983541691151516179055565b825191825215156020820152a1005b60405162461bcd60e51b815260206004820152601060248201526f1253959053125117d0d210525397d25160821b6044820152606490fd5b346102a35760203660031901126102a3576001600160a01b036118ab61028d565b1660005260a2602052602060ff604060002054166040519015158152f35b346102a35760403660031901126102a35760206118e461028d565b6119176118ef6102a8565b6001600160a01b03928316600090815260a58552604080822092851682526020929092522090565b5416604051908152f35b346102a35760803660031901126102a35760043567ffffffffffffffff81116102a357611952903690600401610493565b6119ac61195d6102be565b6119656102d4565b906000549361198b60ff8660081c161580968197611a2a575b8115611a0a575b506120e2565b8461199e600160ff196000541617600055565b6119f1575b60243590612268565b6119b257005b6119c261ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b611a0561010061ff00196000541617600055565b6119a3565b303b15915081611a1c575b5038611985565b6001915060ff161438611a15565b600160ff821610915061197e565b346102a35760003660031901126102a3576098546040516001600160a01b039091168152602090f35b346102a35760403660031901126102a357611a7a61028d565b602435611a85612041565b6001600160a01b038216918215611b2857612710821015611af0576001600160a01b03166000908152609f602052604090207fe4427eddc01962bfd3d30c0f180ab69439b489e5cd0c9c607aed338f3edc3506916107c1918190556040519081529081906020820190565b60405162461bcd60e51b815260206004820152601060248201526f4645455f43414e545f42455f3130302560801b6044820152606490fd5b60405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22faa27a5a2a760991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b609b54811015611b9857609b6000526000805160206136fd8339815191520190600090565b611b5d565b346102a35760203660031901126102a357600435609b548110156102a357609b6000526000805160206136fd83398151915201546040516001600160a01b039091168152602090f35b346102a35760003660031901126102a357609a546040516001600160a01b039091168152602090f35b60603660031901126102a357611c2361028d565b602435604435611c316125f2565b611c3c821515612480565b6001600160a01b038381169290611c548415156124c2565b611c60853b151561250e565b6001600160a01b038516600090815260a160205260409020611c8190610915565b1693611c8e85151561255a565b611cad611ca86109e485600052609e602052604060002090565b61259a565b6001600160a01b038116600090815260a06020526040902054611cd190461461255a565b6001600160a01b0381166000908152609d60205260408120611cf2906109e4565b15611e3f57506001915b6001600160a01b0382166000908152609f60205260409020549183611db9577fa921fe040b86ab1aa7b07f5c8d9bc081d3082ffdcd001dd54bfb7ee1b186e66b9392611dab9592611d4e923390612d36565b949091611d693361096c8360005260a4602052604060002090565b92835493611d76856125e3565b905560405194859433984693879260a094919796959260c0850198855260208501526040840152606083015260808201520152565b0390a45b61144f6001606555565b90929160018314611dd1575b50505050505050611daf565b611e1894611e05611e30927fa921fe040b86ab1aa7b07f5c8d9bc081d3082ffdcd001dd54bfb7ee1b186e66b963386612d36565b969093611e1288866125d6565b90612cf7565b611d693361096c8360005260a4602052604060002090565b0390a438808080808080611dc5565b91611cfc565b346102a35760403660031901126102a3576020610339611e636102a8565b60043560005260a4835260406000209060018060a01b0316600052602052604060002090565b346102a35760803660031901126102a357611ea336610e56565b611eac36610e8f565b81519091907ffa35030c3c7d834268ab6e51b6af06e24b8f502f8fde9c54ed6ba28f36f0e3cb906001600160a01b0316835190939060209081906001600160a01b031694600061101e611f186109158961096c8c60018060a01b031660005260a5602052604060002090565b6001600160a01b039890611f2f908a16331461327c565b6001600160a01b038a16600090815260a1602052604090208990611f5290610915565b16151580611f85575b611f649061323d565b826110038a8c169a611f778c15156131b6565b83169b610f9b8d15156131b6565b50611f64611fab610f7e6109158460018060a01b031660005260a1602052604060002090565b15159050611f5b565b346102a35760203660031901126102a357611fcd61028d565b611fd5612041565b6001600160a01b03811615611fed5761144f90612099565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6033546001600160a01b0316330361205557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b156120e957565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b1561214c57565b60405162461bcd60e51b815260206004820152601960248201527f43414e545f50524f564944455f5a45524f5f41444452455353000000000000006044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156121ba57565b612191565b80519067ffffffffffffffff821161043857600160401b821161043857609b5482609b55808310612233575b50609b6000526020908101906000805160206136fd8339815191529060005b848110612218575050505050565b83516001600160a01b0316838201559281019260010161220a565b6000609b8152836000805160206136fd83398151915292830192015b82811061225d5750506121eb565b81815560010161224f565b9291600384511061234d578115612308576122fa936122dd926122c0916122bb906122a66001600160a01b03868116151590816122fc575b50612145565b6122ae6123f2565b6122b6612415565b6121bf565b609755565b60018060a01b03166001600160601b0360a01b6099541617609955565b60018060a01b03166001600160601b0360a01b609a541617609a55565b565b905088161515386122a0565b60405162461bcd60e51b815260206004820152601860248201527f4c495354494e475f4645455f43414e545f42455f5a45524f00000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d494e494d554d5f5349474e4552535f53484f554c445f42455f3300000000006044820152606490fd5b1561239957565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61240c60ff60005460081c1661240781612392565b612392565b6122fa33612099565b61242a60ff60005460081c1661240781612392565b6001606555565b60405162461bcd60e51b815260206004820152602160248201527f4449524543545f4554485f5452414e534645525f4e4f545f535550504f5254456044820152601160fa1b6064820152608490fd5b1561248757565b60405162461bcd60e51b8152602060048201526013602482015272414d4f554e545f43414e545f42455f5a45524f60681b6044820152606490fd5b156124c957565b60405162461bcd60e51b815260206004820152601a60248201527f544f4b454e5f414444524553535f43414e545f42455f4e554c4c0000000000006044820152606490fd5b1561251557565b60405162461bcd60e51b815260206004820152601760248201527f544f4b454e5f4e4f545f4f4e5f544849535f434841494e0000000000000000006044820152606490fd5b1561256157565b60405162461bcd60e51b81526020600482015260116024820152702aa729aaa82827a92a22a22faa27a5a2a760791b6044820152606490fd5b156125a157565b60405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa1a420a4a760991b6044820152606490fd5b919082018092116121ba57565b60001981146121ba5760010190565b600260655414612603576002606555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b97929390959196976126586125f2565b6001600160a01b039361266e82861615156124c2565b612679331515612b55565b612684881515612480565b6001600160a01b038216600090815260a160205260409020546001600160a01b0316948516996126b58b151561255a565b86336126cb8a60005260a8602052604060002090565b6001600160a01b039091166000908152602091909152604090206000918252602052604090205460ff16156126ff90612b94565b61271388600052609e602052604060002090565b5460ff166127209061259a565b6001600160a01b03838116600090815260a360209081526040808320938a1683529281528282205460a09091529190205460ff9091169590612763904614612be0565b4689868d8d8c8c339a309b6127779c612f92565b61278090612c3b565b83336127968760005260a8602052604060002090565b6001600160a01b03909116600090815260209190915260409020600091825260205260409020805460ff19166001179055806129ed57501561286257836128097ff3f7debab57cb669dc23552fd1d27d490d1a2a8a8750f60cf0d43a6f2ac04072956128389388612845575b3390612cab565b60405193849333974693869192608093969594919660a084019784526020840152604083015260608201520152565b0390a36122fa6001606555565b60995461285d908a906001600160a01b031683612cab565b612802565b5083612928575b60405163a9059cbb60e01b81523360048201526024810184905260208160448160008a5af1908115610ac55760009161290a575b50156128cd576128387ff3f7debab57cb669dc23552fd1d27d490d1a2a8a8750f60cf0d43a6f2ac0407293612809565b60405162461bcd60e51b81526020600482015260156024820152741513d2d15397d514905394d1915497d19052531151605a1b6044820152606490fd5b612922915060203d8111610abe57610aae8183610459565b3861289d565b60995461296f9060209086906001600160a01b03165b60405163a9059cbb60e01b81526001600160a01b039091166004820152602481019190915291829081906044820190565b038160008a5af1908115610ac5576000916129cf575b506128695760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e5f4645455f434f4c4c454354494f4e5f4641494c454400000000006044820152606490fd5b6129e7915060203d8111610abe57610aae8183610459565b38612985565b90506001915014612a23575b6128387ff3f7debab57cb669dc23552fd1d27d490d1a2a8a8750f60cf0d43a6f2ac0407293612809565b83612abd575b60405163a9059cbb60e01b81523360048201526024810184905260208160448160008a5af1908115610ac557600091612a9f575b506129f95760405162461bcd60e51b81526020600482015260156024820152741513d2d15397d514905394d1915497d19052531151605a1b6044820152606490fd5b612ab7915060203d8111610abe57610aae8183610459565b38612a5d565b609954612ad79060209086906001600160a01b031661293e565b038160008a5af1908115610ac557600091612b37575b50612a295760405162461bcd60e51b815260206004820152601b60248201527f544f4b454e5f4645455f434f4c4c454354494f4e5f4641494c454400000000006044820152606490fd5b612b4f915060203d8111610abe57610aae8183610459565b38612aed565b15612b5c57565b60405162461bcd60e51b815260206004820152601060248201526f24a72b20a624a22fa922a1a2a4ab22a960811b6044820152606490fd5b15612b9b57565b60405162461bcd60e51b815260206004820152601760248201527f4e4f4e43455f414c52454144595f50524f4345535345440000000000000000006044820152606490fd5b15612be757565b60405162461bcd60e51b815260206004820152602660248201527f434c41494d5f544f4b454e5f4e4f545f42494e4445445f574954485f544849536044820152652fa1a420a4a760d11b6064820152608490fd5b15612c4257565b60405162461bcd60e51b815260206004820152601860248201527f494e56414c49445f5245434f56455245445f5349474e455200000000000000006044820152606490fd5b908160209103126102a35751612c9c816106be565b90565b6040513d6000823e3d90fd5b6040516340c10f1960e01b60208201526001600160a01b0392909216602483015260448083019390935291815290612ce4606483610459565b8151612cee575050565b6122fa91613197565b60405191630852cd8d60e31b6020840152602483015260248252612ce48261043d565b908160209103126102a3575190565b919082039182116121ba57565b6040516370a0823160e01b80825230600483015294956000959094602094936001600160a01b031692908582602481875afa948515610ac5578692600096612e8b575b506040516323b872dd60e01b81526001600160a01b0390911660048201523060248201526044810191909152908180606481015b03816000875af1908115610ac557600091612e6e575b5015612e2957604051908152306004820152908390829060249082905afa908115610ac557612dfa93600092610ce3575050612d29565b9280612e035750565b839250612e17612e1f91612e2693956121a7565b612710900490565b8092612d29565b91565b60405162461bcd60e51b815260206004820152601d60248201527f5452414e534645525f4641494c45445f5748494c455f4c4f434b494e470000006044820152606490fd5b612e859150853d8711610abe57610aae8183610459565b38612dc3565b8392919650612ea990612dad943d8511610b3557610b278183610459565b95909192612d79565b15612eb957565b60405162461bcd60e51b815260206004820152601960248201527f494e56414c49445f4e554d4245525f4f465f5349474e455253000000000000006044820152606490fd5b8051821015611b985760209160051b010190565b15612f1957565b60405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b6044820152606490fd5b15612f5957565b60405162461bcd60e51b815260206004820152601160248201527024a72b20a624a22fab20a624a220aa27a960791b6044820152606490fd5b97938b9d9c999591969297938b9c609b54809e819051149182613147575b50508061313d575b612fc190612eb2565b60005b8d8110612fdf575060019e5050505050505050505050505050565b8f60008e8e6130db8f948f8f8f8f8f8f8f8f8f9d8f979860209f6130b39a6130836130ac9a8c9a6130a69a61309f9a8d9a6130999a613091986040519a6020998c9a8b019d8e98969492906101109a989694916001600160601b0319809481809460601b168d5260601b1660148c015260601b1660288a015260601b16603c88015260508701526070860152609085015260b084015260d083015260f08201520190565b03601f198101835282610459565b519020613154565b99612efe565b5160ff1690565b97612efe565b5192612efe565b5190604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa15610ac5576000516131389190613133906001600160a01b0316613109811515612f12565b61312d610f7e61311885611b73565b905460039190911b1c6001600160a01b031690565b14612f52565b6125e3565b612fc4565b508a518d14612fb8565b90915051148f8e90612fb0565b60405160208101917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008352603c820152603c81526131918161043d565b51902090565b805160009283926020019083906001600160a01b03165af1156102a357565b156131bd57565b60405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa0a2222960a11b6044820152606490fd5b156131f857565b60405162461bcd60e51b815260206004820152601860248201527f544849535f504149525f414c52454144595f4c495354454400000000000000006044820152606490fd5b1561324457565b60405162461bcd60e51b815260206004820152601060248201526f1053149150511657d111531254d5115160821b6044820152606490fd5b1561328357565b60405162461bcd60e51b815260206004820152600f60248201526e2727aa2faa27a5a2a72fa7aba722a960891b6044820152606490fd5b9190916132c56125f2565b6001600160a01b039081169182156133475761330f90613306609754946132ee8684101561338c565b60008080809881945af16133006133cf565b5061340f565b60975490612d29565b9081613324575b505050506122fa6001606555565b828092819261333e96165af16133386133cf565b5061345b565b38808080613316565b60405162461bcd60e51b815260206004820152601960248201527f43414e545f53454e445f544f5f4e554c4c5f41444452455353000000000000006044820152606490fd5b1561339357565b60405162461bcd60e51b8152602060048201526014602482015273494e4352454153455f4c495354494e475f46454560601b6044820152606490fd5b3d1561340a573d9067ffffffffffffffff821161043857604051916133fe601f8201601f191660200184610459565b82523d6000602084013e565b606090565b1561341657565b60405162461bcd60e51b815260206004820152601b60248201527f4c495354494e475f4645455f5452414e534645525f4641494c454400000000006044820152606490fd5b1561346257565b60405162461bcd60e51b815260206004820152602260248201527f524546554e445f52454d41494e494e475f45544845525f53454e545f4641494c604482015261115160f21b6064820152608490fd5b156134b957565b60405162461bcd60e51b815260206004820152601460248201527343414e545f42455f4e554c4c5f4144445245535360601b6044820152606490fd5b60405190818183925160208092019160005b828110613518575050505003902090565b83516001600160a01b031685528695509381019392810192600101613507565b1561353f57565b606460405162461bcd60e51b815260206004820152602060248201527f544f4b454e5f4e4f545f4445504c4f5945445f4f4e5f544849535f434841494e6044820152fd5b1561358a57565b60405162461bcd60e51b815260206004820152601060248201526f1513d2d15397d393d517d31254d5115160821b6044820152606490fd5b156135c957565b60405162461bcd60e51b815260206004820152601d60248201527f4f4e4c595f544f4b454e5f4c49535445525f43414e5f4445504f5349540000006044820152606490fd5b1561361557565b60405162461bcd60e51b815260206004820152601e60248201527f4f4e4c595f544f4b454e5f4c49535445525f43414e5f574954484452415700006044820152606490fd5b1561366157565b60405162461bcd60e51b815260206004820152602160248201527f43414e545f57495448445241575f4d4f52455f5448414e5f415641494c41424c6044820152604560f81b6064820152608490fd5b156136b757565b60405162461bcd60e51b815260206004820152601c60248201527f4f4e4c595f544f4b454e5f4c49535445525f43414e5f4348414e4745000000006044820152606490fdfebba9db4cdbea0a37c207bbb83e20f828cd4441c49891101dc94fd20dc8efc349a2646970667358221220fe49ae60540c7c9eaec23505d0f7ab2265236826541cc30c292e79e1c162dc2264736f6c63430008120033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.