From a6123d4c22009747059ede33b2ab30dd87e89ed7 Mon Sep 17 00:00:00 2001 From: Shredder <110225819+EmperorOrokuSaki@users.noreply.github.com> Date: Tue, 28 Feb 2023 03:41:03 +0330 Subject: [PATCH] feat: access point integration with the subgraph (#141) * feat: define entities, add handlers for access points. * feat: change ChangeAccessPointAutoApproval event to metadataUpdate with boolean value (new event), and also add NewMint handler again. * test: rename ChangeAccessPointStatus to ChangeAccessPointCreationStatus in hardhat tests. * refactor: deploy the new version of the contract and update the proxy address and block number in the subgraph config file. * refactor: change name of status to creationStatus in schema. Co-authored-by: Janison Sivarajah * refactor: remove commented handlers for ACL. * feat: add the condition for deploying proxy again * refactor: remove newAccessPoint from subgraph.yaml --------- Co-authored-by: Janison Sivarajah --- contracts/.openzeppelin/polygon-mumbai.json | 429 +++++++++ contracts/contracts/FleekERC721.sol | 20 +- contracts/deployments/mumbai/FleekERC721.json | 892 ++++++++++-------- contracts/deployments/mumbai/FleekSVG.json | 12 +- contracts/deployments/mumbai/proxy.json | 4 + .../5446c77097c1eefd9b8fa506e19f10f6.json | 87 ++ .../access-points-autoapproval-on.t.ts | 2 +- subgraph/schema.graphql | 13 + subgraph/src/fleek-nfa.ts | 142 ++- subgraph/subgraph.yaml | 28 +- 10 files changed, 1211 insertions(+), 418 deletions(-) create mode 100644 contracts/deployments/mumbai/solcInputs/5446c77097c1eefd9b8fa506e19f10f6.json diff --git a/contracts/.openzeppelin/polygon-mumbai.json b/contracts/.openzeppelin/polygon-mumbai.json index c28d777..83aaf1c 100644 --- a/contracts/.openzeppelin/polygon-mumbai.json +++ b/contracts/.openzeppelin/polygon-mumbai.json @@ -29,6 +29,11 @@ "address": "0x11Cd77Eac1a0883DE9435B5586474903A2a084cD", "txHash": "0x5166318336c9e0bef146562d58e01ddbb937a61b721aca6b24d41b0a189fde39", "kind": "transparent" + }, + { + "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", + "txHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", + "kind": "transparent" } ], "impls": { @@ -6559,6 +6564,430 @@ } } } + }, + "185ebe4c7108bb878e61aa9ca7bf5e8738cb39efc72aa2191dafdd8a74421a34": { + "address": "0x9e4A318C788e0097A24146Fe7041a0CD93939D56", + "txHash": "0xa7c1909a3a0d5d46a1cdd9f75b16661d7278ee1b1a1734b5cb61a3be691f5788", + "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:58" + }, + { + "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:63" + }, + { + "label": "_tokenRolesVersion", + "offset": 0, + "slot": "153", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:70" + }, + { + "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:75" + }, + { + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:178" + }, + { + "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": "_appIds", + "offset": 0, + "slot": "254", + "type": "t_uint256", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:113" + }, + { + "label": "_apps", + "offset": 0, + "slot": "255", + "type": "t_mapping(t_uint256,t_struct(App)4408_storage)", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:114" + }, + { + "label": "_accessPoints", + "offset": 0, + "slot": "256", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:115" + } + ], + "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)4418": { + "label": "enum FleekERC721.AccessPointCreationStatus", + "members": [ + "DRAFT", + "APPROVED", + "REJECTED", + "REMOVED" + ], + "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(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)4432_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)4408_storage)": { + "label": "mapping(uint256 => struct FleekERC721.App)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Build)4413_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)4432_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)4418", + "offset": 22, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(App)4408_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)4413_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)4413_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/contracts/FleekERC721.sol b/contracts/contracts/FleekERC721.sol index f07367f..d5750fe 100644 --- a/contracts/contracts/FleekERC721.sol +++ b/contracts/contracts/FleekERC721.sol @@ -43,12 +43,12 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl event MetadataUpdate(uint256 indexed _tokenId, string key, string value, address indexed triggeredBy); event MetadataUpdate(uint256 indexed _tokenId, string key, uint24 value, address indexed triggeredBy); event MetadataUpdate(uint256 indexed _tokenId, string key, string[2] value, address indexed triggeredBy); + event MetadataUpdate(uint256 indexed _tokenId, string key, bool value, address indexed triggeredBy); + event NewAccessPoint(string apName, uint256 indexed tokenId, address indexed owner); event RemoveAccessPoint(string apName, uint256 indexed tokenId, address indexed owner); - event ChangeAccessPointAutoApproval(uint256 indexed token, bool indexed settings, address indexed triggeredBy); - event ChangeAccessPointScore(string apName, uint256 indexed tokenId, uint256 score, address indexed triggeredBy); event ChangeAccessPointNameVerify( @@ -63,7 +63,7 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl bool indexed verified, address indexed triggeredBy ); - event ChangeAccessPointStatus( + event ChangeAccessPointCreationStatus( string apName, uint256 tokenId, AccessPointCreationStatus status, @@ -291,7 +291,7 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl /** * @dev Updates the `accessPointAutoApproval` settings on minted `tokenId`. * - * May emit a {ChangeAccessPointAutoApproval} event. + * May emit a {MetadataUpdate} event. * * Requirements: * @@ -305,7 +305,7 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl ) public virtual requireTokenOwner(tokenId) { _requireMinted(tokenId); _apps[tokenId].accessPointAutoApproval = _apAutoApproval; - emit ChangeAccessPointAutoApproval(tokenId, _apAutoApproval, msg.sender); + emit MetadataUpdate(tokenId, 'accessPointAutoApproval', _apAutoApproval, msg.sender); } /** @@ -479,11 +479,11 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl AccessPointCreationStatus.APPROVED ); - emit ChangeAccessPointStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender); + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender); } else { // Auto Approval is off. Should wait for approval. _accessPoints[apName] = AccessPoint(tokenId, 0, false, false, msg.sender, AccessPointCreationStatus.DRAFT); - emit ChangeAccessPointStatus(apName, tokenId, AccessPointCreationStatus.DRAFT, msg.sender); + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.DRAFT, msg.sender); } } @@ -511,11 +511,11 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl if (approved) { // Approval accessPoint.status = AccessPointCreationStatus.APPROVED; - emit ChangeAccessPointStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender); + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender); } else { // Not Approved accessPoint.status = AccessPointCreationStatus.REJECTED; - emit ChangeAccessPointStatus(apName, tokenId, AccessPointCreationStatus.REJECTED, msg.sender); + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REJECTED, msg.sender); } } @@ -536,7 +536,7 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl if (msg.sender != _accessPoints[apName].owner) revert MustBeAccessPointOwner(); _accessPoints[apName].status = AccessPointCreationStatus.REMOVED; uint256 tokenId = _accessPoints[apName].tokenId; - emit ChangeAccessPointStatus(apName, tokenId, AccessPointCreationStatus.REMOVED, msg.sender); + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REMOVED, msg.sender); emit RemoveAccessPoint(apName, tokenId, msg.sender); } diff --git a/contracts/deployments/mumbai/FleekERC721.json b/contracts/deployments/mumbai/FleekERC721.json index 39e05b3..aac2266 100644 --- a/contracts/deployments/mumbai/FleekERC721.json +++ b/contracts/deployments/mumbai/FleekERC721.json @@ -1,9 +1,88 @@ { - "timestamp": "2/15/2023, 12:43:39 PM", - "address": "0x11Cd77Eac1a0883DE9435B5586474903A2a084cD", - "transactionHash": "0x5166318336c9e0bef146562d58e01ddbb937a61b721aca6b24d41b0a189fde39", - "gasPrice": 1500000021, + "timestamp": "2/24/2023, 5:28:44 PM", + "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", + "transactionHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", + "gasPrice": 2500000019, "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": [ @@ -54,31 +133,6 @@ "name": "ApprovalForAll", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "token", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bool", - "name": "settings", - "type": "bool" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "ChangeAccessPointAutoApprovalSettings", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -110,6 +164,37 @@ "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": [ @@ -176,47 +261,22 @@ "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "string", - "name": "apName", - "type": "string" + "indexed": true, + "internalType": "enum FleekAccessControl.CollectionRoles", + "name": "role", + "type": "uint8" + }, + { + "indexed": true, + "internalType": "address", + "name": "toAddress", + "type": "address" }, { "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", + "internalType": "bool", "name": "status", - "type": "string" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "ChangeAccessPointStatus", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "enum FleekAccessControl.Roles", - "name": "role", - "type": "uint8" - }, - { - "indexed": true, - "internalType": "address", - "name": "toAddress", - "type": "address" + "type": "bool" }, { "indexed": false, @@ -225,32 +285,7 @@ "type": "address" } ], - "name": "CollectionRoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "enum FleekAccessControl.Roles", - "name": "role", - "type": "uint8" - }, - { - "indexed": true, - "internalType": "address", - "name": "toAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "byAddress", - "type": "address" - } - ], - "name": "CollectionRoleRevoked", + "name": "CollectionRoleChanged", "type": "event" }, { @@ -266,6 +301,130 @@ "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": [ @@ -291,31 +450,6 @@ "name": "NewAccessPoint", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "commitHash", - "type": "string" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewBuild", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -376,7 +510,7 @@ { "indexed": false, "internalType": "bool", - "name": "accessPointAutoApprovalSettings", + "name": "accessPointAutoApproval", "type": "bool" }, { @@ -400,24 +534,18 @@ "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "internalType": "bool", + "name": "isPausable", + "type": "bool" }, { "indexed": false, - "internalType": "uint24", - "name": "color", - "type": "uint24" - }, - { - "indexed": true, "internalType": "address", - "name": "triggeredBy", + "name": "account", "type": "address" } ], - "name": "NewTokenColor", + "name": "PausableStatusChange", "type": "event" }, { @@ -425,124 +553,18 @@ "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "internalType": "bool", + "name": "isPaused", + "type": "bool" }, { "indexed": false, - "internalType": "string", - "name": "description", - "type": "string" - }, - { - "indexed": true, "internalType": "address", - "name": "triggeredBy", + "name": "account", "type": "address" } ], - "name": "NewTokenDescription", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "ENS", - "type": "string" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewTokenENS", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "externalURL", - "type": "string" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewTokenExternalURL", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "logo", - "type": "string" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewTokenLogo", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewTokenName", + "name": "PauseStatusChange", "type": "event" }, { @@ -581,7 +603,7 @@ }, { "indexed": true, - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.TokenRoles", "name": "role", "type": "uint8" }, @@ -591,6 +613,12 @@ "name": "toAddress", "type": "address" }, + { + "indexed": false, + "internalType": "bool", + "name": "status", + "type": "bool" + }, { "indexed": false, "internalType": "address", @@ -598,7 +626,7 @@ "type": "address" } ], - "name": "TokenRoleGranted", + "name": "TokenRoleChanged", "type": "event" }, { @@ -610,18 +638,6 @@ "name": "tokenId", "type": "uint256" }, - { - "indexed": true, - "internalType": "enum FleekAccessControl.Roles", - "name": "role", - "type": "uint8" - }, - { - "indexed": true, - "internalType": "address", - "name": "toAddress", - "type": "address" - }, { "indexed": false, "internalType": "address", @@ -629,7 +645,7 @@ "type": "address" } ], - "name": "TokenRoleRevoked", + "name": "TokenRolesCleared", "type": "event" }, { @@ -777,19 +793,13 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "enum FleekAccessControl.Roles", - "name": "role", - "type": "uint8" - } - ], - "name": "getCollectionRoleMembers", + "inputs": [], + "name": "getLastTokenId", "outputs": [ { - "internalType": "address[]", + "internalType": "uint256", "name": "", - "type": "address[]" + "type": "uint256" } ], "stateMutability": "view", @@ -801,19 +811,44 @@ "internalType": "uint256", "name": "tokenId", "type": "uint256" - }, - { - "internalType": "enum FleekAccessControl.Roles", - "name": "role", - "type": "uint8" } ], - "name": "getTokenRoleMembers", + "name": "getToken", "outputs": [ { - "internalType": "address[]", + "internalType": "string", "name": "", - "type": "address[]" + "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", @@ -822,7 +857,7 @@ { "inputs": [ { - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.CollectionRoles", "name": "role", "type": "uint8" }, @@ -845,7 +880,7 @@ "type": "uint256" }, { - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.TokenRoles", "name": "role", "type": "uint8" }, @@ -863,7 +898,7 @@ { "inputs": [ { - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.CollectionRoles", "name": "role", "type": "uint8" }, @@ -892,7 +927,7 @@ "type": "uint256" }, { - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.TokenRoles", "name": "role", "type": "uint8" }, @@ -987,6 +1022,32 @@ "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": [ { @@ -1036,7 +1097,7 @@ }, { "internalType": "bool", - "name": "accessPointAutoApprovalSettings", + "name": "accessPointAutoApproval", "type": "bool" } ], @@ -1083,6 +1144,13 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1099,7 +1167,7 @@ { "inputs": [ { - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.CollectionRoles", "name": "role", "type": "uint8" }, @@ -1122,7 +1190,7 @@ "type": "uint256" }, { - "internalType": "enum FleekAccessControl.Roles", + "internalType": "enum FleekAccessControl.TokenRoles", "name": "role", "type": "uint8" }, @@ -1197,11 +1265,11 @@ }, { "internalType": "bool", - "name": "_settings", + "name": "_apAutoApproval", "type": "bool" } ], - "name": "setAccessPointAutoApprovalSettings", + "name": "setAccessPointAutoApproval", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1283,6 +1351,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bool", + "name": "pausable", + "type": "bool" + } + ], + "name": "setPausable", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1510,10 +1591,17 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x6080806040523461001657614fb9908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb146106e557806301ffc9a7146106c957806306fdde03146106ad578063081812fc14610691578063095ea7b31461067957806323b872dd14610661578063246a908b1461064957806327dc5cec1461062d5780632d957aad146106155780632f1e8f0a146105b1578063353b07a41461058a5780633806f1521461057257806342842e0e1461055a57806342966c681461054357806342e44bbf1461052b5780634cd88b76146105135780635aa6ab3b146104fb5780636352211e146104c657806370a08231146104aa5780637469a03b1461049357806378278cca1461047b5780638a2e25be146104635780638b9ec977146104305780638c3c0a441461041857806394ec65c51461040157806395d89b41146103e5578063a22cb465146103cd578063a27d0b27146103b5578063a38617721461039d578063a397c83014610386578063b20b94f11461036e578063b30437a01461035b578063b42dbe381461033e578063b88d4fde14610323578063b948a3c51461030b578063c87b56dd146102e4578063cdb0e89e146102cc578063d7a75be1146102b0578063e944725014610293578063e985e9c514610226578063eb5fd26b1461020e5763f9315177146101f0575061000f565b3461020a576102076102013661098b565b90613204565b51f35b5080fd5b503461020a5761020761022036610e2c565b906138fd565b503461020a5761028f915061027e61027761026061024336610df9565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b503461020a5761028f915061027e6102aa366109e4565b90611cc1565b503461020a5761028f915061027e6102c7366109ba565b614302565b503461020a576102076102de3661098b565b906134d3565b503461020a5761028f91506103006102fb36610807565b612c27565b9051918291826107f6565b503461020a5761020761031d3661098b565b90613798565b503461020a5761020761033536610d89565b9291909161146c565b503461020a5761028f915061027e6103553661071b565b91611d5d565b506102076103683661098b565b90613cc9565b503461020a5761020761038036610ae9565b90614471565b503461020a57610207610398366109ba565b6143d2565b503461020a576102076103af36610d69565b9061315b565b503461020a576102076103c73661071b565b91611a86565b503461020a576102076103df36610d38565b906112b8565b503461020a5761028f91506103f93661078e565b6103006110bb565b503461020a57610207610413366109ba565b61432f565b503461020a5761020761042a366109e4565b90611b41565b5061028f915061045461044236610c21565b989790979691969592959493946127e2565b90519081529081906020820190565b503461020a5761020761047536610be1565b91613e21565b503461020a5761020761048d3661098b565b9061336e565b503461020a576102076104a5366109ba565b61400d565b503461020a5761028f91506104546104c136610bbe565b610e4f565b503461020a5761028f91506104e26104dd36610807565b610f15565b90516001600160a01b0390911681529081906020820190565b503461020a5761020761050d36610b7b565b916139a4565b503461020a5761020761052536610b24565b906121c5565b503461020a5761020761053d36610ae9565b9061451e565b503461020a5761020761055536610807565b614689565b503461020a5761020761056c36610840565b91611432565b503461020a5761020761058436610a92565b91614595565b503461020a5761028f91506105a66105a136610a77565b611de7565b905191829182610a33565b503461020a5761028f91506105a6600161060f61060a6105d036610a14565b91906105fb6105e9826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611c75565b01611d8f565b503461020a57610207610627366109e4565b9061197d565b503461020a5761028f9150610300610644366109ba565b61416c565b503461020a5761020761065b3661098b565b90613635565b503461020a5761020761067336610840565b916113e4565b503461020a5761020761068b36610819565b90611154565b503461020a5761028f91506104e26106a836610807565b61127a565b503461020a5761028f91506106c13661078e565b610300611004565b503461020a5761028f915061027e6106e036610773565b61309c565b503461020a576102076106f73661071b565b91611bd3565b600435906001600160a01b03821682141561071457565b5050600080fd5b606090600319011261000f5760043590602435600281101561075857906044356001600160a01b03811681141561074f5790565b50505050600080fd5b505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f5760043561078b81610760565b90565b600090600319011261000f57565b918091926000905b8282106107bc5750116107b5575050565b6000910152565b915080602091830151818601520182916107a4565b906020916107ea8151809281855285808601910161079c565b601f01601f1916010190565b90602061078b9281815201906107d1565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610714579060243590565b606090600319011261000f576001600160a01b03906004358281168114156107585791602435908116811415610758579060443590565b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176108a957604052565b6108b1610877565b604052565b90601f801991011681019081106001600160401b038211176108a957604052565b604051906108e48261088e565b565b6040519060c082018281106001600160401b038211176108a957604052565b6020906001600160401b038111610922575b601f01601f19160190565b61092a610877565b610917565b92919261093b82610905565b9161094960405193846108b6565b829481845281830111610966578281602093846000960137010152565b5050505050600080fd5b9080601f830112156107585781602061078b9335910161092f565b9060406003198301126107145760043591602435906001600160401b03821161074f5761078b91600401610970565b602060031982011261071457600435906001600160401b0382116107585761078b91600401610970565b604090600319011261000f57600435600281101561071457906024356001600160a01b0381168114156107585790565b604090600319011261000f576004359060243560028110156107585790565b6020908160408183019282815285518094520193019160005b828110610a5a575050505090565b83516001600160a01b031685529381019392810192600101610a4c565b602090600319011261000f5760043560028110156107145790565b606060031982011261071457600435916001600160401b036024358181116109665783610ac191600401610970565b926044359182116109665761078b91600401610970565b610124359081151582141561071457565b604060031982011261071457600435906001600160401b03821161075857610b1391600401610970565b906024358015158114156107585790565b906040600319830112610714576001600160401b0360043581811161074f5783610b5091600401610970565b9260243591821161074f5761078b91600401610970565b610104359062ffffff821682141561071457565b9060606003198301126107145760043591602435906001600160401b03821161074f57610baa91600401610970565b9060443562ffffff811681141561074f5790565b602090600319011261000f576004356001600160a01b0381168114156107145790565b9060606003198301126107145760043591602435906001600160401b03821161074f57610c1091600401610970565b9060443580151581141561074f5790565b61014060031982011261071457610c366106fd565b916001600160401b039060243582811161096657610c58846004928301610970565b93604435848111610d2c5781610c6f918401610970565b93606435818111610d1f5782610c86918501610970565b93608435828111610d115783610c9d918601610970565b9360a435838111610d025784610cb4918301610970565b9360c435848111610cf25781610ccb918401610970565b9360e435908111610cf257610ce09201610970565b90610ce9610b67565b9061078b610ad8565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b03811681141561071457906024358015158114156107585790565b604090600319011261000f57600435906024358015158114156107585790565b906080600319830112610714576001600160a01b039160043583811681141561074f579260243590811681141561074f579160443591606435906001600160401b038211610dee5780602383011215610dee5781602461078b9360040135910161092f565b505050505050600080fd5b604090600319011261000f576001600160a01b039060043582811681141561075857916024359081168114156107585790565b604090600319011261000f576004359060243562ffffff81168114156107585790565b6001600160a01b03168015610e6f57600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b15610ecf57565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b031661078b811515610ec8565b90600182811c92168015610f6a575b6020831014610f5257565b5050634e487b7160e01b600052602260045260246000fd5b91607f1691610f47565b9060009291805491610f8583610f38565b918282526001938481169081600014610fe75750600114610fa7575b50505050565b90919394506000526020928360002092846000945b838610610fd3575050505001019038808080610fa1565b805485870183015294019385908201610fbc565b60ff19166020840152505060400193503891508190508080610fa1565b604051906000826065549161101883610f38565b8083529260019081811690811561109e575060011461103f575b506108e4925003836108b6565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b84831061108357506108e4935050810160200138611032565b81935090816020925483858a0101520191019091859261106a565b94505050505060ff191660208301526108e4826040810138611032565b60405190600082606654916110cf83610f38565b8083529260019081811690811561109e57506001146110f557506108e4925003836108b6565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b84831061113957506108e4935050810160200138611032565b81935090816020925483858a01015201910190918592611120565b9061115e81610f15565b6001600160a01b0381811690841681146112275733149081156111f9575b501561118b576108e491611756565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff915061121f903390610260565b54163861117c565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b60008181526067602052604090205461129d906001600160a01b03161515610ec8565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b038116919033831461133957816112f86113099233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b1561138857565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b906108e492916113fc6113f78433611508565b611381565b6115db565b60405190602082018281106001600160401b03821117611425575b60405260008252565b61142d610877565b61141c565b90916108e49260405192602084018481106001600160401b0382111761145f575b6040526000845261146c565b611467610877565b611453565b906114909392916114806113f78433611508565b61148b8383836115db565b611862565b1561149757565b5060405162461bcd60e51b8152806114b1600482016114b5565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b038061151a84610f15565b169281831692848414948515611550575b5050831561153a575b50505090565b6115469192935061127a565b1614388080611534565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff169350388061152b565b1561158757565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b6115ff906115e884610f15565b6001600160a01b0382811693909182168414611580565b83169283156117005761167d8261161a87846116d7966130e0565b61163c8561163661162a8a610f15565b6001600160a01b031690565b14611580565b611663611653886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b0381166000908152606860205260409020600181540190556116b8856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b038061178f84610f15565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b6000908152606760205260409020546108e4906001600160a01b03161515610ec8565b90816020910312610714575161078b81610760565b6001600160a01b03918216815291166020820152604081019190915260806060820181905261078b929101906107d1565b506040513d6000823e3d90fd5b3d1561185d573d9061184382610905565b9161185160405193846108b6565b82523d6000602084013e565b606090565b92909190823b1561191157611895926020926000604051809681958294630a85bd0160e11b9a8b855233600486016117f4565b03926001600160a01b03165af1600091816118f1575b506118e3575050506118bb611832565b805190816118de57505060405162461bcd60e51b8152806114b1600482016114b5565b602001fd5b6001600160e01b0319161490565b61190a9192506119013d826108b6565b3d8101906117df565b90386118ab565b50505050600190565b1561192157565b5060405162461bcd60e51b815260206004820152602d60248201527f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60448201526c6c6c656374696f6e20726f6c6560981b6064820152608490fd5b61198633611c8d565b8015611a14575b6119969061191a565b60975460005260986020526119b8826119b3836040600020611c75565b611fbe565b60028110156119fb576040513381526001600160a01b03909216917fcf081ed2b728e3115904be00eb8927b2375ff3401839b37f7accfa1bb2bee15c90602090a3565b505050634e487b7160e01b600052602160045260246000fd5b50611996611a2133611c8d565b905061198d565b15611a2f57565b5060405162461bcd60e51b815260206004820152602860248201527f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f6044820152676b656e20726f6c6560c01b6064820152608490fd5b611a903382611cde565b8015611b2c575b611aa090611a28565b600081815260996020526040812054609a60205260408220908252602052611acf846119b38560408520611c75565b6002831015611b1357506040513381526001600160a01b03909316927f0bf5a13b362503fcc74b8b9b1598aba2f3a9af85d05ba7978f7e9f447f22c23990602090a4565b634e487b7160e01b815260216004526024945092505050fd5b50611aa0611b3a3383611cde565b9050611a97565b611b4a33611c8d565b8015611bbf575b611b5a9061191a565b6097546000526098602052611b7c82611b77836040600020611c75565b61208d565b60028110156119fb576040513381526001600160a01b03909216917faeff57f0f5e4d3d10a37d4a70fde8ed67a95e67b251d5c512c0ea98c380d2f9590602090a3565b50611b5a611bcc33611c8d565b9050611b51565b611bdd3382611cde565b8015611c60575b611bed90611a28565b600081815260996020526040812054609a60205260408220908252602052611c1c84611b778560408520611c75565b6002831015611b1357506040513381526001600160a01b03909316927fe52d746e4c78c98c6bfa291b273406905c3e8550b7d911a6bea686368c2dc79d90602090a4565b50611bed611c6e3383611cde565b9050611be4565b9060028110156119fb57600052602052604060002090565b609754600090815260986020908152604080832083805282528083206001600160a01b039094168352929052205b54151590565b90610260611cbb9260975460005260986020526040600020611c75565b600090815260996020908152604080832054609a8352818420908452825280832083805282528083206001600160a01b03909416835292905220611cbb565b600090815260996020908152604080832054609a835281842090845282528083206001845282528083206001600160a01b03909416835292905220611cbb565b611cbb9291610260916000526099602052604060002054609a6020526040600020906000526020526040600020611c75565b9060405191828154918282526020928383019160005283600020936000905b828210611dc4575050506108e4925003836108b6565b85546001600160a01b031684526001958601958895509381019390910190611dae565b611e07906097546000526020906098825260019283916040600020611c75565b01604051918293849382845491828152019360005282600020926000905b828210611e3d5750505050509061078b9103826108b6565b84546001600160a01b03168652879650948501949383019390830190611e25565b600081819282527f0bf5a13b362503fcc74b8b9b1598aba2f3a9af85d05ba7978f7e9f447f22c239602060998152604080852054609a8352818620908652825280852085805282528085208083528186205415611ebe575b5051338152a4565b60018101611ee08154600160401b811015611f04575b60018101835582611f98565b81549060018060a01b039060031b1b19169055549086805283528186205538611eb6565b611f0c610877565b611ed4565b60009080825260996020526040822054609a6020526040832090835260205260408220828052602052611f478360408420611fbe565b6040513381526001600160a01b03909316927f0bf5a13b362503fcc74b8b9b1598aba2f3a9af85d05ba7978f7e9f447f22c23990602090a4565b50634e487b7160e01b600052603260045260246000fd5b8054821015611fb1575b60005260206000200190600090565b611fb9611f81565b611fa2565b6001600160a01b03821660009081526020829052604090209091905415611fe3575050565b61204a90600183016120318261200d8354600160401b81101561204d575b60018101855584611f98565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b54929060018060a01b0316600052602052604060002090565b55565b612055610877565b612001565b50634e487b7160e01b600052601160045260246000fd5b6002906002198111612081570190565b61208961205a565b0190565b6001600160a01b0382166000908152602082905260409020909190546120b1575050565b6001600160a01b03811660009081526020839052604090205490600182106121b8575b60001992838301600182019361213f6120f9878754600181106121ab575b0187611f98565b90546001600160a01b039460039290921b1c84169061211c8261200d838b611f98565b6001191061219e575b6001600160a01b0316600090815260208590526040902090565b5583549384156121815760009561204a95019161215c8383611f98565b909182549160031b1b19169055559060018060a01b0316600052602052604060002090565b50505050505050634e487b7160e01b600052603160045260246000fd5b6121a661205a565b612125565b6121b361205a565b6120f2565b6121c061205a565b6120d4565b6000549160ff8360081c1615809381946122e4575b81156122c4575b50156122655761220791836121fe600160ff196000541617600055565b61224c576122f2565b61220d57565b61221d61ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b61226061010061ff00196000541617600055565b6122f2565b50505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b159150816122d6575b50386121e1565b6001915060ff1614386122cf565b600160ff82161091506121da565b9061230d60ff60005460081c166123088161241c565b61241c565b81516001600160401b03811161240f575b6123328161232d606554610f38565b612494565b602080601f831160011461237c5750819061236994600092612371575b50508160011b916000199060031b1c1916176065556125ad565b6108e4612780565b01519050388061234f565b919293601f1984166123b060656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b936000905b8282106123f7575050916001939185612369979694106123de575b505050811b016065556125ad565b015160001960f88460031b161c191690553880806123d0565b806001869782949787015181550196019401906123b5565b612417610877565b61231e565b1561242357565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110612488575050565b6000815560010161247d565b90601f82116124a1575050565b6108e49160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c830193106124eb575b601f0160051c019061247d565b90915081906124de565b90601f8111612502575050565b6108e491600052601f6020600020910160051c81019061247d565b90601f821161252a575050565b6108e49160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c830193106124eb57601f0160051c019061247d565b9190601f811161258257505050565b6108e4926000526020600020906020601f840160051c830193106124eb57601f0160051c019061247d565b9081516001600160401b038111612697575b6125d3816125ce606654610f38565b61251d565b602080601f831160011461260f5750819293600092612604575b50508160011b916000199060031b1c191617606655565b0151905038806125ed565b90601f1983169461264260666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b87821061267f575050836001959610612666575b505050811b01606655565b015160001960f88460031b161c1916905538808061265b565b80600185968294968601518155019501930190612647565b61269f610877565b6125bf565b91909182516001600160401b038111612773575b6126cc816126c68454610f38565b84612573565b602080601f83116001146127085750819293946000926126fd575b50508160011b916000199060031b1c1916179055565b0151905038806126e7565b90601f1983169561271e85600052602060002090565b926000905b88821061275b57505083600195969710612742575b505050811b019055565b015160001960f88460031b161c19169055388080612738565b80600185968294968601518155019501930190612723565b61277b610877565b6126b8565b600061279260ff825460081c1661241c565b60975481526098602052604081208180526020526127b33360408320611fbe565b604051903382527fcf081ed2b728e3115904be00eb8927b2375ff3401839b37f7accfa1bb2bee15c60203393a3565b939495989196979092976127f533611c8d565b8015612917575b6128059061191a565b609b54998a976128158988612b07565b6128236001609b5401609b55565b61283789600052609c602052604060002090565b61284187826126a4565b61284e8b600183016126a4565b61285b8c600283016126a4565b61286889600383016126a4565b61287584600683016126a4565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff881617179055600060048201556128a96108d7565b908282528360208301526005016128c99060008052602052604060002090565b906128d39161292b565b604051978897600160a01b60019003169b339b6128f0988a612a22565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b5061280561292433611c8d565b90506127fc565b9080519081516001600160401b038111612a15575b6129548161294e8654610f38565b86612573565b6020928390601f83116001146129a0579180600194926108e4979694600092612995575b5050600019600383901b1c191690841b1784555b015191016126a4565b015190503880612978565b90601f198316916129b687600052602060002090565b9260005b8181106129fe575092600195939285926108e49998968895106129e5575b505050811b01845561298c565b015160001960f88460031b161c191690553880806129d8565b9293876001819287860151815501950193016129ba565b612a1d610877565b612940565b979998959062ffffff95612a82612aac96612a748c6101009c98612a66612a9e99612a58612a90996101208087528601906107d1565b9084820360208601526107d1565b9160408184039101526107d1565b8c810360608e0152906107d1565b908a820360808c01526107d1565b9088820360a08a01526107d1565b9086820360c08801526107d1565b951660e08401521515910152565b15612ac157565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b038116908115612bcc57600083815260676020526040902054612ba29190612b42906001600160a01b031615155b15612aba565b612b4c8185611f11565b600084815260676020526040902054612b6f906001600160a01b03161515612b3c565b6001600160a01b0381166000908152606860205260409020600181540190556116b8846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b906120896020928281519485920161079c565b600081815260676020526040902054612c4a906001600160a01b03161515610ec8565b612c5381610f15565b90600052609c6020526040600020612ca960405192612c718461088e565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b0316614d74565b612ceb60038301600784016000612ccb612cc6835462ffffff1690565b614e6f565b6040518095819263891c235f60e01b835260068a01878b60048601614ac1565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af492831561308f575b60009361306c575b5054908160181c60ff16612d2790614e29565b90600586019060048701549282612d4985809590600052602052604060002090565b93612d5d9190600052602052604060002090565b60010193612d6a90614b85565b9462ffffff16612d7990614e6f565b604051607b60f81b602082015267113730b6b2911d1160c11b6021820152988998919791612daa60298b0183614b09565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f01612dda9060018401614b09565b61088b60f21b8152600201681137bbb732b9111d1160b91b8152600901612e0091612c14565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b8152601001612e3091600201614b09565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b8152600901612e5691612c14565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d01612e9091612c14565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f01612ee191614b09565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b6020820152602701612f2c91614b09565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b6020820152602601612f7691614b09565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b6020820152602301612fbd91612c14565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b602082015260210161300291612c14565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f1991828101825261303690826108b6565b61303f90614988565b916040519283916020830161305391612c14565b61305c91612c14565b03908101825261078b90826108b6565b61308891933d90823e61307f3d826108b6565b3d810190614a63565b9138612d14565b613097611825565b612d0c565b63ffffffff60e01b166380ac58cd60e01b81149081156130cf575b81156130c1575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b811491506130b7565b6001600160a01b0390811615801580613150575b1561311e575050816131196108e4936000526099602052604060002060018154019055565b611f11565b1561312d57506108e491611f11565b16156131365750565b6108e4906000526099602052604060002060018154019055565b5081831615156130f4565b6131653382611d1d565b80156131ef575b61317590611a28565b600081815260676020526040902054613198906001600160a01b03161515610ec8565b6000818152609c60205260409020600701805463ff000000191683151560181b63ff0000001617905533911515907f55ecfbffc0e6fc0f81cff36a4ef89474616268981d3eb1090648c699cf0e5f8b6000604051a4565b506131756131fd3383611cde565b905061316c565b61320e3382611d1d565b8015613359575b61321e90611a28565b600081815260676020526040902054613241906001600160a01b03161515610ec8565b806000526020609c8152600260406000200190835180916001600160401b03821161334c575b6132758261294e8654610f38565b80601f83116001146132de57506000916132d3575b508160011b916000199060031b1c19161790555b7fedbf1209b3baa7c1b5c43052ce5c511e243b3241d9f67733141d14f1da88cba1604051806132ce3395826107f6565b0390a3565b90508401513861328a565b9150601f1983166132f485600052602060002090565b926000905b828210613334575050908360019493921061331b575b5050811b01905561329e565b86015160001960f88460031b161c19169055388061330f565b80600185968294968c015181550195019301906132f9565b613354610877565b613267565b5061321e6133673383611cde565b9050613215565b6133783382611d1d565b80156134be575b61338890611a28565b6000818152606760205260409020546133ab906001600160a01b03161515610ec8565b806000526020609c8152600360406000200190835180916001600160401b0382116134b1575b6133df8261294e8654610f38565b80601f83116001146134435750600091613438575b508160011b916000199060031b1c19161790555b7f91ce7fcd4462481791c3fe849f7049373c5b43ef44aed48e7f1ecce781586e15604051806132ce3395826107f6565b9050840151386133f4565b9150601f19831661345985600052602060002090565b926000905b8282106134995750509083600194939210613480575b5050811b019055613408565b86015160001960f88460031b161c191690553880613474565b80600185968294968c0151815501950193019061345e565b6134b9610877565b6133d1565b506133886134cc3383611cde565b905061337f565b6134dd3382611d1d565b8015613620575b6134ed90611a28565b600081815260676020526040902054613510906001600160a01b03161515610ec8565b806000526020609c8152604060002090835180916001600160401b038211613613575b6135418261294e8654610f38565b80601f83116001146135a5575060009161359a575b508160011b916000199060031b1c19161790555b7ffbbfca16a2770c7ca6e7063ab1a7eea5fe441ffef818325db51752066a6b128a604051806132ce3395826107f6565b905084015138613556565b9150601f1983166135bb85600052602060002090565b926000905b8282106135fb57505090836001949392106135e2575b5050811b01905561356a565b86015160001960f88460031b161c1916905538806135d6565b80600185968294968c015181550195019301906135c0565b61361b610877565b613533565b506134ed61362e3383611cde565b90506134e4565b61363f3382611d1d565b8015613783575b61364f90611a28565b600081815260676020526040902054613672906001600160a01b03161515610ec8565b806000526020609c8152600180604060002001918451906001600160401b038211613776575b6136a68261294e8654610f38565b80601f831160011461370b575081928291600093613700575b501b916000199060031b1c19161790555b7fd771eaa1c1382b0a9867125fcd921fdeddd211538b5381353a877abfbe3b50a4604051806132ce3395826107f6565b8701519250386136bf565b9082601f19811661372187600052602060002090565b936000905b8783831061375c5750505010613743575b5050811b0190556136d0565b86015160001960f88460031b161c191690553880613737565b8b8601518755909501949384019386935090810190613726565b61377e610877565b613698565b5061364f6137913383611cde565b9050613646565b6137a23382611d1d565b80156138e8575b6137b290611a28565b6000818152606760205260409020546137d5906001600160a01b03161515610ec8565b806000526020609c8152600660406000200190835180916001600160401b0382116138db575b6138098261294e8654610f38565b80601f831160011461386d5750600091613862575b508160011b916000199060031b1c19161790555b7fa3689e8cd9598b691876d4d1cd9d1f7b205523ec135b471359286d52229c5959604051806132ce3395826107f6565b90508401513861381e565b9150601f19831661388385600052602060002090565b926000905b8282106138c357505090836001949392106138aa575b5050811b019055613832565b86015160001960f88460031b161c19169055388061389e565b80600185968294968c01518155019501930190613888565b6138e3610877565b6137fb565b506137b26138f63383611cde565b90506137a9565b6139073382611d1d565b801561398f575b61391790611a28565b60008181526067602052604090205461393a906001600160a01b03161515610ec8565b6000818152609c60205260409020600701805462ffffff191662ffffff841617905562ffffff604051921682527f16815ee192fd8126dc2646e6bf09005f1556fe92c60700fe8d7a98ce4e09db3e60203393a3565b5061391761399d3383611cde565b905061390e565b929190926139b23382611d1d565b8015613b0a575b6139c290611a28565b6000818152606760205260409020546139e5906001600160a01b03161515610ec8565b80600052602093609c855260066040600020018151956001600160401b038711613afd575b613a18876126c68454610f38565b80601f8811600114613a8c575095806108e49697600091613a81575b508160011b916000199060031b1c19161790555b817fa3689e8cd9598b691876d4d1cd9d1f7b205523ec135b471359286d52229c595960405180613a793395826107f6565b0390a36138fd565b905083015138613a34565b90601f198816613aa184600052602060002090565b926000905b828210613ae55750509188916108e4989960019410613acc575b5050811b019055613a48565b85015160001960f88460031b161c191690553880613ac0565b80600185968294968a01518155019501930190613aa6565b613b05610877565b613a0a565b506139c2613b183383611cde565b90506139b9565b6020613b3891816040519382858094519384920161079c565b8101609d81520301902090565b15613b4c57565b5060405162461bcd60e51b815260206004820152601e60248201527f466c65656b4552433732313a20415020616c72656164792065786973747300006044820152606490fd5b60405190613b9f8261088e565b6005825264111490519560da1b6020830152565b600360a06108e493805184556020810151600185015560028401613be960408301511515829060ff801983541691151516179055565b6060820151815461ff00191690151560081b61ff00161781556080820151815462010000600160b01b03191660109190911b62010000600160b01b0316179055015191016126a4565b613c47604093926060835260608301906107d1565b916020820152828183039101526005815264111490519560da1b60208201520190565b60405190613c778261088e565b60088252671054141493d5915160c21b6020830152565b613ca3604093926060835260608301906107d1565b9160208201528281830391015260088152671054141493d5915160c21b60208201520190565b7fb5bf66f8f55e6a727267b4b02228bad57915ac165c182574d8d3df80f52b7ebe90613cf4816117bc565b613d256001600160a01b03613d1e6002613d0d87613b1f565b015460101c6001600160a01b031690565b1615613b45565b604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca2339280613d5788826107f6565b0390a3613d7e6007613d7383600052609c602052604060002090565b015460181c60ff1690565b15613dde57613dd990613dcb613d926108e6565b828152600060208201819052604082018190526060820152336080820152613db8613c6a565b60a0820152613dc686613b1f565b613bb3565b604051918291339583613c8e565b0390a2565b613dd990613e13613ded6108e6565b828152600060208201819052604082018190526060820152336080820152613db8613b92565b604051918291339583613c32565b919091613e2e3382611d1d565b8015613f2a575b613e3e90611a28565b613e4783613b1f565b908082541415613ea4577fb5bf66f8f55e6a727267b4b02228bad57915ac165c182574d8d3df80f52b7ebe9215613e8757613dcb6003613dd99301613fa0565b613e966003613dd99301613f3f565b604051918291339583613f65565b505050505060a460405162461bcd60e51b815260206004820152604e60248201527f466c65656b4552433732313a207468652070617373656420746f6b656e49642060448201527f6973206e6f74207468652073616d65206173207468652061636365737320706f60648201526d34b73a13b9903a37b5b2b724b21760911b6084820152fd5b50613e3e613f383383611cde565b9050613e35565b613f52613f4c8254610f38565b826124f5565b6010671491529150d5115160c21b019055565b613f7a604093926060835260608301906107d1565b9160208201528281830391015260088152671491529150d5115160c21b60208201520190565b613fad613f4c8254610f38565b6010671054141493d5915160c21b019055565b15613fc757565b5060405162461bcd60e51b815260206004820152601760248201527f466c65656b4552433732313a20696e76616c69642041500000000000000000006044820152606490fd5b6001600160a01b0361403181600261402485613b1f565b015460101c161515613fc0565b600261403c83613b1f565b015460101c163314156140cc5761405d600361405783613b1f565b01614113565b61406681613b1f565b546040517fb5bf66f8f55e6a727267b4b02228bad57915ac165c182574d8d3df80f52b7ebe339180614099858783614132565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db0604051806132ce3395826107f6565b505060405162461bcd60e51b815260206004820152601d60248201527f466c65656b4552433732313a206d757374206265204150206f776e65720000006044820152606490fd5b614120613f4c8254610f38565b600e6614915353d5915160ca1b019055565b614147604093926060835260608301906107d1565b91602082015282818303910152600781526614915353d5915160ca1b60208201520190565b6001600160a01b03908161417f82613b1f565b6002015460101c16151561419290613fc0565b61419b90613b1f565b80546141a690614b85565b9060018101546141b590614b85565b9260028201548060081c60ff166141cb90614e29565b916141d860ff8316614e29565b9160101c166141e690614d74565b604051607b60f81b60208201529586959193916021870169113a37b5b2b724b2111d60b11b8152600a0161421991612c14565b600b60fa1b8152600101671139b1b7b932911d60c11b815260080161423d91612c14565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f0161426891612c14565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b815260120161429691612c14565b600b60fa1b8152600101681137bbb732b9111d1160b91b81526009016142bb91612c14565b61088b60f21b8152600201691139ba30ba3ab9911d1160b11b8152600a016142e591600301614b09565b61227d60f01b815260020103601f198101825261078b90826108b6565b60ff90600290614326906143216001600160a01b038461402484613b1f565b613b1f565b015460081c1690565b6143456001600160a01b03600261402484613b1f565b600161435082613b1f565b0161435b81546143a6565b905561436681613b1f565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee436132ce600161439685613b1f565b01546040519182913396836143b6565b6001906000198114612081570190565b9291906143cd6020916040865260408601906107d1565b930152565b6143e86001600160a01b03600261402484613b1f565b60016143f382613b1f565b01541561441057600161440582613b1f565b0161435b8154614456565b5050606460405162461bcd60e51b815260206004820152602060248201527f466c65656b4552433732313a2073636f72652063616e74206265206c6f7765726044820152fd5b8015614464575b6000190190565b61446c61205a565b61445d565b6144876001600160a01b03600261402484613b1f565b6144ac61449382613b1f565b5461449e3382611d1d565b90811561450c575b50611a28565b6144cd8260026144bb84613b1f565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff6132ce6144fa83613b1f565b546040519182913396151595836143b6565b61451891503390611cde565b386144a6565b6145346001600160a01b03600261402484613b1f565b61454061449382613b1f565b61456882600261454f84613b1f565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c6132ce6144fa83613b1f565b90917f73b929bf4db6be678cdbc6d41a5fe0a2cbb84ca95572062c4a978d8bd80a41b1906145c33384611d1d565b8015614674575b6145d390611a28565b6000838152606760205260409020546145f6906001600160a01b03161515610ec8565b6146526040918251908382018281106001600160401b03821117614667575b8452868252602082015284600052609c602052600583600020016004846000200161464081546143a6565b8091556000526020528260002061292b565b5160208152806132ce339560208301906107d1565b61466f610877565b614615565b506145d36146823385611cde565b90506145ca565b6146933382611cde565b80156147e7575b6146a390611a28565b806001600160a01b03806146b683610f15565b16158015806147df575b156147b257506146e0826000526099602052604060002060018154019055565b6146e982611e5e565b6146f282610f15565b600083815260696020526040812080546001600160a01b031916905591168082526068602052604082206000198154019055828252606760205261474a604083206bffffffffffffffffffffffff60a01b8154169055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a461478f600261478983600052609c602052604060002090565b016147fc565b6147965750565b6147ad6108e491600052609c602052604060002090565b614877565b156147c5576147c082611e5e565b6146e9565b6147c0826000526099602052604060002060018154019055565b5060006146c0565b506146a36147f53383611cde565b905061469a565b61078b9054610f38565b6001600160fe1b03811160011661481e575b60021b90565b61482661205a565b614818565b6148358154610f38565b908161483f575050565b81601f60009311600114614851575055565b8183526020832061486d91601f0160051c81019060010161247d565b8160208120915555565b60076000916148858161482b565b6148916001820161482b565b61489d6002820161482b565b6148a96003820161482b565b8260048201556148bb6006820161482b565b0155565b60405190606082018281106001600160401b0382111761492f575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614937610877565b6148da565b604051906149498261088e565b6008825260203681840137565b9061496082610905565b61496d60405191826108b6565b828152809261497e601f1991610905565b0190602036910137565b805115614a5a576149976148bf565b6149bb6149b66149b16149aa8551612071565b6003900490565b614806565b614956565b9160208301918182518301915b828210614a08575050506003905106806001146149f5576002146149ea575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c16880101516002860153168501015190820153019391906149c8565b5061078b611401565b602081830312610758578051906001600160401b03821161074f570181601f82011215610758578051614a9581610905565b92614aa360405194856108b6565b8184526020828401011161074f5761078b916020808501910161079c565b92614aed61078b9593614adf614afb94608088526080880190610f74565b908682036020880152610f74565b908482036040860152610f74565b9160608184039101526107d1565b600092918154614b1881610f38565b92600191808316908115614b705750600114614b345750505050565b90919293945060005260209081600020906000915b858310614b5f5750505050019038808080610fa1565b805485840152918301918101614b49565b60ff1916845250505001915038808080610fa1565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614cba575b506d04ee2d6d415b85acef810000000080831015614cab575b50662386f26fc1000080831015614c9c575b506305f5e10080831015614c8d575b5061271080831015614c7e575b506064821015614c6e575b600a80921015614c64575b600190816021614c1c828701614956565b95860101905b614c2e575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614c5f57919082614c22565b614c27565b9160010191614c0b565b9190606460029104910191614c00565b60049193920491019138614bf5565b60089193920491019138614be8565b60109193920491019138614bd9565b60209193920491019138614bc7565b604093508104915038614bae565b60405190614cd58261088e565b6007825260203681840137565b602090805115614cf0570190565b612089611f81565b602190805160011015614cf0570190565b906020918051821015614d1b57010190565b614d23611f81565b010190565b15614d2f57565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117614e1c575b604052602a825260403660208401376030614da983614ce2565b536078614db583614cf8565b536029905b60018211614dcd5761078b915015614d28565b80600f614e0992166010811015614e0f575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614dff8486614d09565b5360041c91614456565b90614dba565b614e17611f81565b614ddf565b614e24610877565b614d8f565b15614e4e57604051614e3a8161088e565b60048152637472756560e01b602082015290565b604051614e5a8161088e565b600581526466616c736560d81b602082015290565b62ffffff16614e7c61493c565b906030614e8883614ce2565b536078614e9483614cf8565b5360079081905b60018211614f3057614eae915015614d28565b614eb6614cc8565b91825115614f23575b60236020840153600190815b838110614ed9575050505090565b614f11906001198111614f16575b6001600160f81b0319614efc82860185614d09565b511660001a614f0b8288614d09565b536143a6565b614ecb565b614f1e61205a565b614ee7565b614f2b611f81565b614ebf565b80600f614f6292166010811015614f68575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614dff8487614d09565b90614e9b565b614f70611f81565b614f4256fea36469706673582212206ee8b7fe6be600a405fb060ab220346118b1e3de7778fc31f0c9a49c37c07a826c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"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\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"settings\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointAutoApprovalSettings\",\"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\":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\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"status\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.Roles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.Roles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"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\":\"commitHash\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewBuild\",\"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\":\"accessPointAutoApprovalSettings\",\"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\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenColor\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenDescription\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenENS\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenExternalURL\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenLogo\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenName\",\"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.Roles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.Roles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleRevoked\",\"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\":[{\"internalType\":\"enum FleekAccessControl.Roles\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"getCollectionRoleMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.Roles\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"getTokenRoleMembers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.Roles\",\"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.Roles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.Roles\",\"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.Roles\",\"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\":[{\"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\":\"accessPointAutoApprovalSettings\",\"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\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.Roles\",\"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.Roles\",\"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\":\"_settings\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApprovalSettings\",\"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\":\"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\"}],\"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. 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 have the `tokenOwner` role.\"},\"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}.\"},\"getCollectionRoleMembers(uint8)\":{\"details\":\"Returns an array of addresses that all have the collection role.\"},\"getTokenRoleMembers(uint256,uint8)\":{\"details\":\"Returns an array of addresses that all have the same token role for a certain tokenId.\"},\"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}.\"},\"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.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"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.\"},\"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}.\"},\"setAccessPointAutoApprovalSettings(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {ChangeAccessPointAutoApprovalSettings} 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}.\"},\"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}.\"}},\"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/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"@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\":\"0x99b148a767f42ff1bfcee7ff68d8b11ece6aa78a96a5637c9b5e1ddc1cca7b34\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ff6dd367c0f3894c2c3fcd28cd02ccce384bea6dc23baa7b03041be237cc64ae\",\"dweb:/ipfs/QmWGtcukpo1ApXiVxkAfMJ3u8Be9quLXBzExcXr6KJ4gmL\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x73629b3810f53d1b52432d9039c4e5d5fb4ab2e5c58ad78f8d63cc5fb190535f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e5553085df9b7c2c93b50a08ef8a6773676e2b57b559b92690af34b15fbeadc\",\"dweb:/ipfs/QmSHZkGFtGUuB67uGZMJmj9mhMbpcyhiQbnvMC4XVCgHMP\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0xa464563325a53e441b18dad85d35d50c41f98d598f3bf2f96291518be8d9fafb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c416cf0934598b8f5ba63f40dc0d4b9c2116bfbabbc8bb1621ad491fa7a15f5\",\"dweb:/ipfs/QmZDYDs8Lx18BYPwby4bKbrRg63T4ctNUBtvzrSG16SLMb\"]}},\"version\":1}", + "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}", "storageLayout": { "storage": [ { @@ -1605,60 +1693,92 @@ "type": "t_array(t_uint256)44_storage" }, { - "astId": 3946, + "astId": 3870, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "_collectionRolesVersion", + "label": "_collectionRolesCounter", "offset": 0, "slot": "151", - "type": "t_struct(Counter)2774_storage" + "type": "t_mapping(t_enum(CollectionRoles)3829,t_uint256)" }, { - "astId": 3954, + "astId": 3878, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_collectionRoles", "offset": 0, "slot": "152", - "type": "t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage))" + "type": "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))" }, { - "astId": 3959, + "astId": 3883, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_tokenRolesVersion", "offset": 0, "slot": "153", - "type": "t_mapping(t_uint256,t_struct(Counter)2774_storage)" + "type": "t_mapping(t_uint256,t_uint256)" }, { - "astId": 3969, + "astId": 3895, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_tokenRoles", "offset": 0, "slot": "154", - "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)))" + "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))))" }, { - "astId": 4743, + "astId": 4221, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 5764, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_paused", + "offset": 0, + "slot": "204", + "type": "t_bool" + }, + { + "astId": 5766, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_canPause", + "offset": 1, + "slot": "204", + "type": "t_bool" + }, + { + "astId": 5917, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "205", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 4434, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_appIds", "offset": 0, - "slot": "155", - "type": "t_struct(Counter)2774_storage" + "slot": "254", + "type": "t_uint256" }, { - "astId": 4748, + "astId": 4439, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_apps", "offset": 0, - "slot": "156", - "type": "t_mapping(t_uint256,t_struct(App)4722_storage)" + "slot": "255", + "type": "t_mapping(t_uint256,t_struct(App)4408_storage)" }, { - "astId": 4753, + "astId": 4444, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_accessPoints", "offset": 0, - "slot": "157", - "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4740_storage)" + "slot": "256", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)" } ], "types": { @@ -1667,18 +1787,18 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_address)dyn_storage": { - "base": "t_address", - "encoding": "dynamic_array", - "label": "address[]", - "numberOfBytes": "32" - }, "t_array(t_uint256)44_storage": { "base": "t_uint256", "encoding": "inplace", "label": "uint256[44]", "numberOfBytes": "1408" }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, "t_array(t_uint256)50_storage": { "base": "t_uint256", "encoding": "inplace", @@ -1690,9 +1810,19 @@ "label": "bool", "numberOfBytes": "1" }, - "t_enum(Roles)3895": { + "t_enum(AccessPointCreationStatus)4418": { "encoding": "inplace", - "label": "enum FleekAccessControl.Roles", + "label": "enum FleekERC721.AccessPointCreationStatus", + "numberOfBytes": "1" + }, + "t_enum(CollectionRoles)3829": { + "encoding": "inplace", + "label": "enum FleekAccessControl.CollectionRoles", + "numberOfBytes": "1" + }, + "t_enum(TokenRoles)3831": { + "encoding": "inplace", + "label": "enum FleekAccessControl.TokenRoles", "numberOfBytes": "1" }, "t_mapping(t_address,t_bool)": { @@ -1716,19 +1846,33 @@ "numberOfBytes": "32", "value": "t_uint256" }, - "t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)": { + "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { "encoding": "mapping", - "key": "t_enum(Roles)3895", - "label": "mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role)", + "key": "t_enum(CollectionRoles)3829", + "label": "mapping(enum FleekAccessControl.CollectionRoles => mapping(address => bool))", "numberOfBytes": "32", - "value": "t_struct(Role)3943_storage" + "value": "t_mapping(t_address,t_bool)" }, - "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4740_storage)": { + "t_mapping(t_enum(CollectionRoles)3829,t_uint256)": { + "encoding": "mapping", + "key": "t_enum(CollectionRoles)3829", + "label": "mapping(enum FleekAccessControl.CollectionRoles => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_enum(TokenRoles)3831", + "label": "mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)": { "encoding": "mapping", "key": "t_string_memory_ptr", "label": "mapping(string => struct FleekERC721.AccessPoint)", "numberOfBytes": "32", - "value": "t_struct(AccessPoint)4740_storage" + "value": "t_struct(AccessPoint)4432_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1737,40 +1881,40 @@ "numberOfBytes": "32", "value": "t_address" }, - "t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage))": { + "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))": { "encoding": "mapping", "key": "t_uint256", - "label": "mapping(uint256 => mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role))", + "label": "mapping(uint256 => mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool)))", "numberOfBytes": "32", - "value": "t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)" + "value": "t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))" }, - "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)))": { + "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))))": { "encoding": "mapping", "key": "t_uint256", - "label": "mapping(uint256 => mapping(uint256 => mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role)))", + "label": "mapping(uint256 => mapping(uint256 => mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool))))", "numberOfBytes": "32", - "value": "t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage))" + "value": "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))" }, - "t_mapping(t_uint256,t_struct(App)4722_storage)": { + "t_mapping(t_uint256,t_struct(App)4408_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.App)", "numberOfBytes": "32", - "value": "t_struct(App)4722_storage" + "value": "t_struct(App)4408_storage" }, - "t_mapping(t_uint256,t_struct(Build)4727_storage)": { + "t_mapping(t_uint256,t_struct(Build)4413_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.Build)", "numberOfBytes": "32", - "value": "t_struct(Build)4727_storage" + "value": "t_struct(Build)4413_storage" }, - "t_mapping(t_uint256,t_struct(Counter)2774_storage)": { + "t_mapping(t_uint256,t_uint256)": { "encoding": "mapping", "key": "t_uint256", - "label": "mapping(uint256 => struct Counters.Counter)", + "label": "mapping(uint256 => uint256)", "numberOfBytes": "32", - "value": "t_struct(Counter)2774_storage" + "value": "t_uint256" }, "t_string_memory_ptr": { "encoding": "bytes", @@ -1782,12 +1926,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AccessPoint)4740_storage": { + "t_struct(AccessPoint)4432_storage": { "encoding": "inplace", "label": "struct FleekERC721.AccessPoint", "members": [ { - "astId": 4729, + "astId": 4420, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "tokenId", "offset": 0, @@ -1795,7 +1939,7 @@ "type": "t_uint256" }, { - "astId": 4731, + "astId": 4422, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "score", "offset": 0, @@ -1803,7 +1947,7 @@ "type": "t_uint256" }, { - "astId": 4733, + "astId": 4424, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "contentVerified", "offset": 0, @@ -1811,7 +1955,7 @@ "type": "t_bool" }, { - "astId": 4735, + "astId": 4426, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "nameVerified", "offset": 1, @@ -1819,7 +1963,7 @@ "type": "t_bool" }, { - "astId": 4737, + "astId": 4428, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "owner", "offset": 2, @@ -1827,22 +1971,22 @@ "type": "t_address" }, { - "astId": 4739, + "astId": 4431, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "status", - "offset": 0, - "slot": "3", - "type": "t_string_storage" + "offset": 22, + "slot": "2", + "type": "t_enum(AccessPointCreationStatus)4418" } ], - "numberOfBytes": "128" + "numberOfBytes": "96" }, - "t_struct(App)4722_storage": { + "t_struct(App)4408_storage": { "encoding": "inplace", "label": "struct FleekERC721.App", "members": [ { - "astId": 4702, + "astId": 4388, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "name", "offset": 0, @@ -1850,7 +1994,7 @@ "type": "t_string_storage" }, { - "astId": 4704, + "astId": 4390, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "description", "offset": 0, @@ -1858,7 +2002,7 @@ "type": "t_string_storage" }, { - "astId": 4706, + "astId": 4392, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "externalURL", "offset": 0, @@ -1866,7 +2010,7 @@ "type": "t_string_storage" }, { - "astId": 4708, + "astId": 4394, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "ENS", "offset": 0, @@ -1874,7 +2018,7 @@ "type": "t_string_storage" }, { - "astId": 4710, + "astId": 4396, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "currentBuild", "offset": 0, @@ -1882,15 +2026,15 @@ "type": "t_uint256" }, { - "astId": 4715, + "astId": 4401, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "builds", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(Build)4727_storage)" + "type": "t_mapping(t_uint256,t_struct(Build)4413_storage)" }, { - "astId": 4717, + "astId": 4403, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "logo", "offset": 0, @@ -1898,7 +2042,7 @@ "type": "t_string_storage" }, { - "astId": 4719, + "astId": 4405, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "color", "offset": 0, @@ -1906,9 +2050,9 @@ "type": "t_uint24" }, { - "astId": 4721, + "astId": 4407, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "accessPointAutoApprovalSettings", + "label": "accessPointAutoApproval", "offset": 3, "slot": "7", "type": "t_bool" @@ -1916,12 +2060,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Build)4727_storage": { + "t_struct(Build)4413_storage": { "encoding": "inplace", "label": "struct FleekERC721.Build", "members": [ { - "astId": 4724, + "astId": 4410, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "commitHash", "offset": 0, @@ -1929,7 +2073,7 @@ "type": "t_string_storage" }, { - "astId": 4726, + "astId": 4412, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "gitRepository", "offset": 0, @@ -1939,44 +2083,6 @@ ], "numberOfBytes": "64" }, - "t_struct(Counter)2774_storage": { - "encoding": "inplace", - "label": "struct Counters.Counter", - "members": [ - { - "astId": 2773, - "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "_value", - "offset": 0, - "slot": "0", - "type": "t_uint256" - } - ], - "numberOfBytes": "32" - }, - "t_struct(Role)3943_storage": { - "encoding": "inplace", - "label": "struct FleekAccessControl.Role", - "members": [ - { - "astId": 3939, - "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "indexes", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 3942, - "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "members", - "offset": 0, - "slot": "1", - "type": "t_array(t_address)dyn_storage" - } - ], - "numberOfBytes": "64" - }, "t_uint24": { "encoding": "inplace", "label": "uint24", diff --git a/contracts/deployments/mumbai/FleekSVG.json b/contracts/deployments/mumbai/FleekSVG.json index b3116f7..37d225f 100644 --- a/contracts/deployments/mumbai/FleekSVG.json +++ b/contracts/deployments/mumbai/FleekSVG.json @@ -1,8 +1,8 @@ { - "timestamp": "2/15/2023, 12:40:34 PM", - "address": "0x774751185b43f71d0590E26A364A24b5475cDa2C", - "transactionHash": "0x5c1cf3aa073467de2d4b388ec37a257d680a91fccdf6da45a62d6a6cbb7e40aa", - "gasPrice": 1500000020, + "timestamp": "2/24/2023, 5:28:19 PM", + "address": "0xCb27660FB9F5b7c29E96e113d4792C0f835C3aE1", + "transactionHash": "0xab0f6435ab531ee7edea783f3e5c9c407e3a1437af3f6df0ea4e2b7fde7dd2d6", + "gasPrice": 2500000019, "abi": [ { "inputs": [ @@ -39,8 +39,8 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001a57612ae99081610021823930815050f35b50600080fdfe6080604052600480361015610015575b50600080fd5b6000803560e01c63891c235f1461002c575061000f565b60803660031901126100e05767ffffffffffffffff82358181116100d9576100579036908501610156565b926024358281116100d15761006f9036908301610156565b916044358181116100c8576100879036908401610156565b936064359182116100bf5750916100a96100af94926100bb9694369101610156565b92610226565b604051918291826101e3565b0390f35b94505050505080fd5b50505050809150fd5b505050809150fd5b5050809150fd5b809150fd5b50634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761011e57604052565b6101266100e5565b604052565b60209067ffffffffffffffff8111610149575b601f01601f19160190565b6101516100e5565b61013e565b81601f820112156101a65780359061016d8261012b565b9261017b60405194856100fc565b8284526020838301011161019d57816000926020809301838601378301015290565b50505050600080fd5b505050600080fd5b918091926000905b8282106101ce5750116101c7575050565b6000910152565b915080602091830151818601520182916101b6565b6040916020825261020381518092816020860152602086860191016101ae565b601f01601f1916010190565b90610222602092828151948592016101ae565b0190565b604080517f3c7376672077696474683d223130363522206865696768743d2231303635222060208201527f76696577426f783d2230203020313036352031303635222066696c6c3d226e6f918101919091527f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32303060608201527f302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77608082015271199737b93397989c9c9c97bc3634b735911f60711b60a08201529384939092909160b285017f3c7374796c6520747970653d22746578742f637373223e40696d706f7274207581527f726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d60208201527f2f637373323f66616d696c793d496e7465723a77676874403530303b36303022604082015269149d9e17b9ba3cb6329f60b11b6060820152606a017f3c726563742077696474683d223130363522206865696768743d22313036352281527f2066696c6c3d2275726c28236261636b67726f756e642922202f3e3c7265637460208201527f206f7061636974793d22302e32222077696474683d223130363522206865696760408201527f68743d2231303635222066696c6c3d2275726c28236261636b67726f756e642d60608201526a3930b234b0b6149110179f60a91b6080820152608b017f3c672066696c7465723d2275726c28236469736b657474652d736861646f772981527f223e3c7061746820643d224d3835372e323331203237392e3731324c3930322e60208201527f3234203238362e363735433931302e353437203238372e3936203931372e393160408201527f35203239322e373231203932322e35203239392e3736384c3933382e3839342060608201527f3332342e393634433934322e323439203333302e3132203934332e333131203360808201527f33362e343337203934312e383237203334322e3430364c3933372e373938203360a08201527f35382e3631354c3932342e303439203335362e36354c3931392e34313620333760c08201527f342e3038344c3933342e303638203337362e32344c3739312e3934372039323260e08201527f2e313532433738382e313039203933362e383936203737332e363934203934366101008201527f2e333038203735382e363531203934332e3839334c3137392e363336203835306101208201527f2e393238433136322e333138203834382e313437203135312e323135203833306101408201527f2e393837203135352e373736203831342e3035314c3136302e343738203739366101608201527f2e35394c3730342e333135203837392e3537344c3835372e323331203237392e6101808201527f3731325a222066696c6c3d222330353035303522202f3e3c2f673e00000000006101a08201526101bb017f3c7061746820643d224d3834302e323331203234302e3731324c3838352e323481527f203234372e363735433839332e353437203234382e393631203930302e39313560208201527f203235332e373232203930352e35203236302e3736384c3932312e383934203260408201527f38352e393635433932352e323439203239312e3132203932362e33313120323960608201527f372e343337203932342e383237203330332e3430364c3932302e37393820333160808201527f392e3631364c3930372e303439203331372e36354c3930322e3431362033333560a08201527f2e3038344c3931372e303638203333372e3234314c3737342e3934372038383360c08201527f2e313532433737312e313039203839372e383936203735362e3639342039303760e08201527f2e333038203734312e363531203930342e3839334c3136322e363336203831316101008201527f2e393238433134352e333138203830392e313437203133342e323135203739316101208201527f2e393837203133382e373736203737352e3035314c3134332e343738203735376101408201527f2e35394c3638372e333135203834302e3537344c3834302e323331203234302e6101608201527f3731325a222066696c6c3d2275726c28236d61696e2922202f3e00000000000061018082015261019a01600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3331392e383437203136312e353060208201527f32433331302e333536203136302e303037203330302e363734203136362e333260408201527f36203239382e323231203137352e3631364c3133382e373234203737392e373560608201527f38433133362e323731203738392e303438203134312e393737203739372e373960808201527f203135312e343638203739392e3238354c3734302e303631203839312e39373360a08201527f433734392e353533203839332e343637203735392e323335203838372e31343860c08201527f203736312e363837203837372e3835384c3930322e343035203334342e38353460e08201527f4c3838392e313538203334322e3736384c3839382e383732203330352e3937326101008201527f4c3931322e313139203330382e3035394c3931332e373333203330312e3934366101208201527f433931342e383337203239372e373632203931342e333039203239332e3437366101408201527f203931322e323531203238392e3932374c3839332e343834203235372e3536396101608201527f433839312e313533203235332e353439203838372e303633203235302e3832336101808201527f203838322e323231203235302e3036314c3832382e323035203234312e3535346101a08201527f433832322e323234203234302e363133203831352e383639203234322e3738336101c08201527f203831312e343237203234372e3238344c3830352e363836203235332e3130336101e08201527f433830342e323035203235342e363033203830322e303837203235352e3332366102008201527f203830302e303933203235352e3031334c3738332e363131203235322e3431376102208201527f4c3733342e33203433392e313936433733312e343339203435302e30333520376102408201527f32302e313433203435372e343037203730392e3037203435352e3636334c33326102608201527f382e383437203339352e373838433331372e373734203339342e3034352033316102808201527f312e313137203338332e383435203331332e393738203337332e3030374c33366102a08201527f362e353238203137332e3936324c3336362e353333203137332e3934314333366102c08201527f372e323334203137312e3234203336352e353732203136382e373032203336326102e08201527f2e3831203136382e3236374c3331392e383437203136312e3530325a4d3336396103008201527f2e333932203137342e3431344c3336382e363532203137372e3231374c3331366103208201527f2e383433203337332e343538433331342e3339203338322e373438203332302e6103408201527f303936203339312e3439203332392e353837203339322e3938354c3730392e386103608201527f31203435322e3836433731392e333031203435342e333534203732382e3938336103808201527f203434382e303335203733312e343336203433382e3734354c3738302e3734376103a08201527f203235312e3936364c3738332e323435203234322e3530344c3738332e3938356103c08201527f203233392e3730314c3336392e333932203137342e3431345a222066696c6c3d6103e08201526b111198999899989b1110179f60a11b61040082015261040c01600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223422207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3331392e383437203136312e353032433331302e33353620313660808201527f302e303037203330302e363734203136362e333236203239382e32323120313760a08201527f352e3631364c3133382e373234203737392e373538433133362e32373120373860c08201527f392e303438203134312e393737203739372e3739203135312e3436382037393960e08201527f2e3238354c3734302e303631203839312e393733433734392e353533203839336101008201527f2e343637203735392e323335203838372e313438203736312e363837203837376101208201527f2e3835384c3930322e343035203334342e3835344c3838392e313538203334326101408201527f2e3736384c3839382e383732203330352e3937324c3931322e313139203330386101608201527f2e3035394c3931332e373333203330312e393436433931342e383337203239376101808201527f2e373632203931342e333039203239332e343736203931322e323531203238396101a08201527f2e3932374c3839332e343834203235372e353639433839312e313533203235336101c08201527f2e353439203838372e303633203235302e383233203838322e323231203235306101e08201527f2e3036314c3832382e323035203234312e353534433832322e323234203234306102008201527f2e363133203831352e383639203234322e373833203831312e343237203234376102208201527f2e3238344c3830352e363836203235332e313033433830342e323035203235346102408201527f2e363033203830322e303837203235352e333236203830302e303933203235356102608201527f2e3031334c3738332e363131203235322e3431374c3733342e33203433392e316102808201527f3936433733312e343339203435302e303335203732302e313433203435372e346102a08201527f3037203730392e3037203435352e3636334c3332382e383437203339352e37386102c08201527f38433331372e373734203339342e303435203331312e313137203338332e38346102e08201527f35203331332e393738203337332e3030374c3336362e353238203137332e39366103008201527f324c3336362e353333203137332e393431433336372e323334203137312e32346103208201527f203336352e353732203136382e373032203336322e3831203136382e3236374c6103408201527f3331392e383437203136312e3530325a4d3336392e333932203137342e3431346103608201527f4c3336382e363532203137372e3231374c3331362e383433203337332e3435386103808201527f433331342e3339203338322e373438203332302e303936203339312e343920336103a08201527f32392e353837203339322e3938354c3730392e3831203435322e3836433731396103c08201527f2e333031203435342e333534203732382e393833203434382e303335203733316103e08201527f2e343336203433382e3734354c3738302e373437203235312e3936364c3738336104008201527f2e323435203234322e3530344c3738332e393835203233392e3730314c3336396104208201527f2e333932203137342e3431345a222066696c6c3d2275726c28236469736b65746104408201527f74652d6772616469656e7429222066696c6c2d6f7061636974793d22302e32226104608201526210179f60e91b610480820152610483017f3c7061746820643d224d3333352e3338203230382e313133433333352e39323281527f203230382e313938203333362e343137203230372e363836203333362e32383360208201527f203230372e3137394c3333302e3339203138342e373935433333302e3234392060408201527f3138342e323631203332392e353239203138342e313438203332392e3132392060608201527f3138342e3539374c3331322e333538203230332e343131433331312e3937382060808201527f3230332e383338203331322e313734203230342e343538203331322e3731362060a08201527f3230342e3534344c3331372e393632203230352e3337433331382e333537203260c08201527f30352e343332203331382e353935203230352e373936203331382e343933203260e08201527f30362e3138334c3331342e37203232302e353531433331342e353937203232306101008201527f2e393338203331342e383335203232312e333032203331352e323331203232316101208201527f2e3336344c3332342e353339203232322e3833433332342e393335203232322e6101408201527f383933203332352e333338203232322e363239203332352e3434203232322e326101608201527f34324c3332392e323333203230372e383735433332392e333336203230372e346101808201527f3838203332392e373339203230372e323234203333302e313335203230372e326101a08201527f38364c3333352e3338203230382e3131335a222066696c6c3d2275726c28236d6101c08201526730b4b7149110179f60c11b6101e08201526101e8017f3c7061746820643d224d3331392e323832203236392e303837433331392e383281527f34203236392e313733203332302e333139203236382e363631203332302e313860208201527f36203236382e3135344c3331342e323932203234352e3737433331342e31353160408201527f203234352e323336203331332e343331203234352e313233203331332e30333160608201527f203234352e3537324c3239362e323631203236342e333836433239352e38382060808201527f3236342e383132203239362e303736203236352e343333203239362e3631382060a08201527f3236352e3531384c3330312e383634203236362e333434433330322e3235392060c08201527f3236362e343037203330322e343937203236362e373731203330322e3339352060e08201527f3236372e3135384c3239382e363032203238312e353236433239382e352032386101008201527f312e393133203239382e373337203238322e323737203239392e3133332032386101208201527f322e3333394c3330382e343431203238332e383035433330382e3833372032386101408201527f332e383637203330392e3234203238332e363034203330392e333433203238336101608201527f2e3231374c3331332e313336203236382e383439433331332e323338203236386101808201527f2e343632203331332e363431203236382e313939203331342e303337203236386101a08201527f2e3236314c3331392e323832203236392e3038375a222066696c6c3d22626c616101c08201527f636b222066696c6c2d6f7061636974793d22302e3522202f3e000000000000006101e08201526101f9017f3c7061746820643d224d3330332e313834203333302e303632433330332e373281527f36203333302e313438203330342e323231203332392e363336203330342e303860208201527f38203332392e3132384c3239382e313934203330362e373435433239382e303560408201527f33203330362e323131203239372e333333203330362e303938203239362e393360608201527f33203330362e3534374c3238302e313633203332352e333631433237392e373860808201527f32203332352e373837203237392e393739203332362e343038203238302e353260a08201527f203332362e3439334c3238352e373636203332372e333139433238362e31363160c08201527f203332372e333832203238362e333939203332372e373436203238362e32393760e08201527f203332382e3133334c3238322e353034203334322e353031433238322e3430326101008201527f203334322e383838203238322e363339203334332e323532203238332e3033356101208201527f203334332e3331344c3239322e333434203334342e3738433239322e373339206101408201527f3334342e383432203239332e313432203334342e353739203239332e323435206101608201527f3334342e3139324c3239372e303338203332392e383234433239372e313420336101808201527f32392e343337203239372e353433203332392e313734203239372e39333920336101a08201527f32392e3233364c3330332e313834203333302e3036325a222066696c6c3d22626101c08201527f6c61636b222066696c6c2d6f7061636974793d22302e3522202f3e00000000006101e08201526101fb017f3c70617468207374726f6b653d2275726c28236d61696e2922207374726f6b6581527f2d77696474683d223622207374726f6b652d6c696e656361703d22726f756e6460208201527f22207374726f6b652d6c696e656a6f696e3d22726f756e642220643d224d323960408201527f302e313039203436332e343138433239322e333538203435342e39303220333060608201527f312e323333203434392e3131203330392e393333203435302e34384c3737312e60808201527f3037203532332e303936433737392e3737203532342e3436372037383520353360a08201527f322e3438203738322e373532203534302e3939364c3639322e3038362038383460c08201527f2e3431384c3139392e343433203830362e38344c3239302e313039203436332e60e08201527f3431385a222066696c6c3d22626c61636b222066696c6c2d6f7061636974793d61010082015268111817189a1110179f60b91b61012082015261012901600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223622207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3738372e353839203233372e3334394c3436302e33353420313860808201527f352e3831384c3430362e333235203339302e343639433430332e38373220333960a08201527f392e373539203430392e353738203430382e353031203431392e30363920343060c08201527f392e3939364c3731312e393334203435362e313134433732312e34323520343560e08201527f372e363039203733312e313037203435312e3239203733332e3536203434324c6101008201527f3738372e353839203233372e3334395a4d3636302e323639203234352e3031436101208201527f3635352e353233203234342e323633203635302e363832203234372e343233206101408201527f3634392e343536203235322e3036384c3630372e333836203431312e343138436101608201527f3630362e3136203431362e303633203630392e303133203432302e34333420366101808201527f31332e373539203432312e3138314c3638322e343939203433322e30303643366101a08201527f38372e323435203433322e373533203639322e303836203432392e35393420366101c08201527f39332e333132203432342e3934394c3733352e333832203236352e35393943376101e08201527f33362e363038203236302e393534203733332e373535203235362e35383320376102008201527f32392e3031203235352e3833354c3636302e323639203234352e30315a2220666102208201527234b6361e913ab9361411b6b0b4b7149110179f60691b61024082015261025301600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3836342e363433203238332e393360208201527f37433836352e313836203238332e363035203836352e373038203238342e323560408201527f37203836352e323339203238342e3638334c3834342e323638203330332e373160608201527f39433834332e393338203330342e303138203834342e303933203330342e353160808201527f37203834342e353236203330342e3534384c3835332e373236203330352e323060a08201527f37433835342e313834203330352e3234203835342e333231203330352e37383760c08201527f203835332e393432203330362e3037314c3833332e383834203332312e31313260e08201527f433833332e353036203332312e333936203833332e363433203332312e3934336101008201527f203833342e313031203332312e3937364c3834342e303037203332322e3638356101208201527f433834342e343931203332322e3732203834342e363035203332332e333139206101408201527f3834342e313737203332332e35384c3739372e373532203335312e39353443376101608201527f39372e323039203335322e323836203739362e363837203335312e36333420376101808201527f39372e313536203335312e3230394c3831382e343033203333312e39323243386101a08201527f31382e373333203333312e363232203831382e353737203333312e31323320386101c08201527f31382e313435203333312e3039324c3830382e373438203333302e34324338306101e08201527f382e323932203333302e333837203830382e313534203332392e3834332038306102008201527f382e353239203332392e3535384c3832382e303534203331342e3734344338326102208201527f382e3433203331342e343539203832382e323931203331332e393135203832376102408201527f2e383335203331332e3838324c3831382e333839203331332e323036433831376102608201527f2e393034203331332e313731203831372e3739203331322e353732203831382e6102808201527f323138203331322e3331314c3836342e363433203238332e3933375a222066696102a08201526c36361e913bb434ba329110179f60991b6102c08201526102cd017f3c67207472616e73666f726d3d226d617472697828302e39383738323720302e81527f313535353537202d302e32353532363120302e3936363837322032353020373360208201527f3529223e3c7465787420666f6e742d66616d696c793d22496e7465722c20736160408201527f6e732d73657269662220666f6e742d7765696768743d22626f6c642220666f6e60608201527f742d73697a653d223432222066696c6c3d2223453545374638223e00000000006080820152609b016121e99161020f565b7f3c2f746578743e3c7465787420666f6e742d66616d696c793d22496e7465722c81527f2073616e732d73657269662220666f6e742d7765696768743d226e6f726d616c60208201527f2220793d2234302220666f6e742d73697a653d223232222066696c6c3d222337604082015266231c189c99111f60c91b60608201526067016122749161020f565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f3c696d6167652077696474683d2231363722206865696768743d22313637222081527f7472616e73666f726d3d226d617472697828302e39383738323720302e31353560208201527f353537202d302e32353532363120302e393636383732203434342e313137203560408201526d191a17189b949110343932b31e9160911b6060820152606e0161231a9161020f565b631110179f60e11b8152600401651e3232b3399f60d11b81526006017f3c66696c7465722069643d226469736b657474652d736861646f772220783d2281527f37302e373438392220793d223139352e373132222077696474683d223935352e60208201527f37333322206865696768743d223833322e353538222066696c746572556e697460408201527f733d227573657253706163654f6e5573652220636f6c6f722d696e746572706f60608201527f6c6174696f6e2d66696c746572733d2273524742223e3c6665466c6f6f64206660808201527f6c6f6f642d6f7061636974793d223022202f3e3c6665426c656e6420696e3d2260a08201527f536f757263654772617068696322202f3e3c6665476175737369616e426c757260c08201527f20737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e000060e082015260fe017f3c6c696e6561724772616469656e742069643d226261636b67726f756e64222081527f78313d223533322e35222079313d2230222078323d223533322e35222079323d60208201527f223130363522206772616469656e74556e6974733d227573657253706163654f60408201527f6e557365223e3c73746f70202f3e3c73746f70206f66667365743d223122207360608201527f746f702d636f6c6f723d222331333133313322202f3e3c2f6c696e656172477260808201526630b234b2b73a1f60c91b60a082015260a7017f3c72616469616c4772616469656e742069643d226261636b67726f756e642d7281527f616469616c222063783d2230222063793d22302220723d22312220677261646960208201527f656e74556e6974733d227573657253706163654f6e557365222067726164696560408201527f6e745472616e73666f726d3d227472616e736c617465283533322e352035333260608201527f2e352920726f746174652838392e39363129207363616c652837333529223e3c60808201527039ba37b81039ba37b816b1b7b637b91e9160791b60a082015260b101612616908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d8152601160f91b6020820152602101612650908261020f565b7f222073746f702d6f7061636974793d223022202f3e3c2f72616469616c4772618152653234b2b73a1f60d11b60208201526026017f3c6c696e6561724772616469656e742069643d226469736b657474652d67726181527f6469656e74222078313d223932352e363236222079313d223235362e3839362260208201527f2078323d223133362e373739222079323d223830302e3230332220677261646960408201527f656e74556e6974733d227573657253706163654f6e557365223e3c73746f702060608201526b39ba37b816b1b7b637b91e9160a11b6080820152608c0161273c908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d81527f222332433331334622202f3e3c2f6c696e6561724772616469656e743e0000006020820152603d017f3c6c696e6561724772616469656e742069643d226d61696e223e3c73746f702081526b39ba37b816b1b7b637b91e9160a11b6020820152602c016127cc9161020f565b741110179f1e17b634b732b0b923b930b234b2b73a1f60591b8152601501661e17b232b3399f60c91b8152600701651e17b9bb339f60d11b81526006010390601f1991828101825261281e90826100fc565b612827906129aa565b6040517f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015291908290603a82016128619161020f565b03908101825261287190826100fc565b90565b604051906020820182811067ffffffffffffffff821117612899575b60405260008252565b6128a16100e5565b612890565b604051906060820182811067ffffffffffffffff821117612917575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61291f6100e5565b6128c2565b50634e487b7160e01b600052601160045260246000fd5b600290600219811161294b570190565b610222612924565b6001600160fe1b03811160011661296b575b60021b90565b612973612924565b612965565b906129828261012b565b61298f60405191826100fc565b82815280926129a0601f199161012b565b0190602036910137565b805115612a7c576129b96128a6565b6129dd6129d86129d36129cc855161293b565b6003900490565b612953565b612978565b9160208301918182518301915b828210612a2a57505050600390510680600114612a1757600214612a0c575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c16880101516002860153168501015190820153019391906129ea565b5061287161287456fe3c706174682066696c6c2d72756c653d226576656e6f64642220636c69702d72a3646970667358221220196f49139361ae0156ff01b5b782a7bd8f0cc5adf85d18e728cdb65789995e726c6578706572696d656e74616cf564736f6c634300080c0041", - "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/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"@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\":\"0x99b148a767f42ff1bfcee7ff68d8b11ece6aa78a96a5637c9b5e1ddc1cca7b34\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ff6dd367c0f3894c2c3fcd28cd02ccce384bea6dc23baa7b03041be237cc64ae\",\"dweb:/ipfs/QmWGtcukpo1ApXiVxkAfMJ3u8Be9quLXBzExcXr6KJ4gmL\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x73629b3810f53d1b52432d9039c4e5d5fb4ab2e5c58ad78f8d63cc5fb190535f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e5553085df9b7c2c93b50a08ef8a6773676e2b57b559b92690af34b15fbeadc\",\"dweb:/ipfs/QmSHZkGFtGUuB67uGZMJmj9mhMbpcyhiQbnvMC4XVCgHMP\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0xa464563325a53e441b18dad85d35d50c41f98d598f3bf2f96291518be8d9fafb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c416cf0934598b8f5ba63f40dc0d4b9c2116bfbabbc8bb1621ad491fa7a15f5\",\"dweb:/ipfs/QmZDYDs8Lx18BYPwby4bKbrRg63T4ctNUBtvzrSG16SLMb\"]}},\"version\":1}", + "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}", "storageLayout": { "storage": [], "types": null diff --git a/contracts/deployments/mumbai/proxy.json b/contracts/deployments/mumbai/proxy.json index 95666a4..5bac1b7 100644 --- a/contracts/deployments/mumbai/proxy.json +++ b/contracts/deployments/mumbai/proxy.json @@ -1,5 +1,9 @@ { "FleekERC721": [ + { + "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", + "timestamp": "2/24/2023, 5:28:44 PM" + }, { "address": "0x11Cd77Eac1a0883DE9435B5586474903A2a084cD", "timestamp": "2/15/2023, 12:43:39 PM" diff --git a/contracts/deployments/mumbai/solcInputs/5446c77097c1eefd9b8fa506e19f10f6.json b/contracts/deployments/mumbai/solcInputs/5446c77097c1eefd9b8fa506e19f10f6.json new file mode 100644 index 0000000..693f3ab --- /dev/null +++ b/contracts/deployments/mumbai/solcInputs/5446c77097c1eefd9b8fa506e19f10f6.json @@ -0,0 +1,87 @@ +{ + "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 /**\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)\n 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/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 \"./util/FleekStrings.sol\";\nimport \"./FleekPausable.sol\";\n\nerror MustBeTokenOwner(uint256 tokenId);\nerror ThereIsNoTokenMinted();\n\ncontract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, FleekPausable {\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\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(string memory _name, string memory _symbol) public initializer {\n __ERC721_init(_name, _symbol);\n __FleekAccessControl_init();\n _appIds = 0;\n __FleekPausable_init();\n }\n\n /**\n * @dev Checks if the AccessPoint exists.\n */\n modifier requireAP(string memory apName) {\n require(_accessPoints[apName].owner != address(0), \"FleekERC721: invalid AP\");\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 * - 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 requireCollectionRole(CollectionRoles.Owner) 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 * - the contract must be not paused.\n *\n * IMPORTANT: The payment is not set yet\n */\n function addAccessPoint(uint256 tokenId, string memory apName) public payable whenNotPaused {\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 require(_accessPoints[apName].owner == address(0), \"FleekERC721: AP already exists\");\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 require(\n accessPoint.tokenId == tokenId,\n \"FleekERC721: the passed tokenId is not the same as the access point's tokenId.\"\n );\n require(\n accessPoint.status == AccessPointCreationStatus.DRAFT,\n \"FleekERC721: the access point creation status has been set before.\"\n );\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 require(msg.sender == _accessPoints[apName].owner, \"FleekERC721: must be AP owner\");\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 require(_accessPoints[apName].score > 0, \"FleekERC721: score cant be lower\");\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" + }, + "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/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-on.t.ts b/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-on.t.ts index e6a0191..0ba67fb 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-on.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-on.t.ts @@ -17,7 +17,7 @@ describe('FleekERC721.AccessPoints.AutoApprovalOn', () => { const { contract, owner, tokenId } = fixture; await expect(contract.addAccessPoint(tokenId, 'random.com')) - .to.emit(contract, 'ChangeAccessPointStatus') + .to.emit(contract, 'ChangeAccessPointCreationStatus') .withArgs( 'random.com', tokenId, diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index c89f7f4..1ab5857 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -44,6 +44,7 @@ type MetadataUpdate @entity(immutable: true) { stringValue: String uint24Value: Int doubleStringValue: [String!]! + booleanValue: Boolean byAddress: Bytes! blockNumber: BigInt! blockTimestamp: BigInt! @@ -76,11 +77,13 @@ type Token @entity { controllers: [Controller!] gitRepository: GitRepository! commitHash: String! + accessPoints: [AccessPoint!] @derivedFrom(field: "token") } type Owner @entity { id: Bytes! # address tokens: [Token!] @derivedFrom(field: "owner") + accessPoints: [AccessPoint!] @derivedFrom(field: "owner") } type Controller @entity { @@ -104,3 +107,13 @@ type GitRepository @entity { id: String! # transaction hash of the first transaction this repository appeared in tokens: [Token!] @derivedFrom(field: "gitRepository") } + +type AccessPoint @entity { + id: String! # AP Name + token: Token! + score: BigInt! + contentVerified: Boolean! + nameVerified: Boolean! + owner: Owner! + creationStatus: String! +} \ No newline at end of file diff --git a/subgraph/src/fleek-nfa.ts b/subgraph/src/fleek-nfa.ts index ced005d..fad17d2 100644 --- a/subgraph/src/fleek-nfa.ts +++ b/subgraph/src/fleek-nfa.ts @@ -1,14 +1,21 @@ -import { Address, Bytes, log, store, ethereum } from '@graphprotocol/graph-ts'; +import { Address, Bytes, log, store, ethereum, BigInt } from '@graphprotocol/graph-ts'; import { Approval as ApprovalEvent, ApprovalForAll as ApprovalForAllEvent, MetadataUpdate as MetadataUpdateEvent, MetadataUpdate1 as MetadataUpdateEvent1, MetadataUpdate2 as MetadataUpdateEvent2, + MetadataUpdate3 as MetadataUpdateEvent3, Transfer as TransferEvent, NewMint as NewMintEvent, + ChangeAccessPointCreationStatus as ChangeAccessPointCreationStatusEvent, + ChangeAccessPointScore as ChangeAccessPointCreationScoreEvent, + NewAccessPoint as NewAccessPointEvent, + ChangeAccessPointNameVerify as ChangeAccessPointNameVerifyEvent, + ChangeAccessPointContentVerify as ChangeAccessPointContentVerifyEvent, } from '../generated/FleekNFA/FleekNFA'; import { + AccessPoint, Approval, ApprovalForAll, Collection, @@ -250,6 +257,33 @@ export function handleMetadataUpdateWithIntValue( } } +export function handleMetadataUpdateWithBooleanValue(event: MetadataUpdateEvent3): void { + /** + * accessPointAutoApproval + */ + let entity = new MetadataUpdate( + event.transaction.hash.concatI32(event.logIndex.toI32()) + ); + + entity.key = event.params.key; + entity.tokenId = event.params._tokenId; + entity.booleanValue = event.params.value; + entity.blockNumber = event.block.number; + entity.blockTimestamp = event.block.timestamp; + entity.transactionHash = event.transaction.hash; + + entity.save(); + + let token = Token.load(Bytes.fromByteArray(Bytes.fromBigInt(event.params._tokenId))); + + if (token) { + if (event.params.key == 'accessPointAutoApproval') { + token.accessPointAutoApproval = event.params.value; + } + token.save(); + } +} + export function handleTransfer(event: TransferEvent): void { let entity = new Transfer( event.transaction.hash.concatI32(event.logIndex.toI32()) @@ -295,3 +329,109 @@ export function handleTransfer(event: TransferEvent): void { } } } + + +/** + * This handler will create and load entities in the following order: + * - AccessPoint [create] + * - Owner [load / create] + * Note to discuss later: Should a `NewAccessPoint` entity be also created and defined? + */ + export function handleNewAccessPoint(event: NewAccessPointEvent): void { + // Create an AccessPoint entity + let accessPointEntity = new AccessPoint(event.params.apName); + accessPointEntity.score = BigInt.fromU32(0); + accessPointEntity.contentVerified = false; + accessPointEntity.nameVerified = false; + accessPointEntity.status = 'DRAFT'; // Since a `ChangeAccessPointCreationStatus` event is emitted instantly after `NewAccessPoint`, the status will be updated in that handler. + accessPointEntity.owner = event.params.owner; + accessPointEntity.token = Bytes.fromByteArray(Bytes.fromBigInt(event.params.tokenId)); + + // Load / Create an Owner entity + let ownerEntity = Owner.load(event.params.owner); + + if (!ownerEntity) { + // Create a new owner entity + ownerEntity = new Owner(event.params.owner); + } + + // Save entities. + accessPointEntity.save(); + ownerEntity.save(); +} + +/** + * This handler will update the status of an access point entity. + */ +export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCreationStatusEvent): void { + // Load the AccessPoint entity + let accessPointEntity = AccessPoint.load(event.params.apName); + let status = event.params.status; + + if (accessPointEntity) { + if (status == 0) { + accessPointEntity.status = 'DRAFT'; + } else if (status == 1) { + accessPointEntity.status = 'APPROVED'; + } else if (status == 2) { + accessPointEntity.status = 'REJECTED'; + } else if (status == 3) { + accessPointEntity.status = 'REMOVED'; + } else { + // Unknown status + log.error('Unable to handle ChangeAccessPointCreationStatus. Unknown status. Status: {}, AccessPoint: {}', [status.toString(), event.params.apName]); + } + accessPointEntity.save(); + } else { + // Unknown access point + log.error('Unable to handle ChangeAccessPointCreationStatus. Unknown access point. Status: {}, AccessPoint: {}', [status.toString(), event.params.apName]); + } +} + +/** + * This handler will update the score of an access point entity. + */ + export function handleChangeAccessPointScore(event: ChangeAccessPointCreationScoreEvent): void { + // Load the AccessPoint entity + let accessPointEntity = AccessPoint.load(event.params.apName); + + if (accessPointEntity) { + accessPointEntity.score = event.params.score; + accessPointEntity.save(); + } else { + // Unknown access point + log.error('Unable to handle ChangeAccessPointScore. Unknown access point. Score: {}, AccessPoint: {}', [event.params.score.toString(), event.params.apName]); + } +} + +/** + * This handler will update the nameVerified field of an access point entity. + */ + export function handleChangeAccessPointNameVerify(event: ChangeAccessPointNameVerifyEvent): void { + // Load the AccessPoint entity + let accessPointEntity = AccessPoint.load(event.params.apName); + + if (accessPointEntity) { + accessPointEntity.nameVerified = event.params.verified; + accessPointEntity.save(); + } else { + // Unknown access point + log.error('Unable to handle ChangeAccessPointNameVerify. Unknown access point. Verified: {}, AccessPoint: {}', [event.params.verified.toString(), event.params.apName]); + } +} + +/** + * This handler will update the contentVerified field of an access point entity. + */ + export function handleChangeAccessPointContentVerify(event: ChangeAccessPointContentVerifyEvent): void { + // Load the AccessPoint entity + let accessPointEntity = AccessPoint.load(event.params.apName); + + if (accessPointEntity) { + accessPointEntity.contentVerified = event.params.verified; + accessPointEntity.save(); + } else { + // Unknown access point + log.error('Unable to handle ChangeAccessPointContentVerify. Unknown access point. Verified: {}, AccessPoint: {}', [event.params.verified.toString(), event.params.apName]); + } +} diff --git a/subgraph/subgraph.yaml b/subgraph/subgraph.yaml index 8578ded..31c0ee3 100644 --- a/subgraph/subgraph.yaml +++ b/subgraph/subgraph.yaml @@ -1,4 +1,3 @@ -specVersion: 0.0.5 schema: file: ./schema.graphql dataSources: @@ -6,9 +5,9 @@ dataSources: name: FleekNFA network: mumbai source: - address: "0x11cd77eac1a0883de9435b5586474903a2a084cd" # <- Proxy Contract | Current implementation contract: 0x113169680A417e4dB4AD11832486FF317fB4CB36 + address: "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519" # <- Proxy Contract | Current implementation contract: 0x9e4a318c788e0097a24146fe7041a0cd93939d56 abi: FleekNFA - startBlock: 32071579 + startBlock: 32373064 mapping: kind: ethereum/events apiVersion: 0.0.7 @@ -16,18 +15,20 @@ dataSources: entities: - Approval - ApprovalForAll - - CollectionRoleGranted - - CollectionRoleRevoked - MetadataUpdate - NewMint - - TokenRoleGranted - - TokenRoleRevoked - Transfer - Token - Owner - Controller - CollectionOwner - GithubRepository + - AccessPoint + - ChangeAccessPointCreationStatus + - ChangeAccessPointScore + - ChangeAccessPointNameVerify + - ChangeAccessPointContentVerify + - ChangeAccessPointAutoApproval abis: - name: FleekNFA file: ../contracts/artifacts/contracts/FleekERC721.sol/FleekERC721.json @@ -42,8 +43,21 @@ dataSources: handler: handleMetadataUpdateWithDoubleStringValue - event: MetadataUpdate(indexed uint256,string,uint24,indexed address) handler: handleMetadataUpdateWithIntValue + - event: MetadataUpdate(indexed uint256,string,bool,indexed address) + handler: handleMetadataUpdateWithBooleanValue - event: NewMint(indexed uint256,string,string,string,string,string,string,string,uint24,bool,indexed address,indexed address) handler: handleNewMint - event: Transfer(indexed address,indexed address,indexed uint256) handler: handleTransfer + - event: ChangeAccessPointContentVerify(string,uint256,indexed bool,indexed address) + handler: handleChangeAccessPointContentVerify + - event: ChangeAccessPointNameVerify(string,uint256,indexed bool,indexed address) + handler: handleChangeAccessPointNameVerify + - event: ChangeAccessPointScore(string,indexed uint256,uint256,indexed address) + handler: handleChangeAccessPointScore + - event: ChangeAccessPointCreationStatus(string,uint256,uint8,indexed address) + handler: handleChangeAccessPointCreationStatus + - event: NewAccessPoint(string,indexed uint256,indexed address) + handler: handleNewAccessPoint file: ./src/fleek-nfa.ts +specVersion: 0.0.5