Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Contract Bas... | 18470923 | 346 days ago | IN | 0 ETH | 0.0053183 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17659248 | 459 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
LayerrRenderer
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.20; import {ILayerrRenderer} from "./interfaces/ILayerrRenderer.sol"; import {IOwnable} from "./interfaces/IOwnable.sol"; /** * @title LayerrRenderer * @author 0xth0mas (Layerr) * @notice LayerrRenderer handles contractURI and tokenURI generation for contracts * deployed on the Layerr platform. Contract owners have complete control of * their tokens with the ability to set their own renderer, host their tokens * with Layerr, set all tokens to a prereveal image, or set a base URI that * token ids will be appended to. * Tokens hosted with Layerr will automatically generate a tokenURI with the * `layerrBaseTokenUri`/{chainId}/{contractAddress}/{tokenId} to allow new tokens * to be minted without updating a base uri. * For long term storage, Layerr-hosted tokens can be swept onto Layerr's IPFS * solution. */ contract LayerrRenderer is ILayerrRenderer { /// @dev Layerr-owned EOA that is allowed to update the base token and base contract URIs for Layerr-hosted non-IPFS tokens address public owner; /// @dev Layerr's signature account for checking parameters of tokens swept to Layerr IPFS address public layerrSigner = 0xc44355A57368C22D01A8a146C0a2669B504B25A0; /// @dev The base token URI that chainId, contractAddress and tokenId are added to for rendering string public layerrBaseTokenUri = 'https://metadata.layerr.art'; /// @dev The base contract URI that chainId and contractAddress are added to for rendering string public layerrBaseContractUri = 'https://contract-metadata.layerr.art'; /// @dev The rendering type for a token contract, defaults to LAYERR_HOSTED mapping(address => RenderType) public contractRenderType; /// @dev Base token URI set by the token contract owner for BASE_PLUS_TOKEN render type and LAYERR_HOSTED tokens on IPFS mapping(address => string) public contractBaseTokenUri; /// @dev Token contract URI set by the token contract owner mapping(address => string) public contractContractUri; /// @dev mapping of token contract addresses that flag a token contract as having all of its tokens hosted on Layerr IPFS mapping(address => bool) public layerrHostedAllTokensOnIPFS; /// @dev bitmap of token ids for a token contract that have been moved to Layerr hosted IPFS mapping(address => mapping(uint256 => uint256)) public layerrHostedTokensOnIPFS; /// @dev mapping of token contract addresses with the UTC timestamp of when the IPFS hosting is paid through mapping(address => uint256) public layerrHostedIPFSExpiration; modifier onlyOwner() { if (msg.sender != owner) { revert NotContractOwner(); } _; } constructor() { owner = 0x0000000000799dfE79Ed462822EC68eF9a6199e6; } /** * @inheritdoc ILayerrRenderer */ function tokenURI( address contractAddress, uint256 tokenId ) external view returns (string memory _tokenURI) { RenderType renderType = contractRenderType[contractAddress]; if (renderType == RenderType.LAYERR_HOSTED) { if(_isLayerrHostedIPFS(contractAddress, tokenId)) { _tokenURI = string( abi.encodePacked(contractBaseTokenUri[contractAddress], _toString(tokenId)) ); } else { _tokenURI = string( abi.encodePacked( layerrBaseTokenUri, "/", _toString(block.chainid), "/", _toString(contractAddress), "/", _toString(tokenId) ) ); } } else if (renderType == RenderType.PREREVEAL) { _tokenURI = contractBaseTokenUri[contractAddress]; } else if (renderType == RenderType.BASE_PLUS_TOKEN) { _tokenURI = string( abi.encodePacked(contractBaseTokenUri[contractAddress], _toString(tokenId)) ); } } /** * @inheritdoc ILayerrRenderer */ function contractURI( address contractAddress ) external view returns (string memory _contractURI) { _contractURI = contractContractUri[contractAddress]; if (bytes(_contractURI).length == 0) { _contractURI = string( abi.encodePacked( layerrBaseContractUri, "/", _toString(block.chainid), "/", _toString(contractAddress) ) ); } } /** * @notice Updates rendering settings for a contract. Must be the ERC173 owner for the token contract to call. * @param contractAddress address of the contract to set the base token URI for * @param baseTokenUri base token URI to set for `contractAddress` * @param renderType sets the current render type for the contract */ function setContractBaseTokenUri( address contractAddress, string calldata baseTokenUri, RenderType renderType ) external { if (IOwnable(contractAddress).owner() != msg.sender) { revert NotContractOwner(); } contractBaseTokenUri[contractAddress] = baseTokenUri; contractRenderType[contractAddress] = renderType; } /** * @notice Updates rendering settings for a contract. Must be the ERC173 owner for the token contract to call. * @param contractAddress address of the contract to set the base token URI for * @param contractUri contract URI to set for `contractAddress` */ function setContractUri( address contractAddress, string calldata contractUri ) external { if (IOwnable(contractAddress).owner() != msg.sender) { revert NotContractOwner(); } contractContractUri[contractAddress] = contractUri; } /** * @notice Updates the base token URI to sweep tokens to IPFS for Layerr hosted tokens * This allows new tokens to continue to be minted on the contract with the default * rendering address while existing tokens are moved onto IPFS for long term storage. * @param contractAddress address of the token contract * @param baseTokenUri base token URI to set for the contract's tokens * @param allTokens set to true for larger collections that are done minting * avoids setting each token id in the bitmap for gas savings but new tokens * will not render with the default rendering address * @param tokenIds array of token ids that are being swept to Layerr hosted IPFS * @param ipfsExpiration UTC timestamp that the IPFS hosting is paid through * @param signature signature by Layerr account to confirm the parameters supplied */ function setContractBaseTokenUriForLayerrHostedIPFS( address contractAddress, string calldata baseTokenUri, bool allTokens, uint256[] calldata tokenIds, uint256 ipfsExpiration, bytes calldata signature ) external payable { if (IOwnable(contractAddress).owner() != msg.sender) { revert NotContractOwner(); } bytes32 hash = keccak256(abi.encodePacked(contractAddress, baseTokenUri, ipfsExpiration, msg.value)); address signer = _recover(hash, signature); if(signer != layerrSigner) revert InvalidSignature(); (bool sent, ) = payable(owner).call{value: msg.value}(""); if (!sent) { revert PaymentFailed(); } layerrHostedIPFSExpiration[contractAddress] = ipfsExpiration; layerrHostedAllTokensOnIPFS[contractAddress] = allTokens; contractBaseTokenUri[contractAddress] = baseTokenUri; contractRenderType[contractAddress] = RenderType.LAYERR_HOSTED; for(uint256 i = 0;i < tokenIds.length;) { _setLayerrHostedIPFS(contractAddress, tokenIds[i]); unchecked { ++i; } } } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(ILayerrRenderer).interfaceId; } /* OWNER FUNCTIONS */ /** * @notice Owner function to set the Layerr signature account * @param _layerrSigner address that will be used to check signatures */ function setLayerrSigner( address _layerrSigner ) external onlyOwner { layerrSigner = _layerrSigner; } /** * @notice Owner function to set the default token rendering URI * @param _layerrBaseTokenUri base token uri to be used for default token rendering */ function setLayerrBaseTokenUri( string calldata _layerrBaseTokenUri ) external onlyOwner { layerrBaseTokenUri = _layerrBaseTokenUri; } /** * @notice Owner function to set the default contract rendering URI * @param _layerrBaseContractUri base contract uri to be used for default rendering */ function setLayerrBaseContractUri( string calldata _layerrBaseContractUri ) external onlyOwner { layerrBaseContractUri = _layerrBaseContractUri; } /* INTERNAL FUNCTIONS */ /** * @notice Checks to see if a token has been flagged as being hosted on Layerr IPFS * @param contractAddress token contract address to check * @param tokenId id of the token to check * @return isIPFS if token has been flagged as being hosted on Layerr IPFS */ function _isLayerrHostedIPFS(address contractAddress, uint256 tokenId) internal view returns(bool isIPFS) { isIPFS = layerrHostedAllTokensOnIPFS[contractAddress] || layerrHostedTokensOnIPFS[contractAddress][tokenId >> 8] & (1 << (tokenId & 0xFF)) != 0; } /** * @notice Flags a token as being hosted on Layerr IPFS in a bitmap * @param contractAddress token contract address * @param tokenId id of the token */ function _setLayerrHostedIPFS(address contractAddress, uint256 tokenId) internal { layerrHostedTokensOnIPFS[contractAddress][tokenId >> 8] |= (1 << (tokenId & 0xFF)); } function _toString(uint256 value) internal pure virtual returns (string memory str) { /// @solidity memory-safe-assembly assembly { let m := add(mload(0x40), 0xa0) mstore(0x40, m) str := sub(m, 0x20) mstore(str, 0) let end := str for { let temp := value } 1 {} { str := sub(str, 1) mstore8(str, add(48, mod(temp, 10))) temp := div(temp, 10) if iszero(temp) { break } } let length := sub(end, str) str := sub(str, 0x20) mstore(str, length) } } function _toString(address value) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; ) { bytes1 b = bytes1(uint8(uint(uint160(value)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = _char(hi); s[2*i+1] = _char(lo); unchecked { ++i; } } return string(s); } function _char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } /** * @dev Recover signer address from a message by using their signature * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address. * @param sig bytes signature, the signature is generated using web3.eth.sign() */ function _recover( bytes32 hash, bytes calldata sig ) internal pure returns (address) { bytes32 r; bytes32 s; uint8 v; // Check the signature length if (sig.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables /// @solidity memory-safe-assembly assembly { r := calldataload(sig.offset) s := calldataload(add(sig.offset, 32)) v := byte(0, calldataload(add(sig.offset, 64))) } // If the version is correct return the signer address if (v != 27 && v != 28) { return (address(0)); } else { return ecrecover(hash, v, r, s); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {ERC165} from "./IERC165.sol"; /** * @title ILayerrRenderer * @author 0xth0mas (Layerr) * @notice ILayerrRenderer interface defines functions required in LayerrRenderer to be callable by token contracts */ interface ILayerrRenderer is ERC165 { enum RenderType { LAYERR_HOSTED, PREREVEAL, BASE_PLUS_TOKEN } /// @dev Thrown when a payment fails for Layerr-hosted IPFS error PaymentFailed(); /// @dev Thrown when a call is made for an owner-function by a non-contract owner error NotContractOwner(); /// @dev Thrown when a signature is not made by the authorized account error InvalidSignature(); /** * @notice Generates a tokenURI for the `contractAddress` and `tokenId` * @param contractAddress token contract address to render a token URI for * @param tokenId token id to render * @return uri for the token metadata */ function tokenURI( address contractAddress, uint256 tokenId ) external view returns (string memory); /** * @notice Generates a contractURI for the `contractAddress` * @param contractAddress contract address to render a contract URI for * @return uri for the contract metadata */ function contractURI( address contractAddress ) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {ERC165} from './IERC165.sol'; interface IOwnable is ERC165 { /// @dev Thrown when a non-owner is attempting to perform an owner function error NotContractOwner(); /// @dev Emitted when contract ownership is transferred to a new owner event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /// @notice Get the address of the owner /// @return The address of the owner. function owner() view external returns(address); /// @notice Set the address of the new owner of the contract /// @dev Set _newOwner to address(0) to renounce any ownership. /// @param _newOwner The address of the new owner of the contract function transferOwnership(address _newOwner) external; }
{ "optimizer": { "enabled": true, "runs": 33333 }, "evmVersion": "paris", "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotContractOwner","type":"error"},{"inputs":[],"name":"PaymentFailed","type":"error"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractBaseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractContractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractRenderType","outputs":[{"internalType":"enum ILayerrRenderer.RenderType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"contractURI","outputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerrBaseContractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerrBaseTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"layerrHostedAllTokensOnIPFS","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"layerrHostedIPFSExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"layerrHostedTokensOnIPFS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerrSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"baseTokenUri","type":"string"},{"internalType":"enum ILayerrRenderer.RenderType","name":"renderType","type":"uint8"}],"name":"setContractBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"baseTokenUri","type":"string"},{"internalType":"bool","name":"allTokens","type":"bool"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"ipfsExpiration","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setContractBaseTokenUriForLayerrHostedIPFS","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"contractUri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_layerrBaseContractUri","type":"string"}],"name":"setLayerrBaseContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_layerrBaseTokenUri","type":"string"}],"name":"setLayerrBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_layerrSigner","type":"address"}],"name":"setLayerrSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052346200019057600180546001600160a01b031990811673c44355a57368c22d01a8a146c0a2669b504b25a0178255600254620000409062000195565b601f81116200015d575b507f68747470733a2f2f6d657461646174612e6c61796572722e61727400000000366002556003546200007d9062000195565b601f8111620000ed575b50630b985c9d60e21b6e799dfe79ed462822ec68ef9a6199e6926049600355600360005260206000207f68747470733a2f2f636f6e74726163742d6d657461646174612e6c6179657272815501556000541617600055604051611f2b9081620001d38239f35b60036000908152601f9190910160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d5b8281106200015257505062000087565b818155840162000142565b60006002815283601f60208320930160051c8301925b83811062000184575050506200004a565b82815501849062000173565b600080fd5b90600182811c92168015620001c7575b6020831014620001b157565b634e487b7160e01b600052602260045260246000fd5b91607f1691620001a556fe6080604052600436101561001257600080fd5b60003560e01c8062844d13146116c857806301ffc9a71461165d5780630a08ce51146113ec57806312f96a7514610eaf5780631598e5a314610e685780635cc0b33a14610c285780636dcca55014610a465780638246f1db14610835578063898096c3146107ee5780638da5cb5b146107ba578063995af44914610773578063a1a91bff146106cd578063af0413f114610699578063bdbb116a14610644578063d048355914610558578063d1433dde14610505578063e9dc6375146101d0578063f6230708146101845763f9a555ca146100ec57600080fd5b3461017f57602060031936011261017f5761010561187d565b73ffffffffffffffffffffffffffffffffffffffff908160005416330361015557167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155600080f35b60046040517fbfcafd37000000000000000000000000000000000000000000000000000000008152fd5b600080fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6101b261187d565b166000526007602052602060ff604060002054166040519015158152f35b3461017f57604060031936011261017f576101e961187d565b60243560609173ffffffffffffffffffffffffffffffffffffffff811690816000526020936004855260ff6040600020541660038110156104d6578061046f575050816000526007845260ff604060002054168015610447575b156102c6575061027c916102c2936102b6926000526005815261026a604060002092611b61565b61028960405195869484860190611a94565b91828151948592016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261198e565b604051918291826118c3565b0390f35b90506102e36102dd6102d746611b61565b92611c44565b92611b61565b90604051926000600254906102f78261193b565b60019280841690811561040e57506001146103ba575b50926103876102c29787946103b597946003977f2f00000000000000000000000000000000000000000000000000000000000000958187809352610359825180938887850191016118a0565b019182015261037182518093856002850191016118a0565b01926002840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe381018452018261198e565b6102b6565b905060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6000905b8282106103fb5750508501860161038761030d565b80548883018a01529088019083016103e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016888a0152508015150286018701905061038761030d565b506008845260406000208360081c6000528452604060002054600160ff85161b161515610243565b90929391506001811460001461049a5750505090600591600052526102c26103b560406000206119cf565b9360026102c295146104b0575b505090506102b6565b6104ce925061027c936000526005815261026a604060002092611b61565b8083806104a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61053361187d565b16600052600460205260ff6040600020541660405160038210156104d6576020918152f35b3461017f57600060031936011261017f57604051600060035461057a8161193b565b808452906001908181169081156105ff57506001146105a4575b6102c2846102b68186038261198e565b6003600090815292507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106105e75750505081016020016102b682610594565b805460208587018101919091529093019281016105cf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208087019190915292151560051b850190920192506102b69150839050610594565b3461017f57604060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61067261187d565b16600052600860205260406000206024356000526020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461017f57600060031936011261017f5760405160006002546106ef8161193b565b808452906001908181169081156105ff5750600114610718576102c2846102b68186038261198e565b6002600090815292507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061075b5750505081016020016102b682610594565b80546020858701810191909152909301928101610743565b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6107a161187d565b1660005260096020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61081c61187d565b1660005260056020526102c26102b660406000206119cf565b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f5761086890369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a175761089960035461193b565b601f81116109b8575b50600092601f83116001146108ff57509181926000926108f4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600355600080f35b0135905082806108bd565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b926000905b8682106109a05750508360019510610968575b505050811b01600355005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905582808061095d565b8060018496829495870135815501950192019061094a565b7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191858510610a0d575b601f0160051c01905b818110610a0157506108a2565b600081556001016109f4565b90915081906109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f57610a7990369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a1757610aaa60025461193b565b601f8111610bc9575b50600092601f8311600114610b105750918192600092610b05575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600255600080f35b013590508280610ace565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace926000905b868210610bb15750508360019510610b79575b505050811b01600255005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055828080610b6e565b80600184968294958701358155019501920190610b5b565b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191858510610c1e575b601f0160051c01905b818110610c125750610ab3565b60008155600101610c05565b9091508190610bfc565b3461017f57604060031936011261017f57610c4161187d565b67ffffffffffffffff60243581811161017f57610c6290369060040161190d565b9073ffffffffffffffffffffffffffffffffffffffff8094166040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020958682600481865afa918215610e5c57600092610e2d575b503391160361015557600052600684526040600020928211610a1757610ce1835461193b565b601f8111610de7575b50600093601f8311600114610d47575092819293600092610d3c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610d06565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316948460005282600020926000905b878210610dcf575050836001959610610d97575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610d8d565b80600184968294958701358155019501920190610d79565b8360005284600020601f840160051c810191868510610e23575b601f0160051c01905b818110610e175750610cea565b60008155600101610e0a565b9091508190610e01565b610e4e919250873d8911610e55575b610e46818361198e565b810190611b35565b9087610cbb565b503d610e3c565b6040513d6000823e3d90fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff610e9661187d565b1660005260066020526102c26102b660406000206119cf565b60c060031936011261017f57610ec361187d565b60243567ffffffffffffffff811161017f57610ee390369060040161190d565b604435801515810361017f5767ffffffffffffffff6064351161017f5736602360643501121561017f5767ffffffffffffffff606435600401351161017f573660246064356004013560051b60643501011161017f5760a43567ffffffffffffffff811161017f57610f5990369060040161190d565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff8b165afa908115610e5c576000916113cd575b5073ffffffffffffffffffffffffffffffffffffffff33911603610155576110339160405160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008960601b1682528688603483013761102b607482898101608435603482015234605482015203605481018452018261198e565b519020611e7c565b73ffffffffffffffffffffffffffffffffffffffff80600154169116036113a35760008080803473ffffffffffffffffffffffffffffffffffffffff8254165af13d1561139e573d67ffffffffffffffff8111610a1757604051906110c060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018361198e565b8152600060203d92013e5b156113745773ffffffffffffffffffffffffffffffffffffffff84166000526009602052608435604060002055600760205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055600560205260406000209167ffffffffffffffff8211610a17578190611156845461193b565b601f8111611324575b50600090601f831160011461126257600092611257575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b73ffffffffffffffffffffffffffffffffffffffff8116600052600460205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905560005b60643560040135811061120457005b80602460019260051b60643501013573ffffffffffffffffffffffffffffffffffffffff8416600052600880602052816040600020911c6000526020528260ff604060002092161b8154179055016111f5565b013590508480611176565b600085815260208120909450915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416851061130c5760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08116106112d4575b505050811b0190556111a8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806112c7565b81810135835560209485019460019093019201611270565b909150836000526020600020601f840160051c81016020851061136d575b90849392915b601f830160051c8201811061135e57505061115f565b60008155859450600101611348565b5080611342565b60046040517ff499da20000000000000000000000000000000000000000000000000000000008152fd5b6110cb565b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6113e6915060203d602011610e5557610e46818361198e565b87610fad565b3461017f57606060031936011261017f5761140561187d565b67ffffffffffffffff60243581811161017f5761142690369060040161190d565b929060443592600384101561017f5773ffffffffffffffffffffffffffffffffffffffff809316916040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020948582600481885afa918215610e5c5760009261163e575b50339116036101555782600052600584526040600020918611610a17576114b5825461193b565b601f81116115f8575b50600090601f87116001146115535795809160049697600092611548575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b6000525260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b0135905087806114dc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087169183600052856000209260005b8181106115e157509160019391896004999a94106115a9575b505050811b01905561150e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905587808061159c565b919387600181928787013581550195019201611583565b8260005284600020601f880160051c810191868910611634575b601f0160051c01905b81811061162857506114be565b6000815560010161161b565b9091508190611612565b611656919250863d8811610e5557610e46818361198e565b908861148e565b3461017f57602060031936011261017f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361017f576020907fe9582e660000000000000000000000000000000000000000000000000000000060405191148152f35b3461017f5760208060031936011261017f576116e261187d565b9073ffffffffffffffffffffffffffffffffffffffff82166000526006815261170e60406000206119cf565b90815115611725575b604051806102c284826118c3565b90506117336102d746611b61565b91604051916000600354926117478461193b565b60019480861690811561184457506001146117ee575b50946117e8936117ba60029487946102c2997f2f00000000000000000000000000000000000000000000000000000000000000918281526117a6825180938689850191016118a0565b0193840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe281018452018261198e565b82611717565b90915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6000905b82821061183157505084018201906117e861175d565b805487830186015290840190850161181b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168588015250801515028501830191506117e861175d565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017f57565b60005b8381106118b35750506000910152565b81810151838201526020016118a3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040936020845261190681518092816020880152602088880191016118a0565b0116010190565b9181601f8401121561017f5782359167ffffffffffffffff831161017f576020838186019501011161017f57565b90600182811c92168015611984575b602083101461195557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161194a565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a1757604052565b90604051918260008254926119e38461193b565b908184526001948581169081600014611a525750600114611a0f575b5050611a0d9250038361198e565b565b9093915060005260209081600020936000915b818310611a3a575050611a0d935082010138806119ff565b85548884018501529485019487945091830191611a22565b9050611a0d9550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138806119ff565b600092918154611aa38161193b565b92600191808316908115611afc5750600114611ac0575b50505050565b90919293945060005260209081600020906000915b858310611aeb5750505050019038808080611aba565b805485840152918301918101611ad5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016845250505081151590910201915038808080611aba565b9081602091031261017f575173ffffffffffffffffffffffffffffffffffffffff8116810361017f5790565b9060405160a081016040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608082019360008552935b0192600a90818106603001855304928315611bd4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611b98565b92506080837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09203019201918252565b908151811015611c15570160200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604051906060820182811067ffffffffffffffff821117610a175760405260288252604036602084013760005b60148110611c7e57505090565b601390808203918211611dac578160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603611dac5760ff808311611dac5760019283811b15611ddb5773ffffffffffffffffffffffffffffffffffffffff8516901c60f0811682821603918211611dac577f0f00000000000000000000000000000000000000000000000000000000000000611d229160f41b16611e0a565b9082841b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84168403611dac57611d8d917fff000000000000000000000000000000000000000000000000000000000000009160001a611d83858a611c04565b5360f81b16611e0a565b838201809211611dac57611da59060001a9186611c04565b5301611c71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60f81c600a811015611e495760300160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b60570160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b9091604103611eee57600082604082940135821a92601b84141580611ee3575b15611ea8575050505090565b6020608092819560405193845282840152803560408401520135606082015282805260015afa15611ed7575190565b604051903d90823e3d90fd5b50601c841415611e9c565b505060009056fea26469706673582212206bc15351f18d369ad8114fef889337e19224acfe27fc86a5c6465257e33eef7f64736f6c63430008140033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c8062844d13146116c857806301ffc9a71461165d5780630a08ce51146113ec57806312f96a7514610eaf5780631598e5a314610e685780635cc0b33a14610c285780636dcca55014610a465780638246f1db14610835578063898096c3146107ee5780638da5cb5b146107ba578063995af44914610773578063a1a91bff146106cd578063af0413f114610699578063bdbb116a14610644578063d048355914610558578063d1433dde14610505578063e9dc6375146101d0578063f6230708146101845763f9a555ca146100ec57600080fd5b3461017f57602060031936011261017f5761010561187d565b73ffffffffffffffffffffffffffffffffffffffff908160005416330361015557167fffffffffffffffffffffffff00000000000000000000000000000000000000006001541617600155600080f35b60046040517fbfcafd37000000000000000000000000000000000000000000000000000000008152fd5b600080fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6101b261187d565b166000526007602052602060ff604060002054166040519015158152f35b3461017f57604060031936011261017f576101e961187d565b60243560609173ffffffffffffffffffffffffffffffffffffffff811690816000526020936004855260ff6040600020541660038110156104d6578061046f575050816000526007845260ff604060002054168015610447575b156102c6575061027c916102c2936102b6926000526005815261026a604060002092611b61565b61028960405195869484860190611a94565b91828151948592016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261198e565b604051918291826118c3565b0390f35b90506102e36102dd6102d746611b61565b92611c44565b92611b61565b90604051926000600254906102f78261193b565b60019280841690811561040e57506001146103ba575b50926103876102c29787946103b597946003977f2f00000000000000000000000000000000000000000000000000000000000000958187809352610359825180938887850191016118a0565b019182015261037182518093856002850191016118a0565b01926002840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe381018452018261198e565b6102b6565b905060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6000905b8282106103fb5750508501860161038761030d565b80548883018a01529088019083016103e6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016888a0152508015150286018701905061038761030d565b506008845260406000208360081c6000528452604060002054600160ff85161b161515610243565b90929391506001811460001461049a5750505090600591600052526102c26103b560406000206119cf565b9360026102c295146104b0575b505090506102b6565b6104ce925061027c936000526005815261026a604060002092611b61565b8083806104a7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61053361187d565b16600052600460205260ff6040600020541660405160038210156104d6576020918152f35b3461017f57600060031936011261017f57604051600060035461057a8161193b565b808452906001908181169081156105ff57506001146105a4575b6102c2846102b68186038261198e565b6003600090815292507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106105e75750505081016020016102b682610594565b805460208587018101919091529093019281016105cf565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208087019190915292151560051b850190920192506102b69150839050610594565b3461017f57604060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61067261187d565b16600052600860205260406000206024356000526020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461017f57600060031936011261017f5760405160006002546106ef8161193b565b808452906001908181169081156105ff5750600114610718576102c2846102b68186038261198e565b6002600090815292507f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841061075b5750505081016020016102b682610594565b80546020858701810191909152909301928101610743565b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff6107a161187d565b1660005260096020526020604060002054604051908152f35b3461017f57600060031936011261017f57602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff61081c61187d565b1660005260056020526102c26102b660406000206119cf565b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f5761086890369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a175761089960035461193b565b601f81116109b8575b50600092601f83116001146108ff57509181926000926108f4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600355600080f35b0135905082806108bd565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b926000905b8682106109a05750508360019510610968575b505050811b01600355005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905582808061095d565b8060018496829495870135815501950192019061094a565b7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f840160051c810191858510610a0d575b601f0160051c01905b818110610a0157506108a2565b600081556001016109f4565b90915081906109eb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461017f5760208060031936011261017f5767ffffffffffffffff60043581811161017f57610a7990369060040161190d565b9173ffffffffffffffffffffffffffffffffffffffff600054163303610155578211610a1757610aaa60025461193b565b601f8111610bc9575b50600092601f8311600114610b105750918192600092610b05575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c191617600255600080f35b013590508280610ace565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace926000905b868210610bb15750508360019510610b79575b505050811b01600255005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055828080610b6e565b80600184968294958701358155019501920190610b5b565b7f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f840160051c810191858510610c1e575b601f0160051c01905b818110610c125750610ab3565b60008155600101610c05565b9091508190610bfc565b3461017f57604060031936011261017f57610c4161187d565b67ffffffffffffffff60243581811161017f57610c6290369060040161190d565b9073ffffffffffffffffffffffffffffffffffffffff8094166040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020958682600481865afa918215610e5c57600092610e2d575b503391160361015557600052600684526040600020928211610a1757610ce1835461193b565b601f8111610de7575b50600093601f8311600114610d47575092819293600092610d3c575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b013590508380610d06565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316948460005282600020926000905b878210610dcf575050836001959610610d97575b505050811b019055005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055838080610d8d565b80600184968294958701358155019501920190610d79565b8360005284600020601f840160051c810191868510610e23575b601f0160051c01905b818110610e175750610cea565b60008155600101610e0a565b9091508190610e01565b610e4e919250873d8911610e55575b610e46818361198e565b810190611b35565b9087610cbb565b503d610e3c565b6040513d6000823e3d90fd5b3461017f57602060031936011261017f5773ffffffffffffffffffffffffffffffffffffffff610e9661187d565b1660005260066020526102c26102b660406000206119cf565b60c060031936011261017f57610ec361187d565b60243567ffffffffffffffff811161017f57610ee390369060040161190d565b604435801515810361017f5767ffffffffffffffff6064351161017f5736602360643501121561017f5767ffffffffffffffff606435600401351161017f573660246064356004013560051b60643501011161017f5760a43567ffffffffffffffff811161017f57610f5990369060040161190d565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff8b165afa908115610e5c576000916113cd575b5073ffffffffffffffffffffffffffffffffffffffff33911603610155576110339160405160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008960601b1682528688603483013761102b607482898101608435603482015234605482015203605481018452018261198e565b519020611e7c565b73ffffffffffffffffffffffffffffffffffffffff80600154169116036113a35760008080803473ffffffffffffffffffffffffffffffffffffffff8254165af13d1561139e573d67ffffffffffffffff8111610a1757604051906110c060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116018361198e565b8152600060203d92013e5b156113745773ffffffffffffffffffffffffffffffffffffffff84166000526009602052608435604060002055600760205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055600560205260406000209167ffffffffffffffff8211610a17578190611156845461193b565b601f8111611324575b50600090601f831160011461126257600092611257575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b73ffffffffffffffffffffffffffffffffffffffff8116600052600460205260406000207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905560005b60643560040135811061120457005b80602460019260051b60643501013573ffffffffffffffffffffffffffffffffffffffff8416600052600880602052816040600020911c6000526020528260ff604060002092161b8154179055016111f5565b013590508480611176565b600085815260208120909450915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416851061130c5760019450837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08116106112d4575b505050811b0190556111a8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690558480806112c7565b81810135835560209485019460019093019201611270565b909150836000526020600020601f840160051c81016020851061136d575b90849392915b601f830160051c8201811061135e57505061115f565b60008155859450600101611348565b5080611342565b60046040517ff499da20000000000000000000000000000000000000000000000000000000008152fd5b6110cb565b60046040517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6113e6915060203d602011610e5557610e46818361198e565b87610fad565b3461017f57606060031936011261017f5761140561187d565b67ffffffffffffffff60243581811161017f5761142690369060040161190d565b929060443592600384101561017f5773ffffffffffffffffffffffffffffffffffffffff809316916040517f8da5cb5b0000000000000000000000000000000000000000000000000000000081526020948582600481885afa918215610e5c5760009261163e575b50339116036101555782600052600584526040600020918611610a17576114b5825461193b565b601f81116115f8575b50600090601f87116001146115535795809160049697600092611548575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b6000525260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600080f35b0135905087806114dc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087169183600052856000209260005b8181106115e157509160019391896004999a94106115a9575b505050811b01905561150e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905587808061159c565b919387600181928787013581550195019201611583565b8260005284600020601f880160051c810191868910611634575b601f0160051c01905b81811061162857506114be565b6000815560010161161b565b9091508190611612565b611656919250863d8811610e5557610e46818361198e565b908861148e565b3461017f57602060031936011261017f576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361017f576020907fe9582e660000000000000000000000000000000000000000000000000000000060405191148152f35b3461017f5760208060031936011261017f576116e261187d565b9073ffffffffffffffffffffffffffffffffffffffff82166000526006815261170e60406000206119cf565b90815115611725575b604051806102c284826118c3565b90506117336102d746611b61565b91604051916000600354926117478461193b565b60019480861690811561184457506001146117ee575b50946117e8936117ba60029487946102c2997f2f00000000000000000000000000000000000000000000000000000000000000918281526117a6825180938689850191016118a0565b0193840152835193849187850191016118a0565b01037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe281018452018261198e565b82611717565b90915060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6000905b82821061183157505084018201906117e861175d565b805487830186015290840190850161181b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168588015250801515028501830191506117e861175d565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361017f57565b60005b8381106118b35750506000910152565b81810151838201526020016118a3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040936020845261190681518092816020880152602088880191016118a0565b0116010190565b9181601f8401121561017f5782359167ffffffffffffffff831161017f576020838186019501011161017f57565b90600182811c92168015611984575b602083101461195557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161194a565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610a1757604052565b90604051918260008254926119e38461193b565b908184526001948581169081600014611a525750600114611a0f575b5050611a0d9250038361198e565b565b9093915060005260209081600020936000915b818310611a3a575050611a0d935082010138806119ff565b85548884018501529485019487945091830191611a22565b9050611a0d9550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138806119ff565b600092918154611aa38161193b565b92600191808316908115611afc5750600114611ac0575b50505050565b90919293945060005260209081600020906000915b858310611aeb5750505050019038808080611aba565b805485840152918301918101611ad5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016845250505081151590910201915038808080611aba565b9081602091031261017f575173ffffffffffffffffffffffffffffffffffffffff8116810361017f5790565b9060405160a081016040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608082019360008552935b0192600a90818106603001855304928315611bd4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611b98565b92506080837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09203019201918252565b908151811015611c15570160200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604051906060820182811067ffffffffffffffff821117610a175760405260288252604036602084013760005b60148110611c7e57505090565b601390808203918211611dac578160031b917f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811603611dac5760ff808311611dac5760019283811b15611ddb5773ffffffffffffffffffffffffffffffffffffffff8516901c60f0811682821603918211611dac577f0f00000000000000000000000000000000000000000000000000000000000000611d229160f41b16611e0a565b9082841b917f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84168403611dac57611d8d917fff000000000000000000000000000000000000000000000000000000000000009160001a611d83858a611c04565b5360f81b16611e0a565b838201809211611dac57611da59060001a9186611c04565b5301611c71565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60f81c600a811015611e495760300160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b60570160ff8111611dac5760f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b9091604103611eee57600082604082940135821a92601b84141580611ee3575b15611ea8575050505090565b6020608092819560405193845282840152803560408401520135606082015282805260015afa15611ed7575190565b604051903d90823e3d90fd5b50601c841415611e9c565b505060009056fea26469706673582212206bc15351f18d369ad8114fef889337e19224acfe27fc86a5c6465257e33eef7f64736f6c63430008140033
Deployed Bytecode Sourcemap
982:12097:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;2788:10;:19;2784:77;;982:12097;;8900:28;982:12097;;;8900:28;982:12097;;;;2784:77;982:12097;;;2831:18;;;;982:12097;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2314:59;982:12097;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3251:38;;;982:12097;;;;;10111:27;982:12097;;;;;;;;10111:134;;;;3247:1042;3309:45;;;982:12097;;;;;3416:75;982:12097;;;3433:20;982:12097;;3472:18;982:12097;;;3472:18;;:::i;:::-;982:12097;;;3416:75;;;;;;982:12097;;:::i;:::-;;;;;;;;;;:::i;:::-;;3416:75;;;;;;;;:::i;:::-;982:12097;;;;;;;:::i;:::-;;;;3306:644;3720:13;;3874:18;3791:26;3710:24;3720:13;3710:24;:::i;:::-;3791:26;;:::i;:::-;3874:18;;:::i;:::-;982:12097;;;;;3635:18;982:12097;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;3592:323;982:12097;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;3635:18;982:12097;;;;;:::i;:::-;;;3635:18;982:12097;;;;;;;;;;;;;;:::i;:::-;;3592:323;;;;;;;;;:::i;:::-;3306:644;;982:12097;;;3635:18;982:12097;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3592:323;;;982:12097;-1:-1:-1;982:12097:0;;;;;;;;;-1:-1:-1;982:12097:0;;;10111:134;982:12097;10159:24;982:12097;;;;;;10159:24;982:12097;;;;;;;;;;;10224:14;;982:12097;10159:81;:86;;10111:134;;3247:1042;3971:34;;;;;982:12097;3971:34;;3967:322;982:12097;;;;;;;4034:20;982:12097;;;;;;;;;;:::i;3967:322::-;4093:40;4107:26;982:12097;4093:40;;4089:200;;3967:322;;;;;3247:1042;;4089:200;4187:75;982:12097;;;;;;4204:20;982:12097;;4243:18;982:12097;;;4243:18;;:::i;4187:75::-;4089:200;;;;;982:12097;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;1640:76;982:12097;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1640:76;982:12097;;;;;-1:-1:-1;982:12097:0;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2480:79;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;1288:72;982:12097;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;1471:64;982:12097;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1471:64;982:12097;;;;;-1:-1:-1;982:12097:0;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2682:61;982:12097;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;1997:54;982:12097;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;2788:10;:19;2784:77;;982:12097;;;;;9593:46;982:12097;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9593:46;982:12097;;;;;9593:46;982:12097;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;9593:46;982:12097;;;;;;9593:46;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;2788:10;:19;2784:77;;982:12097;;;;;9235:40;982:12097;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9235:40;982:12097;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;9235:40;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;6090:33;;982:12097;6090:33;;;982:12097;6090:33;;;;;;;;;982:12097;6090:33;;;982:12097;6127:10;;982:12097;;6090:47;6086:105;;982:12097;;6201:19;982:12097;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;6090:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;982:12097;;;;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;;:::i;:::-;;;;2125:53;982:12097;;;;;;;;:::i;:::-;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;7518:33;;982:12097;;;;;;;7518:33;;;;;;;982:12097;7518:33;;;982:12097;7555:10;982:12097;7555:10;982:12097;;7518:47;7514:105;;7759:25;982:12097;;;;7656:74;;982:12097;;;;;;;;;;;;;;7656:74;;982:12097;;;;;;;;;;7720:9;982:12097;;;;7656:74;982:12097;7656:74;;;;;;;:::i;:::-;982:12097;7646:85;;7759:25;:::i;:::-;982:12097;;;;;;;7798:22;7795:52;;982:12097;7720:9;;;;982:12097;;;;7876:41;;982:12097;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7932:5;7928:60;;982:12097;;;;;8000:26;982:12097;;;;;;;;8071:27;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8294:19;982:12097;;;;;8294:19;;;;982:12097;8280:13;982:12097;;;;;;;;;;;;;;;;10537:24;982:12097;;;;;;;;;;;;;;;;;;10603:14;;982:12097;;;10537:82;982:12097;;;8280:13;;982:12097;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;7656:74;982:12097;;;;;;;;;;7656:74;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;-1:-1:-1;982:12097:0;;;7928:60;982:12097;;;7961:15;;;;982:12097;;;7795:52;982:12097;;;7829:18;;;;7518:33;;;;982:12097;7518:33;982:12097;7518:33;;;;;;;:::i;:::-;;;;982:12097;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;5437:33;;982:12097;5437:33;;;982:12097;5437:33;;;;;;;;;982:12097;5437:33;;;982:12097;5474:10;;982:12097;;5437:47;5433:105;;982:12097;;;5548:20;982:12097;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5548:20;982:12097;;;;;;;;;;;;5548:20;982:12097;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;5437:33;;;;;;;;;;;;;;;:::i;:::-;;;;;982:12097;;;;;-1:-1:-1;;982:12097:0;;;;;;;;;;;;;;;;;8564:33;982:12097;;8549:48;;982:12097;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;;;:::i;:::-;;;;;;;4497:19;982:12097;;;;;;;:::i;:::-;;;;4548:31;4544:346;;982:12097;;;;;;;;:::i;4544:346::-;4755:13;;4818:26;4745:24;4755:13;4745:24;:::i;4818:26::-;982:12097;;;;;4675:21;982:12097;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4636:227;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;4636:227;;;;;;;;;:::i;:::-;4544:346;;;982:12097;;;;4675:21;982:12097;;;;;;;;;;;-1:-1:-1;;982:12097:0;;;;;4636:227;982:12097;;;;;;;;;;;;;;;;;;;;;;4636:227;;;982:12097;-1:-1:-1;982:12097:0;;;;;;;;;-1:-1:-1;4636:227:0;982:12097;;;;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;982:12097:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;-1:-1:-1;982:12097:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;-1:-1:-1;982:12097:0;;;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;-1:-1:-1;982:12097:0;;;;-1:-1:-1;982:12097:0;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;982:12097:0;;;;;;;;-1:-1:-1;982:12097:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;10635:676::-;;10774:530;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10635:676::o;982:12097::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;11319:486;982:12097;;;;;;;;;;;;;;;;;11429:2;982:12097;;;;;;;;-1:-1:-1;11460:6:0;11464:2;11460:6;;;;11781:16;;11319:486;:::o;11448:10::-;11540:2;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;11713:1;982:12097;;;;;;;;;;;;;;;;;;;;;;;;;11683:9;982:12097;;;;11683:9;:::i;:::-;982:12097;;;;;;;;;;;;11718:9;11674:18;982:12097;11674:18;-1:-1:-1;11674:18:0;;;;;:::i;:::-;;982:12097;;;11718:9;:::i;:::-;982:12097;;;;;;;;11707:20;;-1:-1:-1;11707:20:0;;;;:::i;:::-;;982:12097;11448:10;;982:12097;;-1:-1:-1;982:12097:0;;;;;-1:-1:-1;982:12097:0;;;-1:-1:-1;982:12097:0;;;;;-1:-1:-1;982:12097:0;11813:172;982:12097;;11897:2;11886:13;;11897:2;;;982:12097;;;;;;;;;;;;11901:30::o;11882:95::-;982:12097;;;;;;;;;;;;11947:30::o;12282:794::-;;;12519:2;12505:16;12501:68;;-1:-1:-1;12682:177:0;;;;;;;;12939:7;12944:2;12939:7;;;:18;;;12282:794;12935:134;;;12974:19;;;;;:::o;12935:134::-;12682:177;982:12097;;;;12682:177;982:12097;;;;;;;;12682:177;;;982:12097;;;12682:177;;982:12097;;;;13033:24;;;;;;;;;;13026:31;:::o;13033:24::-;12682:177;982:12097;;;;;;;;;12939:18;12950:7;12955:2;12950:7;;;12939:18;;12501:68;12538:19;;-1:-1:-1;12538:19:0;:::o
Swarm Source
ipfs://6bc15351f18d369ad8114fef889337e19224acfe27fc86a5c6465257e33eef7f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.