Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
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:
DiamondCutFacet
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-26 */ // File: contracts/interfaces/IDiamondCut.sol // SPDX-License-Identifier: MIT pragma solidity 0.8.12; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ interface IDiamondCut { enum FacetCutAction {Add, Replace, Remove} // Add=0, Replace=1, Remove=2 struct FacetCut { address facetAddress; FacetCutAction action; bytes4[] functionSelectors; } /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external; event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata); } // File: contracts/libraries/LibDiamond.sol pragma solidity 0.8.12; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ library LibDiamond { bytes32 constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage"); struct DiamondStorage { // maps function selectors to the facets that execute the functions. // and maps the selectors to their position in the selectorSlots array. // func selector => address facet, selector position mapping(bytes4 => bytes32) facets; // array of slots of function selectors. // each slot holds 8 function selectors. mapping(uint256 => bytes32) selectorSlots; // Used to query if a contract implements an interface. // Used to implement ERC-165. mapping(bytes4 => bool) supportedInterfaces; // // The number of function selectors in selectorSlots uint16 selectorCount; // owner of the contract address contractOwner; } function diamondStorage() internal pure returns (DiamondStorage storage ds) { bytes32 position = DIAMOND_STORAGE_POSITION; assembly { ds.slot := position } } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function setContractOwner(address _newOwner) internal { DiamondStorage storage ds = diamondStorage(); address previousOwner = ds.contractOwner; ds.contractOwner = _newOwner; emit OwnershipTransferred(previousOwner, _newOwner); } function contractOwner() internal view returns (address contractOwner_) { contractOwner_ = diamondStorage().contractOwner; } function enforceIsContractOwner() internal view { require(msg.sender == diamondStorage().contractOwner, "Must be contract owner"); } event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata); bytes32 constant CLEAR_ADDRESS_MASK = bytes32(uint256(0xffffffffffffffffffffffff)); bytes32 constant CLEAR_SELECTOR_MASK = bytes32(uint256(0xffffffff << 224)); // Internal function version of diamondCut // This code is almost the same as the external diamondCut, // except it is using 'Facet[] memory _diamondCut' instead of // 'Facet[] calldata _diamondCut'. // The code is duplicated to prevent copying calldata to memory which // causes an error for a two dimensional array. function diamondCut( IDiamondCut.FacetCut[] memory _diamondCut, address _init, bytes memory _calldata ) internal { DiamondStorage storage ds = diamondStorage(); uint256 originalSelectorCount = ds.selectorCount; uint256 selectorCount = originalSelectorCount; bytes32 selectorSlot; // Check if last selector slot is not full // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" if (selectorCount & 7 > 0) { // get last selectorSlot // "selectorSlot >> 3" is a gas efficient division by 8 "selectorSlot / 8" selectorSlot = ds.selectorSlots[selectorCount >> 3]; } // loop through diamond cut for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { (selectorCount, selectorSlot) = addReplaceRemoveFacetSelectors( selectorCount, selectorSlot, _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].action, _diamondCut[facetIndex].functionSelectors ); } if (selectorCount != originalSelectorCount) { ds.selectorCount = uint16(selectorCount); } // If last selector slot is not full // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" if (selectorCount & 7 > 0) { // "selectorSlot >> 3" is a gas efficient division by 8 "selectorSlot / 8" ds.selectorSlots[selectorCount >> 3] = selectorSlot; } emit DiamondCut(_diamondCut, _init, _calldata); initializeDiamondCut(_init, _calldata); } function addReplaceRemoveFacetSelectors( uint256 _selectorCount, bytes32 _selectorSlot, address _newFacetAddress, IDiamondCut.FacetCutAction _action, bytes4[] memory _selectors ) internal returns (uint256, bytes32) { DiamondStorage storage ds = diamondStorage(); require(_selectors.length > 0, "LibDiamondCut: No selectors in facet to cut"); if (_action == IDiamondCut.FacetCutAction.Add) { enforceHasContractCode(_newFacetAddress, "LibDiamondCut: Add facet has no code"); for (uint256 selectorIndex; selectorIndex < _selectors.length; selectorIndex++) { bytes4 selector = _selectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; require(address(bytes20(oldFacet)) == address(0), "LibDiamondCut: Can't add function that already exists"); // add facet for selector ds.facets[selector] = bytes20(_newFacetAddress) | bytes32(_selectorCount); // "_selectorCount & 7" is a gas efficient modulo by eight "_selectorCount % 8" uint256 selectorInSlotPosition = (_selectorCount & 7) << 5; // clear selector position in slot and add selector _selectorSlot = (_selectorSlot & ~(CLEAR_SELECTOR_MASK >> selectorInSlotPosition)) | (bytes32(selector) >> selectorInSlotPosition); // if slot is full then write it to storage if (selectorInSlotPosition == 224) { // "_selectorSlot >> 3" is a gas efficient division by 8 "_selectorSlot / 8" ds.selectorSlots[_selectorCount >> 3] = _selectorSlot; _selectorSlot = 0; } _selectorCount++; } } else if (_action == IDiamondCut.FacetCutAction.Replace) { enforceHasContractCode(_newFacetAddress, "LibDiamondCut: Replace facet has no code"); for (uint256 selectorIndex; selectorIndex < _selectors.length; selectorIndex++) { bytes4 selector = _selectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; address oldFacetAddress = address(bytes20(oldFacet)); // only useful if immutable functions exist require(oldFacetAddress != address(this), "LibDiamondCut: Can't replace immutable function"); require(oldFacetAddress != _newFacetAddress, "LibDiamondCut: Can't replace function with same function"); require(oldFacetAddress != address(0), "LibDiamondCut: Can't replace function that doesn't exist"); // replace old facet address ds.facets[selector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(_newFacetAddress); } } else if (_action == IDiamondCut.FacetCutAction.Remove) { require(_newFacetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)"); // "_selectorCount >> 3" is a gas efficient division by 8 "_selectorCount / 8" uint256 selectorSlotCount = _selectorCount >> 3; // "_selectorCount & 7" is a gas efficient modulo by eight "_selectorCount % 8" uint256 selectorInSlotIndex = _selectorCount & 7; for (uint256 selectorIndex; selectorIndex < _selectors.length; selectorIndex++) { if (_selectorSlot == 0) { // get last selectorSlot selectorSlotCount--; _selectorSlot = ds.selectorSlots[selectorSlotCount]; selectorInSlotIndex = 7; } else { selectorInSlotIndex--; } bytes4 lastSelector; uint256 oldSelectorsSlotCount; uint256 oldSelectorInSlotPosition; // adding a block here prevents stack too deep error { bytes4 selector = _selectors[selectorIndex]; bytes32 oldFacet = ds.facets[selector]; require(address(bytes20(oldFacet)) != address(0), "LibDiamondCut: Can't remove function that doesn't exist"); // only useful if immutable functions exist require(address(bytes20(oldFacet)) != address(this), "LibDiamondCut: Can't remove immutable function"); // replace selector with last selector in ds.facets // gets the last selector lastSelector = bytes4(_selectorSlot << (selectorInSlotIndex << 5)); if (lastSelector != selector) { // update last selector slot position info ds.facets[lastSelector] = (oldFacet & CLEAR_ADDRESS_MASK) | bytes20(ds.facets[lastSelector]); } delete ds.facets[selector]; uint256 oldSelectorCount = uint16(uint256(oldFacet)); // "oldSelectorCount >> 3" is a gas efficient division by 8 "oldSelectorCount / 8" oldSelectorsSlotCount = oldSelectorCount >> 3; // "oldSelectorCount & 7" is a gas efficient modulo by eight "oldSelectorCount % 8" oldSelectorInSlotPosition = (oldSelectorCount & 7) << 5; } if (oldSelectorsSlotCount != selectorSlotCount) { bytes32 oldSelectorSlot = ds.selectorSlots[oldSelectorsSlotCount]; // clears the selector we are deleting and puts the last selector in its place. oldSelectorSlot = (oldSelectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition); // update storage with the modified slot ds.selectorSlots[oldSelectorsSlotCount] = oldSelectorSlot; } else { // clears the selector we are deleting and puts the last selector in its place. _selectorSlot = (_selectorSlot & ~(CLEAR_SELECTOR_MASK >> oldSelectorInSlotPosition)) | (bytes32(lastSelector) >> oldSelectorInSlotPosition); } if (selectorInSlotIndex == 0) { delete ds.selectorSlots[selectorSlotCount]; _selectorSlot = 0; } } _selectorCount = selectorSlotCount * 8 + selectorInSlotIndex; } else { revert("LibDiamondCut: Incorrect FacetCutAction"); } return (_selectorCount, _selectorSlot); } function initializeDiamondCut(address _init, bytes memory _calldata) internal { if (_init == address(0)) { require(_calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty"); } else { require(_calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)"); if (_init != address(this)) { enforceHasContractCode(_init, "LibDiamondCut: _init address has no code"); } (bool success, bytes memory error) = _init.delegatecall(_calldata); if (!success) { if (error.length > 0) { // bubble up the error revert(string(error)); } else { revert("LibDiamondCut: _init function reverted"); } } } } function isContract(address _contract) internal view returns (bool) { uint256 contractSize; assembly { contractSize := extcodesize(_contract) } return contractSize > 0; } function enforceHasContractCode(address _contract, string memory _errorMessage) internal view { require(isContract(_contract), _errorMessage); } } // File: contracts/facets/DiamondCutFacet.sol pragma solidity 0.8.12; /******************************************************************************\ * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen) * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535 /******************************************************************************/ contract DiamondCutFacet is IDiamondCut { /// @notice Add/replace/remove any number of functions and optionally execute /// a function with delegatecall /// @param _diamondCut Contains the facet addresses and function selectors /// @param _init The address of the contract or facet to execute _calldata /// @param _calldata A function call, including function selector and arguments /// _calldata is executed with delegatecall on _init function diamondCut( FacetCut[] calldata _diamondCut, address _init, bytes calldata _calldata ) external override { LibDiamond.enforceIsContractOwner(); LibDiamond.DiamondStorage storage ds = LibDiamond.diamondStorage(); uint256 originalSelectorCount = ds.selectorCount; uint256 selectorCount = originalSelectorCount; bytes32 selectorSlot; // Check if last selector slot is not full // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" if (selectorCount & 7 > 0) { // get last selectorSlot // "selectorCount >> 3" is a gas efficient division by 8 "selectorCount / 8" selectorSlot = ds.selectorSlots[selectorCount >> 3]; } // loop through diamond cut for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) { (selectorCount, selectorSlot) = LibDiamond.addReplaceRemoveFacetSelectors( selectorCount, selectorSlot, _diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].action, _diamondCut[facetIndex].functionSelectors ); } if (selectorCount != originalSelectorCount) { ds.selectorCount = uint16(selectorCount); } // If last selector slot is not full // "selectorCount & 7" is a gas efficient modulo by eight "selectorCount % 8" if (selectorCount & 7 > 0) { // "selectorCount >> 3" is a gas efficient division by 8 "selectorCount / 8" ds.selectorSlots[selectorCount >> 3] = selectorSlot; } emit DiamondCut(_diamondCut, _init, _calldata); LibDiamond.initializeDiamondCut(_init, _calldata); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"indexed":false,"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"indexed":false,"internalType":"address","name":"_init","type":"address"},{"indexed":false,"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"DiamondCut","type":"event"},{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum IDiamondCut.FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct IDiamondCut.FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"diamondCut","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506117f1806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80631f931c1c14610030575b600080fd5b61004361003e36600461115e565b610045565b005b61004d610298565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131f547fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9061ffff8116908190600090600716156100bc5750600381901c60009081526001840160205260409020545b60005b888110156101b35761019c83838c8c858181106100de576100de611210565b90506020028101906100f0919061123f565b6100fe90602081019061127d565b8d8d8681811061011057610110611210565b9050602002810190610122919061123f565b6101339060408101906020016112ae565b8e8e8781811061014557610145611210565b9050602002810190610157919061123f565b6101659060408101906112c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061034892505050565b9093509150806101ab81611360565b9150506100bf565b508282146101ec576003840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff84161790555b600782161561020e57600382901c600090815260018501602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738989898989604051610245959493929190611479565b60405180910390a161028d8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610df492505050565b505050505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6003015462010000900473ffffffffffffffffffffffffffffffffffffffff163314610346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520636f6e7472616374206f776e65720000000000000000000060448201526064015b60405180910390fd5b565b600080807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90506000845111610400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f20637574000000000000000000000000000000000000000000606482015260840161033d565b600085600281111561041457610414611399565b14156105ec5761043c86604051806060016040528060248152602001611748602491396110ad565b60005b84518110156105e657600085828151811061045c5761045c611210565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000008116600090815291859052604090912054909150606081901c1561052f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c7265616479206578697374730000000000000000000000606482015260840161033d565b7fffffffff0000000000000000000000000000000000000000000000000000000080831660008181526020879052604090207fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608d901b168e17905560e060058e901b811692831c199c909c1690821c179a8114156105c35760038c901c600090815260018601602052604081209b909b555b8b6105cd81611360565b9c505050505080806105de90611360565b91505061043f565b50610de8565b600185600281111561060057610600611399565b14156108fd5761062886604051806060016040528060288152602001611794602891396110ad565b60005b84518110156105e657600085828151811061064857610648611210565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000008116600090815291859052604090912054909150606081901c3081141561071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4c69624469616d6f6e644375743a2043616e2774207265706c61636520696d6d60448201527f757461626c652066756e6374696f6e0000000000000000000000000000000000606482015260840161033d565b8973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000606482015260840161033d565b73ffffffffffffffffffffffffffffffffffffffff811661087d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e207468617420646f65736e27742065786973740000000000000000606482015260840161033d565b507fffffffff0000000000000000000000000000000000000000000000000000000090911660009081526020849052604090206bffffffffffffffffffffffff919091167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608a901b16179055806108f581611360565b91505061062b565b600285600281111561091157610911611399565b1415610d605773ffffffffffffffffffffffffffffffffffffffff8616156109bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d757374206265206164647265737328302900000000000000000000606482015260840161033d565b600388901c6007891660005b8651811015610d4057896109ff57826109df8161162e565b60008181526001870160205260409020549b50935060079250610a0d9050565b81610a098161162e565b9250505b6000806000808a8581518110610a2557610a25611210565b6020908102919091018101517fffffffff0000000000000000000000000000000000000000000000000000000081166000908152918a9052604090912054909150606081901c610af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e2774206578697374000000000000000000606482015260840161033d565b606081901c301415610b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e000000000000000000000000000000000000606482015260840161033d565b600587901b8f901b94507fffffffff0000000000000000000000000000000000000000000000000000000080861690831614610c29577fffffffff000000000000000000000000000000000000000000000000000000008516600090815260208a90526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff83161790555b7fffffffff0000000000000000000000000000000000000000000000000000000091909116600090815260208990526040812055600381901c611fff16925060051b60e0169050858214610cbe576000828152600188016020526040902080547fffffffff0000000000000000000000000000000000000000000000000000000080841c19909116908516831c179055610d0f565b80837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c817fffffffff0000000000000000000000000000000000000000000000000000000060001b901c198e16179c505b84610d2a57600086815260018801602052604081208190559c505b5050508080610d3890611360565b9150506109c7565b5080610d4d836008611663565b610d5791906116a0565b99505050610de8565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560448201527f74416374696f6e00000000000000000000000000000000000000000000000000606482015260840161033d565b50959694955050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610ea257805115610e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000606482015260840161033d565b5050565b6000815111610f33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f742061646472657373283029000000606482015260840161033d565b73ffffffffffffffffffffffffffffffffffffffff82163014610f7257610f728260405180606001604052806028815260200161176c602891396110ad565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610f9a91906116e4565b600060405180830381855af49150503d8060008114610fd5576040519150601f19603f3d011682016040523d82523d6000602084013e610fda565b606091505b5091509150816110a75780511561101f57806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033d91906116f6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f7665727465640000000000000000000000000000000000000000000000000000606482015260840161033d565b50505050565b80823b6110e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033d91906116f6565b505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461111057600080fd5b919050565b60008083601f84011261112757600080fd5b50813567ffffffffffffffff81111561113f57600080fd5b60208301915083602082850101111561115757600080fd5b9250929050565b60008060008060006060868803121561117657600080fd5b853567ffffffffffffffff8082111561118e57600080fd5b818801915088601f8301126111a257600080fd5b8135818111156111b157600080fd5b8960208260051b85010111156111c657600080fd5b602083019750809650506111dc602089016110ec565b945060408801359150808211156111f257600080fd5b506111ff88828901611115565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261127357600080fd5b9190910192915050565b60006020828403121561128f57600080fd5b611298826110ec565b9392505050565b80356003811061111057600080fd5b6000602082840312156112c057600080fd5b6112988261129f565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112fe57600080fd5b83018035915067ffffffffffffffff82111561131957600080fd5b6020019150600581901b360382131561115757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561139257611392611331565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b818352600060208085019450826000805b868110156114245782357fffffffff000000000000000000000000000000000000000000000000000000008116808214611411578384fd5b89525096830196918301916001016113d9565b50959695505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060808252818101869052600090600560808085019089831b8601018a855b8b8110156115ee577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8088840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18e36030181126114f957600080fd5b8d0173ffffffffffffffffffffffffffffffffffffffff611519826110ec565b168452602061152981830161129f565b60038110611560577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b85820152604082810135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261159b57600080fd5b8301803567ffffffffffffffff8111156115b457600080fd5b808a1b36038513156115c557600080fd5b8a838901526115d98b8901828685016113c8565b98840198975050509301925050600101611498565b505073ffffffffffffffffffffffffffffffffffffffff89166020870152858103604087015261161f81888a611430565b9b9a5050505050505050505050565b60008161163d5761163d611331565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561169b5761169b611331565b500290565b600082198211156116b3576116b3611331565b500190565b60005b838110156116d35781810151838201526020016116bb565b838111156110a75750506000910152565b600082516112738184602087016116b8565b60208152600082518060208401526117158160408501602087016116b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a264697066735822122030a742340d70df6fbbc11e20752a8ea4a59411014d6101c1120a280d4d78c55b64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80631f931c1c14610030575b600080fd5b61004361003e36600461115e565b610045565b005b61004d610298565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131f547fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9061ffff8116908190600090600716156100bc5750600381901c60009081526001840160205260409020545b60005b888110156101b35761019c83838c8c858181106100de576100de611210565b90506020028101906100f0919061123f565b6100fe90602081019061127d565b8d8d8681811061011057610110611210565b9050602002810190610122919061123f565b6101339060408101906020016112ae565b8e8e8781811061014557610145611210565b9050602002810190610157919061123f565b6101659060408101906112c9565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061034892505050565b9093509150806101ab81611360565b9150506100bf565b508282146101ec576003840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff84161790555b600782161561020e57600382901c600090815260018501602052604090208190555b7f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb6738989898989604051610245959493929190611479565b60405180910390a161028d8787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610df492505050565b505050505050505050565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6003015462010000900473ffffffffffffffffffffffffffffffffffffffff163314610346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520636f6e7472616374206f776e65720000000000000000000060448201526064015b60405180910390fd5b565b600080807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90506000845111610400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660448201527f6163657420746f20637574000000000000000000000000000000000000000000606482015260840161033d565b600085600281111561041457610414611399565b14156105ec5761043c86604051806060016040528060248152602001611748602491396110ad565b60005b84518110156105e657600085828151811061045c5761045c611210565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000008116600090815291859052604090912054909150606081901c1561052f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60448201527f6e207468617420616c7265616479206578697374730000000000000000000000606482015260840161033d565b7fffffffff0000000000000000000000000000000000000000000000000000000080831660008181526020879052604090207fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608d901b168e17905560e060058e901b811692831c199c909c1690821c179a8114156105c35760038c901c600090815260018601602052604081209b909b555b8b6105cd81611360565b9c505050505080806105de90611360565b91505061043f565b50610de8565b600185600281111561060057610600611399565b14156108fd5761062886604051806060016040528060288152602001611794602891396110ad565b60005b84518110156105e657600085828151811061064857610648611210565b6020908102919091018101517fffffffff000000000000000000000000000000000000000000000000000000008116600090815291859052604090912054909150606081901c3081141561071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4c69624469616d6f6e644375743a2043616e2774207265706c61636520696d6d60448201527f757461626c652066756e6374696f6e0000000000000000000000000000000000606482015260840161033d565b8973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000606482015260840161033d565b73ffffffffffffffffffffffffffffffffffffffff811661087d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60448201527f6374696f6e207468617420646f65736e27742065786973740000000000000000606482015260840161033d565b507fffffffff0000000000000000000000000000000000000000000000000000000090911660009081526020849052604090206bffffffffffffffffffffffff919091167fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608a901b16179055806108f581611360565b91505061062b565b600285600281111561091157610911611399565b1415610d605773ffffffffffffffffffffffffffffffffffffffff8616156109bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260448201527f657373206d757374206265206164647265737328302900000000000000000000606482015260840161033d565b600388901c6007891660005b8651811015610d4057896109ff57826109df8161162e565b60008181526001870160205260409020549b50935060079250610a0d9050565b81610a098161162e565b9250505b6000806000808a8581518110610a2557610a25611210565b6020908102919091018101517fffffffff0000000000000000000000000000000000000000000000000000000081166000908152918a9052604090912054909150606081901c610af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360448201527f74696f6e207468617420646f65736e2774206578697374000000000000000000606482015260840161033d565b606081901c301415610b8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560448201527f7461626c652066756e6374696f6e000000000000000000000000000000000000606482015260840161033d565b600587901b8f901b94507fffffffff0000000000000000000000000000000000000000000000000000000080861690831614610c29577fffffffff000000000000000000000000000000000000000000000000000000008516600090815260208a90526040902080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff83161790555b7fffffffff0000000000000000000000000000000000000000000000000000000091909116600090815260208990526040812055600381901c611fff16925060051b60e0169050858214610cbe576000828152600188016020526040902080547fffffffff0000000000000000000000000000000000000000000000000000000080841c19909116908516831c179055610d0f565b80837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c817fffffffff0000000000000000000000000000000000000000000000000000000060001b901c198e16179c505b84610d2a57600086815260018801602052604081208190559c505b5050508080610d3890611360565b9150506109c7565b5080610d4d836008611663565b610d5791906116a0565b99505050610de8565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560448201527f74416374696f6e00000000000000000000000000000000000000000000000000606482015260840161033d565b50959694955050505050565b73ffffffffffffffffffffffffffffffffffffffff8216610ea257805115610e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4c69624469616d6f6e644375743a205f696e697420697320616464726573732860448201527f3029206275745f63616c6c64617461206973206e6f7420656d70747900000000606482015260840161033d565b5050565b6000815111610f33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4c69624469616d6f6e644375743a205f63616c6c6461746120697320656d707460448201527f7920627574205f696e6974206973206e6f742061646472657373283029000000606482015260840161033d565b73ffffffffffffffffffffffffffffffffffffffff82163014610f7257610f728260405180606001604052806028815260200161176c602891396110ad565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610f9a91906116e4565b600060405180830381855af49150503d8060008114610fd5576040519150601f19603f3d011682016040523d82523d6000602084013e610fda565b606091505b5091509150816110a75780511561101f57806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033d91906116f6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4c69624469616d6f6e644375743a205f696e69742066756e6374696f6e20726560448201527f7665727465640000000000000000000000000000000000000000000000000000606482015260840161033d565b50505050565b80823b6110e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033d91906116f6565b505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461111057600080fd5b919050565b60008083601f84011261112757600080fd5b50813567ffffffffffffffff81111561113f57600080fd5b60208301915083602082850101111561115757600080fd5b9250929050565b60008060008060006060868803121561117657600080fd5b853567ffffffffffffffff8082111561118e57600080fd5b818801915088601f8301126111a257600080fd5b8135818111156111b157600080fd5b8960208260051b85010111156111c657600080fd5b602083019750809650506111dc602089016110ec565b945060408801359150808211156111f257600080fd5b506111ff88828901611115565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261127357600080fd5b9190910192915050565b60006020828403121561128f57600080fd5b611298826110ec565b9392505050565b80356003811061111057600080fd5b6000602082840312156112c057600080fd5b6112988261129f565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112fe57600080fd5b83018035915067ffffffffffffffff82111561131957600080fd5b6020019150600581901b360382131561115757600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561139257611392611331565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b818352600060208085019450826000805b868110156114245782357fffffffff000000000000000000000000000000000000000000000000000000008116808214611411578384fd5b89525096830196918301916001016113d9565b50959695505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6060808252818101869052600090600560808085019089831b8601018a855b8b8110156115ee577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8088840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18e36030181126114f957600080fd5b8d0173ffffffffffffffffffffffffffffffffffffffff611519826110ec565b168452602061152981830161129f565b60038110611560577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b85820152604082810135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261159b57600080fd5b8301803567ffffffffffffffff8111156115b457600080fd5b808a1b36038513156115c557600080fd5b8a838901526115d98b8901828685016113c8565b98840198975050509301925050600101611498565b505073ffffffffffffffffffffffffffffffffffffffff89166020870152858103604087015261161f81888a611430565b9b9a5050505050505050505050565b60008161163d5761163d611331565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561169b5761169b611331565b500290565b600082198211156116b3576116b3611331565b500190565b60005b838110156116d35781810151838201526020016116bb565b838111156110a75750506000910152565b600082516112738184602087016116b8565b60208152600082518060208401526117158160408501602087016116b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a264697066735822122030a742340d70df6fbbc11e20752a8ea4a59411014d6101c1120a280d4d78c55b64736f6c634300080c0033
Deployed Bytecode Sourcemap
14382:2343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14878:1844;;;;;;:::i;:::-;;:::i;:::-;;;15035:35;:33;:35::i;:::-;15190:16;;1793:45;;15190:16;;;;;;15081:36;;15464:1;15448:17;:21;15444:233;;-1:-1:-1;15663:1:0;15646:18;;;15629:36;;;;:16;;;:36;;;;;;15444:233;15729:18;15724:414;15749:31;;;15724:414;;;15843:283;15903:13;15935:12;15966:11;;15978:10;15966:23;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:36;;;;;;;:::i;:::-;16021:11;;16033:10;16021:23;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:30;;;;;;;;;:::i;:::-;16070:11;;16082:10;16070:23;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:41;;;;;;;:::i;:::-;15843:283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15843:41:0;;-1:-1:-1;;;15843:283:0:i;:::-;15811:315;;-1:-1:-1;15811:315:0;-1:-1:-1;15782:12:0;;;;:::i;:::-;;;;15724:414;;;;16169:21;16152:13;:38;16148:111;;16207:16;;;:40;;;;;;;;;;16148:111;16423:1;16407:17;;:21;16403:195;;16569:1;16552:18;;;16535:36;;;;:16;;;:36;;;;;:51;;;16403:195;16613:41;16624:11;;16637:5;16644:9;;16613:41;;;;;;;;;;:::i;:::-;;;;;;;;16665:49;16697:5;16704:9;;16665:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16665:31:0;;-1:-1:-1;;;16665:49:0:i;:::-;15024:1698;;;;14878:1844;;;;;:::o;3357:146::-;1793:45;3438:30;;;;;;;;3424:10;:44;3416:79;;;;;;;7716:2:1;3416:79:0;;;7698:21:1;7755:2;7735:18;;;7728:30;7794:24;7774:18;;;7767:52;7836:18;;3416:79:0;;;;;;;;;3357:146::o;5881:6811::-;6128:7;;;1793:45;6157:44;;6240:1;6220:10;:17;:21;6212:77;;;;;;;8067:2:1;6212:77:0;;;8049:21:1;8106:2;8086:18;;;8079:30;8145:34;8125:18;;;8118:62;8216:13;8196:18;;;8189:41;8247:19;;6212:77:0;7865:407:1;6212:77:0;6315:30;6304:7;:41;;;;;;;;:::i;:::-;;6300:6336;;;6362:80;6385:16;6362:80;;;;;;;;;;;;;;;;;:22;:80::i;:::-;6462:21;6457:1251;6501:10;:17;6485:13;:33;6457:1251;;;6556:15;6574:10;6585:13;6574:25;;;;;;;;:::i;:::-;;;;;;;;;;;;6637:19;;;6618:16;6637:19;;;;;;;;;;;;6574:25;;-1:-1:-1;6683:26:0;;;;:40;6675:106;;;;;;;8479:2:1;6675:106:0;;;8461:21:1;8518:2;8498:18;;;8491:30;8557:34;8537:18;;;8530:62;8628:23;8608:18;;;8601:51;8669:19;;6675:106:0;8277:417:1;6675:106:0;6843:19;;;;6893:23;6843:19;;;;;;;;;;6865:51;:25;;;;:51;;;6843:73;;7066:25;7090:1;7066:25;;;;;7214:45;;;7212:48;7196:64;;;;7265:43;;;7195:114;;7393:29;;7389:269;;;7580:1;7562:19;;;7545:37;;;;:16;;;:37;;;;;:53;;;;7389:269;7676:16;;;;:::i;:::-;;;;6537:1171;;;6520:15;;;;;:::i;:::-;;;;6457:1251;;;;6300:6336;;;7740:34;7729:7;:45;;;;;;;;:::i;:::-;;7725:4911;;;7791:84;7814:16;7791:84;;;;;;;;;;;;;;;;;:22;:84::i;:::-;7895:21;7890:844;7934:10;:17;7918:13;:33;7890:844;;;7989:15;8007:10;8018:13;8007:25;;;;;;;;:::i;:::-;;;;;;;;;;;;8070:19;;;8051:16;8070:19;;;;;;;;;;;;8007:25;;-1:-1:-1;8134:26:0;;;;8275:4;8248:32;;;8240:92;;;;;;;8901:2:1;8240:92:0;;;8883:21:1;8940:2;8920:18;;;8913:30;8979:34;8959:18;;;8952:62;9050:17;9030:18;;;9023:45;9085:19;;8240:92:0;8699:411:1;8240:92:0;8378:16;8359:35;;:15;:35;;;;8351:104;;;;;;;9317:2:1;8351:104:0;;;9299:21:1;9356:2;9336:18;;;9329:30;9395:34;9375:18;;;9368:62;9466:26;9446:18;;;9439:54;9510:19;;8351:104:0;9115:420:1;8351:104:0;8482:29;;;8474:98;;;;;;;9742:2:1;8474:98:0;;;9724:21:1;9781:2;9761:18;;;9754:30;9820:34;9800:18;;;9793:62;9891:26;9871:18;;;9864:54;9935:19;;8474:98:0;9540:420:1;8474:98:0;-1:-1:-1;8637:19:0;;;;3642:44;8637:19;;;;;;;;;;8659:59;8660:29;;;;8659:59;8693:25;;;;8659:59;;8637:81;;7953:15;;;;:::i;:::-;;;;7890:844;;7725:4911;8766:33;8755:7;:44;;;;;;;;:::i;:::-;;8751:3885;;;8824:30;;;;8816:97;;;;;;;10167:2:1;8816:97:0;;;10149:21:1;10206:2;10186:18;;;10179:30;10245:34;10225:18;;;10218:62;10316:24;10296:18;;;10289:52;10358:19;;8816:97:0;9965:418:1;8816:97:0;9066:1;9048:19;;;9223:1;9206:18;;9020:25;9239:3229;9283:10;:17;9267:13;:33;9239:3229;;;9342:18;9338:322;;9431:19;;;;:::i;:::-;9489:35;;;;:16;;;:35;;;;;;;-1:-1:-1;9431:19:0;-1:-1:-1;9569:1:0;;-1:-1:-1;9338:322:0;;-1:-1:-1;9338:322:0;;9619:21;;;;:::i;:::-;;;;9338:322;9678:19;9716:29;9764:33;9909:15;9927:10;9938:13;9927:25;;;;;;;;:::i;:::-;;;;;;;;;;;;9994:19;;;9975:16;9994:19;;;;;;;;;;;;9927:25;;-1:-1:-1;10044:26:0;;;;10036:108;;;;;;;10791:2:1;10036:108:0;;;10773:21:1;10830:2;10810:18;;;10803:30;10869:34;10849:18;;;10842:62;10940:25;10920:18;;;10913:53;10983:19;;10036:108:0;10589:419:1;10036:108:0;10240:26;;;;10278:4;10240:43;;10232:102;;;;;;;11215:2:1;10232:102:0;;;11197:21:1;11254:2;11234:18;;;11227:30;11293:34;11273:18;;;11266:62;11364:16;11344:18;;;11337:44;11398:19;;10232:102:0;11013:410:1;10232:102:0;10540:1;10517:24;;;10499:43;;;;-1:-1:-1;10570:24:0;;;;;;;;10566:241;;10759:23;;;:9;:23;;;;;;;;;;;;10717:66;;;10718:29;;10717:66;10691:92;;10566:241;10836:19;;;;;:9;:19;;;;;;;;;;10829:26;11101:1;11081:21;;;;;;-1:-1:-1;11285:1:0;11259:27;;;;-1:-1:-1;11328:42:0;;;11324:956;;11395:23;11421:39;;;:16;;;:39;;;;;;;11727:21;11648:48;;;11646:51;11628:69;;;11727:21;;;:50;;11627:151;11863:57;;11324:956;;;12234:25;12217:12;12209:21;;;:50;;12153:25;3748:17;3732:35;;12130:48;;12128:51;12112:13;:67;12111:149;12070:190;;11324:956;12302:24;12298:155;;12358:35;;;;:16;;;:35;;;;;12351:42;;;12358:35;-1:-1:-1;12298:155:0;9319:3149;;;9302:15;;;;;:::i;:::-;;;;9239:3229;;;-1:-1:-1;12523:19:0;12499:21;:17;12519:1;12499:21;:::i;:::-;:43;;;;:::i;:::-;12482:60;;8801:3753;;8751:3885;;;12575:49;;;;;11996:2:1;12575:49:0;;;11978:21:1;12035:2;12015:18;;;12008:30;12074:34;12054:18;;;12047:62;12145:9;12125:18;;;12118:37;12172:19;;12575:49:0;11794:403:1;8751:3885:0;-1:-1:-1;12654:14:0;;12670:13;;-1:-1:-1;;;;;5881:6811:0:o;12700:889::-;12793:19;;;12789:793;;12837:16;;:21;12829:94;;;;;;;12404:2:1;12829:94:0;;;12386:21:1;12443:2;12423:18;;;12416:30;12482:34;12462:18;;;12455:62;12553:30;12533:18;;;12526:58;12601:19;;12829:94:0;12202:424:1;12829:94:0;12700:889;;:::o;12789:793::-;12983:1;12964:9;:16;:20;12956:94;;;;;;;12833:2:1;12956:94:0;;;12815:21:1;12872:2;12852:18;;;12845:30;12911:34;12891:18;;;12884:62;12982:31;12962:18;;;12955:59;13031:19;;12956:94:0;12631:425:1;12956:94:0;13069:22;;;13086:4;13069:22;13065:136;;13112:73;13135:5;13112:73;;;;;;;;;;;;;;;;;:22;:73::i;:::-;13216:12;13230:18;13252:5;:18;;13271:9;13252:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13215:66;;;;13301:7;13296:275;;13333:12;;:16;13329:227;;13432:5;13418:21;;;;;;;;;;;:::i;13329:227::-;13488:48;;;;;14252:2:1;13488:48:0;;;14234:21:1;14291:2;14271:18;;;14264:30;14330:34;14310:18;;;14303:62;14401:8;14381:18;;;14374:36;14427:19;;13488:48:0;14050:402:1;13329:227:0;12941:641;;12700:889;;:::o;13829:158::-;13965:13;13747:22;;13934:45;;;;;;;;;;;;;:::i;:::-;;13829:158;;:::o;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:347::-;266:8;276:6;330:3;323:4;315:6;311:17;307:27;297:55;;348:1;345;338:12;297:55;-1:-1:-1;371:20:1;;414:18;403:30;;400:50;;;446:1;443;436:12;400:50;483:4;475:6;471:17;459:29;;535:3;528:4;519:6;511;507:19;503:30;500:39;497:59;;;552:1;549;542:12;497:59;215:347;;;;;:::o;567:1008::-;708:6;716;724;732;740;793:2;781:9;772:7;768:23;764:32;761:52;;;809:1;806;799:12;761:52;849:9;836:23;878:18;919:2;911:6;908:14;905:34;;;935:1;932;925:12;905:34;973:6;962:9;958:22;948:32;;1018:7;1011:4;1007:2;1003:13;999:27;989:55;;1040:1;1037;1030:12;989:55;1080:2;1067:16;1106:2;1098:6;1095:14;1092:34;;;1122:1;1119;1112:12;1092:34;1177:7;1170:4;1160:6;1157:1;1153:14;1149:2;1145:23;1141:34;1138:47;1135:67;;;1198:1;1195;1188:12;1135:67;1229:4;1225:2;1221:13;1211:23;;1253:6;1243:16;;;1278:40;1312:4;1301:9;1297:20;1278:40;:::i;:::-;1268:50;;1371:2;1360:9;1356:18;1343:32;1327:48;;1400:2;1390:8;1387:16;1384:36;;;1416:1;1413;1406:12;1384:36;;1455:60;1507:7;1496:8;1485:9;1481:24;1455:60;:::i;:::-;567:1008;;;;-1:-1:-1;567:1008:1;;-1:-1:-1;1534:8:1;;1429:86;567:1008;-1:-1:-1;;;567:1008:1:o;1580:184::-;1632:77;1629:1;1622:88;1729:4;1726:1;1719:15;1753:4;1750:1;1743:15;1769:382;1861:4;1919:11;1906:25;2009:66;1998:8;1982:14;1978:29;1974:102;1954:18;1950:127;1940:155;;2091:1;2088;2081:12;1940:155;2112:33;;;;;1769:382;-1:-1:-1;;1769:382:1:o;2156:186::-;2215:6;2268:2;2256:9;2247:7;2243:23;2239:32;2236:52;;;2284:1;2281;2274:12;2236:52;2307:29;2326:9;2307:29;:::i;:::-;2297:39;2156:186;-1:-1:-1;;;2156:186:1:o;2347:155::-;2427:20;;2476:1;2466:12;;2456:40;;2492:1;2489;2482:12;2507:214;2582:6;2635:2;2623:9;2614:7;2610:23;2606:32;2603:52;;;2651:1;2648;2641:12;2603:52;2674:41;2705:9;2674:41;:::i;2726:603::-;2818:4;2824:6;2884:11;2871:25;2974:66;2963:8;2947:14;2943:29;2939:102;2919:18;2915:127;2905:155;;3056:1;3053;3046:12;2905:155;3083:33;;3135:20;;;-1:-1:-1;3178:18:1;3167:30;;3164:50;;;3210:1;3207;3200:12;3164:50;3243:4;3231:17;;-1:-1:-1;3294:1:1;3290:14;;;3274;3270:35;3260:46;;3257:66;;;3319:1;3316;3309:12;3334:184;3386:77;3383:1;3376:88;3483:4;3480:1;3473:15;3507:4;3504:1;3497:15;3523:195;3562:3;3593:66;3586:5;3583:77;3580:103;;;3663:18;;:::i;:::-;-1:-1:-1;3710:1:1;3699:13;;3523:195::o;3855:184::-;3907:77;3904:1;3897:88;4004:4;4001:1;3994:15;4028:4;4025:1;4018:15;4044:630;4143:6;4138:3;4131:19;4113:3;4169:4;4198:2;4193:3;4189:12;4182:19;;4224:5;4247:1;4268;4278:371;4294:6;4289:3;4286:15;4278:371;;;4375:6;4362:20;4418:66;4409:7;4405:80;4520:2;4511:7;4508:15;4498:43;;4537:1;4534;4527:12;4498:43;4554:15;;-1:-1:-1;4589:12:1;;;;4624:15;;;;4320:1;4311:11;4278:371;;;-1:-1:-1;4665:3:1;;4044:630;-1:-1:-1;;;;;;4044:630:1:o;4679:325::-;4767:6;4762:3;4755:19;4819:6;4812:5;4805:4;4800:3;4796:14;4783:43;;4871:1;4864:4;4855:6;4850:3;4846:16;4842:27;4835:38;4737:3;4993:4;4923:66;4918:2;4910:6;4906:15;4902:88;4897:3;4893:98;4889:109;4882:116;;4679:325;;;;:::o;5009:2500::-;5324:2;5376:21;;;5349:18;;;5432:22;;;5295:4;;5508:1;5485:3;5470:19;;;;5551:15;;;5536:31;;5532:41;5596:6;5295:4;5630:1689;5644:6;5641:1;5638:13;5630:1689;;;5733:66;5721:9;5713:6;5709:22;5705:95;5700:3;5693:108;5853:6;5840:20;5940:66;5931:6;5915:14;5911:27;5907:100;5887:18;5883:125;5873:153;;6022:1;6019;6012:12;5873:153;6052:31;;6142:42;6115:25;6052:31;6115:25;:::i;:::-;6111:74;6103:6;6096:90;6209:4;6246:46;6288:2;6281:5;6277:14;6246:46;:::i;:::-;6332:1;6318:12;6315:19;6305:227;;6376:77;6373:1;6366:88;6481:4;6478:1;6471:15;6513:4;6510:1;6503:15;6305:227;6552:15;;;6545:37;6605:4;6663:14;;;6650:28;6735:14;6731:26;;;6759:66;6727:99;6701:126;;6691:154;;6841:1;6838;6831:12;6691:154;6873:32;;6932:21;;6980:18;6969:30;;6966:50;;;7012:1;7009;7002:12;6966:50;7071:6;7067:2;7063:15;7047:14;7043:36;7036:5;7032:48;7029:68;;;7093:1;7090;7083:12;7029:68;7134:2;7129;7121:6;7117:15;7110:27;7160:79;7235:2;7227:6;7223:15;7215:6;7210:2;7201:7;7197:16;7160:79;:::i;:::-;7297:12;;;;7150:89;-1:-1:-1;;;7262:15:1;;;-1:-1:-1;;5666:1:1;5659:9;5630:1689;;;-1:-1:-1;;3800:42:1;3789:54;;7370:4;7355:20;;3777:67;7426:9;7418:6;7414:22;7407:4;7396:9;7392:20;7385:52;7454:49;7496:6;7488;7480;7454:49;:::i;:::-;7446:57;5009:2500;-1:-1:-1;;;;;;;;;;;5009:2500:1:o;10388:196::-;10427:3;10455:5;10445:39;;10464:18;;:::i;:::-;-1:-1:-1;10511:66:1;10500:78;;10388:196::o;11428:228::-;11468:7;11594:1;11526:66;11522:74;11519:1;11516:81;11511:1;11504:9;11497:17;11493:105;11490:131;;;11601:18;;:::i;:::-;-1:-1:-1;11641:9:1;;11428:228::o;11661:128::-;11701:3;11732:1;11728:6;11725:1;11722:13;11719:39;;;11738:18;;:::i;:::-;-1:-1:-1;11774:9:1;;11661:128::o;13061:258::-;13133:1;13143:113;13157:6;13154:1;13151:13;13143:113;;;13233:11;;;13227:18;13214:11;;;13207:39;13179:2;13172:10;13143:113;;;13274:6;13271:1;13268:13;13265:48;;;-1:-1:-1;;13309:1:1;13291:16;;13284:27;13061:258::o;13324:274::-;13453:3;13491:6;13485:13;13507:53;13553:6;13548:3;13541:4;13533:6;13529:17;13507:53;:::i;13603:442::-;13752:2;13741:9;13734:21;13715:4;13784:6;13778:13;13827:6;13822:2;13811:9;13807:18;13800:34;13843:66;13902:6;13897:2;13886:9;13882:18;13877:2;13869:6;13865:15;13843:66;:::i;:::-;13961:2;13949:15;13966:66;13945:88;13930:104;;;;14036:2;13926:113;;13603:442;-1:-1:-1;;13603:442:1:o
Swarm Source
ipfs://30a742340d70df6fbbc11e20752a8ea4a59411014d6101c1120a280d4d78c55b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.