Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register Reverse... | 12672103 | 1283 days ago | IN | 0 ETH | 0.00277723 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenHolder
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-02 */ /* * Crypto stamp Bridge: Token Holder * ERC-721 and ERC-1155 tokens deposited to the bridge are owned by this * contract while they are active on the other side of the bridge. The bridge * can exit them from here again if needed via the bridge head. Users can push * tokens to the bridge via safeTresferFrom() to this token holder, or run * pull-based deposits via the bridge head. * * Developed by Capacity Blockchain Solutions GmbH <capacity.at> * for Österreichische Post AG <post.at> * * Any usage of or interaction with this set of contracts is subject to the * Terms & Conditions available at https://crypto.post.at/ */ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/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.5.11/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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/ENSReverseRegistrarI.sol /* * Interfaces for ENS Reverse Registrar * See https://github.com/ensdomains/ens/blob/master/contracts/ReverseRegistrar.sol for full impl * Also see https://github.com/wealdtech/wealdtech-solidity/blob/master/contracts/ens/ENSReverseRegister.sol * * Use this as follows (registryAddress is the address of the ENS registry to use): * ----- * // This hex value is caclulated by namehash('addr.reverse') * bytes32 public constant ENS_ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2; * function registerReverseENS(address registryAddress, string memory calldata) external { * require(registryAddress != address(0), "need a valid registry"); * address reverseRegistrarAddress = ENSRegistryOwnerI(registryAddress).owner(ENS_ADDR_REVERSE_NODE) * require(reverseRegistrarAddress != address(0), "need a valid reverse registrar"); * ENSReverseRegistrarI(reverseRegistrarAddress).setName(name); * } * ----- * or * ----- * function registerReverseENS(address reverseRegistrarAddress, string memory calldata) external { * require(reverseRegistrarAddress != address(0), "need a valid reverse registrar"); * ENSReverseRegistrarI(reverseRegistrarAddress).setName(name); * } * ----- * ENS deployments can be found at https://docs.ens.domains/ens-deployments * E.g. Etherscan can be used to look up that owner on those contracts. * namehash.hash("addr.reverse") == "0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2" * Ropsten: ens.owner(namehash.hash("addr.reverse")) == "0x6F628b68b30Dc3c17f345c9dbBb1E483c2b7aE5c" * Mainnet: ens.owner(namehash.hash("addr.reverse")) == "0x084b1c3C81545d370f3634392De611CaaBFf8148" */ interface ENSRegistryOwnerI { function owner(bytes32 node) external view returns (address); } interface ENSReverseRegistrarI { event NameChanged(bytes32 indexed node, string name); /** * @dev Sets the `name()` record for the reverse ENS record associated with * the calling account. * @param name The name to set for this address. * @return The ENS node hash of the reverse record. */ function setName(string calldata name) external returns (bytes32); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol /** * _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File: contracts/BridgeDataI.sol /* * Interface for data storage of the bridge. */ interface BridgeDataI { event AddressChanged(string name, address previousAddress, address newAddress); event ConnectedChainChanged(string previousConnectedChainName, string newConnectedChainName); event TokenURIBaseChanged(string previousTokenURIBase, string newTokenURIBase); event TokenSunsetAnnounced(uint256 indexed timestamp); /** * @dev The name of the chain connected to / on the other side of this bridge head. */ function connectedChainName() external view returns (string memory); /** * @dev The name of our own chain, used in token URIs handed to deployed tokens. */ function ownChainName() external view returns (string memory); /** * @dev The base of ALL token URIs, e.g. https://example.com/ */ function tokenURIBase() external view returns (string memory); /** * @dev The sunset timestamp for all deployed tokens. * If 0, no sunset is in place. Otherwise, if older than block timestamp, * all transfers of the tokens are frozen. */ function tokenSunsetTimestamp() external view returns (uint256); /** * @dev Set a token sunset timestamp. */ function setTokenSunsetTimestamp(uint256 _timestamp) external; /** * @dev Set an address for a name. */ function setAddress(string memory name, address newAddress) external; /** * @dev Get an address for a name. */ function getAddress(string memory name) external view returns (address); } // File: contracts/BridgeHeadI.sol /* * Interface for a Bridge Head. */ interface BridgeHeadI { /** * @dev Emitted when an ERC721 token is deposited to the bridge. */ event TokenDepositedERC721(address indexed tokenAddress, uint256 indexed tokenId, address indexed otherChainRecipient); /** * @dev Emitted when one or more ERC1155 tokens are deposited to the bridge. */ event TokenDepositedERC1155Batch(address indexed tokenAddress, uint256[] tokenIds, uint256[] amounts, address indexed otherChainRecipient); /** * @dev Emitted when an ERC721 token is exited from the bridge. */ event TokenExitedERC721(address indexed tokenAddress, uint256 indexed tokenId, address indexed recipient); /** * @dev Emitted when one or more ERC1155 tokens are exited from the bridge. */ event TokenExitedERC1155Batch(address indexed tokenAddress, uint256[] tokenIds, uint256[] amounts, address indexed recipient); /** * @dev Emitted when a new bridged token is deployed. */ event BridgedTokenDeployed(address indexed ownAddress, address indexed foreignAddress); /** * @dev The address of the bridge data contract storing all addresses and chain info for this bridge */ function bridgeData() external view returns (BridgeDataI); /** * @dev The bridge controller address */ function bridgeControl() external view returns (address); /** * @dev The token holder contract connected to this bridge head */ function tokenHolder() external view returns (TokenHolderI); /** * @dev The name of the chain connected to / on the other side of this bridge head. */ function connectedChainName() external view returns (string memory); /** * @dev The name of our own chain, used in token URIs handed to deployed tokens. */ function ownChainName() external view returns (string memory); /** * @dev The minimum amount of (valid) signatures that need to be present in `processExitData()`. */ function minSignatures() external view returns (uint256); /** * @dev True if deposits are possible at this time. */ function depositEnabled() external view returns (bool); /** * @dev True if exits are possible at this time. */ function exitEnabled() external view returns (bool); /** * @dev Called by token holder when a ERC721 token has been deposited and * needs to be moved to the other side of the bridge. */ function tokenDepositedERC721(address tokenAddress, uint256 tokenId, address otherChainRecipient) external; /** * @dev Called by token holder when a ERC1155 token has been deposited and * needs to be moved to the other side of the bridge. If it was no batch * deposit, still this function is called with with only the one items in * the batch. */ function tokenDepositedERC1155Batch(address tokenAddress, uint256[] calldata tokenIds, uint256[] calldata amounts, address otherChainRecipient) external; /** * @dev Called by people/contracts who want to move an ERC721 token to the * other side of the bridge. Needs to be called by the current token owner. */ function depositERC721(address tokenAddress, uint256 tokenId, address otherChainRecipient) external; /** * @dev Called by people/contracts who want to move an ERC1155 token to the * other side of the bridge. When only a single token ID is desposited, * called with only one entry in the arrays. Needs to be called by the * current token owner. */ function depositERC1155Batch(address tokenAddress, uint256[] calldata tokenIds, uint256[] calldata amounts, address otherChainRecipient) external; /** * @dev Process an exit message. Can be called by anyone, but requires data * with valid signatures from a minimum of `minSignatures()` of allowed * signer addresses and an exit nonce for the respective signer that has * not been used yet. Also, all signers need to be ordered with ascending * addresses for the call to succeed. * The ABI-encoded payload is for a call on the bridge head contract. * The signature is over the contract address, the chain ID, the exit * nonce, and the payload. */ function processExitData(bytes memory _payload, uint256 _expirationTimestamp, bytes[] memory _signatures, uint256[] memory _exitNonces) external; /** * @dev Return a predicted token address given the prototype name as listed * in bridge data ("ERC721Prototype" or "ERC1155Prototype") and foreign * token address. */ function predictTokenAddress(string memory _prototypeName, address _foreignAddress) external view returns (address); /** * @dev Exit an ERC721 token from the bridge to a recipient. Can be owned * by either the token holder or an address that is treated as an * equivalent holder for the bride. If not existing, can be minted if * allowed, or even a token deployed based in a given foreign address and * symbol. If properties data is set, will send that to the token contract * to set properties for the token. */ function exitERC721(address _tokenAddress, uint256 _tokenId, address _recipient, address _foreignAddress, bool _allowMinting, string calldata _symbol, bytes calldata _propertiesData) external; /** * @dev Exit an already existing ERC721 token from the bridge to a * recipient, owned currently by the bridge in some form. */ function exitERC721Existing(address _tokenAddress, uint256 _tokenId, address _recipient) external; /** * @dev Exit ERC1155 token(s) from the bridge to a recipient. The token * source can be the token holder, an equivalent, or a Collection. Only * tokens owned by one source can be existed in one transaction. If the * source is the zero address, tokens will be minted. */ function exitERC1155Batch(address _tokenAddress, uint256[] memory _tokenIds, uint256[] memory _amounts, address _recipient, address _foreignAddress, address _tokenSource) external; /** * @dev Exit an already existing ERC1155 token from the bridge to a * recipient, owned currently by the token holder. */ function exitERC1155BatchFromHolder(address _tokenAddress, uint256[] memory _tokenIds, uint256[] memory _amounts, address _recipient) external; /** * @dev Forward calls to external contracts. Can only be called by owner. * Given a contract address and an already-encoded payload (with a function call etc.), * we call that contract with this payload, e.g. to trigger actions in the name of the token holder. */ function callAsHolder(address payable _remoteAddress, bytes calldata _callPayload) external payable; } // File: contracts/TokenHolderI.sol /* * Interface for a Token Holder. */ interface TokenHolderI is IERC165, IERC721Receiver, IERC1155Receiver { /** * @dev The address of the bridge data contract storing all addresses and chain info for this bridge */ function bridgeData() external view returns (BridgeDataI); /** * @dev The bridge head contract connected to this token holder */ function bridgeHead() external view returns (BridgeHeadI); /** * @dev Forward calls to external contracts. Can only be called by owner. * Given a contract address and an already-encoded payload (with a function call etc.), * we call that contract with this payload, e.g. to trigger actions in the name of the bridge. */ function externalCall(address payable _remoteAddress, bytes calldata _callPayload) external payable; /** * @dev Transfer ERC721 tokens out of the holder contract. */ function safeTransferERC721(address _tokenAddress, uint256 _tokenId, address _to) external; /** * @dev Transfer ERC1155 tokens out of the holder contract. */ function safeTransferERC1155Batch(address _tokenAddress, uint256[] memory _tokenIds, uint256[] memory _amounts, address _to) external; } // File: contracts/CollectionsI.sol /* * Interface for the Collections factory. */ /** * @dev Outward-facing interface of a Collections contract. */ interface CollectionsI is IERC721 { /** * @dev Emitted when a new collection is created. */ event NewCollection(address indexed owner, address collectionAddress); /** * @dev Emitted when a collection is destroyed. */ event KilledCollection(address indexed owner, address collectionAddress); /** * @dev Creates a new Collection. For calling from other contracts, * returns the address of the new Collection. */ function create(address _notificationContract, string calldata _ensName, string calldata _ensSubdomainName, address _ensSubdomainRegistrarAddress, address _ensReverseRegistrarAddress) external payable returns (address); /** * @dev Create a collection for a different owner. Only callable by a * create controller role. For calling from other contracts, returns the * address of the new Collection. */ function createFor(address payable _newOwner, address _notificationContract, string calldata _ensName, string calldata _ensSubdomainName, address _ensSubdomainRegistrarAddress, address _ensReverseRegistrarAddress) external payable returns (address); /** * @dev Removes (burns) an empty Collection. Only the Collection contract itself can call this. */ function burn(uint256 tokenId) external; /** * @dev Returns if a Collection NFT exists for the specified `tokenId`. */ function exists(uint256 tokenId) external view returns (bool); /** * @dev Returns whether the given spender can transfer a given `collectionAddr`. */ function isApprovedOrOwnerOnCollection(address spender, address collectionAddr) external view returns (bool); /** * @dev Returns the Collection address for a token ID. */ function collectionAddress(uint256 tokenId) external view returns (address); /** * @dev Returns the token ID for a Collection address. */ function tokenIdForCollection(address collectionAddr) external view returns (uint256); /** * @dev Returns true if a Collection exists at this address, false if not. */ function collectionExists(address collectionAddr) external view returns (bool); /** * @dev Returns the owner of the Collection with the given address. */ function collectionOwner(address collectionAddr) external view returns (address); /** * @dev Returns a Collection address owned by `owner` at a given `index` of * its Collections list. Mirrors `tokenOfOwnerByIndex` in ERC721Enumerable. */ function collectionOfOwnerByIndex(address owner, uint256 index) external view returns (address); } // File: contracts/CollectionI.sol /* * Interface for a single Collection, which is a very lightweight contract that can be the owner of ERC721 tokens. */ interface CollectionI is IERC165, IERC721Receiver, IERC1155Receiver { /** * @dev Emitted when the notification conmtract is changed. */ event NotificationContractTransferred(address indexed previousNotificationContract, address indexed newNotificationContract); /** * @dev Emitted when an asset is added to the collection. */ event AssetAdded(address tokenAddress, uint256 tokenId); /** * @dev Emitted when an asset is removed to the collection. */ event AssetRemoved(address tokenAddress, uint256 tokenId); /** * @dev Emitted when the Collection is destroyed. */ event CollectionDestroyed(address operator); /** * @dev True is this is the prototype, false if this is an active * (clone/proxy) collection contract. */ function isPrototype() external view returns (bool); /** * @dev The linked Collections factory (the ERC721 contract). */ function collections() external view returns (CollectionsI); /** * @dev The linked notification contract (e.g. achievements). */ function notificationContract() external view returns (address); /** * @dev Initializes a new Collection. Needs to be called by the Collections * factory. */ function initialRegister(address _notificationContract, string calldata _ensName, string calldata _ensSubdomainName, address _ensSubdomainRegistrarAddress, address _ensReverseRegistrarAddress) external; /** * @dev Switch the notification contract to a different address. Set to the * zero address to disable notifications. Can only be called by owner. */ function transferNotificationContract(address _newNotificationContract) external; /** * @dev Get collection owner from ERC 721 parent (Collections factory). */ function ownerAddress() external view returns (address); /** * @dev Determine if the Collection owns a specific asset. */ function ownsAsset(address _tokenAddress, uint256 _tokenId) external view returns(bool); /** * @dev Get count of owned assets. */ function ownedAssetsCount() external view returns (uint256); /** * @dev Make sure ownership of a certain asset is recorded correctly (added * if the collection owns it or removed if it doesn't). */ function syncAssetOwnership(address _tokenAddress, uint256 _tokenId) external; /** * @dev Transfer an owned asset to a new owner (for ERC1155, a single item * of that asset). */ function safeTransferTo(address _tokenAddress, uint256 _tokenId, address _to) external; /** * @dev Transfer a certain amount of an owned asset to a new owner (for * ERC721, _value is ignored). */ function safeTransferTo(address _tokenAddress, uint256 _tokenId, address _to, uint256 _value) external; /** * @dev Destroy and burn an empty Collection. Can only be called by owner * and only on empty collections. */ function destroy() external; /** * @dev Forward calls to external contracts. Can only be called by owner. * Given a contract address and an already-encoded payload (with a function * call etc.), we call that contract with this payload, e.g. to trigger * actions in the name of the collection. */ function externalCall(address payable _remoteAddress, bytes calldata _callPayload) external payable; /** * @dev Register ENS name. Can only be called by owner. */ function registerENS(string calldata _name, address _registrarAddress) external; /** * @dev Register Reverse ENS name. Can only be called by owner. */ function registerReverseENS(address _reverseRegistrarAddress, string calldata _name) external; } // File: contracts/TokenHolder.sol /* * Token Holder for the Crypto stamp bridge. * This contract holds all tokens on its own layer/chain that have been * deposited into the other layer/chain. Deposit interactions happen directly * with depositing users, all other interactions (such as exits) come via the * Bridge Head. */ contract TokenHolder is ERC165, TokenHolderI { using Address for address; using Address for address payable; BridgeDataI public override bridgeData; event BridgeDataChanged(address indexed previousBridgeData, address indexed newBridgeData); constructor(address _bridgeDataAddress) { bridgeData = BridgeDataI(_bridgeDataAddress); } modifier onlyBridgeControl() { require(msg.sender == bridgeData.getAddress("bridgeControl"), "bridgeControl key required for this function."); _; } modifier onlyBridge() { require(msg.sender == bridgeData.getAddress("bridgeControl") || msg.sender == bridgeData.getAddress("bridgeHead"), "bridgeControl key or bridge head required for this function."); _; } modifier onlyTokenAssignmentControl() { require(msg.sender == bridgeData.getAddress("tokenAssignmentControl"), "tokenAssignmentControl key required for this function."); _; } /*** ERC165 ***/ function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721Receiver).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } /*** Enable adjusting variables after deployment ***/ function setBridgeData(BridgeDataI _newBridgeData) external onlyBridgeControl { require(address(_newBridgeData) != address(0x0), "You need to provide an actual bridge data contract."); emit BridgeDataChanged(address(bridgeData), address(_newBridgeData)); bridgeData = _newBridgeData; } function bridgeHead() public view override returns (BridgeHeadI) { return BridgeHeadI(bridgeData.getAddress("bridgeHead")); } /*** Deal with ERC721 and ERC1155 tokens we receive ***/ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external override returns (bytes4) { address otherChainRecipient = getRecipient(_operator, _from, _data); address _tokenAddress = msg.sender; // Make sure whoever called this plays nice, check for token being an ERC721 contract. require(IERC165(_tokenAddress).supportsInterface(type(IERC721).interfaceId), "onERC721Received caller needs to implement ERC721!"); // If it's a Collection, make sure notification contract is set to zero. if (_tokenAddress == bridgeData.getAddress("Collections")) { CollectionI coll = CollectionI(CollectionsI(_tokenAddress).collectionAddress(_tokenId)); if (coll.notificationContract() != address(0)) { coll.transferNotificationContract(address(0)); } } // Now, tell the bridge head of the deposit, it will care about forwarding this token over the bridge. bridgeHead().tokenDepositedERC721(_tokenAddress, _tokenId, otherChainRecipient); return this.onERC721Received.selector; } function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _value, bytes calldata _data) external override returns(bytes4) { address otherChainRecipient = getRecipient(_operator, _from, _data); address _tokenAddress = msg.sender; // Make sure whoever called this plays nice, check for token being an ERC1155 contract. require(IERC165(_tokenAddress).supportsInterface(type(IERC1155).interfaceId), "onERC1155Received caller needs to implement ERC1155!"); // Now, tell the bridge head of the deposit, it will care about forwarding this token over the bridge. uint256[] memory tokenIds = new uint256[](1); tokenIds[0] = _id; uint256[] memory amounts = new uint256[](1); amounts[0] = _value; bridgeHead().tokenDepositedERC1155Batch(_tokenAddress, tokenIds, amounts, otherChainRecipient); return this.onERC1155Received.selector; } function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external override returns(bytes4) { address otherChainRecipient = getRecipient(_operator, _from, _data); address _tokenAddress = msg.sender; // Make sure whoever called this plays nice, check for token being an ERC1155 contract. require(IERC165(_tokenAddress).supportsInterface(type(IERC1155).interfaceId), "onERC1155BatchReceived caller needs to implement ERC1155!"); // Now, tell the bridge head of the deposit, it will care about forwarding this token over the bridge. bridgeHead().tokenDepositedERC1155Batch(_tokenAddress, _ids, _values, otherChainRecipient); return this.onERC1155BatchReceived.selector; } function getRecipient(address _operator, address _from, bytes memory _data) internal view returns(address) { if (_operator == bridgeData.getAddress("bridgeHead") && _data.length > 0) { // This is a pull-based deposit called via the bridge head, take recipient from _data. return abi.decode(_data, (address)); } if (_from.isContract()) { // We do not want tokens to end up in un-reachable addresses on the other side, so revert. revert("Deposit contract-owned token via bridge head!"); } if (_from == address(0)) { // We do not want tokens to end up in un-reachable addresses on the other side, so revert. revert("Can't mint into bridge directly!"); } // This is an EOA, so we give it to that address on the other side as well. return _from; } /*** Forward calls to external contracts ***/ // Given a contract address and an already-encoded payload (with a function call etc.), // we call that contract with this payload, e.g. to trigger actions in the name of the token holder. function externalCall(address payable _remoteAddress, bytes calldata _callPayload) external override payable onlyBridge { require(_remoteAddress != address(this) && _remoteAddress != bridgeData.getAddress("bridgeHead"), "No calls to bridge via this mechanism!"); // Using methods from OpenZeppelin's Address library to bubble up exceptions with their messages. if (_callPayload.length > 0) { _remoteAddress.functionCallWithValue(_callPayload, msg.value); } else { _remoteAddress.sendValue(msg.value); } } /*** Transfer assets out of the holder ***/ function safeTransferERC721(address _tokenAddress, uint256 _tokenId, address _to) public override onlyBridge { IERC721(_tokenAddress).safeTransferFrom(address(this), _to, _tokenId); } function safeTransferERC1155Batch(address _tokenAddress, uint256[] memory _tokenIds, uint256[] memory _amounts, address _to) public override onlyBridge { IERC1155(_tokenAddress).safeBatchTransferFrom(address(this), _to, _tokenIds, _amounts, ""); } /*** Enable reverse ENS registration ***/ // Call this with the address of the reverse registrar for the respective network and the ENS name to register. // The reverse registrar can be found as the owner of 'addr.reverse' in the ENS system. // For Mainnet, the address needed is 0x9062c0a6dbd6108336bcbe4593a3d1ce05512069 function registerReverseENS(address _reverseRegistrarAddress, string calldata _name) external onlyTokenAssignmentControl { require(_reverseRegistrarAddress != address(0), "need a valid reverse registrar"); ENSReverseRegistrarI(_reverseRegistrarAddress).setName(_name); } /*** Make sure currency or NFT doesn't get stranded in this contract ***/ // If this contract gets a balance in some ERC20 contract after it's finished, then we can rescue it. function rescueToken(address _foreignToken, address _to) external onlyTokenAssignmentControl { IERC20 erc20Token = IERC20(_foreignToken); erc20Token.transfer(_to, erc20Token.balanceOf(address(this))); } // If this contract gets a balance in some ERC721 contract after it's finished, then we can rescue it. function approveNFTrescue(IERC721 _foreignNFT, address _to) external onlyTokenAssignmentControl { _foreignNFT.setApprovalForAll(_to, true); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_bridgeDataAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousBridgeData","type":"address"},{"indexed":true,"internalType":"address","name":"newBridgeData","type":"address"}],"name":"BridgeDataChanged","type":"event"},{"inputs":[{"internalType":"contract IERC721","name":"_foreignNFT","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"approveNFTrescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridgeData","outputs":[{"internalType":"contract BridgeDataI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeHead","outputs":[{"internalType":"contract BridgeHeadI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_remoteAddress","type":"address"},{"internalType":"bytes","name":"_callPayload","type":"bytes"}],"name":"externalCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reverseRegistrarAddress","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"registerReverseENS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_foreignToken","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"address","name":"_to","type":"address"}],"name":"safeTransferERC1155Batch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"safeTransferERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract BridgeDataI","name":"_newBridgeData","type":"address"}],"name":"setBridgeData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051620025043803806200250483398101604081905261003191610056565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b600060208284031215610067578081fd5b81516001600160a01b038116811461007d578182fd5b9392505050565b61247080620000946000396000f3fe6080604052600436106100c25760003560e01c8063654c9bdb1161007f578063c58fddcd11610059578063c58fddcd14610222578063cd89290c14610242578063dd48f77414610257578063f23a6e611461027757600080fd5b8063654c9bdb146101cf5780638e8fa11f146101e2578063bc197c811461020257600080fd5b806301ffc9a7146100c757806307ad07c5146100fc578063150b7a021461011e5780632481bb5c146101575780634707d0001461018f57806353cdef02146101af575b600080fd5b3480156100d357600080fd5b506100e76100e236600461203a565b610297565b60405190151581526020015b60405180910390f35b34801561010857600080fd5b5061011c610117366004611fc1565b6102e9565b005b34801561012a57600080fd5b5061013e610139366004611dcb565b6104a6565b6040516001600160e01b031990911681526020016100f3565b34801561016357600080fd5b50600054610177906001600160a01b031681565b6040516001600160a01b0390911681526020016100f3565b34801561019b57600080fd5b5061011c6101aa366004611cd8565b610830565b3480156101bb57600080fd5b5061011c6101ca366004612062565b6109e5565b61011c6101dd366004611c85565b610ba6565b3480156101ee57600080fd5b5061011c6101fd366004611f87565b610e59565b34801561020e57600080fd5b5061013e61021d366004611d10565b610fdd565b34801561022e57600080fd5b5061011c61023d366004611f01565b611193565b34801561024e57600080fd5b50610177611344565b34801561026357600080fd5b5061011c610272366004611cd8565b6113c8565b34801561028357600080fd5b5061013e610292366004611e87565b6114dc565b60006001600160e01b03198216630a85bd0160e11b14806102c857506001600160e01b03198216630271189760e51b145b806102e357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610317906004016122e5565b60206040518083038186803b15801561032f57600080fd5b505afa158015610343573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103679190611c69565b6001600160a01b0316336001600160a01b03161480610414575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906103af90600401612362565b60206040518083038186803b1580156103c757600080fd5b505afa1580156103db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ff9190611c69565b6001600160a01b0316336001600160a01b0316145b6104395760405162461bcd60e51b815260040161043090612288565b60405180910390fd5b604051632142170760e11b81523060048201526001600160a01b038281166024830152604482018490528416906342842e0e90606401600060405180830381600087803b15801561048957600080fd5b505af115801561049d573d6000803e3d6000fd5b50505050505050565b6000806104b4868685611726565b6040516301ffc9a760e01b81526380ac58cd60e01b6004820152909150339081906301ffc9a79060240160206040518083038186803b1580156104f657600080fd5b505afa15801561050a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052e9190612002565b6105955760405162461bcd60e51b815260206004820152603260248201527f6f6e45524337323152656365697665642063616c6c6572206e6565647320746f60448201527120696d706c656d656e74204552433732312160701b6064820152608401610430565b60005460405163bf40fac160e01b815260206004820152600b60248201526a436f6c6c656374696f6e7360a81b60448201526001600160a01b039091169063bf40fac19060640160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190611c69565b6001600160a01b0316816001600160a01b031614156107a957604051632f7c9af760e11b8152600481018690526000906001600160a01b03831690635ef935ee9060240160206040518083038186803b15801561068857600080fd5b505afa15801561069c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c09190611c69565b905060006001600160a01b0316816001600160a01b0316633c2a1d056040518163ffffffff1660e01b815260040160206040518083038186803b15801561070657600080fd5b505afa15801561071a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190611c69565b6001600160a01b0316146107a757604051630ad5671760e11b8152600060048201526001600160a01b038216906315aace2e90602401600060405180830381600087803b15801561078e57600080fd5b505af11580156107a2573d6000803e3d6000fd5b505050505b505b6107b1611344565b604051637e09670360e11b81526001600160a01b038381166004830152602482018890528481166044830152919091169063fc12ce0690606401600060405180830381600087803b15801561080557600080fd5b505af1158015610819573d6000803e3d6000fd5b50630a85bd0160e11b9a9950505050505050505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061085e90600401612258565b60206040518083038186803b15801561087657600080fd5b505afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae9190611c69565b6001600160a01b0316336001600160a01b0316146108de5760405162461bcd60e51b81526004016104309061230c565b6040516370a0823160e01b815230600482015282906001600160a01b0382169063a9059cbb90849083906370a082319060240160206040518083038186803b15801561092957600080fd5b505afa15801561093d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109619190612022565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156109a757600080fd5b505af11580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612002565b50505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610a13906004016122e5565b60206040518083038186803b158015610a2b57600080fd5b505afa158015610a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a639190611c69565b6001600160a01b0316336001600160a01b031614610ad95760405162461bcd60e51b815260206004820152602d60248201527f627269646765436f6e74726f6c206b657920726571756972656420666f72207460448201526c3434b990333ab731ba34b7b71760991b6064820152608401610430565b6001600160a01b038116610b4b5760405162461bcd60e51b815260206004820152603360248201527f596f75206e65656420746f2070726f7669646520616e2061637475616c20627260448201527234b233b2903230ba309031b7b73a3930b1ba1760691b6064820152608401610430565b600080546040516001600160a01b03808516939216917f6a6e057f21cc834cf349d8150e92867f52cb34d54375f174c09c431538c3dfb991a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610bd4906004016122e5565b60206040518083038186803b158015610bec57600080fd5b505afa158015610c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c249190611c69565b6001600160a01b0316336001600160a01b03161480610cd1575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610c6c90600401612362565b60206040518083038186803b158015610c8457600080fd5b505afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190611c69565b6001600160a01b0316336001600160a01b0316145b610ced5760405162461bcd60e51b815260040161043090612288565b6001600160a01b0383163014801590610d95575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610d2f90600401612362565b60206040518083038186803b158015610d4757600080fd5b505afa158015610d5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7f9190611c69565b6001600160a01b0316836001600160a01b031614155b610df05760405162461bcd60e51b815260206004820152602660248201527f4e6f2063616c6c7320746f20627269646765207669612074686973206d656368604482015265616e69736d2160d01b6064820152608401610430565b8015610e41576109df82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506001600160a01b038616919050346118b4565b610e546001600160a01b038416346118e2565b505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610e8790600401612258565b60206040518083038186803b158015610e9f57600080fd5b505afa158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190611c69565b6001600160a01b0316336001600160a01b031614610f075760405162461bcd60e51b81526004016104309061230c565b6001600160a01b038316610f5d5760405162461bcd60e51b815260206004820152601e60248201527f6e65656420612076616c696420726576657273652072656769737472617200006044820152606401610430565b60405163c47f002760e01b81526001600160a01b0384169063c47f002790610f8b90859085906004016121f6565b602060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612022565b6000806110218a8a86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061172692505050565b6040516301ffc9a760e01b8152636cdb3d1360e11b6004820152909150339081906301ffc9a79060240160206040518083038186803b15801561106357600080fd5b505afa158015611077573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109b9190612002565b61110d5760405162461bcd60e51b815260206004820152603960248201527f6f6e45524331313535426174636852656365697665642063616c6c6572206e6560448201527f65647320746f20696d706c656d656e74204552433131353521000000000000006064820152608401610430565b611115611344565b6001600160a01b0316630ef35220828b8b8b8b886040518763ffffffff1660e01b815260040161114a96959493929190612160565b600060405180830381600087803b15801561116457600080fd5b505af1158015611178573d6000803e3d6000fd5b5063bc197c8160e01b9e9d5050505050505050505050505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906111c1906004016122e5565b60206040518083038186803b1580156111d957600080fd5b505afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190611c69565b6001600160a01b0316336001600160a01b031614806112be575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061125990600401612362565b60206040518083038186803b15801561127157600080fd5b505afa158015611285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a99190611c69565b6001600160a01b0316336001600160a01b0316145b6112da5760405162461bcd60e51b815260040161043090612288565b604051631759616b60e11b81526001600160a01b03851690632eb2c2d69061130c903090859088908890600401612108565b600060405180830381600087803b15801561132657600080fd5b505af115801561133a573d6000803e3d6000fd5b5050505050505050565b6000805460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061137390600401612362565b60206040518083038186803b15801561138b57600080fd5b505afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190611c69565b905090565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906113f690600401612258565b60206040518083038186803b15801561140e57600080fd5b505afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114469190611c69565b6001600160a01b0316336001600160a01b0316146114765760405162461bcd60e51b81526004016104309061230c565b60405163a22cb46560e01b81526001600160a01b0382811660048301526001602483015283169063a22cb46590604401600060405180830381600087803b1580156114c057600080fd5b505af11580156114d4573d6000803e3d6000fd5b505050505050565b600080611520888886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061172692505050565b6040516301ffc9a760e01b8152636cdb3d1360e11b6004820152909150339081906301ffc9a79060240160206040518083038186803b15801561156257600080fd5b505afa158015611576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159a9190612002565b6116035760405162461bcd60e51b815260206004820152603460248201527f6f6e4552433131353552656365697665642063616c6c6572206e6565647320746044820152736f20696d706c656d656e7420455243313135352160601b6064820152608401610430565b60408051600180825281830190925260009160208083019080368337019050509050878160008151811061164757634e487b7160e01b600052603260045260246000fd5b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050878160008151811061169857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506116ac611344565b6001600160a01b0316630ef35220848484886040518563ffffffff1660e01b81526004016116dd94939291906121ad565b600060405180830381600087803b1580156116f757600080fd5b505af115801561170b573d6000803e3d6000fd5b5063f23a6e6160e01b9e9d5050505050505050505050505050565b6000805460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061175590600401612362565b60206040518083038186803b15801561176d57600080fd5b505afa158015611781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a59190611c69565b6001600160a01b0316846001600160a01b03161480156117c6575060008251115b156117e657818060200190518101906117df9190611c69565b90506118ad565b6001600160a01b0383163b156118545760405162461bcd60e51b815260206004820152602d60248201527f4465706f73697420636f6e74726163742d6f776e656420746f6b656e2076696160448201526c2062726964676520686561642160981b6064820152608401610430565b6001600160a01b0383166118aa5760405162461bcd60e51b815260206004820181905260248201527f43616e2774206d696e7420696e746f20627269646765206469726563746c79216044820152606401610430565b50815b9392505050565b60606118da848484604051806060016040528060298152602001612412602991396119fb565b949350505050565b804710156119325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610430565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461197f576040519150601f19603f3d011682016040523d82523d6000602084013e611984565b606091505b5050905080610e545760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610430565b606082471015611a5c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610430565b843b611aaa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610430565b600080866001600160a01b03168587604051611ac691906120ec565b60006040518083038185875af1925050503d8060008114611b03576040519150601f19603f3d011682016040523d82523d6000602084013e611b08565b606091505b5091509150611b18828286611b23565b979650505050505050565b60608315611b325750816118ad565b825115611b425782518084602001fd5b8160405162461bcd60e51b81526004016104309190612225565b60008083601f840112611b6d578182fd5b50813567ffffffffffffffff811115611b84578182fd5b6020830191508360208260051b8501011115611b9f57600080fd5b9250929050565b600082601f830112611bb6578081fd5b8135602067ffffffffffffffff821115611bd257611bd26123e3565b8160051b611be1828201612386565b838152828101908684018388018501891015611bfb578687fd5b8693505b85841015611c1d578035835260019390930192918401918401611bff565b50979650505050505050565b60008083601f840112611c3a578182fd5b50813567ffffffffffffffff811115611c51578182fd5b602083019150836020828501011115611b9f57600080fd5b600060208284031215611c7a578081fd5b81516118ad816123f9565b600080600060408486031215611c99578182fd5b8335611ca4816123f9565b9250602084013567ffffffffffffffff811115611cbf578283fd5b611ccb86828701611c29565b9497909650939450505050565b60008060408385031215611cea578182fd5b8235611cf5816123f9565b91506020830135611d05816123f9565b809150509250929050565b60008060008060008060008060a0898b031215611d2b578384fd5b8835611d36816123f9565b97506020890135611d46816123f9565b9650604089013567ffffffffffffffff80821115611d62578586fd5b611d6e8c838d01611b5c565b909850965060608b0135915080821115611d86578586fd5b611d928c838d01611b5c565b909650945060808b0135915080821115611daa578384fd5b50611db78b828c01611c29565b999c989b5096995094979396929594505050565b60008060008060808587031215611de0578384fd5b8435611deb816123f9565b9350602085810135611dfc816123f9565b935060408601359250606086013567ffffffffffffffff80821115611e1f578384fd5b818801915088601f830112611e32578384fd5b813581811115611e4457611e446123e3565b611e56601f8201601f19168501612386565b91508082528984828501011115611e6b578485fd5b8084840185840137810190920192909252939692955090935050565b60008060008060008060a08789031215611e9f578182fd5b8635611eaa816123f9565b95506020870135611eba816123f9565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ee3578283fd5b611eef89828a01611c29565b979a9699509497509295939492505050565b60008060008060808587031215611f16578182fd5b8435611f21816123f9565b9350602085013567ffffffffffffffff80821115611f3d578384fd5b611f4988838901611ba6565b94506040870135915080821115611f5e578384fd5b50611f6b87828801611ba6565b9250506060850135611f7c816123f9565b939692955090935050565b600080600060408486031215611f9b578081fd5b8335611fa6816123f9565b9250602084013567ffffffffffffffff811115611cbf578182fd5b600080600060608486031215611fd5578081fd5b8335611fe0816123f9565b9250602084013591506040840135611ff7816123f9565b809150509250925092565b600060208284031215612013578081fd5b815180151581146118ad578182fd5b600060208284031215612033578081fd5b5051919050565b60006020828403121561204b578081fd5b81356001600160e01b0319811681146118ad578182fd5b600060208284031215612073578081fd5b81356118ad816123f9565b81835260006001600160fb1b03831115612096578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b838110156120e1578151875295820195908201906001016120c5565b509495945050505050565b600082516120fe8184602087016123b7565b9190910192915050565b6001600160a01b0385811682528416602082015260a060408201819052600090612134908301856120b2565b828103606084015261214681856120b2565b838103608090940193909352508152602001949350505050565b600060018060a01b0380891683526080602084015261218360808401888a61207e565b838103604085015261219681878961207e565b925050808416606084015250979650505050505050565b600060018060a01b038087168352608060208401526121cf60808401876120b2565b83810360408501526121e181876120b2565b92505080841660608401525095945050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600082518060208401526122448160408501602087016123b7565b601f01601f19169190910160400192915050565b6020808252601690820152751d1bdad95b905cdcda59db9b595b9d10dbdb9d1c9bdb60521b604082015260600190565b6020808252603c908201527f627269646765436f6e74726f6c206b6579206f7220627269646765206865616460408201527f20726571756972656420666f7220746869732066756e6374696f6e2e00000000606082015260800190565b6020808252600d908201526c189c9a5919d950dbdb9d1c9bdb609a1b604082015260600190565b60208082526036908201527f746f6b656e41737369676e6d656e74436f6e74726f6c206b65792072657175696040820152753932b2103337b9103a3434b990333ab731ba34b7b71760511b606082015260800190565b6020808252600a9082015269189c9a5919d95219585960b21b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123af576123af6123e3565b604052919050565b60005b838110156123d25781810151838201526020016123ba565b838111156109df5750506000910152565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461240e57600080fd5b5056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212207cad4ec3561ab37bc4683ff49067d85ff4362541be2d420dab33e2d359e546f364736f6c634300080400330000000000000000000000000884fc15e31b1b634732e140cb3f94b3cbfdd1c5
Deployed Bytecode
0x6080604052600436106100c25760003560e01c8063654c9bdb1161007f578063c58fddcd11610059578063c58fddcd14610222578063cd89290c14610242578063dd48f77414610257578063f23a6e611461027757600080fd5b8063654c9bdb146101cf5780638e8fa11f146101e2578063bc197c811461020257600080fd5b806301ffc9a7146100c757806307ad07c5146100fc578063150b7a021461011e5780632481bb5c146101575780634707d0001461018f57806353cdef02146101af575b600080fd5b3480156100d357600080fd5b506100e76100e236600461203a565b610297565b60405190151581526020015b60405180910390f35b34801561010857600080fd5b5061011c610117366004611fc1565b6102e9565b005b34801561012a57600080fd5b5061013e610139366004611dcb565b6104a6565b6040516001600160e01b031990911681526020016100f3565b34801561016357600080fd5b50600054610177906001600160a01b031681565b6040516001600160a01b0390911681526020016100f3565b34801561019b57600080fd5b5061011c6101aa366004611cd8565b610830565b3480156101bb57600080fd5b5061011c6101ca366004612062565b6109e5565b61011c6101dd366004611c85565b610ba6565b3480156101ee57600080fd5b5061011c6101fd366004611f87565b610e59565b34801561020e57600080fd5b5061013e61021d366004611d10565b610fdd565b34801561022e57600080fd5b5061011c61023d366004611f01565b611193565b34801561024e57600080fd5b50610177611344565b34801561026357600080fd5b5061011c610272366004611cd8565b6113c8565b34801561028357600080fd5b5061013e610292366004611e87565b6114dc565b60006001600160e01b03198216630a85bd0160e11b14806102c857506001600160e01b03198216630271189760e51b145b806102e357506301ffc9a760e01b6001600160e01b03198316145b92915050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610317906004016122e5565b60206040518083038186803b15801561032f57600080fd5b505afa158015610343573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103679190611c69565b6001600160a01b0316336001600160a01b03161480610414575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906103af90600401612362565b60206040518083038186803b1580156103c757600080fd5b505afa1580156103db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ff9190611c69565b6001600160a01b0316336001600160a01b0316145b6104395760405162461bcd60e51b815260040161043090612288565b60405180910390fd5b604051632142170760e11b81523060048201526001600160a01b038281166024830152604482018490528416906342842e0e90606401600060405180830381600087803b15801561048957600080fd5b505af115801561049d573d6000803e3d6000fd5b50505050505050565b6000806104b4868685611726565b6040516301ffc9a760e01b81526380ac58cd60e01b6004820152909150339081906301ffc9a79060240160206040518083038186803b1580156104f657600080fd5b505afa15801561050a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052e9190612002565b6105955760405162461bcd60e51b815260206004820152603260248201527f6f6e45524337323152656365697665642063616c6c6572206e6565647320746f60448201527120696d706c656d656e74204552433732312160701b6064820152608401610430565b60005460405163bf40fac160e01b815260206004820152600b60248201526a436f6c6c656374696f6e7360a81b60448201526001600160a01b039091169063bf40fac19060640160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190611c69565b6001600160a01b0316816001600160a01b031614156107a957604051632f7c9af760e11b8152600481018690526000906001600160a01b03831690635ef935ee9060240160206040518083038186803b15801561068857600080fd5b505afa15801561069c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c09190611c69565b905060006001600160a01b0316816001600160a01b0316633c2a1d056040518163ffffffff1660e01b815260040160206040518083038186803b15801561070657600080fd5b505afa15801561071a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073e9190611c69565b6001600160a01b0316146107a757604051630ad5671760e11b8152600060048201526001600160a01b038216906315aace2e90602401600060405180830381600087803b15801561078e57600080fd5b505af11580156107a2573d6000803e3d6000fd5b505050505b505b6107b1611344565b604051637e09670360e11b81526001600160a01b038381166004830152602482018890528481166044830152919091169063fc12ce0690606401600060405180830381600087803b15801561080557600080fd5b505af1158015610819573d6000803e3d6000fd5b50630a85bd0160e11b9a9950505050505050505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061085e90600401612258565b60206040518083038186803b15801561087657600080fd5b505afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae9190611c69565b6001600160a01b0316336001600160a01b0316146108de5760405162461bcd60e51b81526004016104309061230c565b6040516370a0823160e01b815230600482015282906001600160a01b0382169063a9059cbb90849083906370a082319060240160206040518083038186803b15801561092957600080fd5b505afa15801561093d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109619190612022565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156109a757600080fd5b505af11580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612002565b50505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610a13906004016122e5565b60206040518083038186803b158015610a2b57600080fd5b505afa158015610a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a639190611c69565b6001600160a01b0316336001600160a01b031614610ad95760405162461bcd60e51b815260206004820152602d60248201527f627269646765436f6e74726f6c206b657920726571756972656420666f72207460448201526c3434b990333ab731ba34b7b71760991b6064820152608401610430565b6001600160a01b038116610b4b5760405162461bcd60e51b815260206004820152603360248201527f596f75206e65656420746f2070726f7669646520616e2061637475616c20627260448201527234b233b2903230ba309031b7b73a3930b1ba1760691b6064820152608401610430565b600080546040516001600160a01b03808516939216917f6a6e057f21cc834cf349d8150e92867f52cb34d54375f174c09c431538c3dfb991a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610bd4906004016122e5565b60206040518083038186803b158015610bec57600080fd5b505afa158015610c00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c249190611c69565b6001600160a01b0316336001600160a01b03161480610cd1575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610c6c90600401612362565b60206040518083038186803b158015610c8457600080fd5b505afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190611c69565b6001600160a01b0316336001600160a01b0316145b610ced5760405162461bcd60e51b815260040161043090612288565b6001600160a01b0383163014801590610d95575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610d2f90600401612362565b60206040518083038186803b158015610d4757600080fd5b505afa158015610d5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7f9190611c69565b6001600160a01b0316836001600160a01b031614155b610df05760405162461bcd60e51b815260206004820152602660248201527f4e6f2063616c6c7320746f20627269646765207669612074686973206d656368604482015265616e69736d2160d01b6064820152608401610430565b8015610e41576109df82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506001600160a01b038616919050346118b4565b610e546001600160a01b038416346118e2565b505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610e8790600401612258565b60206040518083038186803b158015610e9f57600080fd5b505afa158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190611c69565b6001600160a01b0316336001600160a01b031614610f075760405162461bcd60e51b81526004016104309061230c565b6001600160a01b038316610f5d5760405162461bcd60e51b815260206004820152601e60248201527f6e65656420612076616c696420726576657273652072656769737472617200006044820152606401610430565b60405163c47f002760e01b81526001600160a01b0384169063c47f002790610f8b90859085906004016121f6565b602060405180830381600087803b158015610fa557600080fd5b505af1158015610fb9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190612022565b6000806110218a8a86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061172692505050565b6040516301ffc9a760e01b8152636cdb3d1360e11b6004820152909150339081906301ffc9a79060240160206040518083038186803b15801561106357600080fd5b505afa158015611077573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109b9190612002565b61110d5760405162461bcd60e51b815260206004820152603960248201527f6f6e45524331313535426174636852656365697665642063616c6c6572206e6560448201527f65647320746f20696d706c656d656e74204552433131353521000000000000006064820152608401610430565b611115611344565b6001600160a01b0316630ef35220828b8b8b8b886040518763ffffffff1660e01b815260040161114a96959493929190612160565b600060405180830381600087803b15801561116457600080fd5b505af1158015611178573d6000803e3d6000fd5b5063bc197c8160e01b9e9d5050505050505050505050505050565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906111c1906004016122e5565b60206040518083038186803b1580156111d957600080fd5b505afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190611c69565b6001600160a01b0316336001600160a01b031614806112be575060005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061125990600401612362565b60206040518083038186803b15801561127157600080fd5b505afa158015611285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a99190611c69565b6001600160a01b0316336001600160a01b0316145b6112da5760405162461bcd60e51b815260040161043090612288565b604051631759616b60e11b81526001600160a01b03851690632eb2c2d69061130c903090859088908890600401612108565b600060405180830381600087803b15801561132657600080fd5b505af115801561133a573d6000803e3d6000fd5b5050505050505050565b6000805460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061137390600401612362565b60206040518083038186803b15801561138b57600080fd5b505afa15801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190611c69565b905090565b60005460405163bf40fac160e01b81526001600160a01b039091169063bf40fac1906113f690600401612258565b60206040518083038186803b15801561140e57600080fd5b505afa158015611422573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114469190611c69565b6001600160a01b0316336001600160a01b0316146114765760405162461bcd60e51b81526004016104309061230c565b60405163a22cb46560e01b81526001600160a01b0382811660048301526001602483015283169063a22cb46590604401600060405180830381600087803b1580156114c057600080fd5b505af11580156114d4573d6000803e3d6000fd5b505050505050565b600080611520888886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061172692505050565b6040516301ffc9a760e01b8152636cdb3d1360e11b6004820152909150339081906301ffc9a79060240160206040518083038186803b15801561156257600080fd5b505afa158015611576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159a9190612002565b6116035760405162461bcd60e51b815260206004820152603460248201527f6f6e4552433131353552656365697665642063616c6c6572206e6565647320746044820152736f20696d706c656d656e7420455243313135352160601b6064820152608401610430565b60408051600180825281830190925260009160208083019080368337019050509050878160008151811061164757634e487b7160e01b600052603260045260246000fd5b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050878160008151811061169857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506116ac611344565b6001600160a01b0316630ef35220848484886040518563ffffffff1660e01b81526004016116dd94939291906121ad565b600060405180830381600087803b1580156116f757600080fd5b505af115801561170b573d6000803e3d6000fd5b5063f23a6e6160e01b9e9d5050505050505050505050505050565b6000805460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19061175590600401612362565b60206040518083038186803b15801561176d57600080fd5b505afa158015611781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a59190611c69565b6001600160a01b0316846001600160a01b03161480156117c6575060008251115b156117e657818060200190518101906117df9190611c69565b90506118ad565b6001600160a01b0383163b156118545760405162461bcd60e51b815260206004820152602d60248201527f4465706f73697420636f6e74726163742d6f776e656420746f6b656e2076696160448201526c2062726964676520686561642160981b6064820152608401610430565b6001600160a01b0383166118aa5760405162461bcd60e51b815260206004820181905260248201527f43616e2774206d696e7420696e746f20627269646765206469726563746c79216044820152606401610430565b50815b9392505050565b60606118da848484604051806060016040528060298152602001612412602991396119fb565b949350505050565b804710156119325760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610430565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461197f576040519150601f19603f3d011682016040523d82523d6000602084013e611984565b606091505b5050905080610e545760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610430565b606082471015611a5c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610430565b843b611aaa5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610430565b600080866001600160a01b03168587604051611ac691906120ec565b60006040518083038185875af1925050503d8060008114611b03576040519150601f19603f3d011682016040523d82523d6000602084013e611b08565b606091505b5091509150611b18828286611b23565b979650505050505050565b60608315611b325750816118ad565b825115611b425782518084602001fd5b8160405162461bcd60e51b81526004016104309190612225565b60008083601f840112611b6d578182fd5b50813567ffffffffffffffff811115611b84578182fd5b6020830191508360208260051b8501011115611b9f57600080fd5b9250929050565b600082601f830112611bb6578081fd5b8135602067ffffffffffffffff821115611bd257611bd26123e3565b8160051b611be1828201612386565b838152828101908684018388018501891015611bfb578687fd5b8693505b85841015611c1d578035835260019390930192918401918401611bff565b50979650505050505050565b60008083601f840112611c3a578182fd5b50813567ffffffffffffffff811115611c51578182fd5b602083019150836020828501011115611b9f57600080fd5b600060208284031215611c7a578081fd5b81516118ad816123f9565b600080600060408486031215611c99578182fd5b8335611ca4816123f9565b9250602084013567ffffffffffffffff811115611cbf578283fd5b611ccb86828701611c29565b9497909650939450505050565b60008060408385031215611cea578182fd5b8235611cf5816123f9565b91506020830135611d05816123f9565b809150509250929050565b60008060008060008060008060a0898b031215611d2b578384fd5b8835611d36816123f9565b97506020890135611d46816123f9565b9650604089013567ffffffffffffffff80821115611d62578586fd5b611d6e8c838d01611b5c565b909850965060608b0135915080821115611d86578586fd5b611d928c838d01611b5c565b909650945060808b0135915080821115611daa578384fd5b50611db78b828c01611c29565b999c989b5096995094979396929594505050565b60008060008060808587031215611de0578384fd5b8435611deb816123f9565b9350602085810135611dfc816123f9565b935060408601359250606086013567ffffffffffffffff80821115611e1f578384fd5b818801915088601f830112611e32578384fd5b813581811115611e4457611e446123e3565b611e56601f8201601f19168501612386565b91508082528984828501011115611e6b578485fd5b8084840185840137810190920192909252939692955090935050565b60008060008060008060a08789031215611e9f578182fd5b8635611eaa816123f9565b95506020870135611eba816123f9565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ee3578283fd5b611eef89828a01611c29565b979a9699509497509295939492505050565b60008060008060808587031215611f16578182fd5b8435611f21816123f9565b9350602085013567ffffffffffffffff80821115611f3d578384fd5b611f4988838901611ba6565b94506040870135915080821115611f5e578384fd5b50611f6b87828801611ba6565b9250506060850135611f7c816123f9565b939692955090935050565b600080600060408486031215611f9b578081fd5b8335611fa6816123f9565b9250602084013567ffffffffffffffff811115611cbf578182fd5b600080600060608486031215611fd5578081fd5b8335611fe0816123f9565b9250602084013591506040840135611ff7816123f9565b809150509250925092565b600060208284031215612013578081fd5b815180151581146118ad578182fd5b600060208284031215612033578081fd5b5051919050565b60006020828403121561204b578081fd5b81356001600160e01b0319811681146118ad578182fd5b600060208284031215612073578081fd5b81356118ad816123f9565b81835260006001600160fb1b03831115612096578081fd5b8260051b80836020870137939093016020019283525090919050565b6000815180845260208085019450808401835b838110156120e1578151875295820195908201906001016120c5565b509495945050505050565b600082516120fe8184602087016123b7565b9190910192915050565b6001600160a01b0385811682528416602082015260a060408201819052600090612134908301856120b2565b828103606084015261214681856120b2565b838103608090940193909352508152602001949350505050565b600060018060a01b0380891683526080602084015261218360808401888a61207e565b838103604085015261219681878961207e565b925050808416606084015250979650505050505050565b600060018060a01b038087168352608060208401526121cf60808401876120b2565b83810360408501526121e181876120b2565b92505080841660608401525095945050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60208152600082518060208401526122448160408501602087016123b7565b601f01601f19169190910160400192915050565b6020808252601690820152751d1bdad95b905cdcda59db9b595b9d10dbdb9d1c9bdb60521b604082015260600190565b6020808252603c908201527f627269646765436f6e74726f6c206b6579206f7220627269646765206865616460408201527f20726571756972656420666f7220746869732066756e6374696f6e2e00000000606082015260800190565b6020808252600d908201526c189c9a5919d950dbdb9d1c9bdb609a1b604082015260600190565b60208082526036908201527f746f6b656e41737369676e6d656e74436f6e74726f6c206b65792072657175696040820152753932b2103337b9103a3434b990333ab731ba34b7b71760511b606082015260800190565b6020808252600a9082015269189c9a5919d95219585960b21b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123af576123af6123e3565b604052919050565b60005b838110156123d25781810151838201526020016123ba565b838111156109df5750506000910152565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461240e57600080fd5b5056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212207cad4ec3561ab37bc4683ff49067d85ff4362541be2d420dab33e2d359e546f364736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000884fc15e31b1b634732e140cb3f94b3cbfdd1c5
-----Decoded View---------------
Arg [0] : _bridgeDataAddress (address): 0x0884fc15E31B1B634732e140cb3F94b3cbFdD1c5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000884fc15e31b1b634732e140cb3f94b3cbfdd1c5
Deployed Bytecode Sourcemap
45117:8703:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46161:314;;;;;;;;;;-1:-1:-1;46161:314:0;;;;;:::i;:::-;;:::i;:::-;;;15397:14:1;;15390:22;15372:41;;15360:2;15345:18;46161:314:0;;;;;;;;51936:212;;;;;;;;;;-1:-1:-1;51936:212:0;;;;;:::i;:::-;;:::i;:::-;;47105:1172;;;;;;;;;;-1:-1:-1;47105:1172:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;15586:33:1;;;15568:52;;15556:2;15541:18;47105:1172:0;15523:103:1;45243:38:0;;;;;;;;;;-1:-1:-1;45243:38:0;;;;-1:-1:-1;;;;;45243:38:0;;;;;;-1:-1:-1;;;;;11569:32:1;;;11551:51;;11539:2;11524:18;45243:38:0;11506:102:1;53289:240:0;;;;;;;;;;-1:-1:-1;53289:240:0;;;;;:::i;:::-;;:::i;46544:332::-;;;;;;;;;;-1:-1:-1;46544:332:0;;;;;:::i;:::-;;:::i;51273:604::-;;;;;;:::i;:::-;;:::i;52785:308::-;;;;;;;;;;-1:-1:-1;52785:308:0;;;;;:::i;:::-;;:::i;49259:834::-;;;;;;;;;;-1:-1:-1;49259:834:0;;;;;:::i;:::-;;:::i;52156:276::-;;;;;;;;;;-1:-1:-1;52156:276:0;;;;;:::i;:::-;;:::i;46884:149::-;;;;;;;;;;;;;:::i;53645:170::-;;;;;;;;;;-1:-1:-1;53645:170:0;;;;;:::i;:::-;;:::i;48285:966::-;;;;;;;;;;-1:-1:-1;48285:966:0;;;;;:::i;:::-;;:::i;46161:314::-;46265:4;-1:-1:-1;;;;;;46294:48:0;;-1:-1:-1;;;46294:48:0;;:117;;-1:-1:-1;;;;;;;46362:49:0;;-1:-1:-1;;;46362:49:0;46294:117;:173;;;-1:-1:-1;;;;;;;;;;13766:40:0;;;46431:36;46287:180;46161:314;-1:-1:-1;;46161:314:0:o;51936:212::-;45748:10;;:38;;-1:-1:-1;;;45748:38:0;;-1:-1:-1;;;;;45748:10:0;;;;:21;;:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45734:52:0;:10;-1:-1:-1;;;;;45734:52:0;;:105;;;-1:-1:-1;45804:10:0;;:35;;-1:-1:-1;;;45804:35:0;;-1:-1:-1;;;;;45804:10:0;;;;:21;;:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45790:49:0;:10;-1:-1:-1;;;;;45790:49:0;;45734:105;45726:178;;;;-1:-1:-1;;;45726:178:0;;;;;;;:::i;:::-;;;;;;;;;52071:69:::1;::::0;-1:-1:-1;;;52071:69:0;;52119:4:::1;52071:69;::::0;::::1;12750:34:1::0;-1:-1:-1;;;;;12820:15:1;;;12800:18;;;12793:43;12852:18;;;12845:34;;;52071:39:0;::::1;::::0;::::1;::::0;12685:18:1;;52071:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51936:212:::0;;;:::o;47105:1172::-;47240:6;47264:27;47294:37;47307:9;47318:5;47325;47294:12;:37::i;:::-;47491:67;;-1:-1:-1;;;47491:67:0;;-1:-1:-1;;;47491:67:0;;;15568:52:1;47264:67:0;;-1:-1:-1;47366:10:0;;;;47491:40;;15541:18:1;;47491:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47483:130;;;;-1:-1:-1;;;47483:130:0;;18616:2:1;47483:130:0;;;18598:21:1;18655:2;18635:18;;;18628:30;18694:34;18674:18;;;18667:62;-1:-1:-1;;;18745:18:1;;;18738:48;18803:19;;47483:130:0;18588:240:1;47483:130:0;47727:10;;:36;;-1:-1:-1;;;47727:36:0;;17855:2:1;47727:36:0;;;17837:21:1;17894:2;17874:18;;;17867:30;-1:-1:-1;;;17913:18:1;;;17906:41;-1:-1:-1;;;;;47727:10:0;;;;:21;;17964:18:1;;47727:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47710:53:0;:13;-1:-1:-1;;;;;47710:53:0;;47706:314;;;47811:55;;-1:-1:-1;;;47811:55:0;;;;;24433:25:1;;;47780:16:0;;-1:-1:-1;;;;;47811:45:0;;;;;24406:18:1;;47811:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47780:87;;47925:1;-1:-1:-1;;;;;47886:41:0;:4;-1:-1:-1;;;;;47886:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47886:41:0;;47882:127;;47948:45;;-1:-1:-1;;;47948:45:0;;47990:1;47948:45;;;11551:51:1;-1:-1:-1;;;;;47948:33:0;;;;;11524:18:1;;47948:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47882:127;47706:314;;48142:12;:10;:12::i;:::-;:79;;-1:-1:-1;;;48142:79:0;;-1:-1:-1;;;;;15110:15:1;;;48142:79:0;;;15092:34:1;15142:18;;;15135:34;;;15205:15;;;15185:18;;;15178:43;48142:33:0;;;;;;;15027:18:1;;48142:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;48239:30:0;47105:1172;-1:-1:-1;;;;;;;;;;47105:1172:0:o;53289:240::-;46003:10;;:47;;-1:-1:-1;;;46003:47:0;;-1:-1:-1;;;;;46003:10:0;;;;:21;;:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45989:61:0;:10;-1:-1:-1;;;;;45989:61:0;;45981:128;;;;-1:-1:-1;;;45981:128:0;;;;;;;:::i;:::-;53485:35:::1;::::0;-1:-1:-1;;;53485:35:0;;53514:4:::1;53485:35;::::0;::::1;11551:51:1::0;53435:13:0;;-1:-1:-1;;;;;53460:19:0;::::1;::::0;::::1;::::0;53480:3;;53460:19;;53485:20:::1;::::0;11524:18:1;;53485:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53460:61;::::0;-1:-1:-1;;;;;;53460:61:0::1;::::0;;;;;;-1:-1:-1;;;;;14765:32:1;;;53460:61:0::1;::::0;::::1;14747:51:1::0;14814:18;;;14807:34;14720:18;;53460:61:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46120:1;53289:240:::0;;:::o;46544:332::-;45572:10;;:38;;-1:-1:-1;;;45572:38:0;;-1:-1:-1;;;;;45572:10:0;;;;:21;;:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45558:52:0;:10;-1:-1:-1;;;;;45558:52:0;;45550:110;;;;-1:-1:-1;;;45550:110:0;;21433:2:1;45550:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;21511:34;21491:18;;;21484:62;-1:-1:-1;;;21562:18:1;;;21555:43;21615:19;;45550:110:0;21405:235:1;45550:110:0;-1:-1:-1;;;;;46656:39:0;::::1;46648:103;;;::::0;-1:-1:-1;;;46648:103:0;;17074:2:1;46648:103:0::1;::::0;::::1;17056:21:1::0;17113:2;17093:18;;;17086:30;17152:34;17132:18;;;17125:62;-1:-1:-1;;;17203:18:1;;;17196:49;17262:19;;46648:103:0::1;17046:241:1::0;46648:103:0::1;46793:10;::::0;;46767:63:::1;::::0;-1:-1:-1;;;;;46767:63:0;;::::1;::::0;46793:10;::::1;::::0;46767:63:::1;::::0;::::1;46841:10;:27:::0;;-1:-1:-1;;;;;;46841:27:0::1;-1:-1:-1::0;;;;;46841:27:0;;;::::1;::::0;;;::::1;::::0;;46544:332::o;51273:604::-;45748:10;;:38;;-1:-1:-1;;;45748:38:0;;-1:-1:-1;;;;;45748:10:0;;;;:21;;:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45734:52:0;:10;-1:-1:-1;;;;;45734:52:0;;:105;;;-1:-1:-1;45804:10:0;;:35;;-1:-1:-1;;;45804:35:0;;-1:-1:-1;;;;;45804:10:0;;;;:21;;:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45790:49:0;:10;-1:-1:-1;;;;;45790:49:0;;45734:105;45726:178;;;;-1:-1:-1;;;45726:178:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51427:31:0;::::1;51453:4;51427:31;::::0;::::1;::::0;:88:::1;;-1:-1:-1::0;51480:10:0::1;::::0;:35:::1;::::0;-1:-1:-1;;;51480:35:0;;-1:-1:-1;;;;;51480:10:0;;::::1;::::0;:21:::1;::::0;:35:::1;::::0;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51462:53:0::1;:14;-1:-1:-1::0;;;;;51462:53:0::1;;;51427:88;51419:139;;;::::0;-1:-1:-1;;;51419:139:0;;22603:2:1;51419:139:0::1;::::0;::::1;22585:21:1::0;22642:2;22622:18;;;22615:30;22681:34;22661:18;;;22654:62;-1:-1:-1;;;22732:18:1;;;22725:36;22778:19;;51419:139:0::1;22575:228:1::0;51419:139:0::1;51680:23:::0;;51676:194:::1;;51720:61;51757:12;;51720:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;51720:36:0;::::1;::::0;;-1:-1:-1;51771:9:0::1;51720:36;:61::i;51676:194::-;51823:35;-1:-1:-1::0;;;;;51823:24:0;::::1;51848:9;51823:24;:35::i;:::-;51273:604:::0;;;:::o;52785:308::-;46003:10;;:47;;-1:-1:-1;;;46003:47:0;;-1:-1:-1;;;;;46003:10:0;;;;:21;;:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45989:61:0;:10;-1:-1:-1;;;;;45989:61:0;;45981:128;;;;-1:-1:-1;;;45981:128:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52940:38:0;::::1;52932:81;;;::::0;-1:-1:-1;;;52932:81:0;;24130:2:1;52932:81:0::1;::::0;::::1;24112:21:1::0;24169:2;24149:18;;;24142:30;24208:32;24188:18;;;24181:60;24258:18;;52932:81:0::1;24102:180:1::0;52932:81:0::1;53024:61;::::0;-1:-1:-1;;;53024:61:0;;-1:-1:-1;;;;;53024:54:0;::::1;::::0;::::1;::::0;:61:::1;::::0;53079:5;;;;53024:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49259:834::-:0;49436:6;49460:27;49490:37;49503:9;49514:5;49521;;49490:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49490:12:0;;-1:-1:-1;;;49490:37:0:i;:::-;49688:68;;-1:-1:-1;;;49688:68:0;;-1:-1:-1;;;49688:68:0;;;15568:52:1;49460:67:0;;-1:-1:-1;49562:10:0;;;;49688:40;;15541:18:1;;49688:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49680:138;;;;-1:-1:-1;;;49680:138:0;;19035:2:1;49680:138:0;;;19017:21:1;19074:2;19054:18;;;19047:30;19113:34;19093:18;;;19086:62;19184:27;19164:18;;;19157:55;19229:19;;49680:138:0;19007:247:1;49680:138:0;49941:12;:10;:12::i;:::-;-1:-1:-1;;;;;49941:39:0;;49981:13;49996:4;;50002:7;;50011:19;49941:90;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;50049:36:0;49259:834;-1:-1:-1;;;;;;;;;;;;;;49259:834:0:o;52156:276::-;45748:10;;:38;;-1:-1:-1;;;45748:38:0;;-1:-1:-1;;;;;45748:10:0;;;;:21;;:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45734:52:0;:10;-1:-1:-1;;;;;45734:52:0;;:105;;;-1:-1:-1;45804:10:0;;:35;;-1:-1:-1;;;45804:35:0;;-1:-1:-1;;;;;45804:10:0;;;;:21;;:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45790:49:0;:10;-1:-1:-1;;;;;45790:49:0;;45734:105;45726:178;;;;-1:-1:-1;;;45726:178:0;;;;;;;:::i;:::-;52334:90:::1;::::0;-1:-1:-1;;;52334:90:0;;-1:-1:-1;;;;;52334:45:0;::::1;::::0;::::1;::::0;:90:::1;::::0;52388:4:::1;::::0;52395:3;;52400:9;;52411:8;;52334:90:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52156:276:::0;;;;:::o;46884:149::-;46946:11;46989:10;;:35;;-1:-1:-1;;;46989:35:0;;-1:-1:-1;;;;;46989:10:0;;;;:21;;:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46970:55;;46884:149;:::o;53645:170::-;46003:10;;:47;;-1:-1:-1;;;46003:47:0;;-1:-1:-1;;;;;46003:10:0;;;;:21;;:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45989:61:0;:10;-1:-1:-1;;;;;45989:61:0;;45981:128;;;;-1:-1:-1;;;45981:128:0;;;;;;;:::i;:::-;53767:40:::1;::::0;-1:-1:-1;;;53767:40:0;;-1:-1:-1;;;;;14470:32:1;;;53767:40:0::1;::::0;::::1;14452:51:1::0;53802:4:0::1;14519:18:1::0;;;14512:50;53767:29:0;::::1;::::0;::::1;::::0;14425:18:1;;53767:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53645:170:::0;;:::o;48285:966::-;48433:6;48457:27;48487:37;48500:9;48511:5;48518;;48487:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48487:12:0;;-1:-1:-1;;;48487:37:0:i;:::-;48685:68;;-1:-1:-1;;;48685:68:0;;-1:-1:-1;;;48685:68:0;;;15568:52:1;48457:67:0;;-1:-1:-1;48559:10:0;;;;48685:40;;15541:18:1;;48685:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48677:133;;;;-1:-1:-1;;;48677:133:0;;18195:2:1;48677:133:0;;;18177:21:1;18234:2;18214:18;;;18207:30;18273:34;18253:18;;;18246:62;-1:-1:-1;;;18324:18:1;;;18317:50;18384:19;;48677:133:0;18167:242:1;48677:133:0;48961:16;;;48975:1;48961:16;;;;;;;;;48933:25;;48961:16;;;;;;;;;;;-1:-1:-1;48961:16:0;48933:44;;49002:3;48988:8;48997:1;48988:11;;;;;;-1:-1:-1;;;48988:11:0;;;;;;;;;;;;;;;;;;:17;49043:16;;;49057:1;49043:16;;;;;;;;;49016:24;;49043:16;;;;;;;;;;;;-1:-1:-1;49043:16:0;49016:43;;49083:6;49070:7;49078:1;49070:10;;;;;;-1:-1:-1;;;49070:10:0;;;;;;;;;;;;;;:19;;;;;49100:12;:10;:12::i;:::-;-1:-1:-1;;;;;49100:39:0;;49140:13;49155:8;49165:7;49174:19;49100:94;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;49212:31:0;48285:966;-1:-1:-1;;;;;;;;;;;;;;48285:966:0:o;50101:912::-;50209:7;50251:10;;:35;;-1:-1:-1;;;50251:35:0;;-1:-1:-1;;;;;50251:10:0;;;;:21;;:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50238:48:0;:9;-1:-1:-1;;;;;50238:48:0;;:68;;;;;50305:1;50290:5;:12;:16;50238:68;50234:236;;;50441:5;50430:28;;;;;;;;;;;;:::i;:::-;50423:35;;;;50234:236;-1:-1:-1;;;;;50484:16:0;;14925:20;14964:8;50480:210;;50623:55;;-1:-1:-1;;;50623:55:0;;22189:2:1;50623:55:0;;;22171:21:1;22228:2;22208:18;;;22201:30;22267:34;22247:18;;;22240:62;-1:-1:-1;;;22318:18:1;;;22311:43;22371:19;;50623:55:0;22161:235:1;50480:210:0;-1:-1:-1;;;;;50704:19:0;;50700:198;;50844:42;;-1:-1:-1;;;50844:42:0;;17494:2:1;50844:42:0;;;17476:21:1;;;17513:18;;;17506:30;17572:34;17552:18;;;17545:62;17624:18;;50844:42:0;17466:182:1;50700:198:0;-1:-1:-1;51000:5:0;50101:912;;;;;;:::o;18046:226::-;18145:12;18177:87;18199:6;18207:4;18213:5;18177:87;;;;;;;;;;;;;;;;;:21;:87::i;:::-;18170:94;18046:226;-1:-1:-1;;;;18046:226:0:o;15915:397::-;16030:6;16005:21;:31;;15997:73;;;;-1:-1:-1;;;15997:73:0;;20239:2:1;15997:73:0;;;20221:21:1;20278:2;20258:18;;;20251:30;20317:31;20297:18;;;20290:59;20366:18;;15997:73:0;20211:179:1;15997:73:0;16162:12;16180:9;-1:-1:-1;;;;;16180:14:0;16203:6;16180:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16161:54;;;16234:7;16226:78;;;;-1:-1:-1;;;16226:78:0;;19461:2:1;16226:78:0;;;19443:21:1;19500:2;19480:18;;;19473:30;19539:34;19519:18;;;19512:62;19610:28;19590:18;;;19583:56;19656:19;;16226:78:0;19433:248:1;18528:530:0;18655:12;18713:5;18688:21;:30;;18680:81;;;;-1:-1:-1;;;18680:81:0;;20597:2:1;18680:81:0;;;20579:21:1;20636:2;20616:18;;;20609:30;20675:34;20655:18;;;20648:62;-1:-1:-1;;;20726:18:1;;;20719:36;20772:19;;18680:81:0;20569:228:1;18680:81:0;14925:20;;18772:60;;;;-1:-1:-1;;;18772:60:0;;23433:2:1;18772:60:0;;;23415:21:1;23472:2;23452:18;;;23445:30;23511:31;23491:18;;;23484:59;23560:18;;18772:60:0;23405:179:1;18772:60:0;18906:12;18920:23;18947:6;-1:-1:-1;;;;;18947:11:0;18967:5;18975:4;18947:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18905:75;;;;18998:52;19016:7;19025:10;19037:12;18998:17;:52::i;:::-;18991:59;18528:530;-1:-1:-1;;;;;;;18528:530:0:o;21068:742::-;21183:12;21212:7;21208:595;;;-1:-1:-1;21243:10:0;21236:17;;21208:595;21357:17;;:21;21353:439;;21620:10;21614:17;21681:15;21668:10;21664:2;21660:19;21653:44;21568:148;21763:12;21756:20;;-1:-1:-1;;;21756:20:0;;;;;;;;:::i;14:395:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:743::-;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:18;628:2;625:26;622:2;;;654:18;;:::i;:::-;700:2;697:1;693:10;723:28;747:2;743;739:11;723:28;:::i;:::-;785:15;;;816:12;;;;848:15;;;882;;;878:24;;875:33;-1:-1:-1;872:2:1;;;925:5;918;911:20;872:2;951:5;942:14;;965:163;979:2;976:1;973:9;965:163;;;1036:17;;1024:30;;997:1;990:9;;;;;1074:12;;;;1106;;965:163;;;-1:-1:-1;1146:5:1;478:679;-1:-1:-1;;;;;;;478:679:1:o;1162:375::-;1213:8;1223:6;1277:3;1270:4;1262:6;1258:17;1254:27;1244:2;;1302:8;1292;1285:26;1244:2;-1:-1:-1;1332:20:1;;1375:18;1364:30;;1361:2;;;1414:8;1404;1397:26;1361:2;1458:4;1450:6;1446:17;1434:29;;1510:3;1503:4;1494:6;1486;1482:19;1478:30;1475:39;1472:2;;;1527:1;1524;1517:12;1542:261;1612:6;1665:2;1653:9;1644:7;1640:23;1636:32;1633:2;;;1686:6;1678;1671:22;1633:2;1723:9;1717:16;1742:31;1767:5;1742:31;:::i;2082:572::-;2169:6;2177;2185;2238:2;2226:9;2217:7;2213:23;2209:32;2206:2;;;2259:6;2251;2244:22;2206:2;2303:9;2290:23;2322:31;2347:5;2322:31;:::i;:::-;2372:5;-1:-1:-1;2428:2:1;2413:18;;2400:32;2455:18;2444:30;;2441:2;;;2492:6;2484;2477:22;2441:2;2536:58;2586:7;2577:6;2566:9;2562:22;2536:58;:::i;:::-;2196:458;;2613:8;;-1:-1:-1;2510:84:1;;-1:-1:-1;;;;2196:458:1:o;2659:398::-;2727:6;2735;2788:2;2776:9;2767:7;2763:23;2759:32;2756:2;;;2809:6;2801;2794:22;2756:2;2853:9;2840:23;2872:31;2897:5;2872:31;:::i;:::-;2922:5;-1:-1:-1;2979:2:1;2964:18;;2951:32;2992:33;2951:32;2992:33;:::i;:::-;3044:7;3034:17;;;2746:311;;;;;:::o;3062:1378::-;3222:6;3230;3238;3246;3254;3262;3270;3278;3331:3;3319:9;3310:7;3306:23;3302:33;3299:2;;;3353:6;3345;3338:22;3299:2;3397:9;3384:23;3416:31;3441:5;3416:31;:::i;:::-;3466:5;-1:-1:-1;3523:2:1;3508:18;;3495:32;3536:33;3495:32;3536:33;:::i;:::-;3588:7;-1:-1:-1;3646:2:1;3631:18;;3618:32;3669:18;3699:14;;;3696:2;;;3731:6;3723;3716:22;3696:2;3775:70;3837:7;3828:6;3817:9;3813:22;3775:70;:::i;:::-;3864:8;;-1:-1:-1;3749:96:1;-1:-1:-1;3952:2:1;3937:18;;3924:32;;-1:-1:-1;3968:16:1;;;3965:2;;;4002:6;3994;3987:22;3965:2;4046:72;4110:7;4099:8;4088:9;4084:24;4046:72;:::i;:::-;4137:8;;-1:-1:-1;4020:98:1;-1:-1:-1;4225:3:1;4210:19;;4197:33;;-1:-1:-1;4242:16:1;;;4239:2;;;4276:6;4268;4261:22;4239:2;;4320:60;4372:7;4361:8;4350:9;4346:24;4320:60;:::i;:::-;3289:1151;;;;-1:-1:-1;3289:1151:1;;-1:-1:-1;3289:1151:1;;;;;;4399:8;-1:-1:-1;;;3289:1151:1:o;4445:1153::-;4540:6;4548;4556;4564;4617:3;4605:9;4596:7;4592:23;4588:33;4585:2;;;4639:6;4631;4624:22;4585:2;4683:9;4670:23;4702:31;4727:5;4702:31;:::i;:::-;4752:5;-1:-1:-1;4776:2:1;4815:18;;;4802:32;4843:33;4802:32;4843:33;:::i;:::-;4895:7;-1:-1:-1;4949:2:1;4934:18;;4921:32;;-1:-1:-1;5004:2:1;4989:18;;4976:32;5027:18;5057:14;;;5054:2;;;5089:6;5081;5074:22;5054:2;5132:6;5121:9;5117:22;5107:32;;5177:7;5170:4;5166:2;5162:13;5158:27;5148:2;;5204:6;5196;5189:22;5148:2;5245;5232:16;5267:2;5263;5260:10;5257:2;;;5273:18;;:::i;:::-;5315:53;5358:2;5339:13;;-1:-1:-1;;5335:27:1;5331:36;;5315:53;:::i;:::-;5302:66;;5391:2;5384:5;5377:17;5431:7;5426:2;5421;5417;5413:11;5409:20;5406:33;5403:2;;;5457:6;5449;5442:22;5403:2;5517;5512;5508;5504:11;5499:2;5492:5;5488:14;5475:45;5540:14;;5536:23;;;5529:39;;;;4575:1023;;;;-1:-1:-1;4575:1023:1;;-1:-1:-1;;4575:1023:1:o;5603:843::-;5709:6;5717;5725;5733;5741;5749;5802:3;5790:9;5781:7;5777:23;5773:33;5770:2;;;5824:6;5816;5809:22;5770:2;5868:9;5855:23;5887:31;5912:5;5887:31;:::i;:::-;5937:5;-1:-1:-1;5994:2:1;5979:18;;5966:32;6007:33;5966:32;6007:33;:::i;:::-;6059:7;-1:-1:-1;6113:2:1;6098:18;;6085:32;;-1:-1:-1;6164:2:1;6149:18;;6136:32;;-1:-1:-1;6219:3:1;6204:19;;6191:33;6247:18;6236:30;;6233:2;;;6284:6;6276;6269:22;6233:2;6328:58;6378:7;6369:6;6358:9;6354:22;6328:58;:::i;:::-;5760:686;;;;-1:-1:-1;5760:686:1;;-1:-1:-1;5760:686:1;;6405:8;;5760:686;-1:-1:-1;;;5760:686:1:o;6451:902::-;6587:6;6595;6603;6611;6664:3;6652:9;6643:7;6639:23;6635:33;6632:2;;;6686:6;6678;6671:22;6632:2;6730:9;6717:23;6749:31;6774:5;6749:31;:::i;:::-;6799:5;-1:-1:-1;6855:2:1;6840:18;;6827:32;6878:18;6908:14;;;6905:2;;;6940:6;6932;6925:22;6905:2;6968:61;7021:7;7012:6;7001:9;6997:22;6968:61;:::i;:::-;6958:71;;7082:2;7071:9;7067:18;7054:32;7038:48;;7111:2;7101:8;7098:16;7095:2;;;7132:6;7124;7117:22;7095:2;;7160:63;7215:7;7204:8;7193:9;7189:24;7160:63;:::i;:::-;7150:73;;;7275:2;7264:9;7260:18;7247:32;7288:33;7313:7;7288:33;:::i;:::-;6622:731;;;;-1:-1:-1;6622:731:1;;-1:-1:-1;;6622:731:1:o;7358:565::-;7438:6;7446;7454;7507:2;7495:9;7486:7;7482:23;7478:32;7475:2;;;7528:6;7520;7513:22;7475:2;7572:9;7559:23;7591:31;7616:5;7591:31;:::i;:::-;7641:5;-1:-1:-1;7697:2:1;7682:18;;7669:32;7724:18;7713:30;;7710:2;;;7761:6;7753;7746:22;7928:466;8005:6;8013;8021;8074:2;8062:9;8053:7;8049:23;8045:32;8042:2;;;8095:6;8087;8080:22;8042:2;8139:9;8126:23;8158:31;8183:5;8158:31;:::i;:::-;8208:5;-1:-1:-1;8260:2:1;8245:18;;8232:32;;-1:-1:-1;8316:2:1;8301:18;;8288:32;8329:33;8288:32;8329:33;:::i;:::-;8381:7;8371:17;;;8032:362;;;;;:::o;8399:297::-;8466:6;8519:2;8507:9;8498:7;8494:23;8490:32;8487:2;;;8540:6;8532;8525:22;8487:2;8577:9;8571:16;8630:5;8623:13;8616:21;8609:5;8606:32;8596:2;;8657:6;8649;8642:22;8701:194;8771:6;8824:2;8812:9;8803:7;8799:23;8795:32;8792:2;;;8845:6;8837;8830:22;8792:2;-1:-1:-1;8873:16:1;;8782:113;-1:-1:-1;8782:113:1:o;8900:306::-;8958:6;9011:2;8999:9;8990:7;8986:23;8982:32;8979:2;;;9032:6;9024;9017:22;8979:2;9063:23;;-1:-1:-1;;;;;;9115:32:1;;9105:43;;9095:2;;9167:6;9159;9152:22;9211:276;9289:6;9342:2;9330:9;9321:7;9317:23;9313:32;9310:2;;;9363:6;9355;9348:22;9310:2;9407:9;9394:23;9426:31;9451:5;9426:31;:::i;10109:360::-;10197:19;;;10179:3;-1:-1:-1;;;;;10228:31:1;;10225:2;;;10274:3;10269;10262:16;10225:2;10312:6;10309:1;10305:14;10364:8;10357:5;10350:4;10345:3;10341:14;10328:45;10396:18;;;;10416:4;10392:29;10430:15;;;-1:-1:-1;10392:29:1;;10187:282;-1:-1:-1;10187:282:1:o;10474:437::-;10527:3;10565:5;10559:12;10592:6;10587:3;10580:19;10618:4;10647:2;10642:3;10638:12;10631:19;;10684:2;10677:5;10673:14;10705:3;10717:169;10731:6;10728:1;10725:13;10717:169;;;10792:13;;10780:26;;10826:12;;;;10861:15;;;;10753:1;10746:9;10717:169;;;-1:-1:-1;10902:3:1;;10535:376;-1:-1:-1;;;;;10535:376:1:o;10916:274::-;11045:3;11083:6;11077:13;11099:53;11145:6;11140:3;11133:4;11125:6;11121:17;11099:53;:::i;:::-;11168:16;;;;;11053:137;-1:-1:-1;;11053:137:1:o;11613:892::-;-1:-1:-1;;;;;12064:15:1;;;12046:34;;12116:15;;12111:2;12096:18;;12089:43;12026:3;12163:2;12148:18;;12141:31;;;11989:4;;12195:57;;12232:19;;12224:6;12195:57;:::i;:::-;12300:9;12292:6;12288:22;12283:2;12272:9;12268:18;12261:50;12334:44;12371:6;12363;12334:44;:::i;:::-;12415:22;;;12409:3;12394:19;;;12387:51;;;;-1:-1:-1;12447:20:1;;12496:2;12484:15;;11998:507;-1:-1:-1;;;;11998:507:1:o;12890:719::-;13186:4;13232:1;13228;13223:3;13219:11;13215:19;13273:2;13265:6;13261:15;13250:9;13243:34;13313:3;13308:2;13297:9;13293:18;13286:31;13340:74;13409:3;13398:9;13394:19;13386:6;13378;13340:74;:::i;:::-;13462:9;13454:6;13450:22;13445:2;13434:9;13430:18;13423:50;13490:61;13544:6;13536;13528;13490:61;:::i;:::-;13482:69;;;13599:2;13591:6;13587:15;13582:2;13571:9;13567:18;13560:43;;13195:414;;;;;;;;;:::o;13614:665::-;13890:4;13936:1;13932;13927:3;13923:11;13919:19;13977:2;13969:6;13965:15;13954:9;13947:34;14017:3;14012:2;14001:9;13997:18;13990:31;14044:57;14096:3;14085:9;14081:19;14073:6;14044:57;:::i;:::-;14149:9;14141:6;14137:22;14132:2;14121:9;14117:18;14110:50;14177:44;14214:6;14206;14177:44;:::i;:::-;14169:52;;;14269:2;14261:6;14257:15;14252:2;14241:9;14237:18;14230:43;;13899:380;;;;;;;:::o;16086:393::-;16245:2;16234:9;16227:21;16284:6;16279:2;16268:9;16264:18;16257:34;16341:6;16333;16328:2;16317:9;16313:18;16300:48;16208:4;16368:22;;;16392:2;16364:31;;;16357:45;;;;16463:2;16442:15;;;-1:-1:-1;;16438:29:1;16423:45;16419:54;;16217:262;-1:-1:-1;16217:262:1:o;16484:383::-;16633:2;16622:9;16615:21;16596:4;16665:6;16659:13;16708:6;16703:2;16692:9;16688:18;16681:34;16724:66;16783:6;16778:2;16767:9;16763:18;16758:2;16750:6;16746:15;16724:66;:::i;:::-;16851:2;16830:15;-1:-1:-1;;16826:29:1;16811:45;;;;16858:2;16807:54;;16605:262;-1:-1:-1;;16605:262:1:o;19686:346::-;19888:2;19870:21;;;19927:2;19907:18;;;19900:30;-1:-1:-1;;;19961:2:1;19946:18;;19939:52;20023:2;20008:18;;19860:172::o;20802:424::-;21004:2;20986:21;;;21043:2;21023:18;;;21016:30;21082:34;21077:2;21062:18;;21055:62;21153:30;21148:2;21133:18;;21126:58;21216:3;21201:19;;20976:250::o;21645:337::-;21847:2;21829:21;;;21886:2;21866:18;;;21859:30;-1:-1:-1;;;21920:2:1;21905:18;;21898:43;21973:2;21958:18;;21819:163::o;22808:418::-;23010:2;22992:21;;;23049:2;23029:18;;;23022:30;23088:34;23083:2;23068:18;;23061:62;-1:-1:-1;;;23154:2:1;23139:18;;23132:52;23216:3;23201:19;;22982:244::o;23589:334::-;23791:2;23773:21;;;23830:2;23810:18;;;23803:30;-1:-1:-1;;;23864:2:1;23849:18;;23842:40;23914:2;23899:18;;23763:160::o;24469:275::-;24540:2;24534:9;24605:2;24586:13;;-1:-1:-1;;24582:27:1;24570:40;;24640:18;24625:34;;24661:22;;;24622:62;24619:2;;;24687:18;;:::i;:::-;24723:2;24716:22;24514:230;;-1:-1:-1;24514:230:1:o;24749:258::-;24821:1;24831:113;24845:6;24842:1;24839:13;24831:113;;;24921:11;;;24915:18;24902:11;;;24895:39;24867:2;24860:10;24831:113;;;24962:6;24959:1;24956:13;24953:2;;;-1:-1:-1;;24997:1:1;24979:16;;24972:27;24802:205::o;25012:127::-;25073:10;25068:3;25064:20;25061:1;25054:31;25104:4;25101:1;25094:15;25128:4;25125:1;25118:15;25144:131;-1:-1:-1;;;;;25219:31:1;;25209:42;;25199:2;;25265:1;25262;25255:12;25199:2;25189:86;:::o
Swarm Source
ipfs://7cad4ec3561ab37bc4683ff49067d85ff4362541be2d420dab33e2d359e546f3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1 | 47.637 | $47.64 |
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.