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
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14871543 | 828 days ago | IN | 0 ETH | 0.03089843 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
EthereumBridgeStorageV2
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-30 */ // SPDX-License-Identifier: MIT // File: contracts/library/BridgeSecurity.sol pragma solidity ^0.8.7; library BridgeSecurity { function generateSignerMsgHash(uint64 epoch, address[] memory signers) internal pure returns (bytes32 msgHash) { msgHash = keccak256( abi.encodePacked( bytes1(0x19), bytes1(0), address(0), epoch, _encodeAddressArr(signers) ) ); } function generatePackMsgHash( address thisAddr, uint64 epoch, uint8 networkId, uint64[2] memory blockScanRange, uint256[] memory txHashes, address[] memory tokens, address[] memory recipients, uint256[] memory amounts ) internal pure returns (bytes32 msgHash) { msgHash = keccak256( abi.encodePacked( bytes1(0x19), bytes1(0), thisAddr, epoch, _encodeFixed2Uint64Arr(blockScanRange), networkId, _encodeUint256Arr(txHashes), _encodeAddressArr(tokens), _encodeAddressArr(recipients), _encodeUint256Arr(amounts) ) ); } function signersVerification( bytes32 msgHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s, address[] memory signers, mapping(address => bool) storage mapSigners ) internal view returns (bool) { uint64 totalSigners = 0; for (uint64 i = 0; i < signers.length; i++) { if (mapSigners[signers[i]]) totalSigners++; } return (_getVerifiedSigners(msgHash, v, r, s, mapSigners) == (totalSigners / 2) + 1); } function _getVerifiedSigners( bytes32 msgHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s, mapping(address => bool) storage mapSigners ) private view returns (uint8 verifiedSigners) { address lastAddr = address(0); verifiedSigners = 0; for (uint64 i = 0; i < v.length; i++) { address recovered = ecrecover(msgHash, v[i], r[i], s[i]); if (recovered > lastAddr && mapSigners[recovered]) verifiedSigners++; lastAddr = recovered; } } function _encodeAddressArr(address[] memory arr) private pure returns (bytes memory data) { for (uint64 i = 0; i < arr.length; i++) { data = abi.encodePacked(data, arr[i]); } } function _encodeUint256Arr(uint256[] memory arr) private pure returns (bytes memory data) { for (uint64 i = 0; i < arr.length; i++) { data = abi.encodePacked(data, arr[i]); } } function _encodeFixed2Uint64Arr(uint64[2] memory arr) private pure returns (bytes memory data) { for (uint64 i = 0; i < arr.length; i++) { data = abi.encodePacked(data, arr[i]); } } } // File: contracts/BaseToken/interface/ITokenFactory.sol pragma solidity ^0.8.7; interface ITokenFactory { event OwnerChanged(address indexed oldOwner, address indexed newOwner); event BridgeChanged(address indexed oldBridge, address indexed newBridge); event AdminChanged(address indexed oldAdmin, address indexed newAdmin); event TokenCreated( string name, string indexed symbol, uint256 amount, uint8 decimal, uint256 cap, address indexed token ); event TokenRemoved(address indexed token); event TokenDecimalChanged( address indexed token, uint8 oldDecimal, uint8 newDecimal ); function owner() external view returns (address); function tokens() external view returns (address[] memory); function tokenExist(address token) external view returns (bool); function bridge() external view returns (address); function admin() external view returns (address); function setBridge(address bridge) external; function setAdmin(address admin) external; function createToken( string memory name, string memory symbol, uint256 amount, uint8 decimal, uint256 cap ) external returns (address token); function removeToken(address token) external; function setTokenDecimal(address token, uint8 decimal) external; } // File: contracts/BaseBridgeV2/interface/IBridgeV2.sol pragma solidity ^0.8.7; struct TokenReq { bool exist; uint256 minAmount; uint256 maxAmount; uint256 chargePercent; uint256 minCharge; uint256 maxCharge; } struct CrossTokenInfo { string name; string symbol; } struct NetworkInfo { uint8 id; string name; } struct TokenData { address[] tokens; address[] crossTokens; uint256[] minAmounts; uint256[] maxAmounts; uint256[] chargePercents; uint256[] minCharges; uint256[] maxCharges; uint8[] tokenTypes; } struct TokensInfo { uint8[] ids; address[][] tokens; address[][] crossTokens; uint256[][] minAmounts; uint256[][] maxAmounts; uint256[][] chargePercents; uint256[][] minCharges; uint256[][] maxCharges; uint8[][] tokenTypes; } interface IBridgeV2 { event TokenConnected( address indexed token, uint256 minAmount, uint256 maxAmount, uint256 percent, uint256 minCharge, uint256 maxCharge, address indexed crossToken, string symbol ); event TokenReqChanged( uint64 blockIndex, address indexed token, uint256[2] minAmount, uint256[2] maxAmount, uint256[2] percent, uint256[2] minCharge, uint256[2] maxCharge ); function initialize( address factory, address admin, address tokenFactory, address wMech, uint8 networkId, string memory networkName ) external; function factory() external view returns (address); function admin() external view returns (address); function network() external view returns (uint8, string memory); function activeTokenCount() external view returns (uint8); function crossToken(address crossToken) external view returns (string memory, string memory); function tokens(uint64 futureBlock, uint64 searchBlockIndex) external view returns (TokenData memory data); function blockScanRange() external view returns (uint64[] memory); function txHash(uint256 txHash) external view returns (bool); function setTokenConnection( address token, uint256 minAmount, uint256 maxAmount, uint256 percent, uint256 minCharge, uint256 maxCharge, address crossToken, string memory name, string memory symbol ) external; function setTokenInfo( address token, uint256 minAmount, uint256 maxAmount, uint256 percent, uint256 minCharge, uint256 maxCharge ) external; function resetTokenConnection(address token, address crossToken) external; function processPack( uint64[2] memory blockScanRange, uint256[] memory txHashes, address[] memory tokens, address[] memory recipients, uint256[] memory amounts ) external; function setScanRange(uint64[2] memory scanRange) external; } // File: contracts/library/BridgeUtilsV2.sol pragma solidity ^0.8.7; library BridgeUtilsV2 { uint256 internal constant FUTURE_BLOCK_INTERVAL = 100; uint256 public constant CHARGE_PERCENTAGE_DIVIDER = 10000; function roundFuture(uint256 blockIndex) internal pure returns (uint64) { uint256 _futureBlockIndex; if (blockIndex <= FUTURE_BLOCK_INTERVAL) { _futureBlockIndex = FUTURE_BLOCK_INTERVAL; } else { _futureBlockIndex = FUTURE_BLOCK_INTERVAL * ((blockIndex / FUTURE_BLOCK_INTERVAL) + 1); } return uint64(_futureBlockIndex); } function getFuture(uint256 blockIndex) internal pure returns (uint64 futureBlockIndex) { uint256 _futureBlockIndex; if (blockIndex <= FUTURE_BLOCK_INTERVAL) { _futureBlockIndex = 0; } else { _futureBlockIndex = FUTURE_BLOCK_INTERVAL * (blockIndex / FUTURE_BLOCK_INTERVAL); } return uint64(_futureBlockIndex); } function getBlockScanRange( uint16 count, uint8[] memory networks, mapping(uint8 => address) storage bridges ) internal view returns (uint8[] memory _networks, uint64[][] memory _ranges) { _networks = new uint8[](count); _ranges = new uint64[][](count); uint64 k = 0; for (uint64 i = 0; i < networks.length; i++) { if (bridges[networks[i]] != address(0)) { _networks[k] = networks[i]; _ranges[k] = IBridgeV2(bridges[networks[i]]).blockScanRange(); k++; } } } function getTokenReq( uint64 futureBlock, address token, uint64[] memory futureBlocks, mapping(address => mapping(uint64 => TokenReq)) storage tokenReqs ) internal view returns ( uint256 minAmount, uint256 maxAmount, uint256 percent, uint256 minCharge, uint256 maxCharge ) { TokenReq memory _req = getReq( futureBlock, token, futureBlocks, tokenReqs ); minAmount = _req.minAmount; maxAmount = _req.maxAmount; percent = _req.chargePercent; minCharge = _req.minCharge; maxCharge = _req.maxCharge; } function updateMap( address[] memory arr, bool status, mapping(address => bool) storage map ) internal { for (uint64 i = 0; i < arr.length; i++) { map[arr[i]] = status; } } function getReq( uint64 blockIndex, address token, uint64[] memory futureBlocks, mapping(address => mapping(uint64 => TokenReq)) storage tokenReqs ) internal view returns (TokenReq memory req) { req = tokenReqs[token][blockIndex]; if (!req.exist) { for (uint256 i = futureBlocks.length; i > 0; i--) { if (futureBlocks[i - 1] <= blockIndex) { req = tokenReqs[token][futureBlocks[i - 1]]; if (req.exist) return req; } } } } function getCountBySearchIndex( uint64 searchBlockIndex, address[] memory tokens, mapping(address => bool) storage mapTokens, mapping(address => uint64) storage mapTokenCreatedBlockIndex ) internal view returns (uint64 k) { for (uint64 i = 0; i < tokens.length; i++) { if ( mapTokens[tokens[i]] && (mapTokenCreatedBlockIndex[tokens[i]] <= searchBlockIndex) ) { k++; } } } } // File: contracts/BaseCrossBridgeV2/interface/ICrossBridgeStorageV2.sol pragma solidity ^0.8.7; interface ICrossBridgeStorageV2 { event OwnerChanged(address indexed oldOwner, address indexed newOwner); event SignersChanged( address[] indexed oldSigners, address[] indexed newSigners ); event RelayersChanged( address[] indexed oldRelayers, address[] indexed newRelayers ); function owner() external view returns (address); function admin() external view returns (address); function bridge() external view returns (address); function network() external view returns (NetworkInfo memory); function epoch() external view returns (uint64); function signers() external view returns (address[] memory); function relayers() external view returns (address[] memory); function mapSigner(address signer) external view returns (bool); function mapRelayer(address relayer) external view returns (bool); function setCallers(address admin, address bridge) external; function setEpoch(uint64 epoch) external; function setSigners(address[] memory signers_) external; function setRelayers(address[] memory relayers_) external; function signerVerification( bytes32 msgHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) external view returns (bool); } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts v4.4.0 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @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 a proxied contract can't have 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. * * 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 initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || !_initialized, "Initializable: contract is already initialized" ); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer {} function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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 initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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); } uint256[49] private __gap; } // File: contracts/BaseCrossBridgeV2/base/CrossBridgeStorageUpgradeableV2.sol pragma solidity ^0.8.7; contract CrossBridgeStorageUpgradeableV2 is Initializable, OwnableUpgradeable, ICrossBridgeStorageV2 { using BridgeSecurity for *; using BridgeUtilsV2 for *; address private _admin; address private _bridge; NetworkInfo private _network; uint64 private _epoch; address[] private _signers; address[] private _relayers; mapping(address => bool) private _mapSigners; mapping(address => bool) private _mapRelayers; function __CrossBridgeStorage_init( uint8 networkId, string memory networkName ) internal initializer { __Ownable_init(); _network.id = networkId; _network.name = networkName; } function owner() public view override(OwnableUpgradeable, ICrossBridgeStorageV2) returns (address) { return OwnableUpgradeable.owner(); } function admin() public view virtual override returns (address) { return _admin; } function bridge() public view virtual override returns (address) { return _bridge; } modifier onlyAllowedOwner() { require(msg.sender == bridge() || msg.sender == admin()); _; } function network() external view virtual override returns (NetworkInfo memory) { return _network; } function epoch() external view virtual override returns (uint64) { return _epoch; } function signers() external view virtual override returns (address[] memory) { return _signers; } function relayers() external view virtual override returns (address[] memory) { return _relayers; } function mapSigner(address signer) external view virtual override returns (bool) { return _mapSigners[signer]; } function mapRelayer(address relayer) external view virtual override returns (bool) { return _mapRelayers[relayer]; } function setCallers(address admin_, address bridge_) external virtual override onlyOwner { _admin = admin_; _bridge = bridge_; } function setEpoch(uint64 epoch_) external virtual override onlyAllowedOwner { _epoch = epoch_; } function setSigners(address[] memory signers_) external virtual override onlyAllowedOwner { emit SignersChanged(_signers, signers_); BridgeUtilsV2.updateMap(_signers, false, _mapSigners); delete _signers; _signers = signers_; BridgeUtilsV2.updateMap(signers_, true, _mapSigners); } function setRelayers(address[] memory relayers_) external virtual override onlyAllowedOwner { emit RelayersChanged(_relayers, relayers_); BridgeUtilsV2.updateMap(_relayers, false, _mapRelayers); delete _relayers; _relayers = relayers_; BridgeUtilsV2.updateMap(relayers_, true, _mapRelayers); } function signerVerification( bytes32 msgHash, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) external view virtual override returns (bool) { return msgHash.signersVerification(v, r, s, _signers, _mapSigners); } } // File: contracts/Net-Ethereum/BridgeV2/EthereumBridgeStorageV2.sol pragma solidity ^0.8.7; contract EthereumBridgeStorageV2 is CrossBridgeStorageUpgradeableV2 { function initialize(uint8 networkId, string memory networkName) public initializer { __CrossBridgeStorage_init(networkId, networkName); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","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":"oldRelayers","type":"address[]"},{"indexed":true,"internalType":"address[]","name":"newRelayers","type":"address[]"}],"name":"RelayersChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address[]","name":"oldSigners","type":"address[]"},{"indexed":true,"internalType":"address[]","name":"newSigners","type":"address[]"}],"name":"SignersChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"networkId","type":"uint8"},{"internalType":"string","name":"networkName","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"relayer","type":"address"}],"name":"mapRelayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"mapSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"network","outputs":[{"components":[{"internalType":"uint8","name":"id","type":"uint8"},{"internalType":"string","name":"name","type":"string"}],"internalType":"struct NetworkInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"relayers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"bridge_","type":"address"}],"name":"setCallers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"epoch_","type":"uint64"}],"name":"setEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"relayers_","type":"address[]"}],"name":"setRelayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers_","type":"address[]"}],"name":"setSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32"},{"internalType":"uint8[]","name":"v","type":"uint8[]"},{"internalType":"bytes32[]","name":"r","type":"bytes32[]"},{"internalType":"bytes32[]","name":"s","type":"bytes32[]"}],"name":"signerVerification","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611556806100206000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063984821fe116100a2578063e78cea9211610071578063e78cea9214610227578063f0d899e114610238578063f2fde38b14610264578063f851a44014610277578063fc578c341461028857600080fd5b8063984821fe146101e6578063a3772662146101f9578063b831c4221461020c578063bc8d63281461021f57600080fd5b8063715018a6116100de578063715018a614610190578063759886dd146101985780638da5cb5b146101ab578063900cf0cf146101cb57600080fd5b806307c351dd1461011057806311bde4fb1461015157806346f0975a146101665780636739afca1461017b575b600080fd5b61013c61011e366004610ed2565b6001600160a01b03166000908152606c602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61016461015f366004610ef4565b61029b565b005b61016e6102ea565b6040516101489190610f1d565b61018361034c565b6040516101489190610f6a565b61016461040e565b61013c6101a63660046110b9565b610452565b6101b36104d3565b6040516001600160a01b039091168152602001610148565b6069546040516001600160401b039091168152602001610148565b6101646101f43660046111a8565b6104ec565b6101646102073660046111a8565b610604565b61016461021a36600461123f565b610719565b61016e610776565b6066546001600160a01b03166101b3565b61013c610246366004610ed2565b6001600160a01b03166000908152606d602052604090205460ff1690565b610164610272366004610ed2565b6107d6565b6065546001600160a01b03166101b3565b610164610296366004611272565b610873565b6066546001600160a01b03163314806102be57506065546001600160a01b031633145b6102c757600080fd5b6069805467ffffffffffffffff19166001600160401b0392909216919091179055565b6060606a80548060200260200160405190810160405280929190818152602001828054801561034257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610324575b5050505050905090565b604080518082019091526000815260606020820152604080518082019091526067805460ff1682526068805460208401919061038790611317565b80601f01602080910402602001604051908101604052809291908181526020018280546103b390611317565b80156104005780601f106103d557610100808354040283529160200191610400565b820191906000526020600020905b8154815290600101906020018083116103e357829003601f168201915b505050505081525050905090565b336104176104d3565b6001600160a01b0316146104465760405162461bcd60e51b815260040161043d90611352565b60405180910390fd5b61045060006108eb565b565b60006104ca848484606a8054806020026020016040519081016040528092919081815260200182805480156104b057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610492575b5050505050606c8a61093d9095949392919063ffffffff16565b95945050505050565b60006104e76033546001600160a01b031690565b905090565b6066546001600160a01b031633148061050f57506065546001600160a01b031633145b61051857600080fd5b806040516105269190611387565b6040518091039020606b60405161053d91906113c6565b604051908190038120907f0623a6f13c25eef88c0c3f54887ebf280d5846e69ef1582bb0e8a96c4300044090600090a36105d4606b8054806020026020016040519081016040528092919081815260200182805480156105c657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105a8575b50505050506000606d6109fb565b6105e0606b6000610daa565b80516105f390606b906020840190610dc8565b50610601816001606d6109fb565b50565b6066546001600160a01b031633148061062757506065546001600160a01b031633145b61063057600080fd5b8060405161063e9190611387565b6040518091039020606a60405161065591906113c6565b604051908190038120907f36da94c4bacad0d849fec3f61fba31851148387425abbfa4d1e1ed6ca73efda690600090a36106ec606a8054806020026020016040519081016040528092919081815260200182805480156106de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106c0575b50505050506000606c6109fb565b6106f8606a6000610daa565b805161070b90606a906020840190610dc8565b50610601816001606c6109fb565b336107226104d3565b6001600160a01b0316146107485760405162461bcd60e51b815260040161043d90611352565b606580546001600160a01b039384166001600160a01b03199182161790915560668054929093169116179055565b6060606b805480602002602001604051908101604052809291908181526020018280548015610342576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610324575050505050905090565b336107df6104d3565b6001600160a01b0316146108055760405162461bcd60e51b815260040161043d90611352565b6001600160a01b03811661086a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161043d565b610601816108eb565b600054610100900460ff168061088c575060005460ff16155b6108a85760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff161580156108ca576000805461ffff19166101011790555b6108d48383610a79565b80156108e6576000805461ff00191690555b505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080805b8451816001600160401b031610156109be5783600086836001600160401b0316815181106109725761097261144e565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156109ac57816109a88161147a565b9250505b806109b68161147a565b915050610942565b506109ca6002826114a1565b6109d59060016114d5565b6001600160401b03166109eb8989898988610b11565b60ff161498975050505050505050565b60005b8351816001600160401b03161015610a73578282600086846001600160401b031681518110610a2f57610a2f61144e565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610a6b8161147a565b9150506109fe565b50505050565b600054610100900460ff1680610a92575060005460ff16155b610aae5760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610ad0576000805461ffff19166101011790555b610ad8610c65565b6067805460ff191660ff85161790558151610afa906068906020850190610e2d565b5080156108e6576000805461ff0019169055505050565b600080805b8651816001600160401b03161015610c5a57600060018989846001600160401b031681518110610b4857610b4861144e565b602002602001015189856001600160401b031681518110610b6b57610b6b61144e565b602002602001015189866001600160401b031681518110610b8e57610b8e61144e565b602002602001015160405160008152602001604052604051610bcc949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610bee573d6000803e3d6000fd5b505050602060405103519050826001600160a01b0316816001600160a01b0316118015610c3357506001600160a01b03811660009081526020869052604090205460ff165b15610c465783610c4281611500565b9450505b915080610c528161147a565b915050610b16565b505095945050505050565b600054610100900460ff1680610c7e575060005460ff16155b610c9a5760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610cbc576000805461ffff19166101011790555b610cc4610ce0565b610ccc610d4a565b8015610601576000805461ff001916905550565b600054610100900460ff1680610cf9575060005460ff16155b610d155760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610ccc576000805461ffff19166101011790558015610601576000805461ff001916905550565b600054610100900460ff1680610d63575060005460ff16155b610d7f5760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610da1576000805461ffff19166101011790555b610ccc336108eb565b50805460008255906000526020600020908101906106019190610ea1565b828054828255906000526020600020908101928215610e1d579160200282015b82811115610e1d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610de8565b50610e29929150610ea1565b5090565b828054610e3990611317565b90600052602060002090601f016020900481019282610e5b5760008555610e1d565b82601f10610e7457805160ff1916838001178555610e1d565b82800160010185558215610e1d579182015b82811115610e1d578251825591602001919060010190610e86565b5b80821115610e295760008155600101610ea2565b80356001600160a01b0381168114610ecd57600080fd5b919050565b600060208284031215610ee457600080fd5b610eed82610eb6565b9392505050565b600060208284031215610f0657600080fd5b81356001600160401b0381168114610eed57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015610f5e5783516001600160a01b031683529284019291840191600101610f39565b50909695505050505050565b6000602080835260ff8451168184015280840151604080850152805180606086015260005b81811015610fab57828101840151868201608001528301610f8f565b81811115610fbd576000608083880101525b50601f01601f191693909301608001949350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561101257611012610fd4565b604052919050565b60006001600160401b0382111561103357611033610fd4565b5060051b60200190565b803560ff81168114610ecd57600080fd5b600082601f83011261105f57600080fd5b8135602061107461106f8361101a565b610fea565b82815260059290921b8401810191818101908684111561109357600080fd5b8286015b848110156110ae5780358352918301918301611097565b509695505050505050565b600080600080608085870312156110cf57600080fd5b843593506020808601356001600160401b03808211156110ee57600080fd5b818801915088601f83011261110257600080fd5b813561111061106f8261101a565b81815260059190911b8301840190848101908b83111561112f57600080fd5b938501935b82851015611154576111458561103d565b82529385019390850190611134565b97505050604088013592508083111561116c57600080fd5b61117889848a0161104e565b9450606088013592508083111561118e57600080fd5b505061119c8782880161104e565b91505092959194509250565b600060208083850312156111bb57600080fd5b82356001600160401b038111156111d157600080fd5b8301601f810185136111e257600080fd5b80356111f061106f8261101a565b81815260059190911b8201830190838101908783111561120f57600080fd5b928401925b828410156112345761122584610eb6565b82529284019290840190611214565b979650505050505050565b6000806040838503121561125257600080fd5b61125b83610eb6565b915061126960208401610eb6565b90509250929050565b6000806040838503121561128557600080fd5b61128e8361103d565b91506020808401356001600160401b03808211156112ab57600080fd5b818601915086601f8301126112bf57600080fd5b8135818111156112d1576112d1610fd4565b6112e3601f8201601f19168501610fea565b915080825287848285010111156112f957600080fd5b80848401858401376000848284010152508093505050509250929050565b600181811c9082168061132b57607f821691505b6020821081141561134c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b815160009082906020808601845b838110156113ba5781516001600160a01b031685529382019390820190600101611395565b50929695505050505050565b60008183548391508460005260208060002060005b838110156113ba5781546001600160a01b0316855293820193600191820191016113db565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160401b038083168181141561149757611497611464565b6001019392505050565b60006001600160401b03808416806114c957634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b60006001600160401b038083168185168083038211156114f7576114f7611464565b01949350505050565b600060ff821660ff81141561151757611517611464565b6001019291505056fea2646970667358221220bbe7267b316e3fdf4e69eaef71e93f5233154ef94faf00b7e6bd5fdb51f1996a64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063984821fe116100a2578063e78cea9211610071578063e78cea9214610227578063f0d899e114610238578063f2fde38b14610264578063f851a44014610277578063fc578c341461028857600080fd5b8063984821fe146101e6578063a3772662146101f9578063b831c4221461020c578063bc8d63281461021f57600080fd5b8063715018a6116100de578063715018a614610190578063759886dd146101985780638da5cb5b146101ab578063900cf0cf146101cb57600080fd5b806307c351dd1461011057806311bde4fb1461015157806346f0975a146101665780636739afca1461017b575b600080fd5b61013c61011e366004610ed2565b6001600160a01b03166000908152606c602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61016461015f366004610ef4565b61029b565b005b61016e6102ea565b6040516101489190610f1d565b61018361034c565b6040516101489190610f6a565b61016461040e565b61013c6101a63660046110b9565b610452565b6101b36104d3565b6040516001600160a01b039091168152602001610148565b6069546040516001600160401b039091168152602001610148565b6101646101f43660046111a8565b6104ec565b6101646102073660046111a8565b610604565b61016461021a36600461123f565b610719565b61016e610776565b6066546001600160a01b03166101b3565b61013c610246366004610ed2565b6001600160a01b03166000908152606d602052604090205460ff1690565b610164610272366004610ed2565b6107d6565b6065546001600160a01b03166101b3565b610164610296366004611272565b610873565b6066546001600160a01b03163314806102be57506065546001600160a01b031633145b6102c757600080fd5b6069805467ffffffffffffffff19166001600160401b0392909216919091179055565b6060606a80548060200260200160405190810160405280929190818152602001828054801561034257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610324575b5050505050905090565b604080518082019091526000815260606020820152604080518082019091526067805460ff1682526068805460208401919061038790611317565b80601f01602080910402602001604051908101604052809291908181526020018280546103b390611317565b80156104005780601f106103d557610100808354040283529160200191610400565b820191906000526020600020905b8154815290600101906020018083116103e357829003601f168201915b505050505081525050905090565b336104176104d3565b6001600160a01b0316146104465760405162461bcd60e51b815260040161043d90611352565b60405180910390fd5b61045060006108eb565b565b60006104ca848484606a8054806020026020016040519081016040528092919081815260200182805480156104b057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610492575b5050505050606c8a61093d9095949392919063ffffffff16565b95945050505050565b60006104e76033546001600160a01b031690565b905090565b6066546001600160a01b031633148061050f57506065546001600160a01b031633145b61051857600080fd5b806040516105269190611387565b6040518091039020606b60405161053d91906113c6565b604051908190038120907f0623a6f13c25eef88c0c3f54887ebf280d5846e69ef1582bb0e8a96c4300044090600090a36105d4606b8054806020026020016040519081016040528092919081815260200182805480156105c657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116105a8575b50505050506000606d6109fb565b6105e0606b6000610daa565b80516105f390606b906020840190610dc8565b50610601816001606d6109fb565b50565b6066546001600160a01b031633148061062757506065546001600160a01b031633145b61063057600080fd5b8060405161063e9190611387565b6040518091039020606a60405161065591906113c6565b604051908190038120907f36da94c4bacad0d849fec3f61fba31851148387425abbfa4d1e1ed6ca73efda690600090a36106ec606a8054806020026020016040519081016040528092919081815260200182805480156106de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106c0575b50505050506000606c6109fb565b6106f8606a6000610daa565b805161070b90606a906020840190610dc8565b50610601816001606c6109fb565b336107226104d3565b6001600160a01b0316146107485760405162461bcd60e51b815260040161043d90611352565b606580546001600160a01b039384166001600160a01b03199182161790915560668054929093169116179055565b6060606b805480602002602001604051908101604052809291908181526020018280548015610342576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610324575050505050905090565b336107df6104d3565b6001600160a01b0316146108055760405162461bcd60e51b815260040161043d90611352565b6001600160a01b03811661086a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161043d565b610601816108eb565b600054610100900460ff168061088c575060005460ff16155b6108a85760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff161580156108ca576000805461ffff19166101011790555b6108d48383610a79565b80156108e6576000805461ff00191690555b505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080805b8451816001600160401b031610156109be5783600086836001600160401b0316815181106109725761097261144e565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156109ac57816109a88161147a565b9250505b806109b68161147a565b915050610942565b506109ca6002826114a1565b6109d59060016114d5565b6001600160401b03166109eb8989898988610b11565b60ff161498975050505050505050565b60005b8351816001600160401b03161015610a73578282600086846001600160401b031681518110610a2f57610a2f61144e565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610a6b8161147a565b9150506109fe565b50505050565b600054610100900460ff1680610a92575060005460ff16155b610aae5760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610ad0576000805461ffff19166101011790555b610ad8610c65565b6067805460ff191660ff85161790558151610afa906068906020850190610e2d565b5080156108e6576000805461ff0019169055505050565b600080805b8651816001600160401b03161015610c5a57600060018989846001600160401b031681518110610b4857610b4861144e565b602002602001015189856001600160401b031681518110610b6b57610b6b61144e565b602002602001015189866001600160401b031681518110610b8e57610b8e61144e565b602002602001015160405160008152602001604052604051610bcc949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610bee573d6000803e3d6000fd5b505050602060405103519050826001600160a01b0316816001600160a01b0316118015610c3357506001600160a01b03811660009081526020869052604090205460ff165b15610c465783610c4281611500565b9450505b915080610c528161147a565b915050610b16565b505095945050505050565b600054610100900460ff1680610c7e575060005460ff16155b610c9a5760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610cbc576000805461ffff19166101011790555b610cc4610ce0565b610ccc610d4a565b8015610601576000805461ff001916905550565b600054610100900460ff1680610cf9575060005460ff16155b610d155760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610ccc576000805461ffff19166101011790558015610601576000805461ff001916905550565b600054610100900460ff1680610d63575060005460ff16155b610d7f5760405162461bcd60e51b815260040161043d90611400565b600054610100900460ff16158015610da1576000805461ffff19166101011790555b610ccc336108eb565b50805460008255906000526020600020908101906106019190610ea1565b828054828255906000526020600020908101928215610e1d579160200282015b82811115610e1d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610de8565b50610e29929150610ea1565b5090565b828054610e3990611317565b90600052602060002090601f016020900481019282610e5b5760008555610e1d565b82601f10610e7457805160ff1916838001178555610e1d565b82800160010185558215610e1d579182015b82811115610e1d578251825591602001919060010190610e86565b5b80821115610e295760008155600101610ea2565b80356001600160a01b0381168114610ecd57600080fd5b919050565b600060208284031215610ee457600080fd5b610eed82610eb6565b9392505050565b600060208284031215610f0657600080fd5b81356001600160401b0381168114610eed57600080fd5b6020808252825182820181905260009190848201906040850190845b81811015610f5e5783516001600160a01b031683529284019291840191600101610f39565b50909695505050505050565b6000602080835260ff8451168184015280840151604080850152805180606086015260005b81811015610fab57828101840151868201608001528301610f8f565b81811115610fbd576000608083880101525b50601f01601f191693909301608001949350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561101257611012610fd4565b604052919050565b60006001600160401b0382111561103357611033610fd4565b5060051b60200190565b803560ff81168114610ecd57600080fd5b600082601f83011261105f57600080fd5b8135602061107461106f8361101a565b610fea565b82815260059290921b8401810191818101908684111561109357600080fd5b8286015b848110156110ae5780358352918301918301611097565b509695505050505050565b600080600080608085870312156110cf57600080fd5b843593506020808601356001600160401b03808211156110ee57600080fd5b818801915088601f83011261110257600080fd5b813561111061106f8261101a565b81815260059190911b8301840190848101908b83111561112f57600080fd5b938501935b82851015611154576111458561103d565b82529385019390850190611134565b97505050604088013592508083111561116c57600080fd5b61117889848a0161104e565b9450606088013592508083111561118e57600080fd5b505061119c8782880161104e565b91505092959194509250565b600060208083850312156111bb57600080fd5b82356001600160401b038111156111d157600080fd5b8301601f810185136111e257600080fd5b80356111f061106f8261101a565b81815260059190911b8201830190838101908783111561120f57600080fd5b928401925b828410156112345761122584610eb6565b82529284019290840190611214565b979650505050505050565b6000806040838503121561125257600080fd5b61125b83610eb6565b915061126960208401610eb6565b90509250929050565b6000806040838503121561128557600080fd5b61128e8361103d565b91506020808401356001600160401b03808211156112ab57600080fd5b818601915086601f8301126112bf57600080fd5b8135818111156112d1576112d1610fd4565b6112e3601f8201601f19168501610fea565b915080825287848285010111156112f957600080fd5b80848401858401376000848284010152508093505050509250929050565b600181811c9082168061132b57607f821691505b6020821081141561134c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b815160009082906020808601845b838110156113ba5781516001600160a01b031685529382019390820190600101611395565b50929695505050505050565b60008183548391508460005260208060002060005b838110156113ba5781546001600160a01b0316855293820193600191820191016113db565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160401b038083168181141561149757611497611464565b6001019392505050565b60006001600160401b03808416806114c957634e487b7160e01b600052601260045260246000fd5b92169190910492915050565b60006001600160401b038083168185168083038211156114f7576114f7611464565b01949350505050565b600060ff821660ff81141561151757611517611464565b6001019291505056fea2646970667358221220bbe7267b316e3fdf4e69eaef71e93f5233154ef94faf00b7e6bd5fdb51f1996a64736f6c634300080c0033
Deployed Bytecode Sourcemap
23719:252:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21833:176;;;;;;:::i;:::-;-1:-1:-1;;;;;21982:19:0;21953:4;21982:19;;;:11;:19;;;;;;;;;21833:176;;;;548:14:1;;541:22;523:41;;511:2;496:18;21833:176:0;;;;;;;;22405:151;;;;;;:::i;:::-;;:::i;:::-;;21493:161;;;:::i;:::-;;;;;;;:::i;21217:163::-;;;:::i;:::-;;;;;;;:::i;18961:103::-;;;:::i;23336:277::-;;;;;;:::i;:::-;;:::i;20684:192::-;;;:::i;:::-;;;-1:-1:-1;;;;;5361:32:1;;;5343:51;;5331:2;5316:18;20684:192:0;5197:203:1;21388:97:0;21471:6;;21388:97;;-1:-1:-1;;;;;21471:6:0;;;5549:50:1;;5537:2;5522:18;21388:97:0;5405:200:1;22944:384:0;;;;;;:::i;:::-;;:::i;22564:372::-;;;;;;:::i;:::-;;:::i;22205:192::-;;;;;;:::i;:::-;;:::i;21662:163::-;;;:::i;20988:98::-;21071:7;;-1:-1:-1;;;;;21071:7:0;20988:98;;22017:180;;;;;;:::i;:::-;-1:-1:-1;;;;;22168:21:0;22139:4;22168:21;;;:12;:21;;;;;;;;;22017:180;19219:238;;;;;;:::i;:::-;;:::i;20884:96::-;20966:6;;-1:-1:-1;;;;;20966:6:0;20884:96;;23794:174;;;;;;:::i;:::-;;:::i;22405:151::-;21071:7;;-1:-1:-1;;;;;21071:7:0;21141:10;:22;;:47;;-1:-1:-1;20966:6:0;;-1:-1:-1;;;;;20966:6:0;21167:10;:21;21141:47;21133:56;;;;;;22533:6:::1;:15:::0;;-1:-1:-1;;22533:15:0::1;-1:-1:-1::0;;;;;22533:15:0;;;::::1;::::0;;;::::1;::::0;;22405:151::o;21493:161::-;21597:16;21638:8;21631:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21631:15:0;;;;;;;;;;;;;;;;;;;;;;;21493:161;:::o;21217:163::-;-1:-1:-1;;;;;;;;;;;;;;;;;21357:15:0;;;;;;;;;21364:8;21357:15;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21217:163;:::o;18961:103::-;16819:10;18530:7;:5;:7::i;:::-;-1:-1:-1;;;;;18530:23:0;;18522:68;;;;-1:-1:-1;;;18522:68:0;;;;;;;:::i;:::-;;;;;;;;;19026:30:::1;19053:1;19026:18;:30::i;:::-;18961:103::o:0;23336:277::-;23522:4;23546:59;23574:1;23577;23580;23583:8;23546:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23546:59:0;;;;;;;;;;;;;;;;;;;;;23593:11;23546:7;:27;;:59;;;;;;;;:::i;:::-;23539:66;23336:277;-1:-1:-1;;;;;23336:277:0:o;20684:192::-;20810:7;20842:26;18383:6;;-1:-1:-1;;;;;18383:6:0;;18310:87;20842:26;20835:33;;20684:192;:::o;22944:384::-;21071:7;;-1:-1:-1;;;;;21071:7:0;21141:10;:22;;:47;;-1:-1:-1;20966:6:0;;-1:-1:-1;;;;;20966:6:0;21167:10;:21;21141:47;21133:56;;;;;;23120:9:::1;23093:37;;;;;;:::i;:::-;;;;;;;;23109:9;23093:37;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;23141:55;23165:9;23141:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;23141:55:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;23176:5;23183:12;23141:23;:55::i;:::-;23207:16;23214:9;;23207:16;:::i;:::-;23234:21:::0;;::::1;::::0;:9:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;23266:54;23290:9;23301:4;23307:12;23266:23;:54::i;:::-;22944:384:::0;:::o;22564:372::-;21071:7;;-1:-1:-1;;;;;21071:7:0;21141:10;:22;;:47;;-1:-1:-1;20966:6:0;;-1:-1:-1;;;;;20966:6:0;21167:10;:21;21141:47;21133:56;;;;;;22736:8:::1;22711:34;;;;;;:::i;:::-;;;;;;;;22726:8;22711:34;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;22756:53;22780:8;22756:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;22756:53:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;22790:5;22797:11;22756:23;:53::i;:::-;22820:15;22827:8;;22820:15;:::i;:::-;22846:19:::0;;::::1;::::0;:8:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;22876:52;22900:8;22910:4;22916:11;22876:23;:52::i;22205:192::-:0;16819:10;18530:7;:5;:7::i;:::-;-1:-1:-1;;;;;18530:23:0;;18522:68;;;;-1:-1:-1;;;18522:68:0;;;;;;;:::i;:::-;22346:6:::1;:15:::0;;-1:-1:-1;;;;;22346:15:0;;::::1;-1:-1:-1::0;;;;;;22346:15:0;;::::1;;::::0;;;22372:7:::1;:17:::0;;;;;::::1;::::0;::::1;;::::0;;22205:192::o;21662:163::-;21767:16;21808:9;21801:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21801:16:0;;;;;;;;;;;;;;;;;;;;;;21662:163;:::o;19219:238::-;16819:10;18530:7;:5;:7::i;:::-;-1:-1:-1;;;;;18530:23:0;;18522:68;;;;-1:-1:-1;;;18522:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19322:22:0;::::1;19300:110;;;::::0;-1:-1:-1;;;19300:110:0;;9733:2:1;19300:110:0::1;::::0;::::1;9715:21:1::0;9772:2;9752:18;;;9745:30;9811:34;9791:18;;;9784:62;-1:-1:-1;;;9862:18:1;;;9855:36;9908:19;;19300:110:0::1;9531:402:1::0;19300:110:0::1;19421:28;19440:8;19421:18;:28::i;23794:174::-:0;15471:13;;;;;;;;:30;;-1:-1:-1;15489:12:0;;;;15488:13;15471:30;15449:126;;;;-1:-1:-1;;;15449:126:0;;;;;;;:::i;:::-;15588:19;15611:13;;;;;;15610:14;15635:101;;;;15670:13;:20;;-1:-1:-1;;15705:19:0;;;;;15635:101;23911:49:::1;23937:9;23948:11;23911:25;:49::i;:::-;15766:14:::0;15762:68;;;15813:5;15797:21;;-1:-1:-1;;15797:21:0;;;15762:68;15438:399;23794:174;;:::o;19617:191::-;19710:6;;;-1:-1:-1;;;;;19727:17:0;;;-1:-1:-1;;;;;;19727:17:0;;;;;;;19760:40;;19710:6;;;19727:17;19710:6;;19760:40;;19691:16;;19760:40;19680:128;19617:191;:::o;1360:538::-;1619:4;;;1670:113;1693:7;:14;1689:1;-1:-1:-1;;;;;1689:18:0;;1670:113;;;1733:10;:22;1744:7;1752:1;-1:-1:-1;;;;;1744:10:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1733:22:0;;;;;;;;;;;-1:-1:-1;1733:22:0;;;;1729:42;;;1757:14;;;;:::i;:::-;;;;1729:42;1709:3;;;;:::i;:::-;;;;1670:113;;;-1:-1:-1;1868:16:0;1883:1;1868:12;:16;:::i;:::-;1867:22;;1888:1;1867:22;:::i;:::-;-1:-1:-1;;;;;1801:88:0;:49;1821:7;1830:1;1833;1836;1839:10;1801:19;:49::i;:::-;:88;;;;1360:538;-1:-1:-1;;;;;;;;1360:538:0:o;10489:240::-;10640:8;10635:87;10658:3;:10;10654:1;-1:-1:-1;;;;;10654:14:0;;10635:87;;;10704:6;10690:3;:11;10694:3;10698:1;-1:-1:-1;;;;;10694:6:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;10690:11:0;;;;;;;;;;;-1:-1:-1;10690:11:0;:20;;-1:-1:-1;;10690:20:0;;;;;;;;;;10670:3;;;;:::i;:::-;;;;10635:87;;;;10489:240;;;:::o;20444:232::-;15471:13;;;;;;;;:30;;-1:-1:-1;15489:12:0;;;;15488:13;15471:30;15449:126;;;;-1:-1:-1;;;15449:126:0;;;;;;;:::i;:::-;15588:19;15611:13;;;;;;15610:14;15635:101;;;;15670:13;:20;;-1:-1:-1;;15705:19:0;;;;;15635:101;20580:16:::1;:14;:16::i;:::-;20607:8;:23:::0;;-1:-1:-1;;20607:23:0::1;;::::0;::::1;;::::0;;20641:27;;::::1;::::0;:13;;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;15766:14:::0;15762:68;;;15813:5;15797:21;;-1:-1:-1;;15797:21:0;;;15438:399;20444:232;;:::o;1906:590::-;2129:21;;;2233:256;2256:1;:8;2252:1;-1:-1:-1;;;;;2252:12:0;;2233:256;;;2286:17;2306:36;2316:7;2325:1;2327;-1:-1:-1;;;;;2325:4:0;;;;;;;;;:::i;:::-;;;;;;;2331:1;2333;-1:-1:-1;;;;;2331:4:0;;;;;;;;;:::i;:::-;;;;;;;2337:1;2339;-1:-1:-1;;;;;2337:4:0;;;;;;;;;:::i;:::-;;;;;;;2306:36;;;;;;;;;;;;;;;;;11600:25:1;;;11673:4;11661:17;;;;11656:2;11641:18;;11634:45;11710:2;11695:18;;11688:34;11753:2;11738:18;;11731:34;11587:3;11572:19;;11373:398;2306:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2286:56;;2373:8;-1:-1:-1;;;;;2361:20:0;:9;-1:-1:-1;;;;;2361:20:0;;:45;;;;-1:-1:-1;;;;;;2385:21:0;;;;;;;;;;;;;;;;2361:45;2357:85;;;2425:17;;;;:::i;:::-;;;;2357:85;2468:9;-1:-1:-1;2266:3:0;;;;:::i;:::-;;;;2233:256;;;;2152:344;1906:590;;;;;;;:::o;17984:129::-;15471:13;;;;;;;;:30;;-1:-1:-1;15489:12:0;;;;15488:13;15471:30;15449:126;;;;-1:-1:-1;;;15449:126:0;;;;;;;:::i;:::-;15588:19;15611:13;;;;;;15610:14;15635:101;;;;15670:13;:20;;-1:-1:-1;;15705:19:0;;;;;15635:101;18042:26:::1;:24;:26::i;:::-;18079;:24;:26::i;:::-;15766:14:::0;15762:68;;;15813:5;15797:21;;-1:-1:-1;;15797:21:0;;;15438:399;17984:129::o;16672:59::-;15471:13;;;;;;;;:30;;-1:-1:-1;15489:12:0;;;;15488:13;15471:30;15449:126;;;;-1:-1:-1;;;15449:126:0;;;;;;;:::i;:::-;15588:19;15611:13;;;;;;15610:14;15635:101;;;;15670:13;:20;;-1:-1:-1;;15705:19:0;;;;;15762:68;;;;15813:5;15797:21;;-1:-1:-1;;15797:21:0;;;15438:399;16672:59::o;18121:108::-;15471:13;;;;;;;;:30;;-1:-1:-1;15489:12:0;;;;15488:13;15471:30;15449:126;;;;-1:-1:-1;;;15449:126:0;;;;;;;:::i;:::-;15588:19;15611:13;;;;;;15610:14;15635:101;;;;15670:13;:20;;-1:-1:-1;;15705:19:0;;;;;15635:101;18189:32:::1;16819:10:::0;18189:18:::1;:32::i;-1:-1:-1:-:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;575:284::-;633:6;686:2;674:9;665:7;661:23;657:32;654:52;;;702:1;699;692:12;654:52;741:9;728:23;-1:-1:-1;;;;;784:5:1;780:30;773:5;770:41;760:69;;825:1;822;815:12;864:658;1035:2;1087:21;;;1157:13;;1060:18;;;1179:22;;;1006:4;;1035:2;1258:15;;;;1232:2;1217:18;;;1006:4;1301:195;1315:6;1312:1;1309:13;1301:195;;;1380:13;;-1:-1:-1;;;;;1376:39:1;1364:52;;1471:15;;;;1436:12;;;;1412:1;1330:9;1301:195;;;-1:-1:-1;1513:3:1;;864:658;-1:-1:-1;;;;;;864:658:1:o;1527:803::-;1675:4;1704:2;1733;1722:9;1715:21;1791:4;1782:6;1776:13;1772:24;1767:2;1756:9;1752:18;1745:52;1844:2;1836:6;1832:15;1826:22;1886:4;1879;1868:9;1864:20;1857:34;1920:12;1914:19;1969:6;1964:2;1953:9;1949:18;1942:34;1994:1;2004:147;2018:6;2015:1;2012:13;2004:147;;;2114:20;;;2110:29;;2104:36;2079:17;;;2098:3;2075:27;2068:73;2033:10;;2004:147;;;2169:6;2166:1;2163:13;2160:92;;;2240:1;2234:3;2225:6;2214:9;2210:22;2206:32;2199:43;2160:92;-1:-1:-1;2313:2:1;2292:15;-1:-1:-1;;2288:29:1;2273:45;;;;2320:3;2269:55;;1527:803;-1:-1:-1;;;;1527:803:1:o;2335:127::-;2396:10;2391:3;2387:20;2384:1;2377:31;2427:4;2424:1;2417:15;2451:4;2448:1;2441:15;2467:275;2538:2;2532:9;2603:2;2584:13;;-1:-1:-1;;2580:27:1;2568:40;;-1:-1:-1;;;;;2623:34:1;;2659:22;;;2620:62;2617:88;;;2685:18;;:::i;:::-;2721:2;2714:22;2467:275;;-1:-1:-1;2467:275:1:o;2747:181::-;2805:4;-1:-1:-1;;;;;2830:6:1;2827:30;2824:56;;;2860:18;;:::i;:::-;-1:-1:-1;2905:1:1;2901:14;2917:4;2897:25;;2747:181::o;2933:156::-;2999:20;;3059:4;3048:16;;3038:27;;3028:55;;3079:1;3076;3069:12;3094:660;3148:5;3201:3;3194:4;3186:6;3182:17;3178:27;3168:55;;3219:1;3216;3209:12;3168:55;3255:6;3242:20;3281:4;3305:58;3321:41;3359:2;3321:41;:::i;:::-;3305:58;:::i;:::-;3397:15;;;3483:1;3479:10;;;;3467:23;;3463:32;;;3428:12;;;;3507:15;;;3504:35;;;3535:1;3532;3525:12;3504:35;3571:2;3563:6;3559:15;3583:142;3599:6;3594:3;3591:15;3583:142;;;3665:17;;3653:30;;3703:12;;;;3616;;3583:142;;;-1:-1:-1;3743:5:1;3094:660;-1:-1:-1;;;;;;3094:660:1:o;3759:1433::-;3918:6;3926;3934;3942;3995:3;3983:9;3974:7;3970:23;3966:33;3963:53;;;4012:1;4009;4002:12;3963:53;4048:9;4035:23;4025:33;;4077:2;4130;4119:9;4115:18;4102:32;-1:-1:-1;;;;;4194:2:1;4186:6;4183:14;4180:34;;;4210:1;4207;4200:12;4180:34;4248:6;4237:9;4233:22;4223:32;;4293:7;4286:4;4282:2;4278:13;4274:27;4264:55;;4315:1;4312;4305:12;4264:55;4351:2;4338:16;4374:58;4390:41;4428:2;4390:41;:::i;4374:58::-;4466:15;;;4548:1;4544:10;;;;4536:19;;4532:28;;;4497:12;;;;4572:19;;;4569:39;;;4604:1;4601;4594:12;4569:39;4628:11;;;;4648:146;4664:6;4659:3;4656:15;4648:146;;;4730:21;4747:3;4730:21;:::i;:::-;4718:34;;4681:12;;;;4772;;;;4648:146;;;4813:5;-1:-1:-1;;;4871:2:1;4856:18;;4843:32;;-1:-1:-1;4887:16:1;;;4884:36;;;4916:1;4913;4906:12;4884:36;4939:63;4994:7;4983:8;4972:9;4968:24;4939:63;:::i;:::-;4929:73;;5055:2;5044:9;5040:18;5027:32;5011:48;;5084:2;5074:8;5071:16;5068:36;;;5100:1;5097;5090:12;5068:36;;;5123:63;5178:7;5167:8;5156:9;5152:24;5123:63;:::i;:::-;5113:73;;;3759:1433;;;;;;;:::o;5610:895::-;5694:6;5725:2;5768;5756:9;5747:7;5743:23;5739:32;5736:52;;;5784:1;5781;5774:12;5736:52;5824:9;5811:23;-1:-1:-1;;;;;5849:6:1;5846:30;5843:50;;;5889:1;5886;5879:12;5843:50;5912:22;;5965:4;5957:13;;5953:27;-1:-1:-1;5943:55:1;;5994:1;5991;5984:12;5943:55;6030:2;6017:16;6053:58;6069:41;6107:2;6069:41;:::i;6053:58::-;6145:15;;;6227:1;6223:10;;;;6215:19;;6211:28;;;6176:12;;;;6251:19;;;6248:39;;;6283:1;6280;6273:12;6248:39;6307:11;;;;6327:148;6343:6;6338:3;6335:15;6327:148;;;6409:23;6428:3;6409:23;:::i;:::-;6397:36;;6360:12;;;;6453;;;;6327:148;;;6494:5;5610:895;-1:-1:-1;;;;;;;5610:895:1:o;6510:260::-;6578:6;6586;6639:2;6627:9;6618:7;6614:23;6610:32;6607:52;;;6655:1;6652;6645:12;6607:52;6678:29;6697:9;6678:29;:::i;:::-;6668:39;;6726:38;6760:2;6749:9;6745:18;6726:38;:::i;:::-;6716:48;;6510:260;;;;;:::o;6775:834::-;6851:6;6859;6912:2;6900:9;6891:7;6887:23;6883:32;6880:52;;;6928:1;6925;6918:12;6880:52;6951:27;6968:9;6951:27;:::i;:::-;6941:37;;6997:2;7050;7039:9;7035:18;7022:32;-1:-1:-1;;;;;7114:2:1;7106:6;7103:14;7100:34;;;7130:1;7127;7120:12;7100:34;7168:6;7157:9;7153:22;7143:32;;7213:7;7206:4;7202:2;7198:13;7194:27;7184:55;;7235:1;7232;7225:12;7184:55;7271:2;7258:16;7293:2;7289;7286:10;7283:36;;;7299:18;;:::i;:::-;7341:53;7384:2;7365:13;;-1:-1:-1;;7361:27:1;7357:36;;7341:53;:::i;:::-;7328:66;;7417:2;7410:5;7403:17;7457:7;7452:2;7447;7443;7439:11;7435:20;7432:33;7429:53;;;7478:1;7475;7468:12;7429:53;7533:2;7528;7524;7520:11;7515:2;7508:5;7504:14;7491:45;7577:1;7572:2;7567;7560:5;7556:14;7552:23;7545:34;;7598:5;7588:15;;;;;6775:834;;;;;:::o;7614:380::-;7693:1;7689:12;;;;7736;;;7757:61;;7811:4;7803:6;7799:17;7789:27;;7757:61;7864:2;7856:6;7853:14;7833:18;7830:38;7827:161;;;7910:10;7905:3;7901:20;7898:1;7891:31;7945:4;7942:1;7935:15;7973:4;7970:1;7963:15;7827:161;;7614:380;;;:::o;7999:356::-;8201:2;8183:21;;;8220:18;;;8213:30;8279:34;8274:2;8259:18;;8252:62;8346:2;8331:18;;7999:356::o;8360:569::-;8578:13;;8521:3;;8552;;8631:4;8658:15;;;8521:3;8701:201;8715:6;8712:1;8709:13;8701:201;;;8782:13;;-1:-1:-1;;;;;8778:39:1;8764:54;;8840:14;;;;8877:15;;;;8814:1;8730:9;8701:201;;;-1:-1:-1;8918:5:1;;8360:569;-1:-1:-1;;;;;;8360:569:1:o;8934:592::-;9092:3;9123;9155:6;9149:13;9180:3;9171:12;;9202:6;9199:1;9192:17;9228:4;9268:2;9265:1;9255:16;9289:1;9299:200;9313:6;9310:1;9307:13;9299:200;;;9380:13;;-1:-1:-1;;;;;9376:39:1;9362:54;;9438:14;;;;9412:1;9475:14;;;;9328:9;9299:200;;9938:410;10140:2;10122:21;;;10179:2;10159:18;;;10152:30;10218:34;10213:2;10198:18;;10191:62;-1:-1:-1;;;10284:2:1;10269:18;;10262:44;10338:3;10323:19;;9938:410::o;10353:127::-;10414:10;10409:3;10405:20;10402:1;10395:31;10445:4;10442:1;10435:15;10469:4;10466:1;10459:15;10485:127;10546:10;10541:3;10537:20;10534:1;10527:31;10577:4;10574:1;10567:15;10601:4;10598:1;10591:15;10617:209;10655:3;-1:-1:-1;;;;;10736:2:1;10729:5;10725:14;10763:2;10754:7;10751:15;10748:41;;;10769:18;;:::i;:::-;10818:1;10805:15;;10617:209;-1:-1:-1;;;10617:209:1:o;10831:296::-;10870:1;-1:-1:-1;;;;;10941:2:1;10938:1;10934:10;10963:3;10953:134;;11009:10;11004:3;11000:20;10997:1;10990:31;11044:4;11041:1;11034:15;11072:4;11069:1;11062:15;10953:134;11105:10;;11101:20;;;;;10831:296;-1:-1:-1;;10831:296:1:o;11132:236::-;11171:3;-1:-1:-1;;;;;11244:2:1;11241:1;11237:10;11274:2;11271:1;11267:10;11305:3;11301:2;11297:12;11292:3;11289:21;11286:47;;;11313:18;;:::i;:::-;11349:13;;11132:236;-1:-1:-1;;;;11132:236:1:o;11776:175::-;11813:3;11857:4;11850:5;11846:16;11886:4;11877:7;11874:17;11871:43;;;11894:18;;:::i;:::-;11943:1;11930:15;;11776:175;-1:-1:-1;;11776:175:1:o
Swarm Source
ipfs://bbe7267b316e3fdf4e69eaef71e93f5233154ef94faf00b7e6bd5fdb51f1996a
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.