diff --git a/contracts/.openzeppelin/polygon-mumbai.json b/contracts/.openzeppelin/polygon-mumbai.json index 83aaf1c..6ed12b8 100644 --- a/contracts/.openzeppelin/polygon-mumbai.json +++ b/contracts/.openzeppelin/polygon-mumbai.json @@ -34,6 +34,11 @@ "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", "txHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", "kind": "transparent" + }, + { + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "txHash": "0x808546aa8bbc4e36c54d955970d8cfe8c4dc925eb5f65ff7b25203dd312bad4c", + "kind": "transparent" } ], "impls": { @@ -6988,6 +6993,458 @@ } } } + }, + "eb08503319f5be721686b3aa1a477f4936b7bd581264aec1f5567149b8e15ff5": { + "address": "0xc1eEFa5035898B7D33572397A263D262b449886D", + "txHash": "0x61f5b9f485cf414e467dfd2077cbe785412639c51c7631f34628d5a43f8c371e", + "layout": { + "solcVersion": "0.8.12", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:514" + }, + { + "label": "_collectionRolesCounter", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_enum(CollectionRoles)3829,t_uint256)", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:57" + }, + { + "label": "_collectionRoles", + "offset": 0, + "slot": "152", + "type": "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:62" + }, + { + "label": "_tokenRolesVersion", + "offset": 0, + "slot": "153", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:69" + }, + { + "label": "_tokenRoles", + "offset": 0, + "slot": "154", + "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))))", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:74" + }, + { + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:176" + }, + { + "label": "_paused", + "offset": 0, + "slot": "204", + "type": "t_bool", + "contract": "FleekPausable", + "src": "contracts/FleekPausable.sol:23" + }, + { + "label": "_canPause", + "offset": 1, + "slot": "204", + "type": "t_bool", + "contract": "FleekPausable", + "src": "contracts/FleekPausable.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "205", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekPausable", + "src": "contracts/FleekPausable.sol:133" + }, + { + "label": "_billings", + "offset": 0, + "slot": "254", + "type": "t_mapping(t_enum(Billing)4234,t_uint256)", + "contract": "FleekBilling", + "src": "contracts/FleekBilling.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "255", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekBilling", + "src": "contracts/FleekBilling.sol:81" + }, + { + "label": "_appIds", + "offset": 0, + "slot": "304", + "type": "t_uint256", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:119" + }, + { + "label": "_apps", + "offset": 0, + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(App)4585_storage)", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:120" + }, + { + "label": "_accessPoints", + "offset": 0, + "slot": "306", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:121" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_enum(AccessPointCreationStatus)4595": { + "label": "enum FleekERC721.AccessPointCreationStatus", + "members": [ + "DRAFT", + "APPROVED", + "REJECTED", + "REMOVED" + ], + "numberOfBytes": "1" + }, + "t_enum(Billing)4234": { + "label": "enum FleekBilling.Billing", + "members": [ + "Mint", + "AddAccessPoint" + ], + "numberOfBytes": "1" + }, + "t_enum(CollectionRoles)3829": { + "label": "enum FleekAccessControl.CollectionRoles", + "members": [ + "Owner" + ], + "numberOfBytes": "1" + }, + "t_enum(TokenRoles)3831": { + "label": "enum FleekAccessControl.TokenRoles", + "members": [ + "Controller" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(Billing)4234,t_uint256)": { + "label": "mapping(enum FleekBilling.Billing => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { + "label": "mapping(enum FleekAccessControl.CollectionRoles => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(CollectionRoles)3829,t_uint256)": { + "label": "mapping(enum FleekAccessControl.CollectionRoles => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))": { + "label": "mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)": { + "label": "mapping(string => struct FleekERC721.AccessPoint)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))": { + "label": "mapping(uint256 => mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool)))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))))": { + "label": "mapping(uint256 => mapping(uint256 => mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool))))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(App)4585_storage)": { + "label": "mapping(uint256 => struct FleekERC721.App)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Build)4590_storage)": { + "label": "mapping(uint256 => struct FleekERC721.Build)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(AccessPoint)4609_storage": { + "label": "struct FleekERC721.AccessPoint", + "members": [ + { + "label": "tokenId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "score", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "contentVerified", + "type": "t_bool", + "offset": 0, + "slot": "2" + }, + { + "label": "nameVerified", + "type": "t_bool", + "offset": 1, + "slot": "2" + }, + { + "label": "owner", + "type": "t_address", + "offset": 2, + "slot": "2" + }, + { + "label": "status", + "type": "t_enum(AccessPointCreationStatus)4595", + "offset": 22, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(App)4585_storage": { + "label": "struct FleekERC721.App", + "members": [ + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "description", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "externalURL", + "type": "t_string_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "ENS", + "type": "t_string_storage", + "offset": 0, + "slot": "3" + }, + { + "label": "currentBuild", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "builds", + "type": "t_mapping(t_uint256,t_struct(Build)4590_storage)", + "offset": 0, + "slot": "5" + }, + { + "label": "logo", + "type": "t_string_storage", + "offset": 0, + "slot": "6" + }, + { + "label": "color", + "type": "t_uint24", + "offset": 0, + "slot": "7" + }, + { + "label": "accessPointAutoApproval", + "type": "t_bool", + "offset": 3, + "slot": "7" + } + ], + "numberOfBytes": "256" + }, + "t_struct(Build)4590_storage": { + "label": "struct FleekERC721.Build", + "members": [ + { + "label": "commitHash", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "gitRepository", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint24": { + "label": "uint24", + "numberOfBytes": "3" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/contracts/deployments/mumbai/FleekERC721.json b/contracts/deployments/mumbai/FleekERC721.json index aac2266..8343ab7 100644 --- a/contracts/deployments/mumbai/FleekERC721.json +++ b/contracts/deployments/mumbai/FleekERC721.json @@ -1,9 +1,29 @@ { - "timestamp": "2/24/2023, 5:28:44 PM", - "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", - "transactionHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", - "gasPrice": 2500000019, + "timestamp": "3/3/2023, 4:43:25 PM", + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "transactionHash": "0x808546aa8bbc4e36c54d955970d8cfe8c4dc925eb5f65ff7b25203dd312bad4c", + "gasPrice": 1675244309, "abi": [ + { + "inputs": [], + "name": "AccessPointAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointCreationStatusAlreadySet", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointNotExistent", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointScoreCannotBeLower", + "type": "error" + }, { "inputs": [], "name": "ContractIsNotPausable", @@ -19,6 +39,16 @@ "name": "ContractIsPaused", "type": "error" }, + { + "inputs": [], + "name": "InvalidTokenIdForAccessPoint", + "type": "error" + }, + { + "inputs": [], + "name": "MustBeAccessPointOwner", + "type": "error" + }, { "inputs": [ { @@ -73,6 +103,17 @@ "name": "PausableIsSetTo", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requiredValue", + "type": "uint256" + } + ], + "name": "RequiredPayment", + "type": "error" + }, { "inputs": [], "name": "RoleAlreadySet", @@ -133,6 +174,25 @@ "name": "ApprovalForAll", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BillingChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -673,6 +733,44 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "byAddress", + "type": "address" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "", + "type": "uint8" + } + ], + "name": "_billings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -792,6 +890,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + } + ], + "name": "getBilling", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastTokenId", @@ -972,6 +1089,11 @@ "internalType": "string", "name": "_symbol", "type": "string" + }, + { + "internalType": "uint256[]", + "name": "initialBillings", + "type": "uint256[]" } ], "name": "initialize", @@ -1351,6 +1473,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "setBilling", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1598,10 +1738,17 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x6080806040523461001657615126908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb146107c857806301ffc9a7146107ac57806306fdde0314610790578063081812fc14610774578063095ea7b31461075c57806323b872dd14610744578063246a908b1461072c57806327dc5cec146107105780632d957aad146106f85780633806f152146106e05780633f4ba83a146106c957806342842e0e146106b157806342966c681461069a57806342e44bbf146106825780634cd88b761461066a5780635aa6ab3b146106525780636352211e1461061d57806370a0823114610601578063736d323a146105ea5780637469a03b146105d357806378278cca146105bb57806383c4c00d1461059f5780638456cb59146105885780638a2e25be146105705780638b9ec9771461053d5780638c3c0a441461052557806394ec65c51461050e57806395d89b41146104f2578063a09a1601146104c2578063a22cb465146104aa578063a27d0b2714610492578063a397c8301461047b578063aad045a214610463578063b187bd2614610437578063b20b94f11461041f578063b30437a01461040c578063b42dbe38146103ac578063b88d4fde14610391578063b948a3c514610379578063c87b56dd14610352578063cdb0e89e1461033a578063d7a75be11461031e578063e4b50cb8146102ee578063e9447250146102ca578063e985e9c51461025d578063eb5fd26b146102455763f931517714610227575061000f565b346102415761023e61023836610a78565b90612ce9565b51f35b5080fd5b50346102415761023e61025736610f27565b906134a5565b5034610241576102c691506102b56102ae61029761027a36610ef4565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b5034610241576102c691506102b56102ae6102976102e736610ad1565b9190611a3e565b5034610241576102c6915061030a610305366108ec565b612a20565b949795969390939291925197889788610e84565b5034610241576102c691506102b561033536610aa7565b613eba565b50346102415761023e61034c36610a78565b9061303b565b5034610241576102c6915061036e610369366108ec565b6125ab565b9051918291826108db565b50346102415761023e61038b36610a78565b9061332d565b50346102415761023e6103a336610e14565b92919091611567565b5034610241576102c691506102b56102ae6104076102976103cc36610808565b9390916103f86103e6826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611a70565b5061023e61041936610a78565b906136c3565b50346102415761023e61043136610b58565b9061401b565b5034610241576102c6915061044b36610873565b60cc54905160ff909116151581529081906020820190565b50346102415761023e61047536610df4565b90612c06565b50346102415761023e61048d36610aa7565b613f8a565b50346102415761023e6104a436610808565b916145b8565b50346102415761023e6104bc36610dc3565b906113b3565b5034610241576102c691506104d636610873565b60cc54905160089190911c60ff16151581529081906020820190565b5034610241576102c6915061050636610873565b61036e6111b6565b50346102415761023e61052036610aa7565b613ee7565b50346102415761023e61053736610ad1565b906146c7565b506102c6915061056161054f36610cac565b98979097969196959295949394612139565b90519081529081906020820190565b50346102415761023e61058236610c6c565b916139cd565b50346102415761059736610873565b61023e614875565b5034610241576102c691506105b336610873565b610561612aeb565b50346102415761023e6105cd36610a78565b90612ec4565b50346102415761023e6105e536610aa7565b613ba6565b50346102415761023e6105fc36610c50565b61493e565b5034610241576102c6915061056161061836610c2d565b610f4a565b5034610241576102c69150610639610634366108ec565b611010565b90516001600160a01b0390911681529081906020820190565b50346102415761023e61066436610bea565b91613561565b50346102415761023e61067c36610b93565b90611a88565b50346102415761023e61069436610b58565b906140bf565b50346102415761023e6106ac366108ec565b6142c4565b50346102415761023e6106c336610925565b9161152d565b5034610241576106d836610873565b61023e6148e1565b50346102415761023e6106f236610b01565b91614158565b50346102415761023e61070a36610ad1565b906144c9565b5034610241576102c6915061036e61072736610aa7565b613d0f565b50346102415761023e61073e36610a78565b906131b0565b50346102415761023e61075636610925565b916114df565b50346102415761023e61076e366108fe565b9061124f565b5034610241576102c6915061063961078b366108ec565b611375565b5034610241576102c691506107a436610873565b61036e6110ff565b5034610241576102c691506102b56107c336610858565b612b17565b50346102415761023e6107da36610808565b916147ac565b6001111561000f57565b600435906001600160a01b03821682141561080157565b5050600080fd5b606090600319011261000f5760043590602435610824816107e0565b906044356001600160a01b03811681141561083c5790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f5760043561087081610845565b90565b600090600319011261000f57565b918091926000905b8282106108a157501161089a575050565b6000910152565b91508060209183015181860152018291610889565b906020916108cf81518092818552858086019101610881565b601f01601f1916010190565b9060206108709281815201906108b6565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610801579060243590565b606090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761099657604052565b61099e610964565b604052565b90601f801991011681019081106001600160401b0382111761099657604052565b604051906109d18261097b565b565b6040519060c082018281106001600160401b0382111761099657604052565b6020906001600160401b038111610a0f575b601f01601f19160190565b610a17610964565b610a04565b929192610a28826109f2565b91610a3660405193846109a3565b829481845281830111610a53578281602093846000960137010152565b5050505050600080fd5b9080601f8301121561095c5781602061087093359101610a1c565b9060406003198301126108015760043591602435906001600160401b03821161083c5761087091600401610a5d565b602060031982011261080157600435906001600160401b03821161095c5761087091600401610a5d565b604090600319011261000f57600435610ae9816107e0565b906024356001600160a01b03811681141561095c5790565b606060031982011261080157600435916001600160401b03602435818111610a535783610b3091600401610a5d565b92604435918211610a535761087091600401610a5d565b610124359081151582141561080157565b604060031982011261080157600435906001600160401b03821161095c57610b8291600401610a5d565b9060243580151581141561095c5790565b906040600319830112610801576001600160401b0360043581811161083c5783610bbf91600401610a5d565b9260243591821161083c5761087091600401610a5d565b610104359062ffffff821682141561080157565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c1991600401610a5d565b9060443562ffffff811681141561083c5790565b602090600319011261000f576004356001600160a01b0381168114156108015790565b602090600319011261000f576004358015158114156108015790565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c9b91600401610a5d565b9060443580151581141561083c5790565b61014060031982011261080157610cc16107ea565b916001600160401b0390602435828111610a5357610ce3846004928301610a5d565b93604435848111610db75781610cfa918401610a5d565b93606435818111610daa5782610d11918501610a5d565b93608435828111610d9c5783610d28918601610a5d565b9360a435838111610d8d5784610d3f918301610a5d565b9360c435848111610d7d5781610d56918401610a5d565b9360e435908111610d7d57610d6b9201610a5d565b90610d74610bd6565b90610870610b47565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b038116811415610801579060243580151581141561095c5790565b604090600319011261000f576004359060243580151581141561095c5790565b906080600319830112610801576001600160a01b039160043583811681141561083c579260243590811681141561083c579160443591606435906001600160401b038211610e795780602383011215610e795781602461087093600401359101610a1c565b505050505050600080fd5b959062ffffff94610ecc610eed95610ebe60c09996610eb0610eda969d9e9d60e08e81815201906108b6565b8c810360208e0152906108b6565b908a820360408c01526108b6565b9088820360608a01526108b6565b91608087015285820360a08701526108b6565b9416910152565b604090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c5790565b604090600319011261000f576004359060243562ffffff811681141561095c5790565b6001600160a01b03168015610f6a57600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b15610fca57565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b0316610870811515610fc3565b90600182811c92168015611065575b602083101461104d57565b5050634e487b7160e01b600052602260045260246000fd5b91607f1691611042565b906000929180549161108083611033565b9182825260019384811690816000146110e257506001146110a2575b50505050565b90919394506000526020928360002092846000945b8386106110ce57505050500101903880808061109c565b8054858701830152940193859082016110b7565b60ff1916602084015250506040019350389150819050808061109c565b604051906000826065549161111383611033565b80835292600190818116908115611199575060011461113a575b506109d1925003836109a3565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b84831061117e57506109d193505081016020013861112d565b81935090816020925483858a01015201910190918592611165565b94505050505060ff191660208301526109d182604081013861112d565b60405190600082606654916111ca83611033565b8083529260019081811690811561119957506001146111f057506109d1925003836109a3565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b84831061123457506109d193505081016020013861112d565b81935090816020925483858a0101520191019091859261121b565b9061125981611010565b6001600160a01b0381811690841681146113225733149081156112f4575b5015611286576109d191611851565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff915061131a903390610297565b541638611277565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611398906001600160a01b03161515610fc3565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b038116919033831461143457816113f36114049233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b1561148357565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b906109d192916114f76114f28433611603565b61147c565b6116d6565b60405190602082018281106001600160401b03821117611520575b60405260008252565b611528610964565b611517565b90916109d19260405192602084018481106001600160401b0382111761155a575b60405260008452611567565b611562610964565b61154e565b9061158b93929161157b6114f28433611603565b6115868383836116d6565b61195d565b1561159257565b5060405162461bcd60e51b8152806115ac600482016115b0565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b038061161584611010565b16928183169284841494851561164b575b50508315611635575b50505090565b61164191929350611375565b161438808061162f565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611626565b1561168257565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b6116fa906116e384611010565b6001600160a01b038281169390918216841461167b565b83169283156117fb576117788261171587846117d296612b5b565b611737856117316117258a611010565b6001600160a01b031690565b1461167b565b61175e61174e886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b0381166000908152606860205260409020600181540190556117b3856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b038061188a84611010565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b6000908152606760205260409020546109d1906001600160a01b03161515610fc3565b90816020910312610801575161087081610845565b6001600160a01b039182168152911660208201526040810191909152608060608201819052610870929101906108b6565b506040513d6000823e3d90fd5b3d15611958573d9061193e826109f2565b9161194c60405193846109a3565b82523d6000602084013e565b606090565b92909190823b15611a0c57611990926020926000604051809681958294630a85bd0160e11b9a8b855233600486016118ef565b03926001600160a01b03165af1600091816119ec575b506119de575050506119b661192d565b805190816119d957505060405162461bcd60e51b8152806115ac600482016115b0565b602001fd5b6001600160e01b0319161490565b611a059192506119fc3d826109a3565b3d8101906118da565b90386119a6565b50505050600190565b50634e487b7160e01b600052602160045260246000fd5b60011115611a3657565b6109d1611a15565b611a4781611a2c565b6000526098602052604060002090565b611a6081611a2c565b6000526097602052604060002090565b90611a7a81611a2c565b600052602052604060002090565b6000549160ff8360081c161580938194611ba7575b8115611b87575b5015611b2857611aca9183611ac1600160ff196000541617600055565b611b0f57611bb5565b611ad057565b611ae061ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611b2361010061ff00196000541617600055565b611bb5565b50505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611b99575b5038611aa4565b6001915060ff161438611b92565b600160ff8216109150611a9d565b90611bd060ff60005460081c16611bcb81611cf1565b611cf1565b81516001600160401b038111611ce4575b611bf581611bf0606554611033565b611d69565b602080601f8311600114611c5157508190611c2c94600092611c46575b50508160011b916000199060031b1c191617606555611e5a565b611c3461202d565b611c3e600060fe55565b6109d16149b4565b015190503880611c12565b919293601f198416611c8560656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b936000905b828210611ccc575050916001939185611c2c97969410611cb3575b505050811b01606555611e5a565b015160001960f88460031b161c19169055388080611ca5565b80600186978294978701518155019601940190611c8a565b611cec610964565b611be1565b15611cf857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611d5d575050565b60008155600101611d52565b90601f8211611d76575050565b6109d19160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611dc0575b601f0160051c0190611d52565b9091508190611db3565b90601f8211611dd7575050565b6109d19160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611dc057601f0160051c0190611d52565b9190601f8111611e2f57505050565b6109d1926000526020600020906020601f840160051c83019310611dc057601f0160051c0190611d52565b9081516001600160401b038111611f44575b611e8081611e7b606654611033565b611dca565b602080601f8311600114611ebc5750819293600092611eb1575b50508160011b916000199060031b1c191617606655565b015190503880611e9a565b90601f19831694611eef60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b878210611f2c575050836001959610611f13575b505050811b01606655565b015160001960f88460031b161c19169055388080611f08565b80600185968294968601518155019501930190611ef4565b611f4c610964565b611e6c565b91909182516001600160401b038111612020575b611f7981611f738454611033565b84611e20565b602080601f8311600114611fb5575081929394600092611faa575b50508160011b916000199060031b1c1916179055565b015190503880611f94565b90601f19831695611fcb85600052602060002090565b926000905b88821061200857505083600195969710611fef575b505050811b019055565b015160001960f88460031b161c19169055388080611fe5565b80600185968294968601518155019501930190611fd0565b612028610964565b611f65565b600061203f60ff825460081c16611cf1565b808052609860209081526040808320336000908152925290205460ff166120e2578080526098602090815260408083203360009081529252902061208b905b805460ff19166001179055565b8080526097602052604081206120a1815461210d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161211d570190565b6121256120f6565b0190565b600290600219811161211d570190565b9394959891969790929761214b612545565b60fe54998a9761215b898861243a565b60fe546121679061210d565b60fe5561217e8960005260ff602052604060002090565b6121888782611f51565b6121958b60018301611f51565b6121a28c60028301611f51565b6121af8960038301611f51565b6121bc8460068301611f51565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff881617179055600060048201556121f06109c4565b908282528360208301526005016122109060008052602052604060002090565b9061221a9161225e565b604051978897600160a01b60019003169b339b612237988a612355565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b038111612348575b612287816122818654611033565b86611e20565b6020928390601f83116001146122d3579180600194926109d19796946000926122c8575b5050600019600383901b1c191690841b1784555b01519101611f51565b0151905038806122ab565b90601f198316916122e987600052602060002090565b9260005b818110612331575092600195939285926109d1999896889510612318575b505050811b0184556122bf565b015160001960f88460031b161c1916905538808061230b565b9293876001819287860151815501950193016122ed565b612350610964565b612273565b979998959062ffffff956123b56123df966123a78c6101009c986123996123d19961238b6123c3996101208087528601906108b6565b9084820360208601526108b6565b9160408184039101526108b6565b8c810360608e0152906108b6565b908a820360808c01526108b6565b9088820360a08a01526108b6565b9086820360c08801526108b6565b951660e08401521515910152565b156123f457565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156124fd576000838152606760205260409020546124d39190612475906001600160a01b031615155b156123ed565b61247d6149d6565b6000848152606760205260409020546124a0906001600160a01b0316151561246f565b6001600160a01b0381166000908152606860205260409020600181540190556117b3846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561257e57565b5060405163070198dd60e51b815260006004820152602490fd5b9061212560209282815194859201610881565b6000818152606760205260409020546125ce906001600160a01b03161515610fc3565b6125d781611010565b9060005260ff602052604060002061262d604051926125f58461097b565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b0316614ec1565b61266f6003830160078401600061264f61264a835462ffffff1690565b614fbc565b6040518095819263891c235f60e01b835260068a01878b60048601614bf7565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612a13575b6000936129f0575b5054908160181c60ff166126ab90614f76565b906005860190600487015492826126cd85809590600052602052604060002090565b936126e19190600052602052604060002090565b600101936126ee90614cbb565b9462ffffff166126fd90614fbc565b604051607b60f81b602082015267113730b6b2911d1160c11b602182015298899891979161272e60298b0183614c3f565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f0161275e9060018401614c3f565b61088b60f21b8152600201681137bbb732b9111d1160b91b815260090161278491612598565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b81526010016127b491600201614c3f565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b81526009016127da91612598565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d0161281491612598565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f0161286591614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b60208201526027016128b091614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b60208201526026016128fa91614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b602082015260230161294191612598565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b602082015260210161298691612598565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f199182810182526129ba90826109a3565b6129c390614abe565b91604051928391602083016129d791612598565b6129e091612598565b03908101825261087090826109a3565b612a0c91933d90823e612a033d826109a3565b3d810190614b99565b9138612698565b612a1b611920565b612690565b600081815260676020526040902054612a43906001600160a01b03161515610fc3565b60005260ff60205260409081600020600481015462ffffff600783015416938051612a7981612a72818761106f565b03826109a3565b948151612a8d81612a72816001890161106f565b946006612aca8451612aa681612a728160028c0161106f565b96612a728651612abd81612a72816003870161106f565b979651809481930161106f565b9190565b60018110612ade575b6000190190565b612ae66120f6565b612ad7565b60fe548015612b035760018110612ade576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612b4a575b8115612b3c575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612b32565b90612b646149d6565b6001600160a01b0391821615158080612ba4575b15612b89575050506109d190612baf565b612b9257505050565b1615612b9b5750565b6109d190612baf565b508282161515612b78565b80600052609960205260406000206001815481198111612bf9575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612c016120f6565b612bca565b612c0f81611010565b6001600160a01b0316331415612cce57600081815260676020526040902054612c42906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612cf281611010565b6001600160a01b0316331415612e27575b600081815260676020526040902054612d26906001600160a01b03161515610fc3565b80600052602060ff8152600260406000200190835180916001600160401b038211612e1a575b612d5a826122818654611033565b80601f8311600114612dac5750600091612da1575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582612e35565b905084015138612d6f565b9150601f198316612dc285600052602060002090565b926000905b828210612e025750509083600194939210612de9575b5050811b019055612d83565b86015160001960f88460031b161c191690553880612ddd565b80600185968294968c01518155019501930190612dc7565b612e22610964565b612d4c565b612e3081612e68565b612d03565b9060806108709260408152600b60408201526a195e1d195c9b985b15549360aa1b606082015281602082015201906108b6565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615612ea6575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b612ecd81611010565b6001600160a01b0316331415613002575b600081815260676020526040902054612f01906001600160a01b03161515610fc3565b80600052602060ff8152600360406000200190835180916001600160401b038211612ff5575b612f35826122818654611033565b80601f8311600114612f875750600091612f7c575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613010565b905084015138612f4a565b9150601f198316612f9d85600052602060002090565b926000905b828210612fdd5750509083600194939210612fc4575b5050811b019055612f5e565b86015160001960f88460031b161c191690553880612fb8565b80600185968294968c01518155019501930190612fa2565b612ffd610964565b612f27565b61300b81612e68565b612ede565b90608061087092604081526003604082015262454e5360e81b606082015281602082015201906108b6565b61304481611010565b6001600160a01b0316331415613176575b600081815260676020526040902054613078906001600160a01b03161515610fc3565b80600052602060ff8152604060002090835180916001600160401b038211613169575b6130a9826122818654611033565b80601f83116001146130fb57506000916130f0575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613184565b9050840151386130be565b9150601f19831661311185600052602060002090565b926000905b8282106131515750509083600194939210613138575b5050811b0190556130d2565b86015160001960f88460031b161c19169055388061312c565b80600185968294968c01518155019501930190613116565b613171610964565b61309b565b61317f81612e68565b613055565b906080610870926040815260046040820152636e616d6560e01b606082015281602082015201906108b6565b6131b981611010565b6001600160a01b03163314156132ec575b6000818152606760205260409020546131ed906001600160a01b03161515610fc3565b80600052602060ff8152600180604060002001918451906001600160401b0382116132df575b613221826122818654611033565b80601f8311600114613274575081928291600093613269575b501b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd3395826132fa565b87015192503861323a565b9082601f19811661328a87600052602060002090565b936000905b878383106132c557505050106132ac575b5050811b01905561324b565b86015160001960f88460031b161c1916905538806132a0565b8b860151875590950194938401938693509081019061328f565b6132e7610964565b613213565b6132f581612e68565b6131ca565b9060806108709260408152600b60408201526a3232b9b1b934b83a34b7b760a91b606082015281602082015201906108b6565b61333681611010565b6001600160a01b031633141561346b575b60008181526067602052604090205461336a906001600160a01b03161515610fc3565b80600052602060ff8152600660406000200190835180916001600160401b03821161345e575b61339e826122818654611033565b80601f83116001146133f057506000916133e5575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613479565b9050840151386133b3565b9150601f19831661340685600052602060002090565b926000905b828210613446575050908360019493921061342d575b5050811b0190556133c7565b86015160001960f88460031b161c191690553880613421565b80600185968294968c0151815501950193019061340b565b613466610964565b613390565b61347481612e68565b613347565b906080610870926040815260046040820152636c6f676f60e01b606082015281602082015201906108b6565b6134ae81611010565b6001600160a01b0316331415613553575b6000818152606760205260409020546134e2906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b61355c81612e68565b6134bf565b9291909261356e81611010565b6001600160a01b03163314156136b5575b6000818152606760205260409020546135a2906001600160a01b03161515610fc3565b8060005260209360ff855260066040600020018151956001600160401b0387116136a8575b6135d587611f738454611033565b80601f8811600114613637575095806109d1969760009161362c575b508160011b916000199060031b1c19161790555b816000805160206150c383398151915260405180613624339582613479565b0390a36134a5565b9050830151386135f1565b90601f19881661364c84600052602060002090565b926000905b8282106136905750509188916109d1989960019410613677575b5050811b019055613605565b85015160001960f88460031b161c19169055388061366b565b80600185968294968a01518155019501930190613651565b6136b0610964565b6135c7565b6136be81612e68565b61357f565b7fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8906136ed6149d6565b6136f6816118b7565b6137276001600160a01b03613720600261370f87613825565b015460101c6001600160a01b031690565b161561384c565b604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca233928061375988826108db565b0390a361378060076137758360005260ff602052604060002090565b015460181c60ff1690565b156137da576137d5906137c76137946109d3565b828152600060208201819052604082018190526060820152336080820152600160a08201526137c286613825565b6138a3565b60405191829133958361397f565b0390a2565b6137d5906138176137e96109d3565b828152600060208201819052604082018190526060820152336080820152600060a08201526137c286613825565b60405191829133958361395b565b602061383e918160405193828580945193849201610881565b810161010081520301902090565b1561385357565b5060405162461bcd60e51b815260206004820152601e60248201527f466c65656b4552433732313a20415020616c72656164792065786973747300006044820152606490fd5b60041115611a3657565b600290825181556020830151600182015501906138d260408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a09092015161392481613899565b600481101561394e575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613956611a15565b61392e565b6040906139756000939594956060835260608301906108b6565b9460208201520152565b6040906139756001939594956060835260608301906108b6565b6040906139756002939594956060835260608301906108b6565b6040906139756003939594956060835260608301906108b6565b90916139d882611010565b6001600160a01b0316331415613b0c576139f183613825565b918083541415613a865760027fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8930191613a42613a33845460ff9060b01c1690565b613a3c81613899565b15613b28565b15613a6257815460ff60b01b1916600160b01b179091556137d5906137c7565b815460ff60b01b1916600160b11b179091556137d590604051918291339583613999565b505050505060a460405162461bcd60e51b815260206004820152604e60248201527f466c65656b4552433732313a207468652070617373656420746f6b656e49642060448201527f6973206e6f74207468652073616d65206173207468652061636365737320706f60648201526d34b73a13b9903a37b5b2b724b21760911b6084820152fd5b50905060249150604051906355d2292f60e11b82526004820152fd5b15613b2f57565b5060405162461bcd60e51b815260206004820152604260248201527f466c65656b4552433732313a207468652061636365737320706f696e7420637260448201527f656174696f6e2073746174757320686173206265656e20736574206265666f72606482015261329760f11b608482015260a490fd5b613bae6149d6565b6001600160a01b03613bd2816002613bc585613825565b015460101c161515613cc2565b6002613bdd83613825565b015460101c16331415613c7b57613c0c6002613bf883613825565b01805460ff60b01b1916600360b01b179055565b613c1581613825565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613c488587836139b3565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db0604051806120dd3395826108db565b505060405162461bcd60e51b815260206004820152601d60248201527f466c65656b4552433732313a206d757374206265204150206f776e65720000006044820152606490fd5b15613cc957565b5060405162461bcd60e51b815260206004820152601760248201527f466c65656b4552433732313a20696e76616c69642041500000000000000000006044820152606490fd5b6001600160a01b039081613d2282613825565b6002015460101c161515613d3590613cc2565b613d3e90613825565b908154613d4a90614cbb565b906001830154613d5990614cbb565b92600201548060081c60ff16613d6e90614f76565b91613d7b60ff8316614f76565b908260101c16613d8a90614ec1565b9160b01c60ff16613d9a81613899565b613da390614cbb565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613dd691612598565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613dfa91612598565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613e2591612598565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613e5391612598565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613e7891612598565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613e9e91612598565b607d60f81b815260010103601f198101825261087090826109a3565b60ff90600290613ede90613ed96001600160a01b0384613bc584613825565b613825565b015460081c1690565b613efd6001600160a01b036002613bc584613825565b6001613f0882613825565b01613f138154613f5e565b9055613f1e81613825565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee436120dd6001613f4e85613825565b0154604051918291339683613f6e565b600190600019811461211d570190565b929190613f856020916040865260408601906108b6565b930152565b613fa06001600160a01b036002613bc584613825565b6001613fab82613825565b015415613fc8576001613fbd82613825565b01613f13815461400e565b5050606460405162461bcd60e51b815260206004820152602060248201527f466c65656b4552433732313a2073636f72652063616e74206265206c6f7765726044820152fd5b8015612ade576000190190565b6001600160a01b03614032816002613bc585613825565b61403b82613825565b549061404682611010565b163314156140b0575b5061407182600261405f84613825565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff6120dd61409e83613825565b54604051918291339615159583613f6e565b6140b990612e68565b3861404f565b6001600160a01b036140d6816002613bc585613825565b6140df82613825565b54906140ea82611010565b16331415614149575b5061411c82600261410384613825565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c6120dd61409e83613825565b61415290612e68565b386140f3565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b9061418583611010565b6001600160a01b0316331415614248575b6000838152606760205260409020546141b9906001600160a01b03161515610fc3565b60409061421e82518381018181106001600160401b0382111761423b575b84528681528260208201528560005260ff6020526142196005856000200160048660002001906142078254613f5e565b80925590600052602052604060002090565b61225e565b6142266109c4565b948552602085015251806120dd339582614256565b614243610964565b6141d7565b61425183612e68565b614196565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b6002821061429857505050505090565b909192939483806142b5600193607f1989820301865289516108b6565b97019201920190939291614288565b6142cd81611010565b6001600160a01b039081163314156143ec5760008183926142ed84611010565b6142f56149d6565b16151580806143e5575b83146143ce575061430f83612baf565b61431883611010565b61432f61174e856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561436561174e856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46143ab60026143a58360005260ff602052604060002090565b01614406565b6143b25750565b6143c96109d19160005260ff602052604060002090565b614481565b6143d75761430f565b6143e083612baf565b61430f565b50826142ff565b5060249150604051906355d2292f60e11b82526004820152fd5b6108709054611033565b6001600160fe1b038111600116614428575b60021b90565b6144306120f6565b614422565b61443f8154611033565b9081614449575050565b81601f6000931160011461445b575055565b8183526020832061447791601f0160051c810190600101611d52565b8160208120915555565b600760009161448f81614435565b61449b60018201614435565b6144a760028201614435565b6144b360038201614435565b8260048201556144c560068201614435565b0155565b6144d16149d6565b6144d9612545565b6144e281611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166145a35761451581611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290206145409061207e565b61454981611a57565b614553815461210d565b905561455e81611a2c565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516397b705ed60e01b815260049150fd5b6145c06149d6565b6145c981611010565b6001600160a01b039081163314156146aa578160005260996020526146116102ae8561029786610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc7821189061466e61207e8661029787610407614659896000526099602052604060002090565b546103f88a600052609a602052604060002090565b61467784611a2c565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b6146cf6149d6565b6146d7612545565b6146ee6146ea6102ae8461029785611a3e565b1590565b6145a3576146fb81611a2c565b801580614799575b614784576147216147178361029784611a3e565b805460ff19169055565b61472a81611a57565b6147348154612ace565b905561473f81611a2c565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516360ed092b60e01b815260049150fd5b5060016147a582611a57565b5414614703565b6147b46149d6565b6147bd81611010565b6001600160a01b039081163314156146aa578160005260996020526148086146ea6102ae8661029787610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906148506147178661029787610407614659896000526099602052604060002090565b61485984611a2c565b604080516000815233602082015291909516948190810161468f565b61487d612545565b6148856149d6565b60cc5460ff8160081c16156148cd5760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b6148e9612545565b60cc5460ff81161561492a5760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614946612545565b60cc549015159060ff8160081c161515821461499a5761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b6149c560ff60005460081c16611cf1565b60cc805461ffff1916610100179055565b60ff60cc54166149e257565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614a65575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614a6d610964565b614a10565b60405190614a7f8261097b565b6008825260203681840137565b90614a96826109f2565b614aa360405191826109a3565b8281528092614ab4601f19916109f2565b0190602036910137565b805115614b9057614acd6149f5565b614af1614aec614ae7614ae08551612129565b6003900490565b614410565b614a8c565b9160208301918182518301915b828210614b3e57505050600390510680600114614b2b57600214614b20575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614afe565b506108706114fc565b60208183031261095c578051906001600160401b03821161083c570181601f8201121561095c578051614bcb816109f2565b92614bd960405194856109a3565b8184526020828401011161083c576108709160208085019101610881565b92614c236108709593614c15614c319460808852608088019061106f565b90868203602088015261106f565b90848203604086015261106f565b9160608184039101526108b6565b600092918154614c4e81611033565b92600191808316908115614ca65750600114614c6a5750505050565b90919293945060005260209081600020906000915b858310614c95575050505001903880808061109c565b805485840152918301918101614c7f565b60ff191684525050500191503880808061109c565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614df0575b506d04ee2d6d415b85acef810000000080831015614de1575b50662386f26fc1000080831015614dd2575b506305f5e10080831015614dc3575b5061271080831015614db4575b506064821015614da4575b600a80921015614d9a575b600190816021614d52828701614a8c565b95860101905b614d64575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614d9557919082614d58565b614d5d565b9160010191614d41565b9190606460029104910191614d36565b60049193920491019138614d2b565b60089193920491019138614d1e565b60109193920491019138614d0f565b60209193920491019138614cfd565b604093508104915038614ce4565b60405190614e0b8261097b565b6007825260203681840137565b50634e487b7160e01b600052603260045260246000fd5b602090805115614e3d570190565b612125614e18565b602190805160011015614e3d570190565b906020918051821015614e6857010190565b614e70614e18565b010190565b15614e7c57565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117614f69575b604052602a825260403660208401376030614ef683614e2f565b536078614f0283614e45565b536029905b60018211614f1a57610870915015614e75565b80600f614f5692166010811015614f5c575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8486614e56565b5360041c9161400e565b90614f07565b614f64614e18565b614f2c565b614f71610964565b614edc565b15614f9b57604051614f878161097b565b60048152637472756560e01b602082015290565b604051614fa78161097b565b600581526466616c736560d81b602082015290565b62ffffff16614fc9614a72565b906030614fd583614e2f565b536078614fe183614e45565b5360079081905b6001821161507d57614ffb915015614e75565b615003614dfe565b91825115615070575b60236020840153600190815b838110615026575050505090565b61505e906001198111615063575b6001600160f81b031961504982860185614e56565b511660001a6150588288614e56565b53613f5e565b615018565b61506b6120f6565b615034565b615078614e18565b61500c565b80600f6150af921660108110156150b5575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8487614e56565b90614fe8565b6150bd614e18565b61508f56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a3646970667358221220649d06dd22516cb769346c4d824089015f3dc6af7ad4ca0d63914e92c2f6e0046c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - the contract must be not paused. IMPORTANT: The payment is not set yet\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string)\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0xebea929fabed84ed7e45572a13124087264e732a1b55dd7b07c5c26fcde46566\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://232fcba746f4bea888df7258a57031fbe82c6782861941b21a2b745766b8f97d\",\"dweb:/ipfs/QmSnK97Z6Mk1CXvGbf9PbK4Wi3MFNYLcy1vRrXaFSEQgfx\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x4e72d7848d5c44fcc6502054e74d26ede597641342be60e1f8c2978f607db715\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c020f490edc637208060b41dda06ea99c0dc9714917e4cb7729268b8a8ec85f2\",\"dweb:/ipfs/QmRmwK8YXk19kYG9w1qNMe2FAVEtRytKow4u8TRJyb3NPJ\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", + "bytecode": "0x60808060405234610016576152f2908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb1461083f57806301ffc9a71461082357806302dba24d146104a757806306fdde0314610807578063081812fc146107eb578063095ea7b3146107d357806323b872dd146107bb578063246a908b146107a357806327dc5cec146107875780632d957aad1461076f5780633806f152146107575780633ccfd60b146107405780633e233205146107285780633f4ba83a1461071157806342842e0e146106f957806342966c68146106e257806342e44bbf146106ca5780635aa6ab3b146106b25780636352211e1461067d57806370a0823114610661578063736d323a1461064a5780637469a03b1461063357806378278cca1461061b57806383c4c00d146105ff5780638456cb59146105e85780638a2e25be146105d05780638b9ec977146105ac5780638c3c0a441461059457806394ec65c51461057d57806395d89b4114610561578063a09a160114610531578063a22cb46514610519578063a27d0b2714610501578063a397c830146104ea578063aad045a2146104d2578063ac8cf285146104a7578063b187bd261461047b578063b20b94f114610463578063b30437a014610450578063b42dbe38146103f0578063b88d4fde146103d5578063b948a3c5146103bd578063ba4c458a146103a5578063c87b56dd1461037e578063cdb0e89e14610366578063d7a75be11461034a578063e4b50cb81461031a578063e9447250146102f6578063e985e9c514610289578063eb5fd26b146102715763f931517714610253575061000f565b3461026d5761026a61026436610b0a565b90612f73565b51f35b5080fd5b503461026d5761026a61028336611095565b90613734565b503461026d576102f291506102e16102da6102c36102a636611062565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b503461026d576102f291506102e16102da6102c361031336610b63565b9190611b95565b503461026d576102f291506103366103313661097e565b612ca7565b949795969390939291925197889788610ff2565b503461026d576102f291506102e161036136610b39565b613fc4565b503461026d5761026a61037836610b0a565b906132c7565b503461026d576102f2915061039a6103953661097e565b612831565b90519182918261096d565b503461026d5761026a6103b736610f31565b91611bdf565b503461026d5761026a6103cf36610b0a565b906135bb565b503461026d5761026a6103e736610ec1565b929190916116d5565b503461026d576102f291506102e16102da61044b6102c36104103661087f565b93909161043c61042a826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611bc7565b5061026a61045d36610b0a565b90613954565b503461026d5761026a61047536610c09565b9061410a565b503461026d576102f2915061048f36610905565b60cc54905160ff909116151581529081906020820190565b503461026d576102f291506104c36104be366108ea565b610e99565b90519081529081906020820190565b503461026d5761026a6104e436610e62565b90612e8f565b503461026d5761026a6104fc36610b39565b6140a3565b503461026d5761026a6105133661087f565b91614722565b503461026d5761026a61052b36610e31565b90611521565b503461026d576102f2915061054536610905565b60cc54905160089190911c60ff16151581529081906020820190565b503461026d576102f2915061057536610905565b61039a611324565b503461026d5761026a61058f36610b39565b61400c565b503461026d5761026a6105a636610b63565b90614831565b506102f291506104c36105be36610d1a565b9897909796919695929594939461238a565b503461026d5761026a6105e236610cda565b91613c2a565b503461026d576105f736610905565b61026a6149df565b503461026d576102f2915061061336610905565b6104c3612d73565b503461026d5761026a61062d36610b0a565b9061314f565b503461026d5761026a61064536610b39565b613d26565b503461026d5761026a61065c36610cbe565b614aa8565b503461026d576102f291506104c361067836610c9b565b6110b8565b503461026d576102f291506106996106943661097e565b61117e565b90516001600160a01b0390911681529081906020820190565b503461026d5761026a6106c436610c58565b916137f1565b503461026d5761026a6106dc36610c09565b906141cb565b503461026d5761026a6106f43661097e565b6143d9565b503461026d5761026a61070b366109b7565b9161169b565b503461026d5761072036610905565b61026a614a4b565b503461026d5761026a61073a36610bd9565b90614b1e565b503461026d5761074f36610905565b61026a614b30565b503461026d5761026a61076936610b93565b9161426c565b503461026d5761026a61078136610b63565b906145e0565b503461026d576102f2915061039a61079e36610b39565b613e1f565b503461026d5761026a6107b536610b0a565b9061343d565b503461026d5761026a6107cd366109b7565b9161164d565b503461026d5761026a6107e536610990565b906113bd565b503461026d576102f291506106996108023661097e565b6114e3565b503461026d576102f2915061081b36610905565b61039a61126d565b503461026d576102f291506102e161083a366108cf565b612da0565b503461026d5761026a6108513661087f565b91614916565b6001111561000f57565b600435906001600160a01b03821682141561087857565b5050600080fd5b606090600319011261000f576004359060243561089b81610857565b906044356001600160a01b0381168114156108b35790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f576004356108e7816108bc565b90565b602090600319011261000f5760043560028110156108785790565b600090600319011261000f57565b918091926000905b82821061093357501161092c575050565b6000910152565b9150806020918301518186015201829161091b565b9060209161096181518092818552858086019101610913565b601f01601f1916010190565b9060206108e7928181520190610948565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610878579060243590565b606090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610a2857604052565b610a306109f6565b604052565b90601f801991011681019081106001600160401b03821117610a2857604052565b60405190610a6382610a0d565b565b6040519060c082018281106001600160401b03821117610a2857604052565b6020906001600160401b038111610aa1575b601f01601f19160190565b610aa96109f6565b610a96565b929192610aba82610a84565b91610ac86040519384610a35565b829481845281830111610ae5578281602093846000960137010152565b5050505050600080fd5b9080601f830112156109ee578160206108e793359101610aae565b9060406003198301126108785760043591602435906001600160401b0382116108b3576108e791600401610aef565b602060031982011261087857600435906001600160401b0382116109ee576108e791600401610aef565b604090600319011261000f57600435610b7b81610857565b906024356001600160a01b0381168114156109ee5790565b606060031982011261087857600435916001600160401b03602435818111610ae55783610bc291600401610aef565b92604435918211610ae5576108e791600401610aef565b604090600319011261000f576004356002811015610878579060243590565b610124359081151582141561087857565b604060031982011261087857600435906001600160401b0382116109ee57610c3391600401610aef565b906024358015158114156109ee5790565b610104359062ffffff821682141561087857565b9060606003198301126108785760043591602435906001600160401b0382116108b357610c8791600401610aef565b9060443562ffffff81168114156108b35790565b602090600319011261000f576004356001600160a01b0381168114156108785790565b602090600319011261000f576004358015158114156108785790565b9060606003198301126108785760043591602435906001600160401b0382116108b357610d0991600401610aef565b906044358015158114156108b35790565b61014060031982011261087857610d2f610861565b916001600160401b0390602435828111610ae557610d51846004928301610aef565b93604435848111610e255781610d68918401610aef565b93606435818111610e185782610d7f918501610aef565b93608435828111610e0a5783610d96918601610aef565b9360a435838111610dfb5784610dad918301610aef565b9360c435848111610deb5781610dc4918401610aef565b9360e435908111610deb57610dd99201610aef565b90610de2610c44565b906108e7610bf8565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b03811681141561087857906024358015158114156109ee5790565b604090600319011261000f57600435906024358015158114156109ee5790565b50634e487b7160e01b600052602160045260246000fd5b6002811015610eb4575b60005260fe60205260406000205490565b610ebc610e82565b610ea3565b906080600319830112610878576001600160a01b03916004358381168114156108b357926024359081168114156108b3579160443591606435906001600160401b038211610f265780602383011215610f26578160246108e793600401359101610aae565b505050505050600080fd5b906060600319830112610878576001600160401b03906004358281116108b35783610f5e91600401610aef565b92602435838111610ae55781610f7691600401610aef565b9260443591818311610f265780602384011215610f26578260040135918211610fe5575b8160051b60405193602093610fb185840187610a35565b8552602484860192820101928311610e1857602401905b828210610fd6575050505090565b81358152908301908301610fc8565b610fed6109f6565b610f9a565b959062ffffff9461103a61105b9561102c60c0999661101e611048969d9e9d60e08e8181520190610948565b8c810360208e015290610948565b908a820360408c0152610948565b9088820360608a0152610948565b91608087015285820360a0870152610948565b9416910152565b604090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee5790565b604090600319011261000f576004359060243562ffffff81168114156109ee5790565b6001600160a01b031680156110d857600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b1561113857565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b03166108e7811515611131565b90600182811c921680156111d3575b60208310146111bb57565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916111b0565b90600092918054916111ee836111a1565b9182825260019384811690816000146112505750600114611210575b50505050565b90919394506000526020928360002092846000945b83861061123c57505050500101903880808061120a565b805485870183015294019385908201611225565b60ff1916602084015250506040019350389150819050808061120a565b6040519060008260655491611281836111a1565b8083529260019081811690811561130757506001146112a8575b50610a6392500383610a35565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b8483106112ec5750610a6393505081016020013861129b565b81935090816020925483858a010152019101909185926112d3565b94505050505060ff19166020830152610a6382604081013861129b565b6040519060008260665491611338836111a1565b80835292600190818116908115611307575060011461135e5750610a6392500383610a35565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b8483106113a25750610a6393505081016020013861129b565b81935090816020925483858a01015201910190918592611389565b906113c78161117e565b6001600160a01b038181169084168114611490573314908115611462575b50156113f457610a63916119bf565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff91506114889033906102c3565b5416386113e5565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611506906001600160a01b03161515611131565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b03811691903383146115a257816115616115729233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b156115f157565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b90610a6392916116656116608433611771565b6115ea565b611844565b60405190602082018281106001600160401b0382111761168e575b60405260008252565b6116966109f6565b611685565b9091610a639260405192602084018481106001600160401b038211176116c8575b604052600084526116d5565b6116d06109f6565b6116bc565b906116f99392916116e96116608433611771565b6116f4838383611844565b611acb565b1561170057565b5060405162461bcd60e51b81528061171a6004820161171e565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b03806117838461117e565b1692818316928484149485156117b9575b505083156117a3575b50505090565b6117af919293506114e3565b161438808061179d565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611794565b156117f057565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b611868906118518461117e565b6001600160a01b03828116939091821684146117e9565b8316928315611969576118e682611883878461194096612de4565b6118a58561189f6118938a61117e565b6001600160a01b031690565b146117e9565b6118cc6118bc886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b038116600090815260686020526040902060018154019055611921856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b03806119f88461117e565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b600090815260676020526040902054610a63906001600160a01b03161515611131565b9081602091031261087857516108e7816108bc565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526108e792910190610948565b506040513d6000823e3d90fd5b3d15611ac6573d90611aac82610a84565b91611aba6040519384610a35565b82523d6000602084013e565b606090565b92909190823b15611b7a57611afe926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611a5d565b03926001600160a01b03165af160009181611b5a575b50611b4c57505050611b24611a9b565b80519081611b4757505060405162461bcd60e51b81528061171a6004820161171e565b602001fd5b6001600160e01b0319161490565b611b73919250611b6a3d82610a35565b3d810190611a48565b9038611b14565b50505050600190565b60011115611b8d57565b610a63610e82565b611b9e81611b83565b6000526098602052604060002090565b611bb781611b83565b6000526097602052604060002090565b90611bd181611b83565b600052602052604060002090565b90916000549260ff8460081c161580948195611d01575b8115611ce1575b5015611c8157611c239284611c1a600160ff196000541617600055565b611c6857611d0f565b611c2957565b611c3961ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611c7c61010061ff00196000541617600055565b611d0f565b5050505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611cf3575b5038611bfd565b6001915060ff161438611cec565b600160ff8216109150611bf6565b929190611d2c60ff60005460081c16611d2781611e51565b611e51565b83516001600160401b038111611e44575b611d5181611d4c6065546111a1565b611ec9565b602080601f8311600114611dae57509080611d8e9392611d9b9697600092611da3575b50508160011b916000199060031b1c191617606555611fba565b611d9661218d565b612299565b610a63614b97565b015190503880611d74565b90601f19831696611de160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b926000905b898210611e2c575050918391600193611d8e9695611d9b999a10611e13575b505050811b01606555611fba565b015160001960f88460031b161c19169055388080611e05565b80600185968294968601518155019501930190611de6565b611e4c6109f6565b611d3d565b15611e5857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611ebd575050565b60008155600101611eb2565b90601f8211611ed6575050565b610a639160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611f20575b601f0160051c0190611eb2565b9091508190611f13565b90601f8211611f37575050565b610a639160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9190601f8111611f8f57505050565b610a63926000526020600020906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9081516001600160401b0381116120a4575b611fe081611fdb6066546111a1565b611f2a565b602080601f831160011461201c5750819293600092612011575b50508160011b916000199060031b1c191617606655565b015190503880611ffa565b90601f1983169461204f60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b87821061208c575050836001959610612073575b505050811b01606655565b015160001960f88460031b161c19169055388080612068565b80600185968294968601518155019501930190612054565b6120ac6109f6565b611fcc565b91909182516001600160401b038111612180575b6120d9816120d384546111a1565b84611f80565b602080601f831160011461211557508192939460009261210a575b50508160011b916000199060031b1c1916179055565b0151905038806120f4565b90601f1983169561212b85600052602060002090565b926000905b8882106121685750508360019596971061214f575b505050811b019055565b015160001960f88460031b161c19169055388080612145565b80600185968294968601518155019501930190612130565b6121886109f6565b6120c5565b600061219f60ff825460081c16611e51565b808052609860209081526040808320336000908152925290205460ff1661224257808052609860209081526040808320336000908152925290206121eb905b805460ff19166001179055565b808052609760205260408120612201815461226d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161227d570190565b612285612256565b0190565b600290600219811161227d570190565b906122ab60ff60005460081c16611e51565b60005b8251811015612306578060026122e79210156122f9575b83518110156122ec575b6122e260208260051b8601015182612332565b61230b565b6122ae565b6122f461231b565b6122cf565b612301610e82565b6122c5565b509050565b600190600019811461227d570190565b50634e487b7160e01b600052603260045260246000fd5b6040907f6819853ffee8927169953e7bdc42aaba347fb03ff918a45bfccaf88626d9009692600282101561237d575b8160005260fe60205280836000205582519182526020820152a1565b612385610e82565b612361565b93949891969790929761239b612798565b6101309687549a8b986123ae8a8961268d565b546123b89061226d565b610130556123d189600052610131602052604060002090565b6123db87826120b1565b6123e88b600183016120b1565b6123f58c600283016120b1565b61240289600383016120b1565b61240f84600683016120b1565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff88161717905560006004820155612443610a56565b908282528360208301526005016124639060008052602052604060002090565b9061246d916124b1565b604051978897600160a01b60019003169b339b61248a988a6125a8565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b03811161259b575b6124da816124d486546111a1565b86611f80565b6020928390601f831160011461252657918060019492610a6397969460009261251b575b5050600019600383901b1c191690841b1784555b015191016120b1565b0151905038806124fe565b90601f1983169161253c87600052602060002090565b9260005b81811061258457509260019593928592610a6399989688951061256b575b505050811b018455612512565b015160001960f88460031b161c1916905538808061255e565b929387600181928786015181550195019301612540565b6125a36109f6565b6124c6565b979998959062ffffff95612608612632966125fa8c6101009c986125ec612624996125de61261699610120808752860190610948565b908482036020860152610948565b916040818403910152610948565b8c810360608e015290610948565b908a820360808c0152610948565b9088820360a08a0152610948565b9086820360c0880152610948565b951660e08401521515910152565b1561264757565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156127505760008381526067602052604090205461272691906126c8906001600160a01b031615155b15612640565b6126d0614bb9565b6000848152606760205260409020546126f3906001600160a01b031615156126c2565b6001600160a01b038116600090815260686020526040902060018154019055611921846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6000805260fe6020527f32796e36004994222362c2f9423d5e208bb848170964890784a8d59ed40f50af54348114156127ce5750565b6024915060405190635f7e28df60e01b82526004820152fd5b600160005260fe6020527f457c8a48b4735f56b938837eb0a8a5f9c55f23c1a85767ce3b65c3e59d3d32b754348114156127ce5750565b9061228560209282815194859201610913565b600081815260676020526040902054612854906001600160a01b03161515611131565b61285d8161117e565b9060005261013160205260406000206128b46040519261287c84610a0d565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b031661508d565b6128f6600383016007840160006128d66128d1835462ffffff1690565b615188565b6040518095819263891c235f60e01b835260068a01878b60048601614dda565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612c9a575b600093612c77575b5054908160181c60ff1661293290615142565b9060058601906004870154928261295485809590600052602052604060002090565b936129689190600052602052604060002090565b6001019361297590614e9e565b9462ffffff1661298490615188565b604051607b60f81b602082015267113730b6b2911d1160c11b60218201529889989197916129b560298b0183614e22565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f016129e59060018401614e22565b61088b60f21b8152600201681137bbb732b9111d1160b91b8152600901612a0b9161281e565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b8152601001612a3b91600201614e22565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b8152600901612a619161281e565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d01612a9b9161281e565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f01612aec91614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b6020820152602701612b3791614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b6020820152602601612b8191614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b6020820152602301612bc89161281e565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b6020820152602101612c0d9161281e565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f19918281018252612c419082610a35565b612c4a90614ca1565b9160405192839160208301612c5e9161281e565b612c679161281e565b0390810182526108e79082610a35565b612c9391933d90823e612c8a3d82610a35565b3d810190614d7c565b913861291f565b612ca2611a8e565b612917565b600081815260676020526040902054612cca906001600160a01b03161515611131565b60005261013160205260409081600020600481015462ffffff600783015416938051612d0181612cfa81876111dd565b0382610a35565b948151612d1581612cfa81600189016111dd565b946006612d528451612d2e81612cfa8160028c016111dd565b96612cfa8651612d4581612cfa81600387016111dd565b97965180948193016111dd565b9190565b60018110612d66575b6000190190565b612d6e612256565b612d5f565b610130548015612d8c5760018110612d66576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612dd3575b8115612dc5575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612dbb565b90612ded614bb9565b6001600160a01b0391821615158080612e2d575b15612e1257505050610a6390612e38565b612e1b57505050565b1615612e245750565b610a6390612e38565b508282161515612e01565b80600052609960205260406000206001815481198111612e82575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612e8a612256565b612e53565b612e988161117e565b6001600160a01b0316331415612f5857600081815260676020526040902054612ecb906001600160a01b03161515611131565b600081815261013160205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612f7c8161117e565b6001600160a01b03163314156130b2575b600081815260676020526040902054612fb0906001600160a01b03161515611131565b8060005260206101318152600260406000200190835180916001600160401b0382116130a5575b612fe5826124d486546111a1565b80601f8311600114613037575060009161302c575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d3395826130c0565b905084015138612ffa565b9150601f19831661304d85600052602060002090565b926000905b82821061308d5750509083600194939210613074575b5050811b01905561300e565b86015160001960f88460031b161c191690553880613068565b80600185968294968c01518155019501930190613052565b6130ad6109f6565b612fd7565b6130bb816130f3565b612f8d565b9060806108e79260408152600b60408201526a195e1d195c9b985b15549360aa1b60608201528160208201520190610948565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615613131575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b6131588161117e565b6001600160a01b031633141561328e575b60008181526067602052604090205461318c906001600160a01b03161515611131565b8060005260206101318152600360406000200190835180916001600160401b038211613281575b6131c1826124d486546111a1565b80601f83116001146132135750600091613208575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d33958261329c565b9050840151386131d6565b9150601f19831661322985600052602060002090565b926000905b8282106132695750509083600194939210613250575b5050811b0190556131ea565b86015160001960f88460031b161c191690553880613244565b80600185968294968c0151815501950193019061322e565b6132896109f6565b6131b3565b613297816130f3565b613169565b9060806108e792604081526003604082015262454e5360e81b60608201528160208201520190610948565b6132d08161117e565b6001600160a01b0316331415613403575b600081815260676020526040902054613304906001600160a01b03161515611131565b8060005260206101318152604060002090835180916001600160401b0382116133f6575b613336826124d486546111a1565b80601f8311600114613388575060009161337d575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613411565b90508401513861334b565b9150601f19831661339e85600052602060002090565b926000905b8282106133de57505090836001949392106133c5575b5050811b01905561335f565b86015160001960f88460031b161c1916905538806133b9565b80600185968294968c015181550195019301906133a3565b6133fe6109f6565b613328565b61340c816130f3565b6132e1565b9060806108e7926040815260046040820152636e616d6560e01b60608201528160208201520190610948565b6134468161117e565b6001600160a01b031633141561357a575b60008181526067602052604090205461347a906001600160a01b03161515611131565b8060005260206101318152600180604060002001918451906001600160401b03821161356d575b6134af826124d486546111a1565b80601f83116001146135025750819282916000936134f7575b501b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613588565b8701519250386134c8565b9082601f19811661351887600052602060002090565b936000905b87838310613553575050501061353a575b5050811b0190556134d9565b86015160001960f88460031b161c19169055388061352e565b8b860151875590950194938401938693509081019061351d565b6135756109f6565b6134a1565b613583816130f3565b613457565b9060806108e79260408152600b60408201526a3232b9b1b934b83a34b7b760a91b60608201528160208201520190610948565b6135c48161117e565b6001600160a01b03163314156136fa575b6000818152606760205260409020546135f8906001600160a01b03161515611131565b8060005260206101318152600660406000200190835180916001600160401b0382116136ed575b61362d826124d486546111a1565b80601f831160011461367f5750600091613674575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613708565b905084015138613642565b9150601f19831661369585600052602060002090565b926000905b8282106136d557505090836001949392106136bc575b5050811b019055613656565b86015160001960f88460031b161c1916905538806136b0565b80600185968294968c0151815501950193019061369a565b6136f56109f6565b61361f565b613703816130f3565b6135d5565b9060806108e7926040815260046040820152636c6f676f60e01b60608201528160208201520190610948565b61373d8161117e565b6001600160a01b03163314156137e3575b600081815260676020526040902054613771906001600160a01b03161515611131565b600081815261013160205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b6137ec816130f3565b61374e565b929190926137fe8161117e565b6001600160a01b0316331415613946575b600081815260676020526040902054613832906001600160a01b03161515611131565b80600052602093610131855260066040600020018151956001600160401b038711613939575b613866876120d384546111a1565b80601f88116001146138c857509580610a6396976000916138bd575b508160011b916000199060031b1c19161790555b8160008051602061528f833981519152604051806138b5339582613708565b0390a3613734565b905083015138613882565b90601f1988166138dd84600052602060002090565b926000905b828210613921575050918891610a63989960019410613908575b5050811b019055613896565b85015160001960f88460031b161c1916905538806138fc565b80600185968294968a015181550195019301906138e2565b6139416109f6565b613858565b61394f816130f3565b61380f565b61395c614bb9565b6139646127e7565b61396d81611a25565b6001600160a01b03613994600261398385613acf565b015460101c6001600160a01b031690565b16613aba577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe890604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca23392806139ed888261096d565b0390a3613a156007613a0a83600052610131602052604060002090565b015460181c60ff1690565b15613a6f57613a6a90613a5c613a29610a65565b828152600060208201819052604082018190526060820152336080820152600160a0820152613a5786613acf565b613b00565b604051918291339583613bdc565b0390a2565b613a6a90613aac613a7e610a65565b828152600060208201819052604082018190526060820152336080820152600060a0820152613a5786613acf565b604051918291339583613bb8565b505060405163142d0c2f60e11b815260049150fd5b6020613ae8918160405193828580945193849201610913565b810161013281520301902090565b60041115611b8d57565b60029082518155602083015160018201550190613b2f60408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a090920151613b8181613af6565b6004811015613bab575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613bb3610e82565b613b8b565b604090613bd2600093959495606083526060830190610948565b9460208201520152565b604090613bd2600193959495606083526060830190610948565b604090613bd2600293959495606083526060830190610948565b604090613bd2600393959495606083526060830190610948565b919091613c368161117e565b6001600160a01b0316331415613d0a57613c4f83613acf565b8181541415613cf45760020190613c6b825460ff9060b01c1690565b613c7481613af6565b613cde577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe89215613cba57815460ff60b01b1916600160b01b17909155613a6a90613a5c565b815460ff60b01b1916600160b11b17909155613a6a90604051918291339583613bf6565b5050505050600460405163d9e5c51160e01b8152fd5b50505050506004604051636653b1a360e01b8152fd5b91505060249150604051906355d2292f60e11b82526004820152fd5b613d2e614bb9565b6001600160a01b03806002613d4284613acf565b015460101c1615613e0a576002613d5883613acf565b015460101c16331415613df657613d876002613d7383613acf565b01805460ff60b01b1916600360b01b179055565b613d9081613acf565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613dc3858783613c10565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db06040518061223d33958261096d565b5050604051631851b23d60e01b8152600490fd5b5050604051630d436c3560e21b815260049150fd5b6001600160a01b0390816002613e3483613acf565b015460101c1615613e0a57613e4890613acf565b908154613e5490614e9e565b906001830154613e6390614e9e565b92600201548060081c60ff16613e7890615142565b91613e8560ff8316615142565b908260101c16613e949061508d565b9160b01c60ff16613ea481613af6565b613ead90614e9e565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613ee09161281e565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613f049161281e565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613f2f9161281e565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613f5d9161281e565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613f829161281e565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613fa89161281e565b607d60f81b815260010103601f19810182526108e79082610a35565b6001600160a01b036002613fd783613acf565b015460101c1615613ff8576002613fef60ff92613acf565b015460081c1690565b5050604051630d436c3560e21b8152600490fd5b6001600160a01b03600261401f83613acf565b015460101c1615613ff857600161403582613acf565b01614040815461230b565b905561404b81613acf565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee4361223d600161407b85613acf565b01546040519182913396835b92919061409e602091604086526040860190610948565b930152565b6001600160a01b0360026140b683613acf565b015460101c1615613ff85760016140cc82613acf565b0154156140e95760016140de82613acf565b0161404081546140fd565b50506040516341f3125f60e11b8152600490fd5b8015612d66576000190190565b6001600160a01b0380600261411e84613acf565b015460101c16156141b65761413282613acf565b549061413d8261117e565b163314156141a7575b5061416882600261415684613acf565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff61223d61419583613acf565b54604051918291339615159583614087565b6141b0906130f3565b38614146565b505050506004604051630d436c3560e21b8152fd5b6001600160a01b038060026141df84613acf565b015460101c16156141b6576141f382613acf565b54906141fe8261117e565b1633141561425d575b5061423082600261421784613acf565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c61223d61419583613acf565b614266906130f3565b38614207565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b906142998361117e565b6001600160a01b031633141561435d575b6000838152606760205260409020546142cd906001600160a01b03161515611131565b60409061433382518381018181106001600160401b03821117614350575b84528681528260208201528560005261013160205261432e60058560002001600486600020019061431c825461230b565b80925590600052602052604060002090565b6124b1565b61433b610a56565b9485526020850152518061223d33958261436b565b6143586109f6565b6142eb565b614366836130f3565b6142aa565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b600282106143ad57505050505090565b909192939483806143ca600193607f198982030186528951610948565b9701920192019093929161439d565b6143e28161117e565b6001600160a01b039081163314156145035760008183926144028461117e565b61440a614bb9565b16151580806144fc575b83146144e5575061442483612e38565b61442d8361117e565b6144446118bc856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561447a6118bc856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46144c160026144bb83600052610131602052604060002090565b0161451d565b6144c85750565b6144e0610a6391600052610131602052604060002090565b614598565b6144ee57614424565b6144f783612e38565b614424565b5082614414565b5060249150604051906355d2292f60e11b82526004820152fd5b6108e790546111a1565b6001600160fe1b03811160011661453f575b60021b90565b614547612256565b614539565b61455681546111a1565b9081614560575050565b81601f60009311600114614572575055565b8183526020832061458e91601f0160051c810190600101611eb2565b8160208120915555565b60076000916145a68161454c565b6145b26001820161454c565b6145be6002820161454c565b6145ca6003820161454c565b8260048201556145dc6006820161454c565b0155565b6145e8614bb9565b6145f06146cf565b6145f981611b83565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166146ba5761462c81611b83565b60008181526098602090815260408083206001600160a01b03861684529091529020614657906121de565b61466081611bae565b61466a815461226d565b905561467581611b83565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516397b705ed60e01b815260049150fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561470857565b5060405163070198dd60e51b815260006004820152602490fd5b61472a614bb9565b6147338161117e565b6001600160a01b039081163314156148145781600052609960205261477b6102da856102c38661044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906147d86121de866102c38761044b6147c3896000526099602052604060002090565b5461043c8a600052609a602052604060002090565b6147e184611b83565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b614839614bb9565b6148416146cf565b6148586148546102da846102c385611b95565b1590565b6146ba5761486581611b83565b801580614903575b6148ee5761488b614881836102c384611b95565b805460ff19169055565b61489481611bae565b61489e8154612d56565b90556148a981611b83565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516360ed092b60e01b815260049150fd5b50600161490f82611bae565b541461486d565b61491e614bb9565b6149278161117e565b6001600160a01b03908116331415614814578160005260996020526149726148546102da866102c38761044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906149ba614881866102c38761044b6147c3896000526099602052604060002090565b6149c384611b83565b60408051600081523360208201529190951694819081016147f9565b6149e76146cf565b6149ef614bb9565b60cc5460ff8160081c1615614a375760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b614a536146cf565b60cc5460ff811615614a945760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614ab06146cf565b60cc549015159060ff8160081c1615158214614b045761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b90610a6391614b2b6146cf565b612332565b614b386146cf565b478060008115614b8e575b600080809381933390f115614b81575b6040519081527f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a360203392a2565b614b89611a8e565b614b53565b506108fc614b43565b614ba860ff60005460081c16611e51565b60cc805461ffff1916610100179055565b60ff60cc5416614bc557565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614c48575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614c506109f6565b614bf3565b60405190614c6282610a0d565b6008825260203681840137565b90614c7982610a84565b614c866040519182610a35565b8281528092614c97601f1991610a84565b0190602036910137565b805115614d7357614cb0614bd8565b614cd4614ccf614cca614cc38551612289565b6003900490565b614527565b614c6f565b9160208301918182518301915b828210614d2157505050600390510680600114614d0e57600214614d03575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614ce1565b506108e761166a565b6020818303126109ee578051906001600160401b0382116108b3570181601f820112156109ee578051614dae81610a84565b92614dbc6040519485610a35565b818452602082840101116108b3576108e79160208085019101610913565b92614e066108e79593614df8614e14946080885260808801906111dd565b9086820360208801526111dd565b9084820360408601526111dd565b916060818403910152610948565b600092918154614e31816111a1565b92600191808316908115614e895750600114614e4d5750505050565b90919293945060005260209081600020906000915b858310614e78575050505001903880808061120a565b805485840152918301918101614e62565b60ff191684525050500191503880808061120a565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614fd3575b506d04ee2d6d415b85acef810000000080831015614fc4575b50662386f26fc1000080831015614fb5575b506305f5e10080831015614fa6575b5061271080831015614f97575b506064821015614f87575b600a80921015614f7d575b600190816021614f35828701614c6f565b95860101905b614f47575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614f7857919082614f3b565b614f40565b9160010191614f24565b9190606460029104910191614f19565b60049193920491019138614f0e565b60089193920491019138614f01565b60109193920491019138614ef2565b60209193920491019138614ee0565b604093508104915038614ec7565b60405190614fee82610a0d565b6007825260203681840137565b602090805115615009570190565b61228561231b565b602190805160011015615009570190565b90602091805182101561503457010190565b61503c61231b565b010190565b1561504857565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117615135575b604052602a8252604036602084013760306150c283614ffb565b5360786150ce83615011565b536029905b600182116150e6576108e7915015615041565b80600f61512292166010811015615128575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188486615022565b5360041c916140fd565b906150d3565b61513061231b565b6150f8565b61513d6109f6565b6150a8565b156151675760405161515381610a0d565b60048152637472756560e01b602082015290565b60405161517381610a0d565b600581526466616c736560d81b602082015290565b62ffffff16615195614c55565b9060306151a183614ffb565b5360786151ad83615011565b5360079081905b60018211615249576151c7915015615041565b6151cf614fe1565b9182511561523c575b60236020840153600190815b8381106151f2575050505090565b61522a90600119811161522f575b6001600160f81b031961521582860185615022565b511660001a6152248288615022565b5361230b565b6151e4565b615237612256565b615200565b61524461231b565b6151d8565b80600f61527b92166010811015615281575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188487615022565b906151b4565b61528961231b565b61525b56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a36469706673582212202e75744fc556eafe78e883a2f3183bc7de9ed6d92b284cb784cf309e243d27256c6578706572696d656e74616cf564736f6c634300080c0041", + "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccessPointAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointCreationStatusAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointNotExistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointScoreCannotBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenIdForAccessPoint\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeAccessPointOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredValue\",\"type\":\"uint256\"}],\"name\":\"RequiredPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BillingChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"_billings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"}],\"name\":\"getBilling\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"initialBillings\",\"type\":\"uint256[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setBilling\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - billing for add acess point may be applied. - the contract must be not paused.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getBilling(uint8)\":{\"details\":\"Returns the billing value for a given key.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string,uint256[])\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - billing for the minting may be applied. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setBilling(uint8,uint256)\":{\"details\":\"Sets the billing value for a given key. May emit a {BillingChanged} event. Requirements: - the sender must have the `collectionOwner` role.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"},\"withdraw()\":{\"details\":\"Withdraws all the funds from contract. May emmit a {Withdrawn} event. Requirements: - the sender must have the `collectionOwner` role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0x95f7195cc0f546e06ab49a57e8d22a0ca482175ffa2a74b71ff4c7c395b7394a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://045d686ba6ddf6e1b296b87511e0610bd838a949e108b75c5f960675c4f8de0a\",\"dweb:/ipfs/QmWTyAVAg4KmoE19iKir78TNtCCjtqhJPqGqt7rNyBA6Qv\"]},\"contracts/FleekBilling.sol\":{\"keccak256\":\"0x6fed8b7faba37011bd15b0bc395ca40e24a85499dec167de6942acabc5407d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1f71b1173e8cd21e14e44e97a1add07d1f08115aa2a4053e40aacfbbc270a19\",\"dweb:/ipfs/QmSej6eRfhhL84SMMFrPJWesTUhMRc4HSTY85b2zAKzzhs\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x33d8a71103d4d5c8c39120e514cce5220530485aa05fb13bb64010daaaaac8a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f4ac13123b77e53ae8ae1c220853254e4f1aae04c8602da594f812e0a5224b3e\",\"dweb:/ipfs/QmXyFDqEJc5fWFVRYLq9bmwMAfuXXdAUTJwSH2dArFgz3v\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", "storageLayout": { "storage": [ { @@ -1733,7 +1880,7 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 5764, + "astId": 5991, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_paused", "offset": 0, @@ -1741,7 +1888,7 @@ "type": "t_bool" }, { - "astId": 5766, + "astId": 5993, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_canPause", "offset": 1, @@ -1749,7 +1896,7 @@ "type": "t_bool" }, { - "astId": 5917, + "astId": 6144, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "__gap", "offset": 0, @@ -1757,28 +1904,44 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 4434, + "astId": 4255, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_billings", + "offset": 0, + "slot": "254", + "type": "t_mapping(t_enum(Billing)4234,t_uint256)" + }, + { + "astId": 4383, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "255", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 4611, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_appIds", "offset": 0, - "slot": "254", + "slot": "304", "type": "t_uint256" }, { - "astId": 4439, + "astId": 4616, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_apps", "offset": 0, - "slot": "255", - "type": "t_mapping(t_uint256,t_struct(App)4408_storage)" + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(App)4585_storage)" }, { - "astId": 4444, + "astId": 4621, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_accessPoints", "offset": 0, - "slot": "256", - "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)" + "slot": "306", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)" } ], "types": { @@ -1810,11 +1973,16 @@ "label": "bool", "numberOfBytes": "1" }, - "t_enum(AccessPointCreationStatus)4418": { + "t_enum(AccessPointCreationStatus)4595": { "encoding": "inplace", "label": "enum FleekERC721.AccessPointCreationStatus", "numberOfBytes": "1" }, + "t_enum(Billing)4234": { + "encoding": "inplace", + "label": "enum FleekBilling.Billing", + "numberOfBytes": "1" + }, "t_enum(CollectionRoles)3829": { "encoding": "inplace", "label": "enum FleekAccessControl.CollectionRoles", @@ -1846,6 +2014,13 @@ "numberOfBytes": "32", "value": "t_uint256" }, + "t_mapping(t_enum(Billing)4234,t_uint256)": { + "encoding": "mapping", + "key": "t_enum(Billing)4234", + "label": "mapping(enum FleekBilling.Billing => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { "encoding": "mapping", "key": "t_enum(CollectionRoles)3829", @@ -1867,12 +2042,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_bool)" }, - "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)": { + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)": { "encoding": "mapping", "key": "t_string_memory_ptr", "label": "mapping(string => struct FleekERC721.AccessPoint)", "numberOfBytes": "32", - "value": "t_struct(AccessPoint)4432_storage" + "value": "t_struct(AccessPoint)4609_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1895,19 +2070,19 @@ "numberOfBytes": "32", "value": "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))" }, - "t_mapping(t_uint256,t_struct(App)4408_storage)": { + "t_mapping(t_uint256,t_struct(App)4585_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.App)", "numberOfBytes": "32", - "value": "t_struct(App)4408_storage" + "value": "t_struct(App)4585_storage" }, - "t_mapping(t_uint256,t_struct(Build)4413_storage)": { + "t_mapping(t_uint256,t_struct(Build)4590_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.Build)", "numberOfBytes": "32", - "value": "t_struct(Build)4413_storage" + "value": "t_struct(Build)4590_storage" }, "t_mapping(t_uint256,t_uint256)": { "encoding": "mapping", @@ -1926,12 +2101,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AccessPoint)4432_storage": { + "t_struct(AccessPoint)4609_storage": { "encoding": "inplace", "label": "struct FleekERC721.AccessPoint", "members": [ { - "astId": 4420, + "astId": 4597, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "tokenId", "offset": 0, @@ -1939,7 +2114,7 @@ "type": "t_uint256" }, { - "astId": 4422, + "astId": 4599, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "score", "offset": 0, @@ -1947,7 +2122,7 @@ "type": "t_uint256" }, { - "astId": 4424, + "astId": 4601, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "contentVerified", "offset": 0, @@ -1955,7 +2130,7 @@ "type": "t_bool" }, { - "astId": 4426, + "astId": 4603, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "nameVerified", "offset": 1, @@ -1963,7 +2138,7 @@ "type": "t_bool" }, { - "astId": 4428, + "astId": 4605, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "owner", "offset": 2, @@ -1971,22 +2146,22 @@ "type": "t_address" }, { - "astId": 4431, + "astId": 4608, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "status", "offset": 22, "slot": "2", - "type": "t_enum(AccessPointCreationStatus)4418" + "type": "t_enum(AccessPointCreationStatus)4595" } ], "numberOfBytes": "96" }, - "t_struct(App)4408_storage": { + "t_struct(App)4585_storage": { "encoding": "inplace", "label": "struct FleekERC721.App", "members": [ { - "astId": 4388, + "astId": 4565, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "name", "offset": 0, @@ -1994,7 +2169,7 @@ "type": "t_string_storage" }, { - "astId": 4390, + "astId": 4567, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "description", "offset": 0, @@ -2002,7 +2177,7 @@ "type": "t_string_storage" }, { - "astId": 4392, + "astId": 4569, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "externalURL", "offset": 0, @@ -2010,7 +2185,7 @@ "type": "t_string_storage" }, { - "astId": 4394, + "astId": 4571, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "ENS", "offset": 0, @@ -2018,7 +2193,7 @@ "type": "t_string_storage" }, { - "astId": 4396, + "astId": 4573, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "currentBuild", "offset": 0, @@ -2026,15 +2201,15 @@ "type": "t_uint256" }, { - "astId": 4401, + "astId": 4578, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "builds", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(Build)4413_storage)" + "type": "t_mapping(t_uint256,t_struct(Build)4590_storage)" }, { - "astId": 4403, + "astId": 4580, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "logo", "offset": 0, @@ -2042,7 +2217,7 @@ "type": "t_string_storage" }, { - "astId": 4405, + "astId": 4582, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "color", "offset": 0, @@ -2050,7 +2225,7 @@ "type": "t_uint24" }, { - "astId": 4407, + "astId": 4584, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "accessPointAutoApproval", "offset": 3, @@ -2060,12 +2235,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Build)4413_storage": { + "t_struct(Build)4590_storage": { "encoding": "inplace", "label": "struct FleekERC721.Build", "members": [ { - "astId": 4410, + "astId": 4587, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "commitHash", "offset": 0, @@ -2073,7 +2248,7 @@ "type": "t_string_storage" }, { - "astId": 4412, + "astId": 4589, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "gitRepository", "offset": 0, diff --git a/contracts/deployments/mumbai/FleekSVG.json b/contracts/deployments/mumbai/FleekSVG.json index 37d225f..3258069 100644 --- a/contracts/deployments/mumbai/FleekSVG.json +++ b/contracts/deployments/mumbai/FleekSVG.json @@ -1,8 +1,8 @@ { - "timestamp": "2/24/2023, 5:28:19 PM", - "address": "0xCb27660FB9F5b7c29E96e113d4792C0f835C3aE1", - "transactionHash": "0xab0f6435ab531ee7edea783f3e5c9c407e3a1437af3f6df0ea4e2b7fde7dd2d6", - "gasPrice": 2500000019, + "timestamp": "3/3/2023, 3:17:49 PM", + "address": "0x420392C6c1D8C7A6B992D84D492eEdb2b7d236C6", + "transactionHash": "0xf7ca9b35827ab9d58b5cae0c695429833a07f7b76a7e7b68c1ac6442aa7f3038", + "gasPrice": 1500000020, "abi": [ { "inputs": [ @@ -39,8 +39,8 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001a57612ae99081610021823930815050f35b50600080fdfe6080604052600480361015610015575b50600080fd5b6000803560e01c63891c235f1461002c575061000f565b60803660031901126100e05767ffffffffffffffff82358181116100d9576100579036908501610156565b926024358281116100d15761006f9036908301610156565b916044358181116100c8576100879036908401610156565b936064359182116100bf5750916100a96100af94926100bb9694369101610156565b92610226565b604051918291826101e3565b0390f35b94505050505080fd5b50505050809150fd5b505050809150fd5b5050809150fd5b809150fd5b50634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761011e57604052565b6101266100e5565b604052565b60209067ffffffffffffffff8111610149575b601f01601f19160190565b6101516100e5565b61013e565b81601f820112156101a65780359061016d8261012b565b9261017b60405194856100fc565b8284526020838301011161019d57816000926020809301838601378301015290565b50505050600080fd5b505050600080fd5b918091926000905b8282106101ce5750116101c7575050565b6000910152565b915080602091830151818601520182916101b6565b6040916020825261020381518092816020860152602086860191016101ae565b601f01601f1916010190565b90610222602092828151948592016101ae565b0190565b604080517f3c7376672077696474683d223130363522206865696768743d2231303635222060208201527f76696577426f783d2230203020313036352031303635222066696c6c3d226e6f918101919091527f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32303060608201527f302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77608082015271199737b93397989c9c9c97bc3634b735911f60711b60a08201529384939092909160b285017f3c7374796c6520747970653d22746578742f637373223e40696d706f7274207581527f726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d60208201527f2f637373323f66616d696c793d496e7465723a77676874403530303b36303022604082015269149d9e17b9ba3cb6329f60b11b6060820152606a017f3c726563742077696474683d223130363522206865696768743d22313036352281527f2066696c6c3d2275726c28236261636b67726f756e642922202f3e3c7265637460208201527f206f7061636974793d22302e32222077696474683d223130363522206865696760408201527f68743d2231303635222066696c6c3d2275726c28236261636b67726f756e642d60608201526a3930b234b0b6149110179f60a91b6080820152608b017f3c672066696c7465723d2275726c28236469736b657474652d736861646f772981527f223e3c7061746820643d224d3835372e323331203237392e3731324c3930322e60208201527f3234203238362e363735433931302e353437203238372e3936203931372e393160408201527f35203239322e373231203932322e35203239392e3736384c3933382e3839342060608201527f3332342e393634433934322e323439203333302e3132203934332e333131203360808201527f33362e343337203934312e383237203334322e3430364c3933372e373938203360a08201527f35382e3631354c3932342e303439203335362e36354c3931392e34313620333760c08201527f342e3038344c3933342e303638203337362e32344c3739312e3934372039323260e08201527f2e313532433738382e313039203933362e383936203737332e363934203934366101008201527f2e333038203735382e363531203934332e3839334c3137392e363336203835306101208201527f2e393238433136322e333138203834382e313437203135312e323135203833306101408201527f2e393837203135352e373736203831342e3035314c3136302e343738203739366101608201527f2e35394c3730342e333135203837392e3537344c3835372e323331203237392e6101808201527f3731325a222066696c6c3d222330353035303522202f3e3c2f673e00000000006101a08201526101bb017f3c7061746820643d224d3834302e323331203234302e3731324c3838352e323481527f203234372e363735433839332e353437203234382e393631203930302e39313560208201527f203235332e373232203930352e35203236302e3736384c3932312e383934203260408201527f38352e393635433932352e323439203239312e3132203932362e33313120323960608201527f372e343337203932342e383237203330332e3430364c3932302e37393820333160808201527f392e3631364c3930372e303439203331372e36354c3930322e3431362033333560a08201527f2e3038344c3931372e303638203333372e3234314c3737342e3934372038383360c08201527f2e313532433737312e313039203839372e383936203735362e3639342039303760e08201527f2e333038203734312e363531203930342e3839334c3136322e363336203831316101008201527f2e393238433134352e333138203830392e313437203133342e323135203739316101208201527f2e393837203133382e373736203737352e3035314c3134332e343738203735376101408201527f2e35394c3638372e333135203834302e3537344c3834302e323331203234302e6101608201527f3731325a222066696c6c3d2275726c28236d61696e2922202f3e00000000000061018082015261019a01600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3331392e383437203136312e353060208201527f32433331302e333536203136302e303037203330302e363734203136362e333260408201527f36203239382e323231203137352e3631364c3133382e373234203737392e373560608201527f38433133362e323731203738392e303438203134312e393737203739372e373960808201527f203135312e343638203739392e3238354c3734302e303631203839312e39373360a08201527f433734392e353533203839332e343637203735392e323335203838372e31343860c08201527f203736312e363837203837372e3835384c3930322e343035203334342e38353460e08201527f4c3838392e313538203334322e3736384c3839382e383732203330352e3937326101008201527f4c3931322e313139203330382e3035394c3931332e373333203330312e3934366101208201527f433931342e383337203239372e373632203931342e333039203239332e3437366101408201527f203931322e323531203238392e3932374c3839332e343834203235372e3536396101608201527f433839312e313533203235332e353439203838372e303633203235302e3832336101808201527f203838322e323231203235302e3036314c3832382e323035203234312e3535346101a08201527f433832322e323234203234302e363133203831352e383639203234322e3738336101c08201527f203831312e343237203234372e3238344c3830352e363836203235332e3130336101e08201527f433830342e323035203235342e363033203830322e303837203235352e3332366102008201527f203830302e303933203235352e3031334c3738332e363131203235322e3431376102208201527f4c3733342e33203433392e313936433733312e343339203435302e30333520376102408201527f32302e313433203435372e343037203730392e3037203435352e3636334c33326102608201527f382e383437203339352e373838433331372e373734203339342e3034352033316102808201527f312e313137203338332e383435203331332e393738203337332e3030374c33366102a08201527f362e353238203137332e3936324c3336362e353333203137332e3934314333366102c08201527f372e323334203137312e3234203336352e353732203136382e373032203336326102e08201527f2e3831203136382e3236374c3331392e383437203136312e3530325a4d3336396103008201527f2e333932203137342e3431344c3336382e363532203137372e3231374c3331366103208201527f2e383433203337332e343538433331342e3339203338322e373438203332302e6103408201527f303936203339312e3439203332392e353837203339322e3938354c3730392e386103608201527f31203435322e3836433731392e333031203435342e333534203732382e3938336103808201527f203434382e303335203733312e343336203433382e3734354c3738302e3734376103a08201527f203235312e3936364c3738332e323435203234322e3530344c3738332e3938356103c08201527f203233392e3730314c3336392e333932203137342e3431345a222066696c6c3d6103e08201526b111198999899989b1110179f60a11b61040082015261040c01600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223422207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3331392e383437203136312e353032433331302e33353620313660808201527f302e303037203330302e363734203136362e333236203239382e32323120313760a08201527f352e3631364c3133382e373234203737392e373538433133362e32373120373860c08201527f392e303438203134312e393737203739372e3739203135312e3436382037393960e08201527f2e3238354c3734302e303631203839312e393733433734392e353533203839336101008201527f2e343637203735392e323335203838372e313438203736312e363837203837376101208201527f2e3835384c3930322e343035203334342e3835344c3838392e313538203334326101408201527f2e3736384c3839382e383732203330352e3937324c3931322e313139203330386101608201527f2e3035394c3931332e373333203330312e393436433931342e383337203239376101808201527f2e373632203931342e333039203239332e343736203931322e323531203238396101a08201527f2e3932374c3839332e343834203235372e353639433839312e313533203235336101c08201527f2e353439203838372e303633203235302e383233203838322e323231203235306101e08201527f2e3036314c3832382e323035203234312e353534433832322e323234203234306102008201527f2e363133203831352e383639203234322e373833203831312e343237203234376102208201527f2e3238344c3830352e363836203235332e313033433830342e323035203235346102408201527f2e363033203830322e303837203235352e333236203830302e303933203235356102608201527f2e3031334c3738332e363131203235322e3431374c3733342e33203433392e316102808201527f3936433733312e343339203435302e303335203732302e313433203435372e346102a08201527f3037203730392e3037203435352e3636334c3332382e383437203339352e37386102c08201527f38433331372e373734203339342e303435203331312e313137203338332e38346102e08201527f35203331332e393738203337332e3030374c3336362e353238203137332e39366103008201527f324c3336362e353333203137332e393431433336372e323334203137312e32346103208201527f203336352e353732203136382e373032203336322e3831203136382e3236374c6103408201527f3331392e383437203136312e3530325a4d3336392e333932203137342e3431346103608201527f4c3336382e363532203137372e3231374c3331362e383433203337332e3435386103808201527f433331342e3339203338322e373438203332302e303936203339312e343920336103a08201527f32392e353837203339322e3938354c3730392e3831203435322e3836433731396103c08201527f2e333031203435342e333534203732382e393833203434382e303335203733316103e08201527f2e343336203433382e3734354c3738302e373437203235312e3936364c3738336104008201527f2e323435203234322e3530344c3738332e393835203233392e3730314c3336396104208201527f2e333932203137342e3431345a222066696c6c3d2275726c28236469736b65746104408201527f74652d6772616469656e7429222066696c6c2d6f7061636974793d22302e32226104608201526210179f60e91b610480820152610483017f3c7061746820643d224d3333352e3338203230382e313133433333352e39323281527f203230382e313938203333362e343137203230372e363836203333362e32383360208201527f203230372e3137394c3333302e3339203138342e373935433333302e3234392060408201527f3138342e323631203332392e353239203138342e313438203332392e3132392060608201527f3138342e3539374c3331322e333538203230332e343131433331312e3937382060808201527f3230332e383338203331322e313734203230342e343538203331322e3731362060a08201527f3230342e3534344c3331372e393632203230352e3337433331382e333537203260c08201527f30352e343332203331382e353935203230352e373936203331382e343933203260e08201527f30362e3138334c3331342e37203232302e353531433331342e353937203232306101008201527f2e393338203331342e383335203232312e333032203331352e323331203232316101208201527f2e3336344c3332342e353339203232322e3833433332342e393335203232322e6101408201527f383933203332352e333338203232322e363239203332352e3434203232322e326101608201527f34324c3332392e323333203230372e383735433332392e333336203230372e346101808201527f3838203332392e373339203230372e323234203333302e313335203230372e326101a08201527f38364c3333352e3338203230382e3131335a222066696c6c3d2275726c28236d6101c08201526730b4b7149110179f60c11b6101e08201526101e8017f3c7061746820643d224d3331392e323832203236392e303837433331392e383281527f34203236392e313733203332302e333139203236382e363631203332302e313860208201527f36203236382e3135344c3331342e323932203234352e3737433331342e31353160408201527f203234352e323336203331332e343331203234352e313233203331332e30333160608201527f203234352e3537324c3239362e323631203236342e333836433239352e38382060808201527f3236342e383132203239362e303736203236352e343333203239362e3631382060a08201527f3236352e3531384c3330312e383634203236362e333434433330322e3235392060c08201527f3236362e343037203330322e343937203236362e373731203330322e3339352060e08201527f3236372e3135384c3239382e363032203238312e353236433239382e352032386101008201527f312e393133203239382e373337203238322e323737203239392e3133332032386101208201527f322e3333394c3330382e343431203238332e383035433330382e3833372032386101408201527f332e383637203330392e3234203238332e363034203330392e333433203238336101608201527f2e3231374c3331332e313336203236382e383439433331332e323338203236386101808201527f2e343632203331332e363431203236382e313939203331342e303337203236386101a08201527f2e3236314c3331392e323832203236392e3038375a222066696c6c3d22626c616101c08201527f636b222066696c6c2d6f7061636974793d22302e3522202f3e000000000000006101e08201526101f9017f3c7061746820643d224d3330332e313834203333302e303632433330332e373281527f36203333302e313438203330342e323231203332392e363336203330342e303860208201527f38203332392e3132384c3239382e313934203330362e373435433239382e303560408201527f33203330362e323131203239372e333333203330362e303938203239362e393360608201527f33203330362e3534374c3238302e313633203332352e333631433237392e373860808201527f32203332352e373837203237392e393739203332362e343038203238302e353260a08201527f203332362e3439334c3238352e373636203332372e333139433238362e31363160c08201527f203332372e333832203238362e333939203332372e373436203238362e32393760e08201527f203332382e3133334c3238322e353034203334322e353031433238322e3430326101008201527f203334322e383838203238322e363339203334332e323532203238332e3033356101208201527f203334332e3331344c3239322e333434203334342e3738433239322e373339206101408201527f3334342e383432203239332e313432203334342e353739203239332e323435206101608201527f3334342e3139324c3239372e303338203332392e383234433239372e313420336101808201527f32392e343337203239372e353433203332392e313734203239372e39333920336101a08201527f32392e3233364c3330332e313834203333302e3036325a222066696c6c3d22626101c08201527f6c61636b222066696c6c2d6f7061636974793d22302e3522202f3e00000000006101e08201526101fb017f3c70617468207374726f6b653d2275726c28236d61696e2922207374726f6b6581527f2d77696474683d223622207374726f6b652d6c696e656361703d22726f756e6460208201527f22207374726f6b652d6c696e656a6f696e3d22726f756e642220643d224d323960408201527f302e313039203436332e343138433239322e333538203435342e39303220333060608201527f312e323333203434392e3131203330392e393333203435302e34384c3737312e60808201527f3037203532332e303936433737392e3737203532342e3436372037383520353360a08201527f322e3438203738322e373532203534302e3939364c3639322e3038362038383460c08201527f2e3431384c3139392e343433203830362e38344c3239302e313039203436332e60e08201527f3431385a222066696c6c3d22626c61636b222066696c6c2d6f7061636974793d61010082015268111817189a1110179f60b91b61012082015261012901600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223622207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3738372e353839203233372e3334394c3436302e33353420313860808201527f352e3831384c3430362e333235203339302e343639433430332e38373220333960a08201527f392e373539203430392e353738203430382e353031203431392e30363920343060c08201527f392e3939364c3731312e393334203435362e313134433732312e34323520343560e08201527f372e363039203733312e313037203435312e3239203733332e3536203434324c6101008201527f3738372e353839203233372e3334395a4d3636302e323639203234352e3031436101208201527f3635352e353233203234342e323633203635302e363832203234372e343233206101408201527f3634392e343536203235322e3036384c3630372e333836203431312e343138436101608201527f3630362e3136203431362e303633203630392e303133203432302e34333420366101808201527f31332e373539203432312e3138314c3638322e343939203433322e30303643366101a08201527f38372e323435203433322e373533203639322e303836203432392e35393420366101c08201527f39332e333132203432342e3934394c3733352e333832203236352e35393943376101e08201527f33362e363038203236302e393534203733332e373535203235362e35383320376102008201527f32392e3031203235352e3833354c3636302e323639203234352e30315a2220666102208201527234b6361e913ab9361411b6b0b4b7149110179f60691b61024082015261025301600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3836342e363433203238332e393360208201527f37433836352e313836203238332e363035203836352e373038203238342e323560408201527f37203836352e323339203238342e3638334c3834342e323638203330332e373160608201527f39433834332e393338203330342e303138203834342e303933203330342e353160808201527f37203834342e353236203330342e3534384c3835332e373236203330352e323060a08201527f37433835342e313834203330352e3234203835342e333231203330352e37383760c08201527f203835332e393432203330362e3037314c3833332e383834203332312e31313260e08201527f433833332e353036203332312e333936203833332e363433203332312e3934336101008201527f203833342e313031203332312e3937364c3834342e303037203332322e3638356101208201527f433834342e343931203332322e3732203834342e363035203332332e333139206101408201527f3834342e313737203332332e35384c3739372e373532203335312e39353443376101608201527f39372e323039203335322e323836203739362e363837203335312e36333420376101808201527f39372e313536203335312e3230394c3831382e343033203333312e39323243386101a08201527f31382e373333203333312e363232203831382e353737203333312e31323320386101c08201527f31382e313435203333312e3039324c3830382e373438203333302e34324338306101e08201527f382e323932203333302e333837203830382e313534203332392e3834332038306102008201527f382e353239203332392e3535384c3832382e303534203331342e3734344338326102208201527f382e3433203331342e343539203832382e323931203331332e393135203832376102408201527f2e383335203331332e3838324c3831382e333839203331332e323036433831376102608201527f2e393034203331332e313731203831372e3739203331322e353732203831382e6102808201527f323138203331322e3331314c3836342e363433203238332e3933375a222066696102a08201526c36361e913bb434ba329110179f60991b6102c08201526102cd017f3c67207472616e73666f726d3d226d617472697828302e39383738323720302e81527f313535353537202d302e32353532363120302e3936363837322032353020373360208201527f3529223e3c7465787420666f6e742d66616d696c793d22496e7465722c20736160408201527f6e732d73657269662220666f6e742d7765696768743d22626f6c642220666f6e60608201527f742d73697a653d223432222066696c6c3d2223453545374638223e00000000006080820152609b016121e99161020f565b7f3c2f746578743e3c7465787420666f6e742d66616d696c793d22496e7465722c81527f2073616e732d73657269662220666f6e742d7765696768743d226e6f726d616c60208201527f2220793d2234302220666f6e742d73697a653d223232222066696c6c3d222337604082015266231c189c99111f60c91b60608201526067016122749161020f565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f3c696d6167652077696474683d2231363722206865696768743d22313637222081527f7472616e73666f726d3d226d617472697828302e39383738323720302e31353560208201527f353537202d302e32353532363120302e393636383732203434342e313137203560408201526d191a17189b949110343932b31e9160911b6060820152606e0161231a9161020f565b631110179f60e11b8152600401651e3232b3399f60d11b81526006017f3c66696c7465722069643d226469736b657474652d736861646f772220783d2281527f37302e373438392220793d223139352e373132222077696474683d223935352e60208201527f37333322206865696768743d223833322e353538222066696c746572556e697460408201527f733d227573657253706163654f6e5573652220636f6c6f722d696e746572706f60608201527f6c6174696f6e2d66696c746572733d2273524742223e3c6665466c6f6f64206660808201527f6c6f6f642d6f7061636974793d223022202f3e3c6665426c656e6420696e3d2260a08201527f536f757263654772617068696322202f3e3c6665476175737369616e426c757260c08201527f20737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e000060e082015260fe017f3c6c696e6561724772616469656e742069643d226261636b67726f756e64222081527f78313d223533322e35222079313d2230222078323d223533322e35222079323d60208201527f223130363522206772616469656e74556e6974733d227573657253706163654f60408201527f6e557365223e3c73746f70202f3e3c73746f70206f66667365743d223122207360608201527f746f702d636f6c6f723d222331333133313322202f3e3c2f6c696e656172477260808201526630b234b2b73a1f60c91b60a082015260a7017f3c72616469616c4772616469656e742069643d226261636b67726f756e642d7281527f616469616c222063783d2230222063793d22302220723d22312220677261646960208201527f656e74556e6974733d227573657253706163654f6e557365222067726164696560408201527f6e745472616e73666f726d3d227472616e736c617465283533322e352035333260608201527f2e352920726f746174652838392e39363129207363616c652837333529223e3c60808201527039ba37b81039ba37b816b1b7b637b91e9160791b60a082015260b101612616908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d8152601160f91b6020820152602101612650908261020f565b7f222073746f702d6f7061636974793d223022202f3e3c2f72616469616c4772618152653234b2b73a1f60d11b60208201526026017f3c6c696e6561724772616469656e742069643d226469736b657474652d67726181527f6469656e74222078313d223932352e363236222079313d223235362e3839362260208201527f2078323d223133362e373739222079323d223830302e3230332220677261646960408201527f656e74556e6974733d227573657253706163654f6e557365223e3c73746f702060608201526b39ba37b816b1b7b637b91e9160a11b6080820152608c0161273c908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d81527f222332433331334622202f3e3c2f6c696e6561724772616469656e743e0000006020820152603d017f3c6c696e6561724772616469656e742069643d226d61696e223e3c73746f702081526b39ba37b816b1b7b637b91e9160a11b6020820152602c016127cc9161020f565b741110179f1e17b634b732b0b923b930b234b2b73a1f60591b8152601501661e17b232b3399f60c91b8152600701651e17b9bb339f60d11b81526006010390601f1991828101825261281e90826100fc565b612827906129aa565b6040517f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015291908290603a82016128619161020f565b03908101825261287190826100fc565b90565b604051906020820182811067ffffffffffffffff821117612899575b60405260008252565b6128a16100e5565b612890565b604051906060820182811067ffffffffffffffff821117612917575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61291f6100e5565b6128c2565b50634e487b7160e01b600052601160045260246000fd5b600290600219811161294b570190565b610222612924565b6001600160fe1b03811160011661296b575b60021b90565b612973612924565b612965565b906129828261012b565b61298f60405191826100fc565b82815280926129a0601f199161012b565b0190602036910137565b805115612a7c576129b96128a6565b6129dd6129d86129d36129cc855161293b565b6003900490565b612953565b612978565b9160208301918182518301915b828210612a2a57505050600390510680600114612a1757600214612a0c575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c16880101516002860153168501015190820153019391906129ea565b5061287161287456fe3c706174682066696c6c2d72756c653d226576656e6f64642220636c69702d72a36469706673582212205b19216396955a2700f08c918b4c5215a1ce7c6155058e77039c4705e747d0ad6c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"color\",\"type\":\"string\"}],\"name\":\"generateBase64\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"generateBase64(string,string,string,string)\":{\"details\":\"Generates a SVG image.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/util/FleekSVG.sol\":\"FleekSVG\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0xebea929fabed84ed7e45572a13124087264e732a1b55dd7b07c5c26fcde46566\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://232fcba746f4bea888df7258a57031fbe82c6782861941b21a2b745766b8f97d\",\"dweb:/ipfs/QmSnK97Z6Mk1CXvGbf9PbK4Wi3MFNYLcy1vRrXaFSEQgfx\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x4e72d7848d5c44fcc6502054e74d26ede597641342be60e1f8c2978f607db715\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c020f490edc637208060b41dda06ea99c0dc9714917e4cb7729268b8a8ec85f2\",\"dweb:/ipfs/QmRmwK8YXk19kYG9w1qNMe2FAVEtRytKow4u8TRJyb3NPJ\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", + "bytecode": "0x6080806040523461001a57612ae99081610021823930815050f35b50600080fdfe6080604052600480361015610015575b50600080fd5b6000803560e01c63891c235f1461002c575061000f565b60803660031901126100e05767ffffffffffffffff82358181116100d9576100579036908501610156565b926024358281116100d15761006f9036908301610156565b916044358181116100c8576100879036908401610156565b936064359182116100bf5750916100a96100af94926100bb9694369101610156565b92610226565b604051918291826101e3565b0390f35b94505050505080fd5b50505050809150fd5b505050809150fd5b5050809150fd5b809150fd5b50634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761011e57604052565b6101266100e5565b604052565b60209067ffffffffffffffff8111610149575b601f01601f19160190565b6101516100e5565b61013e565b81601f820112156101a65780359061016d8261012b565b9261017b60405194856100fc565b8284526020838301011161019d57816000926020809301838601378301015290565b50505050600080fd5b505050600080fd5b918091926000905b8282106101ce5750116101c7575050565b6000910152565b915080602091830151818601520182916101b6565b6040916020825261020381518092816020860152602086860191016101ae565b601f01601f1916010190565b90610222602092828151948592016101ae565b0190565b604080517f3c7376672077696474683d223130363522206865696768743d2231303635222060208201527f76696577426f783d2230203020313036352031303635222066696c6c3d226e6f918101919091527f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32303060608201527f302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77608082015271199737b93397989c9c9c97bc3634b735911f60711b60a08201529384939092909160b285017f3c7374796c6520747970653d22746578742f637373223e40696d706f7274207581527f726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d60208201527f2f637373323f66616d696c793d496e7465723a77676874403530303b36303022604082015269149d9e17b9ba3cb6329f60b11b6060820152606a017f3c726563742077696474683d223130363522206865696768743d22313036352281527f2066696c6c3d2275726c28236261636b67726f756e642922202f3e3c7265637460208201527f206f7061636974793d22302e32222077696474683d223130363522206865696760408201527f68743d2231303635222066696c6c3d2275726c28236261636b67726f756e642d60608201526a3930b234b0b6149110179f60a91b6080820152608b017f3c672066696c7465723d2275726c28236469736b657474652d736861646f772981527f223e3c7061746820643d224d3835372e323331203237392e3731324c3930322e60208201527f3234203238362e363735433931302e353437203238372e3936203931372e393160408201527f35203239322e373231203932322e35203239392e3736384c3933382e3839342060608201527f3332342e393634433934322e323439203333302e3132203934332e333131203360808201527f33362e343337203934312e383237203334322e3430364c3933372e373938203360a08201527f35382e3631354c3932342e303439203335362e36354c3931392e34313620333760c08201527f342e3038344c3933342e303638203337362e32344c3739312e3934372039323260e08201527f2e313532433738382e313039203933362e383936203737332e363934203934366101008201527f2e333038203735382e363531203934332e3839334c3137392e363336203835306101208201527f2e393238433136322e333138203834382e313437203135312e323135203833306101408201527f2e393837203135352e373736203831342e3035314c3136302e343738203739366101608201527f2e35394c3730342e333135203837392e3537344c3835372e323331203237392e6101808201527f3731325a222066696c6c3d222330353035303522202f3e3c2f673e00000000006101a08201526101bb017f3c7061746820643d224d3834302e323331203234302e3731324c3838352e323481527f203234372e363735433839332e353437203234382e393631203930302e39313560208201527f203235332e373232203930352e35203236302e3736384c3932312e383934203260408201527f38352e393635433932352e323439203239312e3132203932362e33313120323960608201527f372e343337203932342e383237203330332e3430364c3932302e37393820333160808201527f392e3631364c3930372e303439203331372e36354c3930322e3431362033333560a08201527f2e3038344c3931372e303638203333372e3234314c3737342e3934372038383360c08201527f2e313532433737312e313039203839372e383936203735362e3639342039303760e08201527f2e333038203734312e363531203930342e3839334c3136322e363336203831316101008201527f2e393238433134352e333138203830392e313437203133342e323135203739316101208201527f2e393837203133382e373736203737352e3035314c3134332e343738203735376101408201527f2e35394c3638372e333135203834302e3537344c3834302e323331203234302e6101608201527f3731325a222066696c6c3d2275726c28236d61696e2922202f3e00000000000061018082015261019a01600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3331392e383437203136312e353060208201527f32433331302e333536203136302e303037203330302e363734203136362e333260408201527f36203239382e323231203137352e3631364c3133382e373234203737392e373560608201527f38433133362e323731203738392e303438203134312e393737203739372e373960808201527f203135312e343638203739392e3238354c3734302e303631203839312e39373360a08201527f433734392e353533203839332e343637203735392e323335203838372e31343860c08201527f203736312e363837203837372e3835384c3930322e343035203334342e38353460e08201527f4c3838392e313538203334322e3736384c3839382e383732203330352e3937326101008201527f4c3931322e313139203330382e3035394c3931332e373333203330312e3934366101208201527f433931342e383337203239372e373632203931342e333039203239332e3437366101408201527f203931322e323531203238392e3932374c3839332e343834203235372e3536396101608201527f433839312e313533203235332e353439203838372e303633203235302e3832336101808201527f203838322e323231203235302e3036314c3832382e323035203234312e3535346101a08201527f433832322e323234203234302e363133203831352e383639203234322e3738336101c08201527f203831312e343237203234372e3238344c3830352e363836203235332e3130336101e08201527f433830342e323035203235342e363033203830322e303837203235352e3332366102008201527f203830302e303933203235352e3031334c3738332e363131203235322e3431376102208201527f4c3733342e33203433392e313936433733312e343339203435302e30333520376102408201527f32302e313433203435372e343037203730392e3037203435352e3636334c33326102608201527f382e383437203339352e373838433331372e373734203339342e3034352033316102808201527f312e313137203338332e383435203331332e393738203337332e3030374c33366102a08201527f362e353238203137332e3936324c3336362e353333203137332e3934314333366102c08201527f372e323334203137312e3234203336352e353732203136382e373032203336326102e08201527f2e3831203136382e3236374c3331392e383437203136312e3530325a4d3336396103008201527f2e333932203137342e3431344c3336382e363532203137372e3231374c3331366103208201527f2e383433203337332e343538433331342e3339203338322e373438203332302e6103408201527f303936203339312e3439203332392e353837203339322e3938354c3730392e386103608201527f31203435322e3836433731392e333031203435342e333534203732382e3938336103808201527f203434382e303335203733312e343336203433382e3734354c3738302e3734376103a08201527f203235312e3936364c3738332e323435203234322e3530344c3738332e3938356103c08201527f203233392e3730314c3336392e333932203137342e3431345a222066696c6c3d6103e08201526b111198999899989b1110179f60a11b61040082015261040c01600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223422207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3331392e383437203136312e353032433331302e33353620313660808201527f302e303037203330302e363734203136362e333236203239382e32323120313760a08201527f352e3631364c3133382e373234203737392e373538433133362e32373120373860c08201527f392e303438203134312e393737203739372e3739203135312e3436382037393960e08201527f2e3238354c3734302e303631203839312e393733433734392e353533203839336101008201527f2e343637203735392e323335203838372e313438203736312e363837203837376101208201527f2e3835384c3930322e343035203334342e3835344c3838392e313538203334326101408201527f2e3736384c3839382e383732203330352e3937324c3931322e313139203330386101608201527f2e3035394c3931332e373333203330312e393436433931342e383337203239376101808201527f2e373632203931342e333039203239332e343736203931322e323531203238396101a08201527f2e3932374c3839332e343834203235372e353639433839312e313533203235336101c08201527f2e353439203838372e303633203235302e383233203838322e323231203235306101e08201527f2e3036314c3832382e323035203234312e353534433832322e323234203234306102008201527f2e363133203831352e383639203234322e373833203831312e343237203234376102208201527f2e3238344c3830352e363836203235332e313033433830342e323035203235346102408201527f2e363033203830322e303837203235352e333236203830302e303933203235356102608201527f2e3031334c3738332e363131203235322e3431374c3733342e33203433392e316102808201527f3936433733312e343339203435302e303335203732302e313433203435372e346102a08201527f3037203730392e3037203435352e3636334c3332382e383437203339352e37386102c08201527f38433331372e373734203339342e303435203331312e313137203338332e38346102e08201527f35203331332e393738203337332e3030374c3336362e353238203137332e39366103008201527f324c3336362e353333203137332e393431433336372e323334203137312e32346103208201527f203336352e353732203136382e373032203336322e3831203136382e3236374c6103408201527f3331392e383437203136312e3530325a4d3336392e333932203137342e3431346103608201527f4c3336382e363532203137372e3231374c3331362e383433203337332e3435386103808201527f433331342e3339203338322e373438203332302e303936203339312e343920336103a08201527f32392e353837203339322e3938354c3730392e3831203435322e3836433731396103c08201527f2e333031203435342e333534203732382e393833203434382e303335203733316103e08201527f2e343336203433382e3734354c3738302e373437203235312e3936364c3738336104008201527f2e323435203234322e3530344c3738332e393835203233392e3730314c3336396104208201527f2e333932203137342e3431345a222066696c6c3d2275726c28236469736b65746104408201527f74652d6772616469656e7429222066696c6c2d6f7061636974793d22302e32226104608201526210179f60e91b610480820152610483017f3c7061746820643d224d3333352e3338203230382e313133433333352e39323281527f203230382e313938203333362e343137203230372e363836203333362e32383360208201527f203230372e3137394c3333302e3339203138342e373935433333302e3234392060408201527f3138342e323631203332392e353239203138342e313438203332392e3132392060608201527f3138342e3539374c3331322e333538203230332e343131433331312e3937382060808201527f3230332e383338203331322e313734203230342e343538203331322e3731362060a08201527f3230342e3534344c3331372e393632203230352e3337433331382e333537203260c08201527f30352e343332203331382e353935203230352e373936203331382e343933203260e08201527f30362e3138334c3331342e37203232302e353531433331342e353937203232306101008201527f2e393338203331342e383335203232312e333032203331352e323331203232316101208201527f2e3336344c3332342e353339203232322e3833433332342e393335203232322e6101408201527f383933203332352e333338203232322e363239203332352e3434203232322e326101608201527f34324c3332392e323333203230372e383735433332392e333336203230372e346101808201527f3838203332392e373339203230372e323234203333302e313335203230372e326101a08201527f38364c3333352e3338203230382e3131335a222066696c6c3d2275726c28236d6101c08201526730b4b7149110179f60c11b6101e08201526101e8017f3c7061746820643d224d3331392e323832203236392e303837433331392e383281527f34203236392e313733203332302e333139203236382e363631203332302e313860208201527f36203236382e3135344c3331342e323932203234352e3737433331342e31353160408201527f203234352e323336203331332e343331203234352e313233203331332e30333160608201527f203234352e3537324c3239362e323631203236342e333836433239352e38382060808201527f3236342e383132203239362e303736203236352e343333203239362e3631382060a08201527f3236352e3531384c3330312e383634203236362e333434433330322e3235392060c08201527f3236362e343037203330322e343937203236362e373731203330322e3339352060e08201527f3236372e3135384c3239382e363032203238312e353236433239382e352032386101008201527f312e393133203239382e373337203238322e323737203239392e3133332032386101208201527f322e3333394c3330382e343431203238332e383035433330382e3833372032386101408201527f332e383637203330392e3234203238332e363034203330392e333433203238336101608201527f2e3231374c3331332e313336203236382e383439433331332e323338203236386101808201527f2e343632203331332e363431203236382e313939203331342e303337203236386101a08201527f2e3236314c3331392e323832203236392e3038375a222066696c6c3d22626c616101c08201527f636b222066696c6c2d6f7061636974793d22302e3522202f3e000000000000006101e08201526101f9017f3c7061746820643d224d3330332e313834203333302e303632433330332e373281527f36203333302e313438203330342e323231203332392e363336203330342e303860208201527f38203332392e3132384c3239382e313934203330362e373435433239382e303560408201527f33203330362e323131203239372e333333203330362e303938203239362e393360608201527f33203330362e3534374c3238302e313633203332352e333631433237392e373860808201527f32203332352e373837203237392e393739203332362e343038203238302e353260a08201527f203332362e3439334c3238352e373636203332372e333139433238362e31363160c08201527f203332372e333832203238362e333939203332372e373436203238362e32393760e08201527f203332382e3133334c3238322e353034203334322e353031433238322e3430326101008201527f203334322e383838203238322e363339203334332e323532203238332e3033356101208201527f203334332e3331344c3239322e333434203334342e3738433239322e373339206101408201527f3334342e383432203239332e313432203334342e353739203239332e323435206101608201527f3334342e3139324c3239372e303338203332392e383234433239372e313420336101808201527f32392e343337203239372e353433203332392e313734203239372e39333920336101a08201527f32392e3233364c3330332e313834203333302e3036325a222066696c6c3d22626101c08201527f6c61636b222066696c6c2d6f7061636974793d22302e3522202f3e00000000006101e08201526101fb017f3c70617468207374726f6b653d2275726c28236d61696e2922207374726f6b6581527f2d77696474683d223622207374726f6b652d6c696e656361703d22726f756e6460208201527f22207374726f6b652d6c696e656a6f696e3d22726f756e642220643d224d323960408201527f302e313039203436332e343138433239322e333538203435342e39303220333060608201527f312e323333203434392e3131203330392e393333203435302e34384c3737312e60808201527f3037203532332e303936433737392e3737203532342e3436372037383520353360a08201527f322e3438203738322e373532203534302e3939364c3639322e3038362038383460c08201527f2e3431384c3139392e343433203830362e38344c3239302e313039203436332e60e08201527f3431385a222066696c6c3d22626c61636b222066696c6c2d6f7061636974793d61010082015268111817189a1110179f60b91b61012082015261012901600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223622207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3738372e353839203233372e3334394c3436302e33353420313860808201527f352e3831384c3430362e333235203339302e343639433430332e38373220333960a08201527f392e373539203430392e353738203430382e353031203431392e30363920343060c08201527f392e3939364c3731312e393334203435362e313134433732312e34323520343560e08201527f372e363039203733312e313037203435312e3239203733332e3536203434324c6101008201527f3738372e353839203233372e3334395a4d3636302e323639203234352e3031436101208201527f3635352e353233203234342e323633203635302e363832203234372e343233206101408201527f3634392e343536203235322e3036384c3630372e333836203431312e343138436101608201527f3630362e3136203431362e303633203630392e303133203432302e34333420366101808201527f31332e373539203432312e3138314c3638322e343939203433322e30303643366101a08201527f38372e323435203433322e373533203639322e303836203432392e35393420366101c08201527f39332e333132203432342e3934394c3733352e333832203236352e35393943376101e08201527f33362e363038203236302e393534203733332e373535203235362e35383320376102008201527f32392e3031203235352e3833354c3636302e323639203234352e30315a2220666102208201527234b6361e913ab9361411b6b0b4b7149110179f60691b61024082015261025301600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3836342e363433203238332e393360208201527f37433836352e313836203238332e363035203836352e373038203238342e323560408201527f37203836352e323339203238342e3638334c3834342e323638203330332e373160608201527f39433834332e393338203330342e303138203834342e303933203330342e353160808201527f37203834342e353236203330342e3534384c3835332e373236203330352e323060a08201527f37433835342e313834203330352e3234203835342e333231203330352e37383760c08201527f203835332e393432203330362e3037314c3833332e383834203332312e31313260e08201527f433833332e353036203332312e333936203833332e363433203332312e3934336101008201527f203833342e313031203332312e3937364c3834342e303037203332322e3638356101208201527f433834342e343931203332322e3732203834342e363035203332332e333139206101408201527f3834342e313737203332332e35384c3739372e373532203335312e39353443376101608201527f39372e323039203335322e323836203739362e363837203335312e36333420376101808201527f39372e313536203335312e3230394c3831382e343033203333312e39323243386101a08201527f31382e373333203333312e363232203831382e353737203333312e31323320386101c08201527f31382e313435203333312e3039324c3830382e373438203333302e34324338306101e08201527f382e323932203333302e333837203830382e313534203332392e3834332038306102008201527f382e353239203332392e3535384c3832382e303534203331342e3734344338326102208201527f382e3433203331342e343539203832382e323931203331332e393135203832376102408201527f2e383335203331332e3838324c3831382e333839203331332e323036433831376102608201527f2e393034203331332e313731203831372e3739203331322e353732203831382e6102808201527f323138203331322e3331314c3836342e363433203238332e3933375a222066696102a08201526c36361e913bb434ba329110179f60991b6102c08201526102cd017f3c67207472616e73666f726d3d226d617472697828302e39383738323720302e81527f313535353537202d302e32353532363120302e3936363837322032353020373360208201527f3529223e3c7465787420666f6e742d66616d696c793d22496e7465722c20736160408201527f6e732d73657269662220666f6e742d7765696768743d22626f6c642220666f6e60608201527f742d73697a653d223432222066696c6c3d2223453545374638223e00000000006080820152609b016121e99161020f565b7f3c2f746578743e3c7465787420666f6e742d66616d696c793d22496e7465722c81527f2073616e732d73657269662220666f6e742d7765696768743d226e6f726d616c60208201527f2220793d2234302220666f6e742d73697a653d223232222066696c6c3d222337604082015266231c189c99111f60c91b60608201526067016122749161020f565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f3c696d6167652077696474683d2231363722206865696768743d22313637222081527f7472616e73666f726d3d226d617472697828302e39383738323720302e31353560208201527f353537202d302e32353532363120302e393636383732203434342e313137203560408201526d191a17189b949110343932b31e9160911b6060820152606e0161231a9161020f565b631110179f60e11b8152600401651e3232b3399f60d11b81526006017f3c66696c7465722069643d226469736b657474652d736861646f772220783d2281527f37302e373438392220793d223139352e373132222077696474683d223935352e60208201527f37333322206865696768743d223833322e353538222066696c746572556e697460408201527f733d227573657253706163654f6e5573652220636f6c6f722d696e746572706f60608201527f6c6174696f6e2d66696c746572733d2273524742223e3c6665466c6f6f64206660808201527f6c6f6f642d6f7061636974793d223022202f3e3c6665426c656e6420696e3d2260a08201527f536f757263654772617068696322202f3e3c6665476175737369616e426c757260c08201527f20737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e000060e082015260fe017f3c6c696e6561724772616469656e742069643d226261636b67726f756e64222081527f78313d223533322e35222079313d2230222078323d223533322e35222079323d60208201527f223130363522206772616469656e74556e6974733d227573657253706163654f60408201527f6e557365223e3c73746f70202f3e3c73746f70206f66667365743d223122207360608201527f746f702d636f6c6f723d222331333133313322202f3e3c2f6c696e656172477260808201526630b234b2b73a1f60c91b60a082015260a7017f3c72616469616c4772616469656e742069643d226261636b67726f756e642d7281527f616469616c222063783d2230222063793d22302220723d22312220677261646960208201527f656e74556e6974733d227573657253706163654f6e557365222067726164696560408201527f6e745472616e73666f726d3d227472616e736c617465283533322e352035333260608201527f2e352920726f746174652838392e39363129207363616c652837333529223e3c60808201527039ba37b81039ba37b816b1b7b637b91e9160791b60a082015260b101612616908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d8152601160f91b6020820152602101612650908261020f565b7f222073746f702d6f7061636974793d223022202f3e3c2f72616469616c4772618152653234b2b73a1f60d11b60208201526026017f3c6c696e6561724772616469656e742069643d226469736b657474652d67726181527f6469656e74222078313d223932352e363236222079313d223235362e3839362260208201527f2078323d223133362e373739222079323d223830302e3230332220677261646960408201527f656e74556e6974733d227573657253706163654f6e557365223e3c73746f702060608201526b39ba37b816b1b7b637b91e9160a11b6080820152608c0161273c908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d81527f222332433331334622202f3e3c2f6c696e6561724772616469656e743e0000006020820152603d017f3c6c696e6561724772616469656e742069643d226d61696e223e3c73746f702081526b39ba37b816b1b7b637b91e9160a11b6020820152602c016127cc9161020f565b741110179f1e17b634b732b0b923b930b234b2b73a1f60591b8152601501661e17b232b3399f60c91b8152600701651e17b9bb339f60d11b81526006010390601f1991828101825261281e90826100fc565b612827906129aa565b6040517f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015291908290603a82016128619161020f565b03908101825261287190826100fc565b90565b604051906020820182811067ffffffffffffffff821117612899575b60405260008252565b6128a16100e5565b612890565b604051906060820182811067ffffffffffffffff821117612917575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61291f6100e5565b6128c2565b50634e487b7160e01b600052601160045260246000fd5b600290600219811161294b570190565b610222612924565b6001600160fe1b03811160011661296b575b60021b90565b612973612924565b612965565b906129828261012b565b61298f60405191826100fc565b82815280926129a0601f199161012b565b0190602036910137565b805115612a7c576129b96128a6565b6129dd6129d86129d36129cc855161293b565b6003900490565b612953565b612978565b9160208301918182518301915b828210612a2a57505050600390510680600114612a1757600214612a0c575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c16880101516002860153168501015190820153019391906129ea565b5061287161287456fe3c706174682066696c6c2d72756c653d226576656e6f64642220636c69702d72a3646970667358221220e14654cddfa7065f209546b6da1c216d2afae1f70aea065a1d6abc9475a470086c6578706572696d656e74616cf564736f6c634300080c0041", + "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"color\",\"type\":\"string\"}],\"name\":\"generateBase64\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"generateBase64(string,string,string,string)\":{\"details\":\"Generates a SVG image.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/util/FleekSVG.sol\":\"FleekSVG\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0x95f7195cc0f546e06ab49a57e8d22a0ca482175ffa2a74b71ff4c7c395b7394a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://045d686ba6ddf6e1b296b87511e0610bd838a949e108b75c5f960675c4f8de0a\",\"dweb:/ipfs/QmWTyAVAg4KmoE19iKir78TNtCCjtqhJPqGqt7rNyBA6Qv\"]},\"contracts/FleekBilling.sol\":{\"keccak256\":\"0x6fed8b7faba37011bd15b0bc395ca40e24a85499dec167de6942acabc5407d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1f71b1173e8cd21e14e44e97a1add07d1f08115aa2a4053e40aacfbbc270a19\",\"dweb:/ipfs/QmSej6eRfhhL84SMMFrPJWesTUhMRc4HSTY85b2zAKzzhs\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x33d8a71103d4d5c8c39120e514cce5220530485aa05fb13bb64010daaaaac8a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f4ac13123b77e53ae8ae1c220853254e4f1aae04c8602da594f812e0a5224b3e\",\"dweb:/ipfs/QmXyFDqEJc5fWFVRYLq9bmwMAfuXXdAUTJwSH2dArFgz3v\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", "storageLayout": { "storage": [], "types": null diff --git a/contracts/deployments/mumbai/proxy.json b/contracts/deployments/mumbai/proxy.json index 5bac1b7..6680a18 100644 --- a/contracts/deployments/mumbai/proxy.json +++ b/contracts/deployments/mumbai/proxy.json @@ -1,5 +1,9 @@ { "FleekERC721": [ + { + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "timestamp": "3/3/2023, 4:43:25 PM" + }, { "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", "timestamp": "2/24/2023, 5:28:44 PM" diff --git a/contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json b/contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json new file mode 100644 index 0000000..d9ea30e --- /dev/null +++ b/contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json @@ -0,0 +1,90 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized < type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721Upgradeable.sol\";\nimport \"./IERC721ReceiverUpgradeable.sol\";\nimport \"./extensions/IERC721MetadataUpgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../utils/StringsUpgradeable.sol\";\nimport \"../../utils/introspection/ERC165Upgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\n using AddressUpgradeable for address;\n using StringsUpgradeable for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC721_init_unchained(name_, symbol_);\n }\n\n function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\n return\n interfaceId == type(IERC721Upgradeable).interfaceId ||\n interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721Upgradeable.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721Upgradeable.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721Upgradeable.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721Upgradeable.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[44] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Upgradeable.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721ReceiverUpgradeable {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165Upgradeable.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721Upgradeable is IERC165Upgradeable {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n function __ERC165_init() internal onlyInitializing {\n }\n\n function __ERC165_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165Upgradeable).interfaceId;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = MathUpgradeable.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, MathUpgradeable.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Base64.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n *\n * _Available since v4.5._\n */\nlibrary Base64 {\n /**\n * @dev Base64 Encoding/Decoding Table\n */\n string internal constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n /**\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\n */\n function encode(bytes memory data) internal pure returns (string memory) {\n /**\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n */\n if (data.length == 0) return \"\";\n\n // Loads the table into memory\n string memory table = _TABLE;\n\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\n // and split into 4 numbers of 6 bits.\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\n // - `data.length + 2` -> Round up\n // - `/ 3` -> Number of 3-bytes chunks\n // - `4 *` -> 4 characters for each chunk\n string memory result = new string(4 * ((data.length + 2) / 3));\n\n /// @solidity memory-safe-assembly\n assembly {\n // Prepare the lookup table (skip the first \"length\" byte)\n let tablePtr := add(table, 1)\n\n // Prepare result pointer, jump over length\n let resultPtr := add(result, 32)\n\n // Run over the input, 3 bytes at a time\n for {\n let dataPtr := data\n let endPtr := add(data, mload(data))\n } lt(dataPtr, endPtr) {\n\n } {\n // Advance 3 bytes\n dataPtr := add(dataPtr, 3)\n let input := mload(dataPtr)\n\n // To write each character, shift the 3 bytes (18 bits) chunk\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n // and apply logical AND with 0x3F which is the number of\n // the previous character in the ASCII table prior to the Base64 Table\n // The result is then added to the table to get the character to write,\n // and finally write it in the result pointer but with a left shift\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n }\n\n // When data `bytes` is not exactly 3 bytes long\n // it is padded with `=` characters at the end\n switch mod(mload(data), 3)\n case 1 {\n mstore8(sub(resultPtr, 1), 0x3d)\n mstore8(sub(resultPtr, 2), 0x3d)\n }\n case 2 {\n mstore8(sub(resultPtr, 1), 0x3d)\n }\n }\n\n return result;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "contracts/FleekAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nerror MustHaveCollectionRole(uint8 role);\nerror MustHaveTokenRole(uint256 tokenId, uint8 role);\nerror MustHaveAtLeastOneOwner();\nerror RoleAlreadySet();\n\ncontract FleekAccessControl is Initializable {\n /**\n * @dev All available collection roles.\n */\n enum CollectionRoles {\n Owner\n }\n\n /**\n * @dev All available token roles.\n */\n enum TokenRoles {\n Controller\n }\n\n /**\n * @dev Emitted when a token role is changed.\n */\n event TokenRoleChanged(\n uint256 indexed tokenId,\n TokenRoles indexed role,\n address indexed toAddress,\n bool status,\n address byAddress\n );\n\n /**\n * @dev Emitted when token roles version is increased and all token roles are cleared.\n */\n event TokenRolesCleared(uint256 indexed tokenId, address byAddress);\n\n /**\n * @dev Emitted when a collection role is changed.\n */\n event CollectionRoleChanged(\n CollectionRoles indexed role,\n address indexed toAddress,\n bool status,\n address byAddress\n );\n\n /**\n * @dev _collectionRolesCounter[role] is the number of addresses that have the role.\n * This is prevent Owner role to go to 0.\n */\n mapping(CollectionRoles => uint256) private _collectionRolesCounter;\n\n /**\n * @dev _collectionRoles[role][address] is the mapping of addresses that have the role.\n */\n mapping(CollectionRoles => mapping(address => bool)) private _collectionRoles;\n\n /**\n * @dev _tokenRolesVersion[tokenId] is the version of the token roles.\n * The version is incremented every time the token roles are cleared.\n * Should be incremented every token transfer.\n */\n mapping(uint256 => uint256) private _tokenRolesVersion;\n\n /**\n * @dev _tokenRoles[tokenId][version][role][address] is the mapping of addresses that have the role.\n */\n mapping(uint256 => mapping(uint256 => mapping(TokenRoles => mapping(address => bool)))) private _tokenRoles;\n\n /**\n * @dev Initializes the contract by granting the `Owner` role to the deployer.\n */\n function __FleekAccessControl_init() internal onlyInitializing {\n _grantCollectionRole(CollectionRoles.Owner, msg.sender);\n }\n\n /**\n * @dev Checks if the `msg.sender` has a certain role.\n */\n function _requireCollectionRole(CollectionRoles role) internal view {\n if (!hasCollectionRole(role, msg.sender)) revert MustHaveCollectionRole(uint8(role));\n }\n\n /**\n * @dev Checks if the `msg.sender` has the `Token` role for a certain `tokenId`.\n */\n function _requireTokenRole(uint256 tokenId, TokenRoles role) internal view {\n if (!hasTokenRole(tokenId, role, msg.sender)) revert MustHaveTokenRole(tokenId, uint8(role));\n }\n\n /**\n * @dev Returns `True` if a certain address has the collection role.\n */\n function hasCollectionRole(CollectionRoles role, address account) public view returns (bool) {\n return _collectionRoles[role][account];\n }\n\n /**\n * @dev Returns `True` if a certain address has the token role.\n */\n function hasTokenRole(uint256 tokenId, TokenRoles role, address account) public view returns (bool) {\n uint256 currentVersion = _tokenRolesVersion[tokenId];\n return _tokenRoles[tokenId][currentVersion][role][account];\n }\n\n /**\n * @dev Grants the collection role to an address.\n */\n function _grantCollectionRole(CollectionRoles role, address account) internal {\n if (hasCollectionRole(role, account)) revert RoleAlreadySet();\n\n _collectionRoles[role][account] = true;\n _collectionRolesCounter[role] += 1;\n\n emit CollectionRoleChanged(role, account, true, msg.sender);\n }\n\n /**\n * @dev Revokes the collection role of an address.\n */\n function _revokeCollectionRole(CollectionRoles role, address account) internal {\n if (!hasCollectionRole(role, account)) revert RoleAlreadySet();\n if (role == CollectionRoles.Owner && _collectionRolesCounter[role] == 1) revert MustHaveAtLeastOneOwner();\n\n _collectionRoles[role][account] = false;\n _collectionRolesCounter[role] -= 1;\n\n emit CollectionRoleChanged(role, account, false, msg.sender);\n }\n\n /**\n * @dev Grants the token role to an address.\n */\n function _grantTokenRole(uint256 tokenId, TokenRoles role, address account) internal {\n if (hasTokenRole(tokenId, role, account)) revert RoleAlreadySet();\n\n uint256 currentVersion = _tokenRolesVersion[tokenId];\n _tokenRoles[tokenId][currentVersion][role][account] = true;\n\n emit TokenRoleChanged(tokenId, role, account, true, msg.sender);\n }\n\n /**\n * @dev Revokes the token role of an address.\n */\n function _revokeTokenRole(uint256 tokenId, TokenRoles role, address account) internal {\n if (!hasTokenRole(tokenId, role, account)) revert RoleAlreadySet();\n\n uint256 currentVersion = _tokenRolesVersion[tokenId];\n _tokenRoles[tokenId][currentVersion][role][account] = false;\n\n emit TokenRoleChanged(tokenId, role, account, false, msg.sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n function _clearTokenRoles(uint256 tokenId) internal {\n _tokenRolesVersion[tokenId] += 1;\n emit TokenRolesCleared(tokenId, msg.sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "contracts/FleekBilling.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nerror RequiredPayment(uint requiredValue);\n\nabstract contract FleekBilling is Initializable {\n /**\n * @dev Available billing values.\n */\n enum Billing {\n Mint,\n AddAccessPoint\n }\n\n /**\n * @dev Emitted when the billing value is changed.\n */\n event BillingChanged(Billing key, uint256 price);\n\n /**\n * @dev Emitted when contract is withdrawn.\n */\n event Withdrawn(uint256 value, address indexed byAddress);\n\n /**\n * @dev Mapping of billing values.\n */\n mapping(Billing => uint256) public _billings;\n\n /**\n * @dev Initializes the contract by setting default billing values.\n */\n function __FleekBilling_init(uint256[] memory initialBillings) internal onlyInitializing {\n for (uint256 i = 0; i < initialBillings.length; i++) {\n _setBilling(Billing(i), initialBillings[i]);\n }\n }\n\n /**\n * @dev Returns the billing value for a given key.\n */\n function getBilling(Billing key) public view returns (uint256) {\n return _billings[key];\n }\n\n /**\n * @dev Sets the billing value for a given key.\n */\n function _setBilling(Billing key, uint256 price) internal {\n _billings[key] = price;\n emit BillingChanged(key, price);\n }\n\n /**\n * @dev Internal function to require a payment value.\n */\n function _requirePayment(Billing key) internal {\n uint256 requiredValue = _billings[key];\n if (msg.value != _billings[key]) revert RequiredPayment(requiredValue);\n }\n\n /**\n * @dev Internal function to withdraw the contract balance.\n */\n function _withdraw() internal {\n address by = msg.sender;\n uint256 value = address(this).balance;\n\n payable(by).transfer(value);\n emit Withdrawn(value, by);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "contracts/FleekERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"./FleekAccessControl.sol\";\nimport \"./FleekBilling.sol\";\nimport \"./util/FleekStrings.sol\";\nimport \"./FleekPausable.sol\";\n\nerror AccessPointNotExistent();\nerror AccessPointAlreadyExists();\nerror AccessPointScoreCannotBeLower();\nerror MustBeAccessPointOwner();\nerror MustBeTokenOwner(uint256 tokenId);\nerror ThereIsNoTokenMinted();\nerror InvalidTokenIdForAccessPoint();\nerror AccessPointCreationStatusAlreadySet();\n\ncontract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, FleekPausable, FleekBilling {\n using Strings for uint256;\n using FleekStrings for FleekERC721.App;\n using FleekStrings for FleekERC721.AccessPoint;\n using FleekStrings for string;\n using FleekStrings for uint24;\n\n event NewMint(\n uint256 indexed tokenId,\n string name,\n string description,\n string externalURL,\n string ENS,\n string commitHash,\n string gitRepository,\n string logo,\n uint24 color,\n bool accessPointAutoApproval,\n address indexed minter,\n address indexed owner\n );\n event MetadataUpdate(uint256 indexed _tokenId, string key, string value, address indexed triggeredBy);\n event MetadataUpdate(uint256 indexed _tokenId, string key, uint24 value, address indexed triggeredBy);\n event MetadataUpdate(uint256 indexed _tokenId, string key, string[2] value, address indexed triggeredBy);\n event MetadataUpdate(uint256 indexed _tokenId, string key, bool value, address indexed triggeredBy);\n\n event NewAccessPoint(string apName, uint256 indexed tokenId, address indexed owner);\n event RemoveAccessPoint(string apName, uint256 indexed tokenId, address indexed owner);\n\n event ChangeAccessPointScore(string apName, uint256 indexed tokenId, uint256 score, address indexed triggeredBy);\n\n event ChangeAccessPointNameVerify(\n string apName,\n uint256 tokenId,\n bool indexed verified,\n address indexed triggeredBy\n );\n event ChangeAccessPointContentVerify(\n string apName,\n uint256 tokenId,\n bool indexed verified,\n address indexed triggeredBy\n );\n event ChangeAccessPointCreationStatus(\n string apName,\n uint256 tokenId,\n AccessPointCreationStatus status,\n address indexed triggeredBy\n );\n\n /**\n * The properties are stored as string to keep consistency with\n * other token contracts, we might consider changing for bytes32\n * in the future due to gas optimization.\n */\n struct App {\n string name; // Name of the site\n string description; // Description about the site\n string externalURL; // Site URL\n string ENS; // ENS ID\n uint256 currentBuild; // The current build number (Increments by one with each change, starts at zero)\n mapping(uint256 => Build) builds; // Mapping to build details for each build number\n string logo;\n uint24 color; // Color of the nft\n bool accessPointAutoApproval; // AP Auto Approval\n }\n\n /**\n * The metadata that is stored for each build.\n */\n struct Build {\n string commitHash;\n string gitRepository;\n }\n\n /**\n * Creation status enums for access points\n */\n enum AccessPointCreationStatus {\n DRAFT,\n APPROVED,\n REJECTED,\n REMOVED\n }\n\n /**\n * The stored data for each AccessPoint.\n */\n struct AccessPoint {\n uint256 tokenId;\n uint256 score;\n bool contentVerified;\n bool nameVerified;\n address owner;\n AccessPointCreationStatus status;\n }\n\n uint256 private _appIds;\n mapping(uint256 => App) private _apps;\n mapping(string => AccessPoint) private _accessPoints;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n function initialize(\n string memory _name,\n string memory _symbol,\n uint256[] memory initialBillings\n ) public initializer {\n __ERC721_init(_name, _symbol);\n __FleekAccessControl_init();\n __FleekBilling_init(initialBillings);\n __FleekPausable_init();\n }\n\n /**\n * @dev Checks if the AccessPoint exists.\n */\n modifier requireAP(string memory apName) {\n if (_accessPoints[apName].owner == address(0)) revert AccessPointNotExistent();\n _;\n }\n\n /**\n * @dev Mints a token and returns a tokenId.\n *\n * If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event.\n *\n * Requirements:\n *\n * - the caller must have ``collectionOwner``'s admin role.\n * - billing for the minting may be applied.\n * - the contract must be not paused.\n *\n */\n function mint(\n address to,\n string memory name,\n string memory description,\n string memory externalURL,\n string memory ENS,\n string memory commitHash,\n string memory gitRepository,\n string memory logo,\n uint24 color,\n bool accessPointAutoApproval\n ) public payable requirePayment(Billing.Mint) returns (uint256) {\n uint256 tokenId = _appIds;\n _mint(to, tokenId);\n\n _appIds += 1;\n\n App storage app = _apps[tokenId];\n app.name = name;\n app.description = description;\n app.externalURL = externalURL;\n app.ENS = ENS;\n app.logo = logo;\n app.color = color;\n app.accessPointAutoApproval = accessPointAutoApproval;\n\n // The mint interaction is considered to be the first build of the site. Updates from now on all increment the currentBuild by one and update the mapping.\n app.currentBuild = 0;\n app.builds[0] = Build(commitHash, gitRepository);\n emit NewMint(\n tokenId,\n name,\n description,\n externalURL,\n ENS,\n commitHash,\n gitRepository,\n logo,\n color,\n accessPointAutoApproval,\n msg.sender,\n to\n );\n return tokenId;\n }\n\n /**\n * @dev Returns the token metadata associated with the `tokenId`.\n *\n * Returns a based64 encoded string value of the URI.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n *\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n address owner = ownerOf(tokenId);\n App storage app = _apps[tokenId];\n\n return string(abi.encodePacked(_baseURI(), app.toString(owner).toBase64()));\n }\n\n /**\n * @dev Returns the token metadata associated with the `tokenId`.\n *\n * Returns multiple string and uint values in relation to metadata fields of the App struct.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n *\n */\n function getToken(\n uint256 tokenId\n )\n public\n view\n virtual\n returns (string memory, string memory, string memory, string memory, uint256, string memory, uint24)\n {\n _requireMinted(tokenId);\n App storage app = _apps[tokenId];\n return (app.name, app.description, app.externalURL, app.ENS, app.currentBuild, app.logo, app.color);\n }\n\n /**\n * @dev Returns the last minted tokenId.\n */\n function getLastTokenId() public view virtual returns (uint256) {\n uint256 current = _appIds;\n if (current == 0) revert ThereIsNoTokenMinted();\n return current - 1;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable) returns (bool) {\n return super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Override of _beforeTokenTransfer of ERC721.\n * Here it needs to update the token controller roles for mint, burn and transfer.\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 tokenId,\n uint256 batchSize\n ) internal virtual override whenNotPaused {\n if (from != address(0) && to != address(0)) {\n // Transfer\n _clearTokenRoles(tokenId);\n } else if (from == address(0)) {\n // Mint\n // TODO: set contract owner as controller\n } else if (to == address(0)) {\n // Burn\n _clearTokenRoles(tokenId);\n }\n super._beforeTokenTransfer(from, to, tokenId, batchSize);\n }\n\n /**\n * @dev A baseURI internal function implementation to be called in the `tokenURI` function.\n */\n function _baseURI() internal view virtual override returns (string memory) {\n return \"data:application/json;base64,\";\n }\n\n /**\n * @dev Updates the `accessPointAutoApproval` settings on minted `tokenId`.\n *\n * May emit a {MetadataUpdate} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setAccessPointAutoApproval(\n uint256 tokenId,\n bool _apAutoApproval\n ) public virtual requireTokenOwner(tokenId) {\n _requireMinted(tokenId);\n _apps[tokenId].accessPointAutoApproval = _apAutoApproval;\n emit MetadataUpdate(tokenId, \"accessPointAutoApproval\", _apAutoApproval, msg.sender);\n }\n\n /**\n * @dev Updates the `externalURL` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenExternalURL} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenExternalURL(\n uint256 tokenId,\n string memory _tokenExternalURL\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].externalURL = _tokenExternalURL;\n emit MetadataUpdate(tokenId, \"externalURL\", _tokenExternalURL, msg.sender);\n }\n\n /**\n * @dev Updates the `ENS` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenENS} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenENS(\n uint256 tokenId,\n string memory _tokenENS\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].ENS = _tokenENS;\n emit MetadataUpdate(tokenId, \"ENS\", _tokenENS, msg.sender);\n }\n\n /**\n * @dev Updates the `name` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenName} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenName(\n uint256 tokenId,\n string memory _tokenName\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].name = _tokenName;\n emit MetadataUpdate(tokenId, \"name\", _tokenName, msg.sender);\n }\n\n /**\n * @dev Updates the `description` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenDescription} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenDescription(\n uint256 tokenId,\n string memory _tokenDescription\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].description = _tokenDescription;\n emit MetadataUpdate(tokenId, \"description\", _tokenDescription, msg.sender);\n }\n\n /**\n * @dev Updates the `logo` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenLogo} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenLogo(\n uint256 tokenId,\n string memory _tokenLogo\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].logo = _tokenLogo;\n emit MetadataUpdate(tokenId, \"logo\", _tokenLogo, msg.sender);\n }\n\n /**\n * @dev Updates the `color` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenColor} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenColor(\n uint256 tokenId,\n uint24 _tokenColor\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].color = _tokenColor;\n emit MetadataUpdate(tokenId, \"color\", _tokenColor, msg.sender);\n }\n\n /**\n * @dev Updates the `logo` and `color` metadata fields of a minted `tokenId`.\n *\n * May emit a {NewTokenLogo} and a {NewTokenColor} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenLogoAndColor(uint256 tokenId, string memory _tokenLogo, uint24 _tokenColor) public virtual {\n setTokenLogo(tokenId, _tokenLogo);\n setTokenColor(tokenId, _tokenColor);\n }\n\n /**\n * @dev Add a new AccessPoint register for an app token.\n * The AP name should be a DNS or ENS url and it should be unique.\n * Anyone can add an AP but it should requires a payment.\n *\n * May emit a {NewAccessPoint} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - billing for add acess point may be applied.\n * - the contract must be not paused.\n *\n */\n function addAccessPoint(\n uint256 tokenId,\n string memory apName\n ) public payable whenNotPaused requirePayment(Billing.AddAccessPoint) {\n // require(msg.value == 0.1 ether, \"You need to pay at least 0.1 ETH\"); // TODO: define a minimum price\n _requireMinted(tokenId);\n if (_accessPoints[apName].owner != address(0)) revert AccessPointAlreadyExists();\n\n emit NewAccessPoint(apName, tokenId, msg.sender);\n\n if (_apps[tokenId].accessPointAutoApproval) {\n // Auto Approval is on.\n _accessPoints[apName] = AccessPoint(\n tokenId,\n 0,\n false,\n false,\n msg.sender,\n AccessPointCreationStatus.APPROVED\n );\n\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender);\n } else {\n // Auto Approval is off. Should wait for approval.\n _accessPoints[apName] = AccessPoint(tokenId, 0, false, false, msg.sender, AccessPointCreationStatus.DRAFT);\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.DRAFT, msg.sender);\n }\n }\n\n /**\n * @dev Set approval settings for an access point.\n * It will add the access point to the token's AP list, if `approved` is true.\n *\n * May emit a {ChangeAccessPointApprovalStatus} event.\n *\n * Requirements:\n *\n * - the tokenId must exist and be the same as the tokenId that is set for the AP.\n * - the AP must exist.\n * - must be called by a token controller.\n */\n function setApprovalForAccessPoint(\n uint256 tokenId,\n string memory apName,\n bool approved\n ) public requireTokenOwner(tokenId) {\n AccessPoint storage accessPoint = _accessPoints[apName];\n if (accessPoint.tokenId != tokenId) revert InvalidTokenIdForAccessPoint();\n if (accessPoint.status != AccessPointCreationStatus.DRAFT) revert AccessPointCreationStatusAlreadySet();\n\n if (approved) {\n // Approval\n accessPoint.status = AccessPointCreationStatus.APPROVED;\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender);\n } else {\n // Not Approved\n accessPoint.status = AccessPointCreationStatus.REJECTED;\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REJECTED, msg.sender);\n }\n }\n\n /**\n * @dev Remove an AccessPoint registry for an app token.\n * It will also remove the AP from the app token APs list.\n *\n * May emit a {RemoveAccessPoint} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n * - must be called by the AP owner.\n * - the contract must be not paused.\n *\n */\n function removeAccessPoint(string memory apName) public whenNotPaused requireAP(apName) {\n if (msg.sender != _accessPoints[apName].owner) revert MustBeAccessPointOwner();\n _accessPoints[apName].status = AccessPointCreationStatus.REMOVED;\n uint256 tokenId = _accessPoints[apName].tokenId;\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REMOVED, msg.sender);\n emit RemoveAccessPoint(apName, tokenId, msg.sender);\n }\n\n /**\n * @dev A view function to gether information about an AccessPoint.\n * It returns a JSON string representing the AccessPoint information.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function getAccessPointJSON(string memory apName) public view requireAP(apName) returns (string memory) {\n AccessPoint storage _ap = _accessPoints[apName];\n return _ap.toString();\n }\n\n /**\n * @dev A view function to check if a AccessPoint is verified.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function isAccessPointNameVerified(string memory apName) public view requireAP(apName) returns (bool) {\n return _accessPoints[apName].nameVerified;\n }\n\n /**\n * @dev Increases the score of a AccessPoint registry.\n *\n * May emit a {ChangeAccessPointScore} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function increaseAccessPointScore(string memory apName) public requireAP(apName) {\n _accessPoints[apName].score++;\n emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender);\n }\n\n /**\n * @dev Decreases the score of a AccessPoint registry if is greater than 0.\n *\n * May emit a {ChangeAccessPointScore} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function decreaseAccessPointScore(string memory apName) public requireAP(apName) {\n if (_accessPoints[apName].score == 0) revert AccessPointScoreCannotBeLower();\n _accessPoints[apName].score--;\n emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender);\n }\n\n /**\n * @dev Set the content verification of a AccessPoint registry.\n *\n * May emit a {ChangeAccessPointContentVerify} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n * - the sender must have the token controller role.\n *\n */\n function setAccessPointContentVerify(\n string memory apName,\n bool verified\n ) public requireAP(apName) requireTokenRole(_accessPoints[apName].tokenId, TokenRoles.Controller) {\n _accessPoints[apName].contentVerified = verified;\n emit ChangeAccessPointContentVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender);\n }\n\n /**\n * @dev Set the name verification of a AccessPoint registry.\n *\n * May emit a {ChangeAccessPointNameVerify} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n * - the sender must have the token controller role.\n *\n */\n function setAccessPointNameVerify(\n string memory apName,\n bool verified\n ) public requireAP(apName) requireTokenRole(_accessPoints[apName].tokenId, TokenRoles.Controller) {\n _accessPoints[apName].nameVerified = verified;\n emit ChangeAccessPointNameVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender);\n }\n\n /**\n * @dev Adds a new build to a minted `tokenId`'s builds mapping.\n *\n * May emit a {NewBuild} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenBuild(\n uint256 tokenId,\n string memory _commitHash,\n string memory _gitRepository\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(_commitHash, _gitRepository);\n emit MetadataUpdate(tokenId, \"build\", [_commitHash, _gitRepository], msg.sender);\n }\n\n /**\n * @dev Burns a previously minted `tokenId`.\n *\n * May emit a {Transfer} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must be the owner of the token.\n * - the contract must be not paused.\n *\n */\n function burn(uint256 tokenId) public virtual requireTokenOwner(tokenId) {\n super._burn(tokenId);\n\n if (bytes(_apps[tokenId].externalURL).length != 0) {\n delete _apps[tokenId];\n }\n }\n\n /*//////////////////////////////////////////////////////////////\n ACCESS CONTROL\n //////////////////////////////////////////////////////////////*/\n\n /**\n * @dev Requires caller to have a selected collection role.\n */\n modifier requireCollectionRole(CollectionRoles role) {\n _requireCollectionRole(role);\n _;\n }\n\n /**\n * @dev Requires caller to have a selected token role.\n */\n modifier requireTokenRole(uint256 tokenId, TokenRoles role) {\n if (ownerOf(tokenId) != msg.sender) _requireTokenRole(tokenId, role);\n _;\n }\n\n /**\n * @dev Requires caller to be selected token owner.\n */\n modifier requireTokenOwner(uint256 tokenId) {\n if (ownerOf(tokenId) != msg.sender) revert MustBeTokenOwner(tokenId);\n _;\n }\n\n /**\n * @dev Grants the collection role to an address.\n *\n * Requirements:\n *\n * - the caller should have the collection role.\n *\n */\n function grantCollectionRole(\n CollectionRoles role,\n address account\n ) public whenNotPaused requireCollectionRole(CollectionRoles.Owner) {\n _grantCollectionRole(role, account);\n }\n\n /**\n * @dev Grants the token role to an address.\n *\n * Requirements:\n *\n * - the caller should have the token role.\n *\n */\n function grantTokenRole(\n uint256 tokenId,\n TokenRoles role,\n address account\n ) public whenNotPaused requireTokenOwner(tokenId) {\n _grantTokenRole(tokenId, role, account);\n }\n\n /**\n * @dev Revokes the collection role of an address.\n *\n * Requirements:\n *\n * - the caller should have the collection role.\n *\n */\n function revokeCollectionRole(\n CollectionRoles role,\n address account\n ) public whenNotPaused requireCollectionRole(CollectionRoles.Owner) {\n _revokeCollectionRole(role, account);\n }\n\n /**\n * @dev Revokes the token role of an address.\n *\n * Requirements:\n *\n * - the caller should have the token role.\n *\n */\n function revokeTokenRole(\n uint256 tokenId,\n TokenRoles role,\n address account\n ) public whenNotPaused requireTokenOwner(tokenId) {\n _revokeTokenRole(tokenId, role, account);\n }\n\n /*//////////////////////////////////////////////////////////////\n PAUSABLE\n //////////////////////////////////////////////////////////////*/\n\n /**\n * @dev Sets the contract to paused state.\n *\n * Requirements:\n *\n * - the sender must have the `controller` role.\n * - the contract must be pausable.\n * - the contract must be not paused.\n *\n */\n function pause() public requireCollectionRole(CollectionRoles.Owner) {\n _pause();\n }\n\n /**\n * @dev Sets the contract to unpaused state.\n *\n * Requirements:\n *\n * - the sender must have the `controller` role.\n * - the contract must be paused.\n *\n */\n function unpause() public requireCollectionRole(CollectionRoles.Owner) {\n _unpause();\n }\n\n /**\n * @dev Sets the contract to pausable state.\n *\n * Requirements:\n *\n * - the sender must have the `owner` role.\n * - the contract must be in the oposite pausable state.\n *\n */\n function setPausable(bool pausable) public requireCollectionRole(CollectionRoles.Owner) {\n _setPausable(pausable);\n }\n\n /*//////////////////////////////////////////////////////////////\n BILLING\n //////////////////////////////////////////////////////////////*/\n\n /**\n * @dev Modifier to require billing with a given key.\n */\n modifier requirePayment(Billing key) {\n _requirePayment(key);\n _;\n }\n\n /**\n * @dev Sets the billing value for a given key.\n *\n * May emit a {BillingChanged} event.\n *\n * Requirements:\n *\n * - the sender must have the `collectionOwner` role.\n *\n */\n function setBilling(Billing key, uint256 value) public requireCollectionRole(CollectionRoles.Owner) {\n _setBilling(key, value);\n }\n\n /**\n * @dev Withdraws all the funds from contract.\n *\n * May emmit a {Withdrawn} event.\n *\n * Requirements:\n *\n * - the sender must have the `collectionOwner` role.\n *\n */\n function withdraw() public requireCollectionRole(CollectionRoles.Owner) {\n _withdraw();\n }\n}\n" + }, + "contracts/FleekPausable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nerror ContractIsPaused();\nerror ContractIsNotPaused();\nerror ContractIsNotPausable();\nerror PausableIsSetTo(bool state);\n\nabstract contract FleekPausable is Initializable {\n /**\n * @dev Emitted when the pause is triggered by `account` and set to `isPaused`.\n */\n event PauseStatusChange(bool indexed isPaused, address account);\n\n /**\n * @dev Emitted when the pausable is triggered by `account` and set to `isPausable`.\n */\n event PausableStatusChange(bool indexed isPausable, address account);\n\n bool private _paused;\n bool private _canPause; // TODO: how should we verify if the contract is pausable or not?\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __FleekPausable_init() internal onlyInitializing {\n _paused = false;\n _canPause = true;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function isPaused() public view returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Returns true if the contract is pausable, and false otherwise.\n */\n function isPausable() public view returns (bool) {\n return _canPause;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view {\n if (isPaused()) revert ContractIsPaused();\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view {\n if (!isPaused()) revert ContractIsNotPaused();\n }\n\n /**\n * @dev Throws if the contract is not pausable.\n */\n function _requirePausable() internal view {\n if (!isPausable()) revert ContractIsNotPausable();\n }\n\n /**\n * @dev Sets the contract to be pausable or not.\n * @param canPause true if the contract is pausable, and false otherwise.\n */\n function _setPausable(bool canPause) internal {\n if (canPause == _canPause) revert PausableIsSetTo(canPause);\n _canPause = canPause;\n emit PausableStatusChange(canPause, msg.sender);\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal whenNotPaused {\n _requirePausable();\n _paused = true;\n emit PauseStatusChange(false, msg.sender);\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal whenPaused {\n _paused = false;\n emit PauseStatusChange(false, msg.sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "contracts/util/FleekStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"../FleekERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"./FleekSVG.sol\";\n\nlibrary FleekStrings {\n using Strings for uint256;\n using Strings for uint160;\n using FleekStrings for bool;\n using FleekStrings for uint24;\n using Strings for uint24;\n\n /**\n * @dev Converts a boolean value to a string.\n */\n function toString(bool _bool) internal pure returns (string memory) {\n return _bool ? \"true\" : \"false\";\n }\n\n /**\n * @dev Converts a string to a base64 string.\n */\n function toBase64(string memory str) internal pure returns (string memory) {\n return Base64.encode(bytes(str));\n }\n\n /**\n * @dev Converts FleekERC721.App to a JSON string.\n * It requires to receive owner address as a parameter.\n */\n function toString(FleekERC721.App storage app, address owner) internal view returns (string memory) {\n // prettier-ignore\n return string(abi.encodePacked(\n '{',\n '\"name\":\"', app.name, '\",',\n '\"description\":\"', app.description, '\",',\n '\"owner\":\"', uint160(owner).toHexString(20), '\",',\n '\"external_url\":\"', app.externalURL, '\",',\n '\"image\":\"', FleekSVG.generateBase64(app.name, app.ENS, app.logo, app.color.toColorString()), '\",',\n '\"access_point_auto_approval\":',app.accessPointAutoApproval.toString(),',',\n '\"attributes\": [',\n '{\"trait_type\": \"ENS\", \"value\":\"', app.ENS,'\"},',\n '{\"trait_type\": \"Commit Hash\", \"value\":\"', app.builds[app.currentBuild].commitHash,'\"},',\n '{\"trait_type\": \"Repository\", \"value\":\"', app.builds[app.currentBuild].gitRepository,'\"},',\n '{\"trait_type\": \"Version\", \"value\":\"', app.currentBuild.toString(),'\"},',\n '{\"trait_type\": \"Color\", \"value\":\"', app.color.toColorString(),'\"}',\n ']',\n '}'\n ));\n }\n\n /**\n * @dev Converts FleekERC721.AccessPoint to a JSON string.\n */\n function toString(FleekERC721.AccessPoint storage ap) internal view returns (string memory) {\n // prettier-ignore\n return string(abi.encodePacked(\n \"{\",\n '\"tokenId\":', ap.tokenId.toString(), \",\",\n '\"score\":', ap.score.toString(), \",\",\n '\"nameVerified\":', ap.nameVerified.toString(), \",\",\n '\"contentVerified\":', ap.contentVerified.toString(), \",\",\n '\"owner\":\"', uint160(ap.owner).toHexString(20), '\",',\n '\"status\":',uint(ap.status).toString(),\n \"}\"\n ));\n }\n\n /**\n * @dev Converts bytes3 to a hex color string.\n */\n function toColorString(uint24 color) internal pure returns (string memory) {\n bytes memory hexBytes = bytes(color.toHexString(3));\n bytes memory hexColor = new bytes(7);\n hexColor[0] = \"#\";\n for (uint256 i = 1; i < 7; i++) {\n hexColor[i] = hexBytes[i + 1];\n }\n return string(hexColor);\n }\n}\n" + }, + "contracts/util/FleekSVG.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"../FleekERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\n\nlibrary FleekSVG {\n /**\n * @dev Generates a SVG image.\n */\n function generateBase64(\n string memory name,\n string memory ENS,\n string memory logo,\n string memory color\n ) public pure returns (string memory) {\n return (\n string(\n abi.encodePacked(\n \"data:image/svg+xml;base64,\",\n Base64.encode(\n abi.encodePacked(\n '',\n // background\n '',\n '',\n // shadows\n '',\n '',\n // diskette fill\n '',\n '',\n // arrows\n '',\n '',\n '',\n // body\n '',\n // slider\n '',\n // fleek logo\n '',\n // text\n '',\n name,\n '',\n ENS,\n \"\",\n // logo\n '',\n // defs\n \"\",\n // shadow\n '',\n // bg\n '',\n '',\n // fill gradient\n '',\n // color\n '',\n // end defs\n \"\",\n \"\"\n )\n )\n )\n )\n );\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": true + } + }, + "viaIR": true, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ], + "": [ + "ast" + ] + } + } + } +} \ No newline at end of file diff --git a/ui/src/integrations/ethereum/contracts/FleekERC721.json b/ui/src/integrations/ethereum/contracts/FleekERC721.json index 71d2407..27c3dab 100644 --- a/ui/src/integrations/ethereum/contracts/FleekERC721.json +++ b/ui/src/integrations/ethereum/contracts/FleekERC721.json @@ -1,9 +1,29 @@ { - "timestamp": "2/24/2023, 5:28:44 PM", - "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", - "transactionHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", - "gasPrice": 2500000019, + "timestamp": "3/3/2023, 4:43:25 PM", + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "transactionHash": "0x808546aa8bbc4e36c54d955970d8cfe8c4dc925eb5f65ff7b25203dd312bad4c", + "gasPrice": 1675244309, "abi": [ + { + "inputs": [], + "name": "AccessPointAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointCreationStatusAlreadySet", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointNotExistent", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointScoreCannotBeLower", + "type": "error" + }, { "inputs": [], "name": "ContractIsNotPausable", @@ -19,6 +39,16 @@ "name": "ContractIsPaused", "type": "error" }, + { + "inputs": [], + "name": "InvalidTokenIdForAccessPoint", + "type": "error" + }, + { + "inputs": [], + "name": "MustBeAccessPointOwner", + "type": "error" + }, { "inputs": [ { @@ -73,6 +103,17 @@ "name": "PausableIsSetTo", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requiredValue", + "type": "uint256" + } + ], + "name": "RequiredPayment", + "type": "error" + }, { "inputs": [], "name": "RoleAlreadySet", @@ -133,6 +174,25 @@ "name": "ApprovalForAll", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BillingChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -673,6 +733,44 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "byAddress", + "type": "address" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "", + "type": "uint8" + } + ], + "name": "_billings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -792,6 +890,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + } + ], + "name": "getBilling", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastTokenId", @@ -972,6 +1089,11 @@ "internalType": "string", "name": "_symbol", "type": "string" + }, + { + "internalType": "uint256[]", + "name": "initialBillings", + "type": "uint256[]" } ], "name": "initialize", @@ -1351,6 +1473,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "setBilling", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1598,10 +1738,17 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x6080806040523461001657615126908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb146107c857806301ffc9a7146107ac57806306fdde0314610790578063081812fc14610774578063095ea7b31461075c57806323b872dd14610744578063246a908b1461072c57806327dc5cec146107105780632d957aad146106f85780633806f152146106e05780633f4ba83a146106c957806342842e0e146106b157806342966c681461069a57806342e44bbf146106825780634cd88b761461066a5780635aa6ab3b146106525780636352211e1461061d57806370a0823114610601578063736d323a146105ea5780637469a03b146105d357806378278cca146105bb57806383c4c00d1461059f5780638456cb59146105885780638a2e25be146105705780638b9ec9771461053d5780638c3c0a441461052557806394ec65c51461050e57806395d89b41146104f2578063a09a1601146104c2578063a22cb465146104aa578063a27d0b2714610492578063a397c8301461047b578063aad045a214610463578063b187bd2614610437578063b20b94f11461041f578063b30437a01461040c578063b42dbe38146103ac578063b88d4fde14610391578063b948a3c514610379578063c87b56dd14610352578063cdb0e89e1461033a578063d7a75be11461031e578063e4b50cb8146102ee578063e9447250146102ca578063e985e9c51461025d578063eb5fd26b146102455763f931517714610227575061000f565b346102415761023e61023836610a78565b90612ce9565b51f35b5080fd5b50346102415761023e61025736610f27565b906134a5565b5034610241576102c691506102b56102ae61029761027a36610ef4565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b5034610241576102c691506102b56102ae6102976102e736610ad1565b9190611a3e565b5034610241576102c6915061030a610305366108ec565b612a20565b949795969390939291925197889788610e84565b5034610241576102c691506102b561033536610aa7565b613eba565b50346102415761023e61034c36610a78565b9061303b565b5034610241576102c6915061036e610369366108ec565b6125ab565b9051918291826108db565b50346102415761023e61038b36610a78565b9061332d565b50346102415761023e6103a336610e14565b92919091611567565b5034610241576102c691506102b56102ae6104076102976103cc36610808565b9390916103f86103e6826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611a70565b5061023e61041936610a78565b906136c3565b50346102415761023e61043136610b58565b9061401b565b5034610241576102c6915061044b36610873565b60cc54905160ff909116151581529081906020820190565b50346102415761023e61047536610df4565b90612c06565b50346102415761023e61048d36610aa7565b613f8a565b50346102415761023e6104a436610808565b916145b8565b50346102415761023e6104bc36610dc3565b906113b3565b5034610241576102c691506104d636610873565b60cc54905160089190911c60ff16151581529081906020820190565b5034610241576102c6915061050636610873565b61036e6111b6565b50346102415761023e61052036610aa7565b613ee7565b50346102415761023e61053736610ad1565b906146c7565b506102c6915061056161054f36610cac565b98979097969196959295949394612139565b90519081529081906020820190565b50346102415761023e61058236610c6c565b916139cd565b50346102415761059736610873565b61023e614875565b5034610241576102c691506105b336610873565b610561612aeb565b50346102415761023e6105cd36610a78565b90612ec4565b50346102415761023e6105e536610aa7565b613ba6565b50346102415761023e6105fc36610c50565b61493e565b5034610241576102c6915061056161061836610c2d565b610f4a565b5034610241576102c69150610639610634366108ec565b611010565b90516001600160a01b0390911681529081906020820190565b50346102415761023e61066436610bea565b91613561565b50346102415761023e61067c36610b93565b90611a88565b50346102415761023e61069436610b58565b906140bf565b50346102415761023e6106ac366108ec565b6142c4565b50346102415761023e6106c336610925565b9161152d565b5034610241576106d836610873565b61023e6148e1565b50346102415761023e6106f236610b01565b91614158565b50346102415761023e61070a36610ad1565b906144c9565b5034610241576102c6915061036e61072736610aa7565b613d0f565b50346102415761023e61073e36610a78565b906131b0565b50346102415761023e61075636610925565b916114df565b50346102415761023e61076e366108fe565b9061124f565b5034610241576102c6915061063961078b366108ec565b611375565b5034610241576102c691506107a436610873565b61036e6110ff565b5034610241576102c691506102b56107c336610858565b612b17565b50346102415761023e6107da36610808565b916147ac565b6001111561000f57565b600435906001600160a01b03821682141561080157565b5050600080fd5b606090600319011261000f5760043590602435610824816107e0565b906044356001600160a01b03811681141561083c5790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f5760043561087081610845565b90565b600090600319011261000f57565b918091926000905b8282106108a157501161089a575050565b6000910152565b91508060209183015181860152018291610889565b906020916108cf81518092818552858086019101610881565b601f01601f1916010190565b9060206108709281815201906108b6565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610801579060243590565b606090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761099657604052565b61099e610964565b604052565b90601f801991011681019081106001600160401b0382111761099657604052565b604051906109d18261097b565b565b6040519060c082018281106001600160401b0382111761099657604052565b6020906001600160401b038111610a0f575b601f01601f19160190565b610a17610964565b610a04565b929192610a28826109f2565b91610a3660405193846109a3565b829481845281830111610a53578281602093846000960137010152565b5050505050600080fd5b9080601f8301121561095c5781602061087093359101610a1c565b9060406003198301126108015760043591602435906001600160401b03821161083c5761087091600401610a5d565b602060031982011261080157600435906001600160401b03821161095c5761087091600401610a5d565b604090600319011261000f57600435610ae9816107e0565b906024356001600160a01b03811681141561095c5790565b606060031982011261080157600435916001600160401b03602435818111610a535783610b3091600401610a5d565b92604435918211610a535761087091600401610a5d565b610124359081151582141561080157565b604060031982011261080157600435906001600160401b03821161095c57610b8291600401610a5d565b9060243580151581141561095c5790565b906040600319830112610801576001600160401b0360043581811161083c5783610bbf91600401610a5d565b9260243591821161083c5761087091600401610a5d565b610104359062ffffff821682141561080157565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c1991600401610a5d565b9060443562ffffff811681141561083c5790565b602090600319011261000f576004356001600160a01b0381168114156108015790565b602090600319011261000f576004358015158114156108015790565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c9b91600401610a5d565b9060443580151581141561083c5790565b61014060031982011261080157610cc16107ea565b916001600160401b0390602435828111610a5357610ce3846004928301610a5d565b93604435848111610db75781610cfa918401610a5d565b93606435818111610daa5782610d11918501610a5d565b93608435828111610d9c5783610d28918601610a5d565b9360a435838111610d8d5784610d3f918301610a5d565b9360c435848111610d7d5781610d56918401610a5d565b9360e435908111610d7d57610d6b9201610a5d565b90610d74610bd6565b90610870610b47565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b038116811415610801579060243580151581141561095c5790565b604090600319011261000f576004359060243580151581141561095c5790565b906080600319830112610801576001600160a01b039160043583811681141561083c579260243590811681141561083c579160443591606435906001600160401b038211610e795780602383011215610e795781602461087093600401359101610a1c565b505050505050600080fd5b959062ffffff94610ecc610eed95610ebe60c09996610eb0610eda969d9e9d60e08e81815201906108b6565b8c810360208e0152906108b6565b908a820360408c01526108b6565b9088820360608a01526108b6565b91608087015285820360a08701526108b6565b9416910152565b604090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c5790565b604090600319011261000f576004359060243562ffffff811681141561095c5790565b6001600160a01b03168015610f6a57600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b15610fca57565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b0316610870811515610fc3565b90600182811c92168015611065575b602083101461104d57565b5050634e487b7160e01b600052602260045260246000fd5b91607f1691611042565b906000929180549161108083611033565b9182825260019384811690816000146110e257506001146110a2575b50505050565b90919394506000526020928360002092846000945b8386106110ce57505050500101903880808061109c565b8054858701830152940193859082016110b7565b60ff1916602084015250506040019350389150819050808061109c565b604051906000826065549161111383611033565b80835292600190818116908115611199575060011461113a575b506109d1925003836109a3565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b84831061117e57506109d193505081016020013861112d565b81935090816020925483858a01015201910190918592611165565b94505050505060ff191660208301526109d182604081013861112d565b60405190600082606654916111ca83611033565b8083529260019081811690811561119957506001146111f057506109d1925003836109a3565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b84831061123457506109d193505081016020013861112d565b81935090816020925483858a0101520191019091859261121b565b9061125981611010565b6001600160a01b0381811690841681146113225733149081156112f4575b5015611286576109d191611851565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff915061131a903390610297565b541638611277565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611398906001600160a01b03161515610fc3565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b038116919033831461143457816113f36114049233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b1561148357565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b906109d192916114f76114f28433611603565b61147c565b6116d6565b60405190602082018281106001600160401b03821117611520575b60405260008252565b611528610964565b611517565b90916109d19260405192602084018481106001600160401b0382111761155a575b60405260008452611567565b611562610964565b61154e565b9061158b93929161157b6114f28433611603565b6115868383836116d6565b61195d565b1561159257565b5060405162461bcd60e51b8152806115ac600482016115b0565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b038061161584611010565b16928183169284841494851561164b575b50508315611635575b50505090565b61164191929350611375565b161438808061162f565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611626565b1561168257565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b6116fa906116e384611010565b6001600160a01b038281169390918216841461167b565b83169283156117fb576117788261171587846117d296612b5b565b611737856117316117258a611010565b6001600160a01b031690565b1461167b565b61175e61174e886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b0381166000908152606860205260409020600181540190556117b3856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b038061188a84611010565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b6000908152606760205260409020546109d1906001600160a01b03161515610fc3565b90816020910312610801575161087081610845565b6001600160a01b039182168152911660208201526040810191909152608060608201819052610870929101906108b6565b506040513d6000823e3d90fd5b3d15611958573d9061193e826109f2565b9161194c60405193846109a3565b82523d6000602084013e565b606090565b92909190823b15611a0c57611990926020926000604051809681958294630a85bd0160e11b9a8b855233600486016118ef565b03926001600160a01b03165af1600091816119ec575b506119de575050506119b661192d565b805190816119d957505060405162461bcd60e51b8152806115ac600482016115b0565b602001fd5b6001600160e01b0319161490565b611a059192506119fc3d826109a3565b3d8101906118da565b90386119a6565b50505050600190565b50634e487b7160e01b600052602160045260246000fd5b60011115611a3657565b6109d1611a15565b611a4781611a2c565b6000526098602052604060002090565b611a6081611a2c565b6000526097602052604060002090565b90611a7a81611a2c565b600052602052604060002090565b6000549160ff8360081c161580938194611ba7575b8115611b87575b5015611b2857611aca9183611ac1600160ff196000541617600055565b611b0f57611bb5565b611ad057565b611ae061ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611b2361010061ff00196000541617600055565b611bb5565b50505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611b99575b5038611aa4565b6001915060ff161438611b92565b600160ff8216109150611a9d565b90611bd060ff60005460081c16611bcb81611cf1565b611cf1565b81516001600160401b038111611ce4575b611bf581611bf0606554611033565b611d69565b602080601f8311600114611c5157508190611c2c94600092611c46575b50508160011b916000199060031b1c191617606555611e5a565b611c3461202d565b611c3e600060fe55565b6109d16149b4565b015190503880611c12565b919293601f198416611c8560656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b936000905b828210611ccc575050916001939185611c2c97969410611cb3575b505050811b01606555611e5a565b015160001960f88460031b161c19169055388080611ca5565b80600186978294978701518155019601940190611c8a565b611cec610964565b611be1565b15611cf857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611d5d575050565b60008155600101611d52565b90601f8211611d76575050565b6109d19160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611dc0575b601f0160051c0190611d52565b9091508190611db3565b90601f8211611dd7575050565b6109d19160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611dc057601f0160051c0190611d52565b9190601f8111611e2f57505050565b6109d1926000526020600020906020601f840160051c83019310611dc057601f0160051c0190611d52565b9081516001600160401b038111611f44575b611e8081611e7b606654611033565b611dca565b602080601f8311600114611ebc5750819293600092611eb1575b50508160011b916000199060031b1c191617606655565b015190503880611e9a565b90601f19831694611eef60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b878210611f2c575050836001959610611f13575b505050811b01606655565b015160001960f88460031b161c19169055388080611f08565b80600185968294968601518155019501930190611ef4565b611f4c610964565b611e6c565b91909182516001600160401b038111612020575b611f7981611f738454611033565b84611e20565b602080601f8311600114611fb5575081929394600092611faa575b50508160011b916000199060031b1c1916179055565b015190503880611f94565b90601f19831695611fcb85600052602060002090565b926000905b88821061200857505083600195969710611fef575b505050811b019055565b015160001960f88460031b161c19169055388080611fe5565b80600185968294968601518155019501930190611fd0565b612028610964565b611f65565b600061203f60ff825460081c16611cf1565b808052609860209081526040808320336000908152925290205460ff166120e2578080526098602090815260408083203360009081529252902061208b905b805460ff19166001179055565b8080526097602052604081206120a1815461210d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161211d570190565b6121256120f6565b0190565b600290600219811161211d570190565b9394959891969790929761214b612545565b60fe54998a9761215b898861243a565b60fe546121679061210d565b60fe5561217e8960005260ff602052604060002090565b6121888782611f51565b6121958b60018301611f51565b6121a28c60028301611f51565b6121af8960038301611f51565b6121bc8460068301611f51565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff881617179055600060048201556121f06109c4565b908282528360208301526005016122109060008052602052604060002090565b9061221a9161225e565b604051978897600160a01b60019003169b339b612237988a612355565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b038111612348575b612287816122818654611033565b86611e20565b6020928390601f83116001146122d3579180600194926109d19796946000926122c8575b5050600019600383901b1c191690841b1784555b01519101611f51565b0151905038806122ab565b90601f198316916122e987600052602060002090565b9260005b818110612331575092600195939285926109d1999896889510612318575b505050811b0184556122bf565b015160001960f88460031b161c1916905538808061230b565b9293876001819287860151815501950193016122ed565b612350610964565b612273565b979998959062ffffff956123b56123df966123a78c6101009c986123996123d19961238b6123c3996101208087528601906108b6565b9084820360208601526108b6565b9160408184039101526108b6565b8c810360608e0152906108b6565b908a820360808c01526108b6565b9088820360a08a01526108b6565b9086820360c08801526108b6565b951660e08401521515910152565b156123f457565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156124fd576000838152606760205260409020546124d39190612475906001600160a01b031615155b156123ed565b61247d6149d6565b6000848152606760205260409020546124a0906001600160a01b0316151561246f565b6001600160a01b0381166000908152606860205260409020600181540190556117b3846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561257e57565b5060405163070198dd60e51b815260006004820152602490fd5b9061212560209282815194859201610881565b6000818152606760205260409020546125ce906001600160a01b03161515610fc3565b6125d781611010565b9060005260ff602052604060002061262d604051926125f58461097b565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b0316614ec1565b61266f6003830160078401600061264f61264a835462ffffff1690565b614fbc565b6040518095819263891c235f60e01b835260068a01878b60048601614bf7565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612a13575b6000936129f0575b5054908160181c60ff166126ab90614f76565b906005860190600487015492826126cd85809590600052602052604060002090565b936126e19190600052602052604060002090565b600101936126ee90614cbb565b9462ffffff166126fd90614fbc565b604051607b60f81b602082015267113730b6b2911d1160c11b602182015298899891979161272e60298b0183614c3f565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f0161275e9060018401614c3f565b61088b60f21b8152600201681137bbb732b9111d1160b91b815260090161278491612598565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b81526010016127b491600201614c3f565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b81526009016127da91612598565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d0161281491612598565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f0161286591614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b60208201526027016128b091614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b60208201526026016128fa91614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b602082015260230161294191612598565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b602082015260210161298691612598565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f199182810182526129ba90826109a3565b6129c390614abe565b91604051928391602083016129d791612598565b6129e091612598565b03908101825261087090826109a3565b612a0c91933d90823e612a033d826109a3565b3d810190614b99565b9138612698565b612a1b611920565b612690565b600081815260676020526040902054612a43906001600160a01b03161515610fc3565b60005260ff60205260409081600020600481015462ffffff600783015416938051612a7981612a72818761106f565b03826109a3565b948151612a8d81612a72816001890161106f565b946006612aca8451612aa681612a728160028c0161106f565b96612a728651612abd81612a72816003870161106f565b979651809481930161106f565b9190565b60018110612ade575b6000190190565b612ae66120f6565b612ad7565b60fe548015612b035760018110612ade576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612b4a575b8115612b3c575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612b32565b90612b646149d6565b6001600160a01b0391821615158080612ba4575b15612b89575050506109d190612baf565b612b9257505050565b1615612b9b5750565b6109d190612baf565b508282161515612b78565b80600052609960205260406000206001815481198111612bf9575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612c016120f6565b612bca565b612c0f81611010565b6001600160a01b0316331415612cce57600081815260676020526040902054612c42906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612cf281611010565b6001600160a01b0316331415612e27575b600081815260676020526040902054612d26906001600160a01b03161515610fc3565b80600052602060ff8152600260406000200190835180916001600160401b038211612e1a575b612d5a826122818654611033565b80601f8311600114612dac5750600091612da1575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582612e35565b905084015138612d6f565b9150601f198316612dc285600052602060002090565b926000905b828210612e025750509083600194939210612de9575b5050811b019055612d83565b86015160001960f88460031b161c191690553880612ddd565b80600185968294968c01518155019501930190612dc7565b612e22610964565b612d4c565b612e3081612e68565b612d03565b9060806108709260408152600b60408201526a195e1d195c9b985b15549360aa1b606082015281602082015201906108b6565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615612ea6575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b612ecd81611010565b6001600160a01b0316331415613002575b600081815260676020526040902054612f01906001600160a01b03161515610fc3565b80600052602060ff8152600360406000200190835180916001600160401b038211612ff5575b612f35826122818654611033565b80601f8311600114612f875750600091612f7c575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613010565b905084015138612f4a565b9150601f198316612f9d85600052602060002090565b926000905b828210612fdd5750509083600194939210612fc4575b5050811b019055612f5e565b86015160001960f88460031b161c191690553880612fb8565b80600185968294968c01518155019501930190612fa2565b612ffd610964565b612f27565b61300b81612e68565b612ede565b90608061087092604081526003604082015262454e5360e81b606082015281602082015201906108b6565b61304481611010565b6001600160a01b0316331415613176575b600081815260676020526040902054613078906001600160a01b03161515610fc3565b80600052602060ff8152604060002090835180916001600160401b038211613169575b6130a9826122818654611033565b80601f83116001146130fb57506000916130f0575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613184565b9050840151386130be565b9150601f19831661311185600052602060002090565b926000905b8282106131515750509083600194939210613138575b5050811b0190556130d2565b86015160001960f88460031b161c19169055388061312c565b80600185968294968c01518155019501930190613116565b613171610964565b61309b565b61317f81612e68565b613055565b906080610870926040815260046040820152636e616d6560e01b606082015281602082015201906108b6565b6131b981611010565b6001600160a01b03163314156132ec575b6000818152606760205260409020546131ed906001600160a01b03161515610fc3565b80600052602060ff8152600180604060002001918451906001600160401b0382116132df575b613221826122818654611033565b80601f8311600114613274575081928291600093613269575b501b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd3395826132fa565b87015192503861323a565b9082601f19811661328a87600052602060002090565b936000905b878383106132c557505050106132ac575b5050811b01905561324b565b86015160001960f88460031b161c1916905538806132a0565b8b860151875590950194938401938693509081019061328f565b6132e7610964565b613213565b6132f581612e68565b6131ca565b9060806108709260408152600b60408201526a3232b9b1b934b83a34b7b760a91b606082015281602082015201906108b6565b61333681611010565b6001600160a01b031633141561346b575b60008181526067602052604090205461336a906001600160a01b03161515610fc3565b80600052602060ff8152600660406000200190835180916001600160401b03821161345e575b61339e826122818654611033565b80601f83116001146133f057506000916133e5575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613479565b9050840151386133b3565b9150601f19831661340685600052602060002090565b926000905b828210613446575050908360019493921061342d575b5050811b0190556133c7565b86015160001960f88460031b161c191690553880613421565b80600185968294968c0151815501950193019061340b565b613466610964565b613390565b61347481612e68565b613347565b906080610870926040815260046040820152636c6f676f60e01b606082015281602082015201906108b6565b6134ae81611010565b6001600160a01b0316331415613553575b6000818152606760205260409020546134e2906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b61355c81612e68565b6134bf565b9291909261356e81611010565b6001600160a01b03163314156136b5575b6000818152606760205260409020546135a2906001600160a01b03161515610fc3565b8060005260209360ff855260066040600020018151956001600160401b0387116136a8575b6135d587611f738454611033565b80601f8811600114613637575095806109d1969760009161362c575b508160011b916000199060031b1c19161790555b816000805160206150c383398151915260405180613624339582613479565b0390a36134a5565b9050830151386135f1565b90601f19881661364c84600052602060002090565b926000905b8282106136905750509188916109d1989960019410613677575b5050811b019055613605565b85015160001960f88460031b161c19169055388061366b565b80600185968294968a01518155019501930190613651565b6136b0610964565b6135c7565b6136be81612e68565b61357f565b7fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8906136ed6149d6565b6136f6816118b7565b6137276001600160a01b03613720600261370f87613825565b015460101c6001600160a01b031690565b161561384c565b604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca233928061375988826108db565b0390a361378060076137758360005260ff602052604060002090565b015460181c60ff1690565b156137da576137d5906137c76137946109d3565b828152600060208201819052604082018190526060820152336080820152600160a08201526137c286613825565b6138a3565b60405191829133958361397f565b0390a2565b6137d5906138176137e96109d3565b828152600060208201819052604082018190526060820152336080820152600060a08201526137c286613825565b60405191829133958361395b565b602061383e918160405193828580945193849201610881565b810161010081520301902090565b1561385357565b5060405162461bcd60e51b815260206004820152601e60248201527f466c65656b4552433732313a20415020616c72656164792065786973747300006044820152606490fd5b60041115611a3657565b600290825181556020830151600182015501906138d260408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a09092015161392481613899565b600481101561394e575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613956611a15565b61392e565b6040906139756000939594956060835260608301906108b6565b9460208201520152565b6040906139756001939594956060835260608301906108b6565b6040906139756002939594956060835260608301906108b6565b6040906139756003939594956060835260608301906108b6565b90916139d882611010565b6001600160a01b0316331415613b0c576139f183613825565b918083541415613a865760027fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8930191613a42613a33845460ff9060b01c1690565b613a3c81613899565b15613b28565b15613a6257815460ff60b01b1916600160b01b179091556137d5906137c7565b815460ff60b01b1916600160b11b179091556137d590604051918291339583613999565b505050505060a460405162461bcd60e51b815260206004820152604e60248201527f466c65656b4552433732313a207468652070617373656420746f6b656e49642060448201527f6973206e6f74207468652073616d65206173207468652061636365737320706f60648201526d34b73a13b9903a37b5b2b724b21760911b6084820152fd5b50905060249150604051906355d2292f60e11b82526004820152fd5b15613b2f57565b5060405162461bcd60e51b815260206004820152604260248201527f466c65656b4552433732313a207468652061636365737320706f696e7420637260448201527f656174696f6e2073746174757320686173206265656e20736574206265666f72606482015261329760f11b608482015260a490fd5b613bae6149d6565b6001600160a01b03613bd2816002613bc585613825565b015460101c161515613cc2565b6002613bdd83613825565b015460101c16331415613c7b57613c0c6002613bf883613825565b01805460ff60b01b1916600360b01b179055565b613c1581613825565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613c488587836139b3565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db0604051806120dd3395826108db565b505060405162461bcd60e51b815260206004820152601d60248201527f466c65656b4552433732313a206d757374206265204150206f776e65720000006044820152606490fd5b15613cc957565b5060405162461bcd60e51b815260206004820152601760248201527f466c65656b4552433732313a20696e76616c69642041500000000000000000006044820152606490fd5b6001600160a01b039081613d2282613825565b6002015460101c161515613d3590613cc2565b613d3e90613825565b908154613d4a90614cbb565b906001830154613d5990614cbb565b92600201548060081c60ff16613d6e90614f76565b91613d7b60ff8316614f76565b908260101c16613d8a90614ec1565b9160b01c60ff16613d9a81613899565b613da390614cbb565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613dd691612598565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613dfa91612598565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613e2591612598565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613e5391612598565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613e7891612598565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613e9e91612598565b607d60f81b815260010103601f198101825261087090826109a3565b60ff90600290613ede90613ed96001600160a01b0384613bc584613825565b613825565b015460081c1690565b613efd6001600160a01b036002613bc584613825565b6001613f0882613825565b01613f138154613f5e565b9055613f1e81613825565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee436120dd6001613f4e85613825565b0154604051918291339683613f6e565b600190600019811461211d570190565b929190613f856020916040865260408601906108b6565b930152565b613fa06001600160a01b036002613bc584613825565b6001613fab82613825565b015415613fc8576001613fbd82613825565b01613f13815461400e565b5050606460405162461bcd60e51b815260206004820152602060248201527f466c65656b4552433732313a2073636f72652063616e74206265206c6f7765726044820152fd5b8015612ade576000190190565b6001600160a01b03614032816002613bc585613825565b61403b82613825565b549061404682611010565b163314156140b0575b5061407182600261405f84613825565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff6120dd61409e83613825565b54604051918291339615159583613f6e565b6140b990612e68565b3861404f565b6001600160a01b036140d6816002613bc585613825565b6140df82613825565b54906140ea82611010565b16331415614149575b5061411c82600261410384613825565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c6120dd61409e83613825565b61415290612e68565b386140f3565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b9061418583611010565b6001600160a01b0316331415614248575b6000838152606760205260409020546141b9906001600160a01b03161515610fc3565b60409061421e82518381018181106001600160401b0382111761423b575b84528681528260208201528560005260ff6020526142196005856000200160048660002001906142078254613f5e565b80925590600052602052604060002090565b61225e565b6142266109c4565b948552602085015251806120dd339582614256565b614243610964565b6141d7565b61425183612e68565b614196565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b6002821061429857505050505090565b909192939483806142b5600193607f1989820301865289516108b6565b97019201920190939291614288565b6142cd81611010565b6001600160a01b039081163314156143ec5760008183926142ed84611010565b6142f56149d6565b16151580806143e5575b83146143ce575061430f83612baf565b61431883611010565b61432f61174e856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561436561174e856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46143ab60026143a58360005260ff602052604060002090565b01614406565b6143b25750565b6143c96109d19160005260ff602052604060002090565b614481565b6143d75761430f565b6143e083612baf565b61430f565b50826142ff565b5060249150604051906355d2292f60e11b82526004820152fd5b6108709054611033565b6001600160fe1b038111600116614428575b60021b90565b6144306120f6565b614422565b61443f8154611033565b9081614449575050565b81601f6000931160011461445b575055565b8183526020832061447791601f0160051c810190600101611d52565b8160208120915555565b600760009161448f81614435565b61449b60018201614435565b6144a760028201614435565b6144b360038201614435565b8260048201556144c560068201614435565b0155565b6144d16149d6565b6144d9612545565b6144e281611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166145a35761451581611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290206145409061207e565b61454981611a57565b614553815461210d565b905561455e81611a2c565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516397b705ed60e01b815260049150fd5b6145c06149d6565b6145c981611010565b6001600160a01b039081163314156146aa578160005260996020526146116102ae8561029786610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc7821189061466e61207e8661029787610407614659896000526099602052604060002090565b546103f88a600052609a602052604060002090565b61467784611a2c565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b6146cf6149d6565b6146d7612545565b6146ee6146ea6102ae8461029785611a3e565b1590565b6145a3576146fb81611a2c565b801580614799575b614784576147216147178361029784611a3e565b805460ff19169055565b61472a81611a57565b6147348154612ace565b905561473f81611a2c565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516360ed092b60e01b815260049150fd5b5060016147a582611a57565b5414614703565b6147b46149d6565b6147bd81611010565b6001600160a01b039081163314156146aa578160005260996020526148086146ea6102ae8661029787610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906148506147178661029787610407614659896000526099602052604060002090565b61485984611a2c565b604080516000815233602082015291909516948190810161468f565b61487d612545565b6148856149d6565b60cc5460ff8160081c16156148cd5760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b6148e9612545565b60cc5460ff81161561492a5760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614946612545565b60cc549015159060ff8160081c161515821461499a5761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b6149c560ff60005460081c16611cf1565b60cc805461ffff1916610100179055565b60ff60cc54166149e257565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614a65575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614a6d610964565b614a10565b60405190614a7f8261097b565b6008825260203681840137565b90614a96826109f2565b614aa360405191826109a3565b8281528092614ab4601f19916109f2565b0190602036910137565b805115614b9057614acd6149f5565b614af1614aec614ae7614ae08551612129565b6003900490565b614410565b614a8c565b9160208301918182518301915b828210614b3e57505050600390510680600114614b2b57600214614b20575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614afe565b506108706114fc565b60208183031261095c578051906001600160401b03821161083c570181601f8201121561095c578051614bcb816109f2565b92614bd960405194856109a3565b8184526020828401011161083c576108709160208085019101610881565b92614c236108709593614c15614c319460808852608088019061106f565b90868203602088015261106f565b90848203604086015261106f565b9160608184039101526108b6565b600092918154614c4e81611033565b92600191808316908115614ca65750600114614c6a5750505050565b90919293945060005260209081600020906000915b858310614c95575050505001903880808061109c565b805485840152918301918101614c7f565b60ff191684525050500191503880808061109c565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614df0575b506d04ee2d6d415b85acef810000000080831015614de1575b50662386f26fc1000080831015614dd2575b506305f5e10080831015614dc3575b5061271080831015614db4575b506064821015614da4575b600a80921015614d9a575b600190816021614d52828701614a8c565b95860101905b614d64575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614d9557919082614d58565b614d5d565b9160010191614d41565b9190606460029104910191614d36565b60049193920491019138614d2b565b60089193920491019138614d1e565b60109193920491019138614d0f565b60209193920491019138614cfd565b604093508104915038614ce4565b60405190614e0b8261097b565b6007825260203681840137565b50634e487b7160e01b600052603260045260246000fd5b602090805115614e3d570190565b612125614e18565b602190805160011015614e3d570190565b906020918051821015614e6857010190565b614e70614e18565b010190565b15614e7c57565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117614f69575b604052602a825260403660208401376030614ef683614e2f565b536078614f0283614e45565b536029905b60018211614f1a57610870915015614e75565b80600f614f5692166010811015614f5c575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8486614e56565b5360041c9161400e565b90614f07565b614f64614e18565b614f2c565b614f71610964565b614edc565b15614f9b57604051614f878161097b565b60048152637472756560e01b602082015290565b604051614fa78161097b565b600581526466616c736560d81b602082015290565b62ffffff16614fc9614a72565b906030614fd583614e2f565b536078614fe183614e45565b5360079081905b6001821161507d57614ffb915015614e75565b615003614dfe565b91825115615070575b60236020840153600190815b838110615026575050505090565b61505e906001198111615063575b6001600160f81b031961504982860185614e56565b511660001a6150588288614e56565b53613f5e565b615018565b61506b6120f6565b615034565b615078614e18565b61500c565b80600f6150af921660108110156150b5575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8487614e56565b90614fe8565b6150bd614e18565b61508f56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a3646970667358221220649d06dd22516cb769346c4d824089015f3dc6af7ad4ca0d63914e92c2f6e0046c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - the contract must be not paused. IMPORTANT: The payment is not set yet\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string)\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0xebea929fabed84ed7e45572a13124087264e732a1b55dd7b07c5c26fcde46566\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://232fcba746f4bea888df7258a57031fbe82c6782861941b21a2b745766b8f97d\",\"dweb:/ipfs/QmSnK97Z6Mk1CXvGbf9PbK4Wi3MFNYLcy1vRrXaFSEQgfx\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x4e72d7848d5c44fcc6502054e74d26ede597641342be60e1f8c2978f607db715\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c020f490edc637208060b41dda06ea99c0dc9714917e4cb7729268b8a8ec85f2\",\"dweb:/ipfs/QmRmwK8YXk19kYG9w1qNMe2FAVEtRytKow4u8TRJyb3NPJ\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", + "bytecode": "0x60808060405234610016576152f2908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb1461083f57806301ffc9a71461082357806302dba24d146104a757806306fdde0314610807578063081812fc146107eb578063095ea7b3146107d357806323b872dd146107bb578063246a908b146107a357806327dc5cec146107875780632d957aad1461076f5780633806f152146107575780633ccfd60b146107405780633e233205146107285780633f4ba83a1461071157806342842e0e146106f957806342966c68146106e257806342e44bbf146106ca5780635aa6ab3b146106b25780636352211e1461067d57806370a0823114610661578063736d323a1461064a5780637469a03b1461063357806378278cca1461061b57806383c4c00d146105ff5780638456cb59146105e85780638a2e25be146105d05780638b9ec977146105ac5780638c3c0a441461059457806394ec65c51461057d57806395d89b4114610561578063a09a160114610531578063a22cb46514610519578063a27d0b2714610501578063a397c830146104ea578063aad045a2146104d2578063ac8cf285146104a7578063b187bd261461047b578063b20b94f114610463578063b30437a014610450578063b42dbe38146103f0578063b88d4fde146103d5578063b948a3c5146103bd578063ba4c458a146103a5578063c87b56dd1461037e578063cdb0e89e14610366578063d7a75be11461034a578063e4b50cb81461031a578063e9447250146102f6578063e985e9c514610289578063eb5fd26b146102715763f931517714610253575061000f565b3461026d5761026a61026436610b0a565b90612f73565b51f35b5080fd5b503461026d5761026a61028336611095565b90613734565b503461026d576102f291506102e16102da6102c36102a636611062565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b503461026d576102f291506102e16102da6102c361031336610b63565b9190611b95565b503461026d576102f291506103366103313661097e565b612ca7565b949795969390939291925197889788610ff2565b503461026d576102f291506102e161036136610b39565b613fc4565b503461026d5761026a61037836610b0a565b906132c7565b503461026d576102f2915061039a6103953661097e565b612831565b90519182918261096d565b503461026d5761026a6103b736610f31565b91611bdf565b503461026d5761026a6103cf36610b0a565b906135bb565b503461026d5761026a6103e736610ec1565b929190916116d5565b503461026d576102f291506102e16102da61044b6102c36104103661087f565b93909161043c61042a826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611bc7565b5061026a61045d36610b0a565b90613954565b503461026d5761026a61047536610c09565b9061410a565b503461026d576102f2915061048f36610905565b60cc54905160ff909116151581529081906020820190565b503461026d576102f291506104c36104be366108ea565b610e99565b90519081529081906020820190565b503461026d5761026a6104e436610e62565b90612e8f565b503461026d5761026a6104fc36610b39565b6140a3565b503461026d5761026a6105133661087f565b91614722565b503461026d5761026a61052b36610e31565b90611521565b503461026d576102f2915061054536610905565b60cc54905160089190911c60ff16151581529081906020820190565b503461026d576102f2915061057536610905565b61039a611324565b503461026d5761026a61058f36610b39565b61400c565b503461026d5761026a6105a636610b63565b90614831565b506102f291506104c36105be36610d1a565b9897909796919695929594939461238a565b503461026d5761026a6105e236610cda565b91613c2a565b503461026d576105f736610905565b61026a6149df565b503461026d576102f2915061061336610905565b6104c3612d73565b503461026d5761026a61062d36610b0a565b9061314f565b503461026d5761026a61064536610b39565b613d26565b503461026d5761026a61065c36610cbe565b614aa8565b503461026d576102f291506104c361067836610c9b565b6110b8565b503461026d576102f291506106996106943661097e565b61117e565b90516001600160a01b0390911681529081906020820190565b503461026d5761026a6106c436610c58565b916137f1565b503461026d5761026a6106dc36610c09565b906141cb565b503461026d5761026a6106f43661097e565b6143d9565b503461026d5761026a61070b366109b7565b9161169b565b503461026d5761072036610905565b61026a614a4b565b503461026d5761026a61073a36610bd9565b90614b1e565b503461026d5761074f36610905565b61026a614b30565b503461026d5761026a61076936610b93565b9161426c565b503461026d5761026a61078136610b63565b906145e0565b503461026d576102f2915061039a61079e36610b39565b613e1f565b503461026d5761026a6107b536610b0a565b9061343d565b503461026d5761026a6107cd366109b7565b9161164d565b503461026d5761026a6107e536610990565b906113bd565b503461026d576102f291506106996108023661097e565b6114e3565b503461026d576102f2915061081b36610905565b61039a61126d565b503461026d576102f291506102e161083a366108cf565b612da0565b503461026d5761026a6108513661087f565b91614916565b6001111561000f57565b600435906001600160a01b03821682141561087857565b5050600080fd5b606090600319011261000f576004359060243561089b81610857565b906044356001600160a01b0381168114156108b35790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f576004356108e7816108bc565b90565b602090600319011261000f5760043560028110156108785790565b600090600319011261000f57565b918091926000905b82821061093357501161092c575050565b6000910152565b9150806020918301518186015201829161091b565b9060209161096181518092818552858086019101610913565b601f01601f1916010190565b9060206108e7928181520190610948565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610878579060243590565b606090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610a2857604052565b610a306109f6565b604052565b90601f801991011681019081106001600160401b03821117610a2857604052565b60405190610a6382610a0d565b565b6040519060c082018281106001600160401b03821117610a2857604052565b6020906001600160401b038111610aa1575b601f01601f19160190565b610aa96109f6565b610a96565b929192610aba82610a84565b91610ac86040519384610a35565b829481845281830111610ae5578281602093846000960137010152565b5050505050600080fd5b9080601f830112156109ee578160206108e793359101610aae565b9060406003198301126108785760043591602435906001600160401b0382116108b3576108e791600401610aef565b602060031982011261087857600435906001600160401b0382116109ee576108e791600401610aef565b604090600319011261000f57600435610b7b81610857565b906024356001600160a01b0381168114156109ee5790565b606060031982011261087857600435916001600160401b03602435818111610ae55783610bc291600401610aef565b92604435918211610ae5576108e791600401610aef565b604090600319011261000f576004356002811015610878579060243590565b610124359081151582141561087857565b604060031982011261087857600435906001600160401b0382116109ee57610c3391600401610aef565b906024358015158114156109ee5790565b610104359062ffffff821682141561087857565b9060606003198301126108785760043591602435906001600160401b0382116108b357610c8791600401610aef565b9060443562ffffff81168114156108b35790565b602090600319011261000f576004356001600160a01b0381168114156108785790565b602090600319011261000f576004358015158114156108785790565b9060606003198301126108785760043591602435906001600160401b0382116108b357610d0991600401610aef565b906044358015158114156108b35790565b61014060031982011261087857610d2f610861565b916001600160401b0390602435828111610ae557610d51846004928301610aef565b93604435848111610e255781610d68918401610aef565b93606435818111610e185782610d7f918501610aef565b93608435828111610e0a5783610d96918601610aef565b9360a435838111610dfb5784610dad918301610aef565b9360c435848111610deb5781610dc4918401610aef565b9360e435908111610deb57610dd99201610aef565b90610de2610c44565b906108e7610bf8565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b03811681141561087857906024358015158114156109ee5790565b604090600319011261000f57600435906024358015158114156109ee5790565b50634e487b7160e01b600052602160045260246000fd5b6002811015610eb4575b60005260fe60205260406000205490565b610ebc610e82565b610ea3565b906080600319830112610878576001600160a01b03916004358381168114156108b357926024359081168114156108b3579160443591606435906001600160401b038211610f265780602383011215610f26578160246108e793600401359101610aae565b505050505050600080fd5b906060600319830112610878576001600160401b03906004358281116108b35783610f5e91600401610aef565b92602435838111610ae55781610f7691600401610aef565b9260443591818311610f265780602384011215610f26578260040135918211610fe5575b8160051b60405193602093610fb185840187610a35565b8552602484860192820101928311610e1857602401905b828210610fd6575050505090565b81358152908301908301610fc8565b610fed6109f6565b610f9a565b959062ffffff9461103a61105b9561102c60c0999661101e611048969d9e9d60e08e8181520190610948565b8c810360208e015290610948565b908a820360408c0152610948565b9088820360608a0152610948565b91608087015285820360a0870152610948565b9416910152565b604090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee5790565b604090600319011261000f576004359060243562ffffff81168114156109ee5790565b6001600160a01b031680156110d857600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b1561113857565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b03166108e7811515611131565b90600182811c921680156111d3575b60208310146111bb57565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916111b0565b90600092918054916111ee836111a1565b9182825260019384811690816000146112505750600114611210575b50505050565b90919394506000526020928360002092846000945b83861061123c57505050500101903880808061120a565b805485870183015294019385908201611225565b60ff1916602084015250506040019350389150819050808061120a565b6040519060008260655491611281836111a1565b8083529260019081811690811561130757506001146112a8575b50610a6392500383610a35565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b8483106112ec5750610a6393505081016020013861129b565b81935090816020925483858a010152019101909185926112d3565b94505050505060ff19166020830152610a6382604081013861129b565b6040519060008260665491611338836111a1565b80835292600190818116908115611307575060011461135e5750610a6392500383610a35565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b8483106113a25750610a6393505081016020013861129b565b81935090816020925483858a01015201910190918592611389565b906113c78161117e565b6001600160a01b038181169084168114611490573314908115611462575b50156113f457610a63916119bf565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff91506114889033906102c3565b5416386113e5565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611506906001600160a01b03161515611131565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b03811691903383146115a257816115616115729233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b156115f157565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b90610a6392916116656116608433611771565b6115ea565b611844565b60405190602082018281106001600160401b0382111761168e575b60405260008252565b6116966109f6565b611685565b9091610a639260405192602084018481106001600160401b038211176116c8575b604052600084526116d5565b6116d06109f6565b6116bc565b906116f99392916116e96116608433611771565b6116f4838383611844565b611acb565b1561170057565b5060405162461bcd60e51b81528061171a6004820161171e565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b03806117838461117e565b1692818316928484149485156117b9575b505083156117a3575b50505090565b6117af919293506114e3565b161438808061179d565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611794565b156117f057565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b611868906118518461117e565b6001600160a01b03828116939091821684146117e9565b8316928315611969576118e682611883878461194096612de4565b6118a58561189f6118938a61117e565b6001600160a01b031690565b146117e9565b6118cc6118bc886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b038116600090815260686020526040902060018154019055611921856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b03806119f88461117e565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b600090815260676020526040902054610a63906001600160a01b03161515611131565b9081602091031261087857516108e7816108bc565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526108e792910190610948565b506040513d6000823e3d90fd5b3d15611ac6573d90611aac82610a84565b91611aba6040519384610a35565b82523d6000602084013e565b606090565b92909190823b15611b7a57611afe926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611a5d565b03926001600160a01b03165af160009181611b5a575b50611b4c57505050611b24611a9b565b80519081611b4757505060405162461bcd60e51b81528061171a6004820161171e565b602001fd5b6001600160e01b0319161490565b611b73919250611b6a3d82610a35565b3d810190611a48565b9038611b14565b50505050600190565b60011115611b8d57565b610a63610e82565b611b9e81611b83565b6000526098602052604060002090565b611bb781611b83565b6000526097602052604060002090565b90611bd181611b83565b600052602052604060002090565b90916000549260ff8460081c161580948195611d01575b8115611ce1575b5015611c8157611c239284611c1a600160ff196000541617600055565b611c6857611d0f565b611c2957565b611c3961ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611c7c61010061ff00196000541617600055565b611d0f565b5050505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611cf3575b5038611bfd565b6001915060ff161438611cec565b600160ff8216109150611bf6565b929190611d2c60ff60005460081c16611d2781611e51565b611e51565b83516001600160401b038111611e44575b611d5181611d4c6065546111a1565b611ec9565b602080601f8311600114611dae57509080611d8e9392611d9b9697600092611da3575b50508160011b916000199060031b1c191617606555611fba565b611d9661218d565b612299565b610a63614b97565b015190503880611d74565b90601f19831696611de160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b926000905b898210611e2c575050918391600193611d8e9695611d9b999a10611e13575b505050811b01606555611fba565b015160001960f88460031b161c19169055388080611e05565b80600185968294968601518155019501930190611de6565b611e4c6109f6565b611d3d565b15611e5857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611ebd575050565b60008155600101611eb2565b90601f8211611ed6575050565b610a639160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611f20575b601f0160051c0190611eb2565b9091508190611f13565b90601f8211611f37575050565b610a639160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9190601f8111611f8f57505050565b610a63926000526020600020906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9081516001600160401b0381116120a4575b611fe081611fdb6066546111a1565b611f2a565b602080601f831160011461201c5750819293600092612011575b50508160011b916000199060031b1c191617606655565b015190503880611ffa565b90601f1983169461204f60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b87821061208c575050836001959610612073575b505050811b01606655565b015160001960f88460031b161c19169055388080612068565b80600185968294968601518155019501930190612054565b6120ac6109f6565b611fcc565b91909182516001600160401b038111612180575b6120d9816120d384546111a1565b84611f80565b602080601f831160011461211557508192939460009261210a575b50508160011b916000199060031b1c1916179055565b0151905038806120f4565b90601f1983169561212b85600052602060002090565b926000905b8882106121685750508360019596971061214f575b505050811b019055565b015160001960f88460031b161c19169055388080612145565b80600185968294968601518155019501930190612130565b6121886109f6565b6120c5565b600061219f60ff825460081c16611e51565b808052609860209081526040808320336000908152925290205460ff1661224257808052609860209081526040808320336000908152925290206121eb905b805460ff19166001179055565b808052609760205260408120612201815461226d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161227d570190565b612285612256565b0190565b600290600219811161227d570190565b906122ab60ff60005460081c16611e51565b60005b8251811015612306578060026122e79210156122f9575b83518110156122ec575b6122e260208260051b8601015182612332565b61230b565b6122ae565b6122f461231b565b6122cf565b612301610e82565b6122c5565b509050565b600190600019811461227d570190565b50634e487b7160e01b600052603260045260246000fd5b6040907f6819853ffee8927169953e7bdc42aaba347fb03ff918a45bfccaf88626d9009692600282101561237d575b8160005260fe60205280836000205582519182526020820152a1565b612385610e82565b612361565b93949891969790929761239b612798565b6101309687549a8b986123ae8a8961268d565b546123b89061226d565b610130556123d189600052610131602052604060002090565b6123db87826120b1565b6123e88b600183016120b1565b6123f58c600283016120b1565b61240289600383016120b1565b61240f84600683016120b1565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff88161717905560006004820155612443610a56565b908282528360208301526005016124639060008052602052604060002090565b9061246d916124b1565b604051978897600160a01b60019003169b339b61248a988a6125a8565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b03811161259b575b6124da816124d486546111a1565b86611f80565b6020928390601f831160011461252657918060019492610a6397969460009261251b575b5050600019600383901b1c191690841b1784555b015191016120b1565b0151905038806124fe565b90601f1983169161253c87600052602060002090565b9260005b81811061258457509260019593928592610a6399989688951061256b575b505050811b018455612512565b015160001960f88460031b161c1916905538808061255e565b929387600181928786015181550195019301612540565b6125a36109f6565b6124c6565b979998959062ffffff95612608612632966125fa8c6101009c986125ec612624996125de61261699610120808752860190610948565b908482036020860152610948565b916040818403910152610948565b8c810360608e015290610948565b908a820360808c0152610948565b9088820360a08a0152610948565b9086820360c0880152610948565b951660e08401521515910152565b1561264757565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156127505760008381526067602052604090205461272691906126c8906001600160a01b031615155b15612640565b6126d0614bb9565b6000848152606760205260409020546126f3906001600160a01b031615156126c2565b6001600160a01b038116600090815260686020526040902060018154019055611921846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6000805260fe6020527f32796e36004994222362c2f9423d5e208bb848170964890784a8d59ed40f50af54348114156127ce5750565b6024915060405190635f7e28df60e01b82526004820152fd5b600160005260fe6020527f457c8a48b4735f56b938837eb0a8a5f9c55f23c1a85767ce3b65c3e59d3d32b754348114156127ce5750565b9061228560209282815194859201610913565b600081815260676020526040902054612854906001600160a01b03161515611131565b61285d8161117e565b9060005261013160205260406000206128b46040519261287c84610a0d565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b031661508d565b6128f6600383016007840160006128d66128d1835462ffffff1690565b615188565b6040518095819263891c235f60e01b835260068a01878b60048601614dda565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612c9a575b600093612c77575b5054908160181c60ff1661293290615142565b9060058601906004870154928261295485809590600052602052604060002090565b936129689190600052602052604060002090565b6001019361297590614e9e565b9462ffffff1661298490615188565b604051607b60f81b602082015267113730b6b2911d1160c11b60218201529889989197916129b560298b0183614e22565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f016129e59060018401614e22565b61088b60f21b8152600201681137bbb732b9111d1160b91b8152600901612a0b9161281e565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b8152601001612a3b91600201614e22565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b8152600901612a619161281e565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d01612a9b9161281e565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f01612aec91614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b6020820152602701612b3791614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b6020820152602601612b8191614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b6020820152602301612bc89161281e565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b6020820152602101612c0d9161281e565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f19918281018252612c419082610a35565b612c4a90614ca1565b9160405192839160208301612c5e9161281e565b612c679161281e565b0390810182526108e79082610a35565b612c9391933d90823e612c8a3d82610a35565b3d810190614d7c565b913861291f565b612ca2611a8e565b612917565b600081815260676020526040902054612cca906001600160a01b03161515611131565b60005261013160205260409081600020600481015462ffffff600783015416938051612d0181612cfa81876111dd565b0382610a35565b948151612d1581612cfa81600189016111dd565b946006612d528451612d2e81612cfa8160028c016111dd565b96612cfa8651612d4581612cfa81600387016111dd565b97965180948193016111dd565b9190565b60018110612d66575b6000190190565b612d6e612256565b612d5f565b610130548015612d8c5760018110612d66576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612dd3575b8115612dc5575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612dbb565b90612ded614bb9565b6001600160a01b0391821615158080612e2d575b15612e1257505050610a6390612e38565b612e1b57505050565b1615612e245750565b610a6390612e38565b508282161515612e01565b80600052609960205260406000206001815481198111612e82575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612e8a612256565b612e53565b612e988161117e565b6001600160a01b0316331415612f5857600081815260676020526040902054612ecb906001600160a01b03161515611131565b600081815261013160205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612f7c8161117e565b6001600160a01b03163314156130b2575b600081815260676020526040902054612fb0906001600160a01b03161515611131565b8060005260206101318152600260406000200190835180916001600160401b0382116130a5575b612fe5826124d486546111a1565b80601f8311600114613037575060009161302c575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d3395826130c0565b905084015138612ffa565b9150601f19831661304d85600052602060002090565b926000905b82821061308d5750509083600194939210613074575b5050811b01905561300e565b86015160001960f88460031b161c191690553880613068565b80600185968294968c01518155019501930190613052565b6130ad6109f6565b612fd7565b6130bb816130f3565b612f8d565b9060806108e79260408152600b60408201526a195e1d195c9b985b15549360aa1b60608201528160208201520190610948565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615613131575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b6131588161117e565b6001600160a01b031633141561328e575b60008181526067602052604090205461318c906001600160a01b03161515611131565b8060005260206101318152600360406000200190835180916001600160401b038211613281575b6131c1826124d486546111a1565b80601f83116001146132135750600091613208575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d33958261329c565b9050840151386131d6565b9150601f19831661322985600052602060002090565b926000905b8282106132695750509083600194939210613250575b5050811b0190556131ea565b86015160001960f88460031b161c191690553880613244565b80600185968294968c0151815501950193019061322e565b6132896109f6565b6131b3565b613297816130f3565b613169565b9060806108e792604081526003604082015262454e5360e81b60608201528160208201520190610948565b6132d08161117e565b6001600160a01b0316331415613403575b600081815260676020526040902054613304906001600160a01b03161515611131565b8060005260206101318152604060002090835180916001600160401b0382116133f6575b613336826124d486546111a1565b80601f8311600114613388575060009161337d575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613411565b90508401513861334b565b9150601f19831661339e85600052602060002090565b926000905b8282106133de57505090836001949392106133c5575b5050811b01905561335f565b86015160001960f88460031b161c1916905538806133b9565b80600185968294968c015181550195019301906133a3565b6133fe6109f6565b613328565b61340c816130f3565b6132e1565b9060806108e7926040815260046040820152636e616d6560e01b60608201528160208201520190610948565b6134468161117e565b6001600160a01b031633141561357a575b60008181526067602052604090205461347a906001600160a01b03161515611131565b8060005260206101318152600180604060002001918451906001600160401b03821161356d575b6134af826124d486546111a1565b80601f83116001146135025750819282916000936134f7575b501b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613588565b8701519250386134c8565b9082601f19811661351887600052602060002090565b936000905b87838310613553575050501061353a575b5050811b0190556134d9565b86015160001960f88460031b161c19169055388061352e565b8b860151875590950194938401938693509081019061351d565b6135756109f6565b6134a1565b613583816130f3565b613457565b9060806108e79260408152600b60408201526a3232b9b1b934b83a34b7b760a91b60608201528160208201520190610948565b6135c48161117e565b6001600160a01b03163314156136fa575b6000818152606760205260409020546135f8906001600160a01b03161515611131565b8060005260206101318152600660406000200190835180916001600160401b0382116136ed575b61362d826124d486546111a1565b80601f831160011461367f5750600091613674575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613708565b905084015138613642565b9150601f19831661369585600052602060002090565b926000905b8282106136d557505090836001949392106136bc575b5050811b019055613656565b86015160001960f88460031b161c1916905538806136b0565b80600185968294968c0151815501950193019061369a565b6136f56109f6565b61361f565b613703816130f3565b6135d5565b9060806108e7926040815260046040820152636c6f676f60e01b60608201528160208201520190610948565b61373d8161117e565b6001600160a01b03163314156137e3575b600081815260676020526040902054613771906001600160a01b03161515611131565b600081815261013160205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b6137ec816130f3565b61374e565b929190926137fe8161117e565b6001600160a01b0316331415613946575b600081815260676020526040902054613832906001600160a01b03161515611131565b80600052602093610131855260066040600020018151956001600160401b038711613939575b613866876120d384546111a1565b80601f88116001146138c857509580610a6396976000916138bd575b508160011b916000199060031b1c19161790555b8160008051602061528f833981519152604051806138b5339582613708565b0390a3613734565b905083015138613882565b90601f1988166138dd84600052602060002090565b926000905b828210613921575050918891610a63989960019410613908575b5050811b019055613896565b85015160001960f88460031b161c1916905538806138fc565b80600185968294968a015181550195019301906138e2565b6139416109f6565b613858565b61394f816130f3565b61380f565b61395c614bb9565b6139646127e7565b61396d81611a25565b6001600160a01b03613994600261398385613acf565b015460101c6001600160a01b031690565b16613aba577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe890604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca23392806139ed888261096d565b0390a3613a156007613a0a83600052610131602052604060002090565b015460181c60ff1690565b15613a6f57613a6a90613a5c613a29610a65565b828152600060208201819052604082018190526060820152336080820152600160a0820152613a5786613acf565b613b00565b604051918291339583613bdc565b0390a2565b613a6a90613aac613a7e610a65565b828152600060208201819052604082018190526060820152336080820152600060a0820152613a5786613acf565b604051918291339583613bb8565b505060405163142d0c2f60e11b815260049150fd5b6020613ae8918160405193828580945193849201610913565b810161013281520301902090565b60041115611b8d57565b60029082518155602083015160018201550190613b2f60408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a090920151613b8181613af6565b6004811015613bab575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613bb3610e82565b613b8b565b604090613bd2600093959495606083526060830190610948565b9460208201520152565b604090613bd2600193959495606083526060830190610948565b604090613bd2600293959495606083526060830190610948565b604090613bd2600393959495606083526060830190610948565b919091613c368161117e565b6001600160a01b0316331415613d0a57613c4f83613acf565b8181541415613cf45760020190613c6b825460ff9060b01c1690565b613c7481613af6565b613cde577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe89215613cba57815460ff60b01b1916600160b01b17909155613a6a90613a5c565b815460ff60b01b1916600160b11b17909155613a6a90604051918291339583613bf6565b5050505050600460405163d9e5c51160e01b8152fd5b50505050506004604051636653b1a360e01b8152fd5b91505060249150604051906355d2292f60e11b82526004820152fd5b613d2e614bb9565b6001600160a01b03806002613d4284613acf565b015460101c1615613e0a576002613d5883613acf565b015460101c16331415613df657613d876002613d7383613acf565b01805460ff60b01b1916600360b01b179055565b613d9081613acf565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613dc3858783613c10565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db06040518061223d33958261096d565b5050604051631851b23d60e01b8152600490fd5b5050604051630d436c3560e21b815260049150fd5b6001600160a01b0390816002613e3483613acf565b015460101c1615613e0a57613e4890613acf565b908154613e5490614e9e565b906001830154613e6390614e9e565b92600201548060081c60ff16613e7890615142565b91613e8560ff8316615142565b908260101c16613e949061508d565b9160b01c60ff16613ea481613af6565b613ead90614e9e565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613ee09161281e565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613f049161281e565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613f2f9161281e565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613f5d9161281e565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613f829161281e565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613fa89161281e565b607d60f81b815260010103601f19810182526108e79082610a35565b6001600160a01b036002613fd783613acf565b015460101c1615613ff8576002613fef60ff92613acf565b015460081c1690565b5050604051630d436c3560e21b8152600490fd5b6001600160a01b03600261401f83613acf565b015460101c1615613ff857600161403582613acf565b01614040815461230b565b905561404b81613acf565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee4361223d600161407b85613acf565b01546040519182913396835b92919061409e602091604086526040860190610948565b930152565b6001600160a01b0360026140b683613acf565b015460101c1615613ff85760016140cc82613acf565b0154156140e95760016140de82613acf565b0161404081546140fd565b50506040516341f3125f60e11b8152600490fd5b8015612d66576000190190565b6001600160a01b0380600261411e84613acf565b015460101c16156141b65761413282613acf565b549061413d8261117e565b163314156141a7575b5061416882600261415684613acf565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff61223d61419583613acf565b54604051918291339615159583614087565b6141b0906130f3565b38614146565b505050506004604051630d436c3560e21b8152fd5b6001600160a01b038060026141df84613acf565b015460101c16156141b6576141f382613acf565b54906141fe8261117e565b1633141561425d575b5061423082600261421784613acf565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c61223d61419583613acf565b614266906130f3565b38614207565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b906142998361117e565b6001600160a01b031633141561435d575b6000838152606760205260409020546142cd906001600160a01b03161515611131565b60409061433382518381018181106001600160401b03821117614350575b84528681528260208201528560005261013160205261432e60058560002001600486600020019061431c825461230b565b80925590600052602052604060002090565b6124b1565b61433b610a56565b9485526020850152518061223d33958261436b565b6143586109f6565b6142eb565b614366836130f3565b6142aa565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b600282106143ad57505050505090565b909192939483806143ca600193607f198982030186528951610948565b9701920192019093929161439d565b6143e28161117e565b6001600160a01b039081163314156145035760008183926144028461117e565b61440a614bb9565b16151580806144fc575b83146144e5575061442483612e38565b61442d8361117e565b6144446118bc856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561447a6118bc856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46144c160026144bb83600052610131602052604060002090565b0161451d565b6144c85750565b6144e0610a6391600052610131602052604060002090565b614598565b6144ee57614424565b6144f783612e38565b614424565b5082614414565b5060249150604051906355d2292f60e11b82526004820152fd5b6108e790546111a1565b6001600160fe1b03811160011661453f575b60021b90565b614547612256565b614539565b61455681546111a1565b9081614560575050565b81601f60009311600114614572575055565b8183526020832061458e91601f0160051c810190600101611eb2565b8160208120915555565b60076000916145a68161454c565b6145b26001820161454c565b6145be6002820161454c565b6145ca6003820161454c565b8260048201556145dc6006820161454c565b0155565b6145e8614bb9565b6145f06146cf565b6145f981611b83565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166146ba5761462c81611b83565b60008181526098602090815260408083206001600160a01b03861684529091529020614657906121de565b61466081611bae565b61466a815461226d565b905561467581611b83565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516397b705ed60e01b815260049150fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561470857565b5060405163070198dd60e51b815260006004820152602490fd5b61472a614bb9565b6147338161117e565b6001600160a01b039081163314156148145781600052609960205261477b6102da856102c38661044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906147d86121de866102c38761044b6147c3896000526099602052604060002090565b5461043c8a600052609a602052604060002090565b6147e184611b83565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b614839614bb9565b6148416146cf565b6148586148546102da846102c385611b95565b1590565b6146ba5761486581611b83565b801580614903575b6148ee5761488b614881836102c384611b95565b805460ff19169055565b61489481611bae565b61489e8154612d56565b90556148a981611b83565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516360ed092b60e01b815260049150fd5b50600161490f82611bae565b541461486d565b61491e614bb9565b6149278161117e565b6001600160a01b03908116331415614814578160005260996020526149726148546102da866102c38761044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906149ba614881866102c38761044b6147c3896000526099602052604060002090565b6149c384611b83565b60408051600081523360208201529190951694819081016147f9565b6149e76146cf565b6149ef614bb9565b60cc5460ff8160081c1615614a375760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b614a536146cf565b60cc5460ff811615614a945760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614ab06146cf565b60cc549015159060ff8160081c1615158214614b045761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b90610a6391614b2b6146cf565b612332565b614b386146cf565b478060008115614b8e575b600080809381933390f115614b81575b6040519081527f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a360203392a2565b614b89611a8e565b614b53565b506108fc614b43565b614ba860ff60005460081c16611e51565b60cc805461ffff1916610100179055565b60ff60cc5416614bc557565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614c48575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614c506109f6565b614bf3565b60405190614c6282610a0d565b6008825260203681840137565b90614c7982610a84565b614c866040519182610a35565b8281528092614c97601f1991610a84565b0190602036910137565b805115614d7357614cb0614bd8565b614cd4614ccf614cca614cc38551612289565b6003900490565b614527565b614c6f565b9160208301918182518301915b828210614d2157505050600390510680600114614d0e57600214614d03575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614ce1565b506108e761166a565b6020818303126109ee578051906001600160401b0382116108b3570181601f820112156109ee578051614dae81610a84565b92614dbc6040519485610a35565b818452602082840101116108b3576108e79160208085019101610913565b92614e066108e79593614df8614e14946080885260808801906111dd565b9086820360208801526111dd565b9084820360408601526111dd565b916060818403910152610948565b600092918154614e31816111a1565b92600191808316908115614e895750600114614e4d5750505050565b90919293945060005260209081600020906000915b858310614e78575050505001903880808061120a565b805485840152918301918101614e62565b60ff191684525050500191503880808061120a565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614fd3575b506d04ee2d6d415b85acef810000000080831015614fc4575b50662386f26fc1000080831015614fb5575b506305f5e10080831015614fa6575b5061271080831015614f97575b506064821015614f87575b600a80921015614f7d575b600190816021614f35828701614c6f565b95860101905b614f47575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614f7857919082614f3b565b614f40565b9160010191614f24565b9190606460029104910191614f19565b60049193920491019138614f0e565b60089193920491019138614f01565b60109193920491019138614ef2565b60209193920491019138614ee0565b604093508104915038614ec7565b60405190614fee82610a0d565b6007825260203681840137565b602090805115615009570190565b61228561231b565b602190805160011015615009570190565b90602091805182101561503457010190565b61503c61231b565b010190565b1561504857565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117615135575b604052602a8252604036602084013760306150c283614ffb565b5360786150ce83615011565b536029905b600182116150e6576108e7915015615041565b80600f61512292166010811015615128575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188486615022565b5360041c916140fd565b906150d3565b61513061231b565b6150f8565b61513d6109f6565b6150a8565b156151675760405161515381610a0d565b60048152637472756560e01b602082015290565b60405161517381610a0d565b600581526466616c736560d81b602082015290565b62ffffff16615195614c55565b9060306151a183614ffb565b5360786151ad83615011565b5360079081905b60018211615249576151c7915015615041565b6151cf614fe1565b9182511561523c575b60236020840153600190815b8381106151f2575050505090565b61522a90600119811161522f575b6001600160f81b031961521582860185615022565b511660001a6152248288615022565b5361230b565b6151e4565b615237612256565b615200565b61524461231b565b6151d8565b80600f61527b92166010811015615281575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188487615022565b906151b4565b61528961231b565b61525b56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a36469706673582212202e75744fc556eafe78e883a2f3183bc7de9ed6d92b284cb784cf309e243d27256c6578706572696d656e74616cf564736f6c634300080c0041", + "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccessPointAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointCreationStatusAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointNotExistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointScoreCannotBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenIdForAccessPoint\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeAccessPointOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredValue\",\"type\":\"uint256\"}],\"name\":\"RequiredPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BillingChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"_billings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"}],\"name\":\"getBilling\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"initialBillings\",\"type\":\"uint256[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setBilling\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - billing for add acess point may be applied. - the contract must be not paused.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getBilling(uint8)\":{\"details\":\"Returns the billing value for a given key.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string,uint256[])\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - billing for the minting may be applied. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setBilling(uint8,uint256)\":{\"details\":\"Sets the billing value for a given key. May emit a {BillingChanged} event. Requirements: - the sender must have the `collectionOwner` role.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"},\"withdraw()\":{\"details\":\"Withdraws all the funds from contract. May emmit a {Withdrawn} event. Requirements: - the sender must have the `collectionOwner` role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0x95f7195cc0f546e06ab49a57e8d22a0ca482175ffa2a74b71ff4c7c395b7394a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://045d686ba6ddf6e1b296b87511e0610bd838a949e108b75c5f960675c4f8de0a\",\"dweb:/ipfs/QmWTyAVAg4KmoE19iKir78TNtCCjtqhJPqGqt7rNyBA6Qv\"]},\"contracts/FleekBilling.sol\":{\"keccak256\":\"0x6fed8b7faba37011bd15b0bc395ca40e24a85499dec167de6942acabc5407d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1f71b1173e8cd21e14e44e97a1add07d1f08115aa2a4053e40aacfbbc270a19\",\"dweb:/ipfs/QmSej6eRfhhL84SMMFrPJWesTUhMRc4HSTY85b2zAKzzhs\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x33d8a71103d4d5c8c39120e514cce5220530485aa05fb13bb64010daaaaac8a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f4ac13123b77e53ae8ae1c220853254e4f1aae04c8602da594f812e0a5224b3e\",\"dweb:/ipfs/QmXyFDqEJc5fWFVRYLq9bmwMAfuXXdAUTJwSH2dArFgz3v\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", "storageLayout": { "storage": [ { @@ -1733,7 +1880,7 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 5764, + "astId": 5991, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_paused", "offset": 0, @@ -1741,7 +1888,7 @@ "type": "t_bool" }, { - "astId": 5766, + "astId": 5993, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_canPause", "offset": 1, @@ -1749,7 +1896,7 @@ "type": "t_bool" }, { - "astId": 5917, + "astId": 6144, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "__gap", "offset": 0, @@ -1757,28 +1904,44 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 4434, + "astId": 4255, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_billings", + "offset": 0, + "slot": "254", + "type": "t_mapping(t_enum(Billing)4234,t_uint256)" + }, + { + "astId": 4383, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "255", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 4611, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_appIds", "offset": 0, - "slot": "254", + "slot": "304", "type": "t_uint256" }, { - "astId": 4439, + "astId": 4616, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_apps", "offset": 0, - "slot": "255", - "type": "t_mapping(t_uint256,t_struct(App)4408_storage)" + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(App)4585_storage)" }, { - "astId": 4444, + "astId": 4621, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_accessPoints", "offset": 0, - "slot": "256", - "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)" + "slot": "306", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)" } ], "types": { @@ -1810,11 +1973,16 @@ "label": "bool", "numberOfBytes": "1" }, - "t_enum(AccessPointCreationStatus)4418": { + "t_enum(AccessPointCreationStatus)4595": { "encoding": "inplace", "label": "enum FleekERC721.AccessPointCreationStatus", "numberOfBytes": "1" }, + "t_enum(Billing)4234": { + "encoding": "inplace", + "label": "enum FleekBilling.Billing", + "numberOfBytes": "1" + }, "t_enum(CollectionRoles)3829": { "encoding": "inplace", "label": "enum FleekAccessControl.CollectionRoles", @@ -1846,6 +2014,13 @@ "numberOfBytes": "32", "value": "t_uint256" }, + "t_mapping(t_enum(Billing)4234,t_uint256)": { + "encoding": "mapping", + "key": "t_enum(Billing)4234", + "label": "mapping(enum FleekBilling.Billing => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { "encoding": "mapping", "key": "t_enum(CollectionRoles)3829", @@ -1867,12 +2042,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_bool)" }, - "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)": { + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)": { "encoding": "mapping", "key": "t_string_memory_ptr", "label": "mapping(string => struct FleekERC721.AccessPoint)", "numberOfBytes": "32", - "value": "t_struct(AccessPoint)4432_storage" + "value": "t_struct(AccessPoint)4609_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1895,19 +2070,19 @@ "numberOfBytes": "32", "value": "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))" }, - "t_mapping(t_uint256,t_struct(App)4408_storage)": { + "t_mapping(t_uint256,t_struct(App)4585_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.App)", "numberOfBytes": "32", - "value": "t_struct(App)4408_storage" + "value": "t_struct(App)4585_storage" }, - "t_mapping(t_uint256,t_struct(Build)4413_storage)": { + "t_mapping(t_uint256,t_struct(Build)4590_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.Build)", "numberOfBytes": "32", - "value": "t_struct(Build)4413_storage" + "value": "t_struct(Build)4590_storage" }, "t_mapping(t_uint256,t_uint256)": { "encoding": "mapping", @@ -1926,12 +2101,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AccessPoint)4432_storage": { + "t_struct(AccessPoint)4609_storage": { "encoding": "inplace", "label": "struct FleekERC721.AccessPoint", "members": [ { - "astId": 4420, + "astId": 4597, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "tokenId", "offset": 0, @@ -1939,7 +2114,7 @@ "type": "t_uint256" }, { - "astId": 4422, + "astId": 4599, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "score", "offset": 0, @@ -1947,7 +2122,7 @@ "type": "t_uint256" }, { - "astId": 4424, + "astId": 4601, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "contentVerified", "offset": 0, @@ -1955,7 +2130,7 @@ "type": "t_bool" }, { - "astId": 4426, + "astId": 4603, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "nameVerified", "offset": 1, @@ -1963,7 +2138,7 @@ "type": "t_bool" }, { - "astId": 4428, + "astId": 4605, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "owner", "offset": 2, @@ -1971,22 +2146,22 @@ "type": "t_address" }, { - "astId": 4431, + "astId": 4608, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "status", "offset": 22, "slot": "2", - "type": "t_enum(AccessPointCreationStatus)4418" + "type": "t_enum(AccessPointCreationStatus)4595" } ], "numberOfBytes": "96" }, - "t_struct(App)4408_storage": { + "t_struct(App)4585_storage": { "encoding": "inplace", "label": "struct FleekERC721.App", "members": [ { - "astId": 4388, + "astId": 4565, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "name", "offset": 0, @@ -1994,7 +2169,7 @@ "type": "t_string_storage" }, { - "astId": 4390, + "astId": 4567, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "description", "offset": 0, @@ -2002,7 +2177,7 @@ "type": "t_string_storage" }, { - "astId": 4392, + "astId": 4569, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "externalURL", "offset": 0, @@ -2010,7 +2185,7 @@ "type": "t_string_storage" }, { - "astId": 4394, + "astId": 4571, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "ENS", "offset": 0, @@ -2018,7 +2193,7 @@ "type": "t_string_storage" }, { - "astId": 4396, + "astId": 4573, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "currentBuild", "offset": 0, @@ -2026,15 +2201,15 @@ "type": "t_uint256" }, { - "astId": 4401, + "astId": 4578, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "builds", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(Build)4413_storage)" + "type": "t_mapping(t_uint256,t_struct(Build)4590_storage)" }, { - "astId": 4403, + "astId": 4580, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "logo", "offset": 0, @@ -2042,7 +2217,7 @@ "type": "t_string_storage" }, { - "astId": 4405, + "astId": 4582, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "color", "offset": 0, @@ -2050,7 +2225,7 @@ "type": "t_uint24" }, { - "astId": 4407, + "astId": 4584, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "accessPointAutoApproval", "offset": 3, @@ -2060,12 +2235,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Build)4413_storage": { + "t_struct(Build)4590_storage": { "encoding": "inplace", "label": "struct FleekERC721.Build", "members": [ { - "astId": 4410, + "astId": 4587, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "commitHash", "offset": 0, @@ -2073,7 +2248,7 @@ "type": "t_string_storage" }, { - "astId": 4412, + "astId": 4589, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "gitRepository", "offset": 0, diff --git a/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx b/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx index 6fbaed0..7a76c6d 100644 --- a/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx +++ b/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx @@ -19,7 +19,10 @@ const createWriteContractContext = < TAbi extends EthereumHooks.Abi, TArgumentsMap extends EthereumHooks.WriteContext.ArgumentsMap, TFunctionName extends keyof TArgumentsMap & string, - TFunctionArguments extends TArgumentsMap[TFunctionName] + TFunctionArguments extends [ + ...TArgumentsMap[TFunctionName], + EthereumHooks.WriteContext.SettingsParam + ] >( address: string, abi: TAbi, @@ -89,7 +92,10 @@ export const EthereumHooks = { */ createFleekERC721WriteContext: < TFunctionName extends keyof ArgumentsMaps.FleekERC721 & string, - TFunctionArguments extends ArgumentsMaps.FleekERC721[TFunctionName] + TFunctionArguments extends [ + ...ArgumentsMaps.FleekERC721[TFunctionName], + EthereumHooks.WriteContext.SettingsParam + ] >( functionName: TFunctionName ) => { @@ -115,7 +121,10 @@ export namespace EthereumHooks { TAbi extends Abi, TArgumentsMap extends ArgumentsMap, TFunctionName extends keyof TArgumentsMap & string, - TFunctionArguments extends TArgumentsMap[TFunctionName] + TFunctionArguments extends [ + ...TArgumentsMap[TFunctionName], + EthereumHooks.WriteContext.SettingsParam + ] > { functionName: TFunctionName; prepare: ReturnType< @@ -147,6 +156,8 @@ export namespace EthereumHooks { children?: React.ReactNode | React.ReactNode[]; config?: ProviderConfig; } + + export type SettingsParam = { value?: string }; } } diff --git a/ui/src/integrations/ethereum/lib/fleek-erc721.ts b/ui/src/integrations/ethereum/lib/fleek-erc721.ts index 905381e..c3a3baa 100644 --- a/ui/src/integrations/ethereum/lib/fleek-erc721.ts +++ b/ui/src/integrations/ethereum/lib/fleek-erc721.ts @@ -5,6 +5,11 @@ import { import { BytesLike } from 'ethers'; import { Ethereum } from '../ethereum'; +enum Billing { + Mint, + AddAccessPoint, +} + enum CollectionRoles { Owner, Verifier, @@ -17,6 +22,12 @@ enum TokenRoles { export const FleekERC721 = { contract: Ethereum.getContract('FleekERC721'), + Enums: { + Billing, + CollectionRoles, + TokenRoles, + }, + async mint( params: FleekERC721.MintParams, provider: Ethereum.Providers @@ -36,9 +47,7 @@ export const FleekERC721 = { }, async tokenMetadata(tokenId: number): Promise { - const contract = Ethereum.getContract('FleekERC721'); - - const response = await contract.tokenURI(Number(tokenId)); + const response = await this.contract.tokenURI(Number(tokenId)); const parsed = JSON.parse( Buffer.from(response.slice(29), 'base64') @@ -50,8 +59,15 @@ export const FleekERC721 = { }, async lastTokenId(): Promise { - // TODO: fetch last token id - return 7; + const contract = Ethereum.getContract('FleekERC721'); + + return contract.getLastTokenId(); + }, + + async getBilling(key: keyof typeof Billing): Promise { + const contract = Ethereum.getContract('FleekERC721'); + + return (await contract.getBilling(this.Enums.Billing[key])).toString(); }, parseError(error: BytesLike): FleekERC721.TransactionError { diff --git a/ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts b/ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts new file mode 100644 index 0000000..a362e6d --- /dev/null +++ b/ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts @@ -0,0 +1,25 @@ +import { FleekERC721 } from '@/integrations'; +import { FleekERC721State, fleekERC721Actions, RootState } from '@/store'; +import { createAsyncThunk } from '@reduxjs/toolkit'; + +type FetchBilling = FleekERC721State.BillingKeys; + +export const fetchBilling = createAsyncThunk( + 'fleekERC721/fetchBilling', + async (key, { dispatch, getState }) => { + const { billingState } = (getState() as RootState).fleekERC721; + + if (billingState[key] === 'loading') return; + + try { + dispatch(fleekERC721Actions.setBillingState({ key, value: 'loading' })); + + const value = await FleekERC721.getBilling(key); + + dispatch(fleekERC721Actions.setBilling({ key, value })); + } catch (error) { + console.log(error); + dispatch(fleekERC721Actions.setBillingState({ key, value: 'failed' })); + } + } +); diff --git a/ui/src/store/features/fleek-erc721/async-thunk/index.ts b/ui/src/store/features/fleek-erc721/async-thunk/index.ts new file mode 100644 index 0000000..8a4440b --- /dev/null +++ b/ui/src/store/features/fleek-erc721/async-thunk/index.ts @@ -0,0 +1 @@ +export * from './fetch-billing'; diff --git a/ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts b/ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts new file mode 100644 index 0000000..5add0aa --- /dev/null +++ b/ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts @@ -0,0 +1,68 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { RootState } from '@/store'; +import { useAppSelector } from '@/store/hooks'; +import * as asyncThunk from './async-thunk'; +import { FleekERC721 } from '@/integrations'; + +export namespace FleekERC721State { + export type QueryState = undefined | 'loading' | 'failed' | 'success'; + + export type BillingKeys = keyof typeof FleekERC721.Enums.Billing; + + export type Billing = { + [key in BillingKeys]?: string; + }; + + export type BillingState = { + [key in BillingKeys]?: QueryState; + }; +} + +export interface FleekERC721State { + billing: FleekERC721State.Billing; + billingState: FleekERC721State.BillingState; +} + +const initialState: FleekERC721State = { + billing: {}, + billingState: {}, +}; + +export const fleekERC721Slice = createSlice({ + name: 'fleekERC721', + initialState, + reducers: { + setBilling: ( + state, + action: PayloadAction<{ + key: FleekERC721State.BillingKeys; + value: string; + }> + ) => { + state.billing[action.payload.key] = action.payload.value; + state.billingState[action.payload.key] = 'success'; + }, + setBillingState: ( + state, + action: PayloadAction<{ + key: FleekERC721State.BillingKeys; + value: Exclude; + }> + ) => { + state.billingState[action.payload.key] = action.payload.value; + }, + }, +}); + +export const fleekERC721Actions = { + ...fleekERC721Slice.actions, + ...asyncThunk, +}; + +const selectFleekERC721State = (state: RootState): FleekERC721State => + state.fleekERC721; + +export const useFleekERC721Store = (): FleekERC721State => + useAppSelector(selectFleekERC721State); + +export default fleekERC721Slice.reducer; diff --git a/ui/src/store/features/fleek-erc721/hooks/index.ts b/ui/src/store/features/fleek-erc721/hooks/index.ts new file mode 100644 index 0000000..2e5e8c6 --- /dev/null +++ b/ui/src/store/features/fleek-erc721/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-fleek-erc721-billing'; diff --git a/ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts b/ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts new file mode 100644 index 0000000..9c0cb5f --- /dev/null +++ b/ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts @@ -0,0 +1,24 @@ +import { useAppDispatch } from '@/store/hooks'; +import { useEffect } from 'react'; +import { + fleekERC721Actions, + FleekERC721State, + useFleekERC721Store, +} from '../fleek-erc721-slice'; + +export const useFleekERC721Billing = (key: FleekERC721State.BillingKeys) => { + const { billing, billingState } = useFleekERC721Store(); + const dispatch = useAppDispatch(); + + const refresh = (): void => { + dispatch(fleekERC721Actions.fetchBilling(key)); + }; + + useEffect(() => { + if (typeof billingState[key] !== 'undefined') return; + + refresh(); + }, []); + + return [billing[key], billingState[key], refresh] as const; +}; diff --git a/ui/src/store/features/fleek-erc721/index.ts b/ui/src/store/features/fleek-erc721/index.ts new file mode 100644 index 0000000..e452949 --- /dev/null +++ b/ui/src/store/features/fleek-erc721/index.ts @@ -0,0 +1,2 @@ +export * from './fleek-erc721-slice'; +export * from './hooks'; diff --git a/ui/src/store/features/index.ts b/ui/src/store/features/index.ts index 22ab4b0..9cb174a 100644 --- a/ui/src/store/features/index.ts +++ b/ui/src/store/features/index.ts @@ -1,3 +1,4 @@ export * from './ens'; +export * from './fleek-erc721'; export * from './github'; export * from './toasts'; diff --git a/ui/src/store/store.ts b/ui/src/store/store.ts index db53f7b..a8b801c 100644 --- a/ui/src/store/store.ts +++ b/ui/src/store/store.ts @@ -2,10 +2,12 @@ import { configureStore } from '@reduxjs/toolkit'; import githubReducer from './features/github/github-slice'; import toastsReducer from './features/toasts/toasts-slice'; import ensReducer from './features/ens/ens-slice'; +import fleekERC721Reducer from './features/fleek-erc721/fleek-erc721-slice'; export const store = configureStore({ reducer: { ens: ensReducer, + fleekERC721: fleekERC721Reducer, github: githubReducer, toasts: toastsReducer, }, diff --git a/ui/src/views/mint/mint.context.tsx b/ui/src/views/mint/mint.context.tsx index 7cd4ff5..4670921 100644 --- a/ui/src/views/mint/mint.context.tsx +++ b/ui/src/views/mint/mint.context.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; import { ComboboxItem, DropdownItem } from '@/components'; -import { Ethereum, EthereumHooks } from '@/integrations'; -import { GithubState } from '@/store'; +import { EthereumHooks } from '@/integrations'; +import { GithubState, useFleekERC721Billing } from '@/store'; import { createContext } from '@/utils'; export type MintContext = { + billing: string | undefined; selectedUserOrg: ComboboxItem; repositoryName: GithubState.Repository; branchName: DropdownItem; //get value from DropdownItem to mint @@ -68,6 +69,7 @@ export abstract class Mint { const [ens, setEns] = useState({} as ComboboxItem); const [domain, setDomain] = useState(''); const [verifyNFA, setVerifyNFA] = useState(true); + const [billing] = useFleekERC721Billing('Mint'); //Field validations const [ensError, setEnsError] = useState(''); @@ -81,6 +83,7 @@ export abstract class Mint { return ( { const { address } = useAccount(); const { nextStep } = Stepper.useContext(); const { + billing, appName, appDescription, domain, @@ -43,6 +44,7 @@ export const MintFormStep = () => { appLogo, parseColorToNumber(logoColor), verifyNFA, + { value: billing }, ]); nextStep();