Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
Latest 25 from a total of 2,401 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Subdomain | 21638796 | 10 days ago | IN | 0 ETH | 0.00075223 | ||||
Claim Subdomain | 18877187 | 397 days ago | IN | 0 ETH | 0.00661522 | ||||
Claim Subdomain | 18874439 | 397 days ago | IN | 0 ETH | 0.00284226 | ||||
Claim Subdomain | 18601870 | 435 days ago | IN | 0 ETH | 0.00483619 | ||||
Claim Subdomain | 18022841 | 516 days ago | IN | 0 ETH | 0.00846318 | ||||
Claim Subdomain | 17744521 | 555 days ago | IN | 0 ETH | 0.00494176 | ||||
Add Ens Contract... | 17539940 | 584 days ago | IN | 0 ETH | 0.00296531 | ||||
Claim Subdomain | 17532428 | 585 days ago | IN | 0 ETH | 0.00367387 | ||||
Claim Subdomain | 17502634 | 589 days ago | IN | 0 ETH | 0.00299487 | ||||
Claim Subdomain | 17499833 | 590 days ago | IN | 0 ETH | 0.0033668 | ||||
Update Settings ... | 17499830 | 590 days ago | IN | 0 ETH | 0.00070609 | ||||
Add Ens Contract... | 17499265 | 590 days ago | IN | 0 ETH | 0.00266105 | ||||
Claim Subdomain | 17488938 | 591 days ago | IN | 0 ETH | 0.00319818 | ||||
Claim Subdomain | 17475398 | 593 days ago | IN | 0 ETH | 0.00358509 | ||||
Claim Subdomain | 17444350 | 597 days ago | IN | 0 ETH | 0.00404248 | ||||
Claim Subdomain | 17419655 | 601 days ago | IN | 0 ETH | 0.00450592 | ||||
Claim Subdomain | 17403651 | 603 days ago | IN | 0 ETH | 0.00401576 | ||||
Claim Subdomain | 17371749 | 608 days ago | IN | 0 ETH | 0.00835396 | ||||
Claim Subdomain | 17371735 | 608 days ago | IN | 0 ETH | 0.00864262 | ||||
Claim Subdomain | 17273886 | 621 days ago | IN | 0 ETH | 0.01619294 | ||||
Remove Subdomain | 17273883 | 621 days ago | IN | 0 ETH | 0.00372228 | ||||
Claim Subdomain | 17169665 | 636 days ago | IN | 0 ETH | 0.01736328 | ||||
Claim Subdomain | 17030973 | 656 days ago | IN | 0 ETH | 0.00411654 | ||||
Add Ens Contract... | 17018641 | 658 days ago | IN | 0 ETH | 0.00682185 | ||||
Claim Subdomain | 16991359 | 661 days ago | IN | 0 ETH | 0.00099933 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GenericEnsMapper
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.16; import "forge-std/console.sol"; import "./structs/Config.sol"; import "./structs/NftDetails.sol"; import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; import "openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol"; import "openzeppelin-contracts/contracts/utils/Strings.sol"; import "ens-contracts/registry/ENS.sol"; import "ens-contracts/resolvers/profiles/IAddressResolver.sol"; import "ens-contracts/resolvers/profiles/IAddrResolver.sol"; import "ens-contracts/resolvers/profiles/ITextResolver.sol"; import "ens-contracts/resolvers/profiles/INameResolver.sol"; import "ens-contracts/wrapper/INameWrapper.sol"; import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol"; import "EnsPrimaryContractNamer/PrimaryEns.sol"; import "forge-std/console.sol"; contract GenericEnsMapper is IAddressResolver, IAddrResolver, ITextResolver, INameResolver, IERC1155Receiver, PrimaryEns { using Strings for *; uint256 private constant COIN_TYPE_ETH = 60; address private immutable deployer; event addNftContractToEns( uint256 indexed _ensId, IERC721 indexed _nftContract ); event updateEnsClaimConfig( uint256 indexed _ensId, bool _numericOnly, bool _canOverwriteSubdomains ); INameWrapper public EnsNameWrapper; ENS public EnsContract = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e); IERC721 public EnsToken = IERC721(0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85); mapping(bytes32 => Config) public EnsToConfig; mapping(bytes32 => NftDetails) public SubnodeToNftDetails; mapping(uint256 => Config) public ParentNodeToConfig; mapping(uint256 => IERC721[]) public ParentNodeToNftContracts; mapping(bytes32 => mapping(address => mapping(uint256 => bytes))) OtherAddresses; mapping(bytes32 => mapping(bytes32 => string)) TextMappings; mapping(bytes32 => bytes32) public SubdomainClaimMap; event SubdomainClaimed( bytes32 indexed _nodeHash, IERC721 indexed _nftContract, uint96 indexed _tokenId, string _name ); event SubdomainRemoved( bytes32 indexed _nodeHash, IERC721 indexed _nftContract, uint96 indexed _tokenId, string _name ); constructor() { deployer = msg.sender; } function addEnsContractMapping( string[] calldata _domainArray, uint256 _ensId, IERC721[] calldata _nftContracts, bool _numericOnly, bool _overWriteUnusedSubdomains ) external payable isEnsApprovedOrOwner(_ensId) { bytes32 domainHash = namehashFromId(_ensId); address owner = EnsContract.owner(domainHash); require( owner == address(this) || (owner == address(EnsNameWrapper) && owner != address(0)), "controller of Ens not set to contract" ); require( getDomainHash(_domainArray) == domainHash, "incorrect namehash" ); require(_nftContracts.length < 6, "maximum 5 contracts per ENS"); require(_nftContracts.length > 0, "need at least 1 NFT contract"); require( !(_nftContracts.length > 1 && _numericOnly), "Numeric only not compatible with multiple contracts" ); require( !ParentNodeToConfig[_ensId].Initialised, "already been configured" ); checkNftContracts(_nftContracts); ParentNodeToConfig[_ensId] = Config( true, _numericOnly, _overWriteUnusedSubdomains, _domainArray ); ParentNodeToNftContracts[_ensId] = _nftContracts; //output events emit updateEnsClaimConfig( _ensId, _numericOnly, _overWriteUnusedSubdomains ); for (uint256 i; i < _nftContracts.length; ) { emit addNftContractToEns(_ensId, _nftContracts[i]); unchecked { ++i; } } } function addContractToExistingEns(uint256 _ensId, IERC721 _nftContract) external payable isEnsApprovedOrOwner(_ensId) { uint256 numberOfContracts = ParentNodeToNftContracts[_ensId].length; require(numberOfContracts < 5, "maximum 5 contracts per ENS"); require(numberOfContracts > 0, "ens not configured"); require( !isValidNftContract(_ensId, _nftContract), "duplicate NFT contract" ); require( !ParentNodeToConfig[_ensId].NumericOnly, "Numeric only not compatible with multiple contracts" ); ParentNodeToNftContracts[_ensId].push(_nftContract); emit addNftContractToEns(_ensId, _nftContract); } function updateSettingsToExistingEns( uint256 _ensId, bool _numericOnly, bool _overwriteUnusedSubdomains ) external payable isEnsApprovedOrOwner(_ensId) { require( !(ParentNodeToNftContracts[_ensId].length > 1 && _numericOnly), "Numeric only not compatible with multiple contracts" ); Config memory config = ParentNodeToConfig[_ensId]; require(config.Initialised, "ENS not configured"); config.NumericOnly = _numericOnly; config.CanOverwriteSubdomains = _overwriteUnusedSubdomains; ParentNodeToConfig[_ensId] = config; emit updateEnsClaimConfig( _ensId, _numericOnly, _overwriteUnusedSubdomains ); } /** * @notice Claim subdomain * @param _ensId parent token id of the subdomain * @param _nftId ID of ERC-721 NFT * @param _nftContract address of the ERC-721 NFT contract * @param _label label for the subdomain */ function claimSubdomain( uint256 _ensId, uint96 _nftId, IERC721 _nftContract, string memory _label ) external payable isNftOwner(_nftContract, _nftId) { bytes32 claimHash = keccak256( abi.encodePacked(_ensId, address(_nftContract), _nftId) ); require( SubdomainClaimMap[claimHash] == 0x0, "subdomain claimed for this token" ); require(isValidNftContract(_ensId, _nftContract), "Not valid contract"); Config memory config = ParentNodeToConfig[_ensId]; require(config.Initialised, "configuration for ENS not enabled"); bytes32 domainHash = namehashFromId(_ensId); string memory label = config.NumericOnly ? _nftId.toString() : _label; bytes32 subnodeHash = keccak256( abi.encodePacked(domainHash, keccak256(abi.encodePacked(label))) ); require( SubnodeToNftDetails[subnodeHash].ParentTokenId == 0, "Subdomain has already been claimed" ); require( !EnsContract.recordExists(subnodeHash) || config.CanOverwriteSubdomains, "not allowed previously used subdomain" ); NftDetails memory details = NftDetails( _ensId, label, _nftContract, _nftId ); SubnodeToNftDetails[subnodeHash] = details; if (EnsToken.ownerOf(_ensId) == address(EnsNameWrapper)) { EnsNameWrapper.setSubnodeRecord( domainHash, label, address(this), address(this), 0, //ttl 0, //fuses type(uint64).max ); } else { EnsContract.setSubnodeRecord( domainHash, keccak256(abi.encodePacked(label)), address(this), address(this), 0 ); } SubdomainClaimMap[claimHash] = subnodeHash; emit AddrChanged(subnodeHash, _nftContract.ownerOf(_nftId)); emit AddressChanged( subnodeHash, 60, abi.encodePacked(_nftContract.ownerOf(_nftId)) ); emit SubdomainClaimed( subnodeHash, _nftContract, _nftId, name(subnodeHash) ); } /** * Returns the text data associated with an ENS node and key. * @param node The ENS node to query. * @param key The text data key to query. * @return The associated text data. */ function text(bytes32 node, string calldata key) external view returns (string memory) { NftDetails memory details = SubnodeToNftDetails[node]; require(details.ParentTokenId != 0, "subdomain not configured"); if (keccak256(abi.encodePacked(key)) == keccak256("avatar")) { string memory str = string( abi.encodePacked( "eip155:1/erc721:", address(details.NftAddress).toHexString(), "/", details.NftId.toString() ) ); return str; } else { return TextMappings[node][keccak256(abi.encodePacked(key))]; } } /** * @notice removes the subdomain mapping from this resolver contract * @param _subdomainHash namehash of the subdomain */ function removeSubdomain(bytes32 _subdomainHash) external payable authorised(_subdomainHash) { NftDetails memory details = SubnodeToNftDetails[_subdomainHash]; require(details.ParentTokenId != 0, "subdomain not configured"); string memory subdomainName = name(_subdomainHash); delete SubdomainClaimMap[ keccak256( abi.encodePacked( details.ParentTokenId, address(details.NftAddress), details.NftId ) ) ]; delete SubnodeToNftDetails[_subdomainHash]; emit AddrChanged(_subdomainHash, address(0)); emit AddressChanged(_subdomainHash, 60, abi.encodePacked(address(0))); emit SubdomainRemoved( _subdomainHash, details.NftAddress, details.NftId, subdomainName ); } //this doesn't need gating as it just outputs events //it's here because etherscan and ens.app both use events //for primary naming function outputEvents(bytes32 _subnodeHash) external payable { address owner = getOwnerFromDetails(_subnodeHash); emit AddrChanged(_subnodeHash, owner); emit AddressChanged(_subnodeHash, 60, abi.encodePacked(owner)); } /** * Sets the text data associated with an ENS node and key. * May only be called by the owner of the linked NFT * @param node The node to update. * @param key The key to set. * @param value The text data value to set. */ function setText( bytes32 node, string calldata key, string calldata value ) external payable authorised(node) { TextMappings[node][keccak256(abi.encodePacked(key))] = value; emit TextChanged(node, key, value); } function addr(bytes32 node, uint256 coinType) external view returns (bytes memory) { address owner = getOwnerFromDetails(node); if (coinType == COIN_TYPE_ETH) { return abi.encodePacked(owner); } else { return OtherAddresses[node][owner][coinType]; } } /** * Returns the address associated with an ENS node. Legacy method * @param node The ENS node to query. * @return The associated address. */ function addr(bytes32 node) external view returns (address payable) { return payable(getOwnerFromDetails(node)); } function setAddr( bytes32 node, uint256 coinType, bytes memory a ) external authorised(node) { emit AddressChanged(node, coinType, a); require(coinType != COIN_TYPE_ETH, "cannot set eth address"); address nftOwner = getOwnerFromDetails(node); OtherAddresses[node][nftOwner][coinType] = a; } //ERC1155 receiver function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external pure returns (bytes4) { require(false, "cannot do batch transfer"); return this.onERC1155BatchReceived.selector; } function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external pure returns (bytes4) { return this.onERC1155Received.selector; } function supportsInterface(bytes4 interfaceId) external pure returns (bool) { return interfaceId == this.onERC1155Received.selector || interfaceId == this.onERC1155BatchReceived.selector || interfaceId == 0x3b3b57de || //addr interfaceId == 0x59d1d43c || //text interfaceId == 0x691f3431 || //name interfaceId == 0x01ffc9a7; } /** * Returns the name associated with an ENS node, for reverse records. * Defined in EIP181. * @param node The ENS node to query. * @return The associated name. */ function name(bytes32 node) public view returns (string memory) { NftDetails memory details = SubnodeToNftDetails[node]; string memory label = details.Label; string[] memory domainArray = ParentNodeToConfig[details.ParentTokenId] .DomainArray; require( address(details.NftAddress) != address(0), "subdomain not configured" ); for (uint256 i; i < domainArray.length; ) { label = string(abi.encodePacked(label, ".", domainArray[i])); unchecked { ++i; } } return label; } ///['hodl', 'pcc', 'eth'] function getDomainHash(string[] calldata _domainArray) public pure returns (bytes32 namehash) { namehash = 0x0; for (uint256 i = _domainArray.length; i > 0; ) { unchecked { --i; } namehash = keccak256( abi.encodePacked( namehash, keccak256(abi.encodePacked(_domainArray[i])) ) ); } } function checkNftContracts(IERC721[] calldata _nftContracts) private view { for (uint256 i; i < _nftContracts.length; ) { require( ERC165Checker.supportsInterface( address(_nftContracts[i]), type(IERC721).interfaceId ), "need to be IERC721 contracts" ); unchecked { ++i; } } } function isValidNftContract(uint256 _ensId, IERC721 _nftContract) private view returns (bool) { IERC721[] memory contracts = ParentNodeToNftContracts[_ensId]; uint256 total = contracts.length; for (uint256 i; i < total; ) { if (contracts[i] == _nftContract) { return true; } unchecked { ++i; } } } // ENS resolver interface methods // // ------------------------ function getOwnerFromDetails(bytes32 _subnodeHash) private view returns (address) { NftDetails memory details = SubnodeToNftDetails[_subnodeHash]; require(details.ParentTokenId != 0, "subdomain not configured"); address owner = details.NftAddress.ownerOf(details.NftId); return owner; } modifier isNftOwner(IERC721 _nftContract, uint96 _id) { require(_nftContract.ownerOf(_id) == msg.sender, "not owner of NFT"); _; } modifier isEnsApprovedOrOwner(uint256 _ensId) { try EnsToken.ownerOf(_ensId) returns (address owner) { require( owner == msg.sender || (EnsToken.isApprovedForAll(owner, msg.sender) && owner != address(EnsNameWrapper)) || (owner == address(EnsNameWrapper) && owner != address(0) && EnsNameWrapper.isTokenOwnerOrApproved( bytes32(_ensId), msg.sender )), "not owner or approved" ); } catch { require(false, "not owner or approved"); } _; } function namehashFromId(uint256 _id) public view returns (bytes32 _namehash) { _namehash = bytes32(_id); if ( !(address(EnsNameWrapper) != address(0) && EnsNameWrapper.ownerOf(_id) != address(0)) ) { _namehash = keccak256( abi.encodePacked( bytes32( 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae ), _namehash ) ); } } function setNameWrapper(address _addr) external payable { require(msg.sender == deployer, "only deployer"); EnsNameWrapper = INameWrapper(_addr); } //just in case we have any funds being accidently sent to the contract //payable functions are cheaper than none-payable. function withdraw() external payable { payable(deployer).transfer(address(this).balance); } modifier authorised(bytes32 _subnodeHash) { address owner = getOwnerFromDetails(_subnodeHash); require(owner == msg.sender, "not owner of subdomain"); _; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { let payloadStart := add(payload, 32) let r := staticcall( gas(), consoleAddress, payloadStart, payloadLength, 0, 0 ) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address)", p0, p1) ); } function log( uint256 p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2) ); } function log( uint256 p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2) ); } function log( uint256 p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2) ); } function log( uint256 p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2) ); } function log( uint256 p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2) ); } function log( uint256 p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2) ); } function log( uint256 p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2) ); } function log( uint256 p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2) ); } function log( uint256 p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2) ); } function log( uint256 p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2) ); } function log( string memory p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2) ); } function log( string memory p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2) ); } function log( string memory p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,string)", p0, p1, p2) ); } function log( string memory p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2) ); } function log( string memory p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,string,address)", p0, p1, p2) ); } function log( string memory p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2) ); } function log( string memory p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2) ); } function log( string memory p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2) ); } function log( string memory p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2) ); } function log( string memory p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2) ); } function log( string memory p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,string)", p0, p1, p2) ); } function log( string memory p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2) ); } function log( string memory p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(string,address,address)", p0, p1, p2) ); } function log( bool p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2) ); } function log( bool p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2) ); } function log( bool p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2) ); } function log( bool p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2) ); } function log( bool p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2) ); } function log( bool p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2) ); } function log( bool p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2) ); } function log( bool p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2) ); } function log( bool p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2) ); } function log( bool p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2) ); } function log( bool p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2) ); } function log( bool p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2) ); } function log( bool p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2) ); } function log( bool p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2) ); } function log( bool p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2) ); } function log( bool p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2) ); } function log( address p0, uint256 p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2) ); } function log( address p0, uint256 p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2) ); } function log( address p0, uint256 p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2) ); } function log( address p0, uint256 p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2) ); } function log( address p0, string memory p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2) ); } function log( address p0, string memory p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,string)", p0, p1, p2) ); } function log( address p0, string memory p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2) ); } function log( address p0, string memory p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,string,address)", p0, p1, p2) ); } function log( address p0, bool p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2) ); } function log( address p0, bool p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2) ); } function log( address p0, bool p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2) ); } function log( address p0, bool p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2) ); } function log( address p0, address p1, uint256 p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2) ); } function log( address p0, address p1, string memory p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,string)", p0, p1, p2) ); } function log( address p0, address p1, bool p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2) ); } function log( address p0, address p1, address p2 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(address,address,address)", p0, p1, p2) ); } function log( uint256 p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,uint,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,string,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3) ); } function log( uint256 p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,bool,address,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,uint,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,string,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,bool,address)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,uint)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,string)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,bool)", p0, p1, p2, p3 ) ); } function log( uint256 p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(uint,address,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,uint,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,string,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,bool,address,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,uint,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,string,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,bool,address)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,uint)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,string)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,bool)", p0, p1, p2, p3 ) ); } function log( string memory p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(string,address,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3) ); } function log( bool p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,uint,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,string,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3) ); } function log( bool p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,bool,address,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,uint,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,string,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,bool,address)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,uint)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,string)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,bool)", p0, p1, p2, p3 ) ); } function log( bool p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(bool,address,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, uint256 p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,uint,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, string memory p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,string,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, bool p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,bool,address,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, uint256 p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,uint,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, string memory p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,string,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, bool p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,bool,address)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, uint256 p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,uint)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, string memory p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,string)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, bool p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,bool)", p0, p1, p2, p3 ) ); } function log( address p0, address p1, address p2, address p3 ) internal view { _sendLogPayload( abi.encodeWithSignature( "log(address,address,address,address)", p0, p1, p2, p3 ) ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.16; import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; struct Config { bool Initialised; bool NumericOnly; bool CanOverwriteSubdomains; string[] DomainArray; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.16; import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; struct NftDetails { uint256 ParentTokenId; string Label; IERC721 NftAddress; uint96 NftId; //this actually saves about 20,000 gas in the claim subdomain method }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) && !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
pragma solidity >=0.8.4; interface ENS { // Logged when the owner of a node assigns a new owner to a subnode. event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); // Logged when the owner of a node transfers ownership to a new account. event Transfer(bytes32 indexed node, address owner); // Logged when the resolver for a node changes. event NewResolver(bytes32 indexed node, address resolver); // Logged when the TTL of a node changes event NewTTL(bytes32 indexed node, uint64 ttl); // Logged when an operator is added or removed. event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function setRecord( bytes32 node, address owner, address resolver, uint64 ttl ) external; function setSubnodeRecord( bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl ) external; function setSubnodeOwner( bytes32 node, bytes32 label, address owner ) external returns (bytes32); function setResolver(bytes32 node, address resolver) external; function setOwner(bytes32 node, address owner) external; function setTTL(bytes32 node, uint64 ttl) external; function setApprovalForAll(address operator, bool approved) external; function owner(bytes32 node) external view returns (address); function resolver(bytes32 node) external view returns (address); function ttl(bytes32 node) external view returns (uint64); function recordExists(bytes32 node) external view returns (bool); function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.4; /** * Interface for the new (multicoin) addr function. */ interface IAddressResolver { event AddressChanged( bytes32 indexed node, uint256 coinType, bytes newAddress ); function addr(bytes32 node, uint256 coinType) external view returns (bytes memory); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.4; /** * Interface for the legacy (ETH-only) addr function. */ interface IAddrResolver { event AddrChanged(bytes32 indexed node, address a); /** * Returns the address associated with an ENS node. * @param node The ENS node to query. * @return The associated address. */ function addr(bytes32 node) external view returns (address payable); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.4; interface ITextResolver { event TextChanged( bytes32 indexed node, string indexed indexedKey, string key ); /** * Returns the text data associated with an ENS node and key. * @param node The ENS node to query. * @param key The text data key to query. * @return The associated text data. */ function text(bytes32 node, string calldata key) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.4; interface INameResolver { event NameChanged(bytes32 indexed node, string name); /** * Returns the name associated with an ENS node, for reverse records. * Defined in EIP181. * @param node The ENS node to query. * @return The associated name. */ function name(bytes32 node) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../registry/ENS.sol"; import "../ethregistrar/IBaseRegistrar.sol"; import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol"; import "./IMetadataService.sol"; uint32 constant CANNOT_UNWRAP = 1; uint32 constant CANNOT_BURN_FUSES = 2; uint32 constant CANNOT_TRANSFER = 4; uint32 constant CANNOT_SET_RESOLVER = 8; uint32 constant CANNOT_SET_TTL = 16; uint32 constant CANNOT_CREATE_SUBDOMAIN = 32; uint32 constant PARENT_CANNOT_CONTROL = 64; uint32 constant CAN_DO_EVERYTHING = 0; interface INameWrapper is IERC1155 { event NameWrapped( bytes32 indexed node, bytes name, address owner, uint32 fuses, uint64 expiry ); event NameUnwrapped(bytes32 indexed node, address owner); event FusesSet(bytes32 indexed node, uint32 fuses, uint64 expiry); function ens() external view returns (ENS); function registrar() external view returns (IBaseRegistrar); function metadataService() external view returns (IMetadataService); function names(bytes32) external view returns (bytes memory); function wrap( bytes calldata name, address wrappedOwner, address resolver ) external; function wrapETH2LD( string calldata label, address wrappedOwner, uint32 fuses, uint64 _expiry, address resolver ) external returns (uint64 expiry); function registerAndWrapETH2LD( string calldata label, address wrappedOwner, uint256 duration, address resolver, uint32 fuses, uint64 expiry ) external returns (uint256 registrarExpiry); function renew( uint256 labelHash, uint256 duration, uint64 expiry ) external returns (uint256 expires); function unwrap( bytes32 node, bytes32 label, address owner ) external; function unwrapETH2LD( bytes32 label, address newRegistrant, address newController ) external; function setFuses(bytes32 node, uint32 fuses) external returns (uint32 newFuses); function setChildFuses( bytes32 parentNode, bytes32 labelhash, uint32 fuses, uint64 expiry ) external; function setSubnodeRecord( bytes32 node, string calldata label, address owner, address resolver, uint64 ttl, uint32 fuses, uint64 expiry ) external; function setRecord( bytes32 node, address owner, address resolver, uint64 ttl ) external; function setSubnodeOwner( bytes32 node, string calldata label, address newOwner, uint32 fuses, uint64 expiry ) external returns (bytes32); function isTokenOwnerOrApproved(bytes32 node, address addr) external view returns (bool); function setResolver(bytes32 node, address resolver) external; function setTTL(bytes32 node, uint64 ttl) external; function ownerOf(uint256 id) external view returns (address owner); function allFusesBurned(bytes32 node, uint32 fuseMask) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT import "@ens/registry/IReverseRegistrar.sol"; pragma solidity ^0.8.16; abstract contract PrimaryEns { IReverseRegistrar immutable public REVERSE_REGISTRAR; address immutable private deployer; constructor(){ deployer = msg.sender; REVERSE_REGISTRAR = IReverseRegistrar(0x084b1c3C81545d370f3634392De611CaaBFf8148); } /* * @description Set the primary name of the contract * @param _ens The ENS that is set to the contract address. Must be full name * including the .eth. Can also be a subdomain. */ function setPrimaryName(string calldata _ens) public { require(msg.sender == deployer, "only deployer"); REVERSE_REGISTRAR.setName(_ens); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
import "../registry/ENS.sol"; import "./IBaseRegistrar.sol"; import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol"; interface IBaseRegistrar is IERC721 { event ControllerAdded(address indexed controller); event ControllerRemoved(address indexed controller); event NameMigrated( uint256 indexed id, address indexed owner, uint256 expires ); event NameRegistered( uint256 indexed id, address indexed owner, uint256 expires ); event NameRenewed(uint256 indexed id, uint256 expires); // Authorises a controller, who can register and renew domains. function addController(address controller) external; // Revoke controller permission for an address. function removeController(address controller) external; // Set the resolver for the TLD this registrar manages. function setResolver(address resolver) external; // Returns the expiration timestamp of the specified label hash. function nameExpires(uint256 id) external view returns (uint256); // Returns true iff the specified name is available for registration. function available(uint256 id) external view returns (bool); /** * @dev Register a name. */ function register( uint256 id, address owner, uint256 duration ) external returns (uint256); function renew(uint256 id, uint256 duration) external returns (uint256); /** * @dev Reclaim ownership of a name in ENS, if you own it in the registrar. */ function reclaim(uint256 id, address owner) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
pragma solidity >=0.8.4; interface IMetadataService { function uri(uint256) external view returns (string memory); }
pragma solidity >=0.8.4; interface IReverseRegistrar { function setDefaultResolver(address resolver) external; function claim(address owner) external returns (bytes32); function claimForAddr( address addr, address owner, address resolver ) external returns (bytes32); function claimWithResolver(address owner, address resolver) external returns (bytes32); function setName(string memory name) external returns (bytes32); function setNameForAddr( address addr, address owner, address resolver, string memory name ) external returns (bytes32); function node(address addr) external pure returns (bytes32); }
{ "remappings": [ "@ens/=lib/EnsPrimaryContractNamer/lib/ens-contracts/contracts/", "EnsPrimaryContractNamer/=lib/EnsPrimaryContractNamer/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "ens-contracts/=lib/ens-contracts/contracts/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "script/=lib/EnsPrimaryContractNamer/script/", "src/=src/", "test/=test/", "src/=src/", "test/=test/", "script/=script/" ], "optimizer": { "enabled": true, "runs": 2000 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_nodeHash","type":"bytes32"},{"indexed":true,"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"indexed":true,"internalType":"uint96","name":"_tokenId","type":"uint96"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"SubdomainClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_nodeHash","type":"bytes32"},{"indexed":true,"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"indexed":true,"internalType":"uint96","name":"_tokenId","type":"uint96"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"SubdomainRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_ensId","type":"uint256"},{"indexed":true,"internalType":"contract IERC721","name":"_nftContract","type":"address"}],"name":"addNftContractToEns","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_ensId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_numericOnly","type":"bool"},{"indexed":false,"internalType":"bool","name":"_canOverwriteSubdomains","type":"bool"}],"name":"updateEnsClaimConfig","type":"event"},{"inputs":[],"name":"EnsContract","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EnsNameWrapper","outputs":[{"internalType":"contract INameWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"EnsToConfig","outputs":[{"internalType":"bool","name":"Initialised","type":"bool"},{"internalType":"bool","name":"NumericOnly","type":"bool"},{"internalType":"bool","name":"CanOverwriteSubdomains","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EnsToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ParentNodeToConfig","outputs":[{"internalType":"bool","name":"Initialised","type":"bool"},{"internalType":"bool","name":"NumericOnly","type":"bool"},{"internalType":"bool","name":"CanOverwriteSubdomains","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ParentNodeToNftContracts","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVERSE_REGISTRAR","outputs":[{"internalType":"contract IReverseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"SubdomainClaimMap","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"SubnodeToNftDetails","outputs":[{"internalType":"uint256","name":"ParentTokenId","type":"uint256"},{"internalType":"string","name":"Label","type":"string"},{"internalType":"contract IERC721","name":"NftAddress","type":"address"},{"internalType":"uint96","name":"NftId","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"contract IERC721","name":"_nftContract","type":"address"}],"name":"addContractToExistingEns","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_domainArray","type":"string[]"},{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"contract IERC721[]","name":"_nftContracts","type":"address[]"},{"internalType":"bool","name":"_numericOnly","type":"bool"},{"internalType":"bool","name":"_overWriteUnusedSubdomains","type":"bool"}],"name":"addEnsContractMapping","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"uint96","name":"_nftId","type":"uint96"},{"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"internalType":"string","name":"_label","type":"string"}],"name":"claimSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_domainArray","type":"string[]"}],"name":"getDomainHash","outputs":[{"internalType":"bytes32","name":"namehash","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"namehashFromId","outputs":[{"internalType":"bytes32","name":"_namehash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_subnodeHash","type":"bytes32"}],"name":"outputEvents","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_subdomainHash","type":"bytes32"}],"name":"removeSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setNameWrapper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_ens","type":"string"}],"name":"setPrimaryName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"bool","name":"_numericOnly","type":"bool"},{"internalType":"bool","name":"_overwriteUnusedSubdomains","type":"bool"}],"name":"updateSettingsToExistingEns","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60e0604052600180546001600160a01b03199081166e0c2e074ec69a0dfb2997ba6c7d2e1e17909155600280549091167357f1887a8bf19b14fc0df6fd9b2acc9af147ea8517905534801561005357600080fd5b503360a081905273084b1c3c81545d370f3634392de611caabff814860805260c05260805160a05160c05161493d6100b26000396000818161123d01526112f10152600061224801526000818161043a01526122e5015261493d6000f3fe6080604052600436106101c25760003560e01c806376356759116100f7578063bc197c8111610095578063dd6be29a11610064578063dd6be29a1461057a578063f1cb7e061461058d578063f23a6e61146105ad578063f5c9a797146105f357600080fd5b8063bc197c811461047c578063c0970267146104b5578063c431f31d14610517578063c54b55d71461053757600080fd5b80638b95dd71116100d15780638b95dd71146103f5578063903f2cbd14610415578063952899fc14610428578063ab66abd51461045c57600080fd5b806376356759146103a2578063795e3511146103b557806381755ed1146103d557600080fd5b80632f8a3fa1116101645780633ccfd60b1161013e5780633ccfd60b1461032d57806359d1d43c1461033557806368c8bbbe14610362578063691f34311461038257600080fd5b80632f8a3fa1146102e7578063371412f1146102fa5780633b3b57de1461030d57600080fd5b806310f13a8c116101a057806310f13a8c146102415780631c3eb8a9146102545780632034ab201461028c57806320d95c96146102ba57600080fd5b806301e4e1fa146101c757806301ffc9a7146101dc57806309536be414610211575b600080fd5b6101da6101d5366004613c2c565b610606565b005b3480156101e857600080fd5b506101fc6101f7366004613c45565b610960565b60405190151581526020015b60405180910390f35b34801561021d57600080fd5b5061023161022c366004613c2c565b610a80565b6040516102089493929190613cbf565b6101da61024f366004613d4f565b610b4c565b34801561026057600080fd5b5061027461026f366004613dc9565b610c69565b6040516001600160a01b039091168152602001610208565b34801561029857600080fd5b506102ac6102a7366004613e30565b610ca1565b604051908152602001610208565b3480156102c657600080fd5b506102ac6102d5366004613c2c565b60096020526000908152604090205481565b6101da6102f5366004613e80565b610d39565b6101da610308366004613ed7565b611232565b34801561031957600080fd5b50610274610328366004613c2c565b6112d9565b6101da6112e4565b34801561034157600080fd5b50610355610350366004613ef4565b61133c565b6040516102089190613f40565b34801561036e57600080fd5b506102ac61037d366004613c2c565b611604565b34801561038e57600080fd5b5061035561039d366004613c2c565b6116ea565b6101da6103b0366004613c2c565b611972565b3480156103c157600080fd5b50600254610274906001600160a01b031681565b3480156103e157600080fd5b50600154610274906001600160a01b031681565b34801561040157600080fd5b506101da610410366004613ff2565b611a2b565b6101da610423366004614056565b611b66565b34801561043457600080fd5b506102747f000000000000000000000000000000000000000000000000000000000000000081565b34801561046857600080fd5b506101da6104773660046140f6565b61223d565b34801561048857600080fd5b5061049c61049736600461412c565b612364565b6040516001600160e01b03199091168152602001610208565b3480156104c157600080fd5b506104f86104d0366004613c2c565b60056020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610208565b34801561052357600080fd5b50600054610274906001600160a01b031681565b34801561054357600080fd5b506104f8610552366004613c2c565b60036020526000908152604090205460ff808216916101008104821691620100009091041683565b6101da61058836600461420b565b6123af565b34801561059957600080fd5b506103556105a8366004613dc9565b612e13565b3480156105b957600080fd5b5061049c6105c8366004614288565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6101da610601366004614304565b612f1c565b8060006106128261336a565b90506001600160a01b03811633146106715760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e0000000000000000000060448201526064015b60405180910390fd5b600060046000858152602001908152602001600020604051806080016040529081600082015481526020016001820180546106ab90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790614334565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036107b15760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60006107bc856116ea565b9050600960008360000151846040015185606001516040516020016108209392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f19818403018152918152815160209283012083528282019390935290820160009081208190558781526004909152908120818155906108686001830182613b02565b50600060029190910181905560405190815285907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516000602082015285907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f19818403018152908290526108f8929161436e565b60405180910390a281606001516bffffffffffffffffffffffff1682604001516001600160a01b0316867f02fcfbb0f83c2ddc0e1ba4d4d1a33ac37b67c33bb0e11cf9967a8027f1f0abf6846040516109519190613f40565b60405180910390a45050505050565b60006001600160e01b031982167ff23a6e610000000000000000000000000000000000000000000000000000000014806109c357506001600160e01b031982167fbc197c8100000000000000000000000000000000000000000000000000000000145b806109f757507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a2b57507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a5f57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a7a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60046020526000908152604090208054600182018054919291610aa290614334565b80601f0160208091040260200160405190810160405280929190818152602001828054610ace90614334565b8015610b1b5780601f10610af057610100808354040283529160200191610b1b565b820191906000526020600020905b815481529060010190602001808311610afe57829003601f168201915b505050600290930154919250506001600160a01b038116906bffffffffffffffffffffffff600160a01b9091041684565b846000610b588261336a565b90506001600160a01b0381163314610bb25760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b8383600860008a815260200190815260200160002060008989604051602001610bdc929190614387565b6040516020818303038152906040528051906020012081526020019081526020016000209182610c0d9291906143e5565b508585604051610c1e929190614387565b6040518091039020877fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508686604051610c589291906144a6565b60405180910390a350505050505050565b60066020528160005260406000208181548110610c8557600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000815b8015610d32576000190181848483818110610cc257610cc26144d5565b9050602002810190610cd491906144eb565b604051602001610ce5929190614387565b60405160208183030381529060405280519060200120604051602001610d15929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ca5565b5092915050565b6002546040516331a9108f60e11b81526004810185905284916001600160a01b031690636352211e90602401602060405180830381865afa925050508015610d9e575060408051601f3d908101601f19168201909252610d9b91810190614550565b60015b610dea5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480610e8a575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015610e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e70919061456d565b8015610e8a57506000546001600160a01b03828116911614155b80610f2f57506000546001600160a01b038281169116148015610eb557506001600160a01b03811615155b8015610f2f575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f919061456d565b610f7b5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000848152600660205260409020546001108015610f975750825b1561100a5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b8282101561111b57838290600052602060002001805461108e90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90614334565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b50505050508152602001906001019061106f565b5050509152505080519091506111735760405162461bcd60e51b815260206004820152601260248201527f454e53206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b831515602080830191825284151560408085019182526000898152600584522084518154945192511515620100000262ff0000199315156101000261ff00199215159290921661ffff19909616959095171791909116929092178255606083015180518493926111ea926001850192910190613b3c565b505060408051861515815285151560208201528792507f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a25050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112aa5760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a7a8261336a565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016904780156108fc02916000818181858888f19350505050158015611339573d6000803e3d6000fd5b50565b600083815260046020908152604080832081516080810190925280548252600181018054606095948401919061137190614334565b80601f016020809104026020016040519081016040528092919081815260200182805461139d90614334565b80156113ea5780601f106113bf576101008083540402835291602001916113ea565b820191906000526020600020905b8154815290600101906020018083116113cd57829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036114775760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b7fd1f86c93d831119ad98fe983e643a7431e4ac992e3ead6e3007f4dd1adf6634384846040516020016114ab929190614387565b60405160208183030381529060405280519060200120036115245760006114de82604001516001600160a01b0316613530565b6114f983606001516bffffffffffffffffffffffff16613546565b60405160200161150a92919061458a565b60408051601f1981840301815291905292506115fd915050565b600860008681526020019081526020016000206000858560405160200161154c929190614387565b604051602081830303815290604052805190602001208152602001908152602001600020805461157b90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546115a790614334565b80156115f45780601f106115c9576101008083540402835291602001916115f4565b820191906000526020600020905b8154815290600101906020018083116115d757829003601f168201915b50505050509150505b9392505050565b60005481906001600160a01b0316158015906116955750600080546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116899190614550565b6001600160a01b031614155b6116e557604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208201529081018290526060016040516020818303038152906040528051906020012090505b919050565b600081815260046020908152604080832081516080810190925280548252600181018054606095948401919061171f90614334565b80601f016020809104026020016040519081016040528092919081815260200182805461174b90614334565b80156117985780601f1061176d57610100808354040283529160200191611798565b820191906000526020600020905b81548152906001019060200180831161177b57829003601f168201915b5050509183525050600291909101546001600160a01b038116602080840191909152600160a01b9091046bffffffffffffffffffffffff1660409283015282810151835160009081526005835283812060010180548551818602810186019096528086529596509194909392849084015b828210156118b557838290600052602060002001805461182890614334565b80601f016020809104026020016040519081016040528092919081815260200182805461185490614334565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b505050505081526020019060010190611809565b5050506040850151919250506001600160a01b03166119165760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60005b81518110156119685782828281518110611935576119356144d5565b602002602001015160405160200161194e92919061460b565b60408051601f198184030181529190529250600101611919565b5090949350505050565b600061197d8261336a565b6040516001600160a01b038216815290915082907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516bffffffffffffffffffffffff19606083901b16602082015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f1981840301815290829052611a1f929161436e565b60405180910390a25050565b826000611a378261336a565b90506001600160a01b0381163314611a915760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b847f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528585604051611ac392919061436e565b60405180910390a2603c8403611b1b5760405162461bcd60e51b815260206004820152601660248201527f63616e6e6f7420736574206574682061646472657373000000000000000000006044820152606401610668565b6000611b268661336a565b60008781526007602090815260408083206001600160a01b038516845282528083208984529091529020909150611b5d8582614663565b50505050505050565b6002546040516331a9108f60e11b81526004810187905286916001600160a01b031690636352211e90602401602060405180830381865afa925050508015611bcb575060408051601f3d908101601f19168201909252611bc891810190614550565b60015b611c175760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480611cb7575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015611c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9d919061456d565b8015611cb757506000546001600160a01b03828116911614155b80611d5c57506000546001600160a01b038281169116148015611ce257506001600160a01b03811615155b8015611d5c575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015611d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5c919061456d565b611da85760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000611db487611604565b6001546040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390529192506000916001600160a01b03909116906302571be390602401602060405180830381865afa158015611e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e409190614550565b90506001600160a01b038116301480611e7957506000546001600160a01b038281169116148015611e7957506001600160a01b03811615155b611eeb5760405162461bcd60e51b815260206004820152602560248201527f636f6e74726f6c6c6572206f6620456e73206e6f742073657420746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610668565b81611ef68b8b610ca1565b14611f435760405162461bcd60e51b815260206004820152601260248201527f696e636f7272656374206e616d656861736800000000000000000000000000006044820152606401610668565b60068610611f935760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b85611fe05760405162461bcd60e51b815260206004820152601c60248201527f6e656564206174206c656173742031204e465420636f6e7472616374000000006044820152606401610668565b600186118015611fed5750845b156120605760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008881526005602052604090205460ff16156120bf5760405162461bcd60e51b815260206004820152601760248201527f616c7265616479206265656e20636f6e666967757265640000000000000000006044820152606401610668565b6120c9878761367b565b6040805160808101825260018152861515602082015285151591810191909152606081016120f78b8d614723565b90526000898152600560209081526040918290208351815485840151948601511515620100000262ff0000199515156101000261ff00199315159390931661ffff19909216919091179190911793909316929092178255606083015180516121659260018501920190613b3c565b5050506000888152600660205260409020612181908888613b92565b50604080518615158152851515602082015289917f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a260005b86811015612230578787828181106121dd576121dd6144d5565b90506020020160208101906121f29190613ed7565b6001600160a01b0316897f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae460405160405180910390a36001016121c3565b5050505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146122b55760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6040517fc47f00270000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c47f00279061231c90859085906004016144a6565b6020604051808303816000875af115801561233b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235f91906147a7565b505050565b60405162461bcd60e51b815260206004820152601860248201527f63616e6e6f7420646f206261746368207472616e7366657200000000000000006044820152600090606401610668565b6040516331a9108f60e11b81526bffffffffffffffffffffffff841660048201528290849033906001600160a01b03841690636352211e90602401602060405180830381865afa158015612407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242b9190614550565b6001600160a01b0316146124815760405162461bcd60e51b815260206004820152601060248201527f6e6f74206f776e6572206f66204e4654000000000000000000000000000000006044820152606401610668565b60008685876040516020016124d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f198184030181529181528151602092830120600081815260099093529120549091501561254a5760405162461bcd60e51b815260206004820181905260248201527f737562646f6d61696e20636c61696d656420666f72207468697320746f6b656e6044820152606401610668565b612554878661372a565b6125a05760405162461bcd60e51b815260206004820152601260248201527f4e6f742076616c696420636f6e747261637400000000000000000000000000006044820152606401610668565b60008781526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156126b157838290600052602060002001805461262490614334565b80601f016020809104026020016040519081016040528092919081815260200182805461265090614334565b801561269d5780601f106126725761010080835404028352916020019161269d565b820191906000526020600020905b81548152906001019060200180831161268057829003601f168201915b505050505081526020019060010190612605565b50505091525050805190915061272f5760405162461bcd60e51b815260206004820152602160248201527f636f6e66696775726174696f6e20666f7220454e53206e6f7420656e61626c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610668565b600061273a89611604565b90506000826020015161274d5786612764565b612764896bffffffffffffffffffffffff16613546565b90506000828260405160200161277a91906147c0565b604051602081830303815290604052805190602001206040516020016127aa929190918252602082015260400190565b60408051601f19818403018152918152815160209283012060008181526004909352912054909150156128455760405162461bcd60e51b815260206004820152602260248201527f537562646f6d61696e2068617320616c7265616479206265656e20636c61696d60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610668565b6001546040517ff79fe538000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f79fe53890602401602060405180830381865afa1580156128a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cb919061456d565b15806128d8575083604001515b61294a5760405162461bcd60e51b815260206004820152602560248201527f6e6f7420616c6c6f7765642070726576696f75736c792075736564207375626460448201527f6f6d61696e0000000000000000000000000000000000000000000000000000006064820152608401610668565b604080516080810182528c815260208082018581526001600160a01b038d16838501526bffffffffffffffffffffffff8e166060840152600085815260049092529290208151815591519091829160018201906129a79082614663565b5060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505060008054906101000a90046001600160a01b03166001600160a01b0316600260009054906101000a90046001600160a01b03166001600160a01b0316636352211e8e6040518263ffffffff1660e01b8152600401612a6f91815260200190565b602060405180830381865afa158015612a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab09190614550565b6001600160a01b031603612b5257600080546040517f24c1af440000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916324c1af4491612b1b91889188913091829190819067ffffffffffffffff906004016147dc565b600060405180830381600087803b158015612b3557600080fd5b505af1158015612b49573d6000803e3d6000fd5b50505050612bfe565b6001546040516001600160a01b0390911690635ef2c7f0908690612b7a9087906020016147c0565b60408051601f198184030181529082905280516020909101206001600160e01b031960e085901b16825260048201929092526024810191909152306044820181905260648201526000608482015260a401600060405180830381600087803b158015612be557600080fd5b505af1158015612bf9573d6000803e3d6000fd5b505050505b60008681526009602052604090819020839055516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2906001600160a01b038d1690636352211e90602401602060405180830381865afa158015612c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca99190614550565b6040516001600160a01b03909116815260200160405180910390a26040516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c906001600160a01b038e1690636352211e90602401602060405180830381865afa158015612d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d619190614550565b604051602001612d89919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052612da4929161436e565b60405180910390a28a6bffffffffffffffffffffffff168a6001600160a01b0316837fd272cd576ecd5a658f613a3d9f818449d49fceff169ccc9d9003fe5b36ca4772612df0866116ea565b604051612dfd9190613f40565b60405180910390a4505050505050505050505050565b60606000612e208461336a565b9050603c8303612e60576040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052915050610a7a565b60008481526007602090815260408083206001600160a01b0385168452825280832086845290915290208054612e9590614334565b80601f0160208091040260200160405190810160405280929190818152602001828054612ec190614334565b8015612f0e5780601f10612ee357610100808354040283529160200191612f0e565b820191906000526020600020905b815481529060010190602001808311612ef157829003601f168201915b505050505091505092915050565b6002546040516331a9108f60e11b81526004810184905283916001600160a01b031690636352211e90602401602060405180830381865afa925050508015612f81575060408051601f3d908101601f19168201909252612f7e91810190614550565b60015b612fcd5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b03811633148061306d575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa15801561302f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613053919061456d565b801561306d57506000546001600160a01b03828116911614155b8061311257506000546001600160a01b03828116911614801561309857506001600160a01b03811615155b8015613112575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa1580156130ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613112919061456d565b61315e5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b50600083815260066020526040902054600581106131be5760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b6000811161320e5760405162461bcd60e51b815260206004820152601260248201527f656e73206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b613218848461372a565b156132655760405162461bcd60e51b815260206004820152601660248201527f6475706c6963617465204e465420636f6e7472616374000000000000000000006044820152606401610668565b600084815260056020526040902054610100900460ff16156132ef5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526006602090815260408083208054600181018255908452918320909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091559051909186917f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae49190a350505050565b60008181526004602090815260408083208151608081019092528054825260018101805485948401919061339d90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546133c990614334565b80156134165780601f106133eb57610100808354040283529160200191613416565b820191906000526020600020905b8154815290600101906020018083116133f957829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036134a35760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b604080820151606083015191516331a9108f60e11b81526bffffffffffffffffffffffff90921660048301526000916001600160a01b0390911690636352211e90602401602060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135289190614550565b949350505050565b6060610a7a6001600160a01b03831660146137ec565b60608160000361358957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156135b3578061359d81614853565b91506135ac9050600a83614883565b915061358d565b60008167ffffffffffffffff8111156135ce576135ce613f53565b6040519080825280601f01601f1916602001820160405280156135f8576020820181803683370190505b5090505b84156135285761360d600183614897565b915061361a600a866148aa565b6136259060306148be565b60f81b81838151811061363a5761363a6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613674600a86614883565b94506135fc565b60005b8181101561235f576136d683838381811061369b5761369b6144d5565b90506020020160208101906136b09190613ed7565b7f80ac58cd00000000000000000000000000000000000000000000000000000000613a15565b6137225760405162461bcd60e51b815260206004820152601c60248201527f6e65656420746f206265204945524337323120636f6e747261637473000000006044820152606401610668565b60010161367e565b60008281526006602090815260408083208054825181850281018501909352808352849383018282801561378757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613769575b505083519394506000925050505b818110156137e357846001600160a01b03168382815181106137b9576137b96144d5565b60200260200101516001600160a01b0316036137db5760019350505050610a7a565b600101613795565b50505092915050565b606060006137fb8360026148d1565b6138069060026148be565b67ffffffffffffffff81111561381e5761381e613f53565b6040519080825280601f01601f191660200182016040528015613848576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061387f5761387f6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138e2576138e26144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061391e8460026148d1565b6139299060016148be565b90505b60018111156139c6577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061396a5761396a6144d5565b1a60f81b828281518110613980576139806144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936139bf816148f0565b905061392c565b5083156115fd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610668565b6000613a2083613a31565b80156115fd57506115fd8383613a64565b6000613a44826301ffc9a760e01b613a64565b8015610a7a5750613a5d826001600160e01b0319613a64565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613aeb575060208210155b8015613af75750600081115b979650505050505050565b508054613b0e90614334565b6000825580601f10613b1e575050565b601f0160209004906000526020600020908101906113399190613bfa565b828054828255906000526020600020908101928215613b82579160200282015b82811115613b825782518290613b729082614663565b5091602001919060010190613b5c565b50613b8e929150613c0f565b5090565b828054828255906000526020600020908101928215613bf2579160200282015b82811115613bf257815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190613bb2565b50613b8e9291505b5b80821115613b8e5760008155600101613bfb565b80821115613b8e576000613c238282613b02565b50600101613c0f565b600060208284031215613c3e57600080fd5b5035919050565b600060208284031215613c5757600080fd5b81356001600160e01b0319811681146115fd57600080fd5b60005b83811015613c8a578181015183820152602001613c72565b50506000910152565b60008151808452613cab816020860160208601613c6f565b601f01601f19169290920160200192915050565b848152608060208201526000613cd86080830186613c93565b90506001600160a01b03841660408301526bffffffffffffffffffffffff8316606083015295945050505050565b60008083601f840112613d1857600080fd5b50813567ffffffffffffffff811115613d3057600080fd5b602083019150836020828501011115613d4857600080fd5b9250929050565b600080600080600060608688031215613d6757600080fd5b85359450602086013567ffffffffffffffff80821115613d8657600080fd5b613d9289838a01613d06565b90965094506040880135915080821115613dab57600080fd5b50613db888828901613d06565b969995985093965092949392505050565b60008060408385031215613ddc57600080fd5b50508035926020909101359150565b60008083601f840112613dfd57600080fd5b50813567ffffffffffffffff811115613e1557600080fd5b6020830191508360208260051b8501011115613d4857600080fd5b60008060208385031215613e4357600080fd5b823567ffffffffffffffff811115613e5a57600080fd5b613e6685828601613deb565b90969095509350505050565b801515811461133957600080fd5b600080600060608486031215613e9557600080fd5b833592506020840135613ea781613e72565b91506040840135613eb781613e72565b809150509250925092565b6001600160a01b038116811461133957600080fd5b600060208284031215613ee957600080fd5b81356115fd81613ec2565b600080600060408486031215613f0957600080fd5b83359250602084013567ffffffffffffffff811115613f2757600080fd5b613f3386828701613d06565b9497909650939450505050565b6020815260006115fd6020830184613c93565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f9257613f92613f53565b604052919050565b600067ffffffffffffffff831115613fb457613fb4613f53565b613fc76020601f19601f86011601613f69565b9050828152838383011115613fdb57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561400757600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561402c57600080fd5b8401601f8101861361403d57600080fd5b61404c86823560208401613f9a565b9150509250925092565b600080600080600080600060a0888a03121561407157600080fd5b873567ffffffffffffffff8082111561408957600080fd5b6140958b838c01613deb565b909950975060208a0135965060408a01359150808211156140b557600080fd5b506140c28a828b01613deb565b90955093505060608801356140d681613e72565b915060808801356140e681613e72565b8091505092959891949750929550565b6000806020838503121561410957600080fd5b823567ffffffffffffffff81111561412057600080fd5b613e6685828601613d06565b60008060008060008060008060a0898b03121561414857600080fd5b883561415381613ec2565b9750602089013561416381613ec2565b9650604089013567ffffffffffffffff8082111561418057600080fd5b61418c8c838d01613deb565b909850965060608b01359150808211156141a557600080fd5b6141b18c838d01613deb565b909650945060808b01359150808211156141ca57600080fd5b506141d78b828c01613d06565b999c989b5096995094979396929594505050565b600082601f8301126141fc57600080fd5b6115fd83833560208501613f9a565b6000806000806080858703121561422157600080fd5b8435935060208501356bffffffffffffffffffffffff8116811461424457600080fd5b9250604085013561425481613ec2565b9150606085013567ffffffffffffffff81111561427057600080fd5b61427c878288016141eb565b91505092959194509250565b60008060008060008060a087890312156142a157600080fd5b86356142ac81613ec2565b955060208701356142bc81613ec2565b94506040870135935060608701359250608087013567ffffffffffffffff8111156142e657600080fd5b6142f289828a01613d06565b979a9699509497509295939492505050565b6000806040838503121561431757600080fd5b82359150602083013561432981613ec2565b809150509250929050565b600181811c9082168061434857607f821691505b60208210810361436857634e487b7160e01b600052602260045260246000fd5b50919050565b8281526040602082015260006135286040830184613c93565b8183823760009101908152919050565b601f82111561235f57600081815260208120601f850160051c810160208610156143be5750805b601f850160051c820191505b818110156143dd578281556001016143ca565b505050505050565b67ffffffffffffffff8311156143fd576143fd613f53565b6144118361440b8354614334565b83614397565b6000601f841160018114614445576000851561442d5750838201355b600019600387901b1c1916600186901b17835561449f565b600083815260209020601f19861690835b828110156144765786850135825560209485019460019092019101614456565b50868210156144935760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261452057600080fd5b83018035915067ffffffffffffffff82111561453b57600080fd5b602001915036819003821315613d4857600080fd5b60006020828403121561456257600080fd5b81516115fd81613ec2565b60006020828403121561457f57600080fd5b81516115fd81613e72565b7f6569703135353a312f6572633732313a000000000000000000000000000000008152600083516145c2816010850160208801613c6f565b7f2f0000000000000000000000000000000000000000000000000000000000000060109184019182015283516145ff816011840160208801613c6f565b01601101949350505050565b6000835161461d818460208801613c6f565b7f2e000000000000000000000000000000000000000000000000000000000000009083019081528351614657816001840160208801613c6f565b01600101949350505050565b815167ffffffffffffffff81111561467d5761467d613f53565b6146918161468b8454614334565b84614397565b602080601f8311600181146146c657600084156146ae5750858301515b600019600386901b1c1916600185901b1785556143dd565b600085815260208120601f198616915b828110156146f5578886015182559484019460019091019084016146d6565b50858210156147135787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600067ffffffffffffffff8084111561473e5761473e613f53565b8360051b602061474f818301613f69565b86815291850191818101903684111561476757600080fd5b865b8481101561479b578035868111156147815760008081fd5b61478d36828b016141eb565b845250918301918301614769565b50979650505050505050565b6000602082840312156147b957600080fd5b5051919050565b600082516147d2818460208701613c6f565b9190910192915050565b87815260e0602082015260006147f560e0830189613c93565b6001600160a01b03978816604084015295909616606082015267ffffffffffffffff938416608082015263ffffffff9290921660a083015290911660c0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b600060001982036148665761486661483d565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826148925761489261486d565b500490565b81810381811115610a7a57610a7a61483d565b6000826148b9576148b961486d565b500690565b80820180821115610a7a57610a7a61483d565b60008160001904831182151516156148eb576148eb61483d565b500290565b6000816148ff576148ff61483d565b50600019019056fea264697066735822122037579578826abdbb54585150f526ef108409f434a19709ee6e525f4001e4631064736f6c63430008100033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806376356759116100f7578063bc197c8111610095578063dd6be29a11610064578063dd6be29a1461057a578063f1cb7e061461058d578063f23a6e61146105ad578063f5c9a797146105f357600080fd5b8063bc197c811461047c578063c0970267146104b5578063c431f31d14610517578063c54b55d71461053757600080fd5b80638b95dd71116100d15780638b95dd71146103f5578063903f2cbd14610415578063952899fc14610428578063ab66abd51461045c57600080fd5b806376356759146103a2578063795e3511146103b557806381755ed1146103d557600080fd5b80632f8a3fa1116101645780633ccfd60b1161013e5780633ccfd60b1461032d57806359d1d43c1461033557806368c8bbbe14610362578063691f34311461038257600080fd5b80632f8a3fa1146102e7578063371412f1146102fa5780633b3b57de1461030d57600080fd5b806310f13a8c116101a057806310f13a8c146102415780631c3eb8a9146102545780632034ab201461028c57806320d95c96146102ba57600080fd5b806301e4e1fa146101c757806301ffc9a7146101dc57806309536be414610211575b600080fd5b6101da6101d5366004613c2c565b610606565b005b3480156101e857600080fd5b506101fc6101f7366004613c45565b610960565b60405190151581526020015b60405180910390f35b34801561021d57600080fd5b5061023161022c366004613c2c565b610a80565b6040516102089493929190613cbf565b6101da61024f366004613d4f565b610b4c565b34801561026057600080fd5b5061027461026f366004613dc9565b610c69565b6040516001600160a01b039091168152602001610208565b34801561029857600080fd5b506102ac6102a7366004613e30565b610ca1565b604051908152602001610208565b3480156102c657600080fd5b506102ac6102d5366004613c2c565b60096020526000908152604090205481565b6101da6102f5366004613e80565b610d39565b6101da610308366004613ed7565b611232565b34801561031957600080fd5b50610274610328366004613c2c565b6112d9565b6101da6112e4565b34801561034157600080fd5b50610355610350366004613ef4565b61133c565b6040516102089190613f40565b34801561036e57600080fd5b506102ac61037d366004613c2c565b611604565b34801561038e57600080fd5b5061035561039d366004613c2c565b6116ea565b6101da6103b0366004613c2c565b611972565b3480156103c157600080fd5b50600254610274906001600160a01b031681565b3480156103e157600080fd5b50600154610274906001600160a01b031681565b34801561040157600080fd5b506101da610410366004613ff2565b611a2b565b6101da610423366004614056565b611b66565b34801561043457600080fd5b506102747f000000000000000000000000084b1c3c81545d370f3634392de611caabff814881565b34801561046857600080fd5b506101da6104773660046140f6565b61223d565b34801561048857600080fd5b5061049c61049736600461412c565b612364565b6040516001600160e01b03199091168152602001610208565b3480156104c157600080fd5b506104f86104d0366004613c2c565b60056020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610208565b34801561052357600080fd5b50600054610274906001600160a01b031681565b34801561054357600080fd5b506104f8610552366004613c2c565b60036020526000908152604090205460ff808216916101008104821691620100009091041683565b6101da61058836600461420b565b6123af565b34801561059957600080fd5b506103556105a8366004613dc9565b612e13565b3480156105b957600080fd5b5061049c6105c8366004614288565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6101da610601366004614304565b612f1c565b8060006106128261336a565b90506001600160a01b03811633146106715760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e0000000000000000000060448201526064015b60405180910390fd5b600060046000858152602001908152602001600020604051806080016040529081600082015481526020016001820180546106ab90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790614334565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036107b15760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60006107bc856116ea565b9050600960008360000151846040015185606001516040516020016108209392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f19818403018152918152815160209283012083528282019390935290820160009081208190558781526004909152908120818155906108686001830182613b02565b50600060029190910181905560405190815285907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516000602082015285907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f19818403018152908290526108f8929161436e565b60405180910390a281606001516bffffffffffffffffffffffff1682604001516001600160a01b0316867f02fcfbb0f83c2ddc0e1ba4d4d1a33ac37b67c33bb0e11cf9967a8027f1f0abf6846040516109519190613f40565b60405180910390a45050505050565b60006001600160e01b031982167ff23a6e610000000000000000000000000000000000000000000000000000000014806109c357506001600160e01b031982167fbc197c8100000000000000000000000000000000000000000000000000000000145b806109f757507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a2b57507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a5f57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a7a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60046020526000908152604090208054600182018054919291610aa290614334565b80601f0160208091040260200160405190810160405280929190818152602001828054610ace90614334565b8015610b1b5780601f10610af057610100808354040283529160200191610b1b565b820191906000526020600020905b815481529060010190602001808311610afe57829003601f168201915b505050600290930154919250506001600160a01b038116906bffffffffffffffffffffffff600160a01b9091041684565b846000610b588261336a565b90506001600160a01b0381163314610bb25760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b8383600860008a815260200190815260200160002060008989604051602001610bdc929190614387565b6040516020818303038152906040528051906020012081526020019081526020016000209182610c0d9291906143e5565b508585604051610c1e929190614387565b6040518091039020877fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508686604051610c589291906144a6565b60405180910390a350505050505050565b60066020528160005260406000208181548110610c8557600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000815b8015610d32576000190181848483818110610cc257610cc26144d5565b9050602002810190610cd491906144eb565b604051602001610ce5929190614387565b60405160208183030381529060405280519060200120604051602001610d15929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ca5565b5092915050565b6002546040516331a9108f60e11b81526004810185905284916001600160a01b031690636352211e90602401602060405180830381865afa925050508015610d9e575060408051601f3d908101601f19168201909252610d9b91810190614550565b60015b610dea5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480610e8a575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015610e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e70919061456d565b8015610e8a57506000546001600160a01b03828116911614155b80610f2f57506000546001600160a01b038281169116148015610eb557506001600160a01b03811615155b8015610f2f575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f919061456d565b610f7b5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000848152600660205260409020546001108015610f975750825b1561100a5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b8282101561111b57838290600052602060002001805461108e90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90614334565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b50505050508152602001906001019061106f565b5050509152505080519091506111735760405162461bcd60e51b815260206004820152601260248201527f454e53206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b831515602080830191825284151560408085019182526000898152600584522084518154945192511515620100000262ff0000199315156101000261ff00199215159290921661ffff19909616959095171791909116929092178255606083015180518493926111ea926001850192910190613b3c565b505060408051861515815285151560208201528792507f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a25050505050565b336001600160a01b037f000000000000000000000000082fc1776d44f69988c475958a0505a5bc2cd77b16146112aa5760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a7a8261336a565b6040516001600160a01b037f000000000000000000000000082fc1776d44f69988c475958a0505a5bc2cd77b16904780156108fc02916000818181858888f19350505050158015611339573d6000803e3d6000fd5b50565b600083815260046020908152604080832081516080810190925280548252600181018054606095948401919061137190614334565b80601f016020809104026020016040519081016040528092919081815260200182805461139d90614334565b80156113ea5780601f106113bf576101008083540402835291602001916113ea565b820191906000526020600020905b8154815290600101906020018083116113cd57829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036114775760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b7fd1f86c93d831119ad98fe983e643a7431e4ac992e3ead6e3007f4dd1adf6634384846040516020016114ab929190614387565b60405160208183030381529060405280519060200120036115245760006114de82604001516001600160a01b0316613530565b6114f983606001516bffffffffffffffffffffffff16613546565b60405160200161150a92919061458a565b60408051601f1981840301815291905292506115fd915050565b600860008681526020019081526020016000206000858560405160200161154c929190614387565b604051602081830303815290604052805190602001208152602001908152602001600020805461157b90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546115a790614334565b80156115f45780601f106115c9576101008083540402835291602001916115f4565b820191906000526020600020905b8154815290600101906020018083116115d757829003601f168201915b50505050509150505b9392505050565b60005481906001600160a01b0316158015906116955750600080546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116899190614550565b6001600160a01b031614155b6116e557604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208201529081018290526060016040516020818303038152906040528051906020012090505b919050565b600081815260046020908152604080832081516080810190925280548252600181018054606095948401919061171f90614334565b80601f016020809104026020016040519081016040528092919081815260200182805461174b90614334565b80156117985780601f1061176d57610100808354040283529160200191611798565b820191906000526020600020905b81548152906001019060200180831161177b57829003601f168201915b5050509183525050600291909101546001600160a01b038116602080840191909152600160a01b9091046bffffffffffffffffffffffff1660409283015282810151835160009081526005835283812060010180548551818602810186019096528086529596509194909392849084015b828210156118b557838290600052602060002001805461182890614334565b80601f016020809104026020016040519081016040528092919081815260200182805461185490614334565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b505050505081526020019060010190611809565b5050506040850151919250506001600160a01b03166119165760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60005b81518110156119685782828281518110611935576119356144d5565b602002602001015160405160200161194e92919061460b565b60408051601f198184030181529190529250600101611919565b5090949350505050565b600061197d8261336a565b6040516001600160a01b038216815290915082907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516bffffffffffffffffffffffff19606083901b16602082015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f1981840301815290829052611a1f929161436e565b60405180910390a25050565b826000611a378261336a565b90506001600160a01b0381163314611a915760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b847f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528585604051611ac392919061436e565b60405180910390a2603c8403611b1b5760405162461bcd60e51b815260206004820152601660248201527f63616e6e6f7420736574206574682061646472657373000000000000000000006044820152606401610668565b6000611b268661336a565b60008781526007602090815260408083206001600160a01b038516845282528083208984529091529020909150611b5d8582614663565b50505050505050565b6002546040516331a9108f60e11b81526004810187905286916001600160a01b031690636352211e90602401602060405180830381865afa925050508015611bcb575060408051601f3d908101601f19168201909252611bc891810190614550565b60015b611c175760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480611cb7575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015611c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9d919061456d565b8015611cb757506000546001600160a01b03828116911614155b80611d5c57506000546001600160a01b038281169116148015611ce257506001600160a01b03811615155b8015611d5c575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015611d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5c919061456d565b611da85760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000611db487611604565b6001546040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390529192506000916001600160a01b03909116906302571be390602401602060405180830381865afa158015611e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e409190614550565b90506001600160a01b038116301480611e7957506000546001600160a01b038281169116148015611e7957506001600160a01b03811615155b611eeb5760405162461bcd60e51b815260206004820152602560248201527f636f6e74726f6c6c6572206f6620456e73206e6f742073657420746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610668565b81611ef68b8b610ca1565b14611f435760405162461bcd60e51b815260206004820152601260248201527f696e636f7272656374206e616d656861736800000000000000000000000000006044820152606401610668565b60068610611f935760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b85611fe05760405162461bcd60e51b815260206004820152601c60248201527f6e656564206174206c656173742031204e465420636f6e7472616374000000006044820152606401610668565b600186118015611fed5750845b156120605760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008881526005602052604090205460ff16156120bf5760405162461bcd60e51b815260206004820152601760248201527f616c7265616479206265656e20636f6e666967757265640000000000000000006044820152606401610668565b6120c9878761367b565b6040805160808101825260018152861515602082015285151591810191909152606081016120f78b8d614723565b90526000898152600560209081526040918290208351815485840151948601511515620100000262ff0000199515156101000261ff00199315159390931661ffff19909216919091179190911793909316929092178255606083015180516121659260018501920190613b3c565b5050506000888152600660205260409020612181908888613b92565b50604080518615158152851515602082015289917f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a260005b86811015612230578787828181106121dd576121dd6144d5565b90506020020160208101906121f29190613ed7565b6001600160a01b0316897f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae460405160405180910390a36001016121c3565b5050505050505050505050565b336001600160a01b037f000000000000000000000000082fc1776d44f69988c475958a0505a5bc2cd77b16146122b55760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6040517fc47f00270000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000084b1c3c81545d370f3634392de611caabff8148169063c47f00279061231c90859085906004016144a6565b6020604051808303816000875af115801561233b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235f91906147a7565b505050565b60405162461bcd60e51b815260206004820152601860248201527f63616e6e6f7420646f206261746368207472616e7366657200000000000000006044820152600090606401610668565b6040516331a9108f60e11b81526bffffffffffffffffffffffff841660048201528290849033906001600160a01b03841690636352211e90602401602060405180830381865afa158015612407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242b9190614550565b6001600160a01b0316146124815760405162461bcd60e51b815260206004820152601060248201527f6e6f74206f776e6572206f66204e4654000000000000000000000000000000006044820152606401610668565b60008685876040516020016124d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f198184030181529181528151602092830120600081815260099093529120549091501561254a5760405162461bcd60e51b815260206004820181905260248201527f737562646f6d61696e20636c61696d656420666f72207468697320746f6b656e6044820152606401610668565b612554878661372a565b6125a05760405162461bcd60e51b815260206004820152601260248201527f4e6f742076616c696420636f6e747261637400000000000000000000000000006044820152606401610668565b60008781526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156126b157838290600052602060002001805461262490614334565b80601f016020809104026020016040519081016040528092919081815260200182805461265090614334565b801561269d5780601f106126725761010080835404028352916020019161269d565b820191906000526020600020905b81548152906001019060200180831161268057829003601f168201915b505050505081526020019060010190612605565b50505091525050805190915061272f5760405162461bcd60e51b815260206004820152602160248201527f636f6e66696775726174696f6e20666f7220454e53206e6f7420656e61626c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610668565b600061273a89611604565b90506000826020015161274d5786612764565b612764896bffffffffffffffffffffffff16613546565b90506000828260405160200161277a91906147c0565b604051602081830303815290604052805190602001206040516020016127aa929190918252602082015260400190565b60408051601f19818403018152918152815160209283012060008181526004909352912054909150156128455760405162461bcd60e51b815260206004820152602260248201527f537562646f6d61696e2068617320616c7265616479206265656e20636c61696d60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610668565b6001546040517ff79fe538000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f79fe53890602401602060405180830381865afa1580156128a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cb919061456d565b15806128d8575083604001515b61294a5760405162461bcd60e51b815260206004820152602560248201527f6e6f7420616c6c6f7765642070726576696f75736c792075736564207375626460448201527f6f6d61696e0000000000000000000000000000000000000000000000000000006064820152608401610668565b604080516080810182528c815260208082018581526001600160a01b038d16838501526bffffffffffffffffffffffff8e166060840152600085815260049092529290208151815591519091829160018201906129a79082614663565b5060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505060008054906101000a90046001600160a01b03166001600160a01b0316600260009054906101000a90046001600160a01b03166001600160a01b0316636352211e8e6040518263ffffffff1660e01b8152600401612a6f91815260200190565b602060405180830381865afa158015612a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab09190614550565b6001600160a01b031603612b5257600080546040517f24c1af440000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916324c1af4491612b1b91889188913091829190819067ffffffffffffffff906004016147dc565b600060405180830381600087803b158015612b3557600080fd5b505af1158015612b49573d6000803e3d6000fd5b50505050612bfe565b6001546040516001600160a01b0390911690635ef2c7f0908690612b7a9087906020016147c0565b60408051601f198184030181529082905280516020909101206001600160e01b031960e085901b16825260048201929092526024810191909152306044820181905260648201526000608482015260a401600060405180830381600087803b158015612be557600080fd5b505af1158015612bf9573d6000803e3d6000fd5b505050505b60008681526009602052604090819020839055516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2906001600160a01b038d1690636352211e90602401602060405180830381865afa158015612c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca99190614550565b6040516001600160a01b03909116815260200160405180910390a26040516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c906001600160a01b038e1690636352211e90602401602060405180830381865afa158015612d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d619190614550565b604051602001612d89919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052612da4929161436e565b60405180910390a28a6bffffffffffffffffffffffff168a6001600160a01b0316837fd272cd576ecd5a658f613a3d9f818449d49fceff169ccc9d9003fe5b36ca4772612df0866116ea565b604051612dfd9190613f40565b60405180910390a4505050505050505050505050565b60606000612e208461336a565b9050603c8303612e60576040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052915050610a7a565b60008481526007602090815260408083206001600160a01b0385168452825280832086845290915290208054612e9590614334565b80601f0160208091040260200160405190810160405280929190818152602001828054612ec190614334565b8015612f0e5780601f10612ee357610100808354040283529160200191612f0e565b820191906000526020600020905b815481529060010190602001808311612ef157829003601f168201915b505050505091505092915050565b6002546040516331a9108f60e11b81526004810184905283916001600160a01b031690636352211e90602401602060405180830381865afa925050508015612f81575060408051601f3d908101601f19168201909252612f7e91810190614550565b60015b612fcd5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b03811633148061306d575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa15801561302f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613053919061456d565b801561306d57506000546001600160a01b03828116911614155b8061311257506000546001600160a01b03828116911614801561309857506001600160a01b03811615155b8015613112575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa1580156130ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613112919061456d565b61315e5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b50600083815260066020526040902054600581106131be5760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b6000811161320e5760405162461bcd60e51b815260206004820152601260248201527f656e73206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b613218848461372a565b156132655760405162461bcd60e51b815260206004820152601660248201527f6475706c6963617465204e465420636f6e7472616374000000000000000000006044820152606401610668565b600084815260056020526040902054610100900460ff16156132ef5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526006602090815260408083208054600181018255908452918320909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091559051909186917f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae49190a350505050565b60008181526004602090815260408083208151608081019092528054825260018101805485948401919061339d90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546133c990614334565b80156134165780601f106133eb57610100808354040283529160200191613416565b820191906000526020600020905b8154815290600101906020018083116133f957829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036134a35760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b604080820151606083015191516331a9108f60e11b81526bffffffffffffffffffffffff90921660048301526000916001600160a01b0390911690636352211e90602401602060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135289190614550565b949350505050565b6060610a7a6001600160a01b03831660146137ec565b60608160000361358957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156135b3578061359d81614853565b91506135ac9050600a83614883565b915061358d565b60008167ffffffffffffffff8111156135ce576135ce613f53565b6040519080825280601f01601f1916602001820160405280156135f8576020820181803683370190505b5090505b84156135285761360d600183614897565b915061361a600a866148aa565b6136259060306148be565b60f81b81838151811061363a5761363a6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613674600a86614883565b94506135fc565b60005b8181101561235f576136d683838381811061369b5761369b6144d5565b90506020020160208101906136b09190613ed7565b7f80ac58cd00000000000000000000000000000000000000000000000000000000613a15565b6137225760405162461bcd60e51b815260206004820152601c60248201527f6e65656420746f206265204945524337323120636f6e747261637473000000006044820152606401610668565b60010161367e565b60008281526006602090815260408083208054825181850281018501909352808352849383018282801561378757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613769575b505083519394506000925050505b818110156137e357846001600160a01b03168382815181106137b9576137b96144d5565b60200260200101516001600160a01b0316036137db5760019350505050610a7a565b600101613795565b50505092915050565b606060006137fb8360026148d1565b6138069060026148be565b67ffffffffffffffff81111561381e5761381e613f53565b6040519080825280601f01601f191660200182016040528015613848576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061387f5761387f6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138e2576138e26144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061391e8460026148d1565b6139299060016148be565b90505b60018111156139c6577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061396a5761396a6144d5565b1a60f81b828281518110613980576139806144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936139bf816148f0565b905061392c565b5083156115fd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610668565b6000613a2083613a31565b80156115fd57506115fd8383613a64565b6000613a44826301ffc9a760e01b613a64565b8015610a7a5750613a5d826001600160e01b0319613a64565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613aeb575060208210155b8015613af75750600081115b979650505050505050565b508054613b0e90614334565b6000825580601f10613b1e575050565b601f0160209004906000526020600020908101906113399190613bfa565b828054828255906000526020600020908101928215613b82579160200282015b82811115613b825782518290613b729082614663565b5091602001919060010190613b5c565b50613b8e929150613c0f565b5090565b828054828255906000526020600020908101928215613bf2579160200282015b82811115613bf257815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190613bb2565b50613b8e9291505b5b80821115613b8e5760008155600101613bfb565b80821115613b8e576000613c238282613b02565b50600101613c0f565b600060208284031215613c3e57600080fd5b5035919050565b600060208284031215613c5757600080fd5b81356001600160e01b0319811681146115fd57600080fd5b60005b83811015613c8a578181015183820152602001613c72565b50506000910152565b60008151808452613cab816020860160208601613c6f565b601f01601f19169290920160200192915050565b848152608060208201526000613cd86080830186613c93565b90506001600160a01b03841660408301526bffffffffffffffffffffffff8316606083015295945050505050565b60008083601f840112613d1857600080fd5b50813567ffffffffffffffff811115613d3057600080fd5b602083019150836020828501011115613d4857600080fd5b9250929050565b600080600080600060608688031215613d6757600080fd5b85359450602086013567ffffffffffffffff80821115613d8657600080fd5b613d9289838a01613d06565b90965094506040880135915080821115613dab57600080fd5b50613db888828901613d06565b969995985093965092949392505050565b60008060408385031215613ddc57600080fd5b50508035926020909101359150565b60008083601f840112613dfd57600080fd5b50813567ffffffffffffffff811115613e1557600080fd5b6020830191508360208260051b8501011115613d4857600080fd5b60008060208385031215613e4357600080fd5b823567ffffffffffffffff811115613e5a57600080fd5b613e6685828601613deb565b90969095509350505050565b801515811461133957600080fd5b600080600060608486031215613e9557600080fd5b833592506020840135613ea781613e72565b91506040840135613eb781613e72565b809150509250925092565b6001600160a01b038116811461133957600080fd5b600060208284031215613ee957600080fd5b81356115fd81613ec2565b600080600060408486031215613f0957600080fd5b83359250602084013567ffffffffffffffff811115613f2757600080fd5b613f3386828701613d06565b9497909650939450505050565b6020815260006115fd6020830184613c93565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f9257613f92613f53565b604052919050565b600067ffffffffffffffff831115613fb457613fb4613f53565b613fc76020601f19601f86011601613f69565b9050828152838383011115613fdb57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561400757600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561402c57600080fd5b8401601f8101861361403d57600080fd5b61404c86823560208401613f9a565b9150509250925092565b600080600080600080600060a0888a03121561407157600080fd5b873567ffffffffffffffff8082111561408957600080fd5b6140958b838c01613deb565b909950975060208a0135965060408a01359150808211156140b557600080fd5b506140c28a828b01613deb565b90955093505060608801356140d681613e72565b915060808801356140e681613e72565b8091505092959891949750929550565b6000806020838503121561410957600080fd5b823567ffffffffffffffff81111561412057600080fd5b613e6685828601613d06565b60008060008060008060008060a0898b03121561414857600080fd5b883561415381613ec2565b9750602089013561416381613ec2565b9650604089013567ffffffffffffffff8082111561418057600080fd5b61418c8c838d01613deb565b909850965060608b01359150808211156141a557600080fd5b6141b18c838d01613deb565b909650945060808b01359150808211156141ca57600080fd5b506141d78b828c01613d06565b999c989b5096995094979396929594505050565b600082601f8301126141fc57600080fd5b6115fd83833560208501613f9a565b6000806000806080858703121561422157600080fd5b8435935060208501356bffffffffffffffffffffffff8116811461424457600080fd5b9250604085013561425481613ec2565b9150606085013567ffffffffffffffff81111561427057600080fd5b61427c878288016141eb565b91505092959194509250565b60008060008060008060a087890312156142a157600080fd5b86356142ac81613ec2565b955060208701356142bc81613ec2565b94506040870135935060608701359250608087013567ffffffffffffffff8111156142e657600080fd5b6142f289828a01613d06565b979a9699509497509295939492505050565b6000806040838503121561431757600080fd5b82359150602083013561432981613ec2565b809150509250929050565b600181811c9082168061434857607f821691505b60208210810361436857634e487b7160e01b600052602260045260246000fd5b50919050565b8281526040602082015260006135286040830184613c93565b8183823760009101908152919050565b601f82111561235f57600081815260208120601f850160051c810160208610156143be5750805b601f850160051c820191505b818110156143dd578281556001016143ca565b505050505050565b67ffffffffffffffff8311156143fd576143fd613f53565b6144118361440b8354614334565b83614397565b6000601f841160018114614445576000851561442d5750838201355b600019600387901b1c1916600186901b17835561449f565b600083815260209020601f19861690835b828110156144765786850135825560209485019460019092019101614456565b50868210156144935760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261452057600080fd5b83018035915067ffffffffffffffff82111561453b57600080fd5b602001915036819003821315613d4857600080fd5b60006020828403121561456257600080fd5b81516115fd81613ec2565b60006020828403121561457f57600080fd5b81516115fd81613e72565b7f6569703135353a312f6572633732313a000000000000000000000000000000008152600083516145c2816010850160208801613c6f565b7f2f0000000000000000000000000000000000000000000000000000000000000060109184019182015283516145ff816011840160208801613c6f565b01601101949350505050565b6000835161461d818460208801613c6f565b7f2e000000000000000000000000000000000000000000000000000000000000009083019081528351614657816001840160208801613c6f565b01600101949350505050565b815167ffffffffffffffff81111561467d5761467d613f53565b6146918161468b8454614334565b84614397565b602080601f8311600181146146c657600084156146ae5750858301515b600019600386901b1c1916600185901b1785556143dd565b600085815260208120601f198616915b828110156146f5578886015182559484019460019091019084016146d6565b50858210156147135787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600067ffffffffffffffff8084111561473e5761473e613f53565b8360051b602061474f818301613f69565b86815291850191818101903684111561476757600080fd5b865b8481101561479b578035868111156147815760008081fd5b61478d36828b016141eb565b845250918301918301614769565b50979650505050505050565b6000602082840312156147b957600080fd5b5051919050565b600082516147d2818460208701613c6f565b9190910192915050565b87815260e0602082015260006147f560e0830189613c93565b6001600160a01b03978816604084015295909616606082015267ffffffffffffffff938416608082015263ffffffff9290921660a083015290911660c0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b600060001982036148665761486661483d565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826148925761489261486d565b500490565b81810381811115610a7a57610a7a61483d565b6000826148b9576148b961486d565b500690565b80820180821115610a7a57610a7a61483d565b60008160001904831182151516156148eb576148eb61483d565b500290565b6000816148ff576148ff61483d565b50600019019056fea264697066735822122037579578826abdbb54585150f526ef108409f434a19709ee6e525f4001e4631064736f6c63430008100033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.