From c8a63b86188bb5d66d9b6f65c6596b90299e3457 Mon Sep 17 00:00:00 2001 From: Shredder <110225819+EmperorOrokuSaki@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:57:22 +0330 Subject: [PATCH 01/23] feat: updating subgraph following the ACL refactor (#144) * refactor: remove unavailable imports, remove outdated entities, add command to regenerate the compile and codegen. * feat: add handler for initialized, tokenrolechanged and collectionrolechanged. * refactor: remove the collection entity. * refactor: implement zoruka's requested changes - best practice recommendations. --- subgraph/schema.graphql | 17 ++--- subgraph/src/fleek-nfa.ts | 144 +++++++++++++++++++++++++++++++------- subgraph/subgraph.yaml | 13 +++- 3 files changed, 135 insertions(+), 39 deletions(-) diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index 1ab58579..e3528ccf 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -31,7 +31,7 @@ type NewMint @entity(immutable: true) { color: Int! accessPointAutoApproval: Boolean! triggeredBy: Bytes! # address - tokenOwner: Owner! # address + owner: Owner! # address blockNumber: BigInt! blockTimestamp: BigInt! transactionHash: Bytes! @@ -80,28 +80,19 @@ type Token @entity { accessPoints: [AccessPoint!] @derivedFrom(field: "token") } +# Owner entity for collection, access points, and tokens type Owner @entity { id: Bytes! # address tokens: [Token!] @derivedFrom(field: "owner") accessPoints: [AccessPoint!] @derivedFrom(field: "owner") + collection: Boolean! } +# Controller entity for tokens type Controller @entity { id: Bytes! # address tokens: [Token!] @derivedFrom(field: "controllers") } -type Collection @entity { - id: Bytes! #address - deployer: Bytes! #address - transactionHash: Bytes! #transaction hash - owners: [CollectionOwner!] -} - -type CollectionOwner @entity { - id: Bytes! # address - accessGrantedBy: Bytes! #address - transactionHash: Bytes! -} type GitRepository @entity { id: String! # transaction hash of the first transaction this repository appeared in diff --git a/subgraph/src/fleek-nfa.ts b/subgraph/src/fleek-nfa.ts index fad17d20..80562ba9 100644 --- a/subgraph/src/fleek-nfa.ts +++ b/subgraph/src/fleek-nfa.ts @@ -1,11 +1,16 @@ import { Address, Bytes, log, store, ethereum, BigInt } from '@graphprotocol/graph-ts'; + +// Event Imports [based on the yaml config] import { Approval as ApprovalEvent, ApprovalForAll as ApprovalForAllEvent, MetadataUpdate as MetadataUpdateEvent, MetadataUpdate1 as MetadataUpdateEvent1, MetadataUpdate2 as MetadataUpdateEvent2, + TokenRoleChanged as TokenRoleChangedEvent, MetadataUpdate3 as MetadataUpdateEvent3, + CollectionRoleChanged as CollectionRoleChangedEvent, + Initialized as InitializedEvent, Transfer as TransferEvent, NewMint as NewMintEvent, ChangeAccessPointCreationStatus as ChangeAccessPointCreationStatusEvent, @@ -14,21 +19,28 @@ import { ChangeAccessPointNameVerify as ChangeAccessPointNameVerifyEvent, ChangeAccessPointContentVerify as ChangeAccessPointContentVerifyEvent, } from '../generated/FleekNFA/FleekNFA'; + +// Entity Imports [based on the schema] import { AccessPoint, Approval, ApprovalForAll, - Collection, - CollectionOwner, - Controller, + Owner, GitRepository as GitRepositoryEntity, MetadataUpdate, NewMint, - Owner, Token, Transfer, } from '../generated/schema'; +enum CollectionRoles { + Owner, +}; + +enum TokenRoles { + Controller, +}; + export function handleApproval(event: ApprovalEvent): void { let entity = new Approval( event.transaction.hash.concatI32(event.logIndex.toI32()) @@ -87,7 +99,7 @@ export function handleNewMint(event: NewMintEvent): void { newMintEntity.color = color; newMintEntity.accessPointAutoApproval = accessPointAutoApproval; newMintEntity.triggeredBy = event.params.minter; - newMintEntity.tokenOwner = ownerAddress; + newMintEntity.owner = ownerAddress; newMintEntity.blockNumber = event.block.number; newMintEntity.blockTimestamp = event.block.timestamp; newMintEntity.transactionHash = event.transaction.hash; @@ -97,7 +109,6 @@ export function handleNewMint(event: NewMintEvent): void { // Create Token, Owner, and Controller entities let owner = Owner.load(ownerAddress); - let controller = Controller.load(ownerAddress); let gitRepositoryEntity = GitRepositoryEntity.load(gitRepository); let token = new Token(Bytes.fromByteArray(Bytes.fromBigInt(tokenId))); @@ -106,11 +117,6 @@ export function handleNewMint(event: NewMintEvent): void { owner = new Owner(ownerAddress); } - if (!controller) { - // Create a new controller entity - controller = new Controller(ownerAddress); - } - if (!gitRepositoryEntity) { // Create a new gitRepository entity gitRepositoryEntity = new GitRepositoryEntity(gitRepository); @@ -136,7 +142,6 @@ export function handleNewMint(event: NewMintEvent): void { // Save entities owner.save(); - controller.save(); gitRepositoryEntity.save(); token.save(); } @@ -257,6 +262,91 @@ export function handleMetadataUpdateWithIntValue( } } +export function handleInitialized(event: InitializedEvent): void { + // This is the contract creation transaction. + log.warning('This is the contract creation transaction.', []); + if (event.receipt) { + let receipt = event.receipt as ethereum.TransactionReceipt; + log.warning('Contract address is: {}', [ + receipt.contractAddress.toHexString(), + ]); + + // add owner + let owner = new Owner(event.transaction.from); + owner.collection = true; + owner.save(); + } +} + +export function handleCollectionRoleChanged(event: CollectionRoleChangedEvent): void { + let toAddress = event.params.toAddress; + let byAddress = event.params.byAddress; + let role = event.params.role; + let status = event.params.status; + + if (role === CollectionRoles.Owner) { + // Owner role + if (status) { + // granted + let owner = Owner.load(toAddress); + if (!owner) { + owner = new Owner(toAddress); + } + owner.collection = true; + owner.save(); + } else { + // revoked + let owner = Owner.load(toAddress); + if (!owner) { + log.error('Owner entity not found. Role: {}, byAddress: {}, toAddress: {}', [role.toString(), byAddress.toHexString(), toAddress.toHexString()]); + return; + } + owner.collection = false; + owner.save(); + } + } else { + log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [role.toString(), byAddress.toHexString(), toAddress.toHexString()]); + } +} + +export function handleTokenRoleChanged(event: TokenRoleChangedEvent): void { + let tokenId = event.params.tokenId; + let toAddress = event.params.toAddress; + let byAddress = event.params.byAddress; + let role = event.params.role; + let status = event.params.status; + + // load token + let token = Token.load(Bytes.fromByteArray(Bytes.fromBigInt(tokenId))); + if (!token) { + log.error('Token not found. TokenId: {}', [tokenId.toString()]); + return; + } + + if (role === TokenRoles.Controller) { + // Controller role + // get the list of controllers. + let token_controllers = token.controllers; + if (!token_controllers) { + token_controllers = []; + } + if (status) { + // granted + token_controllers.push(toAddress); + } else { + // revoked + // remove address from the controllers list + const index = token_controllers.indexOf(event.params.toAddress, 0); + if (index > -1) { + token_controllers.splice(index, 1); + } + } + token.controllers = token_controllers; + } else { + log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [role.toString(), byAddress.toHexString(), toAddress.toHexString()]); + } +} + export function handleMetadataUpdateWithBooleanValue(event: MetadataUpdateEvent3): void { /** * accessPointAutoApproval @@ -343,7 +433,7 @@ export function handleTransfer(event: TransferEvent): void { 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.creationStatus = '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)); @@ -369,18 +459,24 @@ export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCr 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]); + switch (status) { + case 0: + accessPointEntity.creationStatus = 'DRAFT'; + break; + case 1: + accessPointEntity.creationStatus = 'APPROVED'; + break; + case 2: + accessPointEntity.creationStatus = 'REJECTED'; + break; + case 3: + accessPointEntity.creationStatus = 'REMOVED'; + break; + default: + // Unknown status + log.error('Unable to handle ChangeAccessPointCreationStatus. Unknown status. Status: {}, AccessPoint: {}', [status.toString(), event.params.apName]); } + accessPointEntity.save(); } else { // Unknown access point diff --git a/subgraph/subgraph.yaml b/subgraph/subgraph.yaml index 31c0ee3a..18753d46 100644 --- a/subgraph/subgraph.yaml +++ b/subgraph/subgraph.yaml @@ -19,9 +19,10 @@ dataSources: - NewMint - Transfer - Token - - Owner - - Controller + - TokenOwner + - TokenController - CollectionOwner + - Collection - GithubRepository - AccessPoint - ChangeAccessPointCreationStatus @@ -49,6 +50,14 @@ dataSources: handler: handleNewMint - event: Transfer(indexed address,indexed address,indexed uint256) handler: handleTransfer + - event: TokenRoleChanged(indexed uint256,indexed uint8,indexed address,bool,address) + handler: handleTokenRoleChanged + - event: TokenRolesCleared(indexed uint256,address) + handler: handleTokenRolesCleared + - event: CollectionRoleChanged(indexed uint8,indexed address,bool,address) + handler: handleCollectionRoleChanged + - event: Initialized(uint8) + handler: handleInitialized - event: ChangeAccessPointContentVerify(string,uint256,indexed bool,indexed address) handler: handleChangeAccessPointContentVerify - event: ChangeAccessPointNameVerify(string,uint256,indexed bool,indexed address) From 8e309ee04cd01a4818ee5f6ed6b1e23cc2148190 Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Tue, 7 Mar 2023 08:23:34 -0300 Subject: [PATCH 02/23] refactor: deployment script to accept argument inputs (#146) --- contracts/README.md | 22 +++++++++++++++-- contracts/hardhat.config.ts | 15 ++++++++++++ contracts/package.json | 4 +-- contracts/scripts/deploy.js | 49 ++++++++++++++++++++----------------- 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/contracts/README.md b/contracts/README.md index ad8c4b04..e4f4a56a 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -3,6 +3,7 @@ ## Folder Structure Inside contracts you are going to find: + - [contracts](./contracts): all the developed contracts - [deployments](./deployments): resultant ABI and info for deployments (each network will have a nested folder) - [lib](./lib): external modules used by Foundry @@ -23,7 +24,7 @@ The contracts present in this project are based in [Solidity](https://github.com > ⚠️ Before starting developing make sure you Solidity, Node.js and yarn correctly installed in your environment -Also, make sure you run `yarn` at the root directory to get some required tools. The rest of these steps assume you are in the [contracts folder](./). +Also, make sure you run `yarn` at the root directory to get some required tools. The rest of these steps assume you are in the [contracts folder](./). Follow the steps: @@ -153,6 +154,23 @@ $ yarn deploy:mumbai to deploy the contract on the testnet. Please note that your wallet needs to hold enough Mumbai MATIC for the deployment to be successful. To reach more in-depth information about how to deploy contract checkout [this guide](https://wiki.polygon.technology/docs/develop/alchemy). +### **Deploy arguments** + +For any of the deploy scripts above you are able to input arguments to change the date sent during the deployment. They are: + +| Argument | Description | Example | Default | +| -------------------- | ----------------------------------------- | -------------------------- | --------- | +| --new-proxy-instance | Force to deploy a new proxy instance | --new-proxy-instance | false | +| --name | The collection name | --name "Fleek NFAs" | FleekNFAs | +| --symbol | The collection symbol | --symbol "FKNFA" | FLKNFA | +| --billing | The billing values in an array of numbers | --billing "[10000, 20000]" | [] | + +Appending all of them together would be like: + +``` +$ yarn deploy:hardhat --new-proxy-instance --name "Fleek NFAs" --symbol "FKNFA" --billing "[10000, 20000]" +``` + \ No newline at end of file +--> diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index d75527ab..bfeb00f0 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -8,6 +8,8 @@ import 'hardhat-contract-sizer'; import '@openzeppelin/hardhat-upgrades'; import * as dotenv from 'dotenv'; import { HardhatUserConfig } from 'hardhat/types'; +import { task, types } from 'hardhat/config'; +import deploy from './scripts/deploy'; dotenv.config(); @@ -65,3 +67,16 @@ const config: HardhatUserConfig = { }; export default config; + +// npx hardhat deploy --network mumbai --new-proxy-instance --name "FleekNFAs" --symbol "FLKNFA" --billing "[10000, 20000]" +task('deploy', 'Deploy the contracts') + .addFlag('newProxyInstance', 'Force to deploy a new proxy instance') + .addOptionalParam('name', 'The collection name', 'FleekNFAs', types.string) + .addOptionalParam('symbol', 'The collection symbol', 'FLKNFA', types.string) + .addOptionalParam( + 'billing', + 'The billing values in an array of numbers like "[10000, 20000]"', + [], + types.json + ) + .setAction(deploy); diff --git a/contracts/package.json b/contracts/package.json index 2ef4e0d3..70ccae01 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -9,8 +9,8 @@ "test:hardhat": "hardhat test", "format": "prettier --write \"./**/*.{js,json,sol,ts}\"", "node:hardhat": "hardhat node", - "deploy:hardhat": "hardhat run scripts/deploy.js --network hardhat", - "deploy:mumbai": "hardhat run scripts/deploy.js --network mumbai", + "deploy:hardhat": "hardhat deploy --network hardhat", + "deploy:mumbai": "hardhat deploy --network mumbai", "compile": "hardhat compile", "verify:mumbai": "npx hardhat run ./scripts/verify-polyscan.js --network mumbai" }, diff --git a/contracts/scripts/deploy.js b/contracts/scripts/deploy.js index d98b3957..54f442d9 100644 --- a/contracts/scripts/deploy.js +++ b/contracts/scripts/deploy.js @@ -4,22 +4,14 @@ const { } = require('./utils/deploy-store'); const { getProxyAddress, proxyStore } = require('./utils/proxy-store'); -// --- Inputs --- -const ARGUMENTS = [ - 'FleekNFAs', // Collection name - 'FLKNFA', // Collection symbol - [], // Billing values -]; - // --- Script Settings --- const CONTRACT_NAME = 'FleekERC721'; -const NETWORK = hre.network.name; const DEFAULT_PROXY_SETTINGS = { unsafeAllow: ['external-library-linking'], }; const LIBRARIES_TO_DEPLOY = ['FleekSVG']; -const libraryDeployment = async () => { +const libraryDeployment = async (hre) => { console.log('Deploying Libraries...'); const libraries = {}; @@ -33,7 +25,7 @@ const libraryDeployment = async () => { const libContract = await hre.ethers.getContractFactory(lib); const libInstance = await libContract.deploy(); await libInstance.deployed(); - deployStore(NETWORK, lib, libInstance); + deployStore(hre.network.name, lib, libInstance); console.log(`Library "${lib}" deployed at ${libInstance.address}`); libraries[lib] = libInstance.address; } @@ -41,55 +33,70 @@ const libraryDeployment = async () => { return libraries; }; -const main = async () => { +module.exports = async (taskArgs, hre) => { + const { newProxyInstance, name, symbol, billing } = taskArgs; + const network = hre.network.name; + console.log(':: Starting Deployment ::'); - console.log('Network:', NETWORK); + console.log('Network:', network); console.log('Contract:', CONTRACT_NAME); + console.log(':: Arguments ::'); + console.log(taskArgs); + console.log(); + + const arguments = [name, symbol, billing]; - const libraries = await libraryDeployment(); + const libraries = await libraryDeployment(hre); const Contract = await ethers.getContractFactory(CONTRACT_NAME, { libraries, }); - const proxyAddress = await getProxyAddress(CONTRACT_NAME, NETWORK); + const proxyAddress = await getProxyAddress(CONTRACT_NAME, network); let deployResult; try { - if (!proxyAddress) throw new Error('No proxy address found'); + if (!proxyAddress || newProxyInstance) + throw new Error('new-proxy-instance'); console.log(`Trying to upgrade proxy contract at: "${proxyAddress}"`); deployResult = await upgrades.upgradeProxy( proxyAddress, Contract, DEFAULT_PROXY_SETTINGS ); + + console.log('\x1b[32m'); console.log( `Contract ${CONTRACT_NAME} upgraded at "${deployResult.address}" by account "${deployResult.signer.address}"` ); - await deployStore(NETWORK, CONTRACT_NAME, deployResult); + console.log('\x1b[0m'); + await deployStore(network, CONTRACT_NAME, deployResult); } catch (e) { if ( - e.message === 'No proxy address found' || + e.message === 'new-proxy-instance' || e.message.includes("doesn't look like an ERC 1967 proxy") ) { console.log(`Failed to upgrade proxy contract: "${e.message?.trim()}"`); console.log('Creating new proxy contract...'); deployResult = await upgrades.deployProxy( Contract, - ARGUMENTS, + arguments, DEFAULT_PROXY_SETTINGS ); await deployResult.deployed(); - await proxyStore(CONTRACT_NAME, deployResult.address, hre.network.name); + await proxyStore(CONTRACT_NAME, deployResult.address, network); + + console.log('\x1b[32m'); console.log( `Contract ${CONTRACT_NAME} deployed at "${deployResult.address}" by account "${deployResult.signer.address}"` ); + console.log('\x1b[0m'); } else { throw e; } try { - await deployStore(NETWORK, CONTRACT_NAME, deployResult); + await deployStore(network, CONTRACT_NAME, deployResult); } catch (e) { console.error('Could not write deploy files', e); } @@ -97,5 +104,3 @@ const main = async () => { return deployResult; }; - -main(); From e5d28251c45cb7116a4c26f572311856bcb8b837 Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Tue, 7 Mar 2023 08:03:53 -0500 Subject: [PATCH 03/23] feat: UI integrate ens dropdown (#143) * chore: get ens names from address * wip: ens validation * wip: combobox with option to add new items * chore: add trim words * chore: change order steps * chore: add comments * chore: change components test view * chore: remove unused file * chore: add alchemy-sdk as prod dependency * chore: pr comments --- subgraph/src/fleek-nfa.ts | 132 +++++++++++----- ui/package.json | 1 + ui/src/app.tsx | 4 +- ui/src/components/core/combobox/combobox.tsx | 148 +++++++++++++++--- .../core/combobox/combobox.utils.ts | 2 + ui/src/constants/env.ts | 4 + ui/src/hooks/use-debounce.ts | 15 ++ ui/src/integrations/ethereum/ethereum.ts | 31 ++++ .../ens/async-thunk/fetch-ens-names.ts | 24 +++ .../store/features/ens/async-thunk/index.ts | 1 + ui/src/store/features/ens/ens-slice.ts | 47 ++++++ ui/src/store/features/ens/index.ts | 1 + .../github/async-thunk/fetch-repositories.ts | 2 - ui/src/store/features/index.ts | 1 + ui/src/store/store.ts | 2 + .../views/components-test/components-test.tsx | 50 ++++++ ui/src/views/components-test/index.ts | 1 + ui/src/views/index.ts | 1 + .../views/mint/form-step/form.validations.ts | 12 ++ .../github-connect/github-connect-step.tsx | 51 +++--- .../github-repository-selection.tsx | 16 +- .../users-orgs-combobox.tsx | 1 + ui/src/views/mint/mint-stepper.tsx | 8 +- ui/src/views/mint/mint.context.tsx | 13 +- .../fields/ens-domain-field/ens-field.tsx | 40 +++-- ui/src/views/mint/wallet-step/wallet-step.tsx | 16 +- ui/tailwind.config.js | 3 + ui/yarn.lock | 115 +++++++++++++- 28 files changed, 602 insertions(+), 140 deletions(-) create mode 100644 ui/src/components/core/combobox/combobox.utils.ts create mode 100644 ui/src/hooks/use-debounce.ts create mode 100644 ui/src/store/features/ens/async-thunk/fetch-ens-names.ts create mode 100644 ui/src/store/features/ens/async-thunk/index.ts create mode 100644 ui/src/store/features/ens/ens-slice.ts create mode 100644 ui/src/store/features/ens/index.ts create mode 100644 ui/src/views/components-test/components-test.tsx create mode 100644 ui/src/views/components-test/index.ts create mode 100644 ui/src/views/mint/form-step/form.validations.ts diff --git a/subgraph/src/fleek-nfa.ts b/subgraph/src/fleek-nfa.ts index 80562ba9..19b84d1a 100644 --- a/subgraph/src/fleek-nfa.ts +++ b/subgraph/src/fleek-nfa.ts @@ -1,4 +1,11 @@ -import { Address, Bytes, log, store, ethereum, BigInt } from '@graphprotocol/graph-ts'; +import { + Address, + Bytes, + log, + store, + ethereum, + BigInt, +} from '@graphprotocol/graph-ts'; // Event Imports [based on the yaml config] import { @@ -35,11 +42,11 @@ import { enum CollectionRoles { Owner, -}; +} enum TokenRoles { Controller, -}; +} export function handleApproval(event: ApprovalEvent): void { let entity = new Approval( @@ -263,27 +270,29 @@ export function handleMetadataUpdateWithIntValue( } export function handleInitialized(event: InitializedEvent): void { - // This is the contract creation transaction. - log.warning('This is the contract creation transaction.', []); - if (event.receipt) { - let receipt = event.receipt as ethereum.TransactionReceipt; - log.warning('Contract address is: {}', [ - receipt.contractAddress.toHexString(), - ]); - - // add owner - let owner = new Owner(event.transaction.from); - owner.collection = true; - owner.save(); - } + // This is the contract creation transaction. + log.warning('This is the contract creation transaction.', []); + if (event.receipt) { + let receipt = event.receipt as ethereum.TransactionReceipt; + log.warning('Contract address is: {}', [ + receipt.contractAddress.toHexString(), + ]); + + // add owner + let owner = new Owner(event.transaction.from); + owner.collection = true; + owner.save(); + } } -export function handleCollectionRoleChanged(event: CollectionRoleChangedEvent): void { +export function handleCollectionRoleChanged( + event: CollectionRoleChangedEvent +): void { let toAddress = event.params.toAddress; let byAddress = event.params.byAddress; let role = event.params.role; let status = event.params.status; - + if (role === CollectionRoles.Owner) { // Owner role if (status) { @@ -298,14 +307,21 @@ export function handleCollectionRoleChanged(event: CollectionRoleChangedEvent): // revoked let owner = Owner.load(toAddress); if (!owner) { - log.error('Owner entity not found. Role: {}, byAddress: {}, toAddress: {}', [role.toString(), byAddress.toHexString(), toAddress.toHexString()]); + log.error( + 'Owner entity not found. Role: {}, byAddress: {}, toAddress: {}', + [role.toString(), byAddress.toHexString(), toAddress.toHexString()] + ); return; } owner.collection = false; owner.save(); } } else { - log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [role.toString(), byAddress.toHexString(), toAddress.toHexString()]); + log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [ + role.toString(), + byAddress.toHexString(), + toAddress.toHexString(), + ]); } } @@ -315,13 +331,13 @@ export function handleTokenRoleChanged(event: TokenRoleChangedEvent): void { let byAddress = event.params.byAddress; let role = event.params.role; let status = event.params.status; - + // load token let token = Token.load(Bytes.fromByteArray(Bytes.fromBigInt(tokenId))); if (!token) { log.error('Token not found. TokenId: {}', [tokenId.toString()]); return; - } + } if (role === TokenRoles.Controller) { // Controller role @@ -343,11 +359,17 @@ export function handleTokenRoleChanged(event: TokenRoleChangedEvent): void { } token.controllers = token_controllers; } else { - log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [role.toString(), byAddress.toHexString(), toAddress.toHexString()]); + log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [ + role.toString(), + byAddress.toHexString(), + toAddress.toHexString(), + ]); } } -export function handleMetadataUpdateWithBooleanValue(event: MetadataUpdateEvent3): void { +export function handleMetadataUpdateWithBooleanValue( + event: MetadataUpdateEvent3 +): void { /** * accessPointAutoApproval */ @@ -364,7 +386,9 @@ export function handleMetadataUpdateWithBooleanValue(event: MetadataUpdateEvent3 entity.save(); - let token = Token.load(Bytes.fromByteArray(Bytes.fromBigInt(event.params._tokenId))); + let token = Token.load( + Bytes.fromByteArray(Bytes.fromBigInt(event.params._tokenId)) + ); if (token) { if (event.params.key == 'accessPointAutoApproval') { @@ -420,14 +444,13 @@ 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 { + * 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); @@ -435,7 +458,9 @@ export function handleTransfer(event: TransferEvent): void { accessPointEntity.nameVerified = false; accessPointEntity.creationStatus = '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)); + accessPointEntity.token = Bytes.fromByteArray( + Bytes.fromBigInt(event.params.tokenId) + ); // Load / Create an Owner entity let ownerEntity = Owner.load(event.params.owner); @@ -453,7 +478,9 @@ export function handleTransfer(event: TransferEvent): void { /** * This handler will update the status of an access point entity. */ -export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCreationStatusEvent): void { +export function handleChangeAccessPointCreationStatus( + event: ChangeAccessPointCreationStatusEvent +): void { // Load the AccessPoint entity let accessPointEntity = AccessPoint.load(event.params.apName); let status = event.params.status; @@ -474,20 +501,28 @@ export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCr break; default: // Unknown status - log.error('Unable to handle ChangeAccessPointCreationStatus. Unknown status. Status: {}, AccessPoint: {}', [status.toString(), event.params.apName]); + 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]); + 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 { +export function handleChangeAccessPointScore( + event: ChangeAccessPointCreationScoreEvent +): void { // Load the AccessPoint entity let accessPointEntity = AccessPoint.load(event.params.apName); @@ -496,14 +531,19 @@ export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCr accessPointEntity.save(); } else { // Unknown access point - log.error('Unable to handle ChangeAccessPointScore. Unknown access point. Score: {}, AccessPoint: {}', [event.params.score.toString(), event.params.apName]); + 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 { +export function handleChangeAccessPointNameVerify( + event: ChangeAccessPointNameVerifyEvent +): void { // Load the AccessPoint entity let accessPointEntity = AccessPoint.load(event.params.apName); @@ -512,14 +552,19 @@ export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCr accessPointEntity.save(); } else { // Unknown access point - log.error('Unable to handle ChangeAccessPointNameVerify. Unknown access point. Verified: {}, AccessPoint: {}', [event.params.verified.toString(), event.params.apName]); + 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 { +export function handleChangeAccessPointContentVerify( + event: ChangeAccessPointContentVerifyEvent +): void { // Load the AccessPoint entity let accessPointEntity = AccessPoint.load(event.params.apName); @@ -528,6 +573,9 @@ export function handleChangeAccessPointCreationStatus(event: ChangeAccessPointCr accessPointEntity.save(); } else { // Unknown access point - log.error('Unable to handle ChangeAccessPointContentVerify. Unknown access point. Verified: {}, AccessPoint: {}', [event.params.verified.toString(), event.params.apName]); + log.error( + 'Unable to handle ChangeAccessPointContentVerify. Unknown access point. Verified: {}, AccessPoint: {}', + [event.params.verified.toString(), event.params.apName] + ); } } diff --git a/ui/package.json b/ui/package.json index d71dbb38..8cf4965e 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,6 +21,7 @@ "@reduxjs/toolkit": "^1.9.1", "@stitches/react": "^1.2.8", "abitype": "^0.5.0", + "alchemy-sdk": "^2.5.0", "colorthief": "^2.3.2", "connectkit": "^1.1.3", "firebase": "^9.17.1", diff --git a/ui/src/app.tsx b/ui/src/app.tsx index f75b169b..2d08bf1a 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,6 +1,6 @@ import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom'; import { themeGlobals } from '@/theme/globals'; -import { Home, Mint } from './views'; +import { ComponentsTest, Home, Mint } from './views'; import { SVGTestScreen } from './views/svg-test'; // TODO: remove when done import { ConnectKitButton } from 'connectkit'; import { MintTest } from './views/mint-test'; @@ -18,6 +18,8 @@ export const App = () => { } /> } /> } /> + {/** TODO remove for release */} + } /> } /> } /> diff --git a/ui/src/components/core/combobox/combobox.tsx b/ui/src/components/core/combobox/combobox.tsx index e7f276a1..e688b183 100644 --- a/ui/src/components/core/combobox/combobox.tsx +++ b/ui/src/components/core/combobox/combobox.tsx @@ -1,39 +1,60 @@ -import React, { Fragment, useRef, useState } from 'react'; +import React, { Fragment, useEffect, useRef, useState } from 'react'; import { Combobox as ComboboxLib, Transition } from '@headlessui/react'; -import { Icon } from '@/components/core/icon'; +import { Icon, IconName } from '@/components/core/icon'; import { Flex } from '@/components/layout'; +import { useDebounce } from '@/hooks/use-debounce'; +import { Separator } from '../separator.styles'; +import { cleanString } from './combobox.utils'; type ComboboxInputProps = { + /** + * If it's true, the list of options will be displayed + */ open: boolean; + /** + * Name of the left icon to display in the input + */ + leftIcon: IconName; + /** + * Function to handle the input change + */ handleInputChange: (event: React.ChangeEvent) => void; + /** + * Function to handle the input click. When the user clicks on the input, the list of options will be displayed + */ handleInputClick: () => void; }; const ComboboxInput = ({ open, + leftIcon, handleInputChange, handleInputClick, }: ComboboxInputProps) => (
selectedValue.label} onChange={handleInputChange} onClick={handleInputClick} /> + + +
); @@ -52,9 +73,13 @@ const ComboboxOption = ({ option }: ComboboxOptionProps) => ( > {({ selected, active }) => ( - + {option.icon} - + {option.label} @@ -73,38 +98,97 @@ export const NoResults = ({ css }: { css?: string }) => ( ); export type ComboboxItem = { + /** + * The key of the item. + */ value: string; + /** + * The label to display of the item. + */ label: string; + /** + * Optional icon to display on the left of the item. + */ icon?: React.ReactNode; }; export type ComboboxProps = { + /** + * List of items to be displayed in the combobox. + */ items: ComboboxItem[]; + /** + * The selected value of the combobox. + */ selectedValue: ComboboxItem | undefined; + /** + * If true, the combobox will add the input if it doesn't exist in the list of items. + */ + withAutocomplete?: boolean; + /** + * Name of the left icon to display in the input. Defualt is "search". + */ + leftIcon?: IconName; + /** + * Callback when the selected value changes. + */ onChange(option: ComboboxItem): void; }; export const Combobox: React.FC = ({ items, selectedValue = { value: '', label: '' }, + withAutocomplete = false, + leftIcon = 'search', onChange, }) => { - const [query, setQuery] = useState(''); + const [filteredItems, setFilteredItems] = useState([]); + const [autocompleteItems, setAutocompleteItems] = useState( + [] + ); + + useEffect(() => { + // If the selected value doesn't exist in the list of items, we add it + if ( + items.filter((item) => item === selectedValue).length === 0 && + selectedValue.value !== undefined && + autocompleteItems.length === 0 && + withAutocomplete + ) { + setAutocompleteItems([selectedValue]); + } + }, [selectedValue]); + + useEffect(() => { + setFilteredItems(items); + }, [items]); const buttonRef = useRef(null); - const filteredItems = - query === '' - ? items - : items.filter((person) => - person.label - .toLowerCase() - .replace(/\s+/g, '') - .includes(query.toLowerCase().replace(/\s+/g, '')) - ); + const handleSearch = useDebounce((searchValue: string) => { + if (searchValue === '') { + setFilteredItems(items); + + if (withAutocomplete) { + setAutocompleteItems([]); + handleComboboxChange({} as ComboboxItem); + } + } else { + const filteredValues = items.filter((item) => + cleanString(item.label).startsWith(cleanString(searchValue)) + ); + + if (withAutocomplete && filteredValues.length === 0) { + // If the search value doesn't exist in the list of items, we add it + setAutocompleteItems([{ value: searchValue, label: searchValue }]); + } + setFilteredItems(filteredValues); + } + }, 200); const handleInputChange = (event: React.ChangeEvent) => { - setQuery(event.target.value); + event.stopPropagation(); + handleSearch(event.target.value); }; const handleInputClick = () => { @@ -116,7 +200,11 @@ export const Combobox: React.FC = ({ }; const handleLeaveTransition = () => { - setQuery(''); + setFilteredItems(items); + if (selectedValue.value === undefined && withAutocomplete) { + setAutocompleteItems([]); + handleComboboxChange({} as ComboboxItem); + } }; return ( @@ -131,6 +219,7 @@ export const Combobox: React.FC = ({ handleInputChange={handleInputChange} handleInputClick={handleInputClick} open={open} + leftIcon={leftIcon} /> @@ -144,12 +233,25 @@ export const Combobox: React.FC = ({ afterLeave={handleLeaveTransition} > - {filteredItems.length === 0 && query !== '' ? ( + {[...autocompleteItems, ...filteredItems].length === 0 || + filteredItems === undefined ? ( ) : ( - filteredItems.map((option: ComboboxItem) => { - return ; - }) + <> + {autocompleteItems.length > 0 && Create new} + {autocompleteItems.map((autocompleteOption: ComboboxItem) => ( + + ))} + {autocompleteItems.length > 0 && filteredItems.length > 0 && ( + + )} + {filteredItems.map((option: ComboboxItem) => ( + + ))} + )} diff --git a/ui/src/components/core/combobox/combobox.utils.ts b/ui/src/components/core/combobox/combobox.utils.ts new file mode 100644 index 00000000..2b4de14b --- /dev/null +++ b/ui/src/components/core/combobox/combobox.utils.ts @@ -0,0 +1,2 @@ +export const cleanString = (str: string) => + str.toLowerCase().replace(/\s+/g, ''); diff --git a/ui/src/constants/env.ts b/ui/src/constants/env.ts index a3a470db..12ba134d 100644 --- a/ui/src/constants/env.ts +++ b/ui/src/constants/env.ts @@ -3,6 +3,10 @@ export const env = Object.freeze({ id: import.meta.env.VITE_ALCHEMY_API_KEY || '', appName: import.meta.env.VITE_ALCHEMY_APP_NAME || '', }, + ens: { + contractAddress: import.meta.env.VITE_ENS_ADDRESS || '', + validationEnsURL: import.meta.env.VITE_ENS_VALIDATION_URL || '', + }, firebase: { apiKey: import.meta.env.VITE_FIREBASE_API_KEY || '', authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN || '', diff --git a/ui/src/hooks/use-debounce.ts b/ui/src/hooks/use-debounce.ts new file mode 100644 index 00000000..75283992 --- /dev/null +++ b/ui/src/hooks/use-debounce.ts @@ -0,0 +1,15 @@ +import { useRef } from 'react'; + +export const useDebounce = void>( + f: F, + t = 500 +) => { + const timeOutRef = useRef(); + + return (...args: A) => { + timeOutRef.current && clearTimeout(timeOutRef.current); + timeOutRef.current = setTimeout(() => { + f(...args); + }, t); + }; +}; diff --git a/ui/src/integrations/ethereum/ethereum.ts b/ui/src/integrations/ethereum/ethereum.ts index c61b16f1..cb2ae65c 100644 --- a/ui/src/integrations/ethereum/ethereum.ts +++ b/ui/src/integrations/ethereum/ethereum.ts @@ -1,8 +1,18 @@ import { JsonRpcProvider, Networkish } from '@ethersproject/providers'; import { ethers } from 'ethers'; import * as Contracts from './contracts'; +import { env } from '@/constants'; +import { Alchemy, Network } from 'alchemy-sdk'; + +const config = { + apiKey: env.alchemy.id, + network: Network.ETH_MAINNET, +}; + +const alchemy = new Alchemy(config); export const Ethereum: Ethereum.Core = { + //TODO remove defaultNetwork: 'https://rpc-mumbai.maticvigil.com', // TODO: make it environment variable provider: { @@ -20,6 +30,23 @@ export const Ethereum: Ethereum.Core = { return new ethers.Contract(contract.address, contract.abi, provider); }, + + async getEnsName(address) { + const ensAddresses = await alchemy.nft.getNftsForOwner(address, { + contractAddresses: [env.ens.contractAddress], + }); + + return ensAddresses.ownedNfts.map((nft) => nft.title); + }, + + //TODO remove if we're not gonna validate ens on the client side + async validateEnsName(name) { + const provider = new ethers.providers.JsonRpcProvider( + env.ens.validationEnsURL + ); + + return Boolean(await provider.resolveName(name)); + }, }; export namespace Ethereum { @@ -36,5 +63,9 @@ export namespace Ethereum { contractName: keyof typeof Contracts, providerName?: Providers ) => ethers.Contract; + + getEnsName: (address: string) => Promise; + + validateEnsName: (name: string) => Promise; }; } diff --git a/ui/src/store/features/ens/async-thunk/fetch-ens-names.ts b/ui/src/store/features/ens/async-thunk/fetch-ens-names.ts new file mode 100644 index 00000000..be87bebb --- /dev/null +++ b/ui/src/store/features/ens/async-thunk/fetch-ens-names.ts @@ -0,0 +1,24 @@ +import { Ethereum } from '@/integrations'; +import { RootState } from '@/store'; +import { createAsyncThunk } from '@reduxjs/toolkit'; +import { ensActions } from '../ens-slice'; + +export const fetchEnsNamesThunk = createAsyncThunk( + 'ens/fetchEnsNames', + async (address, { dispatch, getState }) => { + const { state } = (getState() as RootState).ens; + if (state === 'loading') return; + + try { + dispatch(ensActions.setState('loading')); + + //fetch ens names for received addresses + const ensList = await Ethereum.getEnsName(address); + + dispatch(ensActions.setEnsNames(ensList)); + } catch (error) { + console.log(error); + dispatch(ensActions.setState('failed')); + } + } +); diff --git a/ui/src/store/features/ens/async-thunk/index.ts b/ui/src/store/features/ens/async-thunk/index.ts new file mode 100644 index 00000000..e08e73ad --- /dev/null +++ b/ui/src/store/features/ens/async-thunk/index.ts @@ -0,0 +1 @@ +export * from './fetch-ens-names'; diff --git a/ui/src/store/features/ens/ens-slice.ts b/ui/src/store/features/ens/ens-slice.ts new file mode 100644 index 00000000..0a9279d9 --- /dev/null +++ b/ui/src/store/features/ens/ens-slice.ts @@ -0,0 +1,47 @@ +import { RootState, useAppSelector } from '@/store'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import * as asyncThunk from './async-thunk'; + +export namespace EnsState { + export type State = 'idle' | 'loading' | 'success' | 'failed'; + + export type EnsNames = string[]; +} + +export interface EnsState { + state: EnsState.State; + ensNames: EnsState.EnsNames; +} + +const initialState: EnsState = { + state: 'idle', + ensNames: [], +}; + +export const ensSlice = createSlice({ + name: 'ens', + initialState, + reducers: { + setEnsNames: (state, action: PayloadAction) => { + state.ensNames = action.payload; + state.state = 'success'; + }, + setState: ( + state, + action: PayloadAction> + ) => { + state.state = action.payload; + }, + }, +}); + +export const ensActions = { + ...ensSlice.actions, + ...asyncThunk, +}; + +const selectEnsState = (state: RootState): EnsState => state.ens; + +export const useEnsStore = (): EnsState => useAppSelector(selectEnsState); + +export default ensSlice.reducer; diff --git a/ui/src/store/features/ens/index.ts b/ui/src/store/features/ens/index.ts new file mode 100644 index 00000000..c58c438d --- /dev/null +++ b/ui/src/store/features/ens/index.ts @@ -0,0 +1 @@ +export * from './ens-slice'; diff --git a/ui/src/store/features/github/async-thunk/fetch-repositories.ts b/ui/src/store/features/github/async-thunk/fetch-repositories.ts index 152b1099..f153e36e 100644 --- a/ui/src/store/features/github/async-thunk/fetch-repositories.ts +++ b/ui/src/store/features/github/async-thunk/fetch-repositories.ts @@ -16,8 +16,6 @@ export const fetchRepositoriesThunk = createAsyncThunk( const repositories = await githubClient.fetchRepos(url); - console.log(repositories); - dispatch( githubActions.setRepositories( repositories.map((repo: any) => ({ diff --git a/ui/src/store/features/index.ts b/ui/src/store/features/index.ts index 8e3e83ee..a5876255 100644 --- a/ui/src/store/features/index.ts +++ b/ui/src/store/features/index.ts @@ -1 +1,2 @@ export * from './github'; +export * from './ens'; diff --git a/ui/src/store/store.ts b/ui/src/store/store.ts index 0a9377f2..f86bae73 100644 --- a/ui/src/store/store.ts +++ b/ui/src/store/store.ts @@ -1,9 +1,11 @@ import { configureStore } from '@reduxjs/toolkit'; import githubReducer from './features/github/github-slice'; +import ensReducer from './features/ens/ens-slice'; export const store = configureStore({ reducer: { github: githubReducer, + ens: ensReducer, }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ diff --git a/ui/src/views/components-test/components-test.tsx b/ui/src/views/components-test/components-test.tsx new file mode 100644 index 00000000..a3871e1a --- /dev/null +++ b/ui/src/views/components-test/components-test.tsx @@ -0,0 +1,50 @@ +import { Combobox, ComboboxItem, Flex } from '@/components'; +import { useState } from 'react'; + +const itemsCombobox = [ + { label: 'Item 1', value: 'item-1' }, + { label: 'Item 2', value: 'item-2' }, + { label: 'Item 3', value: 'item-3' }, +]; + +export const ComponentsTest = () => { + const [selectedValue, setSelectedValue] = useState({} as ComboboxItem); + const [selectedValueAutocomplete, setSelectedValueAutocomplete] = useState( + {} as ComboboxItem + ); + + const handleComboboxChange = (item: ComboboxItem) => { + setSelectedValue(item); + }; + + const handleComboboxChangeAutocomplete = (item: ComboboxItem) => { + setSelectedValueAutocomplete(item); + }; + + return ( + +

Components Test

+ + + + +
+ ); +}; diff --git a/ui/src/views/components-test/index.ts b/ui/src/views/components-test/index.ts new file mode 100644 index 00000000..689ba78b --- /dev/null +++ b/ui/src/views/components-test/index.ts @@ -0,0 +1 @@ +export * from './components-test'; diff --git a/ui/src/views/index.ts b/ui/src/views/index.ts index 75899f1b..6319a92a 100644 --- a/ui/src/views/index.ts +++ b/ui/src/views/index.ts @@ -1,3 +1,4 @@ export * from './home'; export * from './mint'; export * from './svg-test'; +export * from './components-test'; diff --git a/ui/src/views/mint/form-step/form.validations.ts b/ui/src/views/mint/form-step/form.validations.ts new file mode 100644 index 00000000..9241fb76 --- /dev/null +++ b/ui/src/views/mint/form-step/form.validations.ts @@ -0,0 +1,12 @@ +import { Ethereum } from '@/integrations'; + +//TODO remove if we're not gonna validate ens on the client side +export const validateEnsField = async ( + ensName: string, + setError: (message: string) => void +) => { + const isValid = await Ethereum.validateEnsName(ensName); + if (!isValid) setError('Invalid ENS name'); + else setError(''); + return isValid; +}; diff --git a/ui/src/views/mint/github-step/steps/github-connect/github-connect-step.tsx b/ui/src/views/mint/github-step/steps/github-connect/github-connect-step.tsx index 9ccc4255..c9c8ce59 100644 --- a/ui/src/views/mint/github-step/steps/github-connect/github-connect-step.tsx +++ b/ui/src/views/mint/github-step/steps/github-connect/github-connect-step.tsx @@ -1,30 +1,25 @@ -import { Card, Grid, Icon, IconButton } from '@/components'; +import { Card, Grid, Stepper } from '@/components'; +import { MintCardHeader } from '@/views/mint/mint-card'; import { GithubButton } from './github-button'; -export const GithubConnect: React.FC = () => ( - - } - /> - } - /> - - - - - - After connecting your GitHub, your repositories will show here. - - - - - -); +export const GithubConnect: React.FC = () => { + const { prevStep } = Stepper.useContext(); + + return ( + + + + + + + + After connecting your GitHub, your repositories will show here. + + + + + + ); +}; diff --git a/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx b/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx index ce79f9de..7b906bdc 100644 --- a/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx +++ b/ui/src/views/mint/github-step/steps/github-repository-selection/github-repository-selection.tsx @@ -1,9 +1,10 @@ import { Card, ComboboxItem, Flex, Grid, Icon, Spinner } from '@/components'; import { Input } from '@/components/core/input'; +import { useDebounce } from '@/hooks/use-debounce'; import { useGithubStore } from '@/store'; import { MintCardHeader } from '@/views/mint/mint-card'; import { Mint } from '@/views/mint/mint.context'; -import React, { forwardRef, useRef, useState } from 'react'; +import React, { forwardRef, useState } from 'react'; import { RepositoriesList } from './repositories-list'; import { UserOrgsCombobox } from './users-orgs-combobox'; @@ -46,14 +47,15 @@ export const GithubRepositoryConnection: React.FC = () => { const { setGithubStep, setSelectedUserOrg } = Mint.useContext(); - const timeOutRef = useRef(); + const setSearchValueDebounced = useDebounce( + (event: React.ChangeEvent) => + setSearchValue(event.target.value), + 500 + ); const handleSearchChange = (event: React.ChangeEvent) => { event.stopPropagation(); - timeOutRef.current && clearTimeout(timeOutRef.current); - timeOutRef.current = setTimeout(() => { - setSearchValue(event.target.value); - }, 500); + setSearchValueDebounced(event); }; const handlePrevStepClick = () => { @@ -73,7 +75,7 @@ export const GithubRepositoryConnection: React.FC = () => {
diff --git a/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx b/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx index c5fb89bb..8cd591d7 100644 --- a/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx +++ b/ui/src/views/mint/github-step/steps/github-repository-selection/users-orgs-combobox.tsx @@ -43,6 +43,7 @@ export const UserOrgsCombobox = () => { )} selectedValue={selectedUserOrg} onChange={handleUserOrgChange} + leftIcon="github" /> ); }; diff --git a/ui/src/views/mint/mint-stepper.tsx b/ui/src/views/mint/mint-stepper.tsx index 11967815..454e0dc4 100644 --- a/ui/src/views/mint/mint-stepper.tsx +++ b/ui/src/views/mint/mint-stepper.tsx @@ -10,14 +10,14 @@ export const MintStepper = () => { - - + + - - + + diff --git a/ui/src/views/mint/mint.context.tsx b/ui/src/views/mint/mint.context.tsx index fc2894e3..07c57b83 100644 --- a/ui/src/views/mint/mint.context.tsx +++ b/ui/src/views/mint/mint.context.tsx @@ -15,9 +15,10 @@ export type MintContext = { appDescription: string; appLogo: string; logoColor: string; - ens: DropdownItem; + ens: ComboboxItem; domain: string; verifyNFA: boolean; + ensError: string; setGithubStep: (step: number) => void; setNfaStep: (step: number) => void; setSelectedUserOrg: (userOrg: ComboboxItem) => void; @@ -28,9 +29,10 @@ export type MintContext = { setAppDescription: (description: string) => void; setAppLogo: (logo: string) => void; setLogoColor: (color: string) => void; - setEns: (ens: DropdownItem) => void; + setEns: (ens: ComboboxItem) => void; setDomain: (domain: string) => void; setVerifyNFA: (verify: boolean) => void; + setEnsError: (error: string) => void; }; const [MintProvider, useContext] = createContext({ @@ -62,10 +64,13 @@ export abstract class Mint { const [appDescription, setAppDescription] = useState(''); const [appLogo, setAppLogo] = useState(''); const [logoColor, setLogoColor] = useState(''); - const [ens, setEns] = useState({} as DropdownItem); + const [ens, setEns] = useState({} as ComboboxItem); const [domain, setDomain] = useState(''); const [verifyNFA, setVerifyNFA] = useState(true); + //Field validations + const [ensError, setEnsError] = useState(''); + const setGithubStep = (step: number): void => { if (step > 0 && step <= 3) { setGithubStepContext(step); @@ -88,6 +93,7 @@ export abstract class Mint { ens, domain, verifyNFA, + ensError, setSelectedUserOrg, setGithubStep, setNfaStep, @@ -101,6 +107,7 @@ export abstract class Mint { setEns, setDomain, setVerifyNFA, + setEnsError, }} > { - const { ens, setEns } = Mint.useContext(); + const { ens, ensError, setEns } = Mint.useContext(); + const { state, ensNames } = useEnsStore(); + const dispatch = useAppDispatch(); + const { address } = useAccount(); + + if (state === 'idle' && address) { + dispatch(ensActions.fetchEnsNamesThunk(address)); + } - const handleEnsChange = (item: DropdownItem) => { + const handleEnsChange = (item: ComboboxItem) => { setEns(item); }; return ( ENS - ({ + label: ens, + value: ens, + }))} selectedValue={ens} onChange={handleEnsChange} + withAutocomplete /> + {ensError && {ensError}} ); }; diff --git a/ui/src/views/mint/wallet-step/wallet-step.tsx b/ui/src/views/mint/wallet-step/wallet-step.tsx index 5cf7cbdf..c89df1b9 100644 --- a/ui/src/views/mint/wallet-step/wallet-step.tsx +++ b/ui/src/views/mint/wallet-step/wallet-step.tsx @@ -1,12 +1,20 @@ -import { Button, Card, Grid, Icon, Stepper } from '@/components'; -import { MintCardHeader } from '../mint-card'; +import { Card, Grid, Icon, IconButton } from '@/components'; import { ConnectWalletButton } from './connect-wallet-button'; export const WalletStep = () => { - const { prevStep } = Stepper.useContext(); return ( - + } + /> + } + /> diff --git a/ui/tailwind.config.js b/ui/tailwind.config.js index 0e6b1213..bb7ae2b4 100644 --- a/ui/tailwind.config.js +++ b/ui/tailwind.config.js @@ -18,6 +18,9 @@ module.exports = { borderRadius: { xhl: '1.25rem', }, + maxWidth: { + 70: '70%', + }, space: { '1h': '0.375rem', }, diff --git a/ui/yarn.lock b/ui/yarn.lock index 4db5e045..f0623a1a 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1415,7 +1415,7 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -1518,7 +1518,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.0", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -1617,7 +1617,7 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/units@5.7.0": +"@ethersproject/units@5.7.0", "@ethersproject/units@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== @@ -1626,7 +1626,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -5373,6 +5373,26 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" +alchemy-sdk@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/alchemy-sdk/-/alchemy-sdk-2.5.0.tgz#20813b02eded16e9cbc56c5fc8259684dc324eb9" + integrity sha512-pgwyPiAmUp4uaBkkpdnlHxjB7yjeO88VhIIFo5aCiuPAxgpB5nKRqBQw2XXqiZEUF4xU1ybZ2s1ESQ6k/hc2MQ== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@ethersproject/units" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" + "@ethersproject/web" "^5.7.0" + axios "^0.26.1" + sturdy-websocket "^0.2.1" + websocket "^1.0.34" + ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -5756,6 +5776,13 @@ axios@^0.21.0: dependencies: follow-redirects "^1.14.0" +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + babel-loader@^8.0.0, babel-loader@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" @@ -7086,6 +7113,14 @@ cyclist@^1.0.1: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A== +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -7716,11 +7751,29 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + es5-shim@^4.5.13: version "4.6.7" resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.7.tgz#bc67ae0fc3dd520636e0a1601cc73b450ad3e955" integrity sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ== +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -7738,6 +7791,14 @@ es6-shim@^0.35.5: resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.7.tgz#db00f1cbb7d4de70b50dcafa45b157e9ba28f5d2" integrity sha512-baZkUfTDSx7X69+NA8imbvGrsPfqH0MX7ADdIDjqwsI8lkTgLIiD2QWrUCSGsUQ0YMnSCA/4pNgSyXdnLHWf3A== +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + esbuild-android-64@0.15.18: version "0.15.18" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5" @@ -8347,6 +8408,13 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -8667,7 +8735,7 @@ focus-lock@^0.8.0: dependencies: tslib "^1.9.3" -follow-redirects@^1.14.0: +follow-redirects@^1.14.0, follow-redirects@^1.14.8: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -11288,6 +11356,11 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -13951,6 +14024,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +sturdy-websocket@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/sturdy-websocket/-/sturdy-websocket-0.2.1.tgz#20a58fd53372ef96eaa08f3c61c91a10b07c7c05" + integrity sha512-NnzSOEKyv4I83qbuKw9ROtJrrT6Z/Xt7I0HiP/e6H6GnpeTDvzwGIGeJ8slai+VwODSHQDooW2CAilJwT9SpRg== + style-loader@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" @@ -14466,6 +14544,16 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -15111,6 +15199,18 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +websocket@^1.0.34: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -15303,6 +15403,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" From e74e5595da848222c22f2bca03dc88d4b654c44e Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Tue, 7 Mar 2023 10:28:31 -0300 Subject: [PATCH 04/23] feat: add verifier role (#148) * feat: add verifier collection role * refactor: apply verifier role to verify ap functions * test: hardhat tests for verifier role * refactor: grant verifier role for deployer * test: foundry tests for verifier role * test: fix fixture after changing deployer to be verifier * test: change token owner to match connected account on verifier role check --- contracts/contracts/FleekAccessControl.sol | 4 +- contracts/contracts/FleekERC721.sol | 8 +- .../foundry/FleekERC721/AccessControl.t.sol | 172 +++++++++++++++++- .../AccessPointsAutoApprovalOff.t.sol | 6 +- .../AccessPointsAutoApprovalOn.t.sol | 6 +- .../access-points-autoapproval-off.t.ts | 2 + .../FleekERC721/collection-roles.t.ts | 35 ++++ .../FleekERC721/helpers/constants.ts | 1 + 8 files changed, 216 insertions(+), 18 deletions(-) diff --git a/contracts/contracts/FleekAccessControl.sol b/contracts/contracts/FleekAccessControl.sol index f6937535..deb4d7f4 100644 --- a/contracts/contracts/FleekAccessControl.sol +++ b/contracts/contracts/FleekAccessControl.sol @@ -14,7 +14,8 @@ contract FleekAccessControl is Initializable { * @dev All available collection roles. */ enum CollectionRoles { - Owner + Owner, + Verifier } /** @@ -78,6 +79,7 @@ contract FleekAccessControl is Initializable { */ function __FleekAccessControl_init() internal onlyInitializing { _grantCollectionRole(CollectionRoles.Owner, msg.sender); + _grantCollectionRole(CollectionRoles.Verifier, msg.sender); } /** diff --git a/contracts/contracts/FleekERC721.sol b/contracts/contracts/FleekERC721.sol index 776d6b45..b049d024 100644 --- a/contracts/contracts/FleekERC721.sol +++ b/contracts/contracts/FleekERC721.sol @@ -604,13 +604,13 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl * Requirements: * * - the AP must exist. - * - the sender must have the token controller role. + * - the sender must have collection verifier role. * */ function setAccessPointContentVerify( string memory apName, bool verified - ) public requireAP(apName) requireTokenRole(_accessPoints[apName].tokenId, TokenRoles.Controller) { + ) public requireAP(apName) requireCollectionRole(CollectionRoles.Verifier) { _accessPoints[apName].contentVerified = verified; emit ChangeAccessPointContentVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender); } @@ -623,13 +623,13 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl * Requirements: * * - the AP must exist. - * - the sender must have the token controller role. + * - the sender must have collection verifier role. * */ function setAccessPointNameVerify( string memory apName, bool verified - ) public requireAP(apName) requireTokenRole(_accessPoints[apName].tokenId, TokenRoles.Controller) { + ) public requireAP(apName) requireCollectionRole(CollectionRoles.Verifier) { _accessPoints[apName].nameVerified = verified; emit ChangeAccessPointNameVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender); } diff --git a/contracts/test/foundry/FleekERC721/AccessControl.t.sol b/contracts/test/foundry/FleekERC721/AccessControl.t.sol index 17416982..961ef3ed 100644 --- a/contracts/test/foundry/FleekERC721/AccessControl.t.sol +++ b/contracts/test/foundry/FleekERC721/AccessControl.t.sol @@ -19,6 +19,7 @@ contract Test_FleekERC721_AccessControlAssertions is Test { contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC721_AccessControlAssertions { uint256 internal tokenId; address internal collectionOwner = address(100); + address internal collectionVerifier = address(101); address internal tokenOwner = address(200); address internal tokenController = address(300); address internal anyAddress = address(400); @@ -28,6 +29,8 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 // Set collectionOwner CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Owner, collectionOwner); + // Set collectionVerifier + CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Verifier, collectionVerifier); // Mint to tokenOwner to set tokenOwner mintDefault(tokenOwner); // Set tokenController to minted token @@ -36,20 +39,33 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 } function test_setUp() public { + // Check deployer + assertTrue(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, deployer)); + assertTrue(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Verifier, deployer)); + // Check collectionOwner assertTrue(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, collectionOwner)); + assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Verifier, collectionOwner)); assertFalse(CuT.ownerOf(tokenId) == collectionOwner); assertFalse(CuT.hasTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, collectionOwner)); + // Check collectionVerifier + assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, collectionVerifier)); + assertTrue(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Verifier, collectionVerifier)); + assertFalse(CuT.ownerOf(tokenId) == collectionVerifier); + assertFalse(CuT.hasTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, collectionVerifier)); // Check tokenOwner assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, tokenOwner)); + assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Verifier, tokenOwner)); assertTrue(CuT.ownerOf(tokenId) == tokenOwner); assertFalse(CuT.hasTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, tokenOwner)); // Check tokenController assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, tokenController)); + assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Verifier, tokenController)); assertFalse(CuT.ownerOf(tokenId) == tokenController); assertTrue(CuT.hasTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, tokenController)); // Check anyAddress assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, anyAddress)); + assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Verifier, anyAddress)); assertFalse(CuT.ownerOf(tokenId) == anyAddress); assertFalse(CuT.hasTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, anyAddress)); } @@ -65,6 +81,14 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 assertFalse(CuT.hasCollectionRole(FleekAccessControl.CollectionRoles.Owner, randomAddress)); vm.stopPrank(); + // CollectionVerifier + vm.startPrank(collectionVerifier); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Owner, randomAddress); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.revokeCollectionRole(FleekAccessControl.CollectionRoles.Owner, randomAddress); + vm.stopPrank(); + // TokenOwner vm.startPrank(tokenOwner); expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); @@ -101,6 +125,14 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 CuT.revokeTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, randomAddress); vm.stopPrank(); + // CollectionVerifier + vm.startPrank(collectionVerifier); + expectRevertWithMustBeTokenOwner(tokenId); + CuT.grantTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, randomAddress); + expectRevertWithMustBeTokenOwner(tokenId); + CuT.revokeTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, randomAddress); + vm.stopPrank(); + // TokenOwner vm.startPrank(tokenOwner); CuT.grantTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, randomAddress); @@ -147,6 +179,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenExternalURL(tokenId, externalURL); + // VerifierRole + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenExternalURL(tokenId, externalURL); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenExternalURL(tokenId, externalURL); @@ -169,6 +206,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenENS(tokenId, ens); + // VerifierRole + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenENS(tokenId, ens); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenENS(tokenId, ens); @@ -191,6 +233,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenName(tokenId, name); + // VerifierRole + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenName(tokenId, name); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenName(tokenId, name); @@ -213,6 +260,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenDescription(tokenId, description); + // VerifierRole + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenDescription(tokenId, description); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenDescription(tokenId, description); @@ -235,6 +287,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenLogo(tokenId, logo); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenLogo(tokenId, logo); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenLogo(tokenId, logo); @@ -257,6 +314,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenColor(tokenId, color); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenColor(tokenId, color); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenColor(tokenId, color); @@ -280,6 +342,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenLogoAndColor(tokenId, logo, color); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenLogoAndColor(tokenId, logo, color); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenLogoAndColor(tokenId, logo, color); @@ -303,6 +370,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); CuT.setTokenBuild(tokenId, commitHash, gitRepository); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + CuT.setTokenBuild(tokenId, commitHash, gitRepository); + // TokenOwner vm.prank(tokenOwner); CuT.setTokenBuild(tokenId, commitHash, gitRepository); @@ -323,6 +395,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 expectRevertWithMustBeTokenOwner(tokenId); CuT.burn(tokenId); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithMustBeTokenOwner(tokenId); + CuT.burn(tokenId); + // TokenController vm.prank(tokenController); expectRevertWithMustBeTokenOwner(tokenId); @@ -338,11 +415,74 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 CuT.burn(tokenId); } + function test_setAccessPointContentVerify() public { + string memory apName = "random.com"; + CuT.addAccessPoint(tokenId, apName); + + // CollectionOwner + vm.prank(collectionOwner); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointContentVerify(apName, true); + + // CollectionVerifier + vm.prank(collectionVerifier); + CuT.setAccessPointContentVerify(apName, true); + + // TokenOwner + vm.prank(tokenOwner); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointContentVerify(apName, false); + + // TokenController + vm.prank(tokenController); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointContentVerify(apName, false); + + // AnyAddress + vm.prank(anyAddress); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointContentVerify(apName, false); + } + + function test_setAccessPointNameVerify() public { + string memory apName = "random.com"; + CuT.addAccessPoint(tokenId, apName); + + // CollectionOwner + vm.prank(collectionOwner); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointNameVerify(apName, true); + + // CollectionVerifier + vm.prank(collectionVerifier); + CuT.setAccessPointNameVerify(apName, true); + + // TokenOwner + vm.prank(tokenOwner); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointNameVerify(apName, false); + + // TokenController + vm.prank(tokenController); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointNameVerify(apName, false); + + // AnyAddress + vm.prank(anyAddress); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); + CuT.setAccessPointNameVerify(apName, false); + } + function test_setBilling() public { // ColletionOwner vm.prank(collectionOwner); CuT.setBilling(FleekBilling.Billing.Mint, 1 ether); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.setBilling(FleekBilling.Billing.Mint, 2 ether); + // TokenOwner vm.prank(tokenOwner); expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); @@ -365,6 +505,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 vm.prank(collectionOwner); CuT.withdraw(); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.withdraw(); + // TokenOwner vm.prank(tokenOwner); expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); @@ -381,13 +526,6 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 CuT.withdraw(); } - /** - * @dev `receive` and `fallback` are required for test contract receive ETH - */ - receive() external payable {} - - fallback() external payable {} - function test_pauseAndUnpause() public { // ColletionOwner vm.startPrank(collectionOwner); @@ -395,6 +533,14 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 CuT.unpause(); vm.stopPrank(); + // CollectionVerifier + vm.startPrank(collectionVerifier); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.pause(); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.unpause(); + vm.stopPrank(); + // TokenOwner vm.startPrank(tokenOwner); expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); @@ -425,6 +571,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 vm.prank(collectionOwner); CuT.setPausable(false); + // CollectionVerifier + vm.prank(collectionVerifier); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); + CuT.setPausable(true); + // TokenOwner vm.prank(tokenOwner); expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Owner); @@ -464,4 +615,11 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 vm.prank(tokenOwner); CuT.revokeTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, anyAddress); } + + /** + * @dev `receive` and `fallback` are required for test contract receive ETH + */ + receive() external payable {} + + fallback() external payable {} } diff --git a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol index a7233560..fe528a4a 100644 --- a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol +++ b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol @@ -169,13 +169,13 @@ contract Test_FleekERC721_AccessPoint is Test_FleekERC721_Base, APConstants { CuT.addAccessPoint(tokenId, accessPointName); vm.startPrank(randomAddress); - expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); CuT.setAccessPointNameVerify(accessPointName, true); - expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); CuT.setAccessPointContentVerify(accessPointName, true); vm.stopPrank(); - CuT.grantTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, randomAddress); + CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Verifier, randomAddress); vm.startPrank(randomAddress); CuT.setAccessPointNameVerify(accessPointName, true); diff --git a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol index b387225b..18ae4bd9 100644 --- a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol +++ b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol @@ -171,13 +171,13 @@ contract Test_FleekERC721_AccessPoint is Test_FleekERC721_Base, APConstants { CuT.addAccessPoint(tokenId, accessPointName); vm.startPrank(randomAddress); - expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); CuT.setAccessPointNameVerify(accessPointName, true); - expectRevertWithTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller); + expectRevertWithCollectionRole(FleekAccessControl.CollectionRoles.Verifier); CuT.setAccessPointContentVerify(accessPointName, true); vm.stopPrank(); - CuT.grantTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, randomAddress); + CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Verifier, randomAddress); vm.startPrank(randomAddress); CuT.setAccessPointNameVerify(accessPointName, true); diff --git a/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-off.t.ts b/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-off.t.ts index 3341bff2..6740a16e 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-off.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/access-point/access-points-autoapproval-off.t.ts @@ -1,5 +1,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; +import { ethers } from 'hardhat'; import { TestConstants, Fixtures, Errors } from '../helpers'; const { AccessPointStatus } = TestConstants; diff --git a/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts b/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts index f4f5ac26..2685c8d9 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts @@ -175,4 +175,39 @@ describe('FleekERC721.CollectionRoles', () => { contract.revokeCollectionRole(CollectionRoles.Owner, owner.address) ).to.be.revertedWithCustomError(contract, Errors.MustHaveAtLeastOneOwner); }); + + it('should not be able to verify access point if not verifier', async () => { + const { contract, otherAccount } = fixture; + + await contract.mint( + otherAccount.address, + TestConstants.MintParams.name, + TestConstants.MintParams.description, + TestConstants.MintParams.externalUrl, + TestConstants.MintParams.ens, + TestConstants.MintParams.commitHash, + TestConstants.MintParams.gitRepository, + TestConstants.MintParams.logo, + TestConstants.MintParams.color, + TestConstants.MintParams.accessPointAutoApprovalSettings + ); + + await contract.addAccessPoint(0, 'random.com'); + + await expect( + contract + .connect(otherAccount) + .setAccessPointContentVerify('random.com', true) + ) + .to.be.revertedWithCustomError(contract, Errors.MustHaveCollectionRole) + .withArgs(CollectionRoles.Verifier); + + await expect( + contract + .connect(otherAccount) + .setAccessPointNameVerify('random.com', true) + ) + .to.be.revertedWithCustomError(contract, Errors.MustHaveCollectionRole) + .withArgs(CollectionRoles.Verifier); + }); }); diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/constants.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/constants.ts index 0137a2bf..b4086aa2 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/helpers/constants.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/helpers/constants.ts @@ -1,6 +1,7 @@ export const TestConstants = Object.freeze({ CollectionRoles: { Owner: 0, + Verifier: 1, }, TokenRoles: { Controller: 0, From 7387b6857190f0e02502c5f4a4f35411e7a68615 Mon Sep 17 00:00:00 2001 From: Shredder <110225819+EmperorOrokuSaki@users.noreply.github.com> Date: Wed, 8 Mar 2023 09:50:25 +0330 Subject: [PATCH 05/23] chore: add / update workflows to do folder filtering (#153) * Reflect Polygon -> Eth Mainnet change in main readme * chore: add / update workflows to do folder filtering and run change specific tests. * chore: run workflows based on both the path and the target branch of pr. * chore: add graphclient generation command to ui workflow Co-authored-by: Camila Sosa Morales * style: fix indentation in the ui workflow yml file --------- Co-authored-by: Janison Sivarajah Co-authored-by: Camila Sosa Morales --- .github/workflows/{test.yml => contract.yml} | 117 ++++++++----------- .github/workflows/subgraph.yml | 1 - .github/workflows/ui.yml | 38 ++++++ 3 files changed, 84 insertions(+), 72 deletions(-) rename .github/workflows/{test.yml => contract.yml} (55%) create mode 100644 .github/workflows/ui.yml diff --git a/.github/workflows/test.yml b/.github/workflows/contract.yml similarity index 55% rename from .github/workflows/test.yml rename to .github/workflows/contract.yml index 3869879b..8fd65a7f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/contract.yml @@ -1,71 +1,46 @@ -name: Tests - -on: - pull_request: - branches: - - main - - develop - -jobs: - test-contracts: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: contracts - - strategy: - matrix: - node-version: [18.x] - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Install Dependencies - run: yarn --ignore-scripts - - - name: Audit - run: yarn audit --groups dependencies - - - name: Compile - run: yarn compile - - - name: Run Test - run: yarn test - - test-ui: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: ui - - strategy: - matrix: - node-version: [18.x] - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install Dependencies - run: yarn --ignore-scripts - - - name: Audit - run: yarn audit --groups dependencies - - - name: Build - run: yarn build +name: Contract + +on: + pull_request: + branches: + - main + - develop + paths: + - 'contracts/**' + +jobs: + test-contracts: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: contracts + + strategy: + matrix: + node-version: [18.x] + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install Dependencies + run: yarn --ignore-scripts + + - name: Audit + run: yarn audit --groups dependencies + + - name: Compile + run: yarn compile + + - name: Run Test + run: yarn test \ No newline at end of file diff --git a/.github/workflows/subgraph.yml b/.github/workflows/subgraph.yml index 43a7dcd6..05057859 100644 --- a/.github/workflows/subgraph.yml +++ b/.github/workflows/subgraph.yml @@ -6,7 +6,6 @@ on: - main jobs: - test-subgraph: runs-on: ubuntu-latest diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml new file mode 100644 index 00000000..35ef11fe --- /dev/null +++ b/.github/workflows/ui.yml @@ -0,0 +1,38 @@ +name: UI + +on: + pull_request: + branches: + - main + - develop + paths: + - 'ui/**' + +jobs: + test-ui: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: ui + + strategy: + matrix: + node-version: [18.x] + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Install Dependencies + run: yarn --ignore-scripts + - name: Create .graphclient folder + run: yarn graphclient build + - name: Audit + run: yarn audit --groups dependencies + + - name: Build + run: yarn build From 9db81d2025be398173169924ace5c6d8a1f54225 Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Wed, 8 Mar 2023 15:28:16 -0500 Subject: [PATCH 06/23] chore: UI setup subgraph querying (#152) * wip: querying with graph-client and apollo * feat: fetching last nfts minted with basic pagination * chore: add .graphclient folder to gitignore and update readme * chore: teste pagination * chore: add create ap button in NFA * chore: remove unsued files * fix: fix CI * Update test.yml * chore: add config to handle graphclient imports * chore: update queries * chore: update list nfa views * chore: add graphql folder. remove unused env variable --- .github/workflows/contract.yml | 92 +- .github/workflows/ui.yml | 4 +- ui/.gitignore | 3 +- ui/.graphclientrc.yml | 10 + ui/README.md | 11 +- ui/graphql/queries.graphql | 20 + ui/package.json | 7 +- ui/src/app.tsx | 2 + .../ethereum/contracts/FleekERC721.json | 784 ++++--- ui/src/providers/apollo-provider.tsx | 20 + ui/src/providers/providers.tsx | 5 +- ui/src/views/access-point/create-ap.tsx | 6 + ui/src/views/access-point/index.ts | 1 + ui/src/views/home/home.tsx | 12 +- ui/src/views/home/nfa-list/index.ts | 1 + ui/src/views/home/nfa-list/nfa-list.tsx | 90 + ui/tsconfig.json | 6 +- ui/yarn.lock | 1927 ++++++++++++++++- 18 files changed, 2545 insertions(+), 456 deletions(-) create mode 100644 ui/.graphclientrc.yml create mode 100644 ui/graphql/queries.graphql create mode 100644 ui/src/providers/apollo-provider.tsx create mode 100644 ui/src/views/access-point/create-ap.tsx create mode 100644 ui/src/views/access-point/index.ts create mode 100644 ui/src/views/home/nfa-list/index.ts create mode 100644 ui/src/views/home/nfa-list/nfa-list.tsx diff --git a/.github/workflows/contract.yml b/.github/workflows/contract.yml index 8fd65a7f..dfa087ce 100644 --- a/.github/workflows/contract.yml +++ b/.github/workflows/contract.yml @@ -1,46 +1,46 @@ -name: Contract - -on: - pull_request: - branches: - - main - - develop - paths: - - 'contracts/**' - -jobs: - test-contracts: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: contracts - - strategy: - matrix: - node-version: [18.x] - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Install Dependencies - run: yarn --ignore-scripts - - - name: Audit - run: yarn audit --groups dependencies - - - name: Compile - run: yarn compile - - - name: Run Test - run: yarn test \ No newline at end of file +name: Contract + +on: + pull_request: + branches: + - main + - develop + paths: + - 'contracts/**' + +jobs: + test-contracts: + runs-on: ubuntu-latest + + defaults: + run: + working-directory: contracts + + strategy: + matrix: + node-version: [18.x] + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install Dependencies + run: yarn --ignore-scripts + + - name: Audit + run: yarn audit --groups dependencies + + - name: Compile + run: yarn compile + + - name: Run Test + run: yarn test diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml index 35ef11fe..6b1ffb93 100644 --- a/.github/workflows/ui.yml +++ b/.github/workflows/ui.yml @@ -2,7 +2,7 @@ name: UI on: pull_request: - branches: + branches: - main - develop paths: @@ -29,8 +29,10 @@ jobs: - name: Install Dependencies run: yarn --ignore-scripts + - name: Create .graphclient folder run: yarn graphclient build + - name: Audit run: yarn audit --groups dependencies diff --git a/ui/.gitignore b/ui/.gitignore index 53c37a16..f7da8a3f 100644 --- a/ui/.gitignore +++ b/ui/.gitignore @@ -1 +1,2 @@ -dist \ No newline at end of file +dist +.graphclient \ No newline at end of file diff --git a/ui/.graphclientrc.yml b/ui/.graphclientrc.yml new file mode 100644 index 00000000..1638e01d --- /dev/null +++ b/ui/.graphclientrc.yml @@ -0,0 +1,10 @@ +# .graphclientrc.yml +sources: + - name: FleekNFA + handler: + graphql: + endpoint: https://api.thegraph.com/subgraphs/name/emperororokusaki/flk-test-subgraph #replace for nfa subgraph + +documents: + - ./graphql/*.graphql + diff --git a/ui/README.md b/ui/README.md index 7f40e25e..6b1da981 100644 --- a/ui/README.md +++ b/ui/README.md @@ -23,11 +23,14 @@ To run the UI localy follow the steps: ```bash $ yarn ``` + 3. To use ConnecKit is neccessary get an [Alchemy ID](https://alchemy.com/), so create an App and get the credentials. Then set the following .env file + ```bash VITE_ALCHEMY_API_KEY VITE_ALCHEMY_APP_NAME ``` + Also, you'll need to set up your firebase cretendials to make work the github login. Add to the .env file the following variables ```bash @@ -42,7 +45,13 @@ To run the UI localy follow the steps: Get them from the project settings on the firebase dashboard. Read [this article](https://support.google.com/firebase/answer/7015592?hl=en#zippy=%2Cin-this-article) to know how to get your porject config -4. Start the local server running the app: +4. Build the queries to run the project: + + ```bash + $ yarn graphclient build + ``` + +5. Start the local server running the app: ```bash $ yarn dev diff --git a/ui/graphql/queries.graphql b/ui/graphql/queries.graphql new file mode 100644 index 00000000..e4d1bb2c --- /dev/null +++ b/ui/graphql/queries.graphql @@ -0,0 +1,20 @@ +query lastMintsPaginated($pageSize: Int, $skip: Int) { + newMints( + first: $pageSize + skip: $skip + orderDirection: desc + orderBy: tokenId + ) { + id + tokenId + description + name + } +} + +query totalTokens { + tokens { + id + } +} + diff --git a/ui/package.json b/ui/package.json index 8cf4965e..3da6e2e3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,14 +6,17 @@ "scripts": { "dev": "vite", "dev:css": "tailwindcss -o ./tailwind.css --watch && yarn dev", - "build": "vite build", + "build": "yarn graphclient build && vite build", + "postinstall": "graphclient build", "preview": "vite preview", "storybook": "export SET NODE_OPTIONS=--openssl-legacy-provider && start-storybook -p 6006", "build-storybook": "build-storybook" }, "author": "Fleek", "dependencies": { + "@apollo/client": "^3.7.9", "@ethersproject/providers": "^5.7.2", + "@graphprotocol/client-apollo": "^1.0.16", "@headlessui/react": "^1.7.8", "@radix-ui/colors": "^0.1.8", "@radix-ui/react-avatar": "^1.0.1", @@ -26,6 +29,7 @@ "connectkit": "^1.1.3", "firebase": "^9.17.1", "formik": "^2.2.9", + "graphql": "^16.6.0", "octokit": "^2.0.14", "path": "^0.12.7", "react": "^18.2.0", @@ -38,6 +42,7 @@ "@babel/core": "^7.20.12", "@esbuild-plugins/node-globals-polyfill": "^0.1.1", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "@graphprotocol/client-cli": "^2.2.19", "@storybook/addon-actions": "^6.5.15", "@storybook/addon-essentials": "^6.5.15", "@storybook/addon-interactions": "^6.5.15", diff --git a/ui/src/app.tsx b/ui/src/app.tsx index 2d08bf1a..10d3c5b9 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -4,6 +4,7 @@ import { ComponentsTest, Home, Mint } from './views'; import { SVGTestScreen } from './views/svg-test'; // TODO: remove when done import { ConnectKitButton } from 'connectkit'; import { MintTest } from './views/mint-test'; +import { CreateAP } from './views/access-point'; export const App = () => { themeGlobals(); @@ -18,6 +19,7 @@ export const App = () => { } /> } /> } /> + } /> {/** TODO remove for release */} } /> } /> diff --git a/ui/src/integrations/ethereum/contracts/FleekERC721.json b/ui/src/integrations/ethereum/contracts/FleekERC721.json index ca6a54c7..71d2407b 100644 --- a/ui/src/integrations/ethereum/contracts/FleekERC721.json +++ b/ui/src/integrations/ethereum/contracts/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": [ @@ -58,15 +137,21 @@ "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, + "internalType": "string", + "name": "apName", + "type": "string" + }, + { + "indexed": false, "internalType": "uint256", - "name": "token", + "name": "tokenId", "type": "uint256" }, { "indexed": true, "internalType": "bool", - "name": "settings", + "name": "verified", "type": "bool" }, { @@ -76,7 +161,7 @@ "type": "address" } ], - "name": "ChangeAccessPointAutoApprovalSettings", + "name": "ChangeAccessPointContentVerify", "type": "event" }, { @@ -95,10 +180,10 @@ "type": "uint256" }, { - "indexed": true, - "internalType": "bool", - "name": "verified", - "type": "bool" + "indexed": false, + "internalType": "enum FleekERC721.AccessPointCreationStatus", + "name": "status", + "type": "uint8" }, { "indexed": true, @@ -107,7 +192,7 @@ "type": "address" } ], - "name": "ChangeAccessPointContentVerify", + "name": "ChangeAccessPointCreationStatus", "type": "event" }, { @@ -175,40 +260,9 @@ { "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", + "internalType": "enum FleekAccessControl.CollectionRoles", "name": "role", "type": "uint8" }, @@ -220,28 +274,9 @@ }, { "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" + "internalType": "bool", + "name": "status", + "type": "bool" }, { "indexed": false, @@ -250,7 +285,7 @@ "type": "address" } ], - "name": "CollectionRoleRevoked", + "name": "CollectionRoleChanged", "type": "event" }, { @@ -269,26 +304,32 @@ { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, { "indexed": false, "internalType": "string", - "name": "apName", + "name": "key", "type": "string" }, { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" }, { "indexed": true, "internalType": "address", - "name": "owner", + "name": "triggeredBy", "type": "address" } ], - "name": "NewAccessPoint", + "name": "MetadataUpdate", "type": "event" }, { @@ -297,15 +338,21 @@ { "indexed": true, "internalType": "uint256", - "name": "tokenId", + "name": "_tokenId", "type": "uint256" }, { "indexed": false, "internalType": "string", - "name": "commitHash", + "name": "key", "type": "string" }, + { + "indexed": false, + "internalType": "uint24", + "name": "value", + "type": "uint24" + }, { "indexed": true, "internalType": "address", @@ -313,7 +360,7 @@ "type": "address" } ], - "name": "NewBuild", + "name": "MetadataUpdate", "type": "event" }, { @@ -322,102 +369,85 @@ { "indexed": true, "internalType": "uint256", - "name": "tokenId", + "name": "_tokenId", "type": "uint256" }, { "indexed": false, "internalType": "string", - "name": "name", + "name": "key", "type": "string" }, { "indexed": false, - "internalType": "string", - "name": "description", - "type": "string" + "internalType": "string[2]", + "name": "value", + "type": "string[2]" }, { - "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": true, + "internalType": "address", + "name": "triggeredBy", + "type": "address" + } + ], + "name": "MetadataUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ { - "indexed": false, - "internalType": "string", - "name": "gitRepository", - "type": "string" + "indexed": true, + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" }, { "indexed": false, "internalType": "string", - "name": "logo", + "name": "key", "type": "string" }, - { - "indexed": false, - "internalType": "uint24", - "name": "color", - "type": "uint24" - }, { "indexed": false, "internalType": "bool", - "name": "accessPointAutoApprovalSettings", + "name": "value", "type": "bool" }, { "indexed": true, "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", + "name": "triggeredBy", "type": "address" } ], - "name": "NewMint", + "name": "MetadataUpdate", "type": "event" }, { "anonymous": false, "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "apName", + "type": "string" + }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, - { - "indexed": false, - "internalType": "uint24", - "name": "color", - "type": "uint24" - }, { "indexed": true, "internalType": "address", - "name": "triggeredBy", + "name": "owner", "type": "address" } ], - "name": "NewTokenColor", + "name": "NewAccessPoint", "type": "event" }, { @@ -432,27 +462,20 @@ { "indexed": false, "internalType": "string", - "name": "description", + "name": "name", "type": "string" }, { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewTokenDescription", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + }, { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "indexed": false, + "internalType": "string", + "name": "externalURL", + "type": "string" }, { "indexed": false, @@ -461,38 +484,49 @@ "type": "string" }, { - "indexed": true, - "internalType": "address", - "name": "triggeredBy", - "type": "address" - } - ], - "name": "NewTokenENS", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ + "indexed": false, + "internalType": "string", + "name": "commitHash", + "type": "string" + }, { - "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "indexed": false, + "internalType": "string", + "name": "gitRepository", + "type": "string" }, { "indexed": false, "internalType": "string", - "name": "externalURL", + "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": "triggeredBy", + "name": "minter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", "type": "address" } ], - "name": "NewTokenExternalURL", + "name": "NewMint", "type": "event" }, { @@ -500,24 +534,18 @@ "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "internalType": "bool", + "name": "isPausable", + "type": "bool" }, { "indexed": false, - "internalType": "string", - "name": "logo", - "type": "string" - }, - { - "indexed": true, "internalType": "address", - "name": "triggeredBy", + "name": "account", "type": "address" } ], - "name": "NewTokenLogo", + "name": "PausableStatusChange", "type": "event" }, { @@ -525,24 +553,18 @@ "inputs": [ { "indexed": true, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" + "internalType": "bool", + "name": "isPaused", + "type": "bool" }, { "indexed": false, - "internalType": "string", - "name": "name", - "type": "string" - }, - { - "indexed": true, "internalType": "address", - "name": "triggeredBy", + "name": "account", "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": "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": "address[]" + "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": "_appIds", + "label": "__gap", "offset": 0, "slot": "155", - "type": "t_struct(Counter)2774_storage" + "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": "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 FleekERC721.AccessPointCreationStatus", + "numberOfBytes": "1" + }, + "t_enum(CollectionRoles)3829": { "encoding": "inplace", - "label": "enum FleekAccessControl.Roles", + "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(CollectionRoles)3829", + "label": "mapping(enum FleekAccessControl.CollectionRoles => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "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(Roles)3895", - "label": "mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role)", + "key": "t_enum(TokenRoles)3831", + "label": "mapping(enum FleekAccessControl.TokenRoles => 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_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/ui/src/providers/apollo-provider.tsx b/ui/src/providers/apollo-provider.tsx new file mode 100644 index 00000000..a886f5d6 --- /dev/null +++ b/ui/src/providers/apollo-provider.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { + ApolloClient, + InMemoryCache, + ApolloProvider as Provider, +} from '@apollo/client'; +import { GraphApolloLink } from '@graphprotocol/client-apollo'; +import * as GraphClient from '@/graphclient'; + +const client = new ApolloClient({ + link: new GraphApolloLink(GraphClient), + cache: new InMemoryCache(), +}); + +type ApolloProviderProps = { + children: React.ReactNode; +}; +export const ApolloProvider: React.FC = ({ children }) => { + return {children}; +}; diff --git a/ui/src/providers/providers.tsx b/ui/src/providers/providers.tsx index 22de479a..ab0f99e7 100644 --- a/ui/src/providers/providers.tsx +++ b/ui/src/providers/providers.tsx @@ -1,3 +1,4 @@ +import { ApolloProvider } from './apollo-provider'; import { ConnectkitProvider } from './connectkit-provider'; import { ReactQueryProvider } from './react-query-provider'; import { ReduxProvider } from './redux-provider'; @@ -10,7 +11,9 @@ export const Providers: React.FC = ({ children }) => { return ( - {children} + + {children} + ); diff --git a/ui/src/views/access-point/create-ap.tsx b/ui/src/views/access-point/create-ap.tsx new file mode 100644 index 00000000..a4411419 --- /dev/null +++ b/ui/src/views/access-point/create-ap.tsx @@ -0,0 +1,6 @@ +import { useParams } from 'react-router-dom'; + +export const CreateAP = () => { + const { id } = useParams(); + return <>Token to create AP:{id}; +}; diff --git a/ui/src/views/access-point/index.ts b/ui/src/views/access-point/index.ts new file mode 100644 index 00000000..28de3f9e --- /dev/null +++ b/ui/src/views/access-point/index.ts @@ -0,0 +1 @@ +export * from './create-ap'; diff --git a/ui/src/views/home/home.tsx b/ui/src/views/home/home.tsx index 098d9e8d..35377b16 100644 --- a/ui/src/views/home/home.tsx +++ b/ui/src/views/home/home.tsx @@ -1,7 +1,15 @@ +import { Flex } from '@/components'; +import { Link } from 'react-router-dom'; +import { NFAList } from './nfa-list/nfa-list'; + export const Home = () => { return ( - <> +

Home

- + + Mint NFA! + + +
); }; diff --git a/ui/src/views/home/nfa-list/index.ts b/ui/src/views/home/nfa-list/index.ts new file mode 100644 index 00000000..6d5668c3 --- /dev/null +++ b/ui/src/views/home/nfa-list/index.ts @@ -0,0 +1 @@ +export * from './nfa-list'; diff --git a/ui/src/views/home/nfa-list/nfa-list.tsx b/ui/src/views/home/nfa-list/nfa-list.tsx new file mode 100644 index 00000000..f8ea4980 --- /dev/null +++ b/ui/src/views/home/nfa-list/nfa-list.tsx @@ -0,0 +1,90 @@ +import { lastMintsPaginatedDocument, totalTokensDocument } from '@/graphclient'; +import { Button, Card, Flex, NoResults } from '@/components'; +import { FleekERC721 } from '@/integrations/ethereum/contracts'; +import { useQuery } from '@apollo/client'; +import { useEffect, useState } from 'react'; +import { Link } from 'react-router-dom'; + +const pageSize = 10; //Set this size to test pagination + +export const NFAList = () => { + const [pageNumber, setPageNumber] = useState(1); + const [totalPages, setTotalPages] = useState(0); + + const { + data: totalTokens, + loading: loadingTotalTokens, + error: errorTotalTokens, + } = useQuery(totalTokensDocument); + + const { + data: dataMintedTokens, + loading: loadingMintedTokens, + error: errorMintedTokens, + } = useQuery(lastMintsPaginatedDocument, { + variables: { + //first page is 0 + pageSize, + skip: pageNumber > 0 ? (pageNumber - 1) * pageSize : pageNumber, + }, + }); + + useEffect(() => { + if (totalTokens && totalTokens.tokens.length > 0) { + setTotalPages(Math.ceil(totalTokens.tokens.length / pageSize)); + } + }, [totalTokens]); + + if (loadingMintedTokens || loadingTotalTokens) return
Loading...
; //TODO handle loading + if (errorMintedTokens || errorTotalTokens) return
Error
; //TODO handle error + + const handlePreviousPage = () => { + if (pageNumber > 1) { + setPageNumber((prevState) => prevState - 1); + } + }; + + const handleNextPage = () => { + if (pageNumber + 1 <= totalPages) + setPageNumber((prevState) => prevState + 1); + }; + + return ( + + + {/* TODO this will be remove when we have pagination component */} + items per page: {pageSize} + + page: {pageNumber}/{totalPages} + + + + + + + {dataMintedTokens && dataMintedTokens.newMints.length > 0 ? ( + dataMintedTokens.newMints.map((mint) => ( + + + +
+ Open NFA on Opensea + + Create AP + + + )) + ) : ( + + )} +
+ + ); +}; diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 4f9682f5..da49dd2c 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -7,7 +7,9 @@ "rootDirs": ["src"], "baseUrl": "src", "paths": { - "@/*": ["*"] + "@/*": ["*"], + "@/graphclient": ["../.graphclient"], + "@/graphclient/*": ["../.graphclient/*"] }, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, @@ -21,5 +23,5 @@ "isolatedModules": true, "types": ["vite/client"] }, - "include": ["./src", "./*.ts"] + "include": ["./src", "./.graphclient", "./*.ts"] } diff --git a/ui/yarn.lock b/ui/yarn.lock index f0623a1a..1098ed79 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -10,6 +10,55 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@apollo/client@^3.7.9": + version "3.7.9" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.9.tgz#459454dc4a7c81adaa66e13e626ce41f633dc862" + integrity sha512-YnJvrJOVWrp4y/zdNvUaM8q4GuSHCEIecsRDTJhK/veT33P/B7lfqGJ24NeLdKMj8tDEuXYF7V0t+th4+rgC+Q== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.7.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + response-iterator "^0.2.6" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + +"@ardatan/relay-compiler@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" + integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + +"@ardatan/sync-fetch@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz#3385d3feedceb60a896518a1db857ec1e945348f" + integrity sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA== + dependencies: + node-fetch "^2.6.1" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -65,6 +114,27 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/core@^7.14.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" @@ -74,6 +144,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.14.0", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.0", "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -168,6 +248,14 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -203,6 +291,20 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" +"@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" @@ -297,6 +399,15 @@ "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -311,6 +422,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== +"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -337,7 +453,7 @@ "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.12.1", "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -430,7 +546,7 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.12.1", "@babel/plugin-proposal-object-rest-spread@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -491,7 +607,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== @@ -533,14 +649,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.18.6": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-syntax-import-assertions@^7.20.0": +"@babel/plugin-syntax-import-assertions@7.20.0", "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== @@ -561,7 +677,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -589,7 +705,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -631,7 +747,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.12.1", "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== @@ -647,13 +763,20 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.20.2": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" @@ -661,6 +784,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-transform-classes@^7.0.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" @@ -676,7 +814,7 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== @@ -684,7 +822,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.12.1", "@babel/plugin-transform-destructuring@^7.20.2": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== @@ -714,6 +852,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/plugin-transform-flow-strip-types@^7.18.6": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" @@ -722,6 +868,13 @@ "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-flow" "^7.18.6" +"@babel/plugin-transform-for-of@^7.0.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.18.8": version "7.18.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" @@ -729,7 +882,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.18.9": +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== @@ -738,14 +891,14 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.18.9": +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.18.6": +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== @@ -760,6 +913,15 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== + dependencies: + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" @@ -802,7 +964,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.18.6": +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== @@ -810,21 +972,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-property-literals@^7.18.6": +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-display-name@^7.18.6": +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== @@ -852,6 +1014,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" + integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.21.0" + "@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.19.0": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" @@ -898,14 +1071,14 @@ babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.18.6": +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.12.1", "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.19.0": +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.12.1", "@babel/plugin-transform-spread@^7.19.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== @@ -920,7 +1093,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.18.9": +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.12.1", "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== @@ -1137,6 +1310,31 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.21.0", "@babel/types@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -1289,6 +1487,39 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== +"@envelop/core@3.0.6", "@envelop/core@^3.0.4": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@envelop/core/-/core-3.0.6.tgz#e55c3564d05d648b0356a1c465aa90b0c51f485d" + integrity sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig== + dependencies: + "@envelop/types" "3.0.2" + tslib "^2.5.0" + +"@envelop/extended-validation@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@envelop/extended-validation/-/extended-validation-2.0.6.tgz#0dd156d3cbabb5659af6dcd868cc0d1a090f4935" + integrity sha512-aXAf1bg5Z71YfEKLCZ8OMUZAOYPGHV/a+7avd5TIMFNDxl5wJTmIonep3T+kdMpwRInDphfNPGFD0GcGdGxpHg== + dependencies: + "@graphql-tools/utils" "^8.8.0" + tslib "^2.5.0" + +"@envelop/types@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@envelop/types/-/types-3.0.2.tgz#a4b29375b7fcee39bb5830f87f66bbc815cf305e" + integrity sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng== + dependencies: + tslib "^2.5.0" + +"@envelop/validation-cache@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@envelop/validation-cache/-/validation-cache-5.1.2.tgz#bc21fa6b41178d4dff04c2c3ba3750cd959a5007" + integrity sha512-APofOvjaHrF+IW71VCXdyG+EbA6EQJXdunUe1EECU9vZzGKYUuQXfVeCOD6IYNF44KKSQArTfU8RhnUlW6VyOQ== + dependencies: + fast-json-stable-stringify "^2.1.0" + lru-cache "^6.0.0" + sha1-es "^1.8.2" + tslib "^2.5.0" + "@esbuild-plugins/node-globals-polyfill@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz#a313ab3efbb2c17c8ce376aa216c627c9b40f9d7" @@ -2046,6 +2277,750 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@graphprotocol/client-add-source-name@1.0.17": + version "1.0.17" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-add-source-name/-/client-add-source-name-1.0.17.tgz#633a6cc9835bca16a1e1b1e7a962737e77e8146e" + integrity sha512-Rv8kNL62H7S71YA9eLh5PO2KElrrgfltg1atVHETV6TdXYBMuKW42J5ZqSshmHROI4DzftPw8A2HW7BMfdDvgQ== + dependencies: + lodash "4.17.21" + tslib "^2.4.0" + +"@graphprotocol/client-apollo@^1.0.16": + version "1.0.16" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-apollo/-/client-apollo-1.0.16.tgz#4e6c0226983be53b8d6e81cbb705f6535f4bc6b0" + integrity sha512-pNu3jl7eIIVpXy21yeXw8t+FO9PTVL0ftyyqBdpmX3N1mgn+QQY9V0pwYJjHNl7bzqqmVLbmo6G1NrIsgcqCiQ== + dependencies: + "@graphql-mesh/apollo-link" "10.0.3" + tslib "^2.4.0" + +"@graphprotocol/client-auto-pagination@1.1.15": + version "1.1.15" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-auto-pagination/-/client-auto-pagination-1.1.15.tgz#7a6181e5759b70cd589cde3169ecdbe31480c6c6" + integrity sha512-KDqGg3xJtDdXqz3ANHbv3O26cin+XW1RT8raY72l4eai8wrVCfXUKMl0FRFInN/Fpb0TDzBLg3z58Nq5r6+H2A== + dependencies: + lodash "4.17.21" + tslib "^2.4.0" + +"@graphprotocol/client-auto-type-merging@1.0.22": + version "1.0.22" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-auto-type-merging/-/client-auto-type-merging-1.0.22.tgz#9d85def1d42c1a64bd2b48d379b41ce8c1cd134f" + integrity sha512-obBF8DDYXGpHro8u1aDdbkYnkjdacjyrSqnkFIRP42BvIvYGE9kxj9+kL7ox3NKlox/2k/I734LnkXU57mUksA== + dependencies: + "@graphql-mesh/transform-type-merging" "0.5.14" + tslib "^2.4.0" + +"@graphprotocol/client-block-tracking@1.0.12": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-block-tracking/-/client-block-tracking-1.0.12.tgz#d556da86e0478bafdc8a3e822d82147dbe95ac17" + integrity sha512-QzoZfv6Azo5+i1xbu3N5Av0A6E4ipffbuZoea0sKgdaPZojhIqm6/vwfKEKNVsUYyUWxh8igxCGuGnvA7ZgWMQ== + dependencies: + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphprotocol/client-cli@^2.2.19": + version "2.2.19" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-cli/-/client-cli-2.2.19.tgz#13a850df32ea2d7ed67132d30c24e53608a39bbf" + integrity sha512-KqFxSCpaXSSAcJcX4JbZy1dCG1ueH7Ou8hPrPIV5gJPHzkypqzkTrfE0nugsBEZveXqpowkcV1ecQbKDlKP5fA== + dependencies: + "@graphprotocol/client-add-source-name" "1.0.17" + "@graphprotocol/client-auto-pagination" "1.1.15" + "@graphprotocol/client-auto-type-merging" "1.0.22" + "@graphprotocol/client-block-tracking" "1.0.12" + "@graphprotocol/client-polling-live" "1.1.0" + "@graphql-mesh/cli" "0.82.24" + "@graphql-mesh/graphql" "0.34.7" + tslib "^2.4.0" + +"@graphprotocol/client-polling-live@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-polling-live/-/client-polling-live-1.1.0.tgz#badda17d4f928db7cca67ae2e3ac1fb1bfe7e90e" + integrity sha512-6k07fJ3rmp+u+nrorF6fpXLHFTDKy9ibevr71qiwOluuso9T9Fn1tI56XRdz0xkimdosFAex+GwXyTags7EKHg== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.4.0" + +"@graphql-codegen/core@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-3.1.0.tgz#ad859d52d509a4eb2ebe5aabba6543a628fb181b" + integrity sha512-DH1/yaR7oJE6/B+c6ZF2Tbdh7LixF1K8L+8BoSubjNyQ8pNwR4a70mvc1sv6H7qgp6y1bPQ9tKE+aazRRshysw== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.1.0" + "@graphql-tools/schema" "^9.0.0" + "@graphql-tools/utils" "^9.1.1" + tslib "~2.5.0" + +"@graphql-codegen/plugin-helpers@^2.7.2": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-2.7.2.tgz#6544f739d725441c826a8af6a49519f588ff9bed" + integrity sha512-kln2AZ12uii6U59OQXdjLk5nOlh1pHis1R98cDZGFnfaiAbX9V3fxcZ1MMJkB7qFUymTALzyjZoXXdyVmPMfRg== + dependencies: + "@graphql-tools/utils" "^8.8.0" + change-case-all "1.0.14" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.0.0.tgz#9c10e4700dc6efe657781dff47347d0c99674061" + integrity sha512-vgNGTanT36hC4RAC/LAThMEjDvnu3WCyx6MtKZcPUtfCWFxbUAr88+OarGl1LAEiOef0agIREC7tIBXCqjKkJA== + dependencies: + "@graphql-tools/utils" "^9.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.4.0" + +"@graphql-codegen/plugin-helpers@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-4.1.0.tgz#4b193c12d6bb458f1f2af48c200bc86617884f60" + integrity sha512-xvSHJb9OGb5CODIls0AI1rCenLz+FuiaNPCsfHMCNsLDjOZK2u0jAQ9zUBdc/Wb+21YXZujBCc0Vm1QX+Zz0nw== + dependencies: + "@graphql-tools/utils" "^9.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.5.0" + +"@graphql-codegen/schema-ast@^3.0.0", "@graphql-codegen/schema-ast@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-3.0.1.tgz#37b458bb57b95715a9eb4259341c856dae2a461d" + integrity sha512-rTKTi4XiW4QFZnrEqetpiYEWVsOFNoiR/v3rY9mFSttXFbIwNXPme32EspTiGWmEEdHY8UuTDtZN3vEcs/31zw== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.1.0" + "@graphql-tools/utils" "^9.0.0" + tslib "~2.5.0" + +"@graphql-codegen/typed-document-node@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-3.0.1.tgz#68ced866ac79ce32ab50bad1b2d4b268490318d4" + integrity sha512-2plPBbAJZtR72BU6n07N3nIJYlwnCWbFNoe++MQ33S2ML4KwpCiflGEJnTpiwOEhCklQLWg1FEUdEOYS2iluqw== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.1.0" + "@graphql-codegen/visitor-plugin-common" "3.0.1" + auto-bind "~4.0.0" + change-case-all "1.0.15" + tslib "~2.5.0" + +"@graphql-codegen/typescript-generic-sdk@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-generic-sdk/-/typescript-generic-sdk-3.0.4.tgz#6bed9c8f786f19f16e564998c28c1aa59a661ccc" + integrity sha512-0bPfoifMTaVP0Jh9g/pG6FsDHei2BHiO4f73Qz+XYgP/TNKq3R5AGPd7NzHeabdoO3lhuRvjKqafc5WtjZC/Dw== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-codegen/visitor-plugin-common" "2.13.1" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/typescript-operations@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-3.0.0.tgz#e67c9dedb739a20f8a1d2c9a9631701c269de0c1" + integrity sha512-t+Lk+lxkUFDh6F0t8CErowOccP3bZwxhl66qmEeBcOrC7jQrSCnRZoFvOXhFKFBJe/y4DIJiizgSr34AqjiJIQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.0.0" + "@graphql-codegen/typescript" "^3.0.0" + "@graphql-codegen/visitor-plugin-common" "3.0.0" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/typescript-resolvers@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-3.0.0.tgz#69856b9eb003660b7c7551727a63764b8a6c89ee" + integrity sha512-yfRNJF9ZUoiLSPhaBEpQ9E4ymExYzbsKgjU2qJ/0c8l0lViA+o4ALkJMTwb7yU/yTayQtQWgxL5cdDY2I12GpQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.0.0" + "@graphql-codegen/typescript" "^3.0.0" + "@graphql-codegen/visitor-plugin-common" "3.0.0" + "@graphql-tools/utils" "^9.0.0" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/typescript@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-3.0.0.tgz#473dde1646540039bca5db4b6daf174d13af0ce3" + integrity sha512-FQWyuIUy1y+fxb9+EZfvdBHBQpYExlIBHV5sg2WGNCsyVyCqBTl0mO8icyOtsQPVg6YFMFe8JJO69vQbwHma5w== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.0.0" + "@graphql-codegen/schema-ast" "^3.0.0" + "@graphql-codegen/visitor-plugin-common" "3.0.0" + auto-bind "~4.0.0" + tslib "~2.4.0" + +"@graphql-codegen/typescript@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-3.0.1.tgz#e949a7d7e8325bea9cf938c30af2313043e91a09" + integrity sha512-HvozJg7eHqywmYvXa7+nmjw+v3+f8ilFv9VbRvmjhj/zBw3VKGT2n/85ZhVyuWjY2KrDLzl6BqeXttWsW5Wo4w== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.1.0" + "@graphql-codegen/schema-ast" "^3.0.1" + "@graphql-codegen/visitor-plugin-common" "3.0.1" + auto-bind "~4.0.0" + tslib "~2.5.0" + +"@graphql-codegen/visitor-plugin-common@2.13.1": + version "2.13.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.1.tgz#2228660f6692bcdb96b1f6d91a0661624266b76b" + integrity sha512-mD9ufZhDGhyrSaWQGrU1Q1c5f01TeWtSWy/cDwXYjJcHIj1Y/DG2x0tOflEfCvh5WcnmHNIw4lzDsg1W7iFJEg== + dependencies: + "@graphql-codegen/plugin-helpers" "^2.7.2" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^8.8.0" + auto-bind "~4.0.0" + change-case-all "1.0.14" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.0.0.tgz#527185eb3b1b06739702084bc6263713e167a166" + integrity sha512-ZoNlCmmkGClB137SpJT9og/nkihLN7Z4Ynl9Ir3OlbDuI20dbpyXsclpr9QGLcxEcfQeVfhGw9CooW7wZJJ8LA== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.0.0" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^9.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.4.0" + +"@graphql-codegen/visitor-plugin-common@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.0.1.tgz#dbfc2ba55d8a1908e4bd7f751dbfe4241961f948" + integrity sha512-Qek+Ywy094Km7Vc1TzKBN9ICvtYwPdqZUliPO77urMSveP+2+G2O9Tjx546dW4A1O6rhEfexbenc2DqTAe7iLQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.1.0" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^9.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.5.0" + +"@graphql-inspector/core@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@graphql-inspector/core/-/core-3.3.0.tgz#3982909cec46a5b3050a8265569503f20a3b5742" + integrity sha512-LRtk9sHgj9qqVPIkkThAVq3iZ7QxgHCx6elEwd0eesZBCmaIYQxD/BFu+VT8jr10YfOURBZuAnVdyGu64vYpBg== + dependencies: + dependency-graph "0.11.0" + object-inspect "1.10.3" + tslib "^2.0.0" + +"@graphql-mesh/apollo-link@10.0.3": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@graphql-mesh/apollo-link/-/apollo-link-10.0.3.tgz#2f71de6ecc1be9f7dbe4b2eae166fc4e03c721b4" + integrity sha512-uxfFdvEohzL9g6Y1Nsom9S/dNpwPrA7HkMr4fSKmRt4GNEuZ5IIp0qk/kmC46SgHz/t1SQa9cXy4uoJCmjRQ4A== + dependencies: + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-mesh/cache-localforage@0.7.14": + version "0.7.14" + resolved "https://registry.yarnpkg.com/@graphql-mesh/cache-localforage/-/cache-localforage-0.7.14.tgz#8613fd0e2e023142ced85d648a08e71aa79d931a" + integrity sha512-yt0x5rhzpiBoUKsp/MHhicmc3P0f0VTTxh7LGP7vg5VOXqSUjgPZQNFaMRQ6AnoUfpTqU4Ru7DlUcZu6GWwMDg== + dependencies: + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + localforage "1.10.0" + tslib "^2.4.0" + +"@graphql-mesh/cli@0.82.24": + version "0.82.24" + resolved "https://registry.yarnpkg.com/@graphql-mesh/cli/-/cli-0.82.24.tgz#5d0a327d1a75af9290cefd52c5af314a9430e346" + integrity sha512-bJN9uzRJnhA+dkmVz5VEll6mCyNrc7GKOE7mnj9Qyi7VxLMbvB/NSN7BVLlbBJuL7Yz/Wz8Vo7FGkrqQmfzTgQ== + dependencies: + "@graphql-codegen/core" "3.1.0" + "@graphql-codegen/typed-document-node" "3.0.1" + "@graphql-codegen/typescript" "3.0.0" + "@graphql-codegen/typescript-generic-sdk" "3.0.4" + "@graphql-codegen/typescript-operations" "3.0.0" + "@graphql-codegen/typescript-resolvers" "3.0.0" + "@graphql-mesh/config" "10.1.7" + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/http" "0.3.20" + "@graphql-mesh/runtime" "0.46.15" + "@graphql-mesh/store" "0.9.14" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/utils" "9.2.1" + ajv "8.12.0" + change-case "4.1.2" + cosmiconfig "8.1.0" + dnscache "1.0.2" + dotenv "16.0.3" + graphql-import-node "0.0.5" + graphql-ws "5.11.3" + json-bigint-patch "0.0.8" + json5 "2.2.3" + mkdirp "2.1.3" + open "7.4.2" + pascal-case "3.1.2" + rimraf "4.1.2" + ts-node "10.9.1" + tsconfig-paths "4.1.2" + tslib "^2.4.0" + typescript "4.9.5" + ws "8.12.1" + yargs "17.7.1" + +"@graphql-mesh/config@10.1.7": + version "10.1.7" + resolved "https://registry.yarnpkg.com/@graphql-mesh/config/-/config-10.1.7.tgz#c6b22eaea62fd01ed01e878d1d32793d6efd3d47" + integrity sha512-WgevKFuwH7zUSbDrDufWgk17vXvcdIoS6Amp58ZWLgz2e+sjaaDx+K/kFt6YFijy80wtd/U5me/Qdvu7TVcaZg== + dependencies: + "@envelop/core" "3.0.6" + "@graphql-mesh/cache-localforage" "0.7.14" + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/merger-bare" "0.16.16" + "@graphql-mesh/merger-stitching" "0.18.16" + "@graphql-mesh/store" "0.9.14" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/code-file-loader" "7.3.21" + "@graphql-tools/graphql-file-loader" "7.5.16" + "@graphql-tools/load" "7.8.12" + "@graphql-tools/utils" "9.2.1" + "@whatwg-node/fetch" "^0.8.0" + camel-case "4.1.2" + param-case "3.0.4" + pascal-case "3.1.2" + tslib "^2.4.0" + +"@graphql-mesh/cross-helpers@0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@graphql-mesh/cross-helpers/-/cross-helpers-0.3.3.tgz#c32b80c89c012cb8a6250ef6a7feb41490ee919f" + integrity sha512-L2T4H1Gtsq+IbuKUuHv9loytn24zontH+WC7oz7W+gvv8PtnOYsWbwnNRr45YBQMcXOvo+qeOJPSZ6RXSkPbCg== + dependencies: + "@graphql-tools/utils" "9.2.1" + path-browserify "1.0.1" + react-native-fs "2.20.0" + react-native-path "0.0.5" + +"@graphql-mesh/graphql@0.34.7": + version "0.34.7" + resolved "https://registry.yarnpkg.com/@graphql-mesh/graphql/-/graphql-0.34.7.tgz#12c468d2ba48e978e3214aa2c56820d292560d94" + integrity sha512-ytmwP8DxWriBnBjVMLqxCWhhrR3Z4+e9vPg5iZElTadHu2HHlq/+A7jR3qiOn0VciLG8DHJ40UNSgjQCT08kkQ== + dependencies: + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/store" "0.9.14" + "@graphql-mesh/string-interpolation" "0.4.2" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/url-loader" "7.17.13" + "@graphql-tools/utils" "9.2.1" + "@graphql-tools/wrap" "9.3.7" + lodash.get "4.4.2" + tslib "^2.4.0" + +"@graphql-mesh/http@0.3.20": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@graphql-mesh/http/-/http-0.3.20.tgz#a4b62b2ef040f6598983652fe898b5ea9c5a636b" + integrity sha512-TjJ2OsiH5qypUKF1y2wuqdnciNQrzpuIUy91S0GDqVHRI83miCCvwkK/aUqGpbPY/jnWqN/kBSbxRyCFpn/bMw== + dependencies: + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/runtime" "0.46.15" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@whatwg-node/router" "0.3.0" + graphql-yoga "3.7.0" + tslib "^2.4.0" + +"@graphql-mesh/merger-bare@0.16.16": + version "0.16.16" + resolved "https://registry.yarnpkg.com/@graphql-mesh/merger-bare/-/merger-bare-0.16.16.tgz#f19ee3b74ebe932db5936820695baeb89aaaddff" + integrity sha512-oiaInZz4H1Iuq9sPOls1YthUINF7NsZHHR9RpNCkuRVWEwDNsCLh/sKSGvc3XYQZMByTpgllfitf1oZ5zPVI3A== + dependencies: + "@graphql-mesh/merger-stitching" "0.18.16" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/schema" "9.0.16" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-mesh/merger-stitching@0.18.16": + version "0.18.16" + resolved "https://registry.yarnpkg.com/@graphql-mesh/merger-stitching/-/merger-stitching-0.18.16.tgz#fd0f2e2b10593296bca37e10b639e188fe71880a" + integrity sha512-4QG4lrFs+dk4vhYtSThCKVqi0vBiFQK4R08RQ/auLSIVrhEdTazQsi6W24LQqpNt/M7fU/E2gsO93bb0WmHjiA== + dependencies: + "@graphql-mesh/store" "0.9.14" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/schema" "9.0.16" + "@graphql-tools/stitch" "8.7.42" + "@graphql-tools/stitching-directives" "2.3.31" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-mesh/runtime@0.46.15": + version "0.46.15" + resolved "https://registry.yarnpkg.com/@graphql-mesh/runtime/-/runtime-0.46.15.tgz#fcde9cc8be01acdd5242aef031cf149aef730397" + integrity sha512-LefwojpknBN1C0DlaqCd3ahBbnWjj/RbyUPrQWruQVkL/N0vgeFG5s5kTy7NwyT+kjF0pwDnaNY/WCxIufhCbA== + dependencies: + "@envelop/core" "3.0.6" + "@envelop/extended-validation" "2.0.6" + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/string-interpolation" "0.4.2" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/batch-delegate" "8.4.21" + "@graphql-tools/batch-execute" "8.5.18" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/utils" "9.2.1" + "@graphql-tools/wrap" "9.3.7" + "@whatwg-node/fetch" "^0.8.0" + tslib "^2.4.0" + +"@graphql-mesh/store@0.9.14": + version "0.9.14" + resolved "https://registry.yarnpkg.com/@graphql-mesh/store/-/store-0.9.14.tgz#8418cf4662cb3f5bf79ced41cb272707cf3efece" + integrity sha512-koPhT+90jANG852AgOWQl4qR4RGoj5ZzVQCMxUnIle3ZJrKZGaPwWyfMao6WWGql50fjQvV3fc1qSRYrZ1szzg== + dependencies: + "@graphql-inspector/core" "3.3.0" + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-mesh/string-interpolation@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@graphql-mesh/string-interpolation/-/string-interpolation-0.4.2.tgz#4778ae192731e1dd21383560fcb278c60f25f9bb" + integrity sha512-xUSLpir2F4QlAZPVr9GTZ8fOeHYL4PCanykFhIH+CJRFWgolbsUSkTbNBUginQ8pjbQNFEpD2YGgz7N9aJKQ0w== + dependencies: + dayjs "1.11.7" + json-pointer "0.6.2" + lodash.get "4.4.2" + tslib "^2.4.0" + +"@graphql-mesh/transform-type-merging@0.5.14": + version "0.5.14" + resolved "https://registry.yarnpkg.com/@graphql-mesh/transform-type-merging/-/transform-type-merging-0.5.14.tgz#773fe267e73defd73b0f6251b7f04e56bdf9859c" + integrity sha512-Zdt/1dwJEpvAfoYCZrE/SVfbLAnYVmodbut+vCEN7hfmKkF+8SWFpeFkHol+NUxWu9CR+7e0dbbxOpCtqVTfBA== + dependencies: + "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/utils" "0.43.14" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/stitching-directives" "2.3.31" + tslib "^2.4.0" + +"@graphql-mesh/types@0.91.6": + version "0.91.6" + resolved "https://registry.yarnpkg.com/@graphql-mesh/types/-/types-0.91.6.tgz#46e75d47ec083c70221fb12592fd36fd1ce9bcf9" + integrity sha512-HPFi4qGPeAh2VARmOAd5Au1HFOaQ648eNraGupqSSJQQGqttRTOdarjOkthHdLbyIxzQd9sMJEUM5PBkrTuZmg== + dependencies: + "@graphql-mesh/store" "0.9.14" + "@graphql-tools/batch-delegate" "8.4.21" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/utils" "9.2.1" + "@graphql-typed-document-node/core" "3.1.2" + tslib "^2.4.0" + +"@graphql-mesh/utils@0.43.14": + version "0.43.14" + resolved "https://registry.yarnpkg.com/@graphql-mesh/utils/-/utils-0.43.14.tgz#d9654b2aef98c82e925acb36b40eb4bf9a361c0e" + integrity sha512-b9mkTZpOAsc1PrtAFRsco70OrwL1keVX4jriqKM+Mwm3yKgPEkhVUKn+Mfxvg9VPZZyGZP1dxyhGWKD6hMkJXg== + dependencies: + "@graphql-mesh/cross-helpers" "0.3.3" + "@graphql-mesh/string-interpolation" "0.4.2" + "@graphql-mesh/types" "0.91.6" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/utils" "9.2.1" + js-yaml "4.1.0" + lodash.get "4.4.2" + lodash.set "4.3.2" + lodash.topath "4.5.2" + tiny-lru "8.0.2" + tslib "^2.4.0" + +"@graphql-tools/batch-delegate@8.4.21": + version "8.4.21" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-delegate/-/batch-delegate-8.4.21.tgz#765476c7b09ef4699beb07af228f2eeb1a78204b" + integrity sha512-NrnMGF6SHv7b0OWSyPUURZDoPGKEFTmTyYwVQ+iM950ZPBx3gOUPODZaXWpFVlFK2UGVNk6atvbigPDHnwSZnw== + dependencies: + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/utils" "9.2.1" + dataloader "2.2.2" + tslib "^2.4.0" + +"@graphql-tools/batch-execute@8.5.18", "@graphql-tools/batch-execute@^8.5.18": + version "8.5.18" + resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.5.18.tgz#2f0e91cc12e8eed32f14bc814f27c6a498b75e17" + integrity sha512-mNv5bpZMLLwhkmPA6+RP81A6u3KF4CSKLf3VX9hbomOkQR4db8pNs8BOvpZU54wKsUzMzdlws/2g/Dabyb2Vsg== + dependencies: + "@graphql-tools/utils" "9.2.1" + dataloader "2.2.2" + tslib "^2.4.0" + value-or-promise "1.0.12" + +"@graphql-tools/code-file-loader@7.3.21": + version "7.3.21" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.3.21.tgz#3eed4ff4610cf0a6f4b1be17d0bce1eec9359479" + integrity sha512-dj+OLnz1b8SYkXcuiy0CUQ25DWnOEyandDlOcdBqU3WVwh5EEVbn0oXUYm90fDlq2/uut00OrtC5Wpyhi3tAvA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "7.5.0" + "@graphql-tools/utils" "9.2.1" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/delegate@9.0.28", "@graphql-tools/delegate@^9.0.27": + version "9.0.28" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-9.0.28.tgz#026275094b2ff3f4cbbe99caff2d48775aeb67d6" + integrity sha512-8j23JCs2mgXqnp+5K0v4J3QBQU/5sXd9miaLvMfRf/6963DznOXTECyS9Gcvj1VEeR5CXIw6+aX/BvRDKDdN1g== + dependencies: + "@graphql-tools/batch-execute" "^8.5.18" + "@graphql-tools/executor" "^0.0.15" + "@graphql-tools/schema" "^9.0.16" + "@graphql-tools/utils" "^9.2.1" + dataloader "^2.2.2" + tslib "^2.5.0" + value-or-promise "^1.0.12" + +"@graphql-tools/executor-graphql-ws@^0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.11.tgz#c6536aa862f76a9c7ac83e7e07fe8d5119e6de38" + integrity sha512-muRj6j897ks2iKqe3HchWFFzd+jFInSRuLPvHJ7e4WPrejFvaZx3BQ9gndfJvVkfYUZIFm13stCGXaJJTbVM0Q== + dependencies: + "@graphql-tools/utils" "9.2.1" + "@repeaterjs/repeater" "3.0.4" + "@types/ws" "^8.0.0" + graphql-ws "5.11.3" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.12.1" + +"@graphql-tools/executor-http@^0.1.7": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-0.1.9.tgz#ddd74ef376b4a2ed59c622acbcca068890854a30" + integrity sha512-tNzMt5qc1ptlHKfpSv9wVBVKCZ7gks6Yb/JcYJluxZIT4qRV+TtOFjpptfBU63usgrGVOVcGjzWc/mt7KhmmpQ== + dependencies: + "@graphql-tools/utils" "^9.2.1" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/fetch" "^0.8.1" + dset "^3.1.2" + extract-files "^11.0.0" + meros "^1.2.1" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/executor-legacy-ws@^0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.9.tgz#1ff517998f750af2be9c1dae8924665a136e4986" + integrity sha512-L7oDv7R5yoXzMH+KLKDB2WHVijfVW4dB2H+Ae1RdW3MFvwbYjhnIB6QzHqKEqksjp/FndtxZkbuTIuAOsYGTYw== + dependencies: + "@graphql-tools/utils" "9.2.1" + "@types/ws" "^8.0.0" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.12.1" + +"@graphql-tools/executor@^0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-0.0.14.tgz#7c6073d75c77dd6e7fab0c835761ed09c85a3bc6" + integrity sha512-YiBbN9NT0FgqPJ35+Eg0ty1s5scOZTgiPf+6hLVJBd5zHEURwojEMCTKJ9e0RNZHETp2lN+YaTFGTSoRk0t4Sw== + dependencies: + "@graphql-tools/utils" "9.2.1" + "@graphql-typed-document-node/core" "3.1.1" + "@repeaterjs/repeater" "3.0.4" + tslib "^2.4.0" + value-or-promise "1.0.12" + +"@graphql-tools/executor@^0.0.15": + version "0.0.15" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-0.0.15.tgz#cbd29af2ec54213a52f6c516a7792b3e626a4c49" + integrity sha512-6U7QLZT8cEUxAMXDP4xXVplLi6RBwx7ih7TevlBto66A/qFp3PDb6o/VFo07yBKozr8PGMZ4jMfEWBGxmbGdxA== + dependencies: + "@graphql-tools/utils" "9.2.1" + "@graphql-typed-document-node/core" "3.1.2" + "@repeaterjs/repeater" "3.0.4" + tslib "^2.4.0" + value-or-promise "1.0.12" + +"@graphql-tools/graphql-file-loader@7.5.16": + version "7.5.16" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.16.tgz#d954b25ee14c6421ddcef43f4320a82e9800cb23" + integrity sha512-lK1N3Y2I634FS12nd4bu7oAJbai3bUc28yeX+boT+C83KTO4ujGHm+6hPC8X/FRGwhKOnZBxUM7I5nvb3HiUxw== + dependencies: + "@graphql-tools/import" "6.7.17" + "@graphql-tools/utils" "9.2.1" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/graphql-tag-pluck@7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.0.tgz#be99bc6b5e8331a2379ab4585d71b057eb981497" + integrity sha512-76SYzhSlH50ZWkhWH6OI94qrxa8Ww1ZeOU04MdtpSeQZVT2rjGWeTb3xM3kjTVWQJsr/YJBhDeNPGlwNUWfX4Q== + dependencies: + "@babel/parser" "^7.16.8" + "@babel/plugin-syntax-import-assertions" "7.20.0" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-tools/import@6.7.17": + version "6.7.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.7.17.tgz#ab51ed08bcbf757f952abf3f40793ce3db42d4a3" + integrity sha512-bn9SgrECXq3WIasgNP7ful/uON51wBajPXtxdY+z/ce7jLWaFE6lzwTDB/GAgiZ+jo7nb0ravlxteSAz2qZmuA== + dependencies: + "@graphql-tools/utils" "9.2.1" + resolve-from "5.0.0" + tslib "^2.4.0" + +"@graphql-tools/load@7.8.12": + version "7.8.12" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.8.12.tgz#6457fe6ec8cd2e2b5ca0d2752464bc937d186cca" + integrity sha512-JwxgNS2c6i6oIdKttcbXns/lpKiyN7c6/MkkrJ9x2QE9rXk5HOhSJxRvPmOueCuAin1542xUrcDRGBXJ7thSig== + dependencies: + "@graphql-tools/schema" "9.0.16" + "@graphql-tools/utils" "9.2.1" + p-limit "3.1.0" + tslib "^2.4.0" + +"@graphql-tools/merge@8.3.18": + version "8.3.18" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.18.tgz#bfbb517c68598a885809f16ce5c3bb1ebb8f04a2" + integrity sha512-R8nBglvRWPAyLpZL/f3lxsY7wjnAeE0l056zHhcO/CgpvK76KYUt9oEkR05i8Hmt8DLRycBN0FiotJ0yDQWTVA== + dependencies: + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-tools/optimize@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.3.1.tgz#29407991478dbbedc3e7deb8c44f46acb4e9278b" + integrity sha512-5j5CZSRGWVobt4bgRRg7zhjPiSimk+/zIuColih8E8DxuFOaJ+t0qu7eZS5KXWBkjcd4BPNuhUPpNlEmHPqVRQ== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/relay-operation-optimizer@^6.5.0": + version "6.5.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.17.tgz#4e4e2675d696a2a31f106b09ed436c43f7976f37" + integrity sha512-hHPEX6ccRF3+9kfVz0A3In//Dej7QrHOLGZEokBmPDMDqn9CS7qUjpjyGzclbOX0tRBtLfuFUZ68ABSac3P1nA== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-tools/schema@9.0.16", "@graphql-tools/schema@^9.0.0", "@graphql-tools/schema@^9.0.16": + version "9.0.16" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.16.tgz#7d340d69e6094dc01a2b9e625c7bb4fff89ea521" + integrity sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ== + dependencies: + "@graphql-tools/merge" "8.3.18" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + value-or-promise "1.0.12" + +"@graphql-tools/stitch@8.7.42": + version "8.7.42" + resolved "https://registry.yarnpkg.com/@graphql-tools/stitch/-/stitch-8.7.42.tgz#25478f518f57d7e2851f2b18174d35a6b6363054" + integrity sha512-3GmHcxG2UB+r6qGWe2VzvTyFuCuDuBUquAkvWcx+mESiIDOxNdNTQKN69VGNkie+RavlCWUHE3SmhY8u7Z+7wQ== + dependencies: + "@graphql-tools/batch-delegate" "8.4.21" + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/merge" "8.3.18" + "@graphql-tools/schema" "9.0.16" + "@graphql-tools/utils" "9.2.1" + "@graphql-tools/wrap" "9.3.7" + tslib "^2.4.0" + value-or-promise "^1.0.11" + +"@graphql-tools/stitching-directives@2.3.31": + version "2.3.31" + resolved "https://registry.yarnpkg.com/@graphql-tools/stitching-directives/-/stitching-directives-2.3.31.tgz#299bcdfdbd5f1a808ded0d7dd4e9f9a217448b01" + integrity sha512-XX81hqZy4IHB2OwrG1escEA5yT5ZBxUYoHaxohAa8gaYUij5Xc6l4qzZ8HT05T1x1mNhFFNILEgQaJA1EDGv/A== + dependencies: + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + +"@graphql-tools/url-loader@7.17.13": + version "7.17.13" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.17.13.tgz#d4ee8193792ab1c42db2fbdf5f6ca75fa819ac40" + integrity sha512-FEmbvw68kxeZLn4VYGAl+NuBPk09ZnxymjW07A6mCtiDayFgYfHdWeRzXn/iM5PzsEuCD73R1sExtNQ/ISiajg== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/delegate" "^9.0.27" + "@graphql-tools/executor-graphql-ws" "^0.0.11" + "@graphql-tools/executor-http" "^0.1.7" + "@graphql-tools/executor-legacy-ws" "^0.0.9" + "@graphql-tools/utils" "^9.2.1" + "@graphql-tools/wrap" "^9.3.6" + "@types/ws" "^8.0.0" + "@whatwg-node/fetch" "^0.8.0" + isomorphic-ws "^5.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.11" + ws "^8.12.0" + +"@graphql-tools/utils@9.2.1", "@graphql-tools/utils@^9.0.0", "@graphql-tools/utils@^9.1.1", "@graphql-tools/utils@^9.2.1": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" + integrity sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + tslib "^2.4.0" + +"@graphql-tools/utils@^8.8.0": + version "8.13.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.1.tgz#b247607e400365c2cd87ff54654d4ad25a7ac491" + integrity sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/wrap@9.3.7", "@graphql-tools/wrap@^9.3.6": + version "9.3.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.3.7.tgz#97d7efdb8dfee41624e154b2de4499397634422e" + integrity sha512-gavfiWLKgvmC2VPamnMzml3zmkBoo0yt+EmOLIHY6O92o4uMTR281WGM77tZIfq+jzLtjoIOThUSjC/cN/6XKg== + dependencies: + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/schema" "9.0.16" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + value-or-promise "1.0.12" + +"@graphql-typed-document-node/core@3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + +"@graphql-typed-document-node/core@3.1.2", "@graphql-typed-document-node/core@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.2.tgz#6fc464307cbe3c8ca5064549b806360d84457b04" + integrity sha512-9anpBMM9mEgZN4wr2v8wHJI2/u5TnnggewRN6OlvXTTnuVyoY19X6rOv9XTqKRw6dcGKwZsBi8n0kDE2I5i4VA== + +"@graphql-yoga/subscription@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-3.1.0.tgz#4a0bb0b9db2602d02c68f9828603e1e40329140b" + integrity sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg== + dependencies: + "@graphql-yoga/typed-event-target" "^1.0.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/events" "0.0.2" + tslib "^2.3.1" + +"@graphql-yoga/typed-event-target@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-1.0.0.tgz#dae3c0146f08a4dc30b5b890f8bab706c2b62199" + integrity sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.3.1" + "@grpc/grpc-js@~1.7.0": version "1.7.3" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" @@ -2255,7 +3230,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -2716,6 +3691,33 @@ "@octokit/webhooks-types" "6.10.0" aggregate-error "^3.1.0" +"@peculiar/asn1-schema@^2.1.6", "@peculiar/asn1-schema@^2.3.0": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz#21418e1f3819e0b353ceff0c2dad8ccb61acd777" + integrity sha512-6GptMYDMyWBHTUKndHaDsRZUO/XMSgIns2krxcm2L7SEExRHwawFvSwNBhqNPR9HJwv3MruAiF1bhN0we6j6GQ== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.1.tgz#821493bd5ad0f05939bd5f53b28536f68158360a" + integrity sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw== + dependencies: + "@peculiar/asn1-schema" "^2.3.0" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.4.1" + webcrypto-core "^1.7.4" + "@pedrouid/environment@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec" @@ -2869,6 +3871,11 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.1.tgz#3bb0b6ddc0a276e8dc1138d08f63035e4e23e8bf" integrity sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw== +"@repeaterjs/repeater@3.0.4", "@repeaterjs/repeater@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" + integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== + "@rollup/plugin-inject@^5.0.1": version "5.0.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz#0783711efd93a9547d52971db73b2fb6140a67b1" @@ -4390,6 +5397,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.0.0": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -5218,6 +6232,79 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" +"@whatwg-node/events@0.0.2", "@whatwg-node/events@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.2.tgz#7b7107268d2982fc7b7aff5ee6803c64018f84dd" + integrity sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w== + +"@whatwg-node/fetch@^0.8.0", "@whatwg-node/fetch@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.1.tgz#ee3c94746132f217e17f78f9e073bb342043d630" + integrity sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.0" + busboy "^1.6.0" + urlpattern-polyfill "^6.0.2" + web-streams-polyfill "^3.2.1" + +"@whatwg-node/node-fetch@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz#7c7e90d03fa09d0ddebff29add6f16d923327d58" + integrity sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w== + dependencies: + "@whatwg-node/events" "^0.0.2" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + +"@whatwg-node/router@0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@whatwg-node/router/-/router-0.3.0.tgz#70002afb4a8ef4b544894c8344933e9559c0ba40" + integrity sha512-d7qzIvbbBm6d0VpJGlRbp/G9PTLRCcpS9fRNnfjE87ZbWbB05vBzHkaUyOs2zaTny/GPuBzrEY2QewoLj4+5JQ== + dependencies: + "@whatwg-node/fetch" "^0.8.0" + "@whatwg-node/server" "^0.7.0" + tslib "^2.3.1" + +"@whatwg-node/server@^0.6.7": + version "0.6.7" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.6.7.tgz#14f5d0aca49308759d64fc7faa3cbfc20162a1ee" + integrity sha512-M4zHWdJ6M1IdcxnZBdDmiUh1bHQ4gPYRxzkH0gh8Qf6MpWJmX6I/MNftqem3GNn+qn1y47qqlGSed7T7nzsRFw== + dependencies: + "@whatwg-node/fetch" "^0.8.1" + tslib "^2.3.1" + +"@whatwg-node/server@^0.7.0": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.7.1.tgz#ee33c5f1bdeab26bb2f77761083789833cd8d493" + integrity sha512-kXZeJ+8vLD8Snewq0N1TB2cWPu6z91ymrRRLDx0KHmbsSrsPIdrXxoHBAvFBxTQz3u2O4IYsyhHetAnBBrrWgA== + dependencies: + "@whatwg-node/fetch" "^0.8.1" + tslib "^2.3.1" + +"@wry/context@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8" + integrity sha512-LcDAiYWRtwAoSOArfk7cuYvFXytxfVrdX7yxoUmK7pPITLk5jYh2F8knCwS7LjgYL8u1eidPlKKV6Ikqq0ODqQ== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.3.tgz#fafebc69561aa2d40340da89fa7dc4b1f6fb7831" + integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.3.2.tgz#a06f235dc184bd26396ba456711f69f8c35097e6" + integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ== + dependencies: + tslib "^2.3.0" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -5363,6 +6450,16 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== +ajv@8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -5650,6 +6747,11 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +asap@^2.0.6, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -5667,6 +6769,15 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -5729,6 +6840,11 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + autoprefixer@^10.4.13: version "10.4.13" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" @@ -5890,6 +7006,44 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -5900,6 +7054,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" + integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== + base-x@^3.0.2: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" @@ -6296,6 +7455,13 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -6402,7 +7568,7 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.1: +camel-case@4.1.2, camel-case@^4.1.1, camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== @@ -6448,6 +7614,15 @@ caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.300014 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz#a8d11f6a814c75c9ce9d851dc53eb1d1dfbcd657" integrity sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw== +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -6500,6 +7675,56 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case-all@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" + integrity sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case-all@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" + integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case@4.1.2, change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" @@ -6655,6 +7880,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -6756,6 +7990,11 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== +common-tags@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -6825,6 +8064,15 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -6908,6 +8156,16 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.0.tgz#947e174c796483ccf0a48476c24e4fefb7e1aea8" + integrity sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -7133,6 +8391,16 @@ data-uri-to-buffer@0.0.3: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz#18ae979a6a0ca994b0625853916d2662bbae0b1a" integrity sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw== +dataloader@2.2.2, dataloader@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + +dayjs@1.11.7: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" @@ -7298,6 +8566,11 @@ depd@^1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dependency-graph@0.11.0, dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -7415,6 +8688,14 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +dnscache@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dnscache/-/dnscache-1.0.2.tgz#fd3c24d66c141625f594c77be7a8dafee2a66c8a" + integrity sha512-2FFKzmLGOnD+Y378bRKH+gTjRMuSpH7OKgPy31KjjfCoKZx7tU8Dmqfd/3fhG2d/4bppuN8/KtWMUZBAcUCRnQ== + dependencies: + asap "^2.0.6" + lodash.clone "^4.5.0" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -7501,11 +8782,21 @@ dotenv-expand@^5.1.0: resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== +dotenv@16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + dotenv@^8.0.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dset@^3.1.1, dset@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" + integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -8449,6 +9740,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-files@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" + integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -8464,6 +9760,11 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -8502,7 +9803,7 @@ fast-json-parse@^1.0.3: resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d" integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw== -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -8512,6 +9813,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-querystring@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.1.tgz#f4c56ef56b1a954880cfd8c01b83f9e1a3d3fda2" + integrity sha512-qR2r+e3HvhEFmpdHMv//U8FnFlnYjaC6QKDuaXALDkw2kvHO8WDjxH+f/rHGR4Me4pnk8p9JAkRNTjYHAKRn2Q== + dependencies: + fast-decode-uri-component "^1.0.1" + fast-redact@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" @@ -8527,6 +9835,13 @@ fast-stable-stringify@^1.0.0: resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -8548,6 +9863,24 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + fetch-retry@^5.0.2: version "5.0.3" resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.3.tgz#edfa3641892995f9afee94f25b168827aa97fe3d" @@ -8752,6 +10085,11 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== +foreach@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== + foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -9146,7 +10484,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -9185,7 +10523,7 @@ globalthis@^1.0.0, globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@^11.0.2, globby@^11.1.0: +globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -9233,6 +10571,45 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphql-import-node@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/graphql-import-node/-/graphql-import-node-0.0.5.tgz#caf76a6cece10858b14f27cce935655398fc1bf0" + integrity sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q== + +graphql-tag@^2.11.0, graphql-tag@^2.12.6: + version "2.12.6" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql-ws@5.11.3: + version "5.11.3" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.11.3.tgz#eaf8e6baf669d167975cff13ad86abca4ecfe82f" + integrity sha512-fU8zwSgAX2noXAsuFiCZ8BtXeXZOzXyK5u1LloCdacsVth4skdBMPO74EG51lBoWSIZ8beUocdpV8+cQHBODnQ== + +graphql-yoga@3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-3.7.0.tgz#40729798a8ed9c274dc16f3aa85ab5f97ed62f49" + integrity sha512-yL5oAD1VnK2J8qZFNVy+T2Z5t7YByv7HmCB1fzE26hoILEgY97eKvDYZwXRcPxoN/OhzbN8I42ffCf0dv9Dp8g== + dependencies: + "@envelop/core" "^3.0.4" + "@envelop/validation-cache" "^5.1.2" + "@graphql-tools/executor" "^0.0.14" + "@graphql-tools/schema" "^9.0.0" + "@graphql-tools/utils" "^9.2.1" + "@graphql-yoga/subscription" "^3.1.0" + "@whatwg-node/fetch" "^0.8.1" + "@whatwg-node/server" "^0.6.7" + dset "^3.1.1" + lru-cache "^7.14.1" + tslib "^2.3.1" + +graphql@^16.6.0: + version "16.6.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" + integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== + handlebars@^4.7.7: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -9437,6 +10814,14 @@ he@1.2.0, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + hey-listen@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" @@ -9612,11 +10997,21 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immer@^9.0.16: version "9.0.18" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.18.tgz#d2faee58fd0e34f017f329b98cdab37826fa31b8" integrity sha512-eAPNpsj7Ax1q6Y/3lm2PmlwRcFzpON7HSNQ3ru5WQH1/PSpnyed/HpNOELl2CxLKoj4r+bAHgdyKqW5gc2Se1A== +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== + import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -9625,6 +11020,11 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -9689,6 +11089,13 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + iota-array@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" @@ -9709,6 +11116,14 @@ is-absolute-url@^3.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -9936,6 +11351,13 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -10000,6 +11422,13 @@ is-regex@^1.1.2, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" @@ -10052,11 +11481,25 @@ is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -10092,7 +11535,7 @@ is-window@^1.0.2: resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" integrity sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg== -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -10154,6 +11597,11 @@ isomorphic-unfetch@^3.1.0: node-fetch "^2.6.1" unfetch "^4.2.0" +isomorphic-ws@5.0.0, isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" @@ -10408,6 +11856,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +json-bigint-patch@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/json-bigint-patch/-/json-bigint-patch-0.0.8.tgz#45d954da1f21c6d4f3ae9ef64c9ac227cd0ab0fe" + integrity sha512-xa0LTQsyaq8awYyZyuUsporWisZFiyqzxGW8CKM3t7oouf0GFAKYJnqAm6e9NLNBQOCtOLvy614DEiRX/rPbnA== + json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -10418,6 +11871,13 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-pointer@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" + integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== + dependencies: + foreach "^2.0.4" + json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz#bf5ff7d029e1c1bf20cb6c0e9f348dcd8be5a393" @@ -10436,6 +11896,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" @@ -10451,6 +11916,11 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json5@2.2.3, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + json5@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -10458,11 +11928,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -10602,6 +12067,13 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" @@ -10675,6 +12147,13 @@ loader-utils@^2.0.0, loader-utils@^2.0.4: emojis-list "^3.0.0" json5 "^2.1.2" +localforage@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -10707,11 +12186,21 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.get@4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.isequal@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -10722,12 +12211,22 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.set@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== + +lodash.topath@4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== + lodash.uniq@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10750,7 +12249,7 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -10772,6 +12271,13 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -10793,6 +12299,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.1.tgz#4716408dec51d5d0104732647f584d1f6738b109" + integrity sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg== + lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -10846,7 +12357,7 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== @@ -10994,6 +12505,11 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +meros@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/meros/-/meros-1.2.1.tgz#056f7a76e8571d0aaf3c7afcbe7eb6407ff7329e" + integrity sha512-R2f/jxYqCAGI19KhAvaxSOxALBMkaXWH2a7rOyqQw+ZmizX5bKkEYWLzdhC+U82ZVVPVp6MCXe3EkVligh+12g== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -11179,6 +12695,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.3.tgz#b083ff37be046fd3d6552468c1f0ff44c1545d1f" + integrity sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw== + mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -11514,6 +13035,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -11524,7 +13050,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -11543,6 +13069,11 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== +object-inspect@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" @@ -11690,7 +13221,7 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^7.0.3: +open@7.4.2, open@^7.0.3: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -11707,6 +13238,14 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +optimism@^0.16.1: + version "0.16.2" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081" + integrity sha512-zWNbgWj+3vLEjZNIh/okkY2EUfX+vB9TJopzIZwT1xxaMqC5hRLLraePod4c5n4He08xuXNH+zhKFFCu390wiQ== + dependencies: + "@wry/context" "^0.7.0" + "@wry/trie" "^0.3.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -11767,6 +13306,13 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== +p-limit@3.1.0, p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -11774,13 +13320,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -11847,7 +13386,7 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" -param-case@^3.0.3: +param-case@3.0.4, param-case@^3.0.3, param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== @@ -11892,6 +13431,15 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -11919,7 +13467,7 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.2: +pascal-case@3.1.2, pascal-case@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== @@ -11937,6 +13485,19 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== +path-browserify@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -11979,6 +13540,18 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== + dependencies: + path-root-regex "^0.1.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -12402,6 +13975,13 @@ promise.prototype.finally@^3.1.0: define-properties "^1.1.4" es-abstract "^1.20.4" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -12528,7 +14108,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^1.2.4: +punycode@^1.2.4, punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== @@ -12538,6 +14118,18 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pvtsutils@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" + integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + dependencies: + tslib "^2.4.0" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + qrcode@1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" @@ -12752,6 +14344,19 @@ react-merge-refs@^1.0.0: resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== +react-native-fs@2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.20.0.tgz#05a9362b473bfc0910772c0acbb73a78dbc810f6" + integrity sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ== + dependencies: + base-64 "^0.1.0" + utf8 "^3.0.0" + +react-native-path@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/react-native-path/-/react-native-path-0.0.5.tgz#a04e4b73a535a8a7cf15c6e760e27db7789afb13" + integrity sha512-WJr256xBquk7X2O83QYWKqgLg43Zg3SrgjPc/kr0gCD2LoXA+2L72BW4cmstH12GbGeutqs/eXk3jgDQ2iCSvQ== + react-query@^3.39.2: version "3.39.3" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35" @@ -13009,6 +14614,15 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== +relay-runtime@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" + integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + invariant "^2.2.4" + remark-external-links@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" @@ -13146,6 +14760,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -13161,16 +14780,16 @@ resize-observer-polyfill@^1.5.1: resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -13194,6 +14813,11 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +response-iterator@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" + integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -13211,6 +14835,11 @@ rimraf@3.0.2, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.1.2.tgz#20dfbc98083bdfaa28b01183162885ef213dbf7c" + integrity sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ== + rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -13454,6 +15083,15 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -13518,7 +15156,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== @@ -13536,6 +15174,11 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +sha1-es@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/sha1-es/-/sha1-es-1.8.2.tgz#6957c79749f67bf056732abbe53d424ff4205286" + integrity sha512-7gzO0Y7RBt1Qsq8D1fC+So6zsnkwRcZas8sGO9Xp4bOkDhG5s4fzSP0i9yUs6aVzSH7+urqqh6uk0z+dMDeF9A== + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -13586,6 +15229,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -13601,6 +15249,14 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -13740,6 +15396,13 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== +sponge-case@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" + integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== + dependencies: + tslib "^2.0.3" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -13875,6 +15538,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -14120,6 +15788,18 @@ sveltedoc-parser@^4.2.1: espree "9.2.0" htmlparser2-svelte "4.1.0" +swap-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" + integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== + dependencies: + tslib "^2.0.3" + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + symbol.prototype.description@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/symbol.prototype.description/-/symbol.prototype.description-1.0.5.tgz#d30e01263b6020fbbd2d2884a6276ce4d49ab568" @@ -14320,11 +16000,23 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-lru@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-8.0.2.tgz#812fccbe6e622ded552e3ff8a4c3b5ff34a85e4c" + integrity sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg== + tiny-warning@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +title-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== + dependencies: + tslib "^2.0.3" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -14425,6 +16117,13 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + ts-loader@^9.4.1: version "9.4.2" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" @@ -14435,7 +16134,7 @@ ts-loader@^9.4.1: micromatch "^4.0.0" semver "^7.3.4" -ts-node@^10.9.1: +ts-node@10.9.1, ts-node@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -14459,7 +16158,7 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tsconfig-paths@^4.0.0: +tsconfig-paths@4.1.2, tsconfig-paths@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz#4819f861eef82e6da52fb4af1e8c930a39ed979a" integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== @@ -14473,11 +16172,16 @@ tslib@1.14.1, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0, tslib@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@~2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -14575,11 +16279,21 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript@4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + typescript@^4.9.3: version "4.9.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +ua-parser-js@^0.7.30: + version "0.7.33" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== + uglify-js@^3.1.4: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" @@ -14609,6 +16323,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -14762,6 +16481,13 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + unload@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7" @@ -14803,6 +16529,20 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -14832,6 +16572,13 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +urlpattern-polyfill@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz#a193fe773459865a2a5c93b246bb794b13d07256" + integrity sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg== + dependencies: + braces "^3.0.2" + use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0, use-sync-external-store@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" @@ -14849,6 +16596,11 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "^4.3.0" +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -14954,6 +16706,11 @@ valtio@1.9.0: proxy-compare "2.4.0" use-sync-external-store "1.2.0" +value-or-promise@1.0.12, value-or-promise@^1.0.11, value-or-promise@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" + integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -15068,6 +16825,22 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-streams-polyfill@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + +webcrypto-core@^1.7.4: + version "1.7.6" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.6.tgz#e32c4a12a13de4251f8f9ef336a6cba7cdec9b55" + integrity sha512-TBPiewB4Buw+HI3EQW+Bexm19/W4cP/qZG/02QJCXN+iN+T5sl074vZ3rJcle/ZtDBQSgjkbsQO/1eFcxnSBUA== + dependencies: + "@peculiar/asn1-schema" "^2.1.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -15366,6 +17139,11 @@ ws@7.5.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== +ws@8.12.1, ws@^8.12.0, ws@^8.5.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + ws@^7.4.0, ws@^7.4.5, ws@^7.5.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -15376,11 +17154,6 @@ ws@^8.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== -ws@^8.5.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" - integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== - x-default-browser@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481" @@ -15449,6 +17222,11 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.9: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -15472,6 +17250,19 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@17.7.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^13.2.4: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" @@ -15515,6 +17306,18 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + zustand@^4.3.1: version "4.3.3" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.3.tgz#c9113499074dde2d6d99c1b5f591e9329572c224" From 099e6d76d6e24d10233be0ff533768b66baa4e5b Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Wed, 8 Mar 2023 17:56:36 -0300 Subject: [PATCH 07/23] chore: UI polyfills for build command (#165) * chore: fix vite plugin for polyfills * chore: add prod script command to run production version * refactor: hash router to run on ipfs --- ui/package.json | 5 +- ui/src/app.tsx | 6 +- ui/vite.config.ts | 33 +- ui/yarn.lock | 2139 ++++++++++++++++++++++----------------------- 4 files changed, 1047 insertions(+), 1136 deletions(-) diff --git a/ui/package.json b/ui/package.json index 3da6e2e3..cfc67333 100644 --- a/ui/package.json +++ b/ui/package.json @@ -9,6 +9,7 @@ "build": "yarn graphclient build && vite build", "postinstall": "graphclient build", "preview": "vite preview", + "prod": "yarn build && npx serve dist -s", "storybook": "export SET NODE_OPTIONS=--openssl-legacy-provider && start-storybook -p 6006", "build-storybook": "build-storybook" }, @@ -40,8 +41,6 @@ }, "devDependencies": { "@babel/core": "^7.20.12", - "@esbuild-plugins/node-globals-polyfill": "^0.1.1", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@graphprotocol/client-cli": "^2.2.19", "@storybook/addon-actions": "^6.5.15", "@storybook/addon-essentials": "^6.5.15", @@ -73,12 +72,12 @@ "prettier": "^2.8.0", "process": "^0.11.10", "react-query": "^3.39.2", - "rollup-plugin-polyfill-node": "^0.12.0", "storybook-dark-mode": "^2.0.5", "tailwindcss": "^3.2.4", "ts-loader": "^9.4.1", "typescript": "^4.9.3", "vite": "^3.2.4", + "vite-plugin-node-polyfills": "^0.7.0", "vite-tsconfig-paths": "^3.6.0" } } diff --git a/ui/src/app.tsx b/ui/src/app.tsx index 10d3c5b9..c956c370 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,4 +1,4 @@ -import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom'; +import { HashRouter, Route, Routes, Navigate } from 'react-router-dom'; import { themeGlobals } from '@/theme/globals'; import { ComponentsTest, Home, Mint } from './views'; import { SVGTestScreen } from './views/svg-test'; // TODO: remove when done @@ -14,7 +14,7 @@ export const App = () => { {/* TODO remove after adding NavBar */} - + } /> } /> @@ -25,7 +25,7 @@ export const App = () => { } /> } /> - + ); }; diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 355e67ac..8690d0b4 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -1,38 +1,9 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; -import EslintGlobalsPolyfills from '@esbuild-plugins/node-globals-polyfill'; -import EslintModulePolyfills from '@esbuild-plugins/node-modules-polyfill'; -import rollupNodePolyfill from 'rollup-plugin-polyfill-node'; +import { nodePolyfills } from 'vite-plugin-node-polyfills'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [tsconfigPaths(), react()], - - optimizeDeps: { - esbuildOptions: { - // Node.js global to browser globalThis - define: { - global: 'globalThis', - }, - - // Enable esbuild polyfill plugins - plugins: [ - EslintGlobalsPolyfills({ - buffer: true, - process: true, - }), - EslintModulePolyfills(), - ], - }, - }, - build: { - rollupOptions: { - plugins: [ - // Enable rollup polyfills plugin - // used during production bundling - rollupNodePolyfill(), - ], - }, - }, + plugins: [tsconfigPaths(), react(), nodePolyfills({ protocolImports: true })], }); diff --git a/ui/yarn.lock b/ui/yarn.lock index 1098ed79..d17c95fd 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": +"@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -11,9 +11,9 @@ "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@^3.7.9": - version "3.7.9" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.9.tgz#459454dc4a7c81adaa66e13e626ce41f633dc862" - integrity sha512-YnJvrJOVWrp4y/zdNvUaM8q4GuSHCEIecsRDTJhK/veT33P/B7lfqGJ24NeLdKMj8tDEuXYF7V0t+th4+rgC+Q== + version "3.7.10" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.10.tgz#addc5fcebaf016981d9476268a06d529be83f568" + integrity sha512-/k1MfrqPKYiPNdHcOzdxg9cEx96vhAGxAcSorzfBvV29XtFQcYW2cPNQOTjK/fpSMtqVo8UNmu5vwQAWD1gfCg== dependencies: "@graphql-typed-document-node/core" "^3.1.1" "@wry/context" "^0.7.0" @@ -67,9 +67,9 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== "@babel/core@7.12.9": version "7.12.9" @@ -93,28 +93,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.19.6", "@babel/core@^7.20.12", "@babel/core@^7.7.5": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/core@^7.14.0": +"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.19.6", "@babel/core@^7.20.12", "@babel/core@^7.7.5": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== @@ -135,16 +114,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/generator@^7.14.0", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1": +"@babel/generator@^7.12.11", "@babel/generator@^7.12.5", "@babel/generator@^7.14.0", "@babel/generator@^7.21.0", "@babel/generator@^7.21.1": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== @@ -180,27 +150,27 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.12", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" + integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" + integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + regexpu-core "^5.3.1" "@babel/helper-define-polyfill-provider@^0.1.5": version "0.1.5" @@ -240,15 +210,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-function-name@^7.21.0": +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== @@ -263,12 +225,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" + integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.18.6": version "7.18.6" @@ -277,21 +239,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== @@ -375,10 +323,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" @@ -390,16 +338,7 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.12.5", "@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" - -"@babel/helpers@^7.21.0": +"@babel/helpers@^7.12.5", "@babel/helpers@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== @@ -417,12 +356,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.7", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.13.tgz#ddf1eb5a813588d2fb1692b70c6fce75b945c088" - integrity sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw== - -"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": +"@babel/parser@^7.12.11", "@babel/parser@^7.12.7", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== @@ -462,24 +396,24 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.12.12": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz#b6bea3b18e88443688fa7ed2cc06d2c60da9f4a7" - integrity sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz#70e0c89fdcd7465c97593edb8f628ba6e4199d63" + integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.12" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.19.0" + "@babel/plugin-syntax-decorators" "^7.21.0" "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" @@ -566,9 +500,9 @@ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.12.7", "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" @@ -583,12 +517,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.12.1", "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -621,12 +555,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" - integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== +"@babel/plugin-syntax-decorators@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz#d2b3f31c3e86fa86e16bb540b7660c55bd7d0e78" + integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -770,21 +704,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.0.0": +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.20.2": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-block-scoping@^7.12.12", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a" - integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.0.0": +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== @@ -799,21 +726,6 @@ "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.12.1", "@babel/plugin-transform-classes@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - "@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.18.9": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" @@ -852,7 +764,7 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.0.0": +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.18.6": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5" integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== @@ -860,28 +772,13 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-flow-strip-types@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" - integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-flow" "^7.18.6" - -"@babel/plugin-transform-for-of@^7.0.0": +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.18.8": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" @@ -913,7 +810,7 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.0.0": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.19.6": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== @@ -922,15 +819,6 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" - "@babel/plugin-transform-modules-systemjs@^7.19.6": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" @@ -1001,11 +889,11 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx-self@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" - integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz#ec98d4a9baafc5a1eb398da4cf94afbb40254a54" + integrity sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-react-jsx-source@^7.19.6": version "7.19.6" @@ -1014,7 +902,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-react-jsx@^7.0.0": +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.19.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz#656b42c2fdea0a6d8762075d58ef9d4e3c4ab8a2" integrity sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg== @@ -1025,17 +913,6 @@ "@babel/plugin-syntax-jsx" "^7.18.6" "@babel/types" "^7.21.0" -"@babel/plugin-transform-react-jsx@^7.12.12", "@babel/plugin-transform-react-jsx@^7.18.6", "@babel/plugin-transform-react-jsx@^7.19.0": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz#f950f0b0c36377503d29a712f16287cedf886cbb" - integrity sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.20.7" - "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" @@ -1060,12 +937,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.5.5": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz#2a884f29556d0a68cd3d152dcc9e6c71dfb6eee8" + integrity sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -1107,12 +984,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.18.6": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz#e3581b356b8694f6ff450211fe6774eaff8d25ab" - integrity sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA== +"@babel/plugin-transform-typescript@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.0.tgz#f0956a153679e3b377ae5b7f0143427151e4c848" + integrity sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.12" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" @@ -1245,18 +1122,18 @@ "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.12.7": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz#bcbbca513e8213691fe5d4b23d9251e01f00ebff" + integrity sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-transform-typescript" "^7.21.0" "@babel/register@^7.12.1": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" - integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.21.0.tgz#c97bf56c2472e063774f31d344c592ebdcefa132" + integrity sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1264,6 +1141,11 @@ pirates "^4.0.5" source-map-support "^0.5.16" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "@babel/runtime@7.7.2": version "7.7.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.2.tgz#111a78002a5c25fc8e3361bedc9529c696b85a6a" @@ -1272,9 +1154,9 @@ regenerator-runtime "^0.13.2" "@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.2", "@babel/runtime@^7.17.8", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" @@ -1294,23 +1176,7 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.4.5": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": +"@babel/traverse@^7.1.6", "@babel/traverse@^7.12.11", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.4.5": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== @@ -1326,7 +1192,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.21.0", "@babel/types@^7.21.2": +"@babel/types@^7.0.0", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== @@ -1335,15 +1201,6 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -1520,19 +1377,6 @@ sha1-es "^1.8.2" tslib "^2.5.0" -"@esbuild-plugins/node-globals-polyfill@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz#a313ab3efbb2c17c8ce376aa216c627c9b40f9d7" - integrity sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg== - -"@esbuild-plugins/node-modules-polyfill@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz#cefa3dc0bd1c16277a8338b52833420c94987327" - integrity sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA== - dependencies: - escape-string-regexp "^4.0.0" - rollup-plugin-node-polyfills "^0.2.1" - "@esbuild/android-arm@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" @@ -1543,7 +1387,7 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== -"@eslint/eslintrc@^1.0.5", "@eslint/eslintrc@^1.4.1": +"@eslint/eslintrc@^1.0.5": version "1.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== @@ -1558,6 +1402,26 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" + integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.35.0": + version "8.35.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" + integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -1900,15 +1764,15 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@firebase/analytics-compat@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.3.tgz#ed60472dcd2bfa3f2fa7a5478b63bb7aece652ed" - integrity sha512-HmvbB4GMgh8AUlIDIo/OuFENLCGRXxMvtOueK+m8+DcfqBvG+mkii0Mi9ovo0TnMM62cy3oBYG7PHdjIQNLSLA== +"@firebase/analytics-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.4.tgz#3887676286ead7b30f9880581e0144f43bc71f16" + integrity sha512-ZN4K49QwOR8EWIUTV03VBdcVkz8sVsfJmve4g2+FEIj0kyTK0MdoVTWNOwWj9TVi2p/7FvKRKkpWxkydmi9x7g== dependencies: - "@firebase/analytics" "0.9.3" + "@firebase/analytics" "0.9.4" "@firebase/analytics-types" "0.8.0" - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/analytics-types@0.8.0": @@ -1916,27 +1780,27 @@ resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.8.0.tgz#551e744a29adbc07f557306530a2ec86add6d410" integrity sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw== -"@firebase/analytics@0.9.3": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.9.3.tgz#ae653a6c6bcd667efd1d3cc5207e3e621d737028" - integrity sha512-XdYHBi6RvHYVAHGyLxXX0uRPwZmGeqw1JuWS1rMEeRF/jvbxnrL81kcFAHZVRkEvG9bXAJgL2fX9wmDo3e622w== +"@firebase/analytics@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.9.4.tgz#1b863bd795c3dbe3d278467e8c9dd0e6c54f37a3" + integrity sha512-Mb2UaD0cyJ9DrTk4Okz8wqpjZuVRVXHZOjhbQcmGb8VtibXY1+jm/k3eJ21r7NqUKnjWejYM2EX+hI9+dtXGkQ== dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" -"@firebase/app-check-compat@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.3.tgz#a1d594ec722fa81f7e11977b407a187e8afdb19a" - integrity sha512-25AQ4W7WUL8OWas40GsABuNU622Dm1ojbfeZ03uKtLj5Af7FerJ25u7zkgm+11pc6rpr5v8E5oxEG9vmNRndEA== +"@firebase/app-check-compat@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.4.tgz#43cad88c9211a84bb98f205ba075c34acd8933c2" + integrity sha512-s6ON0ixPKe99M1DNYMI2eR5aLwQZgy0z8fuW1tnEbzg5p/N/GKFmqiIHSV4gfp8+X7Fw5NLm7qMfh4xrcPgQCw== dependencies: - "@firebase/app-check" "0.6.3" + "@firebase/app-check" "0.6.4" "@firebase/app-check-types" "0.5.0" - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/app-check-interop-types@0.2.0": @@ -1949,25 +1813,25 @@ resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.5.0.tgz#1b02826213d7ce6a1cf773c329b46ea1c67064f4" integrity sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ== -"@firebase/app-check@0.6.3": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.6.3.tgz#221060e5e0eac1e20ee724478b61e89ad6e8420a" - integrity sha512-T9f9ceFLs7x4D2T6whu5a6j7B3qPuYHiZHZxW6DkMh/FoMmRA4/q/HVyu01i9+LyJJx2Xdo6eCcj6ofs9YZjqA== +"@firebase/app-check@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.6.4.tgz#cb2f7b23f80126800a5632c1d766635266e1b2ff" + integrity sha512-M9qyVTWkEkHXmgwGtObvXQqKcOe9iKAOPqm0pCe74mzgKVTNq157ff39+fxHPb4nFbipToY+GuvtabLUzkHehQ== dependencies: - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" -"@firebase/app-compat@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.3.tgz#a31c823d415c041591ee8c355776cd5bca7ef6e2" - integrity sha512-sX6rD1KFX6K2CuCnQvc9jZLOgAFZ+sv2jKKahIl4SbTM561D682B8n4Jtx/SgDrvcTVTdb05g4NhZOws9hxYxA== +"@firebase/app-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.4.tgz#610bf28a655373e6b4cda2115fb594f3c576d7d5" + integrity sha512-eYKtxMrzi+icZ6dFeJEoEpxu3aq1jp2PeL5vPIOAavJpdgRWFmSGmw3a46Hkay+GGGX4fkJG3vCfuoQsf5ksjA== dependencies: - "@firebase/app" "0.9.3" - "@firebase/component" "0.6.3" + "@firebase/app" "0.9.4" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/app-types@0.9.0": @@ -1975,26 +1839,26 @@ resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.0.tgz#35b5c568341e9e263b29b3d2ba0e9cfc9ec7f01e" integrity sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q== -"@firebase/app@0.9.3": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.9.3.tgz#6a9c9b2544fa9a50ad8f405355896c54339c228b" - integrity sha512-G79JUceVDaHRZ4WkA11GyVldVXhdyRJRwWVQFFvAAVfQJLvy2TA6lQjeUn28F6FmeUWxDGwPC30bxCRWq7Op8Q== +"@firebase/app@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.9.4.tgz#28eb5cd0406f92825afb32a53194d59c19cddb7b" + integrity sha512-xX8I6pNqUxhxhaghy9fbjOWOP9ndx5UeN5F0V/PWD2u7xRg88YkzZrDocTAIU17y82UPZ1x1E5n15CsXGcxaOg== dependencies: - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" idb "7.0.1" tslib "^2.1.0" -"@firebase/auth-compat@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.3.3.tgz#e52f654e3f14b81cecb2fe252e564778fbba0a47" - integrity sha512-9asUuGtkzUVELH3LYXdiom1nVVV9bqEPqzHohanoofHL/oVTNcHZ4AQ5CXjNATfb6c1WH32U+nEuPiYg26UUIw== +"@firebase/auth-compat@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.3.4.tgz#3c00b391876d6192e35eaf805adda3aef43199a5" + integrity sha512-AVNZ4pwLV063ngPKU+8tykQ6v+fRlKfBWEp1W+JU1pEJI+GK0thOPrCn22lWyI8LYiDrh3MLIiBJCv7fsyQajw== dependencies: - "@firebase/auth" "0.21.3" + "@firebase/auth" "0.21.4" "@firebase/auth-types" "0.12.0" - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" node-fetch "2.6.7" tslib "^2.1.0" @@ -2008,66 +1872,66 @@ resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.12.0.tgz#f28e1b68ac3b208ad02a15854c585be6da3e8e79" integrity sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA== -"@firebase/auth@0.21.3": - version "0.21.3" - resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.21.3.tgz#277a3bf4b09db1b5dd471970cecd844d1835dcbf" - integrity sha512-HPbcwgArLBVTowFcn4qaQr6LCx7BidI9yrQ5MRbQNv4PsgK/3UGpzCYaNPPbvgr9fe+0jNdJO+uC0+dk4xIzCQ== +"@firebase/auth@0.21.4": + version "0.21.4" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-0.21.4.tgz#2ce8a34a78b53a168152b987b7bbd844f0431669" + integrity sha512-yZrs1F8sTt8IMCJl29gaxokDZSLjO08r2bL2PNKV1Duz2vJ67ZtVcgHAidyf8BFak9uS8mepd9KlYFDfwUO60Q== dependencies: - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/component@0.6.3": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.3.tgz#2baea3fa37861eef314a612eba194b0ff7c7ac11" - integrity sha512-rnhq5SOsB5nuJphZF50iwqnBiuuyg9kdnlUn1rBrKfu7/cUVJZF5IG1cWrL0rXXyiZW1WBI/J2pmTvVO8dStGQ== +"@firebase/component@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.4.tgz#8981a6818bd730a7554aa5e0516ffc9b1ae3f33d" + integrity sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA== dependencies: - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" -"@firebase/database-compat@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.3.3.tgz#4668e32527f57c1dde6cb03f5fde81eb04503ad4" - integrity sha512-r+L9jTbvsnb7sD+xz6UKU39DgBWqB2pyjzPNdBeriGC9Ssa2MAZe0bIqjCQg51RRXYc/aa/zK1Q2/4uesZeVgQ== +"@firebase/database-compat@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-0.3.4.tgz#4e57932f7a5ba761cd5ac946ab6b6ab3f660522c" + integrity sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg== dependencies: - "@firebase/component" "0.6.3" - "@firebase/database" "0.14.3" - "@firebase/database-types" "0.10.3" + "@firebase/component" "0.6.4" + "@firebase/database" "0.14.4" + "@firebase/database-types" "0.10.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" -"@firebase/database-types@0.10.3": - version "0.10.3" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.10.3.tgz#f057e150b8c2aff0c623162abef139ff5df9bfd2" - integrity sha512-Hu34CDhHYZsd2eielr0jeaWrTJk8Hz0nd7WsnYDnXtQX4i49ppgPesUzPdXVBdIBLJmT0ZZRvT7qWHknkOT+zg== +"@firebase/database-types@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.10.4.tgz#47ba81113512dab637abace61cfb65f63d645ca7" + integrity sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ== dependencies: "@firebase/app-types" "0.9.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" -"@firebase/database@0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.14.3.tgz#0ddd92e5eeef2dbebefd55ce78b39472a57dd5d3" - integrity sha512-J76W6N7JiVkLaAtPyjaGRkrsIu9pi6iZikuGGtGjqvV19vkn7oiL4Hbo5uTYCMd4waTUWoL9iI08eX184W+5GQ== +"@firebase/database@0.14.4": + version "0.14.4" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.14.4.tgz#9e7435a16a540ddfdeb5d99d45618e6ede179aa6" + integrity sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ== dependencies: "@firebase/auth-interop-types" "0.2.1" - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" faye-websocket "0.11.4" tslib "^2.1.0" -"@firebase/firestore-compat@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.3.tgz#2fedc13e6242aa98a78cfb710242721d9822c1da" - integrity sha512-fMTsSC0s2cF5w2+JoB0dWD/o4kXtLrUCPGnZPuz4S0bqTN2t0vHr3gdAsQLtnadgwB78ACtinYmf4Udwx7TzDg== +"@firebase/firestore-compat@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.4.tgz#1c656c225a1ed2a3cd6af1f4118701b5539a4c44" + integrity sha512-xUzz1V53vA1R8S5QQbQ33zqNv0bV+dZpeQKqMXt6HNWa1yiX7lUooGYRws825F+QBOadW1teav1ttXnGZAsgUw== dependencies: - "@firebase/component" "0.6.3" - "@firebase/firestore" "3.8.3" + "@firebase/component" "0.6.4" + "@firebase/firestore" "3.8.4" "@firebase/firestore-types" "2.5.1" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/firestore-types@2.5.1": @@ -2075,29 +1939,29 @@ resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.5.1.tgz#464b2ee057956599ca34de50eae957c30fdbabb7" integrity sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw== -"@firebase/firestore@3.8.3": - version "3.8.3" - resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.8.3.tgz#8305113b9535747f982b585b0dd72e85122b5b89" - integrity sha512-4xR3Mqj95bxHg3hZnz0O+LQrHkjq+siT2y+B9da6u68qJ8bzzT42JaFgd1vifhbBpVbBzpFaS2RuCq2E+kGv9g== +"@firebase/firestore@3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-3.8.4.tgz#66b057330a22f0cd240b60746f2b2920b10dee31" + integrity sha512-sNLT4vGBSrx75Q2yLzCHL/1LDS7+UG8gaIohox/GpKYGxt4r8/AsUOmjN4llDqdnFSgY5ePYp2+nHArFXHyZjA== dependencies: - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" "@firebase/webchannel-wrapper" "0.9.0" "@grpc/grpc-js" "~1.7.0" "@grpc/proto-loader" "^0.6.13" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/functions-compat@0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.3.tgz#530c30b4dfea14e71657f780d2c281e16209aed7" - integrity sha512-UIAJ2gzNq0p/61cXqkpi9DnlQt0hdlGqgmL5an7KuJth2Iv5uGpKg/+OapAZxPuiUNZgTEyZDB7kNBHvnxWq5w== +"@firebase/functions-compat@0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.4.tgz#2b37321d893e816fec80435bb7cbca90f293bc0d" + integrity sha512-kxVxTGyLV1MBR3sp3mI+eQ6JBqz0G5bk310F8eX4HzDFk4xjk5xY0KdHktMH+edM2xs1BOg0vwvvsAHczIjB+w== dependencies: - "@firebase/component" "0.6.3" - "@firebase/functions" "0.9.3" + "@firebase/component" "0.6.4" + "@firebase/functions" "0.9.4" "@firebase/functions-types" "0.6.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/functions-types@0.6.0": @@ -2105,28 +1969,28 @@ resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.6.0.tgz#ccd7000dc6fc668f5acb4e6a6a042a877a555ef2" integrity sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw== -"@firebase/functions@0.9.3": - version "0.9.3" - resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.9.3.tgz#9ef33efcd38b0235e84ae472d9b51597efe3f871" - integrity sha512-tPJgYY2ROQSYuzvgxZRoHeDj+Ic07/bWHwaftgTriawtupmFOkt5iikuhJSJUhaOpFh9TB335OvCXJw1N+BIlQ== +"@firebase/functions@0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.9.4.tgz#47232500be6847f1c7d3fa74eb36f621bd01a160" + integrity sha512-3H2qh6U+q+nepO5Hds+Ddl6J0pS+zisuBLqqQMRBHv9XpWfu0PnDHklNmE8rZ+ccTEXvBj6zjkPfdxt6NisvlQ== dependencies: "@firebase/app-check-interop-types" "0.2.0" "@firebase/auth-interop-types" "0.2.1" - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/messaging-interop-types" "0.2.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/installations-compat@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.3.tgz#42b05f4e5204c354e0fa059378402bd47635e5bf" - integrity sha512-K9rKM/ym06lkpaKz7bMLxzHK/HEk65XfLJBV+dJkIuWeO0EqqC9VFGrpWAo0QmgC4BqbU58T6VBbzoJjb0gaFw== +"@firebase/installations-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.4.tgz#b5557c897b4cd3635a59887a8bf69c3731aaa952" + integrity sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q== dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" "@firebase/installations-types" "0.5.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/installations-types@0.5.0": @@ -2134,13 +1998,13 @@ resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.5.0.tgz#2adad64755cd33648519b573ec7ec30f21fb5354" integrity sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg== -"@firebase/installations@0.6.3": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.3.tgz#b833cf12ac63666246a57100dbdd669fb76a23aa" - integrity sha512-20JFWm+tweNoRjRbz8/Y4I7O5pUJGZsFKCkLl1qNxfNYECSfrZUuozIDJDZC/MeVn5+kB9CwjThDlgQEPrfLdg== +"@firebase/installations@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.4.tgz#20382e33e6062ac5eff4bede8e468ed4c367609e" + integrity sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA== dependencies: - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" idb "7.0.1" tslib "^2.1.0" @@ -2151,14 +2015,14 @@ dependencies: tslib "^2.1.0" -"@firebase/messaging-compat@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.3.tgz#2d222e4078643e49a708b61b6d0e51edc2bc73bd" - integrity sha512-MmuuohXV2YRzIoJmDngI5qqO/cF2q7SdAaw7k4r61W3ReJy7x4/rtqrIvwNVhM6X/X8NFGBbsYKsCfRHWjFdkg== +"@firebase/messaging-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz#323ca48deef77065b4fcda3cfd662c4337dffcfd" + integrity sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg== dependencies: - "@firebase/component" "0.6.3" - "@firebase/messaging" "0.12.3" - "@firebase/util" "1.9.2" + "@firebase/component" "0.6.4" + "@firebase/messaging" "0.12.4" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/messaging-interop-types@0.2.0": @@ -2166,28 +2030,28 @@ resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz#6056f8904a696bf0f7fdcf5f2ca8f008e8f6b064" integrity sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ== -"@firebase/messaging@0.12.3": - version "0.12.3" - resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.3.tgz#3fd521e31deb9b81ec6316062deb1dcc8198d038" - integrity sha512-a3ZKcGDiV2sKmQDB56PpgL1yjFxXCtff2+v1grnAZZ4GnfNQ74t2EHCbmgY7xRX7ThzMqug54oxhuk4ur0MIoA== +"@firebase/messaging@0.12.4": + version "0.12.4" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.4.tgz#ccb49df5ab97d5650c9cf5b8c77ddc34daafcfe0" + integrity sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw== dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" "@firebase/messaging-interop-types" "0.2.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" idb "7.0.1" tslib "^2.1.0" -"@firebase/performance-compat@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.3.tgz#f3939bedc2017a95772fde64a72e97fe4b184268" - integrity sha512-I3rqZsIhauXn4iApfj1ttKQdlti/r8OZBG4YK10vxKSdhAzTIDWDKEsdoCXvvKLwplcMv36sM3WPAPGQLqY5MQ== +"@firebase/performance-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.4.tgz#95cbf32057b5d9f0c75d804bc50e6ed3ba486274" + integrity sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg== dependencies: - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/performance" "0.6.3" + "@firebase/performance" "0.6.4" "@firebase/performance-types" "0.2.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/performance-types@0.2.0": @@ -2195,27 +2059,27 @@ resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.2.0.tgz#400685f7a3455970817136d9b48ce07a4b9562ff" integrity sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA== -"@firebase/performance@0.6.3": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.3.tgz#663c468dc4d62b6e211938377e21a01854803646" - integrity sha512-NQmQN6Ete7i9jz1mzULJZEGvsOmwwdUy6vpqnhUxSFMYPnlBKjX+yypCUUJDDN5zff5+kfwSD1qCyUAaS0xWUA== +"@firebase/performance@0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.4.tgz#0ad766bfcfab4f386f4fe0bef43bbcf505015069" + integrity sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g== dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" -"@firebase/remote-config-compat@0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.3.tgz#b0c0ef9978186bc58b262a39b9a41ec1bf819df3" - integrity sha512-w/ZL03YgYaXq03xIRyJ5oPhXZi6iDsY/v0J9Y7I7SqxCYytEnHVrL9nvBqd9R94y5LRAVNPCLokJeeizaUz4VQ== +"@firebase/remote-config-compat@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz#1f494c81a6c9560b1f9ca1b4fbd4bbbe47cf4776" + integrity sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA== dependencies: - "@firebase/component" "0.6.3" + "@firebase/component" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/remote-config" "0.4.3" + "@firebase/remote-config" "0.4.4" "@firebase/remote-config-types" "0.3.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/remote-config-types@0.3.0": @@ -2223,26 +2087,26 @@ resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz#689900dcdb3e5c059e8499b29db393e4e51314b4" integrity sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA== -"@firebase/remote-config@0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.4.3.tgz#85c4934d093a4c7b8a336af70ada83e936347a2b" - integrity sha512-Q6d4jBWZoNt6SYq87bjtDGUHFkKwAmGnNjWyRjl14AZqE1ilgd9NZHmutharlYJ3LvxMsid80HdK5SgGEpIPfg== +"@firebase/remote-config@0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.4.4.tgz#6a496117054de58744bc9f382d2a6d1e14060c65" + integrity sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ== dependencies: - "@firebase/component" "0.6.3" - "@firebase/installations" "0.6.3" + "@firebase/component" "0.6.4" + "@firebase/installations" "0.6.4" "@firebase/logger" "0.4.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" -"@firebase/storage-compat@0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.1.tgz#b8536c3a435f8ce5eb07796ca10fda16896a9bae" - integrity sha512-6HaTvWsT5Yy3j4UpCZpMcFUYEkJ2XYWukdyTl02u6VjSBRLvkhOXPzEfMvgVWqhnF/rYVfPdjrZ904wk5OxtmQ== +"@firebase/storage-compat@0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.2.tgz#51a97170fd652a516f729f82b97af369e5a2f8d7" + integrity sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw== dependencies: - "@firebase/component" "0.6.3" - "@firebase/storage" "0.11.1" + "@firebase/component" "0.6.4" + "@firebase/storage" "0.11.2" "@firebase/storage-types" "0.8.0" - "@firebase/util" "1.9.2" + "@firebase/util" "1.9.3" tslib "^2.1.0" "@firebase/storage-types@0.8.0": @@ -2250,20 +2114,20 @@ resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.8.0.tgz#f1e40a5361d59240b6e84fac7fbbbb622bfaf707" integrity sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg== -"@firebase/storage@0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.11.1.tgz#602ddb7bce77077800a46bcdfa76f36d7a265c51" - integrity sha512-Xv8EG2j52ugF2xayBz26U9J0VBXHXPMVxSN+ph3R3BSoHxvMLaPu+qUYKHavSt+zbcgPH2GyBhrCdJK6SaDFPA== +"@firebase/storage@0.11.2": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.11.2.tgz#c5e0316543fe1c4026b8e3910f85ad73f5b77571" + integrity sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA== dependencies: - "@firebase/component" "0.6.3" - "@firebase/util" "1.9.2" + "@firebase/component" "0.6.4" + "@firebase/util" "1.9.3" node-fetch "2.6.7" tslib "^2.1.0" -"@firebase/util@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.2.tgz#f5e9e393c5bae3547b9c823ee12076be1e23b1e2" - integrity sha512-9l0uMGPGw3GsoD5khjMmYCCcMq/OR/OOSViiWMN+s2Q0pxM+fYzrii1H+r8qC/uoMjSVXomjLZt0vZIyryCqtQ== +"@firebase/util@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.3.tgz#45458dd5cd02d90e55c656e84adf6f3decf4b7ed" + integrity sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA== dependencies: tslib "^2.1.0" @@ -2277,10 +2141,10 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@graphprotocol/client-add-source-name@1.0.17": - version "1.0.17" - resolved "https://registry.yarnpkg.com/@graphprotocol/client-add-source-name/-/client-add-source-name-1.0.17.tgz#633a6cc9835bca16a1e1b1e7a962737e77e8146e" - integrity sha512-Rv8kNL62H7S71YA9eLh5PO2KElrrgfltg1atVHETV6TdXYBMuKW42J5ZqSshmHROI4DzftPw8A2HW7BMfdDvgQ== +"@graphprotocol/client-add-source-name@1.0.18": + version "1.0.18" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-add-source-name/-/client-add-source-name-1.0.18.tgz#97ae30403fa333fca27545088b6babe01baf5b05" + integrity sha512-Fe3DNemKyMCzdjFgF4omKztGCXlBhU4fufxuGZj9uJQwzut+TeN2/+TUASxI0oHvU8CrbJNBi5QPYvow4Phalg== dependencies: lodash "4.17.21" tslib "^2.4.0" @@ -2293,20 +2157,20 @@ "@graphql-mesh/apollo-link" "10.0.3" tslib "^2.4.0" -"@graphprotocol/client-auto-pagination@1.1.15": - version "1.1.15" - resolved "https://registry.yarnpkg.com/@graphprotocol/client-auto-pagination/-/client-auto-pagination-1.1.15.tgz#7a6181e5759b70cd589cde3169ecdbe31480c6c6" - integrity sha512-KDqGg3xJtDdXqz3ANHbv3O26cin+XW1RT8raY72l4eai8wrVCfXUKMl0FRFInN/Fpb0TDzBLg3z58Nq5r6+H2A== +"@graphprotocol/client-auto-pagination@1.1.16": + version "1.1.16" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-auto-pagination/-/client-auto-pagination-1.1.16.tgz#676bd7b7d518db9d086c94c4141cb0ab5bf7286e" + integrity sha512-y0NDROJLLT5S/ReJXNk1RlChemy7gXe0YVsuScBtjznjQXqZwhGBUrgb6LcVAkaobnVyIbJDaD48gZQ/4MCokw== dependencies: lodash "4.17.21" tslib "^2.4.0" -"@graphprotocol/client-auto-type-merging@1.0.22": - version "1.0.22" - resolved "https://registry.yarnpkg.com/@graphprotocol/client-auto-type-merging/-/client-auto-type-merging-1.0.22.tgz#9d85def1d42c1a64bd2b48d379b41ce8c1cd134f" - integrity sha512-obBF8DDYXGpHro8u1aDdbkYnkjdacjyrSqnkFIRP42BvIvYGE9kxj9+kL7ox3NKlox/2k/I734LnkXU57mUksA== +"@graphprotocol/client-auto-type-merging@1.0.23": + version "1.0.23" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-auto-type-merging/-/client-auto-type-merging-1.0.23.tgz#e465bb336afb9e61c1ce453c0485b92ca4679db7" + integrity sha512-rOCp1zfogNFKZntOmVqzGaknboWoOvf3hyX6+GlKM9JOjbFxAcdLaO3icPmD3WkXQ8LyGxv8HBSWj0cHERB4sw== dependencies: - "@graphql-mesh/transform-type-merging" "0.5.14" + "@graphql-mesh/transform-type-merging" "0.5.15" tslib "^2.4.0" "@graphprotocol/client-block-tracking@1.0.12": @@ -2318,23 +2182,23 @@ tslib "^2.4.0" "@graphprotocol/client-cli@^2.2.19": - version "2.2.19" - resolved "https://registry.yarnpkg.com/@graphprotocol/client-cli/-/client-cli-2.2.19.tgz#13a850df32ea2d7ed67132d30c24e53608a39bbf" - integrity sha512-KqFxSCpaXSSAcJcX4JbZy1dCG1ueH7Ou8hPrPIV5gJPHzkypqzkTrfE0nugsBEZveXqpowkcV1ecQbKDlKP5fA== + version "2.2.20" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-cli/-/client-cli-2.2.20.tgz#62075c38f13b7e7972d3aff17f1eec5f491c512a" + integrity sha512-TScBBnaaRX3SxmACZyx70hXtWDXe0a4GuCfXni2L3SGAYoG1bj8RqHDSYaAHuBwc3hp+QJV1AH6aICnAGhf0Mw== dependencies: - "@graphprotocol/client-add-source-name" "1.0.17" - "@graphprotocol/client-auto-pagination" "1.1.15" - "@graphprotocol/client-auto-type-merging" "1.0.22" + "@graphprotocol/client-add-source-name" "1.0.18" + "@graphprotocol/client-auto-pagination" "1.1.16" + "@graphprotocol/client-auto-type-merging" "1.0.23" "@graphprotocol/client-block-tracking" "1.0.12" - "@graphprotocol/client-polling-live" "1.1.0" - "@graphql-mesh/cli" "0.82.24" - "@graphql-mesh/graphql" "0.34.7" + "@graphprotocol/client-polling-live" "1.1.1" + "@graphql-mesh/cli" "0.82.25" + "@graphql-mesh/graphql" "0.34.8" tslib "^2.4.0" -"@graphprotocol/client-polling-live@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@graphprotocol/client-polling-live/-/client-polling-live-1.1.0.tgz#badda17d4f928db7cca67ae2e3ac1fb1bfe7e90e" - integrity sha512-6k07fJ3rmp+u+nrorF6fpXLHFTDKy9ibevr71qiwOluuso9T9Fn1tI56XRdz0xkimdosFAex+GwXyTags7EKHg== +"@graphprotocol/client-polling-live@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@graphprotocol/client-polling-live/-/client-polling-live-1.1.1.tgz#69bfd2c1683bc699966eddd6f40b6be688160364" + integrity sha512-/XKnXNTts1VCUqwN2TCuPzQBfMGusL8vtamACKUeX65WxVy/H/Wjpcxq+w/XbyqNsQdG5QOoxY+AS/vKMhUcDQ== dependencies: "@repeaterjs/repeater" "^3.0.4" tslib "^2.4.0" @@ -2450,13 +2314,13 @@ tslib "~2.4.0" "@graphql-codegen/typescript@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-3.0.1.tgz#e949a7d7e8325bea9cf938c30af2313043e91a09" - integrity sha512-HvozJg7eHqywmYvXa7+nmjw+v3+f8ilFv9VbRvmjhj/zBw3VKGT2n/85ZhVyuWjY2KrDLzl6BqeXttWsW5Wo4w== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-3.0.2.tgz#6099c0632188ad9c6d41a5b66116ded0bf5c6076" + integrity sha512-qD6QkTB+2eJmIaZ6Tihv6HRz7daWWLz9uw5vwCmPeZN6XL2RINZGLkR7D8BQzLDlNGMrpQ4SeSM9o3ZALSCIuQ== dependencies: "@graphql-codegen/plugin-helpers" "^4.1.0" "@graphql-codegen/schema-ast" "^3.0.1" - "@graphql-codegen/visitor-plugin-common" "3.0.1" + "@graphql-codegen/visitor-plugin-common" "3.0.2" auto-bind "~4.0.0" tslib "~2.5.0" @@ -2508,6 +2372,22 @@ parse-filepath "^1.0.2" tslib "~2.5.0" +"@graphql-codegen/visitor-plugin-common@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-3.0.2.tgz#784c0faaa7e0773072ea5de464fdcae8d7765564" + integrity sha512-dKblRFrB0Fdl3+nPlzlLBka+TN/EGwr/q09mwry0H58z3j6gXkMbsdPr+dc8MhgOV7w/8egRvSPIvd7m6eFCnw== + dependencies: + "@graphql-codegen/plugin-helpers" "^4.1.0" + "@graphql-tools/optimize" "^1.3.0" + "@graphql-tools/relay-operation-optimizer" "^6.5.0" + "@graphql-tools/utils" "^9.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.5.0" + "@graphql-inspector/core@3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@graphql-inspector/core/-/core-3.3.0.tgz#3982909cec46a5b3050a8265569503f20a3b5742" @@ -2525,20 +2405,20 @@ "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" -"@graphql-mesh/cache-localforage@0.7.14": - version "0.7.14" - resolved "https://registry.yarnpkg.com/@graphql-mesh/cache-localforage/-/cache-localforage-0.7.14.tgz#8613fd0e2e023142ced85d648a08e71aa79d931a" - integrity sha512-yt0x5rhzpiBoUKsp/MHhicmc3P0f0VTTxh7LGP7vg5VOXqSUjgPZQNFaMRQ6AnoUfpTqU4Ru7DlUcZu6GWwMDg== +"@graphql-mesh/cache-localforage@0.7.15": + version "0.7.15" + resolved "https://registry.yarnpkg.com/@graphql-mesh/cache-localforage/-/cache-localforage-0.7.15.tgz#8b44626ee42139e5b2a4cc497fd5e1718f581401" + integrity sha512-XW5/EJk7N1Ek/gJzP6d9dVTzyH0CwgzcpZRf6HcUKd56BObXeIlFBg1mdQ3ijdP5Hl3hhKV+V6cA0m9zwmjfig== dependencies: - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" localforage "1.10.0" tslib "^2.4.0" -"@graphql-mesh/cli@0.82.24": - version "0.82.24" - resolved "https://registry.yarnpkg.com/@graphql-mesh/cli/-/cli-0.82.24.tgz#5d0a327d1a75af9290cefd52c5af314a9430e346" - integrity sha512-bJN9uzRJnhA+dkmVz5VEll6mCyNrc7GKOE7mnj9Qyi7VxLMbvB/NSN7BVLlbBJuL7Yz/Wz8Vo7FGkrqQmfzTgQ== +"@graphql-mesh/cli@0.82.25": + version "0.82.25" + resolved "https://registry.yarnpkg.com/@graphql-mesh/cli/-/cli-0.82.25.tgz#e1f36da079c114c4f31521f3336edda0639801aa" + integrity sha512-3aNfjTPaPw7WYR0WP4u1vOnhP31Pa7xckvrLzd2XE2CzuYta7av1Is1kkkXxB1Zm+ZuwCOUSZ7UZNoLuC6jHeQ== dependencies: "@graphql-codegen/core" "3.1.0" "@graphql-codegen/typed-document-node" "3.0.1" @@ -2546,13 +2426,13 @@ "@graphql-codegen/typescript-generic-sdk" "3.0.4" "@graphql-codegen/typescript-operations" "3.0.0" "@graphql-codegen/typescript-resolvers" "3.0.0" - "@graphql-mesh/config" "10.1.7" + "@graphql-mesh/config" "10.1.8" "@graphql-mesh/cross-helpers" "0.3.3" - "@graphql-mesh/http" "0.3.20" - "@graphql-mesh/runtime" "0.46.15" - "@graphql-mesh/store" "0.9.14" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/http" "0.3.21" + "@graphql-mesh/runtime" "0.46.16" + "@graphql-mesh/store" "0.9.15" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/utils" "9.2.1" ajv "8.12.0" change-case "4.1.2" @@ -2574,19 +2454,19 @@ ws "8.12.1" yargs "17.7.1" -"@graphql-mesh/config@10.1.7": - version "10.1.7" - resolved "https://registry.yarnpkg.com/@graphql-mesh/config/-/config-10.1.7.tgz#c6b22eaea62fd01ed01e878d1d32793d6efd3d47" - integrity sha512-WgevKFuwH7zUSbDrDufWgk17vXvcdIoS6Amp58ZWLgz2e+sjaaDx+K/kFt6YFijy80wtd/U5me/Qdvu7TVcaZg== +"@graphql-mesh/config@10.1.8": + version "10.1.8" + resolved "https://registry.yarnpkg.com/@graphql-mesh/config/-/config-10.1.8.tgz#3f83def9392c101d90e06738233213450a43a821" + integrity sha512-FLlpP0hqG1HziHP/d/degpzrjLFsG3nhghNcRBTWZSOnYtedh/Wo1ZJgF/feCKwDFonmjVkhYeZI2eKEx3Xn9Q== dependencies: "@envelop/core" "3.0.6" - "@graphql-mesh/cache-localforage" "0.7.14" + "@graphql-mesh/cache-localforage" "0.7.15" "@graphql-mesh/cross-helpers" "0.3.3" - "@graphql-mesh/merger-bare" "0.16.16" - "@graphql-mesh/merger-stitching" "0.18.16" - "@graphql-mesh/store" "0.9.14" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/merger-bare" "0.16.17" + "@graphql-mesh/merger-stitching" "0.18.17" + "@graphql-mesh/store" "0.9.15" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/code-file-loader" "7.3.21" "@graphql-tools/graphql-file-loader" "7.5.16" "@graphql-tools/load" "7.8.12" @@ -2607,16 +2487,16 @@ react-native-fs "2.20.0" react-native-path "0.0.5" -"@graphql-mesh/graphql@0.34.7": - version "0.34.7" - resolved "https://registry.yarnpkg.com/@graphql-mesh/graphql/-/graphql-0.34.7.tgz#12c468d2ba48e978e3214aa2c56820d292560d94" - integrity sha512-ytmwP8DxWriBnBjVMLqxCWhhrR3Z4+e9vPg5iZElTadHu2HHlq/+A7jR3qiOn0VciLG8DHJ40UNSgjQCT08kkQ== +"@graphql-mesh/graphql@0.34.8": + version "0.34.8" + resolved "https://registry.yarnpkg.com/@graphql-mesh/graphql/-/graphql-0.34.8.tgz#7991cca12f66e69e17f9cdf48340ae678ccdb4e9" + integrity sha512-5Os4BCuS4wik2/NXJ2ck6vDs+v0Xoyhf1naCUQoGMZdLA83ucuNR7vtaJM3tA9+uNhOKFYQ7nP0NueJpMlhNbg== dependencies: "@graphql-mesh/cross-helpers" "0.3.3" - "@graphql-mesh/store" "0.9.14" + "@graphql-mesh/store" "0.9.15" "@graphql-mesh/string-interpolation" "0.4.2" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/delegate" "9.0.28" "@graphql-tools/url-loader" "7.17.13" "@graphql-tools/utils" "9.2.1" @@ -2624,39 +2504,39 @@ lodash.get "4.4.2" tslib "^2.4.0" -"@graphql-mesh/http@0.3.20": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@graphql-mesh/http/-/http-0.3.20.tgz#a4b62b2ef040f6598983652fe898b5ea9c5a636b" - integrity sha512-TjJ2OsiH5qypUKF1y2wuqdnciNQrzpuIUy91S0GDqVHRI83miCCvwkK/aUqGpbPY/jnWqN/kBSbxRyCFpn/bMw== +"@graphql-mesh/http@0.3.21": + version "0.3.21" + resolved "https://registry.yarnpkg.com/@graphql-mesh/http/-/http-0.3.21.tgz#b8b0e02d8d51a171d7bbef8bb50b4681362e823e" + integrity sha512-7eRV4tTAeSQDx5zJweyYQmzagkBZr9bv6A8hYvCIuIiLyCoB/KCv6BTk+ClBOkPNtcubmde1f8yvpNbZ+D+qlg== dependencies: "@graphql-mesh/cross-helpers" "0.3.3" - "@graphql-mesh/runtime" "0.46.15" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/runtime" "0.46.16" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@whatwg-node/router" "0.3.0" graphql-yoga "3.7.0" tslib "^2.4.0" -"@graphql-mesh/merger-bare@0.16.16": - version "0.16.16" - resolved "https://registry.yarnpkg.com/@graphql-mesh/merger-bare/-/merger-bare-0.16.16.tgz#f19ee3b74ebe932db5936820695baeb89aaaddff" - integrity sha512-oiaInZz4H1Iuq9sPOls1YthUINF7NsZHHR9RpNCkuRVWEwDNsCLh/sKSGvc3XYQZMByTpgllfitf1oZ5zPVI3A== +"@graphql-mesh/merger-bare@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@graphql-mesh/merger-bare/-/merger-bare-0.16.17.tgz#a333d29389ae1f2d20169a75519eea516a2512bb" + integrity sha512-VX/mzQITGrKvCBNHQrjTpyMkUwdOupwTHVBEo8316DkxGNyyxpEKn7b5th3MfseWH9Q6R+BF+R1LLrWoYpcjsA== dependencies: - "@graphql-mesh/merger-stitching" "0.18.16" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/merger-stitching" "0.18.17" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/schema" "9.0.16" "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" -"@graphql-mesh/merger-stitching@0.18.16": - version "0.18.16" - resolved "https://registry.yarnpkg.com/@graphql-mesh/merger-stitching/-/merger-stitching-0.18.16.tgz#fd0f2e2b10593296bca37e10b639e188fe71880a" - integrity sha512-4QG4lrFs+dk4vhYtSThCKVqi0vBiFQK4R08RQ/auLSIVrhEdTazQsi6W24LQqpNt/M7fU/E2gsO93bb0WmHjiA== +"@graphql-mesh/merger-stitching@0.18.17": + version "0.18.17" + resolved "https://registry.yarnpkg.com/@graphql-mesh/merger-stitching/-/merger-stitching-0.18.17.tgz#343fe8948b331aa0fc1ff3a88a4d8190a98aa0dc" + integrity sha512-7Doq0CEQ7SMZBEKlp3NiywjiDfk532xBPa9Ec54wFjwKiSGkraosGz60DFYED6CnxQ7lUHoFsw34tmFlmUbmRQ== dependencies: - "@graphql-mesh/store" "0.9.14" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/store" "0.9.15" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/delegate" "9.0.28" "@graphql-tools/schema" "9.0.16" "@graphql-tools/stitch" "8.7.42" @@ -2664,17 +2544,17 @@ "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" -"@graphql-mesh/runtime@0.46.15": - version "0.46.15" - resolved "https://registry.yarnpkg.com/@graphql-mesh/runtime/-/runtime-0.46.15.tgz#fcde9cc8be01acdd5242aef031cf149aef730397" - integrity sha512-LefwojpknBN1C0DlaqCd3ahBbnWjj/RbyUPrQWruQVkL/N0vgeFG5s5kTy7NwyT+kjF0pwDnaNY/WCxIufhCbA== +"@graphql-mesh/runtime@0.46.16": + version "0.46.16" + resolved "https://registry.yarnpkg.com/@graphql-mesh/runtime/-/runtime-0.46.16.tgz#dd80d3ba273de9f2125307a4c9e235cba9a12f19" + integrity sha512-/TS+HC7cOuGI0rwW6gnRBlO8obtGGd4vQ2Uz4Y7WYZafC55uvGba3utezbMI6bpvaG9QZCVbqVWaN30laJnDCA== dependencies: "@envelop/core" "3.0.6" "@envelop/extended-validation" "2.0.6" "@graphql-mesh/cross-helpers" "0.3.3" "@graphql-mesh/string-interpolation" "0.4.2" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/batch-delegate" "8.4.21" "@graphql-tools/batch-execute" "8.5.18" "@graphql-tools/delegate" "9.0.28" @@ -2683,15 +2563,15 @@ "@whatwg-node/fetch" "^0.8.0" tslib "^2.4.0" -"@graphql-mesh/store@0.9.14": - version "0.9.14" - resolved "https://registry.yarnpkg.com/@graphql-mesh/store/-/store-0.9.14.tgz#8418cf4662cb3f5bf79ced41cb272707cf3efece" - integrity sha512-koPhT+90jANG852AgOWQl4qR4RGoj5ZzVQCMxUnIle3ZJrKZGaPwWyfMao6WWGql50fjQvV3fc1qSRYrZ1szzg== +"@graphql-mesh/store@0.9.15": + version "0.9.15" + resolved "https://registry.yarnpkg.com/@graphql-mesh/store/-/store-0.9.15.tgz#3c3b4b409918a41d3932b1b4b6a179cd25549437" + integrity sha512-CSoGPzo1eBXkIWs26eF3fEvPAFeNisQeCeATyLoz4W/rkvGJOr3yGZqxlWvGt5qIF+WWwEplMJ3zWDrlG4uyYw== dependencies: "@graphql-inspector/core" "3.3.0" "@graphql-mesh/cross-helpers" "0.3.3" - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" @@ -2705,42 +2585,42 @@ lodash.get "4.4.2" tslib "^2.4.0" -"@graphql-mesh/transform-type-merging@0.5.14": - version "0.5.14" - resolved "https://registry.yarnpkg.com/@graphql-mesh/transform-type-merging/-/transform-type-merging-0.5.14.tgz#773fe267e73defd73b0f6251b7f04e56bdf9859c" - integrity sha512-Zdt/1dwJEpvAfoYCZrE/SVfbLAnYVmodbut+vCEN7hfmKkF+8SWFpeFkHol+NUxWu9CR+7e0dbbxOpCtqVTfBA== +"@graphql-mesh/transform-type-merging@0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@graphql-mesh/transform-type-merging/-/transform-type-merging-0.5.15.tgz#ff180d25dd22642be972302c5d2c539f33992db5" + integrity sha512-TVaUQer4BoadwEO753uqMxwgx+11czD+R8vxAVb4KJ8RuYkmVekKw+bkF4fnpbdw9d5DKRGBNM7d1SnNFyfomg== dependencies: - "@graphql-mesh/types" "0.91.6" - "@graphql-mesh/utils" "0.43.14" + "@graphql-mesh/types" "0.91.7" + "@graphql-mesh/utils" "0.43.15" "@graphql-tools/delegate" "9.0.28" "@graphql-tools/stitching-directives" "2.3.31" tslib "^2.4.0" -"@graphql-mesh/types@0.91.6": - version "0.91.6" - resolved "https://registry.yarnpkg.com/@graphql-mesh/types/-/types-0.91.6.tgz#46e75d47ec083c70221fb12592fd36fd1ce9bcf9" - integrity sha512-HPFi4qGPeAh2VARmOAd5Au1HFOaQ648eNraGupqSSJQQGqttRTOdarjOkthHdLbyIxzQd9sMJEUM5PBkrTuZmg== +"@graphql-mesh/types@0.91.7": + version "0.91.7" + resolved "https://registry.yarnpkg.com/@graphql-mesh/types/-/types-0.91.7.tgz#a9c0c72c2c04740ea1629f6dfa53e3e462337684" + integrity sha512-lLkCeqsNhcSrTV/RLttlMxk5s+/DrlEaiqjms4wM+9YIppIJnSU+J8f961nah16dm7pHz8oYVXOrz7es891/rg== dependencies: - "@graphql-mesh/store" "0.9.14" + "@graphql-mesh/store" "0.9.15" "@graphql-tools/batch-delegate" "8.4.21" "@graphql-tools/delegate" "9.0.28" "@graphql-tools/utils" "9.2.1" "@graphql-typed-document-node/core" "3.1.2" tslib "^2.4.0" -"@graphql-mesh/utils@0.43.14": - version "0.43.14" - resolved "https://registry.yarnpkg.com/@graphql-mesh/utils/-/utils-0.43.14.tgz#d9654b2aef98c82e925acb36b40eb4bf9a361c0e" - integrity sha512-b9mkTZpOAsc1PrtAFRsco70OrwL1keVX4jriqKM+Mwm3yKgPEkhVUKn+Mfxvg9VPZZyGZP1dxyhGWKD6hMkJXg== +"@graphql-mesh/utils@0.43.15": + version "0.43.15" + resolved "https://registry.yarnpkg.com/@graphql-mesh/utils/-/utils-0.43.15.tgz#9c59ff09a300276a54c3a6889f170d6818e74700" + integrity sha512-SxWw3K/K0n9WaPtqkyJTh9HuQuDmrGAFJrC+sBiC76mkBpDrcVP1EnCu7ugOimDOrqK0IAtLFIPYl/+RDk/N9g== dependencies: "@graphql-mesh/cross-helpers" "0.3.3" "@graphql-mesh/string-interpolation" "0.4.2" - "@graphql-mesh/types" "0.91.6" + "@graphql-mesh/types" "0.91.7" "@graphql-tools/delegate" "9.0.28" "@graphql-tools/utils" "9.2.1" + dset "3.1.2" js-yaml "4.1.0" lodash.get "4.4.2" - lodash.set "4.3.2" lodash.topath "4.5.2" tiny-lru "8.0.2" tslib "^2.4.0" @@ -2899,6 +2779,14 @@ "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" +"@graphql-tools/merge@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.4.0.tgz#47fbe5c4b6764276dc35bd19c4e7d3c46d3dc0fc" + integrity sha512-3XYCWe0d3I4F1azNj1CdShlbHfTIfiDgj00R9uvFH8tHKh7i1IWN3F7QQYovcHKhayaR6zPok3YYMESYQcBoaA== + dependencies: + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + "@graphql-tools/optimize@^1.3.0": version "1.3.1" resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.3.1.tgz#29407991478dbbedc3e7deb8c44f46acb4e9278b" @@ -2915,7 +2803,7 @@ "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" -"@graphql-tools/schema@9.0.16", "@graphql-tools/schema@^9.0.0", "@graphql-tools/schema@^9.0.16": +"@graphql-tools/schema@9.0.16": version "9.0.16" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.16.tgz#7d340d69e6094dc01a2b9e625c7bb4fff89ea521" integrity sha512-kF+tbYPPf/6K2aHG3e1SWIbapDLQaqnIHVRG6ow3onkFoowwtKszvUyOASL6Krcv2x9bIMvd1UkvRf9OaoROQQ== @@ -2925,6 +2813,16 @@ tslib "^2.4.0" value-or-promise "1.0.12" +"@graphql-tools/schema@9.0.17", "@graphql-tools/schema@^9.0.0", "@graphql-tools/schema@^9.0.16": + version "9.0.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.17.tgz#d731e9899465f88d5b9bf69e607ec465bb88b062" + integrity sha512-HVLq0ecbkuXhJlpZ50IHP5nlISqH2GbNgjBJhhRzHeXhfwlUOT4ISXGquWTmuq61K0xSaO0aCjMpxe4QYbKTng== + dependencies: + "@graphql-tools/merge" "8.4.0" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + value-or-promise "1.0.12" + "@graphql-tools/stitch@8.7.42": version "8.7.42" resolved "https://registry.yarnpkg.com/@graphql-tools/stitch/-/stitch-8.7.42.tgz#25478f518f57d7e2851f2b18174d35a6b6363054" @@ -2982,7 +2880,7 @@ dependencies: tslib "^2.4.0" -"@graphql-tools/wrap@9.3.7", "@graphql-tools/wrap@^9.3.6": +"@graphql-tools/wrap@9.3.7": version "9.3.7" resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.3.7.tgz#97d7efdb8dfee41624e154b2de4499397634422e" integrity sha512-gavfiWLKgvmC2VPamnMzml3zmkBoo0yt+EmOLIHY6O92o4uMTR281WGM77tZIfq+jzLtjoIOThUSjC/cN/6XKg== @@ -2993,6 +2891,17 @@ tslib "^2.4.0" value-or-promise "1.0.12" +"@graphql-tools/wrap@^9.3.6": + version "9.3.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.3.8.tgz#c6f53b7bc98cf3fa3d91e41be3b99254ae99b409" + integrity sha512-MGsExYPiILMw4Qff7HcvE9MMSYdjb/tr5IQYJbxJIU4/TrBHox1/smne8HG+Bd7kmDlTTj7nU/Z8sxmoRd0hOQ== + dependencies: + "@graphql-tools/delegate" "9.0.28" + "@graphql-tools/schema" "9.0.17" + "@graphql-tools/utils" "9.2.1" + tslib "^2.4.0" + value-or-promise "1.0.12" + "@graphql-typed-document-node/core@3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" @@ -3052,9 +2961,9 @@ yargs "^16.2.0" "@headlessui/react@^1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.8.tgz#d7b4a95d50f9a386f7d1259d5ff8a6d7eb552ef0" - integrity sha512-zcwb0kd7L05hxmoAMIioEaOn235Dg0fUO+iGbLPgLVSjzl/l39V6DTpC2Df49PE5aG5/f5q0PZ9ZHZ78ENNV+A== + version "1.7.13" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.13.tgz#fd150b394954e9f1d86ed2340cffd1217d6e7628" + integrity sha512-9n+EQKRtD9266xIHXdY5MfiXPDfYwl7zBM7KOx2Ae3Gdgxy8QML1FkCMjq6AsOf0l6N9uvI4HcFtuFlenaldKg== dependencies: client-only "^0.0.1" @@ -3102,17 +3011,17 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/expect-utils@^29.4.1": - version "29.4.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" - integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: - jest-get-type "^29.2.0" + jest-get-type "^29.4.3" -"@jest/schemas@^29.4.0": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" - integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: "@sinclair/typebox" "^0.25.16" @@ -3159,12 +3068,12 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jest/types@^29.4.1": - version "29.4.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" - integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: - "@jest/schemas" "^29.4.0" + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -3280,6 +3189,11 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" +"@lokesh.dhakar/quantize@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@lokesh.dhakar/quantize/-/quantize-1.3.0.tgz#04476889953aca94614fbc79e9a43adc7979179a" + integrity sha512-4KBSyaMj65d8A+2vnzLxtHFu4OmBU4IKO0yLxZ171Itdf9jGV4w+WbG7VsKts2jUdRkFSzsZqpZOz6hTB3qGAw== + "@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" @@ -3628,9 +3542,9 @@ deprecation "^2.3.1" "@octokit/plugin-retry@^4.0.3": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-4.1.1.tgz#2a96e97219f6506d636b4de696cf368da44a8e20" - integrity sha512-iR7rg5KRSl6L6RELTQQ3CYeNgeBJyuAmP95odzcQ/zyefnRT/Peo8rWeky4z7V/+/oPWqOL4I5Z+V8KtjpHCJw== + version "4.1.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-4.1.3.tgz#c717d7908be26a5570941d9688e3e8a3da95e714" + integrity sha512-3YKBj7d0J/4mpEc4xzMociWsMNl5lZqrpAnYcW6mqiSGF3wFjU+c6GHih6GLClk31JNvKDr0x9jc5cfm7evkZg== dependencies: "@octokit/types" "^9.0.0" bottleneck "^2.15.3" @@ -3797,13 +3711,13 @@ integrity sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw== "@radix-ui/react-avatar@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.0.1.tgz#d25ef10b56210039c152e45209dd41a1afdc192e" - integrity sha512-GfUgw4i/OWmb76bmM9qLnedYOsXhPvRXL6xaxyZzhiIVEwo2KbmxTaSQv5r1Oh8nNqBs1vfYPGuVmhEfpxpnvw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.0.2.tgz#c72209882e191db00ac0bfa16a9d9c025f0958f0" + integrity sha512-XRL8z2l9V7hRLCPjHWg/34RBPZUGpmOjmsRSNvIh2DI28GyIWDChbcsDUVc63MzOItk6Q83Ob2KK8k2FUlXlGA== dependencies: "@babel/runtime" "^7.13.10" "@radix-ui/react-context" "1.0.0" - "@radix-ui/react-primitive" "1.0.1" + "@radix-ui/react-primitive" "1.0.2" "@radix-ui/react-use-callback-ref" "1.0.0" "@radix-ui/react-use-layout-effect" "1.0.0" @@ -3821,10 +3735,10 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-primitive@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz#c1ebcce283dd2f02e4fbefdaa49d1cb13dbc990a" - integrity sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA== +"@radix-ui/react-primitive@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz#54e22f49ca59ba88d8143090276d50b93f8a7053" + integrity sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw== dependencies: "@babel/runtime" "^7.13.10" "@radix-ui/react-slot" "1.0.1" @@ -3857,26 +3771,26 @@ integrity sha512-hxBI2UOuVaI3O/BhQfhtb4kcGn9ft12RWAFVMUeNjqqhLsHvFtzIkFaptBJpFDANTKoDfdVoHTKZDlwKCACbMQ== "@reduxjs/toolkit@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.1.tgz#4c34dc4ddcec161535288c60da5c19c3ef15180e" - integrity sha512-HikrdY+IDgRfRYlCTGUQaiCxxDDgM1mQrRbZ6S1HFZX5ZYuJ4o8EstNmhTwHdPl2rTmLxzwSu0b3AyeyTlR+RA== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.3.tgz#27e1a33072b5a312e4f7fa19247fec160bbb2df9" + integrity sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg== dependencies: immer "^9.0.16" redux "^4.2.0" redux-thunk "^2.4.2" reselect "^4.1.7" -"@remix-run/router@1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.1.tgz#3bb0b6ddc0a276e8dc1138d08f63035e4e23e8bf" - integrity sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw== +"@remix-run/router@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.3.tgz#d6d531d69c0fa3a44fda7dc00b20d49b44549164" + integrity sha512-YRHie1yQEj0kqqCTCJEfHqYSSNlZQ696QJG+MMiW4mxSl9I0ojz/eRhJS4fs88Z5i6D1SmoF9d3K99/QOhI8/w== "@repeaterjs/repeater@3.0.4", "@repeaterjs/repeater@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== -"@rollup/plugin-inject@^5.0.1": +"@rollup/plugin-inject@^5.0.3": version "5.0.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz#0783711efd93a9547d52971db73b2fb6140a67b1" integrity sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA== @@ -3934,9 +3848,9 @@ cross-fetch "^3.1.5" "@sinclair/typebox@^0.25.16": - version "0.25.21" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" - integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== "@solana/buffer-layout@^4.0.0": version "4.0.1" @@ -3946,9 +3860,9 @@ buffer "~6.0.3" "@solana/web3.js@^1.70.1": - version "1.73.2" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.2.tgz#4b30cd402b35733dae3a7d0b638be26a7742b395" - integrity sha512-9WACF8W4Nstj7xiDw3Oom22QmrhBh0VyZyZ7JvvG3gOxLWLlX3hvm5nPVJOGcCE/9fFavBbCUb5A6CIuvMGdoA== + version "1.73.3" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.3.tgz#60e6bd68f6f364d4be360b1e0a03a0a68468a029" + integrity sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg== dependencies: "@babel/runtime" "^7.12.5" "@noble/ed25519" "^1.7.0" @@ -3963,8 +3877,8 @@ buffer "6.0.1" fast-stable-stringify "^1.0.0" jayson "^3.4.4" - node-fetch "2" - rpc-websockets "^7.5.0" + node-fetch "^2.6.7" + rpc-websockets "^7.5.1" superstruct "^0.14.2" "@stablelib/aead@^1.0.1": @@ -4705,6 +4619,11 @@ lodash "^4.17.21" regenerator-runtime "^0.13.7" +"@storybook/global@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" + integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== + "@storybook/instrumenter@6.5.16", "@storybook/instrumenter@^6.4.0": version "6.5.16" resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-6.5.16.tgz#62acd94e35f1ec403dbc0145b026dfc042ca2f65" @@ -5001,38 +4920,38 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" -"@tanstack/query-core@4.24.9": - version "4.24.9" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.24.9.tgz#52a5981d46f48e85630bcf5a645318e405493ce1" - integrity sha512-pZQ2NpdaHzx8gPPkAPh06d6zRkjfonUzILSYBXrdHDapP2eaBbGsx5L4/dMF+fyAglFzQZdDDzZgAykbM20QVw== +"@tanstack/query-core@4.26.1": + version "4.26.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.26.1.tgz#7a441086c4d3d79e1d156c0a355bd3567213626e" + integrity sha512-Zrx2pVQUP4ndnsu6+K/m8zerXSVY8QM+YSbxA1/jbBY21GeCd5oKfYl92oXPK0hPEUtoNuunIdiq0ZMqLos+Zg== -"@tanstack/query-persist-client-core@4.24.9": - version "4.24.9" - resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-4.24.9.tgz#c684fab0c8c107706eed8653af18b712e08b6cc5" - integrity sha512-/pudjUvzemA5hyb0IQ6E6zMyoqci5izlKhtU5IwJyfjPikDIIcFUKbci6pSw01SJJQDX/+br8NRRmFzUNLi/pQ== +"@tanstack/query-persist-client-core@4.26.1": + version "4.26.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-persist-client-core/-/query-persist-client-core-4.26.1.tgz#7bf43eccbb58fdd883c8d9a69ac75e838035f927" + integrity sha512-gKO5VQuvNlMMTNSxRtB4tm3zGSx3/U9YluFkdumsHana9YMh3ngc76gUCbQZsnf5DDCwdI673F7A7oSphp/vgA== dependencies: - "@tanstack/query-core" "4.24.9" + "@tanstack/query-core" "4.26.1" "@tanstack/query-sync-storage-persister@^4.14.5": - version "4.24.9" - resolved "https://registry.yarnpkg.com/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.24.9.tgz#3d5c3af69e7da25b00d4b4346a51e1022f98ac72" - integrity sha512-2Z/mestkEMl4W5J2Ip5pLdL3IjQ2G040MH4rnsXfAe76I0BTs/xjVzf32imRDvbjTsQhWbkwXr2Dug1PxfM+9A== + version "4.26.1" + resolved "https://registry.yarnpkg.com/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.26.1.tgz#fe38df91b3f450c83ef308cca76e0c8190c4dd14" + integrity sha512-Mt7Z+PKbdEiYt6KGTciLivHvsEQf2Q/G3lpGvLzqEP0S8VULJeUB3pqt6jvZBMgj4nKWBbyH3HZDtDw7pFyg2g== dependencies: - "@tanstack/query-persist-client-core" "4.24.9" + "@tanstack/query-persist-client-core" "4.26.1" "@tanstack/react-query-persist-client@^4.14.5": - version "4.24.9" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.24.9.tgz#f463a4911f5731e70139f6936a2fdba32d63f0c7" - integrity sha512-6PMhvN/QJZD/lxmTwFZi8pyuwbDi9Dib4S/bMTDHzHr+3iJEZi9/6ry/IwXSHa/ho3JlujWOm5Td7VJVv8MEyw== + version "4.26.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-persist-client/-/react-query-persist-client-4.26.1.tgz#4b6b8a6736c19eaeb42d81c76186cd7fe60abe88" + integrity sha512-efS2hPz8z+ySCTIy1DJ4uuT7LSi8F0E4bMXwP/aj2dDuMRFn6AV3z7LItInpp0Em3JKhi90GP2vxDyvQTOhO2A== dependencies: - "@tanstack/query-persist-client-core" "4.24.9" + "@tanstack/query-persist-client-core" "4.26.1" "@tanstack/react-query@^4.14.5": - version "4.24.9" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.24.9.tgz#8ec7e22dd3a858e174a90e81d20c85908f2ea653" - integrity sha512-6WLwUT9mrngIinRtcZjrWOUENOuLbWvQpKmU6DZCo2iPQVA+qvv3Ji90Amme4AkUyWQ8ZSSRTnAFq8V2tj2ACg== + version "4.26.1" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.26.1.tgz#d254f6b7b297b5ae4204c84e6622506e5ec77d09" + integrity sha512-i3dnz4TOARGIXrXQ5P7S25Zfi4noii/bxhcwPurh2nrf5EUCcAt/95TB2HSmMweUBx206yIMWUMEQ7ptd6zwDg== dependencies: - "@tanstack/query-core" "4.24.9" + "@tanstack/query-core" "4.26.1" use-sync-external-store "^1.2.0" "@testing-library/dom@^8.3.0": @@ -5082,9 +5001,9 @@ integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== "@types/aws-lambda@^8.10.83": - version "8.10.110" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.110.tgz#32a1f9d40b855d69830243492bbb6408098f4c88" - integrity sha512-r6egf2Cwv/JaFTTrF9OXFVUB3j/SXTgM9BwrlbBRjWAa2Tu6GWoDoLflppAZ8uSfbUJdXvC7Br3DjuN9pQ2NUQ== + version "8.10.111" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.111.tgz#9107c405f3011a5c423b5ac93fbf279439558571" + integrity sha512-8HR9UjIKmoemEzE2BviVtFkeenxfbizSu8raFjnT2VXxguZZ2JTlNww7INOH7IA0J/zRa3TjOftkYq6hVNkxDA== "@types/btoa-lite@^1.0.0": version "1.0.0" @@ -5107,9 +5026,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.4.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" - integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== + version "8.21.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" + integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -5125,9 +5044,9 @@ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/glob@*": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.1.tgz#6e3041640148b7764adf21ce5c7138ad454725b0" - integrity sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== dependencies: "@types/minimatch" "^5.1.2" "@types/node" "*" @@ -5246,15 +5165,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^18.11.9": - version "18.11.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== - -"@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== +"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^18.11.9": + version "18.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93" + integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== "@types/node@^12.12.54": version "12.20.55" @@ -5262,9 +5176,9 @@ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0": - version "16.18.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae" - integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA== + version "16.18.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.14.tgz#5465ce598486a703caddbefe8603f8a2cffa3461" + integrity sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -5302,16 +5216,16 @@ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/react-dom@^18.0.9": - version "18.0.10" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" - integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== + version "18.0.11" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" + integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.25": - version "18.0.27" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" - integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== + version "18.0.28" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" + integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -5424,21 +5338,22 @@ "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.20" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.20.tgz#107f0fcc13bd4a524e352b41c49fe88aab5c54d5" - integrity sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A== + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.45.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.49.0.tgz#d0b4556f0792194bf0c2fb297897efa321492389" - integrity sha512-IhxabIpcf++TBaBa1h7jtOWyon80SXPRLDq0dVz5SLFC/eW6tofkw/O7Ar3lkx5z5U6wzbKDrl2larprp5kk5Q== + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" + integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== dependencies: - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/type-utils" "5.49.0" - "@typescript-eslint/utils" "5.49.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/type-utils" "5.54.1" + "@typescript-eslint/utils" "5.54.1" debug "^4.3.4" + grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" regexpp "^3.2.0" @@ -5446,71 +5361,71 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.45.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.49.0.tgz#d699734b2f20e16351e117417d34a2bc9d7c4b90" - integrity sha512-veDlZN9mUhGqU31Qiv2qEp+XrJj5fgZpJ8PW30sHU+j/8/e5ruAhLaVDAeznS7A7i4ucb/s8IozpDtt9NqCkZg== + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" + integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== dependencies: - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/typescript-estree" "5.49.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.49.0.tgz#81b5d899cdae446c26ddf18bd47a2f5484a8af3e" - integrity sha512-clpROBOiMIzpbWNxCe1xDK14uPZh35u4QaZO1GddilEzoCLAEz4szb51rBpdgurs5k2YzPtJeTEN3qVbG+LRUQ== +"@typescript-eslint/scope-manager@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" + integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== dependencies: - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/visitor-keys" "5.49.0" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" -"@typescript-eslint/type-utils@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.49.0.tgz#8d5dcc8d422881e2ccf4ebdc6b1d4cc61aa64125" - integrity sha512-eUgLTYq0tR0FGU5g1YHm4rt5H/+V2IPVkP0cBmbhRyEmyGe4XvJ2YJ6sYTmONfjmdMqyMLad7SB8GvblbeESZA== +"@typescript-eslint/type-utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" + integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== dependencies: - "@typescript-eslint/typescript-estree" "5.49.0" - "@typescript-eslint/utils" "5.49.0" + "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/utils" "5.54.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.49.0.tgz#ad66766cb36ca1c89fcb6ac8b87ec2e6dac435c3" - integrity sha512-7If46kusG+sSnEpu0yOz2xFv5nRz158nzEXnJFCGVEHWnuzolXKwrH5Bsf9zsNlOQkyZuk0BZKKoJQI+1JPBBg== +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" + integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== -"@typescript-eslint/typescript-estree@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.49.0.tgz#ebd6294c0ea97891fce6af536048181e23d729c8" - integrity sha512-PBdx+V7deZT/3GjNYPVQv1Nc0U46dAHbIuOG8AZ3on3vuEKiPDwFE/lG1snN2eUB9IhF7EyF7K1hmTcLztNIsA== +"@typescript-eslint/typescript-estree@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" + integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== dependencies: - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/visitor-keys" "5.49.0" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.49.0", "@typescript-eslint/utils@^5.10.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.49.0.tgz#1c07923bc55ff7834dfcde487fff8d8624a87b32" - integrity sha512-cPJue/4Si25FViIb74sHCLtM4nTSBXtLx1d3/QT6mirQ/c65bV8arBEebBJJizfq8W2YyMoPI/WWPFWitmNqnQ== +"@typescript-eslint/utils@5.54.1", "@typescript-eslint/utils@^5.10.0": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" + integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.49.0" - "@typescript-eslint/types" "5.49.0" - "@typescript-eslint/typescript-estree" "5.49.0" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.49.0": - version "5.49.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.49.0.tgz#2561c4da3f235f5c852759bf6c5faec7524f90fe" - integrity sha512-v9jBMjpNWyn8B6k/Mjt6VbUS4J1GvUlR4x3Y+ibnP1z7y7V4n0WRz+50DY6+Myj0UaXVSuUlHohO+eZ8IJEnkg== +"@typescript-eslint/visitor-keys@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" + integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== dependencies: - "@typescript-eslint/types" "5.49.0" + "@typescript-eslint/types" "5.54.1" eslint-visitor-keys "^3.3.0" "@vitejs/plugin-react@2.2.0", "@vitejs/plugin-react@^2.0.0": @@ -5526,15 +5441,15 @@ magic-string "^0.26.7" react-refresh "^0.14.0" -"@wagmi/chains@0.2.8": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-0.2.8.tgz#eece43702f719d7de4193dc993668e0d783937b5" - integrity sha512-owGdAL75bE0JOzVTm5SOci458RrdD+FTJ6D238A+0VV9SQCz5N8vK9VBxhcEKXexjhzMM+CJZqFBTyxNsmNlLw== +"@wagmi/chains@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-0.2.9.tgz#3dba5fbeb3a2a5c9253bbedce3ede8c84bd809cb" + integrity sha512-z0Nv7Cto+t/47NtC8td7khMSWX0zKVCnm8gkgrRs9PHvN+4W7XZfUVQYfhIfkbelT/ONN9V1OA+ho122gmRr3Q== -"@wagmi/connectors@0.2.6": - version "0.2.6" - resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-0.2.6.tgz#b96025ebf8f0ec33fea12fa643afe7269f833de4" - integrity sha512-I7tsKgbwF6o5aUu6gQk4YMo7fe3iLAgmbFT06/FHlSLKIxI16qkKwjTt04k9WhdDRDYaJH+DqUEyam1jP+jvIg== +"@wagmi/connectors@0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-0.2.7.tgz#98ba99217ec4ddec0ca3bb3e69b9795ffcbf6200" + integrity sha512-9l5XBlaO7AGukvIbgLj3L1VMbRvHmwQTu36t0mQRE90LHzqP45/BK9BtrpUI8DjdmIMwQ+omMqSqBuhawT5Zwg== dependencies: "@coinbase/wallet-sdk" "^3.5.4" "@ledgerhq/connect-kit-loader" "^1.0.1" @@ -5546,13 +5461,13 @@ abitype "^0.3.0" eventemitter3 "^4.0.7" -"@wagmi/core@0.9.6": - version "0.9.6" - resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-0.9.6.tgz#19969e3f1711071d594754c08c82f0705c585dab" - integrity sha512-TGAnA9sNjm3s8evBVxN3yRjZqKGBlhFW1Bk2nX1C1UtlrA5uTIPDWGxHw0CAPmSnE4MLL89Um4JA12jubNqLZg== +"@wagmi/core@0.9.7": + version "0.9.7" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-0.9.7.tgz#291063c872baa25419bdedc66c0e766bb7eea91c" + integrity sha512-9NYoxpEM+sYAv0Jg3DvMbWTnJguPwiqs61382ATU5dqMsYF1v17ngg6S15gg8oIv9Y7nYrLsiFsQ9qkNYzKlJA== dependencies: - "@wagmi/chains" "0.2.8" - "@wagmi/connectors" "0.2.6" + "@wagmi/chains" "0.2.9" + "@wagmi/connectors" "0.2.7" abitype "^0.3.0" eventemitter3 "^4.0.7" zustand "^4.3.1" @@ -5681,21 +5596,21 @@ "@walletconnect/utils" "^1.8.0" "@walletconnect/jsonrpc-http-connection@^1.0.2", "@walletconnect/jsonrpc-http-connection@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.4.tgz#aeb0f7eae6565dd031f01d650ee73d358d760ee2" - integrity sha512-ji79pspdBhmIbTwve383tMaDu5Le9plW+oj5GE2aqzxIl3ib8JvRBZRn5lGEBGqVCvqB3MBJL7gBlEwpyRtoxQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.6.tgz#48c41cf3e5ac9add9425420b345615dc438594cd" + integrity sha512-/3zSqDi7JDN06E4qm0NmVYMitngXfh21UWwy8zeJcBeJc+Jcs094EbLsIxtziIIKTCCbT88lWuTjl1ZujxN7cw== dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.1" cross-fetch "^3.1.4" tslib "1.14.1" "@walletconnect/jsonrpc-provider@^1.0.5", "@walletconnect/jsonrpc-provider@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.6.tgz#e91321ef523f1904e6634e7866a0f3c6f056d2cd" - integrity sha512-f5vQxr53vUVQ51/9mRLb1OiNciT/546XZ68Byn9OYnDBGeGJXK2kQWDHp8sPWZbN5x0p7B6asdCWMVFJ6danlw== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.8.tgz#d56e5bc95c1ec264748a6911389a3ac80f4bd831" + integrity sha512-M44vzTrF0TeDcxQorm2lJ5klmfqchYOZqmIHb5T9lIPA/rj22643P83j44flZLyzycPqy5UUlIH6foeBPwjxMg== dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.1" tslib "1.14.1" @@ -5707,22 +5622,24 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.3", "@walletconnect/jsonrpc-utils@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.4.tgz#2009ba3907b02516f2caacd2fb871ff0d472b2cb" - integrity sha512-y0+tDxcTZ9BHBBKBJbjZxLUXb+zQZCylf7y/jTvDPNx76J0hYYc+F9zHzyqBLeorSKepLTk6yI8hw3NXbAQB3g== +"@walletconnect/jsonrpc-utils@^1.0.3", "@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz#7fa58e6671247e64e189828103282e6258f5330f" + integrity sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg== dependencies: "@walletconnect/environment" "^1.0.1" "@walletconnect/jsonrpc-types" "^1.0.2" tslib "1.14.1" "@walletconnect/jsonrpc-ws-connection@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.7.tgz#48cdd875519602d14737c706f551ebcbb644179b" - integrity sha512-iEIWUAIQih0TDF+RRjExZL3jd84UWX/rvzAmQ6fZWhyBP/qSlxGrMuAwNhpk2zj6P8dZuf8sSaaNuWgXFJIa5A== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.9.tgz#38e089818e490cf52cfad9f98300949a74de9fdd" + integrity sha512-x1COaW6hhMLEo+ND5zF/siBGg5SEwC/gHjeRbJtK1CRiq9atkg/XR7JwtSNfMvYX/O3PRCVmuc5SP0RQio9JUw== dependencies: - "@walletconnect/jsonrpc-utils" "^1.0.4" + "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.1" + events "^3.3.0" + tslib "1.14.1" ws "^7.5.1" "@walletconnect/keyvaluestorage@^1.0.2": @@ -5769,9 +5686,9 @@ tslib "1.14.1" "@walletconnect/relay-api@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.7.tgz#e7aed03cbaff99ecdf2c8d32280c0b5d673bb419" - integrity sha512-Mf/Ql7Z0waZzAuondHS9bbUi12Kyvl95ihxVDM7mPO8o7Ke7S1ffpujCUhXbSacSKcw9aV2+7bKADlsBjQLR5Q== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf" + integrity sha512-Q3+rylJOqRkO1D9Su0DPE3mmznbAalYapJ9qmzDgK28mYF9alcP3UwG/og5V7l7CFOqzCLi7B8BvcBUrpDj0Rg== dependencies: "@walletconnect/jsonrpc-types" "^1.0.2" tslib "1.14.1" @@ -5940,28 +5857,28 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@web3modal/core@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-2.1.1.tgz#e1ebe8faaae6e4b74df911fd5ac6023f280b12c1" - integrity sha512-GAZAvfkPHoX2/fghQmf+y36uDspk9wBJxG7qLPUNTHzvIfRoNHWbTt3iEvRdPmUZwbTGDn1jvz9z0uU67gvZdw== +"@web3modal/core@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@web3modal/core/-/core-2.1.3.tgz#629ca428c764d2e162df083206cc00e7afb8fa7f" + integrity sha512-hE/Rn8mT+r9M+EgO0WrCiIsMl/QCk4dXUgTpA4E+Dc/Z8JQhQP+VCU7FJNH632idmcFQPKgEf4DnoKQo5cuwEQ== dependencies: buffer "6.0.3" valtio "1.9.0" "@web3modal/standalone@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@web3modal/standalone/-/standalone-2.1.1.tgz#e496e54af5ecf6e282ff7f287eebce7f1ac90bd2" - integrity sha512-K06VkZqltLIBKpnLeM2oszRDSdLnwXJWCcItWEOkH4LDFQIiq8lSeLhcamuadRxRKF4ZyTSLHHJ5MFcMfZEHQQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@web3modal/standalone/-/standalone-2.1.3.tgz#890233252e26d3ace1c69eec074802294e8bdd5b" + integrity sha512-xvBGWVv+zw6bcaTB9vfq2/3vKobvfGRbdD/sKn32x4IxEjCaQO6RFmp9yYhj07S6gQ7Cq8iOxlBUBdfnbkH3Ew== dependencies: - "@web3modal/core" "2.1.1" - "@web3modal/ui" "2.1.1" + "@web3modal/core" "2.1.3" + "@web3modal/ui" "2.1.3" -"@web3modal/ui@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-2.1.1.tgz#300dceeee8a54be70aad74fb4a781ac22439eded" - integrity sha512-0jRDxgPc/peaE5KgqnzzriXhdVu5xNyCMP5Enqdpd77VkknJIs7h16MYKidxgFexieyHpCOssWySsryWcP2sXA== +"@web3modal/ui@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@web3modal/ui/-/ui-2.1.3.tgz#323902c76f789b325ed059a6836ebe30c1ad8765" + integrity sha512-GvZ53Vk9plSpJjmwGAJyGc5hngN6nr5r3mqUNASIo52Kvr2kqfgPOcbZO/7W1vfAbjZwes6K3Ai2h5P7WZ6Zkg== dependencies: - "@web3modal/core" "2.1.1" + "@web3modal/core" "2.1.3" lit "2.6.1" motion "10.15.5" qrcode "1.5.1" @@ -6237,21 +6154,21 @@ resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.2.tgz#7b7107268d2982fc7b7aff5ee6803c64018f84dd" integrity sha512-WKj/lI4QjnLuPrim0cfO7i+HsDSXHxNv1y0CrJhdntuO3hxWZmnXCwNDnwOvry11OjRin6cgWNF+j/9Pn8TN4w== -"@whatwg-node/fetch@^0.8.0", "@whatwg-node/fetch@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.1.tgz#ee3c94746132f217e17f78f9e073bb342043d630" - integrity sha512-Fkd1qQHK2tAWxKlC85h9L86Lgbq3BzxMnHSnTsnzNZMMzn6Xi+HlN8/LJ90LxorhSqD54td+Q864LgwUaYDj1Q== +"@whatwg-node/fetch@^0.8.0", "@whatwg-node/fetch@^0.8.1", "@whatwg-node/fetch@^0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.2.tgz#763fa02e957e6308454f496e060d27f2d9c5f119" + integrity sha512-6u1xGzFZvskJpQXhWreR9s1/4nsuY4iFRsTb4BC3NiDHmzgj/Hu1Ovt4iHs5KAjLzbnsjaQOI5f5bQPucqvPsQ== dependencies: "@peculiar/webcrypto" "^1.4.0" - "@whatwg-node/node-fetch" "^0.3.0" + "@whatwg-node/node-fetch" "^0.3.1" busboy "^1.6.0" urlpattern-polyfill "^6.0.2" web-streams-polyfill "^3.2.1" -"@whatwg-node/node-fetch@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.0.tgz#7c7e90d03fa09d0ddebff29add6f16d923327d58" - integrity sha512-mPM8WnuHiI/3kFxDeE0SQQXAElbz4onqmm64fEGCwYEcBes2UsvIDI8HwQIqaXCH42A9ajJUPv4WsYoN/9oG6w== +"@whatwg-node/node-fetch@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.1.tgz#491ac6c5a367ab6dbff78756c0487afc32f70dee" + integrity sha512-/U4onp5eBkRHfFe/VL+ppyupqj7z6iBtjcuPSosQNH2/y+LxRn5lyFb7Vqhb5DokjrDMjssLcqiVYnx+UABFsw== dependencies: "@whatwg-node/events" "^0.0.2" busboy "^1.6.0" @@ -6277,11 +6194,11 @@ tslib "^2.3.1" "@whatwg-node/server@^0.7.0": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.7.1.tgz#ee33c5f1bdeab26bb2f77761083789833cd8d493" - integrity sha512-kXZeJ+8vLD8Snewq0N1TB2cWPu6z91ymrRRLDx0KHmbsSrsPIdrXxoHBAvFBxTQz3u2O4IYsyhHetAnBBrrWgA== + version "0.7.4" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.7.4.tgz#b8cce364461bbb489302d1d2a2692db96be20646" + integrity sha512-0+c3Y1tmMTIz3+cM8GCOXZuJclHlOZrq2uWb9WVnv1sd98pcFQBW9163nmN7cUTyD84c/yMJmEW3F+Ka6zRZgQ== dependencies: - "@whatwg-node/fetch" "^0.8.1" + "@whatwg-node/fetch" "^0.8.2" tslib "^2.3.1" "@wry/context@^0.7.0": @@ -6401,12 +6318,12 @@ aes-js@^3.1.2: integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0, aggregate-error@^3.1.0: @@ -6471,9 +6388,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv uri-js "^4.2.2" alchemy-sdk@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/alchemy-sdk/-/alchemy-sdk-2.5.0.tgz#20813b02eded16e9cbc56c5fc8259684dc324eb9" - integrity sha512-pgwyPiAmUp4uaBkkpdnlHxjB7yjeO88VhIIFo5aCiuPAxgpB5nKRqBQw2XXqiZEUF4xU1ybZ2s1ESQ6k/hc2MQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/alchemy-sdk/-/alchemy-sdk-2.6.0.tgz#a2e0b6ecb6f789aa789a45f2b930da3bd860b9e8" + integrity sha512-5Oe0WCPPsPtIWMVPTlpLcamMHSBQyxpmAX/np+BmNMU0w5V8U+r8MweeqSuWDFPQ8sQiq+bG7xP/NwbBvif9vw== dependencies: "@ethersproject/abi" "^5.7.0" "@ethersproject/abstract-provider" "^5.7.0" @@ -6791,6 +6708,16 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -6809,9 +6736,9 @@ ast-types@^0.14.2: tslib "^2.0.1" async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" + integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== async-mutex@^0.2.6: version "0.2.6" @@ -7282,6 +7209,13 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browser-resolve@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" + integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== + dependencies: + resolve "^1.17.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -7348,15 +7282,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" @@ -7435,7 +7369,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.4.3: +buffer@^5.4.3, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -7473,9 +7407,9 @@ bytes@3.1.2: integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== c8@^7.6.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.12.0.tgz#402db1c1af4af5249153535d1c84ad70c5c96b14" - integrity sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A== + version "7.13.0" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.13.0.tgz#a2a70a851278709df5a9247d62d7f3d4bcb5f2e4" + integrity sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@istanbuljs/schema" "^0.1.3" @@ -7609,10 +7543,10 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: - version "1.0.30001449" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz#a8d11f6a814c75c9ce9d851dc53eb1d1dfbcd657" - integrity sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw== +caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: + version "1.0.30001462" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001462.tgz#b2e801e37536d453731286857c8520d3dcee15fe" + integrity sha512-PDd20WuOBPiasZ7KbFnmQRyuLE7cFXW2PVd7dmALzbkUXEP46upAuCDm9eY9vho8fgNMGmbAX92QBZHzcnWIqw== capital-case@^1.0.4: version "1.0.4" @@ -7800,9 +7734,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.1.tgz#708a6cdae38915d597afdf3b145f2f8e1ff55f3f" - integrity sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -7951,12 +7885,12 @@ color-support@^1.1.2: integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colorthief@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/colorthief/-/colorthief-2.3.2.tgz#00b984f421abe5a2af71c4d464c9d80d407fd53d" - integrity sha512-1r4nPW553JviRcFRvN3fS2V9nUSQGjRIws8UfEeFLIxk8j1tvtaX+AAYTkH3A4B5Muiys8SA1WJxf+00xVTXyg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/colorthief/-/colorthief-2.4.0.tgz#74e6edd142695655bd5f52c7f8116b125ea2b2bd" + integrity sha512-0U48RGNRo5fVO+yusBwgp+d3augWSorXabnqXUu9SabEhCpCgZJEUjUTTI41OOBBYuMMxawa3177POT6qLfLeQ== dependencies: + "@lokesh.dhakar/quantize" "^1.3.0" get-pixels "^3.3.2" - quantize "github:lokesh/quantize" combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" @@ -8041,9 +7975,9 @@ concat-stream@^1.5.0: typedarray "^0.0.6" connectkit@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/connectkit/-/connectkit-1.1.3.tgz#0c5bdd1ac134587e2dc1a3b91c0e2bf8f4f37270" - integrity sha512-gTRybTw6zsdGoZV+RP/P2ITk8SNNz9w6GJ9rDzcDyMgNtwwASPMJDBn+0BTVrVRytqU/RH46rTBsBaloroSNZw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/connectkit/-/connectkit-1.2.0.tgz#0e90f0ea7a418face5dd840080d1717b72f83fe5" + integrity sha512-uptuu2uMy3NjgEqChTC6p8kx9NzxKmiY2d04KjNUlRdlF1eM5aRQD45jr+OCNMo2eUlklXLxgFDch5lvP3UHYg== dependencies: buffer "^6.0.3" detect-browser "^5.3.0" @@ -8086,9 +8020,9 @@ content-disposition@0.5.4: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" @@ -8130,21 +8064,21 @@ copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js-compat@^3.25.1, core-js-compat@^3.8.1: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" - integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + version "3.29.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" + integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== dependencies: - browserslist "^4.21.4" + browserslist "^4.21.5" core-js-pure@^3.23.3: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.2.tgz#47e9cc96c639eefc910da03c3ece26c5067c7553" - integrity sha512-Cf2jqAbXgWH3VVzjyaaFkY1EBazxugUepGymDoeteyYr9ByX51kD2jdHZlsEF/xnJMyN3Prua7mQuzwMg6Zc9A== + version "3.29.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.29.0.tgz#0e1ac889214398641ea4bb1c6cf25ff0959ec1d2" + integrity sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ== core-js@^3.0.4, core-js@^3.6.5, core-js@^3.8.2: - version "3.27.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7" - integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w== + version "3.29.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.0.tgz#0273e142b67761058bcde5615c503c7406b572d6" + integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg== core-util-is@1.0.2: version "1.0.2" @@ -8244,7 +8178,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-require@^1.1.0: +create-require@^1.1.0, create-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== @@ -8488,9 +8422,9 @@ deepmerge@^2.1.1: integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== default-browser-id@^1.0.4: version "1.0.4" @@ -8507,9 +8441,9 @@ define-lazy-prop@^2.0.0: integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -8556,16 +8490,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0: +depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - dependency-graph@0.11.0, dependency-graph@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" @@ -8640,10 +8569,10 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== diff@5.0.0: version "5.0.0" @@ -8741,6 +8670,11 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== +domain-browser@^4.22.0: + version "4.22.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f" + integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== + domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" @@ -8792,7 +8726,7 @@ dotenv@^8.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -dset@^3.1.1, dset@^3.1.2: +dset@3.1.2, dset@^3.1.1, dset@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== @@ -8844,10 +8778,10 @@ eip1193-provider@1.0.1: dependencies: "@json-rpc-tools/provider" "^1.5.5" -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.284: + version "1.4.325" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.325.tgz#7b97238a61192d85d055d97f3149832b3617d37b" + integrity sha512-K1C03NT4I7BuzsRdCU5RWkgZxtswnKDYM6/eMhkEXqKu4e5T+ck610x3FPzu1y7HVFSiQKZqP16gnJzPpji1TQ== elliptic@6.5.4, elliptic@^6.5.3: version "6.5.4" @@ -9065,6 +8999,11 @@ es6-iterator@^2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -9256,9 +9195,9 @@ escodegen@^2.0.0: source-map "~0.6.1" eslint-config-prettier@^8.5.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" - integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz#f1cc58a8afebc50980bd53475451df146c13182d" + integrity sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA== eslint-plugin-jest@^27.1.6: version "27.2.1" @@ -9280,9 +9219,9 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.31.11: - version "7.32.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.1.tgz#88cdeb4065da8ca0b64e1274404f53a0f9890200" - integrity sha512-vOjdgyd0ZHBXNsmvU+785xY8Bfe57EFbTYYk8XrROzWpr9QBvpjITvAXt9xqcE6+8cjR/g1+mfumPToxsl1www== + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" @@ -9386,11 +9325,12 @@ eslint@8.4.1: v8-compile-cache "^2.0.3" eslint@^8.28.0: - version "8.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861" - integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ== + version "8.35.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" + integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== dependencies: - "@eslint/eslintrc" "^1.4.1" + "@eslint/eslintrc" "^2.0.0" + "@eslint/js" "8.35.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -9404,7 +9344,7 @@ eslint@^8.28.0: eslint-utils "^3.0.0" eslint-visitor-keys "^3.3.0" espree "^9.4.0" - esquery "^1.4.0" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" @@ -9453,10 +9393,10 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.0, esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -9486,11 +9426,6 @@ estree-to-babel@^3.1.0: "@babel/types" "^7.2.0" c8 "^7.6.0" -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -9652,15 +9587,15 @@ expand-brackets@^2.1.4: to-regex "^3.0.1" expect@^29.0.0: - version "29.4.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" - integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - "@jest/expect-utils" "^29.4.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.4.1" - jest-message-util "^29.4.1" - jest-util "^29.4.1" + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" express@^4.17.1: version "4.18.2" @@ -9882,9 +9817,9 @@ fbjs@^3.0.0: ua-parser-js "^0.7.30" fetch-retry@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.3.tgz#edfa3641892995f9afee94f25b168827aa97fe3d" - integrity sha512-uJQyMrX5IJZkhoEUBQ3EjxkeiZkppBd5jS/fMTJmfZxLSiaQjv2zD0kTvuvkSH89uFvgSlB6ueGpjD3HWN7Bxw== + version "5.0.4" + resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.4.tgz#06e8e4533030bf6faa00ffbb9450cb9264c23c12" + integrity sha512-LXcdgpdcVedccGg0AZqg+S8lX/FCdwXD92WNZ5k5qsb0irRhSFsBOpcJt7oevyqT2/C2nEE0zSFNdBEpj3YOSw== figgy-pudding@^3.5.1: version "3.5.2" @@ -10004,36 +9939,36 @@ find-up@^4.0.0, find-up@^4.1.0: path-exists "^4.0.0" firebase@^9.17.1: - version "9.17.1" - resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.17.1.tgz#91c56fe9d9bf5ed1c405030e4fe8133c6069fd40" - integrity sha512-MSZaTRaaRLgDFLqoEnoPYK8zkLwQNvYeLZ3YSKdcQxG8hDifNO22ywS1cSA1ZCGHlQeOsDtfDwBejKcANf/RQw== - dependencies: - "@firebase/analytics" "0.9.3" - "@firebase/analytics-compat" "0.2.3" - "@firebase/app" "0.9.3" - "@firebase/app-check" "0.6.3" - "@firebase/app-check-compat" "0.3.3" - "@firebase/app-compat" "0.2.3" + version "9.17.2" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-9.17.2.tgz#950720666b1628a0b16926fbea4fc4217bd66185" + integrity sha512-2V95/evwB3zsi6RYHCvPXfkiQrSepFQJohv3YGoQVhS0bvXuYXmkLtrCVGShxneB/5t9HE5C9q9C8XPnK4APBw== + dependencies: + "@firebase/analytics" "0.9.4" + "@firebase/analytics-compat" "0.2.4" + "@firebase/app" "0.9.4" + "@firebase/app-check" "0.6.4" + "@firebase/app-check-compat" "0.3.4" + "@firebase/app-compat" "0.2.4" "@firebase/app-types" "0.9.0" - "@firebase/auth" "0.21.3" - "@firebase/auth-compat" "0.3.3" - "@firebase/database" "0.14.3" - "@firebase/database-compat" "0.3.3" - "@firebase/firestore" "3.8.3" - "@firebase/firestore-compat" "0.3.3" - "@firebase/functions" "0.9.3" - "@firebase/functions-compat" "0.3.3" - "@firebase/installations" "0.6.3" - "@firebase/installations-compat" "0.2.3" - "@firebase/messaging" "0.12.3" - "@firebase/messaging-compat" "0.2.3" - "@firebase/performance" "0.6.3" - "@firebase/performance-compat" "0.2.3" - "@firebase/remote-config" "0.4.3" - "@firebase/remote-config-compat" "0.2.3" - "@firebase/storage" "0.11.1" - "@firebase/storage-compat" "0.3.1" - "@firebase/util" "1.9.2" + "@firebase/auth" "0.21.4" + "@firebase/auth-compat" "0.3.4" + "@firebase/database" "0.14.4" + "@firebase/database-compat" "0.3.4" + "@firebase/firestore" "3.8.4" + "@firebase/firestore-compat" "0.3.4" + "@firebase/functions" "0.9.4" + "@firebase/functions-compat" "0.3.4" + "@firebase/installations" "0.6.4" + "@firebase/installations-compat" "0.2.4" + "@firebase/messaging" "0.12.4" + "@firebase/messaging-compat" "0.2.4" + "@firebase/performance" "0.6.4" + "@firebase/performance-compat" "0.2.4" + "@firebase/remote-config" "0.4.4" + "@firebase/remote-config-compat" "0.2.4" + "@firebase/storage" "0.11.2" + "@firebase/storage-compat" "0.3.2" + "@firebase/util" "1.9.3" flat-cache@^3.0.4: version "3.0.4" @@ -10117,9 +10052,9 @@ fork-ts-checker-webpack-plugin@^4.1.6: worker-rpc "^0.1.0" fork-ts-checker-webpack-plugin@^6.0.4: - version "6.5.2" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" - integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" @@ -10336,7 +10271,7 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== @@ -10510,9 +10445,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0, globals@^13.6.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" @@ -11003,9 +10938,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immer@^9.0.16: - version "9.0.18" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.18.tgz#d2faee58fd0e34f017f329b98cdab37826fa31b8" - integrity sha512-eAPNpsj7Ax1q6Y/3lm2PmlwRcFzpON7HSNQ3ru5WQH1/PSpnyed/HpNOELl2CxLKoj4r+bAHgdyKqW5gc2Se1A== + version "9.0.19" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" + integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== immutable@~3.7.6: version "3.7.6" @@ -11076,11 +11011,11 @@ inline-style-parser@0.1.1: integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== internal-slot@^1.0.3, internal-slot@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" - integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -11160,12 +11095,12 @@ is-arguments@^1.0.4, is-arguments@^1.1.1: has-tostringtag "^1.0.0" is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" is-typed-array "^1.1.10" is-arrayish@^0.2.1: @@ -11363,6 +11298,14 @@ is-map@^2.0.1, is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -11589,6 +11532,11 @@ isobject@^4.0.0: resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== +isomorphic-timers-promises@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598" + integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ== + isomorphic-unfetch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" @@ -11677,20 +11625,20 @@ jayson@^3.4.4: uuid "^8.3.2" ws "^7.4.5" -jest-diff@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" - integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.4.1" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== jest-haste-map@^26.6.2: version "26.6.2" @@ -11713,28 +11661,28 @@ jest-haste-map@^26.6.2: optionalDependencies: fsevents "^2.1.2" -jest-matcher-utils@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" - integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^29.4.1" - jest-get-type "^29.2.0" - pretty-format "^29.4.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-message-util@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" - integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.4.1" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.4.1" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -11771,12 +11719,12 @@ jest-util@^26.6.2: is-ci "^2.0.0" micromatch "^4.0.2" -jest-util@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" - integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^29.4.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -12075,9 +12023,9 @@ lie@3.1.1: immediate "~3.0.5" lilconfig@^2.0.5, lilconfig@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" @@ -12211,11 +12159,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.set@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== - lodash.topath@4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" @@ -12300,21 +12243,14 @@ lru-cache@^6.0.0: yallist "^4.0.0" lru-cache@^7.14.1: - version "7.18.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.1.tgz#4716408dec51d5d0104732647f584d1f6738b109" - integrity sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg== + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== - -magic-string@^0.25.3: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.26.1, magic-string@^0.26.7: version "0.26.7" @@ -12624,9 +12560,9 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatc brace-expansion "^1.1.7" minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -12657,11 +12593,9 @@ minipass@^3.0.0, minipass@^3.1.1: yallist "^4.0.0" minipass@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.0.tgz#7cebb0f9fa7d56f0c5b17853cbe28838a8dbbd3b" - integrity sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw== - dependencies: - yallist "^4.0.0" + version "4.2.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.4.tgz#7d0d97434b6a19f59c5c3221698b48bbf3b2cd06" + integrity sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ== minizlib@^2.1.1: version "2.1.2" @@ -12912,13 +12846,6 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" -node-fetch@2: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== - dependencies: - whatwg-url "^5.0.0" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -12927,9 +12854,9 @@ node-fetch@2.6.7: whatwg-url "^5.0.0" node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.8" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" - integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg== + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== dependencies: whatwg-url "^5.0.0" @@ -12972,10 +12899,43 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +node-stdlib-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c" + integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg== + dependencies: + assert "^2.0.0" + browser-resolve "^2.0.0" + browserify-zlib "^0.2.0" + buffer "^5.7.1" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + create-require "^1.1.1" + crypto-browserify "^3.11.0" + domain-browser "^4.22.0" + events "^3.0.0" + https-browserify "^1.0.0" + isomorphic-timers-promises "^1.0.1" + os-browserify "^0.3.0" + path-browserify "^1.0.1" + pkg-dir "^5.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + readable-stream "^3.6.0" + stream-browserify "^3.0.0" + stream-http "^3.2.0" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.1" + url "^0.11.0" + util "^0.12.4" + vm-browserify "^1.0.1" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" @@ -13079,7 +13039,7 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.1.5: +object-is@^1.0.1, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -13230,9 +13190,9 @@ open@7.4.2, open@^7.0.3: is-wsl "^2.1.1" open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -13485,7 +13445,7 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-browserify@1.0.1: +path-browserify@1.0.1, path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== @@ -13766,9 +13726,9 @@ postcss-import@^14.1.0: resolve "^1.1.7" postcss-js@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" - integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" @@ -13831,7 +13791,7 @@ postcss-nested@6.0.0: dependencies: postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2: version "6.0.11" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== @@ -13852,7 +13812,7 @@ postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0 picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.4.18, postcss@^8.4.21: +postcss@^8.0.9, postcss@^8.4.18, postcss@^8.4.21: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -13867,9 +13827,9 @@ preact@10.4.1: integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== preact@^10.5.9: - version "10.12.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.12.1.tgz#8f9cb5442f560e532729b7d23d42fd1161354a21" - integrity sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg== + version "10.13.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.13.0.tgz#f8bd3cf257a4dbe41da71a52131b79916d4ca89d" + integrity sha512-ERdIdUpR6doqdaSIh80hvzebHB7O6JxycOhyzAeLEchqOq/4yueslQbfnPwXaNhAYacFTyCclhwkEbOumT0tHw== prelude-ls@^1.2.1: version "1.2.1" @@ -13894,9 +13854,9 @@ prettier-linter-helpers@^1.0.0: integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== prettier@^2.8.0: - version "2.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" - integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== + version "2.8.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== pretty-error@^2.1.1: version "2.1.2" @@ -13915,12 +13875,12 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.4.1: - version "29.4.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" - integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: - "@jest/schemas" "^29.4.0" + "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -14108,7 +14068,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^1.2.4, punycode@^1.3.2: +punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== @@ -14153,22 +14113,25 @@ qrcode@1.5.1, qrcode@^1.5.0: pngjs "^5.0.0" yargs "^15.3.1" -qs@6.11.0, qs@^6.10.0, qs@^6.10.3: +qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" +qs@^6.10.0, qs@^6.10.3: + version "6.11.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -"quantize@github:lokesh/quantize": - version "1.2.0" - resolved "https://codeload.github.com/lokesh/quantize/tar.gz/f572abd2646b5944852535c8a26fdb958a5d7c4b" - query-string@6.13.5: version "6.13.5" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8" @@ -14188,7 +14151,7 @@ query-string@7.1.1: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -querystring-es3@^0.2.0: +querystring-es3@^0.2.0, querystring-es3@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== @@ -14389,19 +14352,19 @@ react-refresh@^0.14.0: integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== react-router-dom@^6.4.4: - version "6.8.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.0.tgz#5e5f4c4b15fdec3965d2ad9d7460d0c61971e744" - integrity sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ== + version "6.8.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.2.tgz#a6654a3400be9aafd504d7125573568921b78b57" + integrity sha512-N/oAF1Shd7g4tWy+75IIufCGsHBqT74tnzHQhbiUTYILYF0Blk65cg+HPZqwC+6SqEyx033nKqU7by38v3lBZg== dependencies: - "@remix-run/router" "1.3.1" - react-router "6.8.0" + "@remix-run/router" "1.3.3" + react-router "6.8.2" -react-router@6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.0.tgz#dd61fd1ec44daa2cceaef8e6baa00f99a01a650f" - integrity sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A== +react-router@6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.2.tgz#98f83582a73f316a3287118b440f0cee30ed6f33" + integrity sha512-lF7S0UmXI5Pd8bmHvMdPKI4u4S5McxmHnzJhrYi9ZQ6wE+DA8JN5BzVC5EEBuduWWDaiJ8u6YhVOCmThBli+rw== dependencies: - "@remix-run/router" "1.3.1" + "@remix-run/router" "1.3.3" react-transition-state@^1.1.4: version "1.1.5" @@ -14466,9 +14429,9 @@ read-pkg@^5.2.0: type-fest "^0.6.0" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -14479,9 +14442,9 @@ read-pkg@^5.2.0: util-deprecate "~1.0.1" readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -14533,9 +14496,9 @@ redux-thunk@^2.4.2: integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== redux@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" - integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== + version "4.2.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" @@ -14585,23 +14548,18 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" + integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -14855,36 +14813,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-inject@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" - integrity sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w== - dependencies: - estree-walker "^0.6.1" - magic-string "^0.25.3" - rollup-pluginutils "^2.8.1" - -rollup-plugin-node-polyfills@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz#53092a2744837164d5b8a28812ba5f3ff61109fd" - integrity sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA== - dependencies: - rollup-plugin-inject "^3.0.0" - -rollup-plugin-polyfill-node@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.12.0.tgz#33d421ddb7fcb69c234461e508ca6d2db6193f1d" - integrity sha512-PWEVfDxLEKt8JX1nZ0NkUAgXpkZMTb85rO/Ru9AQ69wYW8VUCfDgP4CGRXXWYni5wDF0vIeR1UoF3Jmw/Lt3Ug== - dependencies: - "@rollup/plugin-inject" "^5.0.1" - -rollup-pluginutils@^2.8.1: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - rollup@^2.79.1: version "2.79.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" @@ -14892,10 +14820,10 @@ rollup@^2.79.1: optionalDependencies: fsevents "~2.3.2" -rpc-websockets@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748" - integrity sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ== +rpc-websockets@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" + integrity sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w== dependencies: "@babel/runtime" "^7.17.2" eventemitter3 "^4.0.7" @@ -15354,9 +15282,9 @@ space-separated-tokens@^1.0.0: integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -15485,17 +15413,17 @@ store2@^2.12.0: integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== storybook-dark-mode@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/storybook-dark-mode/-/storybook-dark-mode-2.0.5.tgz#a15e8a43bf4b60745f73fd362133ba565a3bc61e" - integrity sha512-egOMu2tgGttGAMtFZcDLZobs1xc7LzFOh+pRVqaW59AVp05ABdQ3Hj6IX2Pz7tYGmF9AmaK+nBv0hDFxPe7Hfg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/storybook-dark-mode/-/storybook-dark-mode-2.1.1.tgz#73dcc0a757153cc2fbac1b6be2451950dda63352" + integrity sha512-Ops6u/htODxIUXnAYASttqcbd2PRN723o0uIKpoYQn1+so2g6gYalpAhuysxnRhCG8yHsm6NJuX5drzzI+uFvQ== dependencies: "@storybook/addons" "^6.5.14" "@storybook/api" "^6.5.14" "@storybook/components" "^6.5.14" "@storybook/core-events" "^6.5.14" + "@storybook/global" "^5.0.0" "@storybook/theming" "^6.5.14" fast-deep-equal "^3.1.3" - global "^4.4.0" memoizerific "^1.11.3" stream-browserify@^2.0.1: @@ -15533,6 +15461,16 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-http@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" + integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" @@ -15721,9 +15659,9 @@ style-value-types@5.0.0: tslib "^2.1.0" styled-components@^5.3.5: - version "5.3.6" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.6.tgz#27753c8c27c650bee9358e343fc927966bfd00d1" - integrity sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg== + version "5.3.8" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.8.tgz#b92e2d10352dc9ecf3b1bc5d27c7500832dcf870" + integrity sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/traverse" "^7.4.5" @@ -15816,9 +15754,9 @@ synchronous-promise@^2.0.15: integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== tailwindcss@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" - integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07" + integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== dependencies: arg "^5.0.2" chokidar "^3.5.3" @@ -15834,12 +15772,12 @@ tailwindcss@^3.2.4: normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.18" + postcss "^8.0.9" postcss-import "^14.1.0" postcss-js "^4.0.0" postcss-load-config "^3.1.4" postcss-nested "6.0.0" - postcss-selector-parser "^6.0.10" + postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" quick-lru "^5.1.1" resolve "^1.22.1" @@ -15931,9 +15869,9 @@ terser@^4.1.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.14.1, terser@^5.3.4: - version "5.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.1.tgz#5af3bc3d0f24241c7fb2024199d5c461a1075880" - integrity sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw== + version "5.16.5" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.5.tgz#1c285ca0655f467f92af1bbab46ab72d1cb08e5a" + integrity sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -16194,6 +16132,11 @@ tty-browserify@0.0.0: resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -16279,20 +16222,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.9.5: +typescript@4.9.5, typescript@^4.9.3: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== -typescript@^4.9.3: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - ua-parser-js@^0.7.30: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== + version "0.7.34" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.34.tgz#afb439e2e3e394bdc90080acb661a39c685b67d7" + integrity sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ== uglify-js@^3.1.4: version "3.17.4" @@ -16521,7 +16459,7 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.9: +update-browserslist-db@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== @@ -16635,7 +16573,7 @@ util@^0.11.0: dependencies: inherits "2.0.3" -util@^0.12.4: +util@^0.12.0, util@^0.12.4: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -16682,9 +16620,9 @@ v8-compile-cache@^2.0.3: integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -16748,6 +16686,14 @@ vfile@^4.0.0: unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" +vite-plugin-node-polyfills@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.7.0.tgz#004f400cfae791338c6f0a46d4ddf559c331c899" + integrity sha512-DKBSGDOx3R8pUIsQFRZAWNYp0vIffJOT0NkuByX4WIQq80nJ2eamAph5T9zG91liO1Fyl1lo7/Onh6xoQO52XQ== + dependencies: + "@rollup/plugin-inject" "^5.0.3" + node-stdlib-browser "^1.2.0" + vite-tsconfig-paths@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-3.6.0.tgz#9e6363051b2caaf7c7cec6f9f85ad71feee77920" @@ -16776,14 +16722,14 @@ vm-browserify@^1.0.1: integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== wagmi@^0.11.6: - version "0.11.6" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-0.11.6.tgz#385ebc3e6fa98a5c1f310c2257316119778fd60e" - integrity sha512-0nd9BZ/4shM6XBhUr3MYk+gaVXR8w6II/37FWN9sjgFOANl17m5ogZ8O6S2hkZbIlzPFke1AA/l23hK9pNbW1g== + version "0.11.7" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-0.11.7.tgz#b3224d5ffb63ac530822fea8b7f241fb8ca6f350" + integrity sha512-IiB1TxTVn+xvjju3ZNQfiwfiB6EZj1h3CO7Zt8q0PEDRN76jqniaeOV7QAnfBgtbqmVh2co4Miaz1rRtvVPMTQ== dependencies: "@tanstack/query-sync-storage-persister" "^4.14.5" "@tanstack/react-query" "^4.14.5" "@tanstack/react-query-persist-client" "^4.14.5" - "@wagmi/core" "0.9.6" + "@wagmi/core" "0.9.7" abitype "^0.3.0" use-sync-external-store "^1.2.0" @@ -16929,9 +16875,9 @@ webpack@4: webpack-sources "^1.4.1" "webpack@>=4.43.0 <6.0.0": - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== + version "5.76.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" + integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" @@ -17139,7 +17085,7 @@ ws@7.5.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== -ws@8.12.1, ws@^8.12.0, ws@^8.5.0: +ws@8.12.1, ws@^8.12.0, ws@^8.2.3, ws@^8.5.0: version "8.12.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== @@ -17149,11 +17095,6 @@ ws@^7.4.0, ws@^7.4.5, ws@^7.5.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.2.3: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" - integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== - x-default-browser@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/x-default-browser/-/x-default-browser-0.4.0.tgz#70cf0da85da7c0ab5cb0f15a897f2322a6bdd481" @@ -17319,9 +17260,9 @@ zen-observable@0.8.15: integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== zustand@^4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.3.tgz#c9113499074dde2d6d99c1b5f591e9329572c224" - integrity sha512-x2jXq8S0kfLGNwGh87nhRfEc2eZy37tSatpSoSIN+O6HIaBhgQHSONV/F9VNrNcBcKQu/E80K1DeHDYQC/zCrQ== + version "4.3.6" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.6.tgz#ce7804eb75361af0461a2d0536b65461ec5de86f" + integrity sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw== dependencies: use-sync-external-store "1.2.0" From e28c7c6e96a7cd9d4ff580586a940e5d7196f45c Mon Sep 17 00:00:00 2001 From: Shredder <110225819+EmperorOrokuSaki@users.noreply.github.com> Date: Thu, 9 Mar 2023 23:22:38 +0330 Subject: [PATCH 08/23] test: subgraph matchstick tests for access points and acl refactor (#150) * fix: errors from deprecated entities. * fix: events from deprecated entities. * test: add tests for NewAccessPoint. * chore: remove yarn-error.log and add it to .gitignore. * test: add changeAccessPointCreationStatus tests to subgraph matchstick. * test: add tests for changeAccessPointNameVerify x matchstick * feat: add utility functions for ACL events * test: add tests for tokenRoleChanged event * test: add tests for the CollectionRoleChanged event * feat: add handleTokenRolesCleared handler function - slipped from the ACL refactor pr. * refactor: rename the Token owner consts to user consts. * chore: add .bin to gitignore. --- subgraph/.gitignore | 1 + subgraph/examples/query/.gitignore | 1 + subgraph/src/fleek-nfa.ts | 21 ++ subgraph/subgraph.yaml | 3 + subgraph/tests/matchstick/.latest.json | 4 +- .../CollectionRoleChanged.test.ts | 95 ++++++ .../access-control/TokenRoleChanged.test.ts | 143 ++++++++ .../changeAccessPointCreationStatus.test.ts | 98 ++++++ .../changeAccessPointNameVerify.test.ts | 96 ++++++ .../access-points/newAccessPoint.test.ts | 109 +++++++ subgraph/tests/matchstick/helpers/utils.ts | 306 +++++++++++++++++- subgraph/tests/matchstick/owner.test.ts | 40 +-- subgraph/tests/matchstick/transfer.test.ts | 22 +- 13 files changed, 904 insertions(+), 35 deletions(-) create mode 100644 subgraph/examples/query/.gitignore create mode 100644 subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts create mode 100644 subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts create mode 100644 subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts create mode 100644 subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts create mode 100644 subgraph/tests/matchstick/access-points/newAccessPoint.test.ts diff --git a/subgraph/.gitignore b/subgraph/.gitignore index 1355f6b1..5b478a02 100644 --- a/subgraph/.gitignore +++ b/subgraph/.gitignore @@ -3,3 +3,4 @@ build generated abis examples/query/.graphclient +tests/matchstick/.bin \ No newline at end of file diff --git a/subgraph/examples/query/.gitignore b/subgraph/examples/query/.gitignore new file mode 100644 index 00000000..b0f6b7a2 --- /dev/null +++ b/subgraph/examples/query/.gitignore @@ -0,0 +1 @@ +yarn-error.log \ No newline at end of file diff --git a/subgraph/src/fleek-nfa.ts b/subgraph/src/fleek-nfa.ts index 19b84d1a..f5263d74 100644 --- a/subgraph/src/fleek-nfa.ts +++ b/subgraph/src/fleek-nfa.ts @@ -25,6 +25,7 @@ import { NewAccessPoint as NewAccessPointEvent, ChangeAccessPointNameVerify as ChangeAccessPointNameVerifyEvent, ChangeAccessPointContentVerify as ChangeAccessPointContentVerifyEvent, + TokenRolesCleared as TokenRolesClearedEvent } from '../generated/FleekNFA/FleekNFA'; // Entity Imports [based on the schema] @@ -32,6 +33,7 @@ import { AccessPoint, Approval, ApprovalForAll, + Controller, Owner, GitRepository as GitRepositoryEntity, MetadataUpdate, @@ -285,6 +287,24 @@ export function handleInitialized(event: InitializedEvent): void { } } +export function handleTokenRolesCleared(event: TokenRolesClearedEvent): void { + let tokenId = event.params.tokenId; + let byAddress = event.params.byAddress; + + // load token + let token = Token.load(Bytes.fromByteArray(Bytes.fromBigInt(tokenId))); + if (!token) { + log.error('Token not found. TokenId: {}', [tokenId.toString()]); + return; + } + + // get the list of controllers. + let token_controllers = token.controllers; + token_controllers = []; + token.controllers = token_controllers; + token.save(); +} + export function handleCollectionRoleChanged( event: CollectionRoleChangedEvent ): void { @@ -358,6 +378,7 @@ export function handleTokenRoleChanged(event: TokenRoleChangedEvent): void { } } token.controllers = token_controllers; + token.save(); } else { log.error('Role not supported. Role: {}, byAddress: {}, toAddress: {}', [ role.toString(), diff --git a/subgraph/subgraph.yaml b/subgraph/subgraph.yaml index 18753d46..27b3d768 100644 --- a/subgraph/subgraph.yaml +++ b/subgraph/subgraph.yaml @@ -38,6 +38,7 @@ dataSources: handler: handleApproval - event: ApprovalForAll(indexed address,indexed address,bool) handler: handleApprovalForAll + # Token Events - event: MetadataUpdate(indexed uint256,string,string,indexed address) handler: handleMetadataUpdateWithStringValue - event: MetadataUpdate(indexed uint256,string,string[2],indexed address) @@ -50,6 +51,7 @@ dataSources: handler: handleNewMint - event: Transfer(indexed address,indexed address,indexed uint256) handler: handleTransfer + # Access Control Events - event: TokenRoleChanged(indexed uint256,indexed uint8,indexed address,bool,address) handler: handleTokenRoleChanged - event: TokenRolesCleared(indexed uint256,address) @@ -58,6 +60,7 @@ dataSources: handler: handleCollectionRoleChanged - event: Initialized(uint8) handler: handleInitialized + # Access Point Events - event: ChangeAccessPointContentVerify(string,uint256,indexed bool,indexed address) handler: handleChangeAccessPointContentVerify - event: ChangeAccessPointNameVerify(string,uint256,indexed bool,indexed address) diff --git a/subgraph/tests/matchstick/.latest.json b/subgraph/tests/matchstick/.latest.json index 89732914..2949e777 100644 --- a/subgraph/tests/matchstick/.latest.json +++ b/subgraph/tests/matchstick/.latest.json @@ -1,4 +1,4 @@ { "version": "0.5.4", - "timestamp": 1677510060006 -} + "timestamp": 1678390993500 +} \ No newline at end of file diff --git a/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts b/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts new file mode 100644 index 00000000..e35f90b2 --- /dev/null +++ b/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts @@ -0,0 +1,95 @@ +import { + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, +} from 'matchstick-as/assembly/index'; +import { BigInt, Bytes } from '@graphprotocol/graph-ts'; +import { createNewCollectionRoleChanged, handleCollectionRoleChangedList, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; +import { CollectionRoleChanged } from '../../../generated/FleekNFA/FleekNFA'; + +describe('Collection Role Changed tests', () => { + beforeAll(() => { + // Collection Role Changed + let collectionRoleChangedList: CollectionRoleChanged[] = []; + + collectionRoleChangedList.push( + createNewCollectionRoleChanged(0, 0, USER_ONE, true, USER_TWO) // User Two grants collection owner access to User One + ); + + collectionRoleChangedList.push( + createNewCollectionRoleChanged(2, 0, USER_ONE, false, USER_TWO) // User Two revokes the owner access of User One to the collection + ); + + + handleCollectionRoleChangedList(collectionRoleChangedList); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the `role` field of each CollectionRoleChanged event entity', () => { + assert.fieldEquals( + 'CollectionRoleChanged', + makeEventId(0), + 'role', + '0' + ); + assert.fieldEquals( + 'CollectionRoleChanged', + makeEventId(2), + 'role', + '0' + ); + }); + + test('Check the `toAddress` field of each CollectionRoleChanged event entity', () => { + assert.fieldEquals( + 'CollectionRoleChanged', + makeEventId(0), + 'toAddress', + USER_ONE.toString() + ); + assert.fieldEquals( + 'CollectionRoleChanged', + makeEventId(2), + 'toAddress', + USER_ONE.toString() + ); + }); + + test('Check the `byAddress` field of each CollectionRoleChanged event entity', () => { + assert.fieldEquals( + 'CollectionRoleChanged', + makeEventId(0), + 'byAddress', + USER_TWO.toString() + ); + assert.fieldEquals( + 'CollectionRoleChanged', + makeEventId(2), + 'byAddress', + USER_TWO.toString() + ); + }); + + test('Check the `status` field of each CollectionRoleChanged event entity', () => { + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(0), + 'status', + 'true' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(2), + 'status', + 'false' + ); + }); + }); +}); \ No newline at end of file diff --git a/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts b/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts new file mode 100644 index 00000000..f3842c5d --- /dev/null +++ b/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts @@ -0,0 +1,143 @@ +import { + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, +} from 'matchstick-as/assembly/index'; +import { BigInt, Bytes } from '@graphprotocol/graph-ts'; +import { createNewTokenRoleChanged, handleTokenRoleChangedList, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; +import { TokenRoleChanged } from '../../../generated/FleekNFA/FleekNFA'; + +describe('Token Role Changed tests', () => { + beforeAll(() => { + // Token Role Changed + let tokenRoleChangedList: TokenRoleChanged[] = []; + + tokenRoleChangedList.push( + createNewTokenRoleChanged(0, BigInt.fromI32(0), 0, USER_ONE, true, USER_TWO) // User Two gives User One controller access to TokenId 0 + ); + + tokenRoleChangedList.push( + createNewTokenRoleChanged(1, BigInt.fromI32(1), 0, USER_TWO, true, USER_ONE) // User One gives User Two controller access to TokenId 1 + ); + + tokenRoleChangedList.push( + createNewTokenRoleChanged(2, BigInt.fromI32(0), 0, USER_ONE, false, USER_TWO) // User Two revokes the controller access of User One to tokenId 0 + ); + + + handleTokenRoleChangedList(tokenRoleChangedList); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the `tokenId` field of each TokenRoleChanged event entity', () => { + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(0), + 'tokenId', + '0' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(1), + 'tokenId', + '1' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(2), + 'tokenId', + '0' + ); + }); + test('Check the `role` field of each TokenRoleChanged event entity', () => { + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(0), + 'role', + '0' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(1), + 'role', + '0' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(2), + 'role', + '0' + ); + }); + + test('Check the `toAddress` field of each TokenRoleChanged event entity', () => { + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(0), + 'toAddress', + USER_ONE.toString() + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(1), + 'toAddress', + USER_TWO.toString() + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(2), + 'toAddress', + USER_ONE.toString() + ); + }); + + test('Check the `byAddress` field of each TokenRoleChanged event entity', () => { + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(0), + 'byAddress', + USER_TWO.toString() + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(1), + 'byAddress', + USER_ONE.toString() + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(2), + 'byAddress', + USER_TWO.toString() + ); + }); + + test('Check the `status` field of each TokenRoleChanged event entity', () => { + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(0), + 'status', + 'true' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(1), + 'status', + 'true' + ); + assert.fieldEquals( + 'TokenRoleChanged', + makeEventId(2), + 'status', + 'false' + ); + }); + }); +}); \ No newline at end of file diff --git a/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts b/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts new file mode 100644 index 00000000..c0afcc4f --- /dev/null +++ b/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts @@ -0,0 +1,98 @@ +import { + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, + } from 'matchstick-as/assembly/index'; + import { BigInt, Bytes } from '@graphprotocol/graph-ts'; +import { createNewAccessPointEvent, createNewChangeAccessPointCreationStatus, handleChangeAccessPointCreationStatusList, handleNewAccessPoints, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; +import { ChangeAccessPointCreationStatus, NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; + +describe('Change Access Point Creation Status tests', () => { + beforeAll(() => { + // New Access Points + let newAccessPoints: NewAccessPoint[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + newAccessPoints.push( + createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + ); + newAccessPoints.push( + createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + ); + + // User Two has one access point for tokenId 0 + newAccessPoints.push( + createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + ); + handleNewAccessPoints(newAccessPoints); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the `creationStatus` field of each access point entity', () => { + assert.fieldEquals( + 'AccessPoint', + 'firstAP', + 'creationStatus', + 'DRAFT' + ); + assert.fieldEquals( + 'AccessPoint', + 'secondAP', + 'creationStatus', + 'DRAFT' + ); + assert.fieldEquals( + 'AccessPoint', + 'thirdAP', + 'creationStatus', + 'DRAFT' + ); + }); + + test('Check the `creationStatus` field of each access point entity after changing it', () => { + // New Access Points + let changeAccessPointCreationStatusList: ChangeAccessPointCreationStatus[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + changeAccessPointCreationStatusList.push( + createNewChangeAccessPointCreationStatus(0, 'firstAP', BigInt.fromI32(0), 1, USER_ONE) + ); + changeAccessPointCreationStatusList.push( + createNewChangeAccessPointCreationStatus(0, 'secondAP', BigInt.fromI32(1), 1, USER_ONE) + ); + + // User Two has one access point for tokenId 0 + changeAccessPointCreationStatusList.push( + createNewChangeAccessPointCreationStatus(0, 'thirdAP', BigInt.fromI32(0), 1, USER_TWO) + ); + + handleChangeAccessPointCreationStatusList(changeAccessPointCreationStatusList); + + assert.fieldEquals( + 'AccessPoint', + 'firstAP', + 'creationStatus', + 'APPROVED' + ); + assert.fieldEquals( + 'AccessPoint', + 'secondAP', + 'creationStatus', + 'APPROVED' + ); + assert.fieldEquals( + 'AccessPoint', + 'thirdAP', + 'creationStatus', + 'APPROVED' + ); + }); + }); +}); \ No newline at end of file diff --git a/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts b/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts new file mode 100644 index 00000000..d509fe36 --- /dev/null +++ b/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts @@ -0,0 +1,96 @@ +import { + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, + } from 'matchstick-as/assembly/index'; + import { BigInt } from '@graphprotocol/graph-ts'; +import { createNewAccessPointEvent, createNewChangeAccessPointNameVerify, handleChangeAccessPointNameVerifies, handleNewAccessPoints, USER_ONE, USER_TWO } from '../helpers/utils'; +import { ChangeAccessPointNameVerify, NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; + +describe('Change Access Point Name Verify tests', () => { + beforeAll(() => { + // New Access Points + let newAccessPoints: NewAccessPoint[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + newAccessPoints.push( + createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + ); + newAccessPoints.push( + createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + ); + + // User Two has one access point for tokenId 0 + newAccessPoints.push( + createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + ); + handleNewAccessPoints(newAccessPoints); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the `nameVerified` field of each access point entity', () => { + assert.fieldEquals( + 'AccessPoint', + 'firstAP', + 'nameVerified', + 'false' + ); + assert.fieldEquals( + 'AccessPoint', + 'secondAP', + 'nameVerified', + 'false' + ); + assert.fieldEquals( + 'AccessPoint', + 'thirdAP', + 'nameVerified', + 'false' + ); + }); + + test('Check the `nameVerified` field of each access point entity after changing it', () => { + // New Access Point Name Verified fields + let changeAccessPointNameVerifies: ChangeAccessPointNameVerify[] = []; + + changeAccessPointNameVerifies.push( + createNewChangeAccessPointNameVerify(0, 'firstAP', BigInt.fromI32(0), true, USER_ONE) + ); + changeAccessPointNameVerifies.push( + createNewChangeAccessPointNameVerify(0, 'secondAP', BigInt.fromI32(1), true, USER_ONE) + ); + + changeAccessPointNameVerifies.push( + createNewChangeAccessPointNameVerify(0, 'thirdAP', BigInt.fromI32(0), true, USER_TWO) + ); + + handleChangeAccessPointNameVerifies(changeAccessPointNameVerifies); + + assert.fieldEquals( + 'AccessPoint', + 'firstAP', + 'nameVerified', + 'true' + ); + assert.fieldEquals( + 'AccessPoint', + 'secondAP', + 'nameVerified', + 'true' + ); + assert.fieldEquals( + 'AccessPoint', + 'thirdAP', + 'nameVerified', + 'true' + ); + }); + }); +}); \ No newline at end of file diff --git a/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts b/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts new file mode 100644 index 00000000..1562e9b9 --- /dev/null +++ b/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts @@ -0,0 +1,109 @@ +import { + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, + } from 'matchstick-as/assembly/index'; + import { BigInt, Bytes } from '@graphprotocol/graph-ts'; +import { createNewAccessPointEvent, handleNewAccessPoints, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; +import { NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; + +describe('New Access Point tests', () => { + beforeAll(() => { + // New Access Points + let newAccessPoints: NewAccessPoint[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + newAccessPoints.push( + createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + ); + newAccessPoints.push( + createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + ); + + // User Two has one access point for tokenId 0 + newAccessPoints.push( + createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + ); + handleNewAccessPoints(newAccessPoints); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the number of `NewAccessPoint` events to be valid', () => { + assert.entityCount('NewAccessPoint', 3); + }); + + test('Check the `apName` field of each event', () => { + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(0), + 'apName', + 'firstAP'.toString() + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(1), + 'apName', + 'secondAP'.toString() + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(2), + 'apName', + 'thirdAP'.toString() + ); + }); + + test('Check the `tokenId` field of each event', () => { + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(0), + 'tokenId', + '0' + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(1), + 'tokenId', + '1' + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(2), + 'tokenId', + '0' + ); + }); + + test('Check the `owner` field of each event', () => { + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(0), + 'owner', + USER_ONE.toString() + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(1), + 'owner', + USER_ONE.toString() + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(2), + 'owner', + USER_TWO.toString() + ); + }); + + test('check the existence of a nonexistent event in the database', () => { + assert.notInStore('NewAccessPoint', makeEventId(3)); + }); + }); +}); \ No newline at end of file diff --git a/subgraph/tests/matchstick/helpers/utils.ts b/subgraph/tests/matchstick/helpers/utils.ts index 208e45a7..58eae791 100644 --- a/subgraph/tests/matchstick/helpers/utils.ts +++ b/subgraph/tests/matchstick/helpers/utils.ts @@ -5,12 +5,24 @@ import { ApprovalForAll as ApprovalForAllEvent, Transfer as TransferEvent, NewMint as NewMintEvent, + NewAccessPoint, + ChangeAccessPointCreationStatus, + ChangeAccessPointNameVerify, + TokenRoleChanged, + CollectionRoleChanged, + TokenRolesCleared } from '../../../generated/FleekNFA/FleekNFA'; import { handleApproval, handleApprovalForAll, + handleChangeAccessPointCreationStatus, + handleChangeAccessPointNameVerify, + handleNewAccessPoint, handleNewMint, handleTransfer, + handleTokenRoleChanged, + handleCollectionRoleChanged, + handleTokenRolesCleared, } from '../../../src/fleek-nfa'; export function createApprovalEvent( @@ -161,16 +173,270 @@ export function createNewMintEvent( return newMintEvent; } +export function createNewAccessPointEvent( + event_count: i32, + apName: string, + tokenId: BigInt, + owner: Address +): NewAccessPoint { + let newAccessPoint = changetype(newMockEvent()); + + newAccessPoint.parameters = new Array(); + + newAccessPoint.parameters.push( + new ethereum.EventParam( + 'apName', + ethereum.Value.fromString(apName.toString()) + ) + ); + + newAccessPoint.parameters.push( + new ethereum.EventParam( + 'tokenId', + ethereum.Value.fromUnsignedBigInt(tokenId) + ) + ); + + newAccessPoint.parameters.push( + new ethereum.EventParam( + 'owner', + ethereum.Value.fromAddress(owner) + ) + ); + + newAccessPoint.transaction.hash = Bytes.fromI32(event_count); + newAccessPoint.logIndex = new BigInt(event_count); + + return newAccessPoint; +} + +export function createNewChangeAccessPointCreationStatus( + event_count: i32, + apName: string, + tokenId: BigInt, + status: i32, + triggeredBy: Address +): ChangeAccessPointCreationStatus { + let changeAccessPointCreationStatus = changetype(newMockEvent()); + + changeAccessPointCreationStatus.parameters = new Array(); + + changeAccessPointCreationStatus.parameters.push( + new ethereum.EventParam( + 'apName', + ethereum.Value.fromString(apName.toString()) + ) + ); + + changeAccessPointCreationStatus.parameters.push( + new ethereum.EventParam( + 'tokenId', + ethereum.Value.fromUnsignedBigInt(tokenId) + ) + ); + + changeAccessPointCreationStatus.parameters.push( + new ethereum.EventParam( + 'creationStatus', + ethereum.Value.fromI32(status) + ) + ); + + changeAccessPointCreationStatus.parameters.push( + new ethereum.EventParam( + 'triggeredBy', + ethereum.Value.fromAddress(triggeredBy) + ) + ); + + changeAccessPointCreationStatus.transaction.hash = Bytes.fromI32(event_count); + changeAccessPointCreationStatus.logIndex = new BigInt(event_count); + + return changeAccessPointCreationStatus; +} + +export function createNewChangeAccessPointNameVerify( + event_count: i32, + apName: string, + tokenId: BigInt, + verified: boolean, + triggeredBy: Address +): ChangeAccessPointNameVerify { + let changeAccessPointNameVerify = changetype(newMockEvent()); + + changeAccessPointNameVerify.parameters = new Array(); + + changeAccessPointNameVerify.parameters.push( + new ethereum.EventParam( + 'apName', + ethereum.Value.fromString(apName.toString()) + ) + ); + + changeAccessPointNameVerify.parameters.push( + new ethereum.EventParam( + 'tokenId', + ethereum.Value.fromUnsignedBigInt(tokenId) + ) + ); + + changeAccessPointNameVerify.parameters.push( + new ethereum.EventParam( + 'verified', + ethereum.Value.fromBoolean(verified) + ) + ); + + changeAccessPointNameVerify.parameters.push( + new ethereum.EventParam( + 'triggeredBy', + ethereum.Value.fromAddress(triggeredBy) + ) + ); + + changeAccessPointNameVerify.transaction.hash = Bytes.fromI32(event_count); + changeAccessPointNameVerify.logIndex = new BigInt(event_count); + + return changeAccessPointNameVerify; +} + +export function createNewTokenRoleChanged( + event_count: i32, + tokenId: BigInt, + role: i32, + toAddress: Address, + status: boolean, + byAddress: Address +): TokenRoleChanged { + let tokenRoleChanged = changetype(newMockEvent()); + + tokenRoleChanged.parameters = new Array(); + + tokenRoleChanged.parameters.push( + new ethereum.EventParam( + 'tokenId', + ethereum.Value.fromUnsignedBigInt(tokenId) + ) + ); + + tokenRoleChanged.parameters.push( + new ethereum.EventParam( + 'role', + ethereum.Value.fromI32(role) + ) + ); + + tokenRoleChanged.parameters.push( + new ethereum.EventParam( + 'toAddress', + ethereum.Value.fromAddress(toAddress) + ) + ); + + tokenRoleChanged.parameters.push( + new ethereum.EventParam( + 'status', + ethereum.Value.fromBoolean(status) + ) + ); + + tokenRoleChanged.parameters.push( + new ethereum.EventParam( + 'byAddress', + ethereum.Value.fromAddress(byAddress) + ) + ); + + tokenRoleChanged.transaction.hash = Bytes.fromI32(event_count); + tokenRoleChanged.logIndex = new BigInt(event_count); + + return tokenRoleChanged; +} + +export function createNewCollectionRoleChanged( + event_count: i32, + role: i32, + toAddress: Address, + status: boolean, + byAddress: Address +): CollectionRoleChanged { + let collectionRoleChanged = changetype(newMockEvent()); + + collectionRoleChanged.parameters = new Array(); + + collectionRoleChanged.parameters.push( + new ethereum.EventParam( + 'role', + ethereum.Value.fromI32(role) + ) + ); + + collectionRoleChanged.parameters.push( + new ethereum.EventParam( + 'toAddress', + ethereum.Value.fromAddress(toAddress) + ) + ); + + collectionRoleChanged.parameters.push( + new ethereum.EventParam( + 'status', + ethereum.Value.fromBoolean(status) + ) + ); + + collectionRoleChanged.parameters.push( + new ethereum.EventParam( + 'byAddress', + ethereum.Value.fromAddress(byAddress) + ) + ); + + collectionRoleChanged.transaction.hash = Bytes.fromI32(event_count); + collectionRoleChanged.logIndex = new BigInt(event_count); + + return collectionRoleChanged; +} + +export function createNewTokenRolesCleared( + event_count: i32, + tokenId: BigInt, + byAddress: Address +): TokenRolesCleared { + let tokenRolesCleared = changetype(newMockEvent()); + + tokenRolesCleared.parameters = new Array(); + + tokenRolesCleared.parameters.push( + new ethereum.EventParam( + 'tokenId', + ethereum.Value.fromUnsignedBigInt(tokenId) + ) + ); + + tokenRolesCleared.parameters.push( + new ethereum.EventParam( + 'byAddress', + ethereum.Value.fromAddress(byAddress) + ) + ); + + tokenRolesCleared.transaction.hash = Bytes.fromI32(event_count); + tokenRolesCleared.logIndex = new BigInt(event_count); + + return tokenRolesCleared; +} + export const CONTRACT: Address = Address.fromString( '0x0000000000000000000000000000000000000000' ); export const CONTRACT_OWNER: Address = Address.fromString( '0x1000000000000000000000000000000000000001' ); -export const TOKEN_OWNER_ONE: Address = Address.fromString( +export const USER_ONE: Address = Address.fromString( '0x2000000000000000000000000000000000000002' ); -export const TOKEN_OWNER_TWO: Address = Address.fromString( +export const USER_TWO: Address = Address.fromString( '0x3000000000000000000000000000000000000003' ); @@ -198,6 +464,42 @@ export function handleApprovalForAlls(events: ApprovalForAllEvent[]): void { }); } +export function handleNewAccessPoints(events: NewAccessPoint[]): void { + events.forEach((event) => { + handleNewAccessPoint(event); + }); +} + +export function handleChangeAccessPointCreationStatusList(events: ChangeAccessPointCreationStatus[]): void { + events.forEach((event) => { + handleChangeAccessPointCreationStatus(event); + }); +} + +export function handleChangeAccessPointNameVerifies(events: ChangeAccessPointNameVerify[]): void { + events.forEach((event) => { + handleChangeAccessPointNameVerify(event); + }); +} + +export function handleTokenRoleChangedList(events: TokenRoleChanged[]): void { + events.forEach((event) => { + handleTokenRoleChanged(event); + }); +} + +export function handleCollectionRoleChangedList(events: CollectionRoleChanged[]): void { + events.forEach((event) => { + handleCollectionRoleChanged(event); + }); +} + +export function handleTokenRolesClearedList(events: TokenRolesCleared[]): void { + events.forEach((event) => { + handleTokenRolesCleared(event); + }); +} + export function makeEventId(id: i32): string { return Bytes.fromI32(id).toHexString() + '00000000'; } diff --git a/subgraph/tests/matchstick/owner.test.ts b/subgraph/tests/matchstick/owner.test.ts index a790f325..6303a542 100644 --- a/subgraph/tests/matchstick/owner.test.ts +++ b/subgraph/tests/matchstick/owner.test.ts @@ -16,8 +16,8 @@ import { handleNewMints, handleTransfers, makeEventId, - TOKEN_OWNER_ONE, - TOKEN_OWNER_TWO, + USER_ONE, + USER_TWO, } from './helpers/utils'; import { NewMint, Transfer } from '../../generated/FleekNFA/FleekNFA'; @@ -25,42 +25,42 @@ describe('Owner tests', () => { beforeAll(() => { // NEW MINTS let newMints: NewMint[] = []; - newMints.push(createNewMintEvent(0, TOKEN_OWNER_ONE, BigInt.fromI32(0))); - newMints.push(createNewMintEvent(1, TOKEN_OWNER_TWO, BigInt.fromI32(1))); - newMints.push(createNewMintEvent(2, TOKEN_OWNER_ONE, BigInt.fromI32(2))); - newMints.push(createNewMintEvent(3, TOKEN_OWNER_ONE, BigInt.fromI32(3))); - newMints.push(createNewMintEvent(4, TOKEN_OWNER_TWO, BigInt.fromI32(4))); + newMints.push(createNewMintEvent(0, USER_ONE, BigInt.fromI32(0))); + newMints.push(createNewMintEvent(1, USER_TWO, BigInt.fromI32(1))); + newMints.push(createNewMintEvent(2, USER_ONE, BigInt.fromI32(2))); + newMints.push(createNewMintEvent(3, USER_ONE, BigInt.fromI32(3))); + newMints.push(createNewMintEvent(4, USER_TWO, BigInt.fromI32(4))); handleNewMints(newMints); // TRANSFERS let transfers: Transfer[] = []; transfers.push( - createTransferEvent(0, CONTRACT, TOKEN_OWNER_ONE, BigInt.fromI32(0)) + createTransferEvent(0, CONTRACT, USER_ONE, BigInt.fromI32(0)) ); transfers.push( - createTransferEvent(1, CONTRACT, TOKEN_OWNER_TWO, BigInt.fromI32(1)) + createTransferEvent(1, CONTRACT, USER_TWO, BigInt.fromI32(1)) ); transfers.push( - createTransferEvent(2, CONTRACT, TOKEN_OWNER_ONE, BigInt.fromI32(2)) + createTransferEvent(2, CONTRACT, USER_ONE, BigInt.fromI32(2)) ); transfers.push( - createTransferEvent(3, CONTRACT, TOKEN_OWNER_ONE, BigInt.fromI32(3)) + createTransferEvent(3, CONTRACT, USER_ONE, BigInt.fromI32(3)) ); transfers.push( createTransferEvent( 4, - TOKEN_OWNER_TWO, - TOKEN_OWNER_ONE, + USER_TWO, + USER_ONE, BigInt.fromI32(1) ) ); transfers.push( - createTransferEvent(5, CONTRACT, TOKEN_OWNER_TWO, BigInt.fromI32(4)) + createTransferEvent(5, CONTRACT, USER_TWO, BigInt.fromI32(4)) ); transfers.push( createTransferEvent( 6, - TOKEN_OWNER_ONE, - TOKEN_OWNER_TWO, + USER_ONE, + USER_TWO, BigInt.fromI32(0) ) ); @@ -129,15 +129,15 @@ describe('Owner tests', () => { test('Check the existence of owners in store', () => { assert.fieldEquals( 'Owner', - TOKEN_OWNER_ONE.toHexString(), + USER_ONE.toHexString(), 'id', - TOKEN_OWNER_ONE.toHexString() + USER_ONE.toHexString() ); assert.fieldEquals( 'Owner', - TOKEN_OWNER_TWO.toHexString(), + USER_TWO.toHexString(), 'id', - TOKEN_OWNER_TWO.toHexString() + USER_TWO.toHexString() ); }); }); diff --git a/subgraph/tests/matchstick/transfer.test.ts b/subgraph/tests/matchstick/transfer.test.ts index a658a567..cf2ee948 100644 --- a/subgraph/tests/matchstick/transfer.test.ts +++ b/subgraph/tests/matchstick/transfer.test.ts @@ -14,8 +14,8 @@ import { createTransferEvent, handleTransfers, makeEventId, - TOKEN_OWNER_ONE, - TOKEN_OWNER_TWO, + USER_ONE, + USER_TWO, } from './helpers/utils'; import { Transfer } from '../../generated/FleekNFA/FleekNFA'; @@ -24,33 +24,33 @@ describe('Transfer tests', () => { // TRANSFERS let transfers: Transfer[] = []; transfers.push( - createTransferEvent(0, CONTRACT, TOKEN_OWNER_ONE, BigInt.fromI32(0)) + createTransferEvent(0, CONTRACT, USER_ONE, BigInt.fromI32(0)) ); transfers.push( - createTransferEvent(1, CONTRACT, TOKEN_OWNER_TWO, BigInt.fromI32(1)) + createTransferEvent(1, CONTRACT, USER_TWO, BigInt.fromI32(1)) ); transfers.push( - createTransferEvent(2, CONTRACT, TOKEN_OWNER_ONE, BigInt.fromI32(2)) + createTransferEvent(2, CONTRACT, USER_ONE, BigInt.fromI32(2)) ); transfers.push( - createTransferEvent(3, CONTRACT, TOKEN_OWNER_ONE, BigInt.fromI32(3)) + createTransferEvent(3, CONTRACT, USER_ONE, BigInt.fromI32(3)) ); transfers.push( createTransferEvent( 4, - TOKEN_OWNER_TWO, - TOKEN_OWNER_ONE, + USER_TWO, + USER_ONE, BigInt.fromI32(1) ) ); transfers.push( - createTransferEvent(5, CONTRACT, TOKEN_OWNER_TWO, BigInt.fromI32(4)) + createTransferEvent(5, CONTRACT, USER_TWO, BigInt.fromI32(4)) ); transfers.push( createTransferEvent( 6, - TOKEN_OWNER_ONE, - TOKEN_OWNER_TWO, + USER_ONE, + USER_TWO, BigInt.fromI32(0) ) ); From 13a9a1e992315e9aaee7f0431d15389a6794ec7c Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Fri, 10 Mar 2023 09:04:30 -0500 Subject: [PATCH 09/23] feat: UI toast component (#160) * chore: install radix toast * feat: add toast component * chore: display toast column * chore: remove commented lines * chore: fix animation --- ui/package.json | 1 + ui/src/app.tsx | 2 + ui/src/components/core/button/icon-button.tsx | 2 +- ui/src/components/core/icon/custom/error.tsx | 15 +++ ui/src/components/core/icon/icon-library.tsx | 6 ++ ui/src/components/index.ts | 1 + ui/src/components/toast/index.ts | 1 + ui/src/components/toast/toast.styles.tsx | 101 ++++++++++++++++++ ui/src/components/toast/toast.tsx | 73 +++++++++++++ ui/src/store/features/index.ts | 3 +- ui/src/store/features/toasts/index.ts | 1 + ui/src/store/features/toasts/toasts-slice.ts | 46 ++++++++ ui/src/store/store.ts | 4 +- ui/src/theme/index.ts | 1 + ui/src/theme/key-frames.ts | 22 ++++ ui/src/utils/index.ts | 1 + ui/src/utils/toast.ts | 10 ++ .../views/components-test/combobox-test.tsx | 50 +++++++++ .../views/components-test/components-test.tsx | 50 ++------- ui/src/views/components-test/toast-test.tsx | 24 +++++ ui/yarn.lock | 98 +++++++++++++++++ 21 files changed, 465 insertions(+), 47 deletions(-) create mode 100644 ui/src/components/core/icon/custom/error.tsx create mode 100644 ui/src/components/toast/index.ts create mode 100644 ui/src/components/toast/toast.styles.tsx create mode 100644 ui/src/components/toast/toast.tsx create mode 100644 ui/src/store/features/toasts/index.ts create mode 100644 ui/src/store/features/toasts/toasts-slice.ts create mode 100644 ui/src/theme/key-frames.ts create mode 100644 ui/src/utils/toast.ts create mode 100644 ui/src/views/components-test/combobox-test.tsx create mode 100644 ui/src/views/components-test/toast-test.tsx diff --git a/ui/package.json b/ui/package.json index cfc67333..026c80b7 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,6 +21,7 @@ "@headlessui/react": "^1.7.8", "@radix-ui/colors": "^0.1.8", "@radix-ui/react-avatar": "^1.0.1", + "@radix-ui/react-toast": "^1.1.2", "@react-icons/all-files": "^4.1.0", "@reduxjs/toolkit": "^1.9.1", "@stitches/react": "^1.2.8", diff --git a/ui/src/app.tsx b/ui/src/app.tsx index c956c370..a4062260 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -4,6 +4,7 @@ import { ComponentsTest, Home, Mint } from './views'; import { SVGTestScreen } from './views/svg-test'; // TODO: remove when done import { ConnectKitButton } from 'connectkit'; import { MintTest } from './views/mint-test'; +import { ToastProvider } from './components'; import { CreateAP } from './views/access-point'; export const App = () => { @@ -14,6 +15,7 @@ export const App = () => { {/* TODO remove after adding NavBar */} + } /> diff --git a/ui/src/components/core/button/icon-button.tsx b/ui/src/components/core/button/icon-button.tsx index cbb6c082..3061d9a9 100644 --- a/ui/src/components/core/button/icon-button.tsx +++ b/ui/src/components/core/button/icon-button.tsx @@ -29,7 +29,7 @@ export interface IconButtonProps extends BaseButtonProps { 'aria-label': string; } -export const IconButton = forwardRef( +export const IconButton = forwardRef( function IconButton(props, ref) { const { icon, diff --git a/ui/src/components/core/icon/custom/error.tsx b/ui/src/components/core/icon/custom/error.tsx new file mode 100644 index 00000000..c82a3586 --- /dev/null +++ b/ui/src/components/core/icon/custom/error.tsx @@ -0,0 +1,15 @@ +import { IconStyles as IS } from '../icon.styles'; + +export const ErrorIcon: React.FC = (props) => ( + + + +); diff --git a/ui/src/components/core/icon/icon-library.tsx b/ui/src/components/core/icon/icon-library.tsx index d4a39fe5..8ad03c77 100644 --- a/ui/src/components/core/icon/icon-library.tsx +++ b/ui/src/components/core/icon/icon-library.tsx @@ -8,18 +8,24 @@ import { IoCloudUploadSharp } from '@react-icons/all-files/io5/IoCloudUploadShar import { MetamaskIcon, EthereumIcon } from './custom'; import { IoCheckmarkCircleSharp } from '@react-icons/all-files/io5/IoCheckmarkCircleSharp'; import { AiOutlineTwitter } from '@react-icons/all-files/ai/AiOutlineTwitter'; +import { ErrorIcon } from './custom/error'; +import { IoClose } from '@react-icons/all-files/io5/IoClose'; +import { AiFillCheckCircle } from '@react-icons/all-files/ai/AiFillCheckCircle'; export const IconLibrary = Object.freeze({ back: IoArrowBackCircleSharp, check: AiOutlineCheck, 'check-circle': IoCheckmarkCircleSharp, 'chevron-down': AiOutlineDown, + close: IoClose, + error: ErrorIcon, ethereum: EthereumIcon, github: IoLogoGithub, info: IoInformationCircleSharp, upload: IoCloudUploadSharp, metamask: MetamaskIcon, //remove if not used search: BiSearch, + success: AiFillCheckCircle, twitter: AiOutlineTwitter, }); diff --git a/ui/src/components/index.ts b/ui/src/components/index.ts index 5d821dcd..c01aa91d 100644 --- a/ui/src/components/index.ts +++ b/ui/src/components/index.ts @@ -3,3 +3,4 @@ export * from './layout'; export * from './form'; export * from './card'; export * from './spinner'; +export * from './toast'; diff --git a/ui/src/components/toast/index.ts b/ui/src/components/toast/index.ts new file mode 100644 index 00000000..ddce0502 --- /dev/null +++ b/ui/src/components/toast/index.ts @@ -0,0 +1 @@ +export * from './toast'; diff --git a/ui/src/components/toast/toast.styles.tsx b/ui/src/components/toast/toast.styles.tsx new file mode 100644 index 00000000..f4d11e53 --- /dev/null +++ b/ui/src/components/toast/toast.styles.tsx @@ -0,0 +1,101 @@ +import { dripStitches } from '@/theme'; +import * as ToastLib from '@radix-ui/react-toast'; +import { Icon, IconButton } from '../core'; +import { Flex } from '../layout'; + +const { styled, keyframes } = dripStitches; + +export abstract class ToastStyles { + static readonly Provider = ToastLib.Provider; + + static readonly DismissTimeout = 200; + + static readonly ViewportPadding = '$md'; + + static readonly KeyFrames = { + hide: keyframes({ + '0%': { opacity: 1 }, + '100%': { opacity: 0 }, + }), + show: keyframes({ + '0%': { opacity: 0 }, + '100%': { opacity: 1 }, + }), + }; + + static readonly Root = styled(ToastLib.Root, { + padding: '$4 $5', + borderRadius: '$lg', + borderWidth: '$default', + maxWidth: '$128', + + variants: { + variant: { + error: { + backgroundColor: '$red3', + borderColor: '$red6', + color: '$red11', + }, + success: { + backgroundColor: '$green3', + borderColor: '$green6', + color: '$green11', + }, + }, + }, + + '@media (prefers-reduced-motion: no-preference)': { + '&[data-state="open"]': { + animation: `${this.KeyFrames.show} 750ms `, + }, + '&[data-state="closed"]': { + animation: `${this.KeyFrames.hide} ${this.DismissTimeout}ms ease-in`, + }, + }, + }); + + static readonly Body = styled(ToastLib.Description, { + fontSize: '$md', + fontWeight: '$normal', + mr: '$5', + }); + + static readonly Close = styled(ToastLib.Close, {}); + + static readonly CloseButton = styled(IconButton, { + variants: { + colorScheme: { + error: { + color: '$red11 !important', + }, + success: { + color: '$green11 !important', + }, + }, + }, + }); + + static readonly Viewport = styled(ToastLib.Viewport, { + padding: '$14', + + position: 'fixed', + bottom: 0, + left: '50%', + transform: 'translate(-50%)', + display: 'flex', + flexDirection: 'column', + gap: '$4', + }); + + static readonly Layout = styled(Flex, { + flexDirection: 'row', + justifyContent: 'space-between', + }); + + static readonly Icon = styled(Icon, { + fontSize: '$5', + marginRight: '$2h', + }); + + static readonly Content = styled(Flex, {}); +} diff --git a/ui/src/components/toast/toast.tsx b/ui/src/components/toast/toast.tsx new file mode 100644 index 00000000..f11cfb6c --- /dev/null +++ b/ui/src/components/toast/toast.tsx @@ -0,0 +1,73 @@ +import { + toastsActions, + ToastsState, + useAppDispatch, + useToastsState, +} from '@/store'; +import { useCallback, useState } from 'react'; +import { Icon } from '../core'; +import { ToastStyles } from './toast.styles'; + +type ToastProps = ToastsState.Toast; + +const Toast: React.FC = ({ + id, + type, + message, + onDismiss, + duration = 3000, +}) => { + const dispatch = useAppDispatch(); + const [open, setOpen] = useState(true); + + const handleOpenChange = useCallback( + (value: boolean) => { + setOpen(value); + if (!value) { + if (onDismiss) onDismiss(); + setTimeout(() => { + dispatch(toastsActions.dismiss(id)); + }, ToastStyles.DismissTimeout); + } + }, + [onDismiss, dispatch, id] + ); + + return ( + + + + + {message} + + + } + onClick={onDismiss} + /> + + + + ); +}; + +export const ToastProvider: React.FC = () => { + const { toasts } = useToastsState(); + + return ( + + {toasts.map((toast) => ( + + ))} + + + ); +}; diff --git a/ui/src/store/features/index.ts b/ui/src/store/features/index.ts index a5876255..22ab4b09 100644 --- a/ui/src/store/features/index.ts +++ b/ui/src/store/features/index.ts @@ -1,2 +1,3 @@ -export * from './github'; export * from './ens'; +export * from './github'; +export * from './toasts'; diff --git a/ui/src/store/features/toasts/index.ts b/ui/src/store/features/toasts/index.ts new file mode 100644 index 00000000..9d96d9a6 --- /dev/null +++ b/ui/src/store/features/toasts/index.ts @@ -0,0 +1 @@ +export * from './toasts-slice'; diff --git a/ui/src/store/features/toasts/toasts-slice.ts b/ui/src/store/features/toasts/toasts-slice.ts new file mode 100644 index 00000000..3d875149 --- /dev/null +++ b/ui/src/store/features/toasts/toasts-slice.ts @@ -0,0 +1,46 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +import type { RootState } from '@/store'; +import { useAppSelector } from '@/store/hooks'; + +export namespace ToastsState { + export type Toast = { + id: number; + type: 'success' | 'error'; + message: string; + onDismiss?: () => void; + duration?: number; + }; +} + +interface ToastsState { + toasts: ToastsState.Toast[]; +} + +const initialState: ToastsState = { + toasts: [], +}; + +export const toastsSlice = createSlice({ + name: 'toasts', + initialState, + reducers: { + push: (state, action: PayloadAction>) => { + state.toasts = [...state.toasts, { ...action.payload, id: Date.now() }]; + }, + dismiss: (state, action: PayloadAction) => { + state.toasts = state.toasts.filter( + (toast) => toast.id !== action.payload + ); + }, + }, +}); + +export const toastsActions = { ...toastsSlice.actions }; + +const selectToastsState = (state: RootState): ToastsState => state.toasts; + +export const useToastsState = (): ToastsState => + useAppSelector(selectToastsState); + +export default toastsSlice.reducer; diff --git a/ui/src/store/store.ts b/ui/src/store/store.ts index f86bae73..db53f7bd 100644 --- a/ui/src/store/store.ts +++ b/ui/src/store/store.ts @@ -1,11 +1,13 @@ import { configureStore } from '@reduxjs/toolkit'; import githubReducer from './features/github/github-slice'; +import toastsReducer from './features/toasts/toasts-slice'; import ensReducer from './features/ens/ens-slice'; export const store = configureStore({ reducer: { - github: githubReducer, ens: ensReducer, + github: githubReducer, + toasts: toastsReducer, }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ diff --git a/ui/src/theme/index.ts b/ui/src/theme/index.ts index 8fe10803..bdbfceb5 100644 --- a/ui/src/theme/index.ts +++ b/ui/src/theme/index.ts @@ -1,2 +1,3 @@ export * from './themes'; export * from './foundations'; +export * from './key-frames'; diff --git a/ui/src/theme/key-frames.ts b/ui/src/theme/key-frames.ts new file mode 100644 index 00000000..4c09aac0 --- /dev/null +++ b/ui/src/theme/key-frames.ts @@ -0,0 +1,22 @@ +import { dripStitches } from './themes'; + +const { keyframes } = dripStitches; + +export const KeyFrames = { + slideUpAndFade: keyframes({ + '0%': { opacity: 0, transform: 'translateY(2px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, + }), + slideRightAndFade: keyframes({ + '0%': { opacity: 0, transform: 'translateX(-2px)' }, + '100%': { opacity: 1, transform: 'translateX(0)' }, + }), + slideDownAndFade: keyframes({ + '0%': { opacity: 0, transform: 'translateY(-2px)' }, + '100%': { opacity: 1, transform: 'translateY(0)' }, + }), + slideLeftAndFade: keyframes({ + '0%': { opacity: 0, transform: 'translateX(2px)' }, + '100%': { opacity: 1, transform: 'translateX(0)' }, + }), +}; diff --git a/ui/src/utils/index.ts b/ui/src/utils/index.ts index 670741c0..aa68340d 100644 --- a/ui/src/utils/index.ts +++ b/ui/src/utils/index.ts @@ -2,3 +2,4 @@ export * from './format'; export * from './validation'; export * from './object'; export * from './context'; +export * from './toast'; diff --git a/ui/src/utils/toast.ts b/ui/src/utils/toast.ts new file mode 100644 index 00000000..40d99868 --- /dev/null +++ b/ui/src/utils/toast.ts @@ -0,0 +1,10 @@ +import { store, toastsActions, ToastsState } from '@/store'; + +type PushToast = ( + type: ToastsState.Toast['type'], + message: ToastsState.Toast['message'], + extra?: Omit +) => void; + +export const pushToast: PushToast = (type, message, extra = {}) => + store.dispatch(toastsActions.push({ type, message, ...extra })); diff --git a/ui/src/views/components-test/combobox-test.tsx b/ui/src/views/components-test/combobox-test.tsx new file mode 100644 index 00000000..f381668f --- /dev/null +++ b/ui/src/views/components-test/combobox-test.tsx @@ -0,0 +1,50 @@ +import { Combobox, ComboboxItem, Flex } from '@/components'; +import { useState } from 'react'; + +const itemsCombobox = [ + { label: 'Item 1', value: 'item-1' }, + { label: 'Item 2', value: 'item-2' }, + { label: 'Item 3', value: 'item-3' }, +]; + +export const ComboboxTest = () => { + const [selectedValue, setSelectedValue] = useState({} as ComboboxItem); + const [selectedValueAutocomplete, setSelectedValueAutocomplete] = useState( + {} as ComboboxItem + ); + + const handleComboboxChange = (item: ComboboxItem) => { + setSelectedValue(item); + }; + + const handleComboboxChangeAutocomplete = (item: ComboboxItem) => { + setSelectedValueAutocomplete(item); + }; + + return ( + +

Components Test

+ + + + +
+ ); +}; diff --git a/ui/src/views/components-test/components-test.tsx b/ui/src/views/components-test/components-test.tsx index a3871e1a..e703f827 100644 --- a/ui/src/views/components-test/components-test.tsx +++ b/ui/src/views/components-test/components-test.tsx @@ -1,50 +1,12 @@ -import { Combobox, ComboboxItem, Flex } from '@/components'; -import { useState } from 'react'; - -const itemsCombobox = [ - { label: 'Item 1', value: 'item-1' }, - { label: 'Item 2', value: 'item-2' }, - { label: 'Item 3', value: 'item-3' }, -]; +import { Flex } from '@/components'; +import { ComboboxTest } from './combobox-test'; +import { ToastTest } from './toast-test'; export const ComponentsTest = () => { - const [selectedValue, setSelectedValue] = useState({} as ComboboxItem); - const [selectedValueAutocomplete, setSelectedValueAutocomplete] = useState( - {} as ComboboxItem - ); - - const handleComboboxChange = (item: ComboboxItem) => { - setSelectedValue(item); - }; - - const handleComboboxChangeAutocomplete = (item: ComboboxItem) => { - setSelectedValueAutocomplete(item); - }; - return ( - -

Components Test

- - - - + + + ); }; diff --git a/ui/src/views/components-test/toast-test.tsx b/ui/src/views/components-test/toast-test.tsx new file mode 100644 index 00000000..1ba13166 --- /dev/null +++ b/ui/src/views/components-test/toast-test.tsx @@ -0,0 +1,24 @@ +import { Button, Flex } from '@/components'; +import { pushToast } from '@/utils'; + +export const ToastTest = () => { + return ( + +

ToastTest

+ + +
+ ); +}; diff --git a/ui/yarn.lock b/ui/yarn.lock index d17c95fd..8173725c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -3710,6 +3710,13 @@ resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-0.1.8.tgz#b08c62536fc462a87632165fb28e9b18f9bd047e" integrity sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw== +"@radix-ui/primitive@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253" + integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-avatar@^1.0.1": version "1.0.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.0.2.tgz#c72209882e191db00ac0bfa16a9d9c025f0958f0" @@ -3721,6 +3728,17 @@ "@radix-ui/react-use-callback-ref" "1.0.0" "@radix-ui/react-use-layout-effect" "1.0.0" +"@radix-ui/react-collection@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.0.1.tgz#259506f97c6703b36291826768d3c1337edd1de5" + integrity sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-primitive" "1.0.1" + "@radix-ui/react-slot" "1.0.1" + "@radix-ui/react-compose-refs@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz#37595b1f16ec7f228d698590e78eeed18ff218ae" @@ -3735,6 +3753,43 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-dismissable-layer@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz#f04d1061bddf00b1ca304148516b9ddc62e45fb2" + integrity sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.1" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-escape-keydown" "1.0.2" + +"@radix-ui/react-portal@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.1.tgz#169c5a50719c2bb0079cf4c91a27aa6d37e5dd33" + integrity sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.1" + +"@radix-ui/react-presence@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz#814fe46df11f9a468808a6010e3f3ca7e0b2e84a" + integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-primitive@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz#c1ebcce283dd2f02e4fbefdaa49d1cb13dbc990a" + integrity sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.1" + "@radix-ui/react-primitive@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz#54e22f49ca59ba88d8143090276d50b93f8a7053" @@ -3751,6 +3806,25 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.0" +"@radix-ui/react-toast@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toast/-/react-toast-1.1.2.tgz#53872fbf20c6515040bac54fc0660dbfe983ab90" + integrity sha512-Kpr4BBYoP0O5A1UeDBmao87UnCMNdAKGNioQH5JzEm6OYTUVGhuDRbOwoZxPwOZ6vsjJHeIpdUrwbiHEB65CCw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-collection" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-dismissable-layer" "1.0.2" + "@radix-ui/react-portal" "1.0.1" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.1" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-visually-hidden" "1.0.1" + "@radix-ui/react-use-callback-ref@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" @@ -3758,6 +3832,22 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-controllable-state@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz#a64deaafbbc52d5d407afaa22d493d687c538b7f" + integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-escape-keydown@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz#09ab6455ab240b4f0a61faf06d4e5132c4d639f6" + integrity sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-layout-effect@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz#2fc19e97223a81de64cd3ba1dc42ceffd82374dc" @@ -3765,6 +3855,14 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-visually-hidden@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz#9a4ac4fc97ae8d72a10e727f16b3121b5f0aa469" + integrity sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.1" + "@react-icons/all-files@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@react-icons/all-files/-/all-files-4.1.0.tgz#477284873a0821928224b6fc84c62d2534d6650b" From d6f8d047c87c89ecf50e64f7d793292d65af77ea Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Mon, 13 Mar 2023 10:21:54 -0300 Subject: [PATCH 10/23] feat: review linting for all subfolders (#169) * chore: setup root eslint * fix: fix .eslintignore to root folder --- .eslintignore | 19 ++ .eslintrc.js | 19 ++ contracts/.eslintrc.js | 14 + contracts/.prettierrc | 18 - contracts/tsconfig.json | 4 + package.json | 12 +- subgraph/tsconfig.tools.json | 4 + tsconfig.base.json | 11 + ui/.eslintignore | 2 - ui/.eslintrc.js | 9 +- ui/package.json | 2 - ui/tailwind.config.js | 2 + ui/tsconfig.json | 2 +- yarn.lock | 634 ++++++++++++++++++++++++++++++++++- 14 files changed, 710 insertions(+), 42 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 contracts/.eslintrc.js delete mode 100644 contracts/.prettierrc create mode 100644 contracts/tsconfig.json create mode 100644 subgraph/tsconfig.tools.json create mode 100644 tsconfig.base.json delete mode 100644 ui/.eslintignore diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..05f48337 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,19 @@ +node_modules +.eslintrc.js + +ui/public +ui/dist +ui/.graphclient + +contracts/.openzeppelin +contracts/artifacts +contracts/cache +contracts/deployments +contracts/forge-cache +contracts/lib +contracts/out + +subgraph/abis +subgraph/build +subgraph/generated +subgraph/examples/query/.graphclient \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..7c22c9cf --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + './contracts/tsconfig.json', + './ui/tsconfig.json', + './subgraph/tsconfig.json', + './subgraph/tsconfig.tools.json', + ], + }, + plugins: ['@typescript-eslint', 'prettier'], + root: true, +}; diff --git a/contracts/.eslintrc.js b/contracts/.eslintrc.js new file mode 100644 index 00000000..5d1ac488 --- /dev/null +++ b/contracts/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ['../.eslintrc.js'], + rules: { + 'no-undef': 'off', + }, + overrides: [ + { + files: ['**/*.js'], + rules: { + '@typescript-eslint/no-var-requires': 'off', + }, + }, + ], +}; diff --git a/contracts/.prettierrc b/contracts/.prettierrc deleted file mode 100644 index 459d6668..00000000 --- a/contracts/.prettierrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "semi": true, - "useTabs": false, - "tabWidth": 2, - "singleQuote": true, - "endOfLine": "lf", - "overrides": [ - { - "files": "*.sol", - "options": { - "printWidth": 120, - "tabWidth": 4, - "singleQuote": false, - "bracketSpacing": false - } - } - ] -} diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json new file mode 100644 index 00000000..abf0a90d --- /dev/null +++ b/contracts/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.base.json", + "include": ["./**/*"] +} diff --git a/package.json b/package.json index 3d451c70..14e3a881 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "", "private": "false", "scripts": { + "lint": "eslint .", "format": "prettier --write \"./**/*.{js,json,sol,ts}\"", "postinstall": "husky install", "prepack": "pinst --disable", @@ -21,9 +22,16 @@ "homepage": "https://github.com/fleekxyz/non-fungible-apps#readme", "devDependencies": { "@graphql-codegen/cli": "^2.16.4", + "@typescript-eslint/eslint-plugin": "^5.54.1", + "@typescript-eslint/parser": "^5.54.1", + "eslint": "^8.35.0", + "eslint-config-prettier": "^8.7.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-simple-import-sort": "^10.0.0", "husky": "^8.0.2", "pinst": "^3.0.0", - "prettier": "^2.7.1", - "prettier-plugin-solidity": "^1.0.0" + "prettier": "^2.8.4", + "prettier-plugin-solidity": "^1.0.0", + "typescript": "^4.9.5" } } diff --git a/subgraph/tsconfig.tools.json b/subgraph/tsconfig.tools.json new file mode 100644 index 00000000..a933f34f --- /dev/null +++ b/subgraph/tsconfig.tools.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.base.json", + "include": ["./tests/**/*", "./examples/**/*"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..574e785c --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + } +} diff --git a/ui/.eslintignore b/ui/.eslintignore deleted file mode 100644 index 36170a7e..00000000 --- a/ui/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -public diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index 692d124a..88428cb4 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -4,19 +4,16 @@ module.exports = { es2021: true, }, extends: [ - 'eslint:recommended', + '../.eslintrc.js', 'plugin:react/recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', 'plugin:react-hooks/recommended', ], - overrides: [], parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 'latest', sourceType: 'module', }, - plugins: ['react', '@typescript-eslint', 'simple-import-sort'], + plugins: ['react', 'simple-import-sort'], rules: { '@typescript-eslint/explicit-function-return-type': [ 'error', @@ -28,6 +25,6 @@ module.exports = { 'simple-import-sort/imports': 2, '@typescript-eslint/explicit-function-return-type': 'off', 'no-console': 'error', - 'unused-imports/no-unused-imports-ts': 'error', + 'react/react-in-jsx-scope': 'off', }, }; diff --git a/ui/package.json b/ui/package.json index 026c80b7..01649670 100644 --- a/ui/package.json +++ b/ui/package.json @@ -56,8 +56,6 @@ "@types/node": "^18.11.9", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", "@vitejs/plugin-react": "2.2.0", "autoprefixer": "^10.4.13", "babel-loader": "^8.3.0", diff --git a/ui/tailwind.config.js b/ui/tailwind.config.js index bb7ae2b4..06dbd743 100644 --- a/ui/tailwind.config.js +++ b/ui/tailwind.config.js @@ -1,4 +1,6 @@ +/* eslint-disable no-undef */ /** @type {import('tailwindcss').Config} */ + module.exports = { content: ['./src/**/*.tsx'], theme: { diff --git a/ui/tsconfig.json b/ui/tsconfig.json index da49dd2c..09202ca7 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -23,5 +23,5 @@ "isolatedModules": true, "types": ["vite/client"] }, - "include": ["./src", "./.graphclient", "./*.ts"] + "include": ["./src", "./.graphclient", "./*.ts", "./tailwind.config.js"] } diff --git a/yarn.lock b/yarn.lock index 605be5f9..c68a3045 100644 --- a/yarn.lock +++ b/yarn.lock @@ -130,6 +130,26 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@eslint/eslintrc@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" + integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.35.0": + version "8.35.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" + integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== + "@graphql-codegen/cli@^2.16.4": version "2.16.5" resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-2.16.5.tgz#b3b5eeec357af01c1cb72f6a4ea96e52bd49e662" @@ -447,6 +467,25 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.2.tgz#6fc464307cbe3c8ca5064549b806360d84457b04" integrity sha512-9anpBMM9mEgZN4wr2v8wHJI2/u5TnnggewRN6OlvXTTnuVyoY19X6rOv9XTqKRw6dcGKwZsBi8n0kDE2I5i4VA== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -500,7 +539,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -577,6 +616,11 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + "@types/json-stable-stringify@^1.0.32": version "1.0.34" resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" @@ -599,6 +643,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + "@types/ws@^8.0.0": version "8.5.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" @@ -606,6 +655,90 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@^5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" + integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== + dependencies: + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/type-utils" "5.54.1" + "@typescript-eslint/utils" "5.54.1" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" + integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== + dependencies: + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" + integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== + dependencies: + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" + +"@typescript-eslint/type-utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" + integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== + dependencies: + "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/utils" "5.54.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" + integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== + +"@typescript-eslint/typescript-estree@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" + integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== + dependencies: + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" + integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" + integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== + dependencies: + "@typescript-eslint/types" "5.54.1" + eslint-visitor-keys "^3.3.0" + "@whatwg-node/events@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.2.tgz#7b7107268d2982fc7b7aff5ee6803c64018f84dd" @@ -653,12 +786,17 @@ fast-url-parser "^1.1.3" tslib "^2.3.1" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1: +acorn@^8.4.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -678,6 +816,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -841,7 +989,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1040,6 +1188,15 @@ cross-fetch@^3.1.5: dependencies: node-fetch "2.6.7" +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + dataloader@2.2.2, dataloader@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" @@ -1050,13 +1207,18 @@ debounce@^1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@4, debug@^4.1.0, debug@^4.3.1: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -1086,6 +1248,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -1133,6 +1302,145 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz#f1cc58a8afebc50980bd53475451df146c13182d" + integrity sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA== + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-simple-import-sort@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" + integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.35.0: + version "8.35.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" + integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== + dependencies: + "@eslint/eslintrc" "^2.0.0" + "@eslint/js" "8.35.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -1157,6 +1465,16 @@ fast-decode-uri-component@^1.0.1: resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -1168,6 +1486,16 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fast-querystring@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.1.tgz#f4c56ef56b1a954880cfd8c01b83f9e1a3d3fda2" @@ -1196,6 +1524,13 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1203,6 +1538,27 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -1212,6 +1568,11 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -1229,12 +1590,38 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.3: +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -1246,6 +1633,11 @@ globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + graphql-config@^4.4.0: version "4.4.1" resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-4.4.1.tgz#2b1b5215b38911c0b15ff9b2e878101c984802d6" @@ -1334,7 +1726,7 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -1347,12 +1739,25 @@ import-from@4.0.0: resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -inherits@^2.0.3, inherits@^2.0.4: +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1400,7 +1805,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@4.0.3, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -1424,6 +1829,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -1436,6 +1846,11 @@ is-upper-case@^2.0.2: dependencies: tslib "^2.0.3" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + isomorphic-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" @@ -1449,6 +1864,11 @@ isomorphic-ws@5.0.0, isomorphic-ws@^5.0.0: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -1471,6 +1891,16 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stable-stringify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" @@ -1518,6 +1948,14 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -1537,6 +1975,18 @@ listr2@^4.0.5: through "^2.3.8" wrap-ansi "^7.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -1628,6 +2078,13 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1643,6 +2100,16 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -1677,6 +2144,13 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -1684,6 +2158,18 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -1704,13 +2190,20 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-limit@3.1.0: +p-limit@3.1.0, p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -1759,6 +2252,21 @@ path-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -1774,6 +2282,18 @@ pinst@^3.0.0: resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec" integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + prettier-plugin-solidity@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.2.tgz#452be4df925a4b16a974a04235839c9f56c2d10d" @@ -1783,7 +2303,7 @@ prettier-plugin-solidity@^1.0.0: semver "^7.3.8" solidity-comments-extractor "^0.0.7" -prettier@^2.7.1: +prettier@^2.8.4: version "2.8.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== @@ -1793,6 +2313,11 @@ punycode@^1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + pvtsutils@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" @@ -1826,6 +2351,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + remedial@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" @@ -1874,6 +2404,13 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -1908,7 +2445,7 @@ scuid@^1.1.0: resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== -semver@^7.3.8: +semver@^7.3.7, semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== @@ -1924,6 +2461,18 @@ sentence-case@^3.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shell-quote@^1.7.3: version "1.8.0" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" @@ -2010,6 +2559,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -2031,6 +2585,11 @@ swap-case@^2.0.2: dependencies: tslib "^2.0.3" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -2091,6 +2650,11 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" @@ -2101,11 +2665,35 @@ tslib@~2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + unixify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" @@ -2127,6 +2715,13 @@ upper-case@^2.0.2: dependencies: tslib "^2.0.3" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + urlpattern-polyfill@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz#a193fe773459865a2a5c93b246bb794b13d07256" @@ -2190,6 +2785,18 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -2208,6 +2815,11 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + ws@8.12.1, ws@^8.12.0: version "8.12.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" From fbee0945fd4617736f34416742ed2cd5fd12417e Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Mon, 13 Mar 2023 10:22:58 -0300 Subject: [PATCH 11/23] bug: mint button not triggering in dev hosted (#170) * feat: parse error code using abi * feat: add prepare error treatment on mint flow --- .../integrations/ethereum/lib/fleek-erc721.ts | 104 +++++++++++++++++- ui/src/views/mint/mint.context.tsx | 5 +- ui/src/views/mint/nft-card/nft-card.tsx | 4 +- .../views/mint/preview-step/mint-preview.tsx | 17 ++- 4 files changed, 121 insertions(+), 9 deletions(-) diff --git a/ui/src/integrations/ethereum/lib/fleek-erc721.ts b/ui/src/integrations/ethereum/lib/fleek-erc721.ts index 220cac76..905381e6 100644 --- a/ui/src/integrations/ethereum/lib/fleek-erc721.ts +++ b/ui/src/integrations/ethereum/lib/fleek-erc721.ts @@ -1,13 +1,27 @@ +import { + ErrorDescription as InterfaceErrorDescription, + Result as InterfaceResult, +} from '@ethersproject/abi/lib/interface'; +import { BytesLike } from 'ethers'; import { Ethereum } from '../ethereum'; +enum CollectionRoles { + Owner, + Verifier, +} + +enum TokenRoles { + Controller, +} + export const FleekERC721 = { + contract: Ethereum.getContract('FleekERC721'), + async mint( params: FleekERC721.MintParams, provider: Ethereum.Providers ): Promise { - const contract = Ethereum.getContract('FleekERC721', provider); - - const response = await contract.mint( + const response = await this.contract.connect(provider).mint( params.owner, params.name, params.description.replaceAll(/\n/g, '\\n'), //replace break lines with \\n so it doesn't break the json, @@ -39,6 +53,83 @@ export const FleekERC721 = { // TODO: fetch last token id return 7; }, + + parseError(error: BytesLike): FleekERC721.TransactionError { + try { + if (!error) throw new Error('Empty error'); + + const description = this.contract.interface.parseError(error); + const result = this.contract.interface.decodeErrorResult( + description.signature, + error + ); + + let message: string; + + switch (description.signature) { + case 'ContractIsNotPausable()': + message = 'This contract is not pausable'; + break; + + case 'ContractIsNotPaused()': + message = 'This contract is not paused'; + break; + + case 'ContractIsPaused()': + message = 'This contract is paused'; + break; + + case 'MustBeTokenOwner(uint256)': + message = `You must be the token #${result.tokenId} owner`; + break; + + case 'MustHaveAtLeastOneOwner()': + message = 'You must have at least one owner'; + break; + + case 'MustHaveCollectionRole(uint8)': + message = `You must have a collection role "${ + CollectionRoles[result.role] + }" to mint`; + break; + + case 'MustHaveTokenRole(uint256,uint8)': + message = `You must have a token role "${ + TokenRoles[result.role] + }" on token #${result.tokenId}`; + break; + + case 'PausableIsSetTo(bool)': + message = `Pausable is set to "${result.isPausable}"`; + break; + + case 'RoleAlreadySet()': + message = `Role is already set`; + break; + + case 'ThereIsNoTokenMinted()': + message = `There is no token minted`; + break; + + default: + message = 'Unknown error'; + } + + return { + message, + description, + result, + isIdentified: true, + }; + } catch { + return { + message: 'Unknown error', + description: null, + result: null, + isIdentified: false, + }; + } + }, }; export namespace FleekERC721 { @@ -61,4 +152,11 @@ export namespace FleekERC721 { } ]; }; + + export type TransactionError = { + message: string; + description: InterfaceErrorDescription | null; + result: InterfaceResult | null; + isIdentified: boolean; + }; } diff --git a/ui/src/views/mint/mint.context.tsx b/ui/src/views/mint/mint.context.tsx index 07c57b83..7cd4ff54 100644 --- a/ui/src/views/mint/mint.context.tsx +++ b/ui/src/views/mint/mint.context.tsx @@ -1,8 +1,9 @@ +import { useState } from 'react'; + import { ComboboxItem, DropdownItem } from '@/components'; +import { Ethereum, EthereumHooks } from '@/integrations'; import { GithubState } from '@/store'; -import { EthereumHooks } from '@/integrations'; import { createContext } from '@/utils'; -import { useState } from 'react'; export type MintContext = { selectedUserOrg: ComboboxItem; diff --git a/ui/src/views/mint/nft-card/nft-card.tsx b/ui/src/views/mint/nft-card/nft-card.tsx index 058f739d..7533c586 100644 --- a/ui/src/views/mint/nft-card/nft-card.tsx +++ b/ui/src/views/mint/nft-card/nft-card.tsx @@ -9,7 +9,7 @@ type NftCardProps = { message: string; buttonText: string; leftIconButton?: React.ReactNode; - onClick: () => void; + onClick?: () => void; isLoading: boolean; }; @@ -53,7 +53,7 @@ export const NftCard: React.FC = ({ onClick={onClick} leftIcon={leftIconButton} isLoading={isLoading} - isDisabled={isLoading} + isDisabled={isLoading || !onClick} > {buttonText} diff --git a/ui/src/views/mint/preview-step/mint-preview.tsx b/ui/src/views/mint/preview-step/mint-preview.tsx index 14d50ea7..13e8a75e 100644 --- a/ui/src/views/mint/preview-step/mint-preview.tsx +++ b/ui/src/views/mint/preview-step/mint-preview.tsx @@ -1,5 +1,6 @@ import { Icon, IconButton, Stepper } from '@/components'; import { useTransactionCost } from '@/hooks'; +import { FleekERC721 } from '@/integrations'; import { Mint } from '@/views/mint/mint.context'; import { ethers } from 'ethers'; import { useMemo } from 'react'; @@ -8,7 +9,7 @@ import { NftCard } from '../nft-card'; export const MintPreview = () => { const { prevStep } = Stepper.useContext(); const { - prepare: { status: prepareStatus, data: prepareData }, + prepare: { status: prepareStatus, data: prepareData, error: prepareError }, write: { status: writeStatus, write }, transaction: { status: transactionStatus }, } = Mint.useTransactionContext(); @@ -24,6 +25,18 @@ export const MintPreview = () => { if (isCostLoading || prepareStatus === 'loading') return 'Calculating cost...'; + // TODO: better UI for prepare errors + if (prepareError) { + const parsedError = FleekERC721.parseError( + (prepareError as any).error?.data.data + ); + if (parsedError.isIdentified) { + return parsedError.message; + } + + return 'An error occurred while preparing the transaction'; + } + const formattedCost = ethers.utils.formatEther(cost).slice(0, 9); return `Minting this NFA will cost ${formattedCost} ${currency}.`; }, [prepareData, isCostLoading, prepareStatus]); @@ -59,7 +72,7 @@ export const MintPreview = () => { } message={message} buttonText="Mint NFA" - onClick={write!} + onClick={write} isLoading={isLoading} /> ); From df6fbea5c0a7b2d067d9284afcd10955f26beb23 Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Mon, 13 Mar 2023 11:07:40 -0300 Subject: [PATCH 12/23] feat: erc interface and split out access points to single module (#151) * wip: compilant version of interface * refactor: split out access point to single module * test: fix mint call on hardhat tests * fix: remove auto approval from NewMint event --- contracts/contracts/FleekAccessPoints.sol | 212 ++++++++++ contracts/contracts/FleekERC721.sol | 375 +++++------------- contracts/contracts/IERCX.sol | 109 +++++ contracts/contracts/util/FleekSVG.sol | 1 - contracts/contracts/util/FleekStrings.sol | 17 +- contracts/scripts/mint.js | 4 +- .../contracts/FleekERC721/billing.t.ts | 10 +- .../FleekERC721/collection-roles.t.ts | 12 +- .../FleekERC721/get-last-token-id.t.ts | 15 +- .../contracts/FleekERC721/helpers/fixture.ts | 8 +- .../contracts/FleekERC721/helpers/index.ts | 1 + .../helpers/overloaded-functions.ts | 8 + .../contracts/FleekERC721/minting.t.ts | 14 +- .../contracts/FleekERC721/pausable.t.ts | 12 +- subgraph/src/fleek-nfa.ts | 2 +- subgraph/tests/matchstick/.latest.json | 2 +- .../CollectionRoleChanged.test.ts | 41 +- .../access-control/TokenRoleChanged.test.ts | 101 ++--- .../changeAccessPointCreationStatus.test.ts | 185 +++++---- .../changeAccessPointNameVerify.test.ts | 168 ++++---- .../access-points/newAccessPoint.test.ts | 183 ++++----- subgraph/tests/matchstick/helpers/utils.ts | 85 ++-- subgraph/tests/matchstick/owner.test.ts | 14 +- subgraph/tests/matchstick/transfer.test.ts | 14 +- 24 files changed, 854 insertions(+), 739 deletions(-) create mode 100644 contracts/contracts/FleekAccessPoints.sol create mode 100644 contracts/contracts/IERCX.sol create mode 100644 contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts diff --git a/contracts/contracts/FleekAccessPoints.sol b/contracts/contracts/FleekAccessPoints.sol new file mode 100644 index 00000000..886f81e4 --- /dev/null +++ b/contracts/contracts/FleekAccessPoints.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.7; + +import {FleekStrings} from "./util/FleekStrings.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +error AccessPointNotExistent(); +error AccessPointAlreadyExists(); +error AccessPointScoreCannotBeLower(); +error MustBeAccessPointOwner(); +error InvalidTokenIdForAccessPoint(); +error AccessPointCreationStatusAlreadySet(); + +abstract contract FleekAccessPoints is Initializable { + using FleekStrings for FleekAccessPoints.AccessPoint; + + event NewAccessPoint(string apName, uint256 indexed tokenId, address indexed owner); + event RemoveAccessPoint(string apName, uint256 indexed tokenId, address indexed owner); + + event ChangeAccessPointScore(string apName, uint256 indexed tokenId, uint256 score, address indexed triggeredBy); + + event ChangeAccessPointNameVerify( + string apName, + uint256 tokenId, + bool indexed verified, + address indexed triggeredBy + ); + event ChangeAccessPointContentVerify( + string apName, + uint256 tokenId, + bool indexed verified, + address indexed triggeredBy + ); + event ChangeAccessPointCreationStatus( + string apName, + uint256 tokenId, + AccessPointCreationStatus status, + address indexed triggeredBy + ); + + /** + * Creation status enums for access points + */ + enum AccessPointCreationStatus { + DRAFT, + APPROVED, + REJECTED, + REMOVED + } + + /** + * The stored data for each AccessPoint. + */ + struct AccessPoint { + uint256 tokenId; + uint256 score; + bool contentVerified; + bool nameVerified; + address owner; + AccessPointCreationStatus status; + } + + mapping(string => AccessPoint) private _accessPoints; + + mapping(uint256 => bool) private _autoApproval; + + /** + * @dev Checks if the AccessPoint exists. + */ + modifier requireAP(string memory apName) { + if (_accessPoints[apName].owner == address(0)) revert AccessPointNotExistent(); + _; + } + + /** + * @dev A view function to gether information about an AccessPoint. + * It returns a JSON string representing the AccessPoint information. + */ + function getAccessPointJSON(string memory apName) public view requireAP(apName) returns (string memory) { + AccessPoint storage _ap = _accessPoints[apName]; + return _ap.toString(); + } + + /** + * @dev A view function to check if a AccessPoint is verified. + */ + function isAccessPointNameVerified(string memory apName) public view requireAP(apName) returns (bool) { + return _accessPoints[apName].nameVerified; + } + + /** + * @dev Increases the score of a AccessPoint registry. + */ + function increaseAccessPointScore(string memory apName) public requireAP(apName) { + _accessPoints[apName].score++; + emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender); + } + + /** + * @dev Decreases the score of a AccessPoint registry if is greater than 0. + */ + function decreaseAccessPointScore(string memory apName) public requireAP(apName) { + if (_accessPoints[apName].score == 0) revert AccessPointScoreCannotBeLower(); + _accessPoints[apName].score--; + emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender); + } + + /** + * @dev Add a new AccessPoint register for an app token. + * The AP name should be a DNS or ENS url and it should be unique. + */ + function _addAccessPoint(uint256 tokenId, string memory apName) internal { + if (_accessPoints[apName].owner != address(0)) revert AccessPointAlreadyExists(); + + emit NewAccessPoint(apName, tokenId, msg.sender); + + if (_autoApproval[tokenId]) { + // Auto Approval is on. + _accessPoints[apName] = AccessPoint( + tokenId, + 0, + false, + false, + msg.sender, + AccessPointCreationStatus.APPROVED + ); + + 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 ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.DRAFT, msg.sender); + } + } + + /** + * @dev Remove an AccessPoint registry for an app token. + * It will also remove the AP from the app token APs list. + */ + function _removeAccessPoint(string memory apName) internal requireAP(apName) { + if (msg.sender != _accessPoints[apName].owner) revert MustBeAccessPointOwner(); + _accessPoints[apName].status = AccessPointCreationStatus.REMOVED; + uint256 tokenId = _accessPoints[apName].tokenId; + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REMOVED, msg.sender); + emit RemoveAccessPoint(apName, tokenId, msg.sender); + } + + /** + * @dev Updates the `accessPointAutoApproval` settings on minted `tokenId`. + */ + function _setAccessPointAutoApproval(uint256 tokenId, bool _apAutoApproval) internal { + _autoApproval[tokenId] = _apAutoApproval; + } + + /** + * @dev Set approval settings for an access point. + * It will add the access point to the token's AP list, if `approved` is true. + */ + function _setApprovalForAccessPoint(uint256 tokenId, string memory apName, bool approved) internal { + AccessPoint storage accessPoint = _accessPoints[apName]; + if (accessPoint.tokenId != tokenId) revert InvalidTokenIdForAccessPoint(); + if (accessPoint.status != AccessPointCreationStatus.DRAFT) revert AccessPointCreationStatusAlreadySet(); + + if (approved) { + // Approval + accessPoint.status = AccessPointCreationStatus.APPROVED; + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender); + } else { + // Not Approved + accessPoint.status = AccessPointCreationStatus.REJECTED; + emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REJECTED, msg.sender); + } + } + + /** + * @dev Set the content verification of a AccessPoint registry. + */ + function _setAccessPointContentVerify(string memory apName, bool verified) internal requireAP(apName) { + _accessPoints[apName].contentVerified = verified; + emit ChangeAccessPointContentVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender); + } + + /** + * @dev Set the name verification of a AccessPoint registry. + */ + function _setAccessPointNameVerify(string memory apName, bool verified) internal requireAP(apName) { + _accessPoints[apName].nameVerified = verified; + emit ChangeAccessPointNameVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender); + } + + /** + * @dev Get the AccessPoint token id. + */ + function _getAccessPointTokenId(string memory apName) internal view requireAP(apName) returns (uint256) { + return _accessPoints[apName].tokenId; + } + + /** + * @dev Get the Auto Approval setting for token id. + */ + function _getAccessPointAutoApproval(uint256 tokenId) internal view returns (bool) { + return _autoApproval[tokenId]; + } + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[49] private __gap; +} diff --git a/contracts/contracts/FleekERC721.sol b/contracts/contracts/FleekERC721.sol index b049d024..46e673b9 100644 --- a/contracts/contracts/FleekERC721.sol +++ b/contracts/contracts/FleekERC721.sol @@ -7,22 +7,25 @@ import "@openzeppelin/contracts/utils/Base64.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./FleekAccessControl.sol"; import "./FleekBilling.sol"; -import "./util/FleekStrings.sol"; import "./FleekPausable.sol"; +import "./FleekAccessPoints.sol"; +import "./util/FleekStrings.sol"; +import "./IERCX.sol"; -error AccessPointNotExistent(); -error AccessPointAlreadyExists(); -error AccessPointScoreCannotBeLower(); -error MustBeAccessPointOwner(); error MustBeTokenOwner(uint256 tokenId); error ThereIsNoTokenMinted(); -error InvalidTokenIdForAccessPoint(); -error AccessPointCreationStatusAlreadySet(); -contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, FleekPausable, FleekBilling { +contract FleekERC721 is + IERCX, + Initializable, + ERC721Upgradeable, + FleekAccessControl, + FleekPausable, + FleekBilling, + FleekAccessPoints +{ using Strings for uint256; - using FleekStrings for FleekERC721.App; - using FleekStrings for FleekERC721.AccessPoint; + using FleekStrings for FleekERC721.Token; using FleekStrings for string; using FleekStrings for uint24; @@ -36,89 +39,12 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl string gitRepository, string logo, uint24 color, - bool accessPointAutoApproval, address indexed minter, address indexed owner ); - 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 ChangeAccessPointScore(string apName, uint256 indexed tokenId, uint256 score, address indexed triggeredBy); - - event ChangeAccessPointNameVerify( - string apName, - uint256 tokenId, - bool indexed verified, - address indexed triggeredBy - ); - event ChangeAccessPointContentVerify( - string apName, - uint256 tokenId, - bool indexed verified, - address indexed triggeredBy - ); - event ChangeAccessPointCreationStatus( - string apName, - uint256 tokenId, - AccessPointCreationStatus status, - address indexed triggeredBy - ); - - /** - * The properties are stored as string to keep consistency with - * other token contracts, we might consider changing for bytes32 - * in the future due to gas optimization. - */ - struct App { - string name; // Name of the site - string description; // Description about the site - string externalURL; // Site URL - string ENS; // ENS ID - uint256 currentBuild; // The current build number (Increments by one with each change, starts at zero) - mapping(uint256 => Build) builds; // Mapping to build details for each build number - string logo; - uint24 color; // Color of the nft - bool accessPointAutoApproval; // AP Auto Approval - } - - /** - * The metadata that is stored for each build. - */ - struct Build { - string commitHash; - string gitRepository; - } - - /** - * Creation status enums for access points - */ - enum AccessPointCreationStatus { - DRAFT, - APPROVED, - REJECTED, - REMOVED - } - - /** - * The stored data for each AccessPoint. - */ - struct AccessPoint { - uint256 tokenId; - uint256 score; - bool contentVerified; - bool nameVerified; - address owner; - AccessPointCreationStatus status; - } uint256 private _appIds; - mapping(uint256 => App) private _apps; - mapping(string => AccessPoint) private _accessPoints; + mapping(uint256 => Token) private _apps; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. @@ -134,14 +60,6 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl __FleekPausable_init(); } - /** - * @dev Checks if the AccessPoint exists. - */ - modifier requireAP(string memory apName) { - if (_accessPoints[apName].owner == address(0)) revert AccessPointNotExistent(); - _; - } - /** * @dev Mints a token and returns a tokenId. * @@ -163,22 +81,20 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl string memory commitHash, string memory gitRepository, string memory logo, - uint24 color, - bool accessPointAutoApproval + uint24 color ) public payable requirePayment(Billing.Mint) returns (uint256) { uint256 tokenId = _appIds; _mint(to, tokenId); _appIds += 1; - App storage app = _apps[tokenId]; + Token storage app = _apps[tokenId]; app.name = name; app.description = description; app.externalURL = externalURL; app.ENS = ENS; app.logo = logo; app.color = color; - app.accessPointAutoApproval = accessPointAutoApproval; // 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. app.currentBuild = 0; @@ -193,7 +109,6 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl gitRepository, logo, color, - accessPointAutoApproval, msg.sender, to ); @@ -210,12 +125,13 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl * - the tokenId must be minted and valid. * */ - function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { + function tokenURI(uint256 tokenId) public view virtual override(ERC721Upgradeable, IERCX) returns (string memory) { _requireMinted(tokenId); address owner = ownerOf(tokenId); - App storage app = _apps[tokenId]; + bool accessPointAutoApproval = _getAccessPointAutoApproval(tokenId); + Token storage app = _apps[tokenId]; - return string(abi.encodePacked(_baseURI(), app.toString(owner).toBase64())); + return string(abi.encodePacked(_baseURI(), app.toString(owner, accessPointAutoApproval).toBase64())); } /** @@ -237,7 +153,7 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl returns (string memory, string memory, string memory, string memory, uint256, string memory, uint24) { _requireMinted(tokenId); - App storage app = _apps[tokenId]; + Token storage app = _apps[tokenId]; return (app.name, app.description, app.externalURL, app.ENS, app.currentBuild, app.logo, app.color); } @@ -287,26 +203,6 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl return "data:application/json;base64,"; } - /** - * @dev 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. - * - */ - function setAccessPointAutoApproval( - uint256 tokenId, - bool _apAutoApproval - ) public virtual requireTokenOwner(tokenId) { - _requireMinted(tokenId); - _apps[tokenId].accessPointAutoApproval = _apAutoApproval; - emit MetadataUpdate(tokenId, "accessPointAutoApproval", _apAutoApproval, msg.sender); - } - /** * @dev Updates the `externalURL` metadata field of a minted `tokenId`. * @@ -444,156 +340,144 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl } /** - * @dev 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. + * @dev Adds a new build to a minted `tokenId`'s builds mapping. * - * May emit a {NewAccessPoint} event. + * May emit a {NewBuild} event. * * Requirements: * * - the tokenId must be minted and valid. - * - billing for add acess point may be applied. - * - the contract must be not paused. + * - the sender must have the `tokenController` role. * */ - function addAccessPoint( + function setTokenBuild( uint256 tokenId, - string memory apName - ) public payable whenNotPaused requirePayment(Billing.AddAccessPoint) { - // require(msg.value == 0.1 ether, "You need to pay at least 0.1 ETH"); // TODO: define a minimum price + string memory _commitHash, + string memory _gitRepository + ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) { _requireMinted(tokenId); - if (_accessPoints[apName].owner != address(0)) revert AccessPointAlreadyExists(); - - emit NewAccessPoint(apName, tokenId, msg.sender); - - if (_apps[tokenId].accessPointAutoApproval) { - // Auto Approval is on. - _accessPoints[apName] = AccessPoint( - tokenId, - 0, - false, - false, - msg.sender, - AccessPointCreationStatus.APPROVED - ); - - 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 ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.DRAFT, msg.sender); - } + _apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(_commitHash, _gitRepository); + emit MetadataUpdate(tokenId, "build", [_commitHash, _gitRepository], msg.sender); } /** - * @dev Set approval settings for an access point. - * It will add the access point to the token's AP list, if `approved` is true. + * @dev Burns a previously minted `tokenId`. * - * May emit a {ChangeAccessPointApprovalStatus} event. + * May emit a {Transfer} 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. + * - the tokenId must be minted and valid. + * - the sender must be the owner of the token. + * - the contract must be not paused. + * */ - function setApprovalForAccessPoint( - uint256 tokenId, - string memory apName, - bool approved - ) public requireTokenOwner(tokenId) { - AccessPoint storage accessPoint = _accessPoints[apName]; - if (accessPoint.tokenId != tokenId) revert InvalidTokenIdForAccessPoint(); - if (accessPoint.status != AccessPointCreationStatus.DRAFT) revert AccessPointCreationStatusAlreadySet(); - - if (approved) { - // Approval - accessPoint.status = AccessPointCreationStatus.APPROVED; - emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender); - } else { - // Not Approved - accessPoint.status = AccessPointCreationStatus.REJECTED; - emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REJECTED, msg.sender); + function burn(uint256 tokenId) public virtual requireTokenOwner(tokenId) { + super._burn(tokenId); + + if (bytes(_apps[tokenId].externalURL).length != 0) { + delete _apps[tokenId]; } } + /*////////////////////////////////////////////////////////////// + ACCESS POINTS + //////////////////////////////////////////////////////////////*/ + /** - * @dev 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. - * + * @dev Mints with access auto approval setting */ - function removeAccessPoint(string memory apName) public whenNotPaused requireAP(apName) { - if (msg.sender != _accessPoints[apName].owner) revert MustBeAccessPointOwner(); - _accessPoints[apName].status = AccessPointCreationStatus.REMOVED; - uint256 tokenId = _accessPoints[apName].tokenId; - emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REMOVED, msg.sender); - emit RemoveAccessPoint(apName, tokenId, msg.sender); + function mint( + address to, + string memory name, + string memory description, + string memory externalURL, + string memory ENS, + string memory commitHash, + string memory gitRepository, + string memory logo, + uint24 color, + bool accessPointAutoApproval + ) public payable returns (uint256) { + uint256 tokenId = mint(to, name, description, externalURL, ENS, commitHash, gitRepository, logo, color); + _setAccessPointAutoApproval(tokenId, accessPointAutoApproval); + return tokenId; } /** - * @dev A view function to gether information about an AccessPoint. - * It returns a JSON string representing the AccessPoint information. + * @dev 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 AP must exist. + * - the tokenId must be minted and valid. + * - billing for add acess point may be applied. + * - the contract must be not paused. * */ - function getAccessPointJSON(string memory apName) public view requireAP(apName) returns (string memory) { - AccessPoint storage _ap = _accessPoints[apName]; - return _ap.toString(); + function addAccessPoint( + uint256 tokenId, + string memory apName + ) public payable whenNotPaused requirePayment(Billing.AddAccessPoint) { + _requireMinted(tokenId); + _addAccessPoint(tokenId, apName); } /** - * @dev A view function to check if a AccessPoint is verified. + * @dev 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. * */ - function isAccessPointNameVerified(string memory apName) public view requireAP(apName) returns (bool) { - return _accessPoints[apName].nameVerified; + function removeAccessPoint(string memory apName) public whenNotPaused { + _removeAccessPoint(apName); } /** - * @dev Increases the score of a AccessPoint registry. + * @dev Updates the `accessPointAutoApproval` settings on minted `tokenId`. * - * May emit a {ChangeAccessPointScore} event. + * May emit a {MetadataUpdate} event. * * Requirements: * - * - the AP must exist. + * - the tokenId must be minted and valid. + * - the sender must have the `tokenController` role. * */ - function increaseAccessPointScore(string memory apName) public requireAP(apName) { - _accessPoints[apName].score++; - emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender); + function setAccessPointAutoApproval(uint256 tokenId, bool _apAutoApproval) public requireTokenOwner(tokenId) { + _requireMinted(tokenId); + _setAccessPointAutoApproval(tokenId, _apAutoApproval); + emit MetadataUpdate(tokenId, "accessPointAutoApproval", _apAutoApproval, msg.sender); } /** - * @dev Decreases the score of a AccessPoint registry if is greater than 0. + * @dev 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 {ChangeAccessPointScore} event. + * 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. */ - function decreaseAccessPointScore(string memory apName) public requireAP(apName) { - if (_accessPoints[apName].score == 0) revert AccessPointScoreCannotBeLower(); - _accessPoints[apName].score--; - emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender); + function setApprovalForAccessPoint( + uint256 tokenId, + string memory apName, + bool approved + ) public requireTokenOwner(tokenId) { + _setApprovalForAccessPoint(tokenId, apName, approved); } /** @@ -604,15 +488,14 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl * Requirements: * * - the AP must exist. - * - the sender must have collection verifier role. + * - the sender must have the token controller role. * */ function setAccessPointContentVerify( string memory apName, bool verified - ) public requireAP(apName) requireCollectionRole(CollectionRoles.Verifier) { - _accessPoints[apName].contentVerified = verified; - emit ChangeAccessPointContentVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender); + ) public requireCollectionRole(CollectionRoles.Verifier) { + _setAccessPointContentVerify(apName, verified); } /** @@ -623,56 +506,14 @@ contract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, Fl * Requirements: * * - the AP must exist. - * - the sender must have collection verifier role. + * - the sender must have the token controller role. * */ function setAccessPointNameVerify( string memory apName, bool verified - ) public requireAP(apName) requireCollectionRole(CollectionRoles.Verifier) { - _accessPoints[apName].nameVerified = verified; - emit ChangeAccessPointNameVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender); - } - - /** - * @dev 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. - * - */ - function setTokenBuild( - uint256 tokenId, - string memory _commitHash, - string memory _gitRepository - ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) { - _requireMinted(tokenId); - _apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(_commitHash, _gitRepository); - emit MetadataUpdate(tokenId, "build", [_commitHash, _gitRepository], msg.sender); - } - - /** - * @dev 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. - * - */ - function burn(uint256 tokenId) public virtual requireTokenOwner(tokenId) { - super._burn(tokenId); - - if (bytes(_apps[tokenId].externalURL).length != 0) { - delete _apps[tokenId]; - } + ) public requireCollectionRole(CollectionRoles.Verifier) { + _setAccessPointNameVerify(apName, verified); } /*////////////////////////////////////////////////////////////// diff --git a/contracts/contracts/IERCX.sol b/contracts/contracts/IERCX.sol new file mode 100644 index 00000000..c41c62fa --- /dev/null +++ b/contracts/contracts/IERCX.sol @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.7; + +import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; + +/** + * @title ERCX Interface + * @author + * @notice + * + * ERCX is a standard for NFTs that represent websites. It is a standard that + * allows for the storage of metadata about a website, and allows for the + * storage of multiple builds of a website. This allows for the NFT to be + * used as a way to store the history of a website. + */ +interface IERCX { + /** + * Event emitted when a token's metadata is updated. + * @param _tokenId the updated token id. + * @param key which metadata key was updated + * @param value the new value of the metadata + * @param triggeredBy the address that triggered the update + */ + 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); + + /** + * The metadata that is stored for each build. + */ + struct Build { + string commitHash; + string gitRepository; + } + + /** + * The properties are stored as string to keep consistency with + * other token contracts, we might consider changing for bytes32 + * in the future due to gas optimization. + */ + struct Token { + string name; // Name of the site + string description; // Description about the site + string externalURL; // Site URL + string ENS; // ENS for the site + string logo; // Branding logo + uint24 color; // Branding color + uint256 currentBuild; // The current build number (Increments by one with each change, starts at zero) + mapping(uint256 => Build) builds; // Mapping to build details for each build number + } + + /** + * @dev Mints a token and returns a tokenId. + */ + function mint( + address to, + string memory name, + string memory description, + string memory externalURL, + string memory ENS, + string memory commitHash, + string memory gitRepository, + string memory logo, + uint24 color + ) external payable returns (uint256); + + /** + * @dev Sets a minted token's external URL. + */ + function setTokenExternalURL(uint256 tokenId, string memory _tokenExternalURL) external; + + /** + * @dev Sets a minted token's ENS. + */ + function setTokenENS(uint256 tokenId, string memory _tokenENS) external; + + /** + * @dev Sets a minted token's name. + */ + function setTokenName(uint256 tokenId, string memory _tokenName) external; + + /** + * @dev Sets a minted token's description. + */ + function setTokenDescription(uint256 tokenId, string memory _tokenDescription) external; + + /** + * @dev Sets a minted token's logo. + */ + function setTokenLogo(uint256 tokenId, string memory _tokenLogo) external; + + /** + * @dev Sets a minted token's color. + */ + function setTokenColor(uint256 tokenId, uint24 _tokenColor) external; + + /** + * @dev Sets a minted token's build. + */ + function setTokenBuild(uint256 tokenId, string memory commitHash, string memory gitRepository) external; + + /** + * @dev Returns the token metadata for a given tokenId. + * It must return a valid JSON object in string format encoded in Base64. + */ + function tokenURI(uint256 tokenId) external returns (string memory); +} diff --git a/contracts/contracts/util/FleekSVG.sol b/contracts/contracts/util/FleekSVG.sol index b0c1d086..566f63b1 100644 --- a/contracts/contracts/util/FleekSVG.sol +++ b/contracts/contracts/util/FleekSVG.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.7; -import "../FleekERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; diff --git a/contracts/contracts/util/FleekStrings.sol b/contracts/contracts/util/FleekStrings.sol index d959f469..6728fe16 100644 --- a/contracts/contracts/util/FleekStrings.sol +++ b/contracts/contracts/util/FleekStrings.sol @@ -2,10 +2,11 @@ pragma solidity ^0.8.7; -import "../FleekERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; import "./FleekSVG.sol"; +import "../IERCX.sol"; +import "../FleekAccessPoints.sol"; library FleekStrings { using Strings for uint256; @@ -29,10 +30,14 @@ library FleekStrings { } /** - * @dev Converts FleekERC721.App to a JSON string. + * @dev Converts IERCX.Token to a JSON string. * It requires to receive owner address as a parameter. */ - function toString(FleekERC721.App storage app, address owner) internal view returns (string memory) { + function toString( + IERCX.Token storage app, + address owner, + bool accessPointAutoApproval + ) internal view returns (string memory) { // prettier-ignore return string(abi.encodePacked( '{', @@ -41,7 +46,7 @@ library FleekStrings { '"owner":"', uint160(owner).toHexString(20), '",', '"external_url":"', app.externalURL, '",', '"image":"', FleekSVG.generateBase64(app.name, app.ENS, app.logo, app.color.toColorString()), '",', - '"access_point_auto_approval":',app.accessPointAutoApproval.toString(),',', + '"access_point_auto_approval":', accessPointAutoApproval.toString(),',', '"attributes": [', '{"trait_type": "ENS", "value":"', app.ENS,'"},', '{"trait_type": "Commit Hash", "value":"', app.builds[app.currentBuild].commitHash,'"},', @@ -54,9 +59,9 @@ library FleekStrings { } /** - * @dev Converts FleekERC721.AccessPoint to a JSON string. + * @dev Converts FleekAccessPoints.AccessPoint to a JSON string. */ - function toString(FleekERC721.AccessPoint storage ap) internal view returns (string memory) { + function toString(FleekAccessPoints.AccessPoint storage ap) internal view returns (string memory) { // prettier-ignore return string(abi.encodePacked( "{", diff --git a/contracts/scripts/mint.js b/contracts/scripts/mint.js index 36698098..bd93a023 100644 --- a/contracts/scripts/mint.js +++ b/contracts/scripts/mint.js @@ -91,7 +91,9 @@ const mintTo = '0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049'; console.log('SVG length: ', params[params.length - 1].length); params.push(await getSVGColor(svgPath)); - const transaction = await contract.mint(...params); + const transaction = await contract[ + 'mint(address,string,string,string,string,string,string,string,uint24)' + ](...params); console.log('Response: ', transaction); })(); diff --git a/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts b/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts index 733dd632..7156891f 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts @@ -1,7 +1,12 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { Fixtures, TestConstants, Errors } from './helpers'; +import { + Fixtures, + TestConstants, + Errors, + OverloadedFunctions, +} from './helpers'; const { Billing, MintParams } = TestConstants; @@ -12,7 +17,7 @@ describe('FleekERC721.Billing', () => { const mint = (value?: any) => { const { contract, owner } = fixture; - return contract.mint( + return contract[OverloadedFunctions.Mint.Default]( owner.address, MintParams.name, MintParams.description, @@ -22,7 +27,6 @@ describe('FleekERC721.Billing', () => { MintParams.gitRepository, MintParams.logo, MintParams.color, - MintParams.accessPointAutoApprovalSettings, { value } ); }; diff --git a/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts b/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts index 2685c8d9..a278d3db 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts @@ -1,6 +1,11 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { TestConstants, Fixtures, Errors } from './helpers'; +import { + TestConstants, + Fixtures, + Errors, + OverloadedFunctions, +} from './helpers'; const { CollectionRoles } = TestConstants; @@ -179,7 +184,7 @@ describe('FleekERC721.CollectionRoles', () => { it('should not be able to verify access point if not verifier', async () => { const { contract, otherAccount } = fixture; - await contract.mint( + await contract[OverloadedFunctions.Mint.Default]( otherAccount.address, TestConstants.MintParams.name, TestConstants.MintParams.description, @@ -188,8 +193,7 @@ describe('FleekERC721.CollectionRoles', () => { TestConstants.MintParams.commitHash, TestConstants.MintParams.gitRepository, TestConstants.MintParams.logo, - TestConstants.MintParams.color, - TestConstants.MintParams.accessPointAutoApprovalSettings + TestConstants.MintParams.color ); await contract.addAccessPoint(0, 'random.com'); diff --git a/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts b/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts index 06e792ac..de0d1032 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts @@ -1,15 +1,17 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { TestConstants, Fixtures, Errors } from './helpers'; -import { ethers } from 'hardhat'; - -const { MintParams, Roles } = TestConstants; +import { + TestConstants, + Fixtures, + Errors, + OverloadedFunctions, +} from './helpers'; describe('FleekERC721.GetLastTokenId', () => { let fixture: Awaited>; const mint = async () => { - const response = await fixture.contract.mint( + const response = await fixture.contract[OverloadedFunctions.Mint.Default]( fixture.owner.address, TestConstants.MintParams.name, TestConstants.MintParams.description, @@ -18,8 +20,7 @@ describe('FleekERC721.GetLastTokenId', () => { TestConstants.MintParams.commitHash, TestConstants.MintParams.gitRepository, TestConstants.MintParams.logo, - TestConstants.MintParams.color, - false + TestConstants.MintParams.color ); return response; diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts index 99158c28..fda52cf4 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts @@ -1,5 +1,6 @@ import { ethers, upgrades } from 'hardhat'; import { TestConstants } from './constants'; +import { OverloadedFunctions } from './overloaded-functions'; export abstract class Fixtures { static async paused() {} @@ -35,7 +36,9 @@ export abstract class Fixtures { static async withMint() { const fromDefault = await Fixtures.default(); - const response = await fromDefault.contract.mint( + const response = await fromDefault.contract[ + OverloadedFunctions.Mint.Default + ]( fromDefault.owner.address, TestConstants.MintParams.name, TestConstants.MintParams.description, @@ -44,8 +47,7 @@ export abstract class Fixtures { TestConstants.MintParams.commitHash, TestConstants.MintParams.gitRepository, TestConstants.MintParams.logo, - TestConstants.MintParams.color, - TestConstants.MintParams.accessPointAutoApprovalSettings + TestConstants.MintParams.color ); const tokenId = response.value.toNumber(); diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts index 650cdb03..9209e635 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts @@ -3,3 +3,4 @@ export * from './fixture'; export * from './utils'; export * from './errors'; export * from './events'; +export * from './overloaded-functions'; diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts new file mode 100644 index 00000000..a4f9d629 --- /dev/null +++ b/contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts @@ -0,0 +1,8 @@ +export const OverloadedFunctions = Object.freeze({ + Mint: { + Default: + 'mint(address,string,string,string,string,string,string,string,uint24)', + WithAPAutoApproval: + 'mint(address,string,string,string,string,string,string,string,uint24,bool)', + }, +}); diff --git a/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts b/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts index 4a266b1f..0afa770a 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts @@ -1,15 +1,15 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { TestConstants, Fixtures, Errors } from './helpers'; +import { TestConstants, Fixtures, OverloadedFunctions } from './helpers'; import { ethers } from 'hardhat'; -const { MintParams, CollectionRoles } = TestConstants; +const { MintParams } = TestConstants; describe('FleekERC721.Minting', () => { it('should be able to mint a new token', async () => { const { owner, contract } = await loadFixture(Fixtures.default); - const response = await contract.mint( + const response = await contract[OverloadedFunctions.Mint.Default]( owner.address, MintParams.name, MintParams.description, @@ -18,8 +18,7 @@ describe('FleekERC721.Minting', () => { MintParams.commitHash, MintParams.gitRepository, MintParams.logo, - MintParams.color, - MintParams.accessPointAutoApprovalSettings + MintParams.color ); expect(response.value).to.be.instanceOf(ethers.BigNumber); @@ -31,7 +30,7 @@ describe('FleekERC721.Minting', () => { Fixtures.default ); - const response = await contract.mint( + const response = await contract[OverloadedFunctions.Mint.Default]( owner.address, MintParams.name, MintParams.description, @@ -40,8 +39,7 @@ describe('FleekERC721.Minting', () => { MintParams.commitHash, MintParams.gitRepository, MintParams.logo, - MintParams.color, - MintParams.accessPointAutoApprovalSettings + MintParams.color ); const tokenId = response.value.toNumber(); diff --git a/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts b/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts index bf45d0d5..1d52c367 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts @@ -1,6 +1,11 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { TestConstants, Fixtures, Errors } from './helpers'; +import { + TestConstants, + Fixtures, + Errors, + OverloadedFunctions, +} from './helpers'; const { MintParams, CollectionRoles, TokenRoles } = TestConstants; @@ -10,7 +15,7 @@ describe('FleekERC721.Pausable', () => { const mint = () => { const { owner, contract } = fixture; - return contract.mint( + return contract[OverloadedFunctions.Mint.Default]( owner.address, MintParams.name, MintParams.description, @@ -19,8 +24,7 @@ describe('FleekERC721.Pausable', () => { MintParams.commitHash, MintParams.gitRepository, MintParams.logo, - MintParams.color, - false + MintParams.color ); }; diff --git a/subgraph/src/fleek-nfa.ts b/subgraph/src/fleek-nfa.ts index f5263d74..3b23e90c 100644 --- a/subgraph/src/fleek-nfa.ts +++ b/subgraph/src/fleek-nfa.ts @@ -25,7 +25,7 @@ import { NewAccessPoint as NewAccessPointEvent, ChangeAccessPointNameVerify as ChangeAccessPointNameVerifyEvent, ChangeAccessPointContentVerify as ChangeAccessPointContentVerifyEvent, - TokenRolesCleared as TokenRolesClearedEvent + TokenRolesCleared as TokenRolesClearedEvent, } from '../generated/FleekNFA/FleekNFA'; // Entity Imports [based on the schema] diff --git a/subgraph/tests/matchstick/.latest.json b/subgraph/tests/matchstick/.latest.json index 2949e777..1d88be34 100644 --- a/subgraph/tests/matchstick/.latest.json +++ b/subgraph/tests/matchstick/.latest.json @@ -1,4 +1,4 @@ { "version": "0.5.4", "timestamp": 1678390993500 -} \ No newline at end of file +} diff --git a/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts b/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts index e35f90b2..ef4ba96d 100644 --- a/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts +++ b/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts @@ -7,7 +7,13 @@ import { afterAll, } from 'matchstick-as/assembly/index'; import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { createNewCollectionRoleChanged, handleCollectionRoleChangedList, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; +import { + createNewCollectionRoleChanged, + handleCollectionRoleChangedList, + makeEventId, + USER_ONE, + USER_TWO, +} from '../helpers/utils'; import { CollectionRoleChanged } from '../../../generated/FleekNFA/FleekNFA'; describe('Collection Role Changed tests', () => { @@ -16,14 +22,13 @@ describe('Collection Role Changed tests', () => { let collectionRoleChangedList: CollectionRoleChanged[] = []; collectionRoleChangedList.push( - createNewCollectionRoleChanged(0, 0, USER_ONE, true, USER_TWO) // User Two grants collection owner access to User One + createNewCollectionRoleChanged(0, 0, USER_ONE, true, USER_TWO) // User Two grants collection owner access to User One ); collectionRoleChangedList.push( createNewCollectionRoleChanged(2, 0, USER_ONE, false, USER_TWO) // User Two revokes the owner access of User One to the collection ); - handleCollectionRoleChangedList(collectionRoleChangedList); }); @@ -33,18 +38,8 @@ describe('Collection Role Changed tests', () => { describe('Assertions', () => { test('Check the `role` field of each CollectionRoleChanged event entity', () => { - assert.fieldEquals( - 'CollectionRoleChanged', - makeEventId(0), - 'role', - '0' - ); - assert.fieldEquals( - 'CollectionRoleChanged', - makeEventId(2), - 'role', - '0' - ); + assert.fieldEquals('CollectionRoleChanged', makeEventId(0), 'role', '0'); + assert.fieldEquals('CollectionRoleChanged', makeEventId(2), 'role', '0'); }); test('Check the `toAddress` field of each CollectionRoleChanged event entity', () => { @@ -78,18 +73,8 @@ describe('Collection Role Changed tests', () => { }); test('Check the `status` field of each CollectionRoleChanged event entity', () => { - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(0), - 'status', - 'true' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(2), - 'status', - 'false' - ); + assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'status', 'true'); + assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'status', 'false'); }); }); -}); \ No newline at end of file +}); diff --git a/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts b/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts index f3842c5d..e0e6fdd6 100644 --- a/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts +++ b/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts @@ -7,7 +7,13 @@ import { afterAll, } from 'matchstick-as/assembly/index'; import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { createNewTokenRoleChanged, handleTokenRoleChangedList, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; +import { + createNewTokenRoleChanged, + handleTokenRoleChangedList, + makeEventId, + USER_ONE, + USER_TWO, +} from '../helpers/utils'; import { TokenRoleChanged } from '../../../generated/FleekNFA/FleekNFA'; describe('Token Role Changed tests', () => { @@ -16,18 +22,38 @@ describe('Token Role Changed tests', () => { let tokenRoleChangedList: TokenRoleChanged[] = []; tokenRoleChangedList.push( - createNewTokenRoleChanged(0, BigInt.fromI32(0), 0, USER_ONE, true, USER_TWO) // User Two gives User One controller access to TokenId 0 + createNewTokenRoleChanged( + 0, + BigInt.fromI32(0), + 0, + USER_ONE, + true, + USER_TWO + ) // User Two gives User One controller access to TokenId 0 ); tokenRoleChangedList.push( - createNewTokenRoleChanged(1, BigInt.fromI32(1), 0, USER_TWO, true, USER_ONE) // User One gives User Two controller access to TokenId 1 + createNewTokenRoleChanged( + 1, + BigInt.fromI32(1), + 0, + USER_TWO, + true, + USER_ONE + ) // User One gives User Two controller access to TokenId 1 ); tokenRoleChangedList.push( - createNewTokenRoleChanged(2, BigInt.fromI32(0), 0, USER_ONE, false, USER_TWO) // User Two revokes the controller access of User One to tokenId 0 + createNewTokenRoleChanged( + 2, + BigInt.fromI32(0), + 0, + USER_ONE, + false, + USER_TWO + ) // User Two revokes the controller access of User One to tokenId 0 ); - handleTokenRoleChangedList(tokenRoleChangedList); }); @@ -37,44 +63,14 @@ describe('Token Role Changed tests', () => { describe('Assertions', () => { test('Check the `tokenId` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(0), - 'tokenId', - '0' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(1), - 'tokenId', - '1' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(2), - 'tokenId', - '0' - ); + assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'tokenId', '0'); + assert.fieldEquals('TokenRoleChanged', makeEventId(1), 'tokenId', '1'); + assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'tokenId', '0'); }); test('Check the `role` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(0), - 'role', - '0' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(1), - 'role', - '0' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(2), - 'role', - '0' - ); + assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'role', '0'); + assert.fieldEquals('TokenRoleChanged', makeEventId(1), 'role', '0'); + assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'role', '0'); }); test('Check the `toAddress` field of each TokenRoleChanged event entity', () => { @@ -120,24 +116,9 @@ describe('Token Role Changed tests', () => { }); test('Check the `status` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(0), - 'status', - 'true' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(1), - 'status', - 'true' - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(2), - 'status', - 'false' - ); + assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'status', 'true'); + assert.fieldEquals('TokenRoleChanged', makeEventId(1), 'status', 'true'); + assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'status', 'false'); }); }); -}); \ No newline at end of file +}); diff --git a/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts b/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts index c0afcc4f..777fb60e 100644 --- a/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts +++ b/subgraph/tests/matchstick/access-points/changeAccessPointCreationStatus.test.ts @@ -1,98 +1,115 @@ import { - assert, - describe, - test, - clearStore, - beforeAll, - afterAll, - } from 'matchstick-as/assembly/index'; - import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { createNewAccessPointEvent, createNewChangeAccessPointCreationStatus, handleChangeAccessPointCreationStatusList, handleNewAccessPoints, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; -import { ChangeAccessPointCreationStatus, NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, +} from 'matchstick-as/assembly/index'; +import { BigInt, Bytes } from '@graphprotocol/graph-ts'; +import { + createNewAccessPointEvent, + createNewChangeAccessPointCreationStatus, + handleChangeAccessPointCreationStatusList, + handleNewAccessPoints, + makeEventId, + USER_ONE, + USER_TWO, +} from '../helpers/utils'; +import { + ChangeAccessPointCreationStatus, + NewAccessPoint, +} from '../../../generated/FleekNFA/FleekNFA'; describe('Change Access Point Creation Status tests', () => { - beforeAll(() => { + beforeAll(() => { + // New Access Points + let newAccessPoints: NewAccessPoint[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + newAccessPoints.push( + createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + ); + newAccessPoints.push( + createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + ); + + // User Two has one access point for tokenId 0 + newAccessPoints.push( + createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + ); + handleNewAccessPoints(newAccessPoints); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the `creationStatus` field of each access point entity', () => { + assert.fieldEquals('AccessPoint', 'firstAP', 'creationStatus', 'DRAFT'); + assert.fieldEquals('AccessPoint', 'secondAP', 'creationStatus', 'DRAFT'); + assert.fieldEquals('AccessPoint', 'thirdAP', 'creationStatus', 'DRAFT'); + }); + + test('Check the `creationStatus` field of each access point entity after changing it', () => { // New Access Points - let newAccessPoints: NewAccessPoint[] = []; + let changeAccessPointCreationStatusList: ChangeAccessPointCreationStatus[] = + []; // User One has two access points: one for tokenId 0 and one for tokenId 1 - newAccessPoints.push( - createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + changeAccessPointCreationStatusList.push( + createNewChangeAccessPointCreationStatus( + 0, + 'firstAP', + BigInt.fromI32(0), + 1, + USER_ONE + ) ); - newAccessPoints.push( - createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + changeAccessPointCreationStatusList.push( + createNewChangeAccessPointCreationStatus( + 0, + 'secondAP', + BigInt.fromI32(1), + 1, + USER_ONE + ) ); // User Two has one access point for tokenId 0 - newAccessPoints.push( - createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + changeAccessPointCreationStatusList.push( + createNewChangeAccessPointCreationStatus( + 0, + 'thirdAP', + BigInt.fromI32(0), + 1, + USER_TWO + ) ); - handleNewAccessPoints(newAccessPoints); - }); - - afterAll(() => { - clearStore(); - }); - - describe('Assertions', () => { - test('Check the `creationStatus` field of each access point entity', () => { - assert.fieldEquals( - 'AccessPoint', - 'firstAP', - 'creationStatus', - 'DRAFT' - ); - assert.fieldEquals( - 'AccessPoint', - 'secondAP', - 'creationStatus', - 'DRAFT' - ); - assert.fieldEquals( - 'AccessPoint', - 'thirdAP', - 'creationStatus', - 'DRAFT' - ); - }); - test('Check the `creationStatus` field of each access point entity after changing it', () => { - // New Access Points - let changeAccessPointCreationStatusList: ChangeAccessPointCreationStatus[] = []; - - // User One has two access points: one for tokenId 0 and one for tokenId 1 - changeAccessPointCreationStatusList.push( - createNewChangeAccessPointCreationStatus(0, 'firstAP', BigInt.fromI32(0), 1, USER_ONE) - ); - changeAccessPointCreationStatusList.push( - createNewChangeAccessPointCreationStatus(0, 'secondAP', BigInt.fromI32(1), 1, USER_ONE) - ); - - // User Two has one access point for tokenId 0 - changeAccessPointCreationStatusList.push( - createNewChangeAccessPointCreationStatus(0, 'thirdAP', BigInt.fromI32(0), 1, USER_TWO) - ); - - handleChangeAccessPointCreationStatusList(changeAccessPointCreationStatusList); + handleChangeAccessPointCreationStatusList( + changeAccessPointCreationStatusList + ); - assert.fieldEquals( - 'AccessPoint', - 'firstAP', - 'creationStatus', - 'APPROVED' - ); - assert.fieldEquals( - 'AccessPoint', - 'secondAP', - 'creationStatus', - 'APPROVED' - ); - assert.fieldEquals( - 'AccessPoint', - 'thirdAP', - 'creationStatus', - 'APPROVED' - ); - }); + assert.fieldEquals( + 'AccessPoint', + 'firstAP', + 'creationStatus', + 'APPROVED' + ); + assert.fieldEquals( + 'AccessPoint', + 'secondAP', + 'creationStatus', + 'APPROVED' + ); + assert.fieldEquals( + 'AccessPoint', + 'thirdAP', + 'creationStatus', + 'APPROVED' + ); }); -}); \ No newline at end of file + }); +}); diff --git a/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts b/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts index d509fe36..87355c10 100644 --- a/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts +++ b/subgraph/tests/matchstick/access-points/changeAccessPointNameVerify.test.ts @@ -1,96 +1,94 @@ import { - assert, - describe, - test, - clearStore, - beforeAll, - afterAll, - } from 'matchstick-as/assembly/index'; - import { BigInt } from '@graphprotocol/graph-ts'; -import { createNewAccessPointEvent, createNewChangeAccessPointNameVerify, handleChangeAccessPointNameVerifies, handleNewAccessPoints, USER_ONE, USER_TWO } from '../helpers/utils'; -import { ChangeAccessPointNameVerify, NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, +} from 'matchstick-as/assembly/index'; +import { BigInt } from '@graphprotocol/graph-ts'; +import { + createNewAccessPointEvent, + createNewChangeAccessPointNameVerify, + handleChangeAccessPointNameVerifies, + handleNewAccessPoints, + USER_ONE, + USER_TWO, +} from '../helpers/utils'; +import { + ChangeAccessPointNameVerify, + NewAccessPoint, +} from '../../../generated/FleekNFA/FleekNFA'; describe('Change Access Point Name Verify tests', () => { - beforeAll(() => { - // New Access Points - let newAccessPoints: NewAccessPoint[] = []; + beforeAll(() => { + // New Access Points + let newAccessPoints: NewAccessPoint[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + newAccessPoints.push( + createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + ); + newAccessPoints.push( + createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + ); - // User One has two access points: one for tokenId 0 and one for tokenId 1 - newAccessPoints.push( - createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + // User Two has one access point for tokenId 0 + newAccessPoints.push( + createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + ); + handleNewAccessPoints(newAccessPoints); + }); + + afterAll(() => { + clearStore(); + }); + + describe('Assertions', () => { + test('Check the `nameVerified` field of each access point entity', () => { + assert.fieldEquals('AccessPoint', 'firstAP', 'nameVerified', 'false'); + assert.fieldEquals('AccessPoint', 'secondAP', 'nameVerified', 'false'); + assert.fieldEquals('AccessPoint', 'thirdAP', 'nameVerified', 'false'); + }); + + test('Check the `nameVerified` field of each access point entity after changing it', () => { + // New Access Point Name Verified fields + let changeAccessPointNameVerifies: ChangeAccessPointNameVerify[] = []; + + changeAccessPointNameVerifies.push( + createNewChangeAccessPointNameVerify( + 0, + 'firstAP', + BigInt.fromI32(0), + true, + USER_ONE + ) ); - newAccessPoints.push( - createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + changeAccessPointNameVerifies.push( + createNewChangeAccessPointNameVerify( + 0, + 'secondAP', + BigInt.fromI32(1), + true, + USER_ONE + ) ); - // User Two has one access point for tokenId 0 - newAccessPoints.push( - createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + changeAccessPointNameVerifies.push( + createNewChangeAccessPointNameVerify( + 0, + 'thirdAP', + BigInt.fromI32(0), + true, + USER_TWO + ) ); - handleNewAccessPoints(newAccessPoints); - }); - - afterAll(() => { - clearStore(); - }); - - describe('Assertions', () => { - test('Check the `nameVerified` field of each access point entity', () => { - assert.fieldEquals( - 'AccessPoint', - 'firstAP', - 'nameVerified', - 'false' - ); - assert.fieldEquals( - 'AccessPoint', - 'secondAP', - 'nameVerified', - 'false' - ); - assert.fieldEquals( - 'AccessPoint', - 'thirdAP', - 'nameVerified', - 'false' - ); - }); - - test('Check the `nameVerified` field of each access point entity after changing it', () => { - // New Access Point Name Verified fields - let changeAccessPointNameVerifies: ChangeAccessPointNameVerify[] = []; - - changeAccessPointNameVerifies.push( - createNewChangeAccessPointNameVerify(0, 'firstAP', BigInt.fromI32(0), true, USER_ONE) - ); - changeAccessPointNameVerifies.push( - createNewChangeAccessPointNameVerify(0, 'secondAP', BigInt.fromI32(1), true, USER_ONE) - ); - changeAccessPointNameVerifies.push( - createNewChangeAccessPointNameVerify(0, 'thirdAP', BigInt.fromI32(0), true, USER_TWO) - ); - - handleChangeAccessPointNameVerifies(changeAccessPointNameVerifies); + handleChangeAccessPointNameVerifies(changeAccessPointNameVerifies); - assert.fieldEquals( - 'AccessPoint', - 'firstAP', - 'nameVerified', - 'true' - ); - assert.fieldEquals( - 'AccessPoint', - 'secondAP', - 'nameVerified', - 'true' - ); - assert.fieldEquals( - 'AccessPoint', - 'thirdAP', - 'nameVerified', - 'true' - ); - }); + assert.fieldEquals('AccessPoint', 'firstAP', 'nameVerified', 'true'); + assert.fieldEquals('AccessPoint', 'secondAP', 'nameVerified', 'true'); + assert.fieldEquals('AccessPoint', 'thirdAP', 'nameVerified', 'true'); }); -}); \ No newline at end of file + }); +}); diff --git a/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts b/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts index 1562e9b9..aaaf06ce 100644 --- a/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts +++ b/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts @@ -1,109 +1,100 @@ import { - assert, - describe, - test, - clearStore, - beforeAll, - afterAll, - } from 'matchstick-as/assembly/index'; - import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { createNewAccessPointEvent, handleNewAccessPoints, makeEventId, USER_ONE, USER_TWO } from '../helpers/utils'; + assert, + describe, + test, + clearStore, + beforeAll, + afterAll, +} from 'matchstick-as/assembly/index'; +import { BigInt, Bytes } from '@graphprotocol/graph-ts'; +import { + createNewAccessPointEvent, + handleNewAccessPoints, + makeEventId, + USER_ONE, + USER_TWO, +} from '../helpers/utils'; import { NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; describe('New Access Point tests', () => { - beforeAll(() => { - // New Access Points - let newAccessPoints: NewAccessPoint[] = []; + beforeAll(() => { + // New Access Points + let newAccessPoints: NewAccessPoint[] = []; + + // User One has two access points: one for tokenId 0 and one for tokenId 1 + newAccessPoints.push( + createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + ); + newAccessPoints.push( + createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + ); + + // User Two has one access point for tokenId 0 + newAccessPoints.push( + createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + ); + handleNewAccessPoints(newAccessPoints); + }); + + afterAll(() => { + clearStore(); + }); - // User One has two access points: one for tokenId 0 and one for tokenId 1 - newAccessPoints.push( - createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) + describe('Assertions', () => { + test('Check the number of `NewAccessPoint` events to be valid', () => { + assert.entityCount('NewAccessPoint', 3); + }); + + test('Check the `apName` field of each event', () => { + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(0), + 'apName', + 'firstAP'.toString() ); - newAccessPoints.push( - createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(1), + 'apName', + 'secondAP'.toString() ); - - // User Two has one access point for tokenId 0 - newAccessPoints.push( - createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(2), + 'apName', + 'thirdAP'.toString() ); - handleNewAccessPoints(newAccessPoints); }); - - afterAll(() => { - clearStore(); - }); - - describe('Assertions', () => { - test('Check the number of `NewAccessPoint` events to be valid', () => { - assert.entityCount('NewAccessPoint', 3); - }); - - test('Check the `apName` field of each event', () => { - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(0), - 'apName', - 'firstAP'.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(1), - 'apName', - 'secondAP'.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(2), - 'apName', - 'thirdAP'.toString() - ); - }); - test('Check the `tokenId` field of each event', () => { - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(0), - 'tokenId', - '0' - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(1), - 'tokenId', - '1' - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(2), - 'tokenId', - '0' - ); - }); + test('Check the `tokenId` field of each event', () => { + assert.fieldEquals('NewAccessPoint', makeEventId(0), 'tokenId', '0'); + assert.fieldEquals('NewAccessPoint', makeEventId(1), 'tokenId', '1'); + assert.fieldEquals('NewAccessPoint', makeEventId(2), 'tokenId', '0'); + }); - test('Check the `owner` field of each event', () => { - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(0), - 'owner', - USER_ONE.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(1), - 'owner', - USER_ONE.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(2), - 'owner', - USER_TWO.toString() - ); - }); + test('Check the `owner` field of each event', () => { + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(0), + 'owner', + USER_ONE.toString() + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(1), + 'owner', + USER_ONE.toString() + ); + assert.fieldEquals( + 'NewAccessPoint', + makeEventId(2), + 'owner', + USER_TWO.toString() + ); + }); - test('check the existence of a nonexistent event in the database', () => { - assert.notInStore('NewAccessPoint', makeEventId(3)); - }); + test('check the existence of a nonexistent event in the database', () => { + assert.notInStore('NewAccessPoint', makeEventId(3)); }); -}); \ No newline at end of file + }); +}); diff --git a/subgraph/tests/matchstick/helpers/utils.ts b/subgraph/tests/matchstick/helpers/utils.ts index 58eae791..18aaf069 100644 --- a/subgraph/tests/matchstick/helpers/utils.ts +++ b/subgraph/tests/matchstick/helpers/utils.ts @@ -10,7 +10,7 @@ import { ChangeAccessPointNameVerify, TokenRoleChanged, CollectionRoleChanged, - TokenRolesCleared + TokenRolesCleared, } from '../../../generated/FleekNFA/FleekNFA'; import { handleApproval, @@ -198,10 +198,7 @@ export function createNewAccessPointEvent( ); newAccessPoint.parameters.push( - new ethereum.EventParam( - 'owner', - ethereum.Value.fromAddress(owner) - ) + new ethereum.EventParam('owner', ethereum.Value.fromAddress(owner)) ); newAccessPoint.transaction.hash = Bytes.fromI32(event_count); @@ -217,7 +214,8 @@ export function createNewChangeAccessPointCreationStatus( status: i32, triggeredBy: Address ): ChangeAccessPointCreationStatus { - let changeAccessPointCreationStatus = changetype(newMockEvent()); + let changeAccessPointCreationStatus = + changetype(newMockEvent()); changeAccessPointCreationStatus.parameters = new Array(); @@ -236,10 +234,7 @@ export function createNewChangeAccessPointCreationStatus( ); changeAccessPointCreationStatus.parameters.push( - new ethereum.EventParam( - 'creationStatus', - ethereum.Value.fromI32(status) - ) + new ethereum.EventParam('creationStatus', ethereum.Value.fromI32(status)) ); changeAccessPointCreationStatus.parameters.push( @@ -262,7 +257,9 @@ export function createNewChangeAccessPointNameVerify( verified: boolean, triggeredBy: Address ): ChangeAccessPointNameVerify { - let changeAccessPointNameVerify = changetype(newMockEvent()); + let changeAccessPointNameVerify = changetype( + newMockEvent() + ); changeAccessPointNameVerify.parameters = new Array(); @@ -281,10 +278,7 @@ export function createNewChangeAccessPointNameVerify( ); changeAccessPointNameVerify.parameters.push( - new ethereum.EventParam( - 'verified', - ethereum.Value.fromBoolean(verified) - ) + new ethereum.EventParam('verified', ethereum.Value.fromBoolean(verified)) ); changeAccessPointNameVerify.parameters.push( @@ -320,31 +314,19 @@ export function createNewTokenRoleChanged( ); tokenRoleChanged.parameters.push( - new ethereum.EventParam( - 'role', - ethereum.Value.fromI32(role) - ) + new ethereum.EventParam('role', ethereum.Value.fromI32(role)) ); tokenRoleChanged.parameters.push( - new ethereum.EventParam( - 'toAddress', - ethereum.Value.fromAddress(toAddress) - ) + new ethereum.EventParam('toAddress', ethereum.Value.fromAddress(toAddress)) ); tokenRoleChanged.parameters.push( - new ethereum.EventParam( - 'status', - ethereum.Value.fromBoolean(status) - ) + new ethereum.EventParam('status', ethereum.Value.fromBoolean(status)) ); tokenRoleChanged.parameters.push( - new ethereum.EventParam( - 'byAddress', - ethereum.Value.fromAddress(byAddress) - ) + new ethereum.EventParam('byAddress', ethereum.Value.fromAddress(byAddress)) ); tokenRoleChanged.transaction.hash = Bytes.fromI32(event_count); @@ -365,31 +347,19 @@ export function createNewCollectionRoleChanged( collectionRoleChanged.parameters = new Array(); collectionRoleChanged.parameters.push( - new ethereum.EventParam( - 'role', - ethereum.Value.fromI32(role) - ) + new ethereum.EventParam('role', ethereum.Value.fromI32(role)) ); collectionRoleChanged.parameters.push( - new ethereum.EventParam( - 'toAddress', - ethereum.Value.fromAddress(toAddress) - ) + new ethereum.EventParam('toAddress', ethereum.Value.fromAddress(toAddress)) ); collectionRoleChanged.parameters.push( - new ethereum.EventParam( - 'status', - ethereum.Value.fromBoolean(status) - ) + new ethereum.EventParam('status', ethereum.Value.fromBoolean(status)) ); collectionRoleChanged.parameters.push( - new ethereum.EventParam( - 'byAddress', - ethereum.Value.fromAddress(byAddress) - ) + new ethereum.EventParam('byAddress', ethereum.Value.fromAddress(byAddress)) ); collectionRoleChanged.transaction.hash = Bytes.fromI32(event_count); @@ -400,8 +370,8 @@ export function createNewCollectionRoleChanged( export function createNewTokenRolesCleared( event_count: i32, - tokenId: BigInt, - byAddress: Address + tokenId: BigInt, + byAddress: Address ): TokenRolesCleared { let tokenRolesCleared = changetype(newMockEvent()); @@ -415,10 +385,7 @@ export function createNewTokenRolesCleared( ); tokenRolesCleared.parameters.push( - new ethereum.EventParam( - 'byAddress', - ethereum.Value.fromAddress(byAddress) - ) + new ethereum.EventParam('byAddress', ethereum.Value.fromAddress(byAddress)) ); tokenRolesCleared.transaction.hash = Bytes.fromI32(event_count); @@ -470,13 +437,17 @@ export function handleNewAccessPoints(events: NewAccessPoint[]): void { }); } -export function handleChangeAccessPointCreationStatusList(events: ChangeAccessPointCreationStatus[]): void { +export function handleChangeAccessPointCreationStatusList( + events: ChangeAccessPointCreationStatus[] +): void { events.forEach((event) => { handleChangeAccessPointCreationStatus(event); }); } -export function handleChangeAccessPointNameVerifies(events: ChangeAccessPointNameVerify[]): void { +export function handleChangeAccessPointNameVerifies( + events: ChangeAccessPointNameVerify[] +): void { events.forEach((event) => { handleChangeAccessPointNameVerify(event); }); @@ -488,7 +459,9 @@ export function handleTokenRoleChangedList(events: TokenRoleChanged[]): void { }); } -export function handleCollectionRoleChangedList(events: CollectionRoleChanged[]): void { +export function handleCollectionRoleChangedList( + events: CollectionRoleChanged[] +): void { events.forEach((event) => { handleCollectionRoleChanged(event); }); diff --git a/subgraph/tests/matchstick/owner.test.ts b/subgraph/tests/matchstick/owner.test.ts index 6303a542..089c3173 100644 --- a/subgraph/tests/matchstick/owner.test.ts +++ b/subgraph/tests/matchstick/owner.test.ts @@ -46,23 +46,13 @@ describe('Owner tests', () => { createTransferEvent(3, CONTRACT, USER_ONE, BigInt.fromI32(3)) ); transfers.push( - createTransferEvent( - 4, - USER_TWO, - USER_ONE, - BigInt.fromI32(1) - ) + createTransferEvent(4, USER_TWO, USER_ONE, BigInt.fromI32(1)) ); transfers.push( createTransferEvent(5, CONTRACT, USER_TWO, BigInt.fromI32(4)) ); transfers.push( - createTransferEvent( - 6, - USER_ONE, - USER_TWO, - BigInt.fromI32(0) - ) + createTransferEvent(6, USER_ONE, USER_TWO, BigInt.fromI32(0)) ); handleTransfers(transfers); //logStore(); diff --git a/subgraph/tests/matchstick/transfer.test.ts b/subgraph/tests/matchstick/transfer.test.ts index cf2ee948..7945226e 100644 --- a/subgraph/tests/matchstick/transfer.test.ts +++ b/subgraph/tests/matchstick/transfer.test.ts @@ -36,23 +36,13 @@ describe('Transfer tests', () => { createTransferEvent(3, CONTRACT, USER_ONE, BigInt.fromI32(3)) ); transfers.push( - createTransferEvent( - 4, - USER_TWO, - USER_ONE, - BigInt.fromI32(1) - ) + createTransferEvent(4, USER_TWO, USER_ONE, BigInt.fromI32(1)) ); transfers.push( createTransferEvent(5, CONTRACT, USER_TWO, BigInt.fromI32(4)) ); transfers.push( - createTransferEvent( - 6, - USER_ONE, - USER_TWO, - BigInt.fromI32(0) - ) + createTransferEvent(6, USER_ONE, USER_TWO, BigInt.fromI32(0)) ); handleTransfers(transfers); // logStore(); From 1eed510527c81130a259384814050209c822a4c6 Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Mon, 13 Mar 2023 11:20:53 -0500 Subject: [PATCH 13/23] styles: fix styles combobox and dropdown (#167) --- ui/README.md | 14 +++++++------- ui/src/components/core/combobox/combobox.tsx | 6 ++++-- ui/src/components/core/combobox/dropdown.tsx | 6 ++++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ui/README.md b/ui/README.md index 6b1da981..33f04463 100644 --- a/ui/README.md +++ b/ui/README.md @@ -24,6 +24,12 @@ To run the UI localy follow the steps: $ yarn ``` + This also will generate the `.graphclient` folder. Every time you do a change on the queries files, you'll have to build again that folder, to do it run: + + ```bash + $ yarn graphclient build + ``` + 3. To use ConnecKit is neccessary get an [Alchemy ID](https://alchemy.com/), so create an App and get the credentials. Then set the following .env file ```bash @@ -45,13 +51,7 @@ To run the UI localy follow the steps: Get them from the project settings on the firebase dashboard. Read [this article](https://support.google.com/firebase/answer/7015592?hl=en#zippy=%2Cin-this-article) to know how to get your porject config -4. Build the queries to run the project: - - ```bash - $ yarn graphclient build - ``` - -5. Start the local server running the app: +4. Start the local server running the app: ```bash $ yarn dev diff --git a/ui/src/components/core/combobox/combobox.tsx b/ui/src/components/core/combobox/combobox.tsx index e688b183..8ba2371d 100644 --- a/ui/src/components/core/combobox/combobox.tsx +++ b/ui/src/components/core/combobox/combobox.tsx @@ -45,8 +45,10 @@ const ComboboxInput = ({ /> selectedValue.label} onChange={handleInputChange} diff --git a/ui/src/components/core/combobox/dropdown.tsx b/ui/src/components/core/combobox/dropdown.tsx index 81d001f6..976c6cfd 100644 --- a/ui/src/components/core/combobox/dropdown.tsx +++ b/ui/src/components/core/combobox/dropdown.tsx @@ -52,8 +52,10 @@ type DropdownButtonProps = { const DropdownButton = ({ selectedValue, open }: DropdownButtonProps) => ( Date: Mon, 13 Mar 2023 14:07:37 -0300 Subject: [PATCH 14/23] feat: UI fetch mint price on contract (#166) * chore: update deployment * feat: add fleekERC721 redux state and billing states * feat: add billing price to mint flow --- contracts/.openzeppelin/polygon-mumbai.json | 457 ++++++++++++++++++ contracts/deployments/mumbai/FleekERC721.json | 267 ++++++++-- contracts/deployments/mumbai/FleekSVG.json | 12 +- contracts/deployments/mumbai/proxy.json | 4 + .../09b30b8b5b344d233b5dd0c590703447.json | 90 ++++ .../ethereum/contracts/FleekERC721.json | 267 ++++++++-- .../ethereum/hooks/ethereum-hooks.tsx | 17 +- .../integrations/ethereum/lib/fleek-erc721.ts | 26 +- .../fleek-erc721/async-thunk/fetch-billing.ts | 25 + .../fleek-erc721/async-thunk/index.ts | 1 + .../fleek-erc721/fleek-erc721-slice.ts | 68 +++ .../features/fleek-erc721/hooks/index.ts | 1 + .../hooks/use-fleek-erc721-billing.ts | 24 + ui/src/store/features/fleek-erc721/index.ts | 2 + ui/src/store/features/index.ts | 1 + ui/src/store/store.ts | 2 + ui/src/views/mint/mint.context.tsx | 7 +- .../mint/nfa-step/form-step/mint-form.tsx | 2 + 18 files changed, 1165 insertions(+), 108 deletions(-) create mode 100644 contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json create mode 100644 ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts create mode 100644 ui/src/store/features/fleek-erc721/async-thunk/index.ts create mode 100644 ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts create mode 100644 ui/src/store/features/fleek-erc721/hooks/index.ts create mode 100644 ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts create mode 100644 ui/src/store/features/fleek-erc721/index.ts diff --git a/contracts/.openzeppelin/polygon-mumbai.json b/contracts/.openzeppelin/polygon-mumbai.json index 83aaf1cf..6ed12b82 100644 --- a/contracts/.openzeppelin/polygon-mumbai.json +++ b/contracts/.openzeppelin/polygon-mumbai.json @@ -34,6 +34,11 @@ "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", "txHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", "kind": "transparent" + }, + { + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "txHash": "0x808546aa8bbc4e36c54d955970d8cfe8c4dc925eb5f65ff7b25203dd312bad4c", + "kind": "transparent" } ], "impls": { @@ -6988,6 +6993,458 @@ } } } + }, + "eb08503319f5be721686b3aa1a477f4936b7bd581264aec1f5567149b8e15ff5": { + "address": "0xc1eEFa5035898B7D33572397A263D262b449886D", + "txHash": "0x61f5b9f485cf414e467dfd2077cbe785412639c51c7631f34628d5a43f8c371e", + "layout": { + "solcVersion": "0.8.12", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:514" + }, + { + "label": "_collectionRolesCounter", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_enum(CollectionRoles)3829,t_uint256)", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:57" + }, + { + "label": "_collectionRoles", + "offset": 0, + "slot": "152", + "type": "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:62" + }, + { + "label": "_tokenRolesVersion", + "offset": 0, + "slot": "153", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:69" + }, + { + "label": "_tokenRoles", + "offset": 0, + "slot": "154", + "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))))", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:74" + }, + { + "label": "__gap", + "offset": 0, + "slot": "155", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekAccessControl", + "src": "contracts/FleekAccessControl.sol:176" + }, + { + "label": "_paused", + "offset": 0, + "slot": "204", + "type": "t_bool", + "contract": "FleekPausable", + "src": "contracts/FleekPausable.sol:23" + }, + { + "label": "_canPause", + "offset": 1, + "slot": "204", + "type": "t_bool", + "contract": "FleekPausable", + "src": "contracts/FleekPausable.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "205", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekPausable", + "src": "contracts/FleekPausable.sol:133" + }, + { + "label": "_billings", + "offset": 0, + "slot": "254", + "type": "t_mapping(t_enum(Billing)4234,t_uint256)", + "contract": "FleekBilling", + "src": "contracts/FleekBilling.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "255", + "type": "t_array(t_uint256)49_storage", + "contract": "FleekBilling", + "src": "contracts/FleekBilling.sol:81" + }, + { + "label": "_appIds", + "offset": 0, + "slot": "304", + "type": "t_uint256", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:119" + }, + { + "label": "_apps", + "offset": 0, + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(App)4585_storage)", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:120" + }, + { + "label": "_accessPoints", + "offset": 0, + "slot": "306", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)", + "contract": "FleekERC721", + "src": "contracts/FleekERC721.sol:121" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_enum(AccessPointCreationStatus)4595": { + "label": "enum FleekERC721.AccessPointCreationStatus", + "members": [ + "DRAFT", + "APPROVED", + "REJECTED", + "REMOVED" + ], + "numberOfBytes": "1" + }, + "t_enum(Billing)4234": { + "label": "enum FleekBilling.Billing", + "members": [ + "Mint", + "AddAccessPoint" + ], + "numberOfBytes": "1" + }, + "t_enum(CollectionRoles)3829": { + "label": "enum FleekAccessControl.CollectionRoles", + "members": [ + "Owner" + ], + "numberOfBytes": "1" + }, + "t_enum(TokenRoles)3831": { + "label": "enum FleekAccessControl.TokenRoles", + "members": [ + "Controller" + ], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(Billing)4234,t_uint256)": { + "label": "mapping(enum FleekBilling.Billing => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { + "label": "mapping(enum FleekAccessControl.CollectionRoles => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(CollectionRoles)3829,t_uint256)": { + "label": "mapping(enum FleekAccessControl.CollectionRoles => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))": { + "label": "mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)": { + "label": "mapping(string => struct FleekERC721.AccessPoint)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))": { + "label": "mapping(uint256 => mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool)))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool))))": { + "label": "mapping(uint256 => mapping(uint256 => mapping(enum FleekAccessControl.TokenRoles => mapping(address => bool))))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(App)4585_storage)": { + "label": "mapping(uint256 => struct FleekERC721.App)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Build)4590_storage)": { + "label": "mapping(uint256 => struct FleekERC721.Build)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(AccessPoint)4609_storage": { + "label": "struct FleekERC721.AccessPoint", + "members": [ + { + "label": "tokenId", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "score", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "contentVerified", + "type": "t_bool", + "offset": 0, + "slot": "2" + }, + { + "label": "nameVerified", + "type": "t_bool", + "offset": 1, + "slot": "2" + }, + { + "label": "owner", + "type": "t_address", + "offset": 2, + "slot": "2" + }, + { + "label": "status", + "type": "t_enum(AccessPointCreationStatus)4595", + "offset": 22, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(App)4585_storage": { + "label": "struct FleekERC721.App", + "members": [ + { + "label": "name", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "description", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "externalURL", + "type": "t_string_storage", + "offset": 0, + "slot": "2" + }, + { + "label": "ENS", + "type": "t_string_storage", + "offset": 0, + "slot": "3" + }, + { + "label": "currentBuild", + "type": "t_uint256", + "offset": 0, + "slot": "4" + }, + { + "label": "builds", + "type": "t_mapping(t_uint256,t_struct(Build)4590_storage)", + "offset": 0, + "slot": "5" + }, + { + "label": "logo", + "type": "t_string_storage", + "offset": 0, + "slot": "6" + }, + { + "label": "color", + "type": "t_uint24", + "offset": 0, + "slot": "7" + }, + { + "label": "accessPointAutoApproval", + "type": "t_bool", + "offset": 3, + "slot": "7" + } + ], + "numberOfBytes": "256" + }, + "t_struct(Build)4590_storage": { + "label": "struct FleekERC721.Build", + "members": [ + { + "label": "commitHash", + "type": "t_string_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "gitRepository", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint24": { + "label": "uint24", + "numberOfBytes": "3" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/contracts/deployments/mumbai/FleekERC721.json b/contracts/deployments/mumbai/FleekERC721.json index aac22661..8343ab72 100644 --- a/contracts/deployments/mumbai/FleekERC721.json +++ b/contracts/deployments/mumbai/FleekERC721.json @@ -1,9 +1,29 @@ { - "timestamp": "2/24/2023, 5:28:44 PM", - "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", - "transactionHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", - "gasPrice": 2500000019, + "timestamp": "3/3/2023, 4:43:25 PM", + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "transactionHash": "0x808546aa8bbc4e36c54d955970d8cfe8c4dc925eb5f65ff7b25203dd312bad4c", + "gasPrice": 1675244309, "abi": [ + { + "inputs": [], + "name": "AccessPointAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointCreationStatusAlreadySet", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointNotExistent", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointScoreCannotBeLower", + "type": "error" + }, { "inputs": [], "name": "ContractIsNotPausable", @@ -19,6 +39,16 @@ "name": "ContractIsPaused", "type": "error" }, + { + "inputs": [], + "name": "InvalidTokenIdForAccessPoint", + "type": "error" + }, + { + "inputs": [], + "name": "MustBeAccessPointOwner", + "type": "error" + }, { "inputs": [ { @@ -73,6 +103,17 @@ "name": "PausableIsSetTo", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requiredValue", + "type": "uint256" + } + ], + "name": "RequiredPayment", + "type": "error" + }, { "inputs": [], "name": "RoleAlreadySet", @@ -133,6 +174,25 @@ "name": "ApprovalForAll", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BillingChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -673,6 +733,44 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "byAddress", + "type": "address" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "", + "type": "uint8" + } + ], + "name": "_billings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -792,6 +890,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + } + ], + "name": "getBilling", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastTokenId", @@ -972,6 +1089,11 @@ "internalType": "string", "name": "_symbol", "type": "string" + }, + { + "internalType": "uint256[]", + "name": "initialBillings", + "type": "uint256[]" } ], "name": "initialize", @@ -1351,6 +1473,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "setBilling", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1598,10 +1738,17 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x6080806040523461001657615126908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb146107c857806301ffc9a7146107ac57806306fdde0314610790578063081812fc14610774578063095ea7b31461075c57806323b872dd14610744578063246a908b1461072c57806327dc5cec146107105780632d957aad146106f85780633806f152146106e05780633f4ba83a146106c957806342842e0e146106b157806342966c681461069a57806342e44bbf146106825780634cd88b761461066a5780635aa6ab3b146106525780636352211e1461061d57806370a0823114610601578063736d323a146105ea5780637469a03b146105d357806378278cca146105bb57806383c4c00d1461059f5780638456cb59146105885780638a2e25be146105705780638b9ec9771461053d5780638c3c0a441461052557806394ec65c51461050e57806395d89b41146104f2578063a09a1601146104c2578063a22cb465146104aa578063a27d0b2714610492578063a397c8301461047b578063aad045a214610463578063b187bd2614610437578063b20b94f11461041f578063b30437a01461040c578063b42dbe38146103ac578063b88d4fde14610391578063b948a3c514610379578063c87b56dd14610352578063cdb0e89e1461033a578063d7a75be11461031e578063e4b50cb8146102ee578063e9447250146102ca578063e985e9c51461025d578063eb5fd26b146102455763f931517714610227575061000f565b346102415761023e61023836610a78565b90612ce9565b51f35b5080fd5b50346102415761023e61025736610f27565b906134a5565b5034610241576102c691506102b56102ae61029761027a36610ef4565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b5034610241576102c691506102b56102ae6102976102e736610ad1565b9190611a3e565b5034610241576102c6915061030a610305366108ec565b612a20565b949795969390939291925197889788610e84565b5034610241576102c691506102b561033536610aa7565b613eba565b50346102415761023e61034c36610a78565b9061303b565b5034610241576102c6915061036e610369366108ec565b6125ab565b9051918291826108db565b50346102415761023e61038b36610a78565b9061332d565b50346102415761023e6103a336610e14565b92919091611567565b5034610241576102c691506102b56102ae6104076102976103cc36610808565b9390916103f86103e6826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611a70565b5061023e61041936610a78565b906136c3565b50346102415761023e61043136610b58565b9061401b565b5034610241576102c6915061044b36610873565b60cc54905160ff909116151581529081906020820190565b50346102415761023e61047536610df4565b90612c06565b50346102415761023e61048d36610aa7565b613f8a565b50346102415761023e6104a436610808565b916145b8565b50346102415761023e6104bc36610dc3565b906113b3565b5034610241576102c691506104d636610873565b60cc54905160089190911c60ff16151581529081906020820190565b5034610241576102c6915061050636610873565b61036e6111b6565b50346102415761023e61052036610aa7565b613ee7565b50346102415761023e61053736610ad1565b906146c7565b506102c6915061056161054f36610cac565b98979097969196959295949394612139565b90519081529081906020820190565b50346102415761023e61058236610c6c565b916139cd565b50346102415761059736610873565b61023e614875565b5034610241576102c691506105b336610873565b610561612aeb565b50346102415761023e6105cd36610a78565b90612ec4565b50346102415761023e6105e536610aa7565b613ba6565b50346102415761023e6105fc36610c50565b61493e565b5034610241576102c6915061056161061836610c2d565b610f4a565b5034610241576102c69150610639610634366108ec565b611010565b90516001600160a01b0390911681529081906020820190565b50346102415761023e61066436610bea565b91613561565b50346102415761023e61067c36610b93565b90611a88565b50346102415761023e61069436610b58565b906140bf565b50346102415761023e6106ac366108ec565b6142c4565b50346102415761023e6106c336610925565b9161152d565b5034610241576106d836610873565b61023e6148e1565b50346102415761023e6106f236610b01565b91614158565b50346102415761023e61070a36610ad1565b906144c9565b5034610241576102c6915061036e61072736610aa7565b613d0f565b50346102415761023e61073e36610a78565b906131b0565b50346102415761023e61075636610925565b916114df565b50346102415761023e61076e366108fe565b9061124f565b5034610241576102c6915061063961078b366108ec565b611375565b5034610241576102c691506107a436610873565b61036e6110ff565b5034610241576102c691506102b56107c336610858565b612b17565b50346102415761023e6107da36610808565b916147ac565b6001111561000f57565b600435906001600160a01b03821682141561080157565b5050600080fd5b606090600319011261000f5760043590602435610824816107e0565b906044356001600160a01b03811681141561083c5790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f5760043561087081610845565b90565b600090600319011261000f57565b918091926000905b8282106108a157501161089a575050565b6000910152565b91508060209183015181860152018291610889565b906020916108cf81518092818552858086019101610881565b601f01601f1916010190565b9060206108709281815201906108b6565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610801579060243590565b606090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761099657604052565b61099e610964565b604052565b90601f801991011681019081106001600160401b0382111761099657604052565b604051906109d18261097b565b565b6040519060c082018281106001600160401b0382111761099657604052565b6020906001600160401b038111610a0f575b601f01601f19160190565b610a17610964565b610a04565b929192610a28826109f2565b91610a3660405193846109a3565b829481845281830111610a53578281602093846000960137010152565b5050505050600080fd5b9080601f8301121561095c5781602061087093359101610a1c565b9060406003198301126108015760043591602435906001600160401b03821161083c5761087091600401610a5d565b602060031982011261080157600435906001600160401b03821161095c5761087091600401610a5d565b604090600319011261000f57600435610ae9816107e0565b906024356001600160a01b03811681141561095c5790565b606060031982011261080157600435916001600160401b03602435818111610a535783610b3091600401610a5d565b92604435918211610a535761087091600401610a5d565b610124359081151582141561080157565b604060031982011261080157600435906001600160401b03821161095c57610b8291600401610a5d565b9060243580151581141561095c5790565b906040600319830112610801576001600160401b0360043581811161083c5783610bbf91600401610a5d565b9260243591821161083c5761087091600401610a5d565b610104359062ffffff821682141561080157565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c1991600401610a5d565b9060443562ffffff811681141561083c5790565b602090600319011261000f576004356001600160a01b0381168114156108015790565b602090600319011261000f576004358015158114156108015790565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c9b91600401610a5d565b9060443580151581141561083c5790565b61014060031982011261080157610cc16107ea565b916001600160401b0390602435828111610a5357610ce3846004928301610a5d565b93604435848111610db75781610cfa918401610a5d565b93606435818111610daa5782610d11918501610a5d565b93608435828111610d9c5783610d28918601610a5d565b9360a435838111610d8d5784610d3f918301610a5d565b9360c435848111610d7d5781610d56918401610a5d565b9360e435908111610d7d57610d6b9201610a5d565b90610d74610bd6565b90610870610b47565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b038116811415610801579060243580151581141561095c5790565b604090600319011261000f576004359060243580151581141561095c5790565b906080600319830112610801576001600160a01b039160043583811681141561083c579260243590811681141561083c579160443591606435906001600160401b038211610e795780602383011215610e795781602461087093600401359101610a1c565b505050505050600080fd5b959062ffffff94610ecc610eed95610ebe60c09996610eb0610eda969d9e9d60e08e81815201906108b6565b8c810360208e0152906108b6565b908a820360408c01526108b6565b9088820360608a01526108b6565b91608087015285820360a08701526108b6565b9416910152565b604090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c5790565b604090600319011261000f576004359060243562ffffff811681141561095c5790565b6001600160a01b03168015610f6a57600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b15610fca57565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b0316610870811515610fc3565b90600182811c92168015611065575b602083101461104d57565b5050634e487b7160e01b600052602260045260246000fd5b91607f1691611042565b906000929180549161108083611033565b9182825260019384811690816000146110e257506001146110a2575b50505050565b90919394506000526020928360002092846000945b8386106110ce57505050500101903880808061109c565b8054858701830152940193859082016110b7565b60ff1916602084015250506040019350389150819050808061109c565b604051906000826065549161111383611033565b80835292600190818116908115611199575060011461113a575b506109d1925003836109a3565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b84831061117e57506109d193505081016020013861112d565b81935090816020925483858a01015201910190918592611165565b94505050505060ff191660208301526109d182604081013861112d565b60405190600082606654916111ca83611033565b8083529260019081811690811561119957506001146111f057506109d1925003836109a3565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b84831061123457506109d193505081016020013861112d565b81935090816020925483858a0101520191019091859261121b565b9061125981611010565b6001600160a01b0381811690841681146113225733149081156112f4575b5015611286576109d191611851565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff915061131a903390610297565b541638611277565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611398906001600160a01b03161515610fc3565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b038116919033831461143457816113f36114049233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b1561148357565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b906109d192916114f76114f28433611603565b61147c565b6116d6565b60405190602082018281106001600160401b03821117611520575b60405260008252565b611528610964565b611517565b90916109d19260405192602084018481106001600160401b0382111761155a575b60405260008452611567565b611562610964565b61154e565b9061158b93929161157b6114f28433611603565b6115868383836116d6565b61195d565b1561159257565b5060405162461bcd60e51b8152806115ac600482016115b0565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b038061161584611010565b16928183169284841494851561164b575b50508315611635575b50505090565b61164191929350611375565b161438808061162f565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611626565b1561168257565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b6116fa906116e384611010565b6001600160a01b038281169390918216841461167b565b83169283156117fb576117788261171587846117d296612b5b565b611737856117316117258a611010565b6001600160a01b031690565b1461167b565b61175e61174e886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b0381166000908152606860205260409020600181540190556117b3856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b038061188a84611010565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b6000908152606760205260409020546109d1906001600160a01b03161515610fc3565b90816020910312610801575161087081610845565b6001600160a01b039182168152911660208201526040810191909152608060608201819052610870929101906108b6565b506040513d6000823e3d90fd5b3d15611958573d9061193e826109f2565b9161194c60405193846109a3565b82523d6000602084013e565b606090565b92909190823b15611a0c57611990926020926000604051809681958294630a85bd0160e11b9a8b855233600486016118ef565b03926001600160a01b03165af1600091816119ec575b506119de575050506119b661192d565b805190816119d957505060405162461bcd60e51b8152806115ac600482016115b0565b602001fd5b6001600160e01b0319161490565b611a059192506119fc3d826109a3565b3d8101906118da565b90386119a6565b50505050600190565b50634e487b7160e01b600052602160045260246000fd5b60011115611a3657565b6109d1611a15565b611a4781611a2c565b6000526098602052604060002090565b611a6081611a2c565b6000526097602052604060002090565b90611a7a81611a2c565b600052602052604060002090565b6000549160ff8360081c161580938194611ba7575b8115611b87575b5015611b2857611aca9183611ac1600160ff196000541617600055565b611b0f57611bb5565b611ad057565b611ae061ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611b2361010061ff00196000541617600055565b611bb5565b50505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611b99575b5038611aa4565b6001915060ff161438611b92565b600160ff8216109150611a9d565b90611bd060ff60005460081c16611bcb81611cf1565b611cf1565b81516001600160401b038111611ce4575b611bf581611bf0606554611033565b611d69565b602080601f8311600114611c5157508190611c2c94600092611c46575b50508160011b916000199060031b1c191617606555611e5a565b611c3461202d565b611c3e600060fe55565b6109d16149b4565b015190503880611c12565b919293601f198416611c8560656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b936000905b828210611ccc575050916001939185611c2c97969410611cb3575b505050811b01606555611e5a565b015160001960f88460031b161c19169055388080611ca5565b80600186978294978701518155019601940190611c8a565b611cec610964565b611be1565b15611cf857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611d5d575050565b60008155600101611d52565b90601f8211611d76575050565b6109d19160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611dc0575b601f0160051c0190611d52565b9091508190611db3565b90601f8211611dd7575050565b6109d19160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611dc057601f0160051c0190611d52565b9190601f8111611e2f57505050565b6109d1926000526020600020906020601f840160051c83019310611dc057601f0160051c0190611d52565b9081516001600160401b038111611f44575b611e8081611e7b606654611033565b611dca565b602080601f8311600114611ebc5750819293600092611eb1575b50508160011b916000199060031b1c191617606655565b015190503880611e9a565b90601f19831694611eef60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b878210611f2c575050836001959610611f13575b505050811b01606655565b015160001960f88460031b161c19169055388080611f08565b80600185968294968601518155019501930190611ef4565b611f4c610964565b611e6c565b91909182516001600160401b038111612020575b611f7981611f738454611033565b84611e20565b602080601f8311600114611fb5575081929394600092611faa575b50508160011b916000199060031b1c1916179055565b015190503880611f94565b90601f19831695611fcb85600052602060002090565b926000905b88821061200857505083600195969710611fef575b505050811b019055565b015160001960f88460031b161c19169055388080611fe5565b80600185968294968601518155019501930190611fd0565b612028610964565b611f65565b600061203f60ff825460081c16611cf1565b808052609860209081526040808320336000908152925290205460ff166120e2578080526098602090815260408083203360009081529252902061208b905b805460ff19166001179055565b8080526097602052604081206120a1815461210d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161211d570190565b6121256120f6565b0190565b600290600219811161211d570190565b9394959891969790929761214b612545565b60fe54998a9761215b898861243a565b60fe546121679061210d565b60fe5561217e8960005260ff602052604060002090565b6121888782611f51565b6121958b60018301611f51565b6121a28c60028301611f51565b6121af8960038301611f51565b6121bc8460068301611f51565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff881617179055600060048201556121f06109c4565b908282528360208301526005016122109060008052602052604060002090565b9061221a9161225e565b604051978897600160a01b60019003169b339b612237988a612355565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b038111612348575b612287816122818654611033565b86611e20565b6020928390601f83116001146122d3579180600194926109d19796946000926122c8575b5050600019600383901b1c191690841b1784555b01519101611f51565b0151905038806122ab565b90601f198316916122e987600052602060002090565b9260005b818110612331575092600195939285926109d1999896889510612318575b505050811b0184556122bf565b015160001960f88460031b161c1916905538808061230b565b9293876001819287860151815501950193016122ed565b612350610964565b612273565b979998959062ffffff956123b56123df966123a78c6101009c986123996123d19961238b6123c3996101208087528601906108b6565b9084820360208601526108b6565b9160408184039101526108b6565b8c810360608e0152906108b6565b908a820360808c01526108b6565b9088820360a08a01526108b6565b9086820360c08801526108b6565b951660e08401521515910152565b156123f457565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156124fd576000838152606760205260409020546124d39190612475906001600160a01b031615155b156123ed565b61247d6149d6565b6000848152606760205260409020546124a0906001600160a01b0316151561246f565b6001600160a01b0381166000908152606860205260409020600181540190556117b3846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561257e57565b5060405163070198dd60e51b815260006004820152602490fd5b9061212560209282815194859201610881565b6000818152606760205260409020546125ce906001600160a01b03161515610fc3565b6125d781611010565b9060005260ff602052604060002061262d604051926125f58461097b565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b0316614ec1565b61266f6003830160078401600061264f61264a835462ffffff1690565b614fbc565b6040518095819263891c235f60e01b835260068a01878b60048601614bf7565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612a13575b6000936129f0575b5054908160181c60ff166126ab90614f76565b906005860190600487015492826126cd85809590600052602052604060002090565b936126e19190600052602052604060002090565b600101936126ee90614cbb565b9462ffffff166126fd90614fbc565b604051607b60f81b602082015267113730b6b2911d1160c11b602182015298899891979161272e60298b0183614c3f565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f0161275e9060018401614c3f565b61088b60f21b8152600201681137bbb732b9111d1160b91b815260090161278491612598565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b81526010016127b491600201614c3f565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b81526009016127da91612598565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d0161281491612598565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f0161286591614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b60208201526027016128b091614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b60208201526026016128fa91614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b602082015260230161294191612598565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b602082015260210161298691612598565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f199182810182526129ba90826109a3565b6129c390614abe565b91604051928391602083016129d791612598565b6129e091612598565b03908101825261087090826109a3565b612a0c91933d90823e612a033d826109a3565b3d810190614b99565b9138612698565b612a1b611920565b612690565b600081815260676020526040902054612a43906001600160a01b03161515610fc3565b60005260ff60205260409081600020600481015462ffffff600783015416938051612a7981612a72818761106f565b03826109a3565b948151612a8d81612a72816001890161106f565b946006612aca8451612aa681612a728160028c0161106f565b96612a728651612abd81612a72816003870161106f565b979651809481930161106f565b9190565b60018110612ade575b6000190190565b612ae66120f6565b612ad7565b60fe548015612b035760018110612ade576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612b4a575b8115612b3c575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612b32565b90612b646149d6565b6001600160a01b0391821615158080612ba4575b15612b89575050506109d190612baf565b612b9257505050565b1615612b9b5750565b6109d190612baf565b508282161515612b78565b80600052609960205260406000206001815481198111612bf9575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612c016120f6565b612bca565b612c0f81611010565b6001600160a01b0316331415612cce57600081815260676020526040902054612c42906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612cf281611010565b6001600160a01b0316331415612e27575b600081815260676020526040902054612d26906001600160a01b03161515610fc3565b80600052602060ff8152600260406000200190835180916001600160401b038211612e1a575b612d5a826122818654611033565b80601f8311600114612dac5750600091612da1575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582612e35565b905084015138612d6f565b9150601f198316612dc285600052602060002090565b926000905b828210612e025750509083600194939210612de9575b5050811b019055612d83565b86015160001960f88460031b161c191690553880612ddd565b80600185968294968c01518155019501930190612dc7565b612e22610964565b612d4c565b612e3081612e68565b612d03565b9060806108709260408152600b60408201526a195e1d195c9b985b15549360aa1b606082015281602082015201906108b6565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615612ea6575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b612ecd81611010565b6001600160a01b0316331415613002575b600081815260676020526040902054612f01906001600160a01b03161515610fc3565b80600052602060ff8152600360406000200190835180916001600160401b038211612ff5575b612f35826122818654611033565b80601f8311600114612f875750600091612f7c575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613010565b905084015138612f4a565b9150601f198316612f9d85600052602060002090565b926000905b828210612fdd5750509083600194939210612fc4575b5050811b019055612f5e565b86015160001960f88460031b161c191690553880612fb8565b80600185968294968c01518155019501930190612fa2565b612ffd610964565b612f27565b61300b81612e68565b612ede565b90608061087092604081526003604082015262454e5360e81b606082015281602082015201906108b6565b61304481611010565b6001600160a01b0316331415613176575b600081815260676020526040902054613078906001600160a01b03161515610fc3565b80600052602060ff8152604060002090835180916001600160401b038211613169575b6130a9826122818654611033565b80601f83116001146130fb57506000916130f0575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613184565b9050840151386130be565b9150601f19831661311185600052602060002090565b926000905b8282106131515750509083600194939210613138575b5050811b0190556130d2565b86015160001960f88460031b161c19169055388061312c565b80600185968294968c01518155019501930190613116565b613171610964565b61309b565b61317f81612e68565b613055565b906080610870926040815260046040820152636e616d6560e01b606082015281602082015201906108b6565b6131b981611010565b6001600160a01b03163314156132ec575b6000818152606760205260409020546131ed906001600160a01b03161515610fc3565b80600052602060ff8152600180604060002001918451906001600160401b0382116132df575b613221826122818654611033565b80601f8311600114613274575081928291600093613269575b501b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd3395826132fa565b87015192503861323a565b9082601f19811661328a87600052602060002090565b936000905b878383106132c557505050106132ac575b5050811b01905561324b565b86015160001960f88460031b161c1916905538806132a0565b8b860151875590950194938401938693509081019061328f565b6132e7610964565b613213565b6132f581612e68565b6131ca565b9060806108709260408152600b60408201526a3232b9b1b934b83a34b7b760a91b606082015281602082015201906108b6565b61333681611010565b6001600160a01b031633141561346b575b60008181526067602052604090205461336a906001600160a01b03161515610fc3565b80600052602060ff8152600660406000200190835180916001600160401b03821161345e575b61339e826122818654611033565b80601f83116001146133f057506000916133e5575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613479565b9050840151386133b3565b9150601f19831661340685600052602060002090565b926000905b828210613446575050908360019493921061342d575b5050811b0190556133c7565b86015160001960f88460031b161c191690553880613421565b80600185968294968c0151815501950193019061340b565b613466610964565b613390565b61347481612e68565b613347565b906080610870926040815260046040820152636c6f676f60e01b606082015281602082015201906108b6565b6134ae81611010565b6001600160a01b0316331415613553575b6000818152606760205260409020546134e2906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b61355c81612e68565b6134bf565b9291909261356e81611010565b6001600160a01b03163314156136b5575b6000818152606760205260409020546135a2906001600160a01b03161515610fc3565b8060005260209360ff855260066040600020018151956001600160401b0387116136a8575b6135d587611f738454611033565b80601f8811600114613637575095806109d1969760009161362c575b508160011b916000199060031b1c19161790555b816000805160206150c383398151915260405180613624339582613479565b0390a36134a5565b9050830151386135f1565b90601f19881661364c84600052602060002090565b926000905b8282106136905750509188916109d1989960019410613677575b5050811b019055613605565b85015160001960f88460031b161c19169055388061366b565b80600185968294968a01518155019501930190613651565b6136b0610964565b6135c7565b6136be81612e68565b61357f565b7fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8906136ed6149d6565b6136f6816118b7565b6137276001600160a01b03613720600261370f87613825565b015460101c6001600160a01b031690565b161561384c565b604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca233928061375988826108db565b0390a361378060076137758360005260ff602052604060002090565b015460181c60ff1690565b156137da576137d5906137c76137946109d3565b828152600060208201819052604082018190526060820152336080820152600160a08201526137c286613825565b6138a3565b60405191829133958361397f565b0390a2565b6137d5906138176137e96109d3565b828152600060208201819052604082018190526060820152336080820152600060a08201526137c286613825565b60405191829133958361395b565b602061383e918160405193828580945193849201610881565b810161010081520301902090565b1561385357565b5060405162461bcd60e51b815260206004820152601e60248201527f466c65656b4552433732313a20415020616c72656164792065786973747300006044820152606490fd5b60041115611a3657565b600290825181556020830151600182015501906138d260408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a09092015161392481613899565b600481101561394e575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613956611a15565b61392e565b6040906139756000939594956060835260608301906108b6565b9460208201520152565b6040906139756001939594956060835260608301906108b6565b6040906139756002939594956060835260608301906108b6565b6040906139756003939594956060835260608301906108b6565b90916139d882611010565b6001600160a01b0316331415613b0c576139f183613825565b918083541415613a865760027fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8930191613a42613a33845460ff9060b01c1690565b613a3c81613899565b15613b28565b15613a6257815460ff60b01b1916600160b01b179091556137d5906137c7565b815460ff60b01b1916600160b11b179091556137d590604051918291339583613999565b505050505060a460405162461bcd60e51b815260206004820152604e60248201527f466c65656b4552433732313a207468652070617373656420746f6b656e49642060448201527f6973206e6f74207468652073616d65206173207468652061636365737320706f60648201526d34b73a13b9903a37b5b2b724b21760911b6084820152fd5b50905060249150604051906355d2292f60e11b82526004820152fd5b15613b2f57565b5060405162461bcd60e51b815260206004820152604260248201527f466c65656b4552433732313a207468652061636365737320706f696e7420637260448201527f656174696f6e2073746174757320686173206265656e20736574206265666f72606482015261329760f11b608482015260a490fd5b613bae6149d6565b6001600160a01b03613bd2816002613bc585613825565b015460101c161515613cc2565b6002613bdd83613825565b015460101c16331415613c7b57613c0c6002613bf883613825565b01805460ff60b01b1916600360b01b179055565b613c1581613825565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613c488587836139b3565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db0604051806120dd3395826108db565b505060405162461bcd60e51b815260206004820152601d60248201527f466c65656b4552433732313a206d757374206265204150206f776e65720000006044820152606490fd5b15613cc957565b5060405162461bcd60e51b815260206004820152601760248201527f466c65656b4552433732313a20696e76616c69642041500000000000000000006044820152606490fd5b6001600160a01b039081613d2282613825565b6002015460101c161515613d3590613cc2565b613d3e90613825565b908154613d4a90614cbb565b906001830154613d5990614cbb565b92600201548060081c60ff16613d6e90614f76565b91613d7b60ff8316614f76565b908260101c16613d8a90614ec1565b9160b01c60ff16613d9a81613899565b613da390614cbb565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613dd691612598565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613dfa91612598565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613e2591612598565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613e5391612598565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613e7891612598565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613e9e91612598565b607d60f81b815260010103601f198101825261087090826109a3565b60ff90600290613ede90613ed96001600160a01b0384613bc584613825565b613825565b015460081c1690565b613efd6001600160a01b036002613bc584613825565b6001613f0882613825565b01613f138154613f5e565b9055613f1e81613825565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee436120dd6001613f4e85613825565b0154604051918291339683613f6e565b600190600019811461211d570190565b929190613f856020916040865260408601906108b6565b930152565b613fa06001600160a01b036002613bc584613825565b6001613fab82613825565b015415613fc8576001613fbd82613825565b01613f13815461400e565b5050606460405162461bcd60e51b815260206004820152602060248201527f466c65656b4552433732313a2073636f72652063616e74206265206c6f7765726044820152fd5b8015612ade576000190190565b6001600160a01b03614032816002613bc585613825565b61403b82613825565b549061404682611010565b163314156140b0575b5061407182600261405f84613825565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff6120dd61409e83613825565b54604051918291339615159583613f6e565b6140b990612e68565b3861404f565b6001600160a01b036140d6816002613bc585613825565b6140df82613825565b54906140ea82611010565b16331415614149575b5061411c82600261410384613825565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c6120dd61409e83613825565b61415290612e68565b386140f3565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b9061418583611010565b6001600160a01b0316331415614248575b6000838152606760205260409020546141b9906001600160a01b03161515610fc3565b60409061421e82518381018181106001600160401b0382111761423b575b84528681528260208201528560005260ff6020526142196005856000200160048660002001906142078254613f5e565b80925590600052602052604060002090565b61225e565b6142266109c4565b948552602085015251806120dd339582614256565b614243610964565b6141d7565b61425183612e68565b614196565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b6002821061429857505050505090565b909192939483806142b5600193607f1989820301865289516108b6565b97019201920190939291614288565b6142cd81611010565b6001600160a01b039081163314156143ec5760008183926142ed84611010565b6142f56149d6565b16151580806143e5575b83146143ce575061430f83612baf565b61431883611010565b61432f61174e856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561436561174e856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46143ab60026143a58360005260ff602052604060002090565b01614406565b6143b25750565b6143c96109d19160005260ff602052604060002090565b614481565b6143d75761430f565b6143e083612baf565b61430f565b50826142ff565b5060249150604051906355d2292f60e11b82526004820152fd5b6108709054611033565b6001600160fe1b038111600116614428575b60021b90565b6144306120f6565b614422565b61443f8154611033565b9081614449575050565b81601f6000931160011461445b575055565b8183526020832061447791601f0160051c810190600101611d52565b8160208120915555565b600760009161448f81614435565b61449b60018201614435565b6144a760028201614435565b6144b360038201614435565b8260048201556144c560068201614435565b0155565b6144d16149d6565b6144d9612545565b6144e281611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166145a35761451581611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290206145409061207e565b61454981611a57565b614553815461210d565b905561455e81611a2c565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516397b705ed60e01b815260049150fd5b6145c06149d6565b6145c981611010565b6001600160a01b039081163314156146aa578160005260996020526146116102ae8561029786610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc7821189061466e61207e8661029787610407614659896000526099602052604060002090565b546103f88a600052609a602052604060002090565b61467784611a2c565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b6146cf6149d6565b6146d7612545565b6146ee6146ea6102ae8461029785611a3e565b1590565b6145a3576146fb81611a2c565b801580614799575b614784576147216147178361029784611a3e565b805460ff19169055565b61472a81611a57565b6147348154612ace565b905561473f81611a2c565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516360ed092b60e01b815260049150fd5b5060016147a582611a57565b5414614703565b6147b46149d6565b6147bd81611010565b6001600160a01b039081163314156146aa578160005260996020526148086146ea6102ae8661029787610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906148506147178661029787610407614659896000526099602052604060002090565b61485984611a2c565b604080516000815233602082015291909516948190810161468f565b61487d612545565b6148856149d6565b60cc5460ff8160081c16156148cd5760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b6148e9612545565b60cc5460ff81161561492a5760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614946612545565b60cc549015159060ff8160081c161515821461499a5761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b6149c560ff60005460081c16611cf1565b60cc805461ffff1916610100179055565b60ff60cc54166149e257565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614a65575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614a6d610964565b614a10565b60405190614a7f8261097b565b6008825260203681840137565b90614a96826109f2565b614aa360405191826109a3565b8281528092614ab4601f19916109f2565b0190602036910137565b805115614b9057614acd6149f5565b614af1614aec614ae7614ae08551612129565b6003900490565b614410565b614a8c565b9160208301918182518301915b828210614b3e57505050600390510680600114614b2b57600214614b20575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614afe565b506108706114fc565b60208183031261095c578051906001600160401b03821161083c570181601f8201121561095c578051614bcb816109f2565b92614bd960405194856109a3565b8184526020828401011161083c576108709160208085019101610881565b92614c236108709593614c15614c319460808852608088019061106f565b90868203602088015261106f565b90848203604086015261106f565b9160608184039101526108b6565b600092918154614c4e81611033565b92600191808316908115614ca65750600114614c6a5750505050565b90919293945060005260209081600020906000915b858310614c95575050505001903880808061109c565b805485840152918301918101614c7f565b60ff191684525050500191503880808061109c565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614df0575b506d04ee2d6d415b85acef810000000080831015614de1575b50662386f26fc1000080831015614dd2575b506305f5e10080831015614dc3575b5061271080831015614db4575b506064821015614da4575b600a80921015614d9a575b600190816021614d52828701614a8c565b95860101905b614d64575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614d9557919082614d58565b614d5d565b9160010191614d41565b9190606460029104910191614d36565b60049193920491019138614d2b565b60089193920491019138614d1e565b60109193920491019138614d0f565b60209193920491019138614cfd565b604093508104915038614ce4565b60405190614e0b8261097b565b6007825260203681840137565b50634e487b7160e01b600052603260045260246000fd5b602090805115614e3d570190565b612125614e18565b602190805160011015614e3d570190565b906020918051821015614e6857010190565b614e70614e18565b010190565b15614e7c57565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117614f69575b604052602a825260403660208401376030614ef683614e2f565b536078614f0283614e45565b536029905b60018211614f1a57610870915015614e75565b80600f614f5692166010811015614f5c575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8486614e56565b5360041c9161400e565b90614f07565b614f64614e18565b614f2c565b614f71610964565b614edc565b15614f9b57604051614f878161097b565b60048152637472756560e01b602082015290565b604051614fa78161097b565b600581526466616c736560d81b602082015290565b62ffffff16614fc9614a72565b906030614fd583614e2f565b536078614fe183614e45565b5360079081905b6001821161507d57614ffb915015614e75565b615003614dfe565b91825115615070575b60236020840153600190815b838110615026575050505090565b61505e906001198111615063575b6001600160f81b031961504982860185614e56565b511660001a6150588288614e56565b53613f5e565b615018565b61506b6120f6565b615034565b615078614e18565b61500c565b80600f6150af921660108110156150b5575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8487614e56565b90614fe8565b6150bd614e18565b61508f56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a3646970667358221220649d06dd22516cb769346c4d824089015f3dc6af7ad4ca0d63914e92c2f6e0046c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - the contract must be not paused. IMPORTANT: The payment is not set yet\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string)\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0xebea929fabed84ed7e45572a13124087264e732a1b55dd7b07c5c26fcde46566\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://232fcba746f4bea888df7258a57031fbe82c6782861941b21a2b745766b8f97d\",\"dweb:/ipfs/QmSnK97Z6Mk1CXvGbf9PbK4Wi3MFNYLcy1vRrXaFSEQgfx\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x4e72d7848d5c44fcc6502054e74d26ede597641342be60e1f8c2978f607db715\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c020f490edc637208060b41dda06ea99c0dc9714917e4cb7729268b8a8ec85f2\",\"dweb:/ipfs/QmRmwK8YXk19kYG9w1qNMe2FAVEtRytKow4u8TRJyb3NPJ\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", + "bytecode": "0x60808060405234610016576152f2908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb1461083f57806301ffc9a71461082357806302dba24d146104a757806306fdde0314610807578063081812fc146107eb578063095ea7b3146107d357806323b872dd146107bb578063246a908b146107a357806327dc5cec146107875780632d957aad1461076f5780633806f152146107575780633ccfd60b146107405780633e233205146107285780633f4ba83a1461071157806342842e0e146106f957806342966c68146106e257806342e44bbf146106ca5780635aa6ab3b146106b25780636352211e1461067d57806370a0823114610661578063736d323a1461064a5780637469a03b1461063357806378278cca1461061b57806383c4c00d146105ff5780638456cb59146105e85780638a2e25be146105d05780638b9ec977146105ac5780638c3c0a441461059457806394ec65c51461057d57806395d89b4114610561578063a09a160114610531578063a22cb46514610519578063a27d0b2714610501578063a397c830146104ea578063aad045a2146104d2578063ac8cf285146104a7578063b187bd261461047b578063b20b94f114610463578063b30437a014610450578063b42dbe38146103f0578063b88d4fde146103d5578063b948a3c5146103bd578063ba4c458a146103a5578063c87b56dd1461037e578063cdb0e89e14610366578063d7a75be11461034a578063e4b50cb81461031a578063e9447250146102f6578063e985e9c514610289578063eb5fd26b146102715763f931517714610253575061000f565b3461026d5761026a61026436610b0a565b90612f73565b51f35b5080fd5b503461026d5761026a61028336611095565b90613734565b503461026d576102f291506102e16102da6102c36102a636611062565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b503461026d576102f291506102e16102da6102c361031336610b63565b9190611b95565b503461026d576102f291506103366103313661097e565b612ca7565b949795969390939291925197889788610ff2565b503461026d576102f291506102e161036136610b39565b613fc4565b503461026d5761026a61037836610b0a565b906132c7565b503461026d576102f2915061039a6103953661097e565b612831565b90519182918261096d565b503461026d5761026a6103b736610f31565b91611bdf565b503461026d5761026a6103cf36610b0a565b906135bb565b503461026d5761026a6103e736610ec1565b929190916116d5565b503461026d576102f291506102e16102da61044b6102c36104103661087f565b93909161043c61042a826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611bc7565b5061026a61045d36610b0a565b90613954565b503461026d5761026a61047536610c09565b9061410a565b503461026d576102f2915061048f36610905565b60cc54905160ff909116151581529081906020820190565b503461026d576102f291506104c36104be366108ea565b610e99565b90519081529081906020820190565b503461026d5761026a6104e436610e62565b90612e8f565b503461026d5761026a6104fc36610b39565b6140a3565b503461026d5761026a6105133661087f565b91614722565b503461026d5761026a61052b36610e31565b90611521565b503461026d576102f2915061054536610905565b60cc54905160089190911c60ff16151581529081906020820190565b503461026d576102f2915061057536610905565b61039a611324565b503461026d5761026a61058f36610b39565b61400c565b503461026d5761026a6105a636610b63565b90614831565b506102f291506104c36105be36610d1a565b9897909796919695929594939461238a565b503461026d5761026a6105e236610cda565b91613c2a565b503461026d576105f736610905565b61026a6149df565b503461026d576102f2915061061336610905565b6104c3612d73565b503461026d5761026a61062d36610b0a565b9061314f565b503461026d5761026a61064536610b39565b613d26565b503461026d5761026a61065c36610cbe565b614aa8565b503461026d576102f291506104c361067836610c9b565b6110b8565b503461026d576102f291506106996106943661097e565b61117e565b90516001600160a01b0390911681529081906020820190565b503461026d5761026a6106c436610c58565b916137f1565b503461026d5761026a6106dc36610c09565b906141cb565b503461026d5761026a6106f43661097e565b6143d9565b503461026d5761026a61070b366109b7565b9161169b565b503461026d5761072036610905565b61026a614a4b565b503461026d5761026a61073a36610bd9565b90614b1e565b503461026d5761074f36610905565b61026a614b30565b503461026d5761026a61076936610b93565b9161426c565b503461026d5761026a61078136610b63565b906145e0565b503461026d576102f2915061039a61079e36610b39565b613e1f565b503461026d5761026a6107b536610b0a565b9061343d565b503461026d5761026a6107cd366109b7565b9161164d565b503461026d5761026a6107e536610990565b906113bd565b503461026d576102f291506106996108023661097e565b6114e3565b503461026d576102f2915061081b36610905565b61039a61126d565b503461026d576102f291506102e161083a366108cf565b612da0565b503461026d5761026a6108513661087f565b91614916565b6001111561000f57565b600435906001600160a01b03821682141561087857565b5050600080fd5b606090600319011261000f576004359060243561089b81610857565b906044356001600160a01b0381168114156108b35790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f576004356108e7816108bc565b90565b602090600319011261000f5760043560028110156108785790565b600090600319011261000f57565b918091926000905b82821061093357501161092c575050565b6000910152565b9150806020918301518186015201829161091b565b9060209161096181518092818552858086019101610913565b601f01601f1916010190565b9060206108e7928181520190610948565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610878579060243590565b606090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610a2857604052565b610a306109f6565b604052565b90601f801991011681019081106001600160401b03821117610a2857604052565b60405190610a6382610a0d565b565b6040519060c082018281106001600160401b03821117610a2857604052565b6020906001600160401b038111610aa1575b601f01601f19160190565b610aa96109f6565b610a96565b929192610aba82610a84565b91610ac86040519384610a35565b829481845281830111610ae5578281602093846000960137010152565b5050505050600080fd5b9080601f830112156109ee578160206108e793359101610aae565b9060406003198301126108785760043591602435906001600160401b0382116108b3576108e791600401610aef565b602060031982011261087857600435906001600160401b0382116109ee576108e791600401610aef565b604090600319011261000f57600435610b7b81610857565b906024356001600160a01b0381168114156109ee5790565b606060031982011261087857600435916001600160401b03602435818111610ae55783610bc291600401610aef565b92604435918211610ae5576108e791600401610aef565b604090600319011261000f576004356002811015610878579060243590565b610124359081151582141561087857565b604060031982011261087857600435906001600160401b0382116109ee57610c3391600401610aef565b906024358015158114156109ee5790565b610104359062ffffff821682141561087857565b9060606003198301126108785760043591602435906001600160401b0382116108b357610c8791600401610aef565b9060443562ffffff81168114156108b35790565b602090600319011261000f576004356001600160a01b0381168114156108785790565b602090600319011261000f576004358015158114156108785790565b9060606003198301126108785760043591602435906001600160401b0382116108b357610d0991600401610aef565b906044358015158114156108b35790565b61014060031982011261087857610d2f610861565b916001600160401b0390602435828111610ae557610d51846004928301610aef565b93604435848111610e255781610d68918401610aef565b93606435818111610e185782610d7f918501610aef565b93608435828111610e0a5783610d96918601610aef565b9360a435838111610dfb5784610dad918301610aef565b9360c435848111610deb5781610dc4918401610aef565b9360e435908111610deb57610dd99201610aef565b90610de2610c44565b906108e7610bf8565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b03811681141561087857906024358015158114156109ee5790565b604090600319011261000f57600435906024358015158114156109ee5790565b50634e487b7160e01b600052602160045260246000fd5b6002811015610eb4575b60005260fe60205260406000205490565b610ebc610e82565b610ea3565b906080600319830112610878576001600160a01b03916004358381168114156108b357926024359081168114156108b3579160443591606435906001600160401b038211610f265780602383011215610f26578160246108e793600401359101610aae565b505050505050600080fd5b906060600319830112610878576001600160401b03906004358281116108b35783610f5e91600401610aef565b92602435838111610ae55781610f7691600401610aef565b9260443591818311610f265780602384011215610f26578260040135918211610fe5575b8160051b60405193602093610fb185840187610a35565b8552602484860192820101928311610e1857602401905b828210610fd6575050505090565b81358152908301908301610fc8565b610fed6109f6565b610f9a565b959062ffffff9461103a61105b9561102c60c0999661101e611048969d9e9d60e08e8181520190610948565b8c810360208e015290610948565b908a820360408c0152610948565b9088820360608a0152610948565b91608087015285820360a0870152610948565b9416910152565b604090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee5790565b604090600319011261000f576004359060243562ffffff81168114156109ee5790565b6001600160a01b031680156110d857600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b1561113857565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b03166108e7811515611131565b90600182811c921680156111d3575b60208310146111bb57565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916111b0565b90600092918054916111ee836111a1565b9182825260019384811690816000146112505750600114611210575b50505050565b90919394506000526020928360002092846000945b83861061123c57505050500101903880808061120a565b805485870183015294019385908201611225565b60ff1916602084015250506040019350389150819050808061120a565b6040519060008260655491611281836111a1565b8083529260019081811690811561130757506001146112a8575b50610a6392500383610a35565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b8483106112ec5750610a6393505081016020013861129b565b81935090816020925483858a010152019101909185926112d3565b94505050505060ff19166020830152610a6382604081013861129b565b6040519060008260665491611338836111a1565b80835292600190818116908115611307575060011461135e5750610a6392500383610a35565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b8483106113a25750610a6393505081016020013861129b565b81935090816020925483858a01015201910190918592611389565b906113c78161117e565b6001600160a01b038181169084168114611490573314908115611462575b50156113f457610a63916119bf565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff91506114889033906102c3565b5416386113e5565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611506906001600160a01b03161515611131565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b03811691903383146115a257816115616115729233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b156115f157565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b90610a6392916116656116608433611771565b6115ea565b611844565b60405190602082018281106001600160401b0382111761168e575b60405260008252565b6116966109f6565b611685565b9091610a639260405192602084018481106001600160401b038211176116c8575b604052600084526116d5565b6116d06109f6565b6116bc565b906116f99392916116e96116608433611771565b6116f4838383611844565b611acb565b1561170057565b5060405162461bcd60e51b81528061171a6004820161171e565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b03806117838461117e565b1692818316928484149485156117b9575b505083156117a3575b50505090565b6117af919293506114e3565b161438808061179d565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611794565b156117f057565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b611868906118518461117e565b6001600160a01b03828116939091821684146117e9565b8316928315611969576118e682611883878461194096612de4565b6118a58561189f6118938a61117e565b6001600160a01b031690565b146117e9565b6118cc6118bc886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b038116600090815260686020526040902060018154019055611921856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b03806119f88461117e565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b600090815260676020526040902054610a63906001600160a01b03161515611131565b9081602091031261087857516108e7816108bc565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526108e792910190610948565b506040513d6000823e3d90fd5b3d15611ac6573d90611aac82610a84565b91611aba6040519384610a35565b82523d6000602084013e565b606090565b92909190823b15611b7a57611afe926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611a5d565b03926001600160a01b03165af160009181611b5a575b50611b4c57505050611b24611a9b565b80519081611b4757505060405162461bcd60e51b81528061171a6004820161171e565b602001fd5b6001600160e01b0319161490565b611b73919250611b6a3d82610a35565b3d810190611a48565b9038611b14565b50505050600190565b60011115611b8d57565b610a63610e82565b611b9e81611b83565b6000526098602052604060002090565b611bb781611b83565b6000526097602052604060002090565b90611bd181611b83565b600052602052604060002090565b90916000549260ff8460081c161580948195611d01575b8115611ce1575b5015611c8157611c239284611c1a600160ff196000541617600055565b611c6857611d0f565b611c2957565b611c3961ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611c7c61010061ff00196000541617600055565b611d0f565b5050505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611cf3575b5038611bfd565b6001915060ff161438611cec565b600160ff8216109150611bf6565b929190611d2c60ff60005460081c16611d2781611e51565b611e51565b83516001600160401b038111611e44575b611d5181611d4c6065546111a1565b611ec9565b602080601f8311600114611dae57509080611d8e9392611d9b9697600092611da3575b50508160011b916000199060031b1c191617606555611fba565b611d9661218d565b612299565b610a63614b97565b015190503880611d74565b90601f19831696611de160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b926000905b898210611e2c575050918391600193611d8e9695611d9b999a10611e13575b505050811b01606555611fba565b015160001960f88460031b161c19169055388080611e05565b80600185968294968601518155019501930190611de6565b611e4c6109f6565b611d3d565b15611e5857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611ebd575050565b60008155600101611eb2565b90601f8211611ed6575050565b610a639160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611f20575b601f0160051c0190611eb2565b9091508190611f13565b90601f8211611f37575050565b610a639160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9190601f8111611f8f57505050565b610a63926000526020600020906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9081516001600160401b0381116120a4575b611fe081611fdb6066546111a1565b611f2a565b602080601f831160011461201c5750819293600092612011575b50508160011b916000199060031b1c191617606655565b015190503880611ffa565b90601f1983169461204f60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b87821061208c575050836001959610612073575b505050811b01606655565b015160001960f88460031b161c19169055388080612068565b80600185968294968601518155019501930190612054565b6120ac6109f6565b611fcc565b91909182516001600160401b038111612180575b6120d9816120d384546111a1565b84611f80565b602080601f831160011461211557508192939460009261210a575b50508160011b916000199060031b1c1916179055565b0151905038806120f4565b90601f1983169561212b85600052602060002090565b926000905b8882106121685750508360019596971061214f575b505050811b019055565b015160001960f88460031b161c19169055388080612145565b80600185968294968601518155019501930190612130565b6121886109f6565b6120c5565b600061219f60ff825460081c16611e51565b808052609860209081526040808320336000908152925290205460ff1661224257808052609860209081526040808320336000908152925290206121eb905b805460ff19166001179055565b808052609760205260408120612201815461226d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161227d570190565b612285612256565b0190565b600290600219811161227d570190565b906122ab60ff60005460081c16611e51565b60005b8251811015612306578060026122e79210156122f9575b83518110156122ec575b6122e260208260051b8601015182612332565b61230b565b6122ae565b6122f461231b565b6122cf565b612301610e82565b6122c5565b509050565b600190600019811461227d570190565b50634e487b7160e01b600052603260045260246000fd5b6040907f6819853ffee8927169953e7bdc42aaba347fb03ff918a45bfccaf88626d9009692600282101561237d575b8160005260fe60205280836000205582519182526020820152a1565b612385610e82565b612361565b93949891969790929761239b612798565b6101309687549a8b986123ae8a8961268d565b546123b89061226d565b610130556123d189600052610131602052604060002090565b6123db87826120b1565b6123e88b600183016120b1565b6123f58c600283016120b1565b61240289600383016120b1565b61240f84600683016120b1565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff88161717905560006004820155612443610a56565b908282528360208301526005016124639060008052602052604060002090565b9061246d916124b1565b604051978897600160a01b60019003169b339b61248a988a6125a8565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b03811161259b575b6124da816124d486546111a1565b86611f80565b6020928390601f831160011461252657918060019492610a6397969460009261251b575b5050600019600383901b1c191690841b1784555b015191016120b1565b0151905038806124fe565b90601f1983169161253c87600052602060002090565b9260005b81811061258457509260019593928592610a6399989688951061256b575b505050811b018455612512565b015160001960f88460031b161c1916905538808061255e565b929387600181928786015181550195019301612540565b6125a36109f6565b6124c6565b979998959062ffffff95612608612632966125fa8c6101009c986125ec612624996125de61261699610120808752860190610948565b908482036020860152610948565b916040818403910152610948565b8c810360608e015290610948565b908a820360808c0152610948565b9088820360a08a0152610948565b9086820360c0880152610948565b951660e08401521515910152565b1561264757565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156127505760008381526067602052604090205461272691906126c8906001600160a01b031615155b15612640565b6126d0614bb9565b6000848152606760205260409020546126f3906001600160a01b031615156126c2565b6001600160a01b038116600090815260686020526040902060018154019055611921846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6000805260fe6020527f32796e36004994222362c2f9423d5e208bb848170964890784a8d59ed40f50af54348114156127ce5750565b6024915060405190635f7e28df60e01b82526004820152fd5b600160005260fe6020527f457c8a48b4735f56b938837eb0a8a5f9c55f23c1a85767ce3b65c3e59d3d32b754348114156127ce5750565b9061228560209282815194859201610913565b600081815260676020526040902054612854906001600160a01b03161515611131565b61285d8161117e565b9060005261013160205260406000206128b46040519261287c84610a0d565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b031661508d565b6128f6600383016007840160006128d66128d1835462ffffff1690565b615188565b6040518095819263891c235f60e01b835260068a01878b60048601614dda565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612c9a575b600093612c77575b5054908160181c60ff1661293290615142565b9060058601906004870154928261295485809590600052602052604060002090565b936129689190600052602052604060002090565b6001019361297590614e9e565b9462ffffff1661298490615188565b604051607b60f81b602082015267113730b6b2911d1160c11b60218201529889989197916129b560298b0183614e22565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f016129e59060018401614e22565b61088b60f21b8152600201681137bbb732b9111d1160b91b8152600901612a0b9161281e565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b8152601001612a3b91600201614e22565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b8152600901612a619161281e565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d01612a9b9161281e565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f01612aec91614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b6020820152602701612b3791614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b6020820152602601612b8191614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b6020820152602301612bc89161281e565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b6020820152602101612c0d9161281e565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f19918281018252612c419082610a35565b612c4a90614ca1565b9160405192839160208301612c5e9161281e565b612c679161281e565b0390810182526108e79082610a35565b612c9391933d90823e612c8a3d82610a35565b3d810190614d7c565b913861291f565b612ca2611a8e565b612917565b600081815260676020526040902054612cca906001600160a01b03161515611131565b60005261013160205260409081600020600481015462ffffff600783015416938051612d0181612cfa81876111dd565b0382610a35565b948151612d1581612cfa81600189016111dd565b946006612d528451612d2e81612cfa8160028c016111dd565b96612cfa8651612d4581612cfa81600387016111dd565b97965180948193016111dd565b9190565b60018110612d66575b6000190190565b612d6e612256565b612d5f565b610130548015612d8c5760018110612d66576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612dd3575b8115612dc5575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612dbb565b90612ded614bb9565b6001600160a01b0391821615158080612e2d575b15612e1257505050610a6390612e38565b612e1b57505050565b1615612e245750565b610a6390612e38565b508282161515612e01565b80600052609960205260406000206001815481198111612e82575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612e8a612256565b612e53565b612e988161117e565b6001600160a01b0316331415612f5857600081815260676020526040902054612ecb906001600160a01b03161515611131565b600081815261013160205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612f7c8161117e565b6001600160a01b03163314156130b2575b600081815260676020526040902054612fb0906001600160a01b03161515611131565b8060005260206101318152600260406000200190835180916001600160401b0382116130a5575b612fe5826124d486546111a1565b80601f8311600114613037575060009161302c575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d3395826130c0565b905084015138612ffa565b9150601f19831661304d85600052602060002090565b926000905b82821061308d5750509083600194939210613074575b5050811b01905561300e565b86015160001960f88460031b161c191690553880613068565b80600185968294968c01518155019501930190613052565b6130ad6109f6565b612fd7565b6130bb816130f3565b612f8d565b9060806108e79260408152600b60408201526a195e1d195c9b985b15549360aa1b60608201528160208201520190610948565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615613131575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b6131588161117e565b6001600160a01b031633141561328e575b60008181526067602052604090205461318c906001600160a01b03161515611131565b8060005260206101318152600360406000200190835180916001600160401b038211613281575b6131c1826124d486546111a1565b80601f83116001146132135750600091613208575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d33958261329c565b9050840151386131d6565b9150601f19831661322985600052602060002090565b926000905b8282106132695750509083600194939210613250575b5050811b0190556131ea565b86015160001960f88460031b161c191690553880613244565b80600185968294968c0151815501950193019061322e565b6132896109f6565b6131b3565b613297816130f3565b613169565b9060806108e792604081526003604082015262454e5360e81b60608201528160208201520190610948565b6132d08161117e565b6001600160a01b0316331415613403575b600081815260676020526040902054613304906001600160a01b03161515611131565b8060005260206101318152604060002090835180916001600160401b0382116133f6575b613336826124d486546111a1565b80601f8311600114613388575060009161337d575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613411565b90508401513861334b565b9150601f19831661339e85600052602060002090565b926000905b8282106133de57505090836001949392106133c5575b5050811b01905561335f565b86015160001960f88460031b161c1916905538806133b9565b80600185968294968c015181550195019301906133a3565b6133fe6109f6565b613328565b61340c816130f3565b6132e1565b9060806108e7926040815260046040820152636e616d6560e01b60608201528160208201520190610948565b6134468161117e565b6001600160a01b031633141561357a575b60008181526067602052604090205461347a906001600160a01b03161515611131565b8060005260206101318152600180604060002001918451906001600160401b03821161356d575b6134af826124d486546111a1565b80601f83116001146135025750819282916000936134f7575b501b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613588565b8701519250386134c8565b9082601f19811661351887600052602060002090565b936000905b87838310613553575050501061353a575b5050811b0190556134d9565b86015160001960f88460031b161c19169055388061352e565b8b860151875590950194938401938693509081019061351d565b6135756109f6565b6134a1565b613583816130f3565b613457565b9060806108e79260408152600b60408201526a3232b9b1b934b83a34b7b760a91b60608201528160208201520190610948565b6135c48161117e565b6001600160a01b03163314156136fa575b6000818152606760205260409020546135f8906001600160a01b03161515611131565b8060005260206101318152600660406000200190835180916001600160401b0382116136ed575b61362d826124d486546111a1565b80601f831160011461367f5750600091613674575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613708565b905084015138613642565b9150601f19831661369585600052602060002090565b926000905b8282106136d557505090836001949392106136bc575b5050811b019055613656565b86015160001960f88460031b161c1916905538806136b0565b80600185968294968c0151815501950193019061369a565b6136f56109f6565b61361f565b613703816130f3565b6135d5565b9060806108e7926040815260046040820152636c6f676f60e01b60608201528160208201520190610948565b61373d8161117e565b6001600160a01b03163314156137e3575b600081815260676020526040902054613771906001600160a01b03161515611131565b600081815261013160205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b6137ec816130f3565b61374e565b929190926137fe8161117e565b6001600160a01b0316331415613946575b600081815260676020526040902054613832906001600160a01b03161515611131565b80600052602093610131855260066040600020018151956001600160401b038711613939575b613866876120d384546111a1565b80601f88116001146138c857509580610a6396976000916138bd575b508160011b916000199060031b1c19161790555b8160008051602061528f833981519152604051806138b5339582613708565b0390a3613734565b905083015138613882565b90601f1988166138dd84600052602060002090565b926000905b828210613921575050918891610a63989960019410613908575b5050811b019055613896565b85015160001960f88460031b161c1916905538806138fc565b80600185968294968a015181550195019301906138e2565b6139416109f6565b613858565b61394f816130f3565b61380f565b61395c614bb9565b6139646127e7565b61396d81611a25565b6001600160a01b03613994600261398385613acf565b015460101c6001600160a01b031690565b16613aba577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe890604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca23392806139ed888261096d565b0390a3613a156007613a0a83600052610131602052604060002090565b015460181c60ff1690565b15613a6f57613a6a90613a5c613a29610a65565b828152600060208201819052604082018190526060820152336080820152600160a0820152613a5786613acf565b613b00565b604051918291339583613bdc565b0390a2565b613a6a90613aac613a7e610a65565b828152600060208201819052604082018190526060820152336080820152600060a0820152613a5786613acf565b604051918291339583613bb8565b505060405163142d0c2f60e11b815260049150fd5b6020613ae8918160405193828580945193849201610913565b810161013281520301902090565b60041115611b8d57565b60029082518155602083015160018201550190613b2f60408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a090920151613b8181613af6565b6004811015613bab575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613bb3610e82565b613b8b565b604090613bd2600093959495606083526060830190610948565b9460208201520152565b604090613bd2600193959495606083526060830190610948565b604090613bd2600293959495606083526060830190610948565b604090613bd2600393959495606083526060830190610948565b919091613c368161117e565b6001600160a01b0316331415613d0a57613c4f83613acf565b8181541415613cf45760020190613c6b825460ff9060b01c1690565b613c7481613af6565b613cde577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe89215613cba57815460ff60b01b1916600160b01b17909155613a6a90613a5c565b815460ff60b01b1916600160b11b17909155613a6a90604051918291339583613bf6565b5050505050600460405163d9e5c51160e01b8152fd5b50505050506004604051636653b1a360e01b8152fd5b91505060249150604051906355d2292f60e11b82526004820152fd5b613d2e614bb9565b6001600160a01b03806002613d4284613acf565b015460101c1615613e0a576002613d5883613acf565b015460101c16331415613df657613d876002613d7383613acf565b01805460ff60b01b1916600360b01b179055565b613d9081613acf565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613dc3858783613c10565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db06040518061223d33958261096d565b5050604051631851b23d60e01b8152600490fd5b5050604051630d436c3560e21b815260049150fd5b6001600160a01b0390816002613e3483613acf565b015460101c1615613e0a57613e4890613acf565b908154613e5490614e9e565b906001830154613e6390614e9e565b92600201548060081c60ff16613e7890615142565b91613e8560ff8316615142565b908260101c16613e949061508d565b9160b01c60ff16613ea481613af6565b613ead90614e9e565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613ee09161281e565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613f049161281e565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613f2f9161281e565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613f5d9161281e565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613f829161281e565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613fa89161281e565b607d60f81b815260010103601f19810182526108e79082610a35565b6001600160a01b036002613fd783613acf565b015460101c1615613ff8576002613fef60ff92613acf565b015460081c1690565b5050604051630d436c3560e21b8152600490fd5b6001600160a01b03600261401f83613acf565b015460101c1615613ff857600161403582613acf565b01614040815461230b565b905561404b81613acf565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee4361223d600161407b85613acf565b01546040519182913396835b92919061409e602091604086526040860190610948565b930152565b6001600160a01b0360026140b683613acf565b015460101c1615613ff85760016140cc82613acf565b0154156140e95760016140de82613acf565b0161404081546140fd565b50506040516341f3125f60e11b8152600490fd5b8015612d66576000190190565b6001600160a01b0380600261411e84613acf565b015460101c16156141b65761413282613acf565b549061413d8261117e565b163314156141a7575b5061416882600261415684613acf565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff61223d61419583613acf565b54604051918291339615159583614087565b6141b0906130f3565b38614146565b505050506004604051630d436c3560e21b8152fd5b6001600160a01b038060026141df84613acf565b015460101c16156141b6576141f382613acf565b54906141fe8261117e565b1633141561425d575b5061423082600261421784613acf565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c61223d61419583613acf565b614266906130f3565b38614207565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b906142998361117e565b6001600160a01b031633141561435d575b6000838152606760205260409020546142cd906001600160a01b03161515611131565b60409061433382518381018181106001600160401b03821117614350575b84528681528260208201528560005261013160205261432e60058560002001600486600020019061431c825461230b565b80925590600052602052604060002090565b6124b1565b61433b610a56565b9485526020850152518061223d33958261436b565b6143586109f6565b6142eb565b614366836130f3565b6142aa565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b600282106143ad57505050505090565b909192939483806143ca600193607f198982030186528951610948565b9701920192019093929161439d565b6143e28161117e565b6001600160a01b039081163314156145035760008183926144028461117e565b61440a614bb9565b16151580806144fc575b83146144e5575061442483612e38565b61442d8361117e565b6144446118bc856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561447a6118bc856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46144c160026144bb83600052610131602052604060002090565b0161451d565b6144c85750565b6144e0610a6391600052610131602052604060002090565b614598565b6144ee57614424565b6144f783612e38565b614424565b5082614414565b5060249150604051906355d2292f60e11b82526004820152fd5b6108e790546111a1565b6001600160fe1b03811160011661453f575b60021b90565b614547612256565b614539565b61455681546111a1565b9081614560575050565b81601f60009311600114614572575055565b8183526020832061458e91601f0160051c810190600101611eb2565b8160208120915555565b60076000916145a68161454c565b6145b26001820161454c565b6145be6002820161454c565b6145ca6003820161454c565b8260048201556145dc6006820161454c565b0155565b6145e8614bb9565b6145f06146cf565b6145f981611b83565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166146ba5761462c81611b83565b60008181526098602090815260408083206001600160a01b03861684529091529020614657906121de565b61466081611bae565b61466a815461226d565b905561467581611b83565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516397b705ed60e01b815260049150fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561470857565b5060405163070198dd60e51b815260006004820152602490fd5b61472a614bb9565b6147338161117e565b6001600160a01b039081163314156148145781600052609960205261477b6102da856102c38661044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906147d86121de866102c38761044b6147c3896000526099602052604060002090565b5461043c8a600052609a602052604060002090565b6147e184611b83565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b614839614bb9565b6148416146cf565b6148586148546102da846102c385611b95565b1590565b6146ba5761486581611b83565b801580614903575b6148ee5761488b614881836102c384611b95565b805460ff19169055565b61489481611bae565b61489e8154612d56565b90556148a981611b83565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516360ed092b60e01b815260049150fd5b50600161490f82611bae565b541461486d565b61491e614bb9565b6149278161117e565b6001600160a01b03908116331415614814578160005260996020526149726148546102da866102c38761044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906149ba614881866102c38761044b6147c3896000526099602052604060002090565b6149c384611b83565b60408051600081523360208201529190951694819081016147f9565b6149e76146cf565b6149ef614bb9565b60cc5460ff8160081c1615614a375760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b614a536146cf565b60cc5460ff811615614a945760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614ab06146cf565b60cc549015159060ff8160081c1615158214614b045761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b90610a6391614b2b6146cf565b612332565b614b386146cf565b478060008115614b8e575b600080809381933390f115614b81575b6040519081527f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a360203392a2565b614b89611a8e565b614b53565b506108fc614b43565b614ba860ff60005460081c16611e51565b60cc805461ffff1916610100179055565b60ff60cc5416614bc557565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614c48575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614c506109f6565b614bf3565b60405190614c6282610a0d565b6008825260203681840137565b90614c7982610a84565b614c866040519182610a35565b8281528092614c97601f1991610a84565b0190602036910137565b805115614d7357614cb0614bd8565b614cd4614ccf614cca614cc38551612289565b6003900490565b614527565b614c6f565b9160208301918182518301915b828210614d2157505050600390510680600114614d0e57600214614d03575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614ce1565b506108e761166a565b6020818303126109ee578051906001600160401b0382116108b3570181601f820112156109ee578051614dae81610a84565b92614dbc6040519485610a35565b818452602082840101116108b3576108e79160208085019101610913565b92614e066108e79593614df8614e14946080885260808801906111dd565b9086820360208801526111dd565b9084820360408601526111dd565b916060818403910152610948565b600092918154614e31816111a1565b92600191808316908115614e895750600114614e4d5750505050565b90919293945060005260209081600020906000915b858310614e78575050505001903880808061120a565b805485840152918301918101614e62565b60ff191684525050500191503880808061120a565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614fd3575b506d04ee2d6d415b85acef810000000080831015614fc4575b50662386f26fc1000080831015614fb5575b506305f5e10080831015614fa6575b5061271080831015614f97575b506064821015614f87575b600a80921015614f7d575b600190816021614f35828701614c6f565b95860101905b614f47575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614f7857919082614f3b565b614f40565b9160010191614f24565b9190606460029104910191614f19565b60049193920491019138614f0e565b60089193920491019138614f01565b60109193920491019138614ef2565b60209193920491019138614ee0565b604093508104915038614ec7565b60405190614fee82610a0d565b6007825260203681840137565b602090805115615009570190565b61228561231b565b602190805160011015615009570190565b90602091805182101561503457010190565b61503c61231b565b010190565b1561504857565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117615135575b604052602a8252604036602084013760306150c283614ffb565b5360786150ce83615011565b536029905b600182116150e6576108e7915015615041565b80600f61512292166010811015615128575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188486615022565b5360041c916140fd565b906150d3565b61513061231b565b6150f8565b61513d6109f6565b6150a8565b156151675760405161515381610a0d565b60048152637472756560e01b602082015290565b60405161517381610a0d565b600581526466616c736560d81b602082015290565b62ffffff16615195614c55565b9060306151a183614ffb565b5360786151ad83615011565b5360079081905b60018211615249576151c7915015615041565b6151cf614fe1565b9182511561523c575b60236020840153600190815b8381106151f2575050505090565b61522a90600119811161522f575b6001600160f81b031961521582860185615022565b511660001a6152248288615022565b5361230b565b6151e4565b615237612256565b615200565b61524461231b565b6151d8565b80600f61527b92166010811015615281575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188487615022565b906151b4565b61528961231b565b61525b56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a36469706673582212202e75744fc556eafe78e883a2f3183bc7de9ed6d92b284cb784cf309e243d27256c6578706572696d656e74616cf564736f6c634300080c0041", + "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccessPointAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointCreationStatusAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointNotExistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointScoreCannotBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenIdForAccessPoint\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeAccessPointOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredValue\",\"type\":\"uint256\"}],\"name\":\"RequiredPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BillingChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"_billings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"}],\"name\":\"getBilling\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"initialBillings\",\"type\":\"uint256[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setBilling\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - billing for add acess point may be applied. - the contract must be not paused.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getBilling(uint8)\":{\"details\":\"Returns the billing value for a given key.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string,uint256[])\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - billing for the minting may be applied. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setBilling(uint8,uint256)\":{\"details\":\"Sets the billing value for a given key. May emit a {BillingChanged} event. Requirements: - the sender must have the `collectionOwner` role.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"},\"withdraw()\":{\"details\":\"Withdraws all the funds from contract. May emmit a {Withdrawn} event. Requirements: - the sender must have the `collectionOwner` role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0x95f7195cc0f546e06ab49a57e8d22a0ca482175ffa2a74b71ff4c7c395b7394a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://045d686ba6ddf6e1b296b87511e0610bd838a949e108b75c5f960675c4f8de0a\",\"dweb:/ipfs/QmWTyAVAg4KmoE19iKir78TNtCCjtqhJPqGqt7rNyBA6Qv\"]},\"contracts/FleekBilling.sol\":{\"keccak256\":\"0x6fed8b7faba37011bd15b0bc395ca40e24a85499dec167de6942acabc5407d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1f71b1173e8cd21e14e44e97a1add07d1f08115aa2a4053e40aacfbbc270a19\",\"dweb:/ipfs/QmSej6eRfhhL84SMMFrPJWesTUhMRc4HSTY85b2zAKzzhs\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x33d8a71103d4d5c8c39120e514cce5220530485aa05fb13bb64010daaaaac8a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f4ac13123b77e53ae8ae1c220853254e4f1aae04c8602da594f812e0a5224b3e\",\"dweb:/ipfs/QmXyFDqEJc5fWFVRYLq9bmwMAfuXXdAUTJwSH2dArFgz3v\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", "storageLayout": { "storage": [ { @@ -1733,7 +1880,7 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 5764, + "astId": 5991, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_paused", "offset": 0, @@ -1741,7 +1888,7 @@ "type": "t_bool" }, { - "astId": 5766, + "astId": 5993, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_canPause", "offset": 1, @@ -1749,7 +1896,7 @@ "type": "t_bool" }, { - "astId": 5917, + "astId": 6144, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "__gap", "offset": 0, @@ -1757,28 +1904,44 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 4434, + "astId": 4255, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "_appIds", + "label": "_billings", "offset": 0, "slot": "254", + "type": "t_mapping(t_enum(Billing)4234,t_uint256)" + }, + { + "astId": 4383, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "255", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 4611, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_appIds", + "offset": 0, + "slot": "304", "type": "t_uint256" }, { - "astId": 4439, + "astId": 4616, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_apps", "offset": 0, - "slot": "255", - "type": "t_mapping(t_uint256,t_struct(App)4408_storage)" + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(App)4585_storage)" }, { - "astId": 4444, + "astId": 4621, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_accessPoints", "offset": 0, - "slot": "256", - "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)" + "slot": "306", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)" } ], "types": { @@ -1810,11 +1973,16 @@ "label": "bool", "numberOfBytes": "1" }, - "t_enum(AccessPointCreationStatus)4418": { + "t_enum(AccessPointCreationStatus)4595": { "encoding": "inplace", "label": "enum FleekERC721.AccessPointCreationStatus", "numberOfBytes": "1" }, + "t_enum(Billing)4234": { + "encoding": "inplace", + "label": "enum FleekBilling.Billing", + "numberOfBytes": "1" + }, "t_enum(CollectionRoles)3829": { "encoding": "inplace", "label": "enum FleekAccessControl.CollectionRoles", @@ -1846,6 +2014,13 @@ "numberOfBytes": "32", "value": "t_uint256" }, + "t_mapping(t_enum(Billing)4234,t_uint256)": { + "encoding": "mapping", + "key": "t_enum(Billing)4234", + "label": "mapping(enum FleekBilling.Billing => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { "encoding": "mapping", "key": "t_enum(CollectionRoles)3829", @@ -1867,12 +2042,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_bool)" }, - "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)": { + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)": { "encoding": "mapping", "key": "t_string_memory_ptr", "label": "mapping(string => struct FleekERC721.AccessPoint)", "numberOfBytes": "32", - "value": "t_struct(AccessPoint)4432_storage" + "value": "t_struct(AccessPoint)4609_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1895,19 +2070,19 @@ "numberOfBytes": "32", "value": "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))" }, - "t_mapping(t_uint256,t_struct(App)4408_storage)": { + "t_mapping(t_uint256,t_struct(App)4585_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.App)", "numberOfBytes": "32", - "value": "t_struct(App)4408_storage" + "value": "t_struct(App)4585_storage" }, - "t_mapping(t_uint256,t_struct(Build)4413_storage)": { + "t_mapping(t_uint256,t_struct(Build)4590_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.Build)", "numberOfBytes": "32", - "value": "t_struct(Build)4413_storage" + "value": "t_struct(Build)4590_storage" }, "t_mapping(t_uint256,t_uint256)": { "encoding": "mapping", @@ -1926,12 +2101,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AccessPoint)4432_storage": { + "t_struct(AccessPoint)4609_storage": { "encoding": "inplace", "label": "struct FleekERC721.AccessPoint", "members": [ { - "astId": 4420, + "astId": 4597, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "tokenId", "offset": 0, @@ -1939,7 +2114,7 @@ "type": "t_uint256" }, { - "astId": 4422, + "astId": 4599, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "score", "offset": 0, @@ -1947,7 +2122,7 @@ "type": "t_uint256" }, { - "astId": 4424, + "astId": 4601, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "contentVerified", "offset": 0, @@ -1955,7 +2130,7 @@ "type": "t_bool" }, { - "astId": 4426, + "astId": 4603, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "nameVerified", "offset": 1, @@ -1963,7 +2138,7 @@ "type": "t_bool" }, { - "astId": 4428, + "astId": 4605, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "owner", "offset": 2, @@ -1971,22 +2146,22 @@ "type": "t_address" }, { - "astId": 4431, + "astId": 4608, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "status", "offset": 22, "slot": "2", - "type": "t_enum(AccessPointCreationStatus)4418" + "type": "t_enum(AccessPointCreationStatus)4595" } ], "numberOfBytes": "96" }, - "t_struct(App)4408_storage": { + "t_struct(App)4585_storage": { "encoding": "inplace", "label": "struct FleekERC721.App", "members": [ { - "astId": 4388, + "astId": 4565, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "name", "offset": 0, @@ -1994,7 +2169,7 @@ "type": "t_string_storage" }, { - "astId": 4390, + "astId": 4567, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "description", "offset": 0, @@ -2002,7 +2177,7 @@ "type": "t_string_storage" }, { - "astId": 4392, + "astId": 4569, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "externalURL", "offset": 0, @@ -2010,7 +2185,7 @@ "type": "t_string_storage" }, { - "astId": 4394, + "astId": 4571, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "ENS", "offset": 0, @@ -2018,7 +2193,7 @@ "type": "t_string_storage" }, { - "astId": 4396, + "astId": 4573, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "currentBuild", "offset": 0, @@ -2026,15 +2201,15 @@ "type": "t_uint256" }, { - "astId": 4401, + "astId": 4578, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "builds", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(Build)4413_storage)" + "type": "t_mapping(t_uint256,t_struct(Build)4590_storage)" }, { - "astId": 4403, + "astId": 4580, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "logo", "offset": 0, @@ -2042,7 +2217,7 @@ "type": "t_string_storage" }, { - "astId": 4405, + "astId": 4582, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "color", "offset": 0, @@ -2050,7 +2225,7 @@ "type": "t_uint24" }, { - "astId": 4407, + "astId": 4584, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "accessPointAutoApproval", "offset": 3, @@ -2060,12 +2235,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Build)4413_storage": { + "t_struct(Build)4590_storage": { "encoding": "inplace", "label": "struct FleekERC721.Build", "members": [ { - "astId": 4410, + "astId": 4587, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "commitHash", "offset": 0, @@ -2073,7 +2248,7 @@ "type": "t_string_storage" }, { - "astId": 4412, + "astId": 4589, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "gitRepository", "offset": 0, diff --git a/contracts/deployments/mumbai/FleekSVG.json b/contracts/deployments/mumbai/FleekSVG.json index 37d225fa..32580696 100644 --- a/contracts/deployments/mumbai/FleekSVG.json +++ b/contracts/deployments/mumbai/FleekSVG.json @@ -1,8 +1,8 @@ { - "timestamp": "2/24/2023, 5:28:19 PM", - "address": "0xCb27660FB9F5b7c29E96e113d4792C0f835C3aE1", - "transactionHash": "0xab0f6435ab531ee7edea783f3e5c9c407e3a1437af3f6df0ea4e2b7fde7dd2d6", - "gasPrice": 2500000019, + "timestamp": "3/3/2023, 3:17:49 PM", + "address": "0x420392C6c1D8C7A6B992D84D492eEdb2b7d236C6", + "transactionHash": "0xf7ca9b35827ab9d58b5cae0c695429833a07f7b76a7e7b68c1ac6442aa7f3038", + "gasPrice": 1500000020, "abi": [ { "inputs": [ @@ -39,8 +39,8 @@ "type": "function" } ], - "bytecode": "0x6080806040523461001a57612ae99081610021823930815050f35b50600080fdfe6080604052600480361015610015575b50600080fd5b6000803560e01c63891c235f1461002c575061000f565b60803660031901126100e05767ffffffffffffffff82358181116100d9576100579036908501610156565b926024358281116100d15761006f9036908301610156565b916044358181116100c8576100879036908401610156565b936064359182116100bf5750916100a96100af94926100bb9694369101610156565b92610226565b604051918291826101e3565b0390f35b94505050505080fd5b50505050809150fd5b505050809150fd5b5050809150fd5b809150fd5b50634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761011e57604052565b6101266100e5565b604052565b60209067ffffffffffffffff8111610149575b601f01601f19160190565b6101516100e5565b61013e565b81601f820112156101a65780359061016d8261012b565b9261017b60405194856100fc565b8284526020838301011161019d57816000926020809301838601378301015290565b50505050600080fd5b505050600080fd5b918091926000905b8282106101ce5750116101c7575050565b6000910152565b915080602091830151818601520182916101b6565b6040916020825261020381518092816020860152602086860191016101ae565b601f01601f1916010190565b90610222602092828151948592016101ae565b0190565b604080517f3c7376672077696474683d223130363522206865696768743d2231303635222060208201527f76696577426f783d2230203020313036352031303635222066696c6c3d226e6f918101919091527f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32303060608201527f302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77608082015271199737b93397989c9c9c97bc3634b735911f60711b60a08201529384939092909160b285017f3c7374796c6520747970653d22746578742f637373223e40696d706f7274207581527f726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d60208201527f2f637373323f66616d696c793d496e7465723a77676874403530303b36303022604082015269149d9e17b9ba3cb6329f60b11b6060820152606a017f3c726563742077696474683d223130363522206865696768743d22313036352281527f2066696c6c3d2275726c28236261636b67726f756e642922202f3e3c7265637460208201527f206f7061636974793d22302e32222077696474683d223130363522206865696760408201527f68743d2231303635222066696c6c3d2275726c28236261636b67726f756e642d60608201526a3930b234b0b6149110179f60a91b6080820152608b017f3c672066696c7465723d2275726c28236469736b657474652d736861646f772981527f223e3c7061746820643d224d3835372e323331203237392e3731324c3930322e60208201527f3234203238362e363735433931302e353437203238372e3936203931372e393160408201527f35203239322e373231203932322e35203239392e3736384c3933382e3839342060608201527f3332342e393634433934322e323439203333302e3132203934332e333131203360808201527f33362e343337203934312e383237203334322e3430364c3933372e373938203360a08201527f35382e3631354c3932342e303439203335362e36354c3931392e34313620333760c08201527f342e3038344c3933342e303638203337362e32344c3739312e3934372039323260e08201527f2e313532433738382e313039203933362e383936203737332e363934203934366101008201527f2e333038203735382e363531203934332e3839334c3137392e363336203835306101208201527f2e393238433136322e333138203834382e313437203135312e323135203833306101408201527f2e393837203135352e373736203831342e3035314c3136302e343738203739366101608201527f2e35394c3730342e333135203837392e3537344c3835372e323331203237392e6101808201527f3731325a222066696c6c3d222330353035303522202f3e3c2f673e00000000006101a08201526101bb017f3c7061746820643d224d3834302e323331203234302e3731324c3838352e323481527f203234372e363735433839332e353437203234382e393631203930302e39313560208201527f203235332e373232203930352e35203236302e3736384c3932312e383934203260408201527f38352e393635433932352e323439203239312e3132203932362e33313120323960608201527f372e343337203932342e383237203330332e3430364c3932302e37393820333160808201527f392e3631364c3930372e303439203331372e36354c3930322e3431362033333560a08201527f2e3038344c3931372e303638203333372e3234314c3737342e3934372038383360c08201527f2e313532433737312e313039203839372e383936203735362e3639342039303760e08201527f2e333038203734312e363531203930342e3839334c3136322e363336203831316101008201527f2e393238433134352e333138203830392e313437203133342e323135203739316101208201527f2e393837203133382e373736203737352e3035314c3134332e343738203735376101408201527f2e35394c3638372e333135203834302e3537344c3834302e323331203234302e6101608201527f3731325a222066696c6c3d2275726c28236d61696e2922202f3e00000000000061018082015261019a01600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3331392e383437203136312e353060208201527f32433331302e333536203136302e303037203330302e363734203136362e333260408201527f36203239382e323231203137352e3631364c3133382e373234203737392e373560608201527f38433133362e323731203738392e303438203134312e393737203739372e373960808201527f203135312e343638203739392e3238354c3734302e303631203839312e39373360a08201527f433734392e353533203839332e343637203735392e323335203838372e31343860c08201527f203736312e363837203837372e3835384c3930322e343035203334342e38353460e08201527f4c3838392e313538203334322e3736384c3839382e383732203330352e3937326101008201527f4c3931322e313139203330382e3035394c3931332e373333203330312e3934366101208201527f433931342e383337203239372e373632203931342e333039203239332e3437366101408201527f203931322e323531203238392e3932374c3839332e343834203235372e3536396101608201527f433839312e313533203235332e353439203838372e303633203235302e3832336101808201527f203838322e323231203235302e3036314c3832382e323035203234312e3535346101a08201527f433832322e323234203234302e363133203831352e383639203234322e3738336101c08201527f203831312e343237203234372e3238344c3830352e363836203235332e3130336101e08201527f433830342e323035203235342e363033203830322e303837203235352e3332366102008201527f203830302e303933203235352e3031334c3738332e363131203235322e3431376102208201527f4c3733342e33203433392e313936433733312e343339203435302e30333520376102408201527f32302e313433203435372e343037203730392e3037203435352e3636334c33326102608201527f382e383437203339352e373838433331372e373734203339342e3034352033316102808201527f312e313137203338332e383435203331332e393738203337332e3030374c33366102a08201527f362e353238203137332e3936324c3336362e353333203137332e3934314333366102c08201527f372e323334203137312e3234203336352e353732203136382e373032203336326102e08201527f2e3831203136382e3236374c3331392e383437203136312e3530325a4d3336396103008201527f2e333932203137342e3431344c3336382e363532203137372e3231374c3331366103208201527f2e383433203337332e343538433331342e3339203338322e373438203332302e6103408201527f303936203339312e3439203332392e353837203339322e3938354c3730392e386103608201527f31203435322e3836433731392e333031203435342e333534203732382e3938336103808201527f203434382e303335203733312e343336203433382e3734354c3738302e3734376103a08201527f203235312e3936364c3738332e323435203234322e3530344c3738332e3938356103c08201527f203233392e3730314c3336392e333932203137342e3431345a222066696c6c3d6103e08201526b111198999899989b1110179f60a11b61040082015261040c01600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223422207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3331392e383437203136312e353032433331302e33353620313660808201527f302e303037203330302e363734203136362e333236203239382e32323120313760a08201527f352e3631364c3133382e373234203737392e373538433133362e32373120373860c08201527f392e303438203134312e393737203739372e3739203135312e3436382037393960e08201527f2e3238354c3734302e303631203839312e393733433734392e353533203839336101008201527f2e343637203735392e323335203838372e313438203736312e363837203837376101208201527f2e3835384c3930322e343035203334342e3835344c3838392e313538203334326101408201527f2e3736384c3839382e383732203330352e3937324c3931322e313139203330386101608201527f2e3035394c3931332e373333203330312e393436433931342e383337203239376101808201527f2e373632203931342e333039203239332e343736203931322e323531203238396101a08201527f2e3932374c3839332e343834203235372e353639433839312e313533203235336101c08201527f2e353439203838372e303633203235302e383233203838322e323231203235306101e08201527f2e3036314c3832382e323035203234312e353534433832322e323234203234306102008201527f2e363133203831352e383639203234322e373833203831312e343237203234376102208201527f2e3238344c3830352e363836203235332e313033433830342e323035203235346102408201527f2e363033203830322e303837203235352e333236203830302e303933203235356102608201527f2e3031334c3738332e363131203235322e3431374c3733342e33203433392e316102808201527f3936433733312e343339203435302e303335203732302e313433203435372e346102a08201527f3037203730392e3037203435352e3636334c3332382e383437203339352e37386102c08201527f38433331372e373734203339342e303435203331312e313137203338332e38346102e08201527f35203331332e393738203337332e3030374c3336362e353238203137332e39366103008201527f324c3336362e353333203137332e393431433336372e323334203137312e32346103208201527f203336352e353732203136382e373032203336322e3831203136382e3236374c6103408201527f3331392e383437203136312e3530325a4d3336392e333932203137342e3431346103608201527f4c3336382e363532203137372e3231374c3331362e383433203337332e3435386103808201527f433331342e3339203338322e373438203332302e303936203339312e343920336103a08201527f32392e353837203339322e3938354c3730392e3831203435322e3836433731396103c08201527f2e333031203435342e333534203732382e393833203434382e303335203733316103e08201527f2e343336203433382e3734354c3738302e373437203235312e3936364c3738336104008201527f2e323435203234322e3530344c3738332e393835203233392e3730314c3336396104208201527f2e333932203137342e3431345a222066696c6c3d2275726c28236469736b65746104408201527f74652d6772616469656e7429222066696c6c2d6f7061636974793d22302e32226104608201526210179f60e91b610480820152610483017f3c7061746820643d224d3333352e3338203230382e313133433333352e39323281527f203230382e313938203333362e343137203230372e363836203333362e32383360208201527f203230372e3137394c3333302e3339203138342e373935433333302e3234392060408201527f3138342e323631203332392e353239203138342e313438203332392e3132392060608201527f3138342e3539374c3331322e333538203230332e343131433331312e3937382060808201527f3230332e383338203331322e313734203230342e343538203331322e3731362060a08201527f3230342e3534344c3331372e393632203230352e3337433331382e333537203260c08201527f30352e343332203331382e353935203230352e373936203331382e343933203260e08201527f30362e3138334c3331342e37203232302e353531433331342e353937203232306101008201527f2e393338203331342e383335203232312e333032203331352e323331203232316101208201527f2e3336344c3332342e353339203232322e3833433332342e393335203232322e6101408201527f383933203332352e333338203232322e363239203332352e3434203232322e326101608201527f34324c3332392e323333203230372e383735433332392e333336203230372e346101808201527f3838203332392e373339203230372e323234203333302e313335203230372e326101a08201527f38364c3333352e3338203230382e3131335a222066696c6c3d2275726c28236d6101c08201526730b4b7149110179f60c11b6101e08201526101e8017f3c7061746820643d224d3331392e323832203236392e303837433331392e383281527f34203236392e313733203332302e333139203236382e363631203332302e313860208201527f36203236382e3135344c3331342e323932203234352e3737433331342e31353160408201527f203234352e323336203331332e343331203234352e313233203331332e30333160608201527f203234352e3537324c3239362e323631203236342e333836433239352e38382060808201527f3236342e383132203239362e303736203236352e343333203239362e3631382060a08201527f3236352e3531384c3330312e383634203236362e333434433330322e3235392060c08201527f3236362e343037203330322e343937203236362e373731203330322e3339352060e08201527f3236372e3135384c3239382e363032203238312e353236433239382e352032386101008201527f312e393133203239382e373337203238322e323737203239392e3133332032386101208201527f322e3333394c3330382e343431203238332e383035433330382e3833372032386101408201527f332e383637203330392e3234203238332e363034203330392e333433203238336101608201527f2e3231374c3331332e313336203236382e383439433331332e323338203236386101808201527f2e343632203331332e363431203236382e313939203331342e303337203236386101a08201527f2e3236314c3331392e323832203236392e3038375a222066696c6c3d22626c616101c08201527f636b222066696c6c2d6f7061636974793d22302e3522202f3e000000000000006101e08201526101f9017f3c7061746820643d224d3330332e313834203333302e303632433330332e373281527f36203333302e313438203330342e323231203332392e363336203330342e303860208201527f38203332392e3132384c3239382e313934203330362e373435433239382e303560408201527f33203330362e323131203239372e333333203330362e303938203239362e393360608201527f33203330362e3534374c3238302e313633203332352e333631433237392e373860808201527f32203332352e373837203237392e393739203332362e343038203238302e353260a08201527f203332362e3439334c3238352e373636203332372e333139433238362e31363160c08201527f203332372e333832203238362e333939203332372e373436203238362e32393760e08201527f203332382e3133334c3238322e353034203334322e353031433238322e3430326101008201527f203334322e383838203238322e363339203334332e323532203238332e3033356101208201527f203334332e3331344c3239322e333434203334342e3738433239322e373339206101408201527f3334342e383432203239332e313432203334342e353739203239332e323435206101608201527f3334342e3139324c3239372e303338203332392e383234433239372e313420336101808201527f32392e343337203239372e353433203332392e313734203239372e39333920336101a08201527f32392e3233364c3330332e313834203333302e3036325a222066696c6c3d22626101c08201527f6c61636b222066696c6c2d6f7061636974793d22302e3522202f3e00000000006101e08201526101fb017f3c70617468207374726f6b653d2275726c28236d61696e2922207374726f6b6581527f2d77696474683d223622207374726f6b652d6c696e656361703d22726f756e6460208201527f22207374726f6b652d6c696e656a6f696e3d22726f756e642220643d224d323960408201527f302e313039203436332e343138433239322e333538203435342e39303220333060608201527f312e323333203434392e3131203330392e393333203435302e34384c3737312e60808201527f3037203532332e303936433737392e3737203532342e3436372037383520353360a08201527f322e3438203738322e373532203534302e3939364c3639322e3038362038383460c08201527f2e3431384c3139392e343433203830362e38344c3239302e313039203436332e60e08201527f3431385a222066696c6c3d22626c61636b222066696c6c2d6f7061636974793d61010082015268111817189a1110179f60b91b61012082015261012901600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223622207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3738372e353839203233372e3334394c3436302e33353420313860808201527f352e3831384c3430362e333235203339302e343639433430332e38373220333960a08201527f392e373539203430392e353738203430382e353031203431392e30363920343060c08201527f392e3939364c3731312e393334203435362e313134433732312e34323520343560e08201527f372e363039203733312e313037203435312e3239203733332e3536203434324c6101008201527f3738372e353839203233372e3334395a4d3636302e323639203234352e3031436101208201527f3635352e353233203234342e323633203635302e363832203234372e343233206101408201527f3634392e343536203235322e3036384c3630372e333836203431312e343138436101608201527f3630362e3136203431362e303633203630392e303133203432302e34333420366101808201527f31332e373539203432312e3138314c3638322e343939203433322e30303643366101a08201527f38372e323435203433322e373533203639322e303836203432392e35393420366101c08201527f39332e333132203432342e3934394c3733352e333832203236352e35393943376101e08201527f33362e363038203236302e393534203733332e373535203235362e35383320376102008201527f32392e3031203235352e3833354c3636302e323639203234352e30315a2220666102208201527234b6361e913ab9361411b6b0b4b7149110179f60691b61024082015261025301600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3836342e363433203238332e393360208201527f37433836352e313836203238332e363035203836352e373038203238342e323560408201527f37203836352e323339203238342e3638334c3834342e323638203330332e373160608201527f39433834332e393338203330342e303138203834342e303933203330342e353160808201527f37203834342e353236203330342e3534384c3835332e373236203330352e323060a08201527f37433835342e313834203330352e3234203835342e333231203330352e37383760c08201527f203835332e393432203330362e3037314c3833332e383834203332312e31313260e08201527f433833332e353036203332312e333936203833332e363433203332312e3934336101008201527f203833342e313031203332312e3937364c3834342e303037203332322e3638356101208201527f433834342e343931203332322e3732203834342e363035203332332e333139206101408201527f3834342e313737203332332e35384c3739372e373532203335312e39353443376101608201527f39372e323039203335322e323836203739362e363837203335312e36333420376101808201527f39372e313536203335312e3230394c3831382e343033203333312e39323243386101a08201527f31382e373333203333312e363232203831382e353737203333312e31323320386101c08201527f31382e313435203333312e3039324c3830382e373438203333302e34324338306101e08201527f382e323932203333302e333837203830382e313534203332392e3834332038306102008201527f382e353239203332392e3535384c3832382e303534203331342e3734344338326102208201527f382e3433203331342e343539203832382e323931203331332e393135203832376102408201527f2e383335203331332e3838324c3831382e333839203331332e323036433831376102608201527f2e393034203331332e313731203831372e3739203331322e353732203831382e6102808201527f323138203331322e3331314c3836342e363433203238332e3933375a222066696102a08201526c36361e913bb434ba329110179f60991b6102c08201526102cd017f3c67207472616e73666f726d3d226d617472697828302e39383738323720302e81527f313535353537202d302e32353532363120302e3936363837322032353020373360208201527f3529223e3c7465787420666f6e742d66616d696c793d22496e7465722c20736160408201527f6e732d73657269662220666f6e742d7765696768743d22626f6c642220666f6e60608201527f742d73697a653d223432222066696c6c3d2223453545374638223e00000000006080820152609b016121e99161020f565b7f3c2f746578743e3c7465787420666f6e742d66616d696c793d22496e7465722c81527f2073616e732d73657269662220666f6e742d7765696768743d226e6f726d616c60208201527f2220793d2234302220666f6e742d73697a653d223232222066696c6c3d222337604082015266231c189c99111f60c91b60608201526067016122749161020f565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f3c696d6167652077696474683d2231363722206865696768743d22313637222081527f7472616e73666f726d3d226d617472697828302e39383738323720302e31353560208201527f353537202d302e32353532363120302e393636383732203434342e313137203560408201526d191a17189b949110343932b31e9160911b6060820152606e0161231a9161020f565b631110179f60e11b8152600401651e3232b3399f60d11b81526006017f3c66696c7465722069643d226469736b657474652d736861646f772220783d2281527f37302e373438392220793d223139352e373132222077696474683d223935352e60208201527f37333322206865696768743d223833322e353538222066696c746572556e697460408201527f733d227573657253706163654f6e5573652220636f6c6f722d696e746572706f60608201527f6c6174696f6e2d66696c746572733d2273524742223e3c6665466c6f6f64206660808201527f6c6f6f642d6f7061636974793d223022202f3e3c6665426c656e6420696e3d2260a08201527f536f757263654772617068696322202f3e3c6665476175737369616e426c757260c08201527f20737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e000060e082015260fe017f3c6c696e6561724772616469656e742069643d226261636b67726f756e64222081527f78313d223533322e35222079313d2230222078323d223533322e35222079323d60208201527f223130363522206772616469656e74556e6974733d227573657253706163654f60408201527f6e557365223e3c73746f70202f3e3c73746f70206f66667365743d223122207360608201527f746f702d636f6c6f723d222331333133313322202f3e3c2f6c696e656172477260808201526630b234b2b73a1f60c91b60a082015260a7017f3c72616469616c4772616469656e742069643d226261636b67726f756e642d7281527f616469616c222063783d2230222063793d22302220723d22312220677261646960208201527f656e74556e6974733d227573657253706163654f6e557365222067726164696560408201527f6e745472616e73666f726d3d227472616e736c617465283533322e352035333260608201527f2e352920726f746174652838392e39363129207363616c652837333529223e3c60808201527039ba37b81039ba37b816b1b7b637b91e9160791b60a082015260b101612616908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d8152601160f91b6020820152602101612650908261020f565b7f222073746f702d6f7061636974793d223022202f3e3c2f72616469616c4772618152653234b2b73a1f60d11b60208201526026017f3c6c696e6561724772616469656e742069643d226469736b657474652d67726181527f6469656e74222078313d223932352e363236222079313d223235362e3839362260208201527f2078323d223133362e373739222079323d223830302e3230332220677261646960408201527f656e74556e6974733d227573657253706163654f6e557365223e3c73746f702060608201526b39ba37b816b1b7b637b91e9160a11b6080820152608c0161273c908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d81527f222332433331334622202f3e3c2f6c696e6561724772616469656e743e0000006020820152603d017f3c6c696e6561724772616469656e742069643d226d61696e223e3c73746f702081526b39ba37b816b1b7b637b91e9160a11b6020820152602c016127cc9161020f565b741110179f1e17b634b732b0b923b930b234b2b73a1f60591b8152601501661e17b232b3399f60c91b8152600701651e17b9bb339f60d11b81526006010390601f1991828101825261281e90826100fc565b612827906129aa565b6040517f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015291908290603a82016128619161020f565b03908101825261287190826100fc565b90565b604051906020820182811067ffffffffffffffff821117612899575b60405260008252565b6128a16100e5565b612890565b604051906060820182811067ffffffffffffffff821117612917575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61291f6100e5565b6128c2565b50634e487b7160e01b600052601160045260246000fd5b600290600219811161294b570190565b610222612924565b6001600160fe1b03811160011661296b575b60021b90565b612973612924565b612965565b906129828261012b565b61298f60405191826100fc565b82815280926129a0601f199161012b565b0190602036910137565b805115612a7c576129b96128a6565b6129dd6129d86129d36129cc855161293b565b6003900490565b612953565b612978565b9160208301918182518301915b828210612a2a57505050600390510680600114612a1757600214612a0c575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c16880101516002860153168501015190820153019391906129ea565b5061287161287456fe3c706174682066696c6c2d72756c653d226576656e6f64642220636c69702d72a36469706673582212205b19216396955a2700f08c918b4c5215a1ce7c6155058e77039c4705e747d0ad6c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"color\",\"type\":\"string\"}],\"name\":\"generateBase64\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"generateBase64(string,string,string,string)\":{\"details\":\"Generates a SVG image.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/util/FleekSVG.sol\":\"FleekSVG\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0xebea929fabed84ed7e45572a13124087264e732a1b55dd7b07c5c26fcde46566\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://232fcba746f4bea888df7258a57031fbe82c6782861941b21a2b745766b8f97d\",\"dweb:/ipfs/QmSnK97Z6Mk1CXvGbf9PbK4Wi3MFNYLcy1vRrXaFSEQgfx\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x4e72d7848d5c44fcc6502054e74d26ede597641342be60e1f8c2978f607db715\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c020f490edc637208060b41dda06ea99c0dc9714917e4cb7729268b8a8ec85f2\",\"dweb:/ipfs/QmRmwK8YXk19kYG9w1qNMe2FAVEtRytKow4u8TRJyb3NPJ\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", + "bytecode": "0x6080806040523461001a57612ae99081610021823930815050f35b50600080fdfe6080604052600480361015610015575b50600080fd5b6000803560e01c63891c235f1461002c575061000f565b60803660031901126100e05767ffffffffffffffff82358181116100d9576100579036908501610156565b926024358281116100d15761006f9036908301610156565b916044358181116100c8576100879036908401610156565b936064359182116100bf5750916100a96100af94926100bb9694369101610156565b92610226565b604051918291826101e3565b0390f35b94505050505080fd5b50505050809150fd5b505050809150fd5b5050809150fd5b809150fd5b50634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761011e57604052565b6101266100e5565b604052565b60209067ffffffffffffffff8111610149575b601f01601f19160190565b6101516100e5565b61013e565b81601f820112156101a65780359061016d8261012b565b9261017b60405194856100fc565b8284526020838301011161019d57816000926020809301838601378301015290565b50505050600080fd5b505050600080fd5b918091926000905b8282106101ce5750116101c7575050565b6000910152565b915080602091830151818601520182916101b6565b6040916020825261020381518092816020860152602086860191016101ae565b601f01601f1916010190565b90610222602092828151948592016101ae565b0190565b604080517f3c7376672077696474683d223130363522206865696768743d2231303635222060208201527f76696577426f783d2230203020313036352031303635222066696c6c3d226e6f918101919091527f6e652220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32303060608201527f302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77608082015271199737b93397989c9c9c97bc3634b735911f60711b60a08201529384939092909160b285017f3c7374796c6520747970653d22746578742f637373223e40696d706f7274207581527f726c282268747470733a2f2f666f6e74732e676f6f676c65617069732e636f6d60208201527f2f637373323f66616d696c793d496e7465723a77676874403530303b36303022604082015269149d9e17b9ba3cb6329f60b11b6060820152606a017f3c726563742077696474683d223130363522206865696768743d22313036352281527f2066696c6c3d2275726c28236261636b67726f756e642922202f3e3c7265637460208201527f206f7061636974793d22302e32222077696474683d223130363522206865696760408201527f68743d2231303635222066696c6c3d2275726c28236261636b67726f756e642d60608201526a3930b234b0b6149110179f60a91b6080820152608b017f3c672066696c7465723d2275726c28236469736b657474652d736861646f772981527f223e3c7061746820643d224d3835372e323331203237392e3731324c3930322e60208201527f3234203238362e363735433931302e353437203238372e3936203931372e393160408201527f35203239322e373231203932322e35203239392e3736384c3933382e3839342060608201527f3332342e393634433934322e323439203333302e3132203934332e333131203360808201527f33362e343337203934312e383237203334322e3430364c3933372e373938203360a08201527f35382e3631354c3932342e303439203335362e36354c3931392e34313620333760c08201527f342e3038344c3933342e303638203337362e32344c3739312e3934372039323260e08201527f2e313532433738382e313039203933362e383936203737332e363934203934366101008201527f2e333038203735382e363531203934332e3839334c3137392e363336203835306101208201527f2e393238433136322e333138203834382e313437203135312e323135203833306101408201527f2e393837203135352e373736203831342e3035314c3136302e343738203739366101608201527f2e35394c3730342e333135203837392e3537344c3835372e323331203237392e6101808201527f3731325a222066696c6c3d222330353035303522202f3e3c2f673e00000000006101a08201526101bb017f3c7061746820643d224d3834302e323331203234302e3731324c3838352e323481527f203234372e363735433839332e353437203234382e393631203930302e39313560208201527f203235332e373232203930352e35203236302e3736384c3932312e383934203260408201527f38352e393635433932352e323439203239312e3132203932362e33313120323960608201527f372e343337203932342e383237203330332e3430364c3932302e37393820333160808201527f392e3631364c3930372e303439203331372e36354c3930322e3431362033333560a08201527f2e3038344c3931372e303638203333372e3234314c3737342e3934372038383360c08201527f2e313532433737312e313039203839372e383936203735362e3639342039303760e08201527f2e333038203734312e363531203930342e3839334c3136322e363336203831316101008201527f2e393238433134352e333138203830392e313437203133342e323135203739316101208201527f2e393837203133382e373736203737352e3035314c3134332e343738203735376101408201527f2e35394c3638372e333135203834302e3537344c3834302e323331203234302e6101608201527f3731325a222066696c6c3d2275726c28236d61696e2922202f3e00000000000061018082015261019a01600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3331392e383437203136312e353060208201527f32433331302e333536203136302e303037203330302e363734203136362e333260408201527f36203239382e323231203137352e3631364c3133382e373234203737392e373560608201527f38433133362e323731203738392e303438203134312e393737203739372e373960808201527f203135312e343638203739392e3238354c3734302e303631203839312e39373360a08201527f433734392e353533203839332e343637203735392e323335203838372e31343860c08201527f203736312e363837203837372e3835384c3930322e343035203334342e38353460e08201527f4c3838392e313538203334322e3736384c3839382e383732203330352e3937326101008201527f4c3931322e313139203330382e3035394c3931332e373333203330312e3934366101208201527f433931342e383337203239372e373632203931342e333039203239332e3437366101408201527f203931322e323531203238392e3932374c3839332e343834203235372e3536396101608201527f433839312e313533203235332e353439203838372e303633203235302e3832336101808201527f203838322e323231203235302e3036314c3832382e323035203234312e3535346101a08201527f433832322e323234203234302e363133203831352e383639203234322e3738336101c08201527f203831312e343237203234372e3238344c3830352e363836203235332e3130336101e08201527f433830342e323035203235342e363033203830322e303837203235352e3332366102008201527f203830302e303933203235352e3031334c3738332e363131203235322e3431376102208201527f4c3733342e33203433392e313936433733312e343339203435302e30333520376102408201527f32302e313433203435372e343037203730392e3037203435352e3636334c33326102608201527f382e383437203339352e373838433331372e373734203339342e3034352033316102808201527f312e313137203338332e383435203331332e393738203337332e3030374c33366102a08201527f362e353238203137332e3936324c3336362e353333203137332e3934314333366102c08201527f372e323334203137312e3234203336352e353732203136382e373032203336326102e08201527f2e3831203136382e3236374c3331392e383437203136312e3530325a4d3336396103008201527f2e333932203137342e3431344c3336382e363532203137372e3231374c3331366103208201527f2e383433203337332e343538433331342e3339203338322e373438203332302e6103408201527f303936203339312e3439203332392e353837203339322e3938354c3730392e386103608201527f31203435322e3836433731392e333031203435342e333534203732382e3938336103808201527f203434382e303335203733312e343336203433382e3734354c3738302e3734376103a08201527f203235312e3936364c3738332e323435203234322e3530344c3738332e3938356103c08201527f203233392e3730314c3336392e333932203137342e3431345a222066696c6c3d6103e08201526b111198999899989b1110179f60a11b61040082015261040c01600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223422207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3331392e383437203136312e353032433331302e33353620313660808201527f302e303037203330302e363734203136362e333236203239382e32323120313760a08201527f352e3631364c3133382e373234203737392e373538433133362e32373120373860c08201527f392e303438203134312e393737203739372e3739203135312e3436382037393960e08201527f2e3238354c3734302e303631203839312e393733433734392e353533203839336101008201527f2e343637203735392e323335203838372e313438203736312e363837203837376101208201527f2e3835384c3930322e343035203334342e3835344c3838392e313538203334326101408201527f2e3736384c3839382e383732203330352e3937324c3931322e313139203330386101608201527f2e3035394c3931332e373333203330312e393436433931342e383337203239376101808201527f2e373632203931342e333039203239332e343736203931322e323531203238396101a08201527f2e3932374c3839332e343834203235372e353639433839312e313533203235336101c08201527f2e353439203838372e303633203235302e383233203838322e323231203235306101e08201527f2e3036314c3832382e323035203234312e353534433832322e323234203234306102008201527f2e363133203831352e383639203234322e373833203831312e343237203234376102208201527f2e3238344c3830352e363836203235332e313033433830342e323035203235346102408201527f2e363033203830322e303837203235352e333236203830302e303933203235356102608201527f2e3031334c3738332e363131203235322e3431374c3733342e33203433392e316102808201527f3936433733312e343339203435302e303335203732302e313433203435372e346102a08201527f3037203730392e3037203435352e3636334c3332382e383437203339352e37386102c08201527f38433331372e373734203339342e303435203331312e313137203338332e38346102e08201527f35203331332e393738203337332e3030374c3336362e353238203137332e39366103008201527f324c3336362e353333203137332e393431433336372e323334203137312e32346103208201527f203336352e353732203136382e373032203336322e3831203136382e3236374c6103408201527f3331392e383437203136312e3530325a4d3336392e333932203137342e3431346103608201527f4c3336382e363532203137372e3231374c3331362e383433203337332e3435386103808201527f433331342e3339203338322e373438203332302e303936203339312e343920336103a08201527f32392e353837203339322e3938354c3730392e3831203435322e3836433731396103c08201527f2e333031203435342e333534203732382e393833203434382e303335203733316103e08201527f2e343336203433382e3734354c3738302e373437203235312e3936364c3738336104008201527f2e323435203234322e3530344c3738332e393835203233392e3730314c3336396104208201527f2e333932203137342e3431345a222066696c6c3d2275726c28236469736b65746104408201527f74652d6772616469656e7429222066696c6c2d6f7061636974793d22302e32226104608201526210179f60e91b610480820152610483017f3c7061746820643d224d3333352e3338203230382e313133433333352e39323281527f203230382e313938203333362e343137203230372e363836203333362e32383360208201527f203230372e3137394c3333302e3339203138342e373935433333302e3234392060408201527f3138342e323631203332392e353239203138342e313438203332392e3132392060608201527f3138342e3539374c3331322e333538203230332e343131433331312e3937382060808201527f3230332e383338203331322e313734203230342e343538203331322e3731362060a08201527f3230342e3534344c3331372e393632203230352e3337433331382e333537203260c08201527f30352e343332203331382e353935203230352e373936203331382e343933203260e08201527f30362e3138334c3331342e37203232302e353531433331342e353937203232306101008201527f2e393338203331342e383335203232312e333032203331352e323331203232316101208201527f2e3336344c3332342e353339203232322e3833433332342e393335203232322e6101408201527f383933203332352e333338203232322e363239203332352e3434203232322e326101608201527f34324c3332392e323333203230372e383735433332392e333336203230372e346101808201527f3838203332392e373339203230372e323234203333302e313335203230372e326101a08201527f38364c3333352e3338203230382e3131335a222066696c6c3d2275726c28236d6101c08201526730b4b7149110179f60c11b6101e08201526101e8017f3c7061746820643d224d3331392e323832203236392e303837433331392e383281527f34203236392e313733203332302e333139203236382e363631203332302e313860208201527f36203236382e3135344c3331342e323932203234352e3737433331342e31353160408201527f203234352e323336203331332e343331203234352e313233203331332e30333160608201527f203234352e3537324c3239362e323631203236342e333836433239352e38382060808201527f3236342e383132203239362e303736203236352e343333203239362e3631382060a08201527f3236352e3531384c3330312e383634203236362e333434433330322e3235392060c08201527f3236362e343037203330322e343937203236362e373731203330322e3339352060e08201527f3236372e3135384c3239382e363032203238312e353236433239382e352032386101008201527f312e393133203239382e373337203238322e323737203239392e3133332032386101208201527f322e3333394c3330382e343431203238332e383035433330382e3833372032386101408201527f332e383637203330392e3234203238332e363034203330392e333433203238336101608201527f2e3231374c3331332e313336203236382e383439433331332e323338203236386101808201527f2e343632203331332e363431203236382e313939203331342e303337203236386101a08201527f2e3236314c3331392e323832203236392e3038375a222066696c6c3d22626c616101c08201527f636b222066696c6c2d6f7061636974793d22302e3522202f3e000000000000006101e08201526101f9017f3c7061746820643d224d3330332e313834203333302e303632433330332e373281527f36203333302e313438203330342e323231203332392e363336203330342e303860208201527f38203332392e3132384c3239382e313934203330362e373435433239382e303560408201527f33203330362e323131203239372e333333203330362e303938203239362e393360608201527f33203330362e3534374c3238302e313633203332352e333631433237392e373860808201527f32203332352e373837203237392e393739203332362e343038203238302e353260a08201527f203332362e3439334c3238352e373636203332372e333139433238362e31363160c08201527f203332372e333832203238362e333939203332372e373436203238362e32393760e08201527f203332382e3133334c3238322e353034203334322e353031433238322e3430326101008201527f203334322e383838203238322e363339203334332e323532203238332e3033356101208201527f203334332e3331344c3239322e333434203334342e3738433239322e373339206101408201527f3334342e383432203239332e313432203334342e353739203239332e323435206101608201527f3334342e3139324c3239372e303338203332392e383234433239372e313420336101808201527f32392e343337203239372e353433203332392e313734203239372e39333920336101a08201527f32392e3233364c3330332e313834203333302e3036325a222066696c6c3d22626101c08201527f6c61636b222066696c6c2d6f7061636974793d22302e3522202f3e00000000006101e08201526101fb017f3c70617468207374726f6b653d2275726c28236d61696e2922207374726f6b6581527f2d77696474683d223622207374726f6b652d6c696e656361703d22726f756e6460208201527f22207374726f6b652d6c696e656a6f696e3d22726f756e642220643d224d323960408201527f302e313039203436332e343138433239322e333538203435342e39303220333060608201527f312e323333203434392e3131203330392e393333203435302e34384c3737312e60808201527f3037203532332e303936433737392e3737203532342e3436372037383520353360a08201527f322e3438203738322e373532203534302e3939364c3639322e3038362038383460c08201527f2e3431384c3139392e343433203830362e38344c3239302e313039203436332e60e08201527f3431385a222066696c6c3d22626c61636b222066696c6c2d6f7061636974793d61010082015268111817189a1110179f60b91b61012082015261012901600080516020612a8683398151915281527f756c653d226576656e6f646422207374726f6b653d2275726c28236d61696e2960208201527f22207374726f6b652d77696474683d223622207374726f6b652d6c696e65636160408201527f703d22726f756e6422207374726f6b652d6c696e656a6f696e3d22726f756e6460608201527f2220643d224d3738372e353839203233372e3334394c3436302e33353420313860808201527f352e3831384c3430362e333235203339302e343639433430332e38373220333960a08201527f392e373539203430392e353738203430382e353031203431392e30363920343060c08201527f392e3939364c3731312e393334203435362e313134433732312e34323520343560e08201527f372e363039203733312e313037203435312e3239203733332e3536203434324c6101008201527f3738372e353839203233372e3334395a4d3636302e323639203234352e3031436101208201527f3635352e353233203234342e323633203635302e363832203234372e343233206101408201527f3634392e343536203235322e3036384c3630372e333836203431312e343138436101608201527f3630362e3136203431362e303633203630392e303133203432302e34333420366101808201527f31332e373539203432312e3138314c3638322e343939203433322e30303643366101a08201527f38372e323435203433322e373533203639322e303836203432392e35393420366101c08201527f39332e333132203432342e3934394c3733352e333832203236352e35393943376101e08201527f33362e363038203236302e393534203733332e373535203235362e35383320376102008201527f32392e3031203235352e3833354c3636302e323639203234352e30315a2220666102208201527234b6361e913ab9361411b6b0b4b7149110179f60691b61024082015261025301600080516020612a8683398151915281527f756c653d226576656e6f64642220643d224d3836342e363433203238332e393360208201527f37433836352e313836203238332e363035203836352e373038203238342e323560408201527f37203836352e323339203238342e3638334c3834342e323638203330332e373160608201527f39433834332e393338203330342e303138203834342e303933203330342e353160808201527f37203834342e353236203330342e3534384c3835332e373236203330352e323060a08201527f37433835342e313834203330352e3234203835342e333231203330352e37383760c08201527f203835332e393432203330362e3037314c3833332e383834203332312e31313260e08201527f433833332e353036203332312e333936203833332e363433203332312e3934336101008201527f203833342e313031203332312e3937364c3834342e303037203332322e3638356101208201527f433834342e343931203332322e3732203834342e363035203332332e333139206101408201527f3834342e313737203332332e35384c3739372e373532203335312e39353443376101608201527f39372e323039203335322e323836203739362e363837203335312e36333420376101808201527f39372e313536203335312e3230394c3831382e343033203333312e39323243386101a08201527f31382e373333203333312e363232203831382e353737203333312e31323320386101c08201527f31382e313435203333312e3039324c3830382e373438203333302e34324338306101e08201527f382e323932203333302e333837203830382e313534203332392e3834332038306102008201527f382e353239203332392e3535384c3832382e303534203331342e3734344338326102208201527f382e3433203331342e343539203832382e323931203331332e393135203832376102408201527f2e383335203331332e3838324c3831382e333839203331332e323036433831376102608201527f2e393034203331332e313731203831372e3739203331322e353732203831382e6102808201527f323138203331322e3331314c3836342e363433203238332e3933375a222066696102a08201526c36361e913bb434ba329110179f60991b6102c08201526102cd017f3c67207472616e73666f726d3d226d617472697828302e39383738323720302e81527f313535353537202d302e32353532363120302e3936363837322032353020373360208201527f3529223e3c7465787420666f6e742d66616d696c793d22496e7465722c20736160408201527f6e732d73657269662220666f6e742d7765696768743d22626f6c642220666f6e60608201527f742d73697a653d223432222066696c6c3d2223453545374638223e00000000006080820152609b016121e99161020f565b7f3c2f746578743e3c7465787420666f6e742d66616d696c793d22496e7465722c81527f2073616e732d73657269662220666f6e742d7765696768743d226e6f726d616c60208201527f2220793d2234302220666f6e742d73697a653d223232222066696c6c3d222337604082015266231c189c99111f60c91b60608201526067016122749161020f565b6a1e17ba32bc3a1f1e17b39f60a91b8152600b017f3c696d6167652077696474683d2231363722206865696768743d22313637222081527f7472616e73666f726d3d226d617472697828302e39383738323720302e31353560208201527f353537202d302e32353532363120302e393636383732203434342e313137203560408201526d191a17189b949110343932b31e9160911b6060820152606e0161231a9161020f565b631110179f60e11b8152600401651e3232b3399f60d11b81526006017f3c66696c7465722069643d226469736b657474652d736861646f772220783d2281527f37302e373438392220793d223139352e373132222077696474683d223935352e60208201527f37333322206865696768743d223833322e353538222066696c746572556e697460408201527f733d227573657253706163654f6e5573652220636f6c6f722d696e746572706f60608201527f6c6174696f6e2d66696c746572733d2273524742223e3c6665466c6f6f64206660808201527f6c6f6f642d6f7061636974793d223022202f3e3c6665426c656e6420696e3d2260a08201527f536f757263654772617068696322202f3e3c6665476175737369616e426c757260c08201527f20737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e000060e082015260fe017f3c6c696e6561724772616469656e742069643d226261636b67726f756e64222081527f78313d223533322e35222079313d2230222078323d223533322e35222079323d60208201527f223130363522206772616469656e74556e6974733d227573657253706163654f60408201527f6e557365223e3c73746f70202f3e3c73746f70206f66667365743d223122207360608201527f746f702d636f6c6f723d222331333133313322202f3e3c2f6c696e656172477260808201526630b234b2b73a1f60c91b60a082015260a7017f3c72616469616c4772616469656e742069643d226261636b67726f756e642d7281527f616469616c222063783d2230222063793d22302220723d22312220677261646960208201527f656e74556e6974733d227573657253706163654f6e557365222067726164696560408201527f6e745472616e73666f726d3d227472616e736c617465283533322e352035333260608201527f2e352920726f746174652838392e39363129207363616c652837333529223e3c60808201527039ba37b81039ba37b816b1b7b637b91e9160791b60a082015260b101612616908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d8152601160f91b6020820152602101612650908261020f565b7f222073746f702d6f7061636974793d223022202f3e3c2f72616469616c4772618152653234b2b73a1f60d11b60208201526026017f3c6c696e6561724772616469656e742069643d226469736b657474652d67726181527f6469656e74222078313d223932352e363236222079313d223235362e3839362260208201527f2078323d223133362e373739222079323d223830302e3230332220677261646960408201527f656e74556e6974733d227573657253706163654f6e557365223e3c73746f702060608201526b39ba37b816b1b7b637b91e9160a11b6080820152608c0161273c908261020f565b7f22202f3e3c73746f70206f66667365743d2231222073746f702d636f6c6f723d81527f222332433331334622202f3e3c2f6c696e6561724772616469656e743e0000006020820152603d017f3c6c696e6561724772616469656e742069643d226d61696e223e3c73746f702081526b39ba37b816b1b7b637b91e9160a11b6020820152602c016127cc9161020f565b741110179f1e17b634b732b0b923b930b234b2b73a1f60591b8152601501661e17b232b3399f60c91b8152600701651e17b9bb339f60d11b81526006010390601f1991828101825261281e90826100fc565b612827906129aa565b6040517f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602082015291908290603a82016128619161020f565b03908101825261287190826100fc565b90565b604051906020820182811067ffffffffffffffff821117612899575b60405260008252565b6128a16100e5565b612890565b604051906060820182811067ffffffffffffffff821117612917575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b61291f6100e5565b6128c2565b50634e487b7160e01b600052601160045260246000fd5b600290600219811161294b570190565b610222612924565b6001600160fe1b03811160011661296b575b60021b90565b612973612924565b612965565b906129828261012b565b61298f60405191826100fc565b82815280926129a0601f199161012b565b0190602036910137565b805115612a7c576129b96128a6565b6129dd6129d86129d36129cc855161293b565b6003900490565b612953565b612978565b9160208301918182518301915b828210612a2a57505050600390510680600114612a1757600214612a0c575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c16880101516002860153168501015190820153019391906129ea565b5061287161287456fe3c706174682066696c6c2d72756c653d226576656e6f64642220636c69702d72a3646970667358221220e14654cddfa7065f209546b6da1c216d2afae1f70aea065a1d6abc9475a470086c6578706572696d656e74616cf564736f6c634300080c0041", + "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"color\",\"type\":\"string\"}],\"name\":\"generateBase64\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"generateBase64(string,string,string,string)\":{\"details\":\"Generates a SVG image.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/util/FleekSVG.sol\":\"FleekSVG\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0x95f7195cc0f546e06ab49a57e8d22a0ca482175ffa2a74b71ff4c7c395b7394a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://045d686ba6ddf6e1b296b87511e0610bd838a949e108b75c5f960675c4f8de0a\",\"dweb:/ipfs/QmWTyAVAg4KmoE19iKir78TNtCCjtqhJPqGqt7rNyBA6Qv\"]},\"contracts/FleekBilling.sol\":{\"keccak256\":\"0x6fed8b7faba37011bd15b0bc395ca40e24a85499dec167de6942acabc5407d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1f71b1173e8cd21e14e44e97a1add07d1f08115aa2a4053e40aacfbbc270a19\",\"dweb:/ipfs/QmSej6eRfhhL84SMMFrPJWesTUhMRc4HSTY85b2zAKzzhs\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x33d8a71103d4d5c8c39120e514cce5220530485aa05fb13bb64010daaaaac8a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f4ac13123b77e53ae8ae1c220853254e4f1aae04c8602da594f812e0a5224b3e\",\"dweb:/ipfs/QmXyFDqEJc5fWFVRYLq9bmwMAfuXXdAUTJwSH2dArFgz3v\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", "storageLayout": { "storage": [], "types": null diff --git a/contracts/deployments/mumbai/proxy.json b/contracts/deployments/mumbai/proxy.json index 5bac1b77..6680a18f 100644 --- a/contracts/deployments/mumbai/proxy.json +++ b/contracts/deployments/mumbai/proxy.json @@ -1,5 +1,9 @@ { "FleekERC721": [ + { + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "timestamp": "3/3/2023, 4:43:25 PM" + }, { "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", "timestamp": "2/24/2023, 5:28:44 PM" diff --git a/contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json b/contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json new file mode 100644 index 00000000..d9ea30ea --- /dev/null +++ b/contracts/deployments/mumbai/solcInputs/09b30b8b5b344d233b5dd0c590703447.json @@ -0,0 +1,90 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized < type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721Upgradeable.sol\";\nimport \"./IERC721ReceiverUpgradeable.sol\";\nimport \"./extensions/IERC721MetadataUpgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../utils/StringsUpgradeable.sol\";\nimport \"../../utils/introspection/ERC165Upgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\n using AddressUpgradeable for address;\n using StringsUpgradeable for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC721_init_unchained(name_, symbol_);\n }\n\n function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\n return\n interfaceId == type(IERC721Upgradeable).interfaceId ||\n interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721Upgradeable.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721Upgradeable.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(\n address to,\n uint256 tokenId,\n bytes memory data\n ) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721Upgradeable.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721Upgradeable.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(\n address from,\n address to,\n uint256 tokenId\n ) internal virtual {\n require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(\n address owner,\n address operator,\n bool approved\n ) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256, /* firstTokenId */\n uint256 batchSize\n ) internal virtual {\n if (batchSize > 1) {\n if (from != address(0)) {\n _balances[from] -= batchSize;\n }\n if (to != address(0)) {\n _balances[to] += batchSize;\n }\n }\n }\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 firstTokenId,\n uint256 batchSize\n ) internal virtual {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[44] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721Upgradeable.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721ReceiverUpgradeable {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165Upgradeable.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721Upgradeable is IERC165Upgradeable {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId,\n bytes calldata data\n ) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 tokenId\n ) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool _approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n function __ERC165_init() internal onlyInitializing {\n }\n\n function __ERC165_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165Upgradeable).interfaceId;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = MathUpgradeable.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, MathUpgradeable.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Base64.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides a set of functions to operate with Base64 strings.\n *\n * _Available since v4.5._\n */\nlibrary Base64 {\n /**\n * @dev Base64 Encoding/Decoding Table\n */\n string internal constant _TABLE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n /**\n * @dev Converts a `bytes` to its Bytes64 `string` representation.\n */\n function encode(bytes memory data) internal pure returns (string memory) {\n /**\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n */\n if (data.length == 0) return \"\";\n\n // Loads the table into memory\n string memory table = _TABLE;\n\n // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter\n // and split into 4 numbers of 6 bits.\n // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up\n // - `data.length + 2` -> Round up\n // - `/ 3` -> Number of 3-bytes chunks\n // - `4 *` -> 4 characters for each chunk\n string memory result = new string(4 * ((data.length + 2) / 3));\n\n /// @solidity memory-safe-assembly\n assembly {\n // Prepare the lookup table (skip the first \"length\" byte)\n let tablePtr := add(table, 1)\n\n // Prepare result pointer, jump over length\n let resultPtr := add(result, 32)\n\n // Run over the input, 3 bytes at a time\n for {\n let dataPtr := data\n let endPtr := add(data, mload(data))\n } lt(dataPtr, endPtr) {\n\n } {\n // Advance 3 bytes\n dataPtr := add(dataPtr, 3)\n let input := mload(dataPtr)\n\n // To write each character, shift the 3 bytes (18 bits) chunk\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n // and apply logical AND with 0x3F which is the number of\n // the previous character in the ASCII table prior to the Base64 Table\n // The result is then added to the table to get the character to write,\n // and finally write it in the result pointer but with a left shift\n // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n }\n\n // When data `bytes` is not exactly 3 bytes long\n // it is padded with `=` characters at the end\n switch mod(mload(data), 3)\n case 1 {\n mstore8(sub(resultPtr, 1), 0x3d)\n mstore8(sub(resultPtr, 2), 0x3d)\n }\n case 2 {\n mstore8(sub(resultPtr, 1), 0x3d)\n }\n }\n\n return result;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(\n uint256 x,\n uint256 y,\n uint256 denominator,\n Rounding rounding\n ) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10**64) {\n value /= 10**64;\n result += 64;\n }\n if (value >= 10**32) {\n value /= 10**32;\n result += 32;\n }\n if (value >= 10**16) {\n value /= 10**16;\n result += 16;\n }\n if (value >= 10**8) {\n value /= 10**8;\n result += 8;\n }\n if (value >= 10**4) {\n value /= 10**4;\n result += 4;\n }\n if (value >= 10**2) {\n value /= 10**2;\n result += 2;\n }\n if (value >= 10**1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n}\n" + }, + "contracts/FleekAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nerror MustHaveCollectionRole(uint8 role);\nerror MustHaveTokenRole(uint256 tokenId, uint8 role);\nerror MustHaveAtLeastOneOwner();\nerror RoleAlreadySet();\n\ncontract FleekAccessControl is Initializable {\n /**\n * @dev All available collection roles.\n */\n enum CollectionRoles {\n Owner\n }\n\n /**\n * @dev All available token roles.\n */\n enum TokenRoles {\n Controller\n }\n\n /**\n * @dev Emitted when a token role is changed.\n */\n event TokenRoleChanged(\n uint256 indexed tokenId,\n TokenRoles indexed role,\n address indexed toAddress,\n bool status,\n address byAddress\n );\n\n /**\n * @dev Emitted when token roles version is increased and all token roles are cleared.\n */\n event TokenRolesCleared(uint256 indexed tokenId, address byAddress);\n\n /**\n * @dev Emitted when a collection role is changed.\n */\n event CollectionRoleChanged(\n CollectionRoles indexed role,\n address indexed toAddress,\n bool status,\n address byAddress\n );\n\n /**\n * @dev _collectionRolesCounter[role] is the number of addresses that have the role.\n * This is prevent Owner role to go to 0.\n */\n mapping(CollectionRoles => uint256) private _collectionRolesCounter;\n\n /**\n * @dev _collectionRoles[role][address] is the mapping of addresses that have the role.\n */\n mapping(CollectionRoles => mapping(address => bool)) private _collectionRoles;\n\n /**\n * @dev _tokenRolesVersion[tokenId] is the version of the token roles.\n * The version is incremented every time the token roles are cleared.\n * Should be incremented every token transfer.\n */\n mapping(uint256 => uint256) private _tokenRolesVersion;\n\n /**\n * @dev _tokenRoles[tokenId][version][role][address] is the mapping of addresses that have the role.\n */\n mapping(uint256 => mapping(uint256 => mapping(TokenRoles => mapping(address => bool)))) private _tokenRoles;\n\n /**\n * @dev Initializes the contract by granting the `Owner` role to the deployer.\n */\n function __FleekAccessControl_init() internal onlyInitializing {\n _grantCollectionRole(CollectionRoles.Owner, msg.sender);\n }\n\n /**\n * @dev Checks if the `msg.sender` has a certain role.\n */\n function _requireCollectionRole(CollectionRoles role) internal view {\n if (!hasCollectionRole(role, msg.sender)) revert MustHaveCollectionRole(uint8(role));\n }\n\n /**\n * @dev Checks if the `msg.sender` has the `Token` role for a certain `tokenId`.\n */\n function _requireTokenRole(uint256 tokenId, TokenRoles role) internal view {\n if (!hasTokenRole(tokenId, role, msg.sender)) revert MustHaveTokenRole(tokenId, uint8(role));\n }\n\n /**\n * @dev Returns `True` if a certain address has the collection role.\n */\n function hasCollectionRole(CollectionRoles role, address account) public view returns (bool) {\n return _collectionRoles[role][account];\n }\n\n /**\n * @dev Returns `True` if a certain address has the token role.\n */\n function hasTokenRole(uint256 tokenId, TokenRoles role, address account) public view returns (bool) {\n uint256 currentVersion = _tokenRolesVersion[tokenId];\n return _tokenRoles[tokenId][currentVersion][role][account];\n }\n\n /**\n * @dev Grants the collection role to an address.\n */\n function _grantCollectionRole(CollectionRoles role, address account) internal {\n if (hasCollectionRole(role, account)) revert RoleAlreadySet();\n\n _collectionRoles[role][account] = true;\n _collectionRolesCounter[role] += 1;\n\n emit CollectionRoleChanged(role, account, true, msg.sender);\n }\n\n /**\n * @dev Revokes the collection role of an address.\n */\n function _revokeCollectionRole(CollectionRoles role, address account) internal {\n if (!hasCollectionRole(role, account)) revert RoleAlreadySet();\n if (role == CollectionRoles.Owner && _collectionRolesCounter[role] == 1) revert MustHaveAtLeastOneOwner();\n\n _collectionRoles[role][account] = false;\n _collectionRolesCounter[role] -= 1;\n\n emit CollectionRoleChanged(role, account, false, msg.sender);\n }\n\n /**\n * @dev Grants the token role to an address.\n */\n function _grantTokenRole(uint256 tokenId, TokenRoles role, address account) internal {\n if (hasTokenRole(tokenId, role, account)) revert RoleAlreadySet();\n\n uint256 currentVersion = _tokenRolesVersion[tokenId];\n _tokenRoles[tokenId][currentVersion][role][account] = true;\n\n emit TokenRoleChanged(tokenId, role, account, true, msg.sender);\n }\n\n /**\n * @dev Revokes the token role of an address.\n */\n function _revokeTokenRole(uint256 tokenId, TokenRoles role, address account) internal {\n if (!hasTokenRole(tokenId, role, account)) revert RoleAlreadySet();\n\n uint256 currentVersion = _tokenRolesVersion[tokenId];\n _tokenRoles[tokenId][currentVersion][role][account] = false;\n\n emit TokenRoleChanged(tokenId, role, account, false, msg.sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n function _clearTokenRoles(uint256 tokenId) internal {\n _tokenRolesVersion[tokenId] += 1;\n emit TokenRolesCleared(tokenId, msg.sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "contracts/FleekBilling.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nerror RequiredPayment(uint requiredValue);\n\nabstract contract FleekBilling is Initializable {\n /**\n * @dev Available billing values.\n */\n enum Billing {\n Mint,\n AddAccessPoint\n }\n\n /**\n * @dev Emitted when the billing value is changed.\n */\n event BillingChanged(Billing key, uint256 price);\n\n /**\n * @dev Emitted when contract is withdrawn.\n */\n event Withdrawn(uint256 value, address indexed byAddress);\n\n /**\n * @dev Mapping of billing values.\n */\n mapping(Billing => uint256) public _billings;\n\n /**\n * @dev Initializes the contract by setting default billing values.\n */\n function __FleekBilling_init(uint256[] memory initialBillings) internal onlyInitializing {\n for (uint256 i = 0; i < initialBillings.length; i++) {\n _setBilling(Billing(i), initialBillings[i]);\n }\n }\n\n /**\n * @dev Returns the billing value for a given key.\n */\n function getBilling(Billing key) public view returns (uint256) {\n return _billings[key];\n }\n\n /**\n * @dev Sets the billing value for a given key.\n */\n function _setBilling(Billing key, uint256 price) internal {\n _billings[key] = price;\n emit BillingChanged(key, price);\n }\n\n /**\n * @dev Internal function to require a payment value.\n */\n function _requirePayment(Billing key) internal {\n uint256 requiredValue = _billings[key];\n if (msg.value != _billings[key]) revert RequiredPayment(requiredValue);\n }\n\n /**\n * @dev Internal function to withdraw the contract balance.\n */\n function _withdraw() internal {\n address by = msg.sender;\n uint256 value = address(this).balance;\n\n payable(by).transfer(value);\n emit Withdrawn(value, by);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "contracts/FleekERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"./FleekAccessControl.sol\";\nimport \"./FleekBilling.sol\";\nimport \"./util/FleekStrings.sol\";\nimport \"./FleekPausable.sol\";\n\nerror AccessPointNotExistent();\nerror AccessPointAlreadyExists();\nerror AccessPointScoreCannotBeLower();\nerror MustBeAccessPointOwner();\nerror MustBeTokenOwner(uint256 tokenId);\nerror ThereIsNoTokenMinted();\nerror InvalidTokenIdForAccessPoint();\nerror AccessPointCreationStatusAlreadySet();\n\ncontract FleekERC721 is Initializable, ERC721Upgradeable, FleekAccessControl, FleekPausable, FleekBilling {\n using Strings for uint256;\n using FleekStrings for FleekERC721.App;\n using FleekStrings for FleekERC721.AccessPoint;\n using FleekStrings for string;\n using FleekStrings for uint24;\n\n event NewMint(\n uint256 indexed tokenId,\n string name,\n string description,\n string externalURL,\n string ENS,\n string commitHash,\n string gitRepository,\n string logo,\n uint24 color,\n bool accessPointAutoApproval,\n address indexed minter,\n address indexed owner\n );\n event MetadataUpdate(uint256 indexed _tokenId, string key, string value, address indexed triggeredBy);\n event MetadataUpdate(uint256 indexed _tokenId, string key, uint24 value, address indexed triggeredBy);\n event MetadataUpdate(uint256 indexed _tokenId, string key, string[2] value, address indexed triggeredBy);\n event MetadataUpdate(uint256 indexed _tokenId, string key, bool value, address indexed triggeredBy);\n\n event NewAccessPoint(string apName, uint256 indexed tokenId, address indexed owner);\n event RemoveAccessPoint(string apName, uint256 indexed tokenId, address indexed owner);\n\n event ChangeAccessPointScore(string apName, uint256 indexed tokenId, uint256 score, address indexed triggeredBy);\n\n event ChangeAccessPointNameVerify(\n string apName,\n uint256 tokenId,\n bool indexed verified,\n address indexed triggeredBy\n );\n event ChangeAccessPointContentVerify(\n string apName,\n uint256 tokenId,\n bool indexed verified,\n address indexed triggeredBy\n );\n event ChangeAccessPointCreationStatus(\n string apName,\n uint256 tokenId,\n AccessPointCreationStatus status,\n address indexed triggeredBy\n );\n\n /**\n * The properties are stored as string to keep consistency with\n * other token contracts, we might consider changing for bytes32\n * in the future due to gas optimization.\n */\n struct App {\n string name; // Name of the site\n string description; // Description about the site\n string externalURL; // Site URL\n string ENS; // ENS ID\n uint256 currentBuild; // The current build number (Increments by one with each change, starts at zero)\n mapping(uint256 => Build) builds; // Mapping to build details for each build number\n string logo;\n uint24 color; // Color of the nft\n bool accessPointAutoApproval; // AP Auto Approval\n }\n\n /**\n * The metadata that is stored for each build.\n */\n struct Build {\n string commitHash;\n string gitRepository;\n }\n\n /**\n * Creation status enums for access points\n */\n enum AccessPointCreationStatus {\n DRAFT,\n APPROVED,\n REJECTED,\n REMOVED\n }\n\n /**\n * The stored data for each AccessPoint.\n */\n struct AccessPoint {\n uint256 tokenId;\n uint256 score;\n bool contentVerified;\n bool nameVerified;\n address owner;\n AccessPointCreationStatus status;\n }\n\n uint256 private _appIds;\n mapping(uint256 => App) private _apps;\n mapping(string => AccessPoint) private _accessPoints;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n function initialize(\n string memory _name,\n string memory _symbol,\n uint256[] memory initialBillings\n ) public initializer {\n __ERC721_init(_name, _symbol);\n __FleekAccessControl_init();\n __FleekBilling_init(initialBillings);\n __FleekPausable_init();\n }\n\n /**\n * @dev Checks if the AccessPoint exists.\n */\n modifier requireAP(string memory apName) {\n if (_accessPoints[apName].owner == address(0)) revert AccessPointNotExistent();\n _;\n }\n\n /**\n * @dev Mints a token and returns a tokenId.\n *\n * If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event.\n *\n * Requirements:\n *\n * - the caller must have ``collectionOwner``'s admin role.\n * - billing for the minting may be applied.\n * - the contract must be not paused.\n *\n */\n function mint(\n address to,\n string memory name,\n string memory description,\n string memory externalURL,\n string memory ENS,\n string memory commitHash,\n string memory gitRepository,\n string memory logo,\n uint24 color,\n bool accessPointAutoApproval\n ) public payable requirePayment(Billing.Mint) returns (uint256) {\n uint256 tokenId = _appIds;\n _mint(to, tokenId);\n\n _appIds += 1;\n\n App storage app = _apps[tokenId];\n app.name = name;\n app.description = description;\n app.externalURL = externalURL;\n app.ENS = ENS;\n app.logo = logo;\n app.color = color;\n app.accessPointAutoApproval = accessPointAutoApproval;\n\n // The mint interaction is considered to be the first build of the site. Updates from now on all increment the currentBuild by one and update the mapping.\n app.currentBuild = 0;\n app.builds[0] = Build(commitHash, gitRepository);\n emit NewMint(\n tokenId,\n name,\n description,\n externalURL,\n ENS,\n commitHash,\n gitRepository,\n logo,\n color,\n accessPointAutoApproval,\n msg.sender,\n to\n );\n return tokenId;\n }\n\n /**\n * @dev Returns the token metadata associated with the `tokenId`.\n *\n * Returns a based64 encoded string value of the URI.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n *\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n address owner = ownerOf(tokenId);\n App storage app = _apps[tokenId];\n\n return string(abi.encodePacked(_baseURI(), app.toString(owner).toBase64()));\n }\n\n /**\n * @dev Returns the token metadata associated with the `tokenId`.\n *\n * Returns multiple string and uint values in relation to metadata fields of the App struct.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n *\n */\n function getToken(\n uint256 tokenId\n )\n public\n view\n virtual\n returns (string memory, string memory, string memory, string memory, uint256, string memory, uint24)\n {\n _requireMinted(tokenId);\n App storage app = _apps[tokenId];\n return (app.name, app.description, app.externalURL, app.ENS, app.currentBuild, app.logo, app.color);\n }\n\n /**\n * @dev Returns the last minted tokenId.\n */\n function getLastTokenId() public view virtual returns (uint256) {\n uint256 current = _appIds;\n if (current == 0) revert ThereIsNoTokenMinted();\n return current - 1;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable) returns (bool) {\n return super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev Override of _beforeTokenTransfer of ERC721.\n * Here it needs to update the token controller roles for mint, burn and transfer.\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 tokenId,\n uint256 batchSize\n ) internal virtual override whenNotPaused {\n if (from != address(0) && to != address(0)) {\n // Transfer\n _clearTokenRoles(tokenId);\n } else if (from == address(0)) {\n // Mint\n // TODO: set contract owner as controller\n } else if (to == address(0)) {\n // Burn\n _clearTokenRoles(tokenId);\n }\n super._beforeTokenTransfer(from, to, tokenId, batchSize);\n }\n\n /**\n * @dev A baseURI internal function implementation to be called in the `tokenURI` function.\n */\n function _baseURI() internal view virtual override returns (string memory) {\n return \"data:application/json;base64,\";\n }\n\n /**\n * @dev Updates the `accessPointAutoApproval` settings on minted `tokenId`.\n *\n * May emit a {MetadataUpdate} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setAccessPointAutoApproval(\n uint256 tokenId,\n bool _apAutoApproval\n ) public virtual requireTokenOwner(tokenId) {\n _requireMinted(tokenId);\n _apps[tokenId].accessPointAutoApproval = _apAutoApproval;\n emit MetadataUpdate(tokenId, \"accessPointAutoApproval\", _apAutoApproval, msg.sender);\n }\n\n /**\n * @dev Updates the `externalURL` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenExternalURL} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenExternalURL(\n uint256 tokenId,\n string memory _tokenExternalURL\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].externalURL = _tokenExternalURL;\n emit MetadataUpdate(tokenId, \"externalURL\", _tokenExternalURL, msg.sender);\n }\n\n /**\n * @dev Updates the `ENS` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenENS} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenENS(\n uint256 tokenId,\n string memory _tokenENS\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].ENS = _tokenENS;\n emit MetadataUpdate(tokenId, \"ENS\", _tokenENS, msg.sender);\n }\n\n /**\n * @dev Updates the `name` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenName} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenName(\n uint256 tokenId,\n string memory _tokenName\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].name = _tokenName;\n emit MetadataUpdate(tokenId, \"name\", _tokenName, msg.sender);\n }\n\n /**\n * @dev Updates the `description` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenDescription} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenDescription(\n uint256 tokenId,\n string memory _tokenDescription\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].description = _tokenDescription;\n emit MetadataUpdate(tokenId, \"description\", _tokenDescription, msg.sender);\n }\n\n /**\n * @dev Updates the `logo` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenLogo} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenLogo(\n uint256 tokenId,\n string memory _tokenLogo\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].logo = _tokenLogo;\n emit MetadataUpdate(tokenId, \"logo\", _tokenLogo, msg.sender);\n }\n\n /**\n * @dev Updates the `color` metadata field of a minted `tokenId`.\n *\n * May emit a {NewTokenColor} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenColor(\n uint256 tokenId,\n uint24 _tokenColor\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].color = _tokenColor;\n emit MetadataUpdate(tokenId, \"color\", _tokenColor, msg.sender);\n }\n\n /**\n * @dev Updates the `logo` and `color` metadata fields of a minted `tokenId`.\n *\n * May emit a {NewTokenLogo} and a {NewTokenColor} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenLogoAndColor(uint256 tokenId, string memory _tokenLogo, uint24 _tokenColor) public virtual {\n setTokenLogo(tokenId, _tokenLogo);\n setTokenColor(tokenId, _tokenColor);\n }\n\n /**\n * @dev Add a new AccessPoint register for an app token.\n * The AP name should be a DNS or ENS url and it should be unique.\n * Anyone can add an AP but it should requires a payment.\n *\n * May emit a {NewAccessPoint} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - billing for add acess point may be applied.\n * - the contract must be not paused.\n *\n */\n function addAccessPoint(\n uint256 tokenId,\n string memory apName\n ) public payable whenNotPaused requirePayment(Billing.AddAccessPoint) {\n // require(msg.value == 0.1 ether, \"You need to pay at least 0.1 ETH\"); // TODO: define a minimum price\n _requireMinted(tokenId);\n if (_accessPoints[apName].owner != address(0)) revert AccessPointAlreadyExists();\n\n emit NewAccessPoint(apName, tokenId, msg.sender);\n\n if (_apps[tokenId].accessPointAutoApproval) {\n // Auto Approval is on.\n _accessPoints[apName] = AccessPoint(\n tokenId,\n 0,\n false,\n false,\n msg.sender,\n AccessPointCreationStatus.APPROVED\n );\n\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender);\n } else {\n // Auto Approval is off. Should wait for approval.\n _accessPoints[apName] = AccessPoint(tokenId, 0, false, false, msg.sender, AccessPointCreationStatus.DRAFT);\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.DRAFT, msg.sender);\n }\n }\n\n /**\n * @dev Set approval settings for an access point.\n * It will add the access point to the token's AP list, if `approved` is true.\n *\n * May emit a {ChangeAccessPointApprovalStatus} event.\n *\n * Requirements:\n *\n * - the tokenId must exist and be the same as the tokenId that is set for the AP.\n * - the AP must exist.\n * - must be called by a token controller.\n */\n function setApprovalForAccessPoint(\n uint256 tokenId,\n string memory apName,\n bool approved\n ) public requireTokenOwner(tokenId) {\n AccessPoint storage accessPoint = _accessPoints[apName];\n if (accessPoint.tokenId != tokenId) revert InvalidTokenIdForAccessPoint();\n if (accessPoint.status != AccessPointCreationStatus.DRAFT) revert AccessPointCreationStatusAlreadySet();\n\n if (approved) {\n // Approval\n accessPoint.status = AccessPointCreationStatus.APPROVED;\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.APPROVED, msg.sender);\n } else {\n // Not Approved\n accessPoint.status = AccessPointCreationStatus.REJECTED;\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REJECTED, msg.sender);\n }\n }\n\n /**\n * @dev Remove an AccessPoint registry for an app token.\n * It will also remove the AP from the app token APs list.\n *\n * May emit a {RemoveAccessPoint} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n * - must be called by the AP owner.\n * - the contract must be not paused.\n *\n */\n function removeAccessPoint(string memory apName) public whenNotPaused requireAP(apName) {\n if (msg.sender != _accessPoints[apName].owner) revert MustBeAccessPointOwner();\n _accessPoints[apName].status = AccessPointCreationStatus.REMOVED;\n uint256 tokenId = _accessPoints[apName].tokenId;\n emit ChangeAccessPointCreationStatus(apName, tokenId, AccessPointCreationStatus.REMOVED, msg.sender);\n emit RemoveAccessPoint(apName, tokenId, msg.sender);\n }\n\n /**\n * @dev A view function to gether information about an AccessPoint.\n * It returns a JSON string representing the AccessPoint information.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function getAccessPointJSON(string memory apName) public view requireAP(apName) returns (string memory) {\n AccessPoint storage _ap = _accessPoints[apName];\n return _ap.toString();\n }\n\n /**\n * @dev A view function to check if a AccessPoint is verified.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function isAccessPointNameVerified(string memory apName) public view requireAP(apName) returns (bool) {\n return _accessPoints[apName].nameVerified;\n }\n\n /**\n * @dev Increases the score of a AccessPoint registry.\n *\n * May emit a {ChangeAccessPointScore} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function increaseAccessPointScore(string memory apName) public requireAP(apName) {\n _accessPoints[apName].score++;\n emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender);\n }\n\n /**\n * @dev Decreases the score of a AccessPoint registry if is greater than 0.\n *\n * May emit a {ChangeAccessPointScore} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n *\n */\n function decreaseAccessPointScore(string memory apName) public requireAP(apName) {\n if (_accessPoints[apName].score == 0) revert AccessPointScoreCannotBeLower();\n _accessPoints[apName].score--;\n emit ChangeAccessPointScore(apName, _accessPoints[apName].tokenId, _accessPoints[apName].score, msg.sender);\n }\n\n /**\n * @dev Set the content verification of a AccessPoint registry.\n *\n * May emit a {ChangeAccessPointContentVerify} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n * - the sender must have the token controller role.\n *\n */\n function setAccessPointContentVerify(\n string memory apName,\n bool verified\n ) public requireAP(apName) requireTokenRole(_accessPoints[apName].tokenId, TokenRoles.Controller) {\n _accessPoints[apName].contentVerified = verified;\n emit ChangeAccessPointContentVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender);\n }\n\n /**\n * @dev Set the name verification of a AccessPoint registry.\n *\n * May emit a {ChangeAccessPointNameVerify} event.\n *\n * Requirements:\n *\n * - the AP must exist.\n * - the sender must have the token controller role.\n *\n */\n function setAccessPointNameVerify(\n string memory apName,\n bool verified\n ) public requireAP(apName) requireTokenRole(_accessPoints[apName].tokenId, TokenRoles.Controller) {\n _accessPoints[apName].nameVerified = verified;\n emit ChangeAccessPointNameVerify(apName, _accessPoints[apName].tokenId, verified, msg.sender);\n }\n\n /**\n * @dev Adds a new build to a minted `tokenId`'s builds mapping.\n *\n * May emit a {NewBuild} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must have the `tokenController` role.\n *\n */\n function setTokenBuild(\n uint256 tokenId,\n string memory _commitHash,\n string memory _gitRepository\n ) public virtual requireTokenRole(tokenId, TokenRoles.Controller) {\n _requireMinted(tokenId);\n _apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(_commitHash, _gitRepository);\n emit MetadataUpdate(tokenId, \"build\", [_commitHash, _gitRepository], msg.sender);\n }\n\n /**\n * @dev Burns a previously minted `tokenId`.\n *\n * May emit a {Transfer} event.\n *\n * Requirements:\n *\n * - the tokenId must be minted and valid.\n * - the sender must be the owner of the token.\n * - the contract must be not paused.\n *\n */\n function burn(uint256 tokenId) public virtual requireTokenOwner(tokenId) {\n super._burn(tokenId);\n\n if (bytes(_apps[tokenId].externalURL).length != 0) {\n delete _apps[tokenId];\n }\n }\n\n /*//////////////////////////////////////////////////////////////\n ACCESS CONTROL\n //////////////////////////////////////////////////////////////*/\n\n /**\n * @dev Requires caller to have a selected collection role.\n */\n modifier requireCollectionRole(CollectionRoles role) {\n _requireCollectionRole(role);\n _;\n }\n\n /**\n * @dev Requires caller to have a selected token role.\n */\n modifier requireTokenRole(uint256 tokenId, TokenRoles role) {\n if (ownerOf(tokenId) != msg.sender) _requireTokenRole(tokenId, role);\n _;\n }\n\n /**\n * @dev Requires caller to be selected token owner.\n */\n modifier requireTokenOwner(uint256 tokenId) {\n if (ownerOf(tokenId) != msg.sender) revert MustBeTokenOwner(tokenId);\n _;\n }\n\n /**\n * @dev Grants the collection role to an address.\n *\n * Requirements:\n *\n * - the caller should have the collection role.\n *\n */\n function grantCollectionRole(\n CollectionRoles role,\n address account\n ) public whenNotPaused requireCollectionRole(CollectionRoles.Owner) {\n _grantCollectionRole(role, account);\n }\n\n /**\n * @dev Grants the token role to an address.\n *\n * Requirements:\n *\n * - the caller should have the token role.\n *\n */\n function grantTokenRole(\n uint256 tokenId,\n TokenRoles role,\n address account\n ) public whenNotPaused requireTokenOwner(tokenId) {\n _grantTokenRole(tokenId, role, account);\n }\n\n /**\n * @dev Revokes the collection role of an address.\n *\n * Requirements:\n *\n * - the caller should have the collection role.\n *\n */\n function revokeCollectionRole(\n CollectionRoles role,\n address account\n ) public whenNotPaused requireCollectionRole(CollectionRoles.Owner) {\n _revokeCollectionRole(role, account);\n }\n\n /**\n * @dev Revokes the token role of an address.\n *\n * Requirements:\n *\n * - the caller should have the token role.\n *\n */\n function revokeTokenRole(\n uint256 tokenId,\n TokenRoles role,\n address account\n ) public whenNotPaused requireTokenOwner(tokenId) {\n _revokeTokenRole(tokenId, role, account);\n }\n\n /*//////////////////////////////////////////////////////////////\n PAUSABLE\n //////////////////////////////////////////////////////////////*/\n\n /**\n * @dev Sets the contract to paused state.\n *\n * Requirements:\n *\n * - the sender must have the `controller` role.\n * - the contract must be pausable.\n * - the contract must be not paused.\n *\n */\n function pause() public requireCollectionRole(CollectionRoles.Owner) {\n _pause();\n }\n\n /**\n * @dev Sets the contract to unpaused state.\n *\n * Requirements:\n *\n * - the sender must have the `controller` role.\n * - the contract must be paused.\n *\n */\n function unpause() public requireCollectionRole(CollectionRoles.Owner) {\n _unpause();\n }\n\n /**\n * @dev Sets the contract to pausable state.\n *\n * Requirements:\n *\n * - the sender must have the `owner` role.\n * - the contract must be in the oposite pausable state.\n *\n */\n function setPausable(bool pausable) public requireCollectionRole(CollectionRoles.Owner) {\n _setPausable(pausable);\n }\n\n /*//////////////////////////////////////////////////////////////\n BILLING\n //////////////////////////////////////////////////////////////*/\n\n /**\n * @dev Modifier to require billing with a given key.\n */\n modifier requirePayment(Billing key) {\n _requirePayment(key);\n _;\n }\n\n /**\n * @dev Sets the billing value for a given key.\n *\n * May emit a {BillingChanged} event.\n *\n * Requirements:\n *\n * - the sender must have the `collectionOwner` role.\n *\n */\n function setBilling(Billing key, uint256 value) public requireCollectionRole(CollectionRoles.Owner) {\n _setBilling(key, value);\n }\n\n /**\n * @dev Withdraws all the funds from contract.\n *\n * May emmit a {Withdrawn} event.\n *\n * Requirements:\n *\n * - the sender must have the `collectionOwner` role.\n *\n */\n function withdraw() public requireCollectionRole(CollectionRoles.Owner) {\n _withdraw();\n }\n}\n" + }, + "contracts/FleekPausable.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nerror ContractIsPaused();\nerror ContractIsNotPaused();\nerror ContractIsNotPausable();\nerror PausableIsSetTo(bool state);\n\nabstract contract FleekPausable is Initializable {\n /**\n * @dev Emitted when the pause is triggered by `account` and set to `isPaused`.\n */\n event PauseStatusChange(bool indexed isPaused, address account);\n\n /**\n * @dev Emitted when the pausable is triggered by `account` and set to `isPausable`.\n */\n event PausableStatusChange(bool indexed isPausable, address account);\n\n bool private _paused;\n bool private _canPause; // TODO: how should we verify if the contract is pausable or not?\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __FleekPausable_init() internal onlyInitializing {\n _paused = false;\n _canPause = true;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function isPaused() public view returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Returns true if the contract is pausable, and false otherwise.\n */\n function isPausable() public view returns (bool) {\n return _canPause;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view {\n if (isPaused()) revert ContractIsPaused();\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view {\n if (!isPaused()) revert ContractIsNotPaused();\n }\n\n /**\n * @dev Throws if the contract is not pausable.\n */\n function _requirePausable() internal view {\n if (!isPausable()) revert ContractIsNotPausable();\n }\n\n /**\n * @dev Sets the contract to be pausable or not.\n * @param canPause true if the contract is pausable, and false otherwise.\n */\n function _setPausable(bool canPause) internal {\n if (canPause == _canPause) revert PausableIsSetTo(canPause);\n _canPause = canPause;\n emit PausableStatusChange(canPause, msg.sender);\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal whenNotPaused {\n _requirePausable();\n _paused = true;\n emit PauseStatusChange(false, msg.sender);\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal whenPaused {\n _paused = false;\n emit PauseStatusChange(false, msg.sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "contracts/util/FleekStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"../FleekERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\nimport \"./FleekSVG.sol\";\n\nlibrary FleekStrings {\n using Strings for uint256;\n using Strings for uint160;\n using FleekStrings for bool;\n using FleekStrings for uint24;\n using Strings for uint24;\n\n /**\n * @dev Converts a boolean value to a string.\n */\n function toString(bool _bool) internal pure returns (string memory) {\n return _bool ? \"true\" : \"false\";\n }\n\n /**\n * @dev Converts a string to a base64 string.\n */\n function toBase64(string memory str) internal pure returns (string memory) {\n return Base64.encode(bytes(str));\n }\n\n /**\n * @dev Converts FleekERC721.App to a JSON string.\n * It requires to receive owner address as a parameter.\n */\n function toString(FleekERC721.App storage app, address owner) internal view returns (string memory) {\n // prettier-ignore\n return string(abi.encodePacked(\n '{',\n '\"name\":\"', app.name, '\",',\n '\"description\":\"', app.description, '\",',\n '\"owner\":\"', uint160(owner).toHexString(20), '\",',\n '\"external_url\":\"', app.externalURL, '\",',\n '\"image\":\"', FleekSVG.generateBase64(app.name, app.ENS, app.logo, app.color.toColorString()), '\",',\n '\"access_point_auto_approval\":',app.accessPointAutoApproval.toString(),',',\n '\"attributes\": [',\n '{\"trait_type\": \"ENS\", \"value\":\"', app.ENS,'\"},',\n '{\"trait_type\": \"Commit Hash\", \"value\":\"', app.builds[app.currentBuild].commitHash,'\"},',\n '{\"trait_type\": \"Repository\", \"value\":\"', app.builds[app.currentBuild].gitRepository,'\"},',\n '{\"trait_type\": \"Version\", \"value\":\"', app.currentBuild.toString(),'\"},',\n '{\"trait_type\": \"Color\", \"value\":\"', app.color.toColorString(),'\"}',\n ']',\n '}'\n ));\n }\n\n /**\n * @dev Converts FleekERC721.AccessPoint to a JSON string.\n */\n function toString(FleekERC721.AccessPoint storage ap) internal view returns (string memory) {\n // prettier-ignore\n return string(abi.encodePacked(\n \"{\",\n '\"tokenId\":', ap.tokenId.toString(), \",\",\n '\"score\":', ap.score.toString(), \",\",\n '\"nameVerified\":', ap.nameVerified.toString(), \",\",\n '\"contentVerified\":', ap.contentVerified.toString(), \",\",\n '\"owner\":\"', uint160(ap.owner).toHexString(20), '\",',\n '\"status\":',uint(ap.status).toString(),\n \"}\"\n ));\n }\n\n /**\n * @dev Converts bytes3 to a hex color string.\n */\n function toColorString(uint24 color) internal pure returns (string memory) {\n bytes memory hexBytes = bytes(color.toHexString(3));\n bytes memory hexColor = new bytes(7);\n hexColor[0] = \"#\";\n for (uint256 i = 1; i < 7; i++) {\n hexColor[i] = hexBytes[i + 1];\n }\n return string(hexColor);\n }\n}\n" + }, + "contracts/util/FleekSVG.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.7;\n\nimport \"../FleekERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts/utils/Base64.sol\";\n\nlibrary FleekSVG {\n /**\n * @dev Generates a SVG image.\n */\n function generateBase64(\n string memory name,\n string memory ENS,\n string memory logo,\n string memory color\n ) public pure returns (string memory) {\n return (\n string(\n abi.encodePacked(\n \"data:image/svg+xml;base64,\",\n Base64.encode(\n abi.encodePacked(\n '',\n // background\n '',\n '',\n // shadows\n '',\n '',\n // diskette fill\n '',\n '',\n // arrows\n '',\n '',\n '',\n // body\n '',\n // slider\n '',\n // fleek logo\n '',\n // text\n '',\n name,\n '',\n ENS,\n \"\",\n // logo\n '',\n // defs\n \"\",\n // shadow\n '',\n // bg\n '',\n '',\n // fill gradient\n '',\n // color\n '',\n // end defs\n \"\",\n \"\"\n )\n )\n )\n )\n );\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": true + } + }, + "viaIR": true, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ], + "": [ + "ast" + ] + } + } + } +} \ No newline at end of file diff --git a/ui/src/integrations/ethereum/contracts/FleekERC721.json b/ui/src/integrations/ethereum/contracts/FleekERC721.json index 71d2407b..27c3dabd 100644 --- a/ui/src/integrations/ethereum/contracts/FleekERC721.json +++ b/ui/src/integrations/ethereum/contracts/FleekERC721.json @@ -1,9 +1,29 @@ { - "timestamp": "2/24/2023, 5:28:44 PM", - "address": "0x550Ee47Fa9E0B81c1b9C394FeE62Fe699a955519", - "transactionHash": "0x7076aaf31e50c5f9ddc4aeb1025c8b41e753ee99cc0d15ac5ac26395f04326e3", - "gasPrice": 2500000019, + "timestamp": "3/3/2023, 4:43:25 PM", + "address": "0x37150709cFf366DeEaB836d05CAf49F4DA46Bb2E", + "transactionHash": "0x808546aa8bbc4e36c54d955970d8cfe8c4dc925eb5f65ff7b25203dd312bad4c", + "gasPrice": 1675244309, "abi": [ + { + "inputs": [], + "name": "AccessPointAlreadyExists", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointCreationStatusAlreadySet", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointNotExistent", + "type": "error" + }, + { + "inputs": [], + "name": "AccessPointScoreCannotBeLower", + "type": "error" + }, { "inputs": [], "name": "ContractIsNotPausable", @@ -19,6 +39,16 @@ "name": "ContractIsPaused", "type": "error" }, + { + "inputs": [], + "name": "InvalidTokenIdForAccessPoint", + "type": "error" + }, + { + "inputs": [], + "name": "MustBeAccessPointOwner", + "type": "error" + }, { "inputs": [ { @@ -73,6 +103,17 @@ "name": "PausableIsSetTo", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requiredValue", + "type": "uint256" + } + ], + "name": "RequiredPayment", + "type": "error" + }, { "inputs": [], "name": "RoleAlreadySet", @@ -133,6 +174,25 @@ "name": "ApprovalForAll", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BillingChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -673,6 +733,44 @@ "name": "Transfer", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "byAddress", + "type": "address" + } + ], + "name": "Withdrawn", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "", + "type": "uint8" + } + ], + "name": "_billings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -792,6 +890,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + } + ], + "name": "getBilling", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getLastTokenId", @@ -972,6 +1089,11 @@ "internalType": "string", "name": "_symbol", "type": "string" + }, + { + "internalType": "uint256[]", + "name": "initialBillings", + "type": "uint256[]" } ], "name": "initialize", @@ -1351,6 +1473,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "enum FleekBilling.Billing", + "name": "key", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "setBilling", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1598,10 +1738,17 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" } ], - "bytecode": "0x6080806040523461001657615126908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb146107c857806301ffc9a7146107ac57806306fdde0314610790578063081812fc14610774578063095ea7b31461075c57806323b872dd14610744578063246a908b1461072c57806327dc5cec146107105780632d957aad146106f85780633806f152146106e05780633f4ba83a146106c957806342842e0e146106b157806342966c681461069a57806342e44bbf146106825780634cd88b761461066a5780635aa6ab3b146106525780636352211e1461061d57806370a0823114610601578063736d323a146105ea5780637469a03b146105d357806378278cca146105bb57806383c4c00d1461059f5780638456cb59146105885780638a2e25be146105705780638b9ec9771461053d5780638c3c0a441461052557806394ec65c51461050e57806395d89b41146104f2578063a09a1601146104c2578063a22cb465146104aa578063a27d0b2714610492578063a397c8301461047b578063aad045a214610463578063b187bd2614610437578063b20b94f11461041f578063b30437a01461040c578063b42dbe38146103ac578063b88d4fde14610391578063b948a3c514610379578063c87b56dd14610352578063cdb0e89e1461033a578063d7a75be11461031e578063e4b50cb8146102ee578063e9447250146102ca578063e985e9c51461025d578063eb5fd26b146102455763f931517714610227575061000f565b346102415761023e61023836610a78565b90612ce9565b51f35b5080fd5b50346102415761023e61025736610f27565b906134a5565b5034610241576102c691506102b56102ae61029761027a36610ef4565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b5034610241576102c691506102b56102ae6102976102e736610ad1565b9190611a3e565b5034610241576102c6915061030a610305366108ec565b612a20565b949795969390939291925197889788610e84565b5034610241576102c691506102b561033536610aa7565b613eba565b50346102415761023e61034c36610a78565b9061303b565b5034610241576102c6915061036e610369366108ec565b6125ab565b9051918291826108db565b50346102415761023e61038b36610a78565b9061332d565b50346102415761023e6103a336610e14565b92919091611567565b5034610241576102c691506102b56102ae6104076102976103cc36610808565b9390916103f86103e6826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611a70565b5061023e61041936610a78565b906136c3565b50346102415761023e61043136610b58565b9061401b565b5034610241576102c6915061044b36610873565b60cc54905160ff909116151581529081906020820190565b50346102415761023e61047536610df4565b90612c06565b50346102415761023e61048d36610aa7565b613f8a565b50346102415761023e6104a436610808565b916145b8565b50346102415761023e6104bc36610dc3565b906113b3565b5034610241576102c691506104d636610873565b60cc54905160089190911c60ff16151581529081906020820190565b5034610241576102c6915061050636610873565b61036e6111b6565b50346102415761023e61052036610aa7565b613ee7565b50346102415761023e61053736610ad1565b906146c7565b506102c6915061056161054f36610cac565b98979097969196959295949394612139565b90519081529081906020820190565b50346102415761023e61058236610c6c565b916139cd565b50346102415761059736610873565b61023e614875565b5034610241576102c691506105b336610873565b610561612aeb565b50346102415761023e6105cd36610a78565b90612ec4565b50346102415761023e6105e536610aa7565b613ba6565b50346102415761023e6105fc36610c50565b61493e565b5034610241576102c6915061056161061836610c2d565b610f4a565b5034610241576102c69150610639610634366108ec565b611010565b90516001600160a01b0390911681529081906020820190565b50346102415761023e61066436610bea565b91613561565b50346102415761023e61067c36610b93565b90611a88565b50346102415761023e61069436610b58565b906140bf565b50346102415761023e6106ac366108ec565b6142c4565b50346102415761023e6106c336610925565b9161152d565b5034610241576106d836610873565b61023e6148e1565b50346102415761023e6106f236610b01565b91614158565b50346102415761023e61070a36610ad1565b906144c9565b5034610241576102c6915061036e61072736610aa7565b613d0f565b50346102415761023e61073e36610a78565b906131b0565b50346102415761023e61075636610925565b916114df565b50346102415761023e61076e366108fe565b9061124f565b5034610241576102c6915061063961078b366108ec565b611375565b5034610241576102c691506107a436610873565b61036e6110ff565b5034610241576102c691506102b56107c336610858565b612b17565b50346102415761023e6107da36610808565b916147ac565b6001111561000f57565b600435906001600160a01b03821682141561080157565b5050600080fd5b606090600319011261000f5760043590602435610824816107e0565b906044356001600160a01b03811681141561083c5790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f5760043561087081610845565b90565b600090600319011261000f57565b918091926000905b8282106108a157501161089a575050565b6000910152565b91508060209183015181860152018291610889565b906020916108cf81518092818552858086019101610881565b601f01601f1916010190565b9060206108709281815201906108b6565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610801579060243590565b606090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761099657604052565b61099e610964565b604052565b90601f801991011681019081106001600160401b0382111761099657604052565b604051906109d18261097b565b565b6040519060c082018281106001600160401b0382111761099657604052565b6020906001600160401b038111610a0f575b601f01601f19160190565b610a17610964565b610a04565b929192610a28826109f2565b91610a3660405193846109a3565b829481845281830111610a53578281602093846000960137010152565b5050505050600080fd5b9080601f8301121561095c5781602061087093359101610a1c565b9060406003198301126108015760043591602435906001600160401b03821161083c5761087091600401610a5d565b602060031982011261080157600435906001600160401b03821161095c5761087091600401610a5d565b604090600319011261000f57600435610ae9816107e0565b906024356001600160a01b03811681141561095c5790565b606060031982011261080157600435916001600160401b03602435818111610a535783610b3091600401610a5d565b92604435918211610a535761087091600401610a5d565b610124359081151582141561080157565b604060031982011261080157600435906001600160401b03821161095c57610b8291600401610a5d565b9060243580151581141561095c5790565b906040600319830112610801576001600160401b0360043581811161083c5783610bbf91600401610a5d565b9260243591821161083c5761087091600401610a5d565b610104359062ffffff821682141561080157565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c1991600401610a5d565b9060443562ffffff811681141561083c5790565b602090600319011261000f576004356001600160a01b0381168114156108015790565b602090600319011261000f576004358015158114156108015790565b9060606003198301126108015760043591602435906001600160401b03821161083c57610c9b91600401610a5d565b9060443580151581141561083c5790565b61014060031982011261080157610cc16107ea565b916001600160401b0390602435828111610a5357610ce3846004928301610a5d565b93604435848111610db75781610cfa918401610a5d565b93606435818111610daa5782610d11918501610a5d565b93608435828111610d9c5783610d28918601610a5d565b9360a435838111610d8d5784610d3f918301610a5d565b9360c435848111610d7d5781610d56918401610a5d565b9360e435908111610d7d57610d6b9201610a5d565b90610d74610bd6565b90610870610b47565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b038116811415610801579060243580151581141561095c5790565b604090600319011261000f576004359060243580151581141561095c5790565b906080600319830112610801576001600160a01b039160043583811681141561083c579260243590811681141561083c579160443591606435906001600160401b038211610e795780602383011215610e795781602461087093600401359101610a1c565b505050505050600080fd5b959062ffffff94610ecc610eed95610ebe60c09996610eb0610eda969d9e9d60e08e81815201906108b6565b8c810360208e0152906108b6565b908a820360408c01526108b6565b9088820360608a01526108b6565b91608087015285820360a08701526108b6565b9416910152565b604090600319011261000f576001600160a01b039060043582811681141561095c579160243590811681141561095c5790565b604090600319011261000f576004359060243562ffffff811681141561095c5790565b6001600160a01b03168015610f6a57600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b15610fca57565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b0316610870811515610fc3565b90600182811c92168015611065575b602083101461104d57565b5050634e487b7160e01b600052602260045260246000fd5b91607f1691611042565b906000929180549161108083611033565b9182825260019384811690816000146110e257506001146110a2575b50505050565b90919394506000526020928360002092846000945b8386106110ce57505050500101903880808061109c565b8054858701830152940193859082016110b7565b60ff1916602084015250506040019350389150819050808061109c565b604051906000826065549161111383611033565b80835292600190818116908115611199575060011461113a575b506109d1925003836109a3565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b84831061117e57506109d193505081016020013861112d565b81935090816020925483858a01015201910190918592611165565b94505050505060ff191660208301526109d182604081013861112d565b60405190600082606654916111ca83611033565b8083529260019081811690811561119957506001146111f057506109d1925003836109a3565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b84831061123457506109d193505081016020013861112d565b81935090816020925483858a0101520191019091859261121b565b9061125981611010565b6001600160a01b0381811690841681146113225733149081156112f4575b5015611286576109d191611851565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff915061131a903390610297565b541638611277565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611398906001600160a01b03161515610fc3565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b038116919033831461143457816113f36114049233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b1561148357565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b906109d192916114f76114f28433611603565b61147c565b6116d6565b60405190602082018281106001600160401b03821117611520575b60405260008252565b611528610964565b611517565b90916109d19260405192602084018481106001600160401b0382111761155a575b60405260008452611567565b611562610964565b61154e565b9061158b93929161157b6114f28433611603565b6115868383836116d6565b61195d565b1561159257565b5060405162461bcd60e51b8152806115ac600482016115b0565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b038061161584611010565b16928183169284841494851561164b575b50508315611635575b50505090565b61164191929350611375565b161438808061162f565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611626565b1561168257565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b6116fa906116e384611010565b6001600160a01b038281169390918216841461167b565b83169283156117fb576117788261171587846117d296612b5b565b611737856117316117258a611010565b6001600160a01b031690565b1461167b565b61175e61174e886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b0381166000908152606860205260409020600181540190556117b3856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b038061188a84611010565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b6000908152606760205260409020546109d1906001600160a01b03161515610fc3565b90816020910312610801575161087081610845565b6001600160a01b039182168152911660208201526040810191909152608060608201819052610870929101906108b6565b506040513d6000823e3d90fd5b3d15611958573d9061193e826109f2565b9161194c60405193846109a3565b82523d6000602084013e565b606090565b92909190823b15611a0c57611990926020926000604051809681958294630a85bd0160e11b9a8b855233600486016118ef565b03926001600160a01b03165af1600091816119ec575b506119de575050506119b661192d565b805190816119d957505060405162461bcd60e51b8152806115ac600482016115b0565b602001fd5b6001600160e01b0319161490565b611a059192506119fc3d826109a3565b3d8101906118da565b90386119a6565b50505050600190565b50634e487b7160e01b600052602160045260246000fd5b60011115611a3657565b6109d1611a15565b611a4781611a2c565b6000526098602052604060002090565b611a6081611a2c565b6000526097602052604060002090565b90611a7a81611a2c565b600052602052604060002090565b6000549160ff8360081c161580938194611ba7575b8115611b87575b5015611b2857611aca9183611ac1600160ff196000541617600055565b611b0f57611bb5565b611ad057565b611ae061ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611b2361010061ff00196000541617600055565b611bb5565b50505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611b99575b5038611aa4565b6001915060ff161438611b92565b600160ff8216109150611a9d565b90611bd060ff60005460081c16611bcb81611cf1565b611cf1565b81516001600160401b038111611ce4575b611bf581611bf0606554611033565b611d69565b602080601f8311600114611c5157508190611c2c94600092611c46575b50508160011b916000199060031b1c191617606555611e5a565b611c3461202d565b611c3e600060fe55565b6109d16149b4565b015190503880611c12565b919293601f198416611c8560656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b936000905b828210611ccc575050916001939185611c2c97969410611cb3575b505050811b01606555611e5a565b015160001960f88460031b161c19169055388080611ca5565b80600186978294978701518155019601940190611c8a565b611cec610964565b611be1565b15611cf857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611d5d575050565b60008155600101611d52565b90601f8211611d76575050565b6109d19160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611dc0575b601f0160051c0190611d52565b9091508190611db3565b90601f8211611dd7575050565b6109d19160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611dc057601f0160051c0190611d52565b9190601f8111611e2f57505050565b6109d1926000526020600020906020601f840160051c83019310611dc057601f0160051c0190611d52565b9081516001600160401b038111611f44575b611e8081611e7b606654611033565b611dca565b602080601f8311600114611ebc5750819293600092611eb1575b50508160011b916000199060031b1c191617606655565b015190503880611e9a565b90601f19831694611eef60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b878210611f2c575050836001959610611f13575b505050811b01606655565b015160001960f88460031b161c19169055388080611f08565b80600185968294968601518155019501930190611ef4565b611f4c610964565b611e6c565b91909182516001600160401b038111612020575b611f7981611f738454611033565b84611e20565b602080601f8311600114611fb5575081929394600092611faa575b50508160011b916000199060031b1c1916179055565b015190503880611f94565b90601f19831695611fcb85600052602060002090565b926000905b88821061200857505083600195969710611fef575b505050811b019055565b015160001960f88460031b161c19169055388080611fe5565b80600185968294968601518155019501930190611fd0565b612028610964565b611f65565b600061203f60ff825460081c16611cf1565b808052609860209081526040808320336000908152925290205460ff166120e2578080526098602090815260408083203360009081529252902061208b905b805460ff19166001179055565b8080526097602052604081206120a1815461210d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161211d570190565b6121256120f6565b0190565b600290600219811161211d570190565b9394959891969790929761214b612545565b60fe54998a9761215b898861243a565b60fe546121679061210d565b60fe5561217e8960005260ff602052604060002090565b6121888782611f51565b6121958b60018301611f51565b6121a28c60028301611f51565b6121af8960038301611f51565b6121bc8460068301611f51565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff881617179055600060048201556121f06109c4565b908282528360208301526005016122109060008052602052604060002090565b9061221a9161225e565b604051978897600160a01b60019003169b339b612237988a612355565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b038111612348575b612287816122818654611033565b86611e20565b6020928390601f83116001146122d3579180600194926109d19796946000926122c8575b5050600019600383901b1c191690841b1784555b01519101611f51565b0151905038806122ab565b90601f198316916122e987600052602060002090565b9260005b818110612331575092600195939285926109d1999896889510612318575b505050811b0184556122bf565b015160001960f88460031b161c1916905538808061230b565b9293876001819287860151815501950193016122ed565b612350610964565b612273565b979998959062ffffff956123b56123df966123a78c6101009c986123996123d19961238b6123c3996101208087528601906108b6565b9084820360208601526108b6565b9160408184039101526108b6565b8c810360608e0152906108b6565b908a820360808c01526108b6565b9088820360a08a01526108b6565b9086820360c08801526108b6565b951660e08401521515910152565b156123f457565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156124fd576000838152606760205260409020546124d39190612475906001600160a01b031615155b156123ed565b61247d6149d6565b6000848152606760205260409020546124a0906001600160a01b0316151561246f565b6001600160a01b0381166000908152606860205260409020600181540190556117b3846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561257e57565b5060405163070198dd60e51b815260006004820152602490fd5b9061212560209282815194859201610881565b6000818152606760205260409020546125ce906001600160a01b03161515610fc3565b6125d781611010565b9060005260ff602052604060002061262d604051926125f58461097b565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b0316614ec1565b61266f6003830160078401600061264f61264a835462ffffff1690565b614fbc565b6040518095819263891c235f60e01b835260068a01878b60048601614bf7565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612a13575b6000936129f0575b5054908160181c60ff166126ab90614f76565b906005860190600487015492826126cd85809590600052602052604060002090565b936126e19190600052602052604060002090565b600101936126ee90614cbb565b9462ffffff166126fd90614fbc565b604051607b60f81b602082015267113730b6b2911d1160c11b602182015298899891979161272e60298b0183614c3f565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f0161275e9060018401614c3f565b61088b60f21b8152600201681137bbb732b9111d1160b91b815260090161278491612598565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b81526010016127b491600201614c3f565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b81526009016127da91612598565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d0161281491612598565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f0161286591614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b60208201526027016128b091614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b60208201526026016128fa91614c3f565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b602082015260230161294191612598565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b602082015260210161298691612598565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f199182810182526129ba90826109a3565b6129c390614abe565b91604051928391602083016129d791612598565b6129e091612598565b03908101825261087090826109a3565b612a0c91933d90823e612a033d826109a3565b3d810190614b99565b9138612698565b612a1b611920565b612690565b600081815260676020526040902054612a43906001600160a01b03161515610fc3565b60005260ff60205260409081600020600481015462ffffff600783015416938051612a7981612a72818761106f565b03826109a3565b948151612a8d81612a72816001890161106f565b946006612aca8451612aa681612a728160028c0161106f565b96612a728651612abd81612a72816003870161106f565b979651809481930161106f565b9190565b60018110612ade575b6000190190565b612ae66120f6565b612ad7565b60fe548015612b035760018110612ade576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612b4a575b8115612b3c575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612b32565b90612b646149d6565b6001600160a01b0391821615158080612ba4575b15612b89575050506109d190612baf565b612b9257505050565b1615612b9b5750565b6109d190612baf565b508282161515612b78565b80600052609960205260406000206001815481198111612bf9575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612c016120f6565b612bca565b612c0f81611010565b6001600160a01b0316331415612cce57600081815260676020526040902054612c42906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612cf281611010565b6001600160a01b0316331415612e27575b600081815260676020526040902054612d26906001600160a01b03161515610fc3565b80600052602060ff8152600260406000200190835180916001600160401b038211612e1a575b612d5a826122818654611033565b80601f8311600114612dac5750600091612da1575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582612e35565b905084015138612d6f565b9150601f198316612dc285600052602060002090565b926000905b828210612e025750509083600194939210612de9575b5050811b019055612d83565b86015160001960f88460031b161c191690553880612ddd565b80600185968294968c01518155019501930190612dc7565b612e22610964565b612d4c565b612e3081612e68565b612d03565b9060806108709260408152600b60408201526a195e1d195c9b985b15549360aa1b606082015281602082015201906108b6565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615612ea6575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b612ecd81611010565b6001600160a01b0316331415613002575b600081815260676020526040902054612f01906001600160a01b03161515610fc3565b80600052602060ff8152600360406000200190835180916001600160401b038211612ff5575b612f35826122818654611033565b80601f8311600114612f875750600091612f7c575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613010565b905084015138612f4a565b9150601f198316612f9d85600052602060002090565b926000905b828210612fdd5750509083600194939210612fc4575b5050811b019055612f5e565b86015160001960f88460031b161c191690553880612fb8565b80600185968294968c01518155019501930190612fa2565b612ffd610964565b612f27565b61300b81612e68565b612ede565b90608061087092604081526003604082015262454e5360e81b606082015281602082015201906108b6565b61304481611010565b6001600160a01b0316331415613176575b600081815260676020526040902054613078906001600160a01b03161515610fc3565b80600052602060ff8152604060002090835180916001600160401b038211613169575b6130a9826122818654611033565b80601f83116001146130fb57506000916130f0575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613184565b9050840151386130be565b9150601f19831661311185600052602060002090565b926000905b8282106131515750509083600194939210613138575b5050811b0190556130d2565b86015160001960f88460031b161c19169055388061312c565b80600185968294968c01518155019501930190613116565b613171610964565b61309b565b61317f81612e68565b613055565b906080610870926040815260046040820152636e616d6560e01b606082015281602082015201906108b6565b6131b981611010565b6001600160a01b03163314156132ec575b6000818152606760205260409020546131ed906001600160a01b03161515610fc3565b80600052602060ff8152600180604060002001918451906001600160401b0382116132df575b613221826122818654611033565b80601f8311600114613274575081928291600093613269575b501b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd3395826132fa565b87015192503861323a565b9082601f19811661328a87600052602060002090565b936000905b878383106132c557505050106132ac575b5050811b01905561324b565b86015160001960f88460031b161c1916905538806132a0565b8b860151875590950194938401938693509081019061328f565b6132e7610964565b613213565b6132f581612e68565b6131ca565b9060806108709260408152600b60408201526a3232b9b1b934b83a34b7b760a91b606082015281602082015201906108b6565b61333681611010565b6001600160a01b031633141561346b575b60008181526067602052604090205461336a906001600160a01b03161515610fc3565b80600052602060ff8152600660406000200190835180916001600160401b03821161345e575b61339e826122818654611033565b80601f83116001146133f057506000916133e5575b508160011b916000199060031b1c19161790555b6000805160206150c3833981519152604051806120dd339582613479565b9050840151386133b3565b9150601f19831661340685600052602060002090565b926000905b828210613446575050908360019493921061342d575b5050811b0190556133c7565b86015160001960f88460031b161c191690553880613421565b80600185968294968c0151815501950193019061340b565b613466610964565b613390565b61347481612e68565b613347565b906080610870926040815260046040820152636c6f676f60e01b606082015281602082015201906108b6565b6134ae81611010565b6001600160a01b0316331415613553575b6000818152606760205260409020546134e2906001600160a01b03161515610fc3565b600081815260ff60205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b61355c81612e68565b6134bf565b9291909261356e81611010565b6001600160a01b03163314156136b5575b6000818152606760205260409020546135a2906001600160a01b03161515610fc3565b8060005260209360ff855260066040600020018151956001600160401b0387116136a8575b6135d587611f738454611033565b80601f8811600114613637575095806109d1969760009161362c575b508160011b916000199060031b1c19161790555b816000805160206150c383398151915260405180613624339582613479565b0390a36134a5565b9050830151386135f1565b90601f19881661364c84600052602060002090565b926000905b8282106136905750509188916109d1989960019410613677575b5050811b019055613605565b85015160001960f88460031b161c19169055388061366b565b80600185968294968a01518155019501930190613651565b6136b0610964565b6135c7565b6136be81612e68565b61357f565b7fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8906136ed6149d6565b6136f6816118b7565b6137276001600160a01b03613720600261370f87613825565b015460101c6001600160a01b031690565b161561384c565b604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca233928061375988826108db565b0390a361378060076137758360005260ff602052604060002090565b015460181c60ff1690565b156137da576137d5906137c76137946109d3565b828152600060208201819052604082018190526060820152336080820152600160a08201526137c286613825565b6138a3565b60405191829133958361397f565b0390a2565b6137d5906138176137e96109d3565b828152600060208201819052604082018190526060820152336080820152600060a08201526137c286613825565b60405191829133958361395b565b602061383e918160405193828580945193849201610881565b810161010081520301902090565b1561385357565b5060405162461bcd60e51b815260206004820152601e60248201527f466c65656b4552433732313a20415020616c72656164792065786973747300006044820152606490fd5b60041115611a3657565b600290825181556020830151600182015501906138d260408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a09092015161392481613899565b600481101561394e575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613956611a15565b61392e565b6040906139756000939594956060835260608301906108b6565b9460208201520152565b6040906139756001939594956060835260608301906108b6565b6040906139756002939594956060835260608301906108b6565b6040906139756003939594956060835260608301906108b6565b90916139d882611010565b6001600160a01b0316331415613b0c576139f183613825565b918083541415613a865760027fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8930191613a42613a33845460ff9060b01c1690565b613a3c81613899565b15613b28565b15613a6257815460ff60b01b1916600160b01b179091556137d5906137c7565b815460ff60b01b1916600160b11b179091556137d590604051918291339583613999565b505050505060a460405162461bcd60e51b815260206004820152604e60248201527f466c65656b4552433732313a207468652070617373656420746f6b656e49642060448201527f6973206e6f74207468652073616d65206173207468652061636365737320706f60648201526d34b73a13b9903a37b5b2b724b21760911b6084820152fd5b50905060249150604051906355d2292f60e11b82526004820152fd5b15613b2f57565b5060405162461bcd60e51b815260206004820152604260248201527f466c65656b4552433732313a207468652061636365737320706f696e7420637260448201527f656174696f6e2073746174757320686173206265656e20736574206265666f72606482015261329760f11b608482015260a490fd5b613bae6149d6565b6001600160a01b03613bd2816002613bc585613825565b015460101c161515613cc2565b6002613bdd83613825565b015460101c16331415613c7b57613c0c6002613bf883613825565b01805460ff60b01b1916600360b01b179055565b613c1581613825565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613c488587836139b3565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db0604051806120dd3395826108db565b505060405162461bcd60e51b815260206004820152601d60248201527f466c65656b4552433732313a206d757374206265204150206f776e65720000006044820152606490fd5b15613cc957565b5060405162461bcd60e51b815260206004820152601760248201527f466c65656b4552433732313a20696e76616c69642041500000000000000000006044820152606490fd5b6001600160a01b039081613d2282613825565b6002015460101c161515613d3590613cc2565b613d3e90613825565b908154613d4a90614cbb565b906001830154613d5990614cbb565b92600201548060081c60ff16613d6e90614f76565b91613d7b60ff8316614f76565b908260101c16613d8a90614ec1565b9160b01c60ff16613d9a81613899565b613da390614cbb565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613dd691612598565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613dfa91612598565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613e2591612598565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613e5391612598565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613e7891612598565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613e9e91612598565b607d60f81b815260010103601f198101825261087090826109a3565b60ff90600290613ede90613ed96001600160a01b0384613bc584613825565b613825565b015460081c1690565b613efd6001600160a01b036002613bc584613825565b6001613f0882613825565b01613f138154613f5e565b9055613f1e81613825565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee436120dd6001613f4e85613825565b0154604051918291339683613f6e565b600190600019811461211d570190565b929190613f856020916040865260408601906108b6565b930152565b613fa06001600160a01b036002613bc584613825565b6001613fab82613825565b015415613fc8576001613fbd82613825565b01613f13815461400e565b5050606460405162461bcd60e51b815260206004820152602060248201527f466c65656b4552433732313a2073636f72652063616e74206265206c6f7765726044820152fd5b8015612ade576000190190565b6001600160a01b03614032816002613bc585613825565b61403b82613825565b549061404682611010565b163314156140b0575b5061407182600261405f84613825565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff6120dd61409e83613825565b54604051918291339615159583613f6e565b6140b990612e68565b3861404f565b6001600160a01b036140d6816002613bc585613825565b6140df82613825565b54906140ea82611010565b16331415614149575b5061411c82600261410384613825565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c6120dd61409e83613825565b61415290612e68565b386140f3565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b9061418583611010565b6001600160a01b0316331415614248575b6000838152606760205260409020546141b9906001600160a01b03161515610fc3565b60409061421e82518381018181106001600160401b0382111761423b575b84528681528260208201528560005260ff6020526142196005856000200160048660002001906142078254613f5e565b80925590600052602052604060002090565b61225e565b6142266109c4565b948552602085015251806120dd339582614256565b614243610964565b6141d7565b61425183612e68565b614196565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b6002821061429857505050505090565b909192939483806142b5600193607f1989820301865289516108b6565b97019201920190939291614288565b6142cd81611010565b6001600160a01b039081163314156143ec5760008183926142ed84611010565b6142f56149d6565b16151580806143e5575b83146143ce575061430f83612baf565b61431883611010565b61432f61174e856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561436561174e856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46143ab60026143a58360005260ff602052604060002090565b01614406565b6143b25750565b6143c96109d19160005260ff602052604060002090565b614481565b6143d75761430f565b6143e083612baf565b61430f565b50826142ff565b5060249150604051906355d2292f60e11b82526004820152fd5b6108709054611033565b6001600160fe1b038111600116614428575b60021b90565b6144306120f6565b614422565b61443f8154611033565b9081614449575050565b81601f6000931160011461445b575055565b8183526020832061447791601f0160051c810190600101611d52565b8160208120915555565b600760009161448f81614435565b61449b60018201614435565b6144a760028201614435565b6144b360038201614435565b8260048201556144c560068201614435565b0155565b6144d16149d6565b6144d9612545565b6144e281611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166145a35761451581611a2c565b60008181526098602090815260408083206001600160a01b038616845290915290206145409061207e565b61454981611a57565b614553815461210d565b905561455e81611a2c565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516397b705ed60e01b815260049150fd5b6145c06149d6565b6145c981611010565b6001600160a01b039081163314156146aa578160005260996020526146116102ae8561029786610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc7821189061466e61207e8661029787610407614659896000526099602052604060002090565b546103f88a600052609a602052604060002090565b61467784611a2c565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b6146cf6149d6565b6146d7612545565b6146ee6146ea6102ae8461029785611a3e565b1590565b6145a3576146fb81611a2c565b801580614799575b614784576147216147178361029784611a3e565b805460ff19169055565b61472a81611a57565b6147348154612ace565b905561473f81611a2c565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a91819081016120dd565b50506040516360ed092b60e01b815260049150fd5b5060016147a582611a57565b5414614703565b6147b46149d6565b6147bd81611010565b6001600160a01b039081163314156146aa578160005260996020526148086146ea6102ae8661029787610407604060002054609a602052604060002090600052602052604060002090565b614694577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906148506147178661029787610407614659896000526099602052604060002090565b61485984611a2c565b604080516000815233602082015291909516948190810161468f565b61487d612545565b6148856149d6565b60cc5460ff8160081c16156148cd5760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b6148e9612545565b60cc5460ff81161561492a5760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614946612545565b60cc549015159060ff8160081c161515821461499a5761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b6149c560ff60005460081c16611cf1565b60cc805461ffff1916610100179055565b60ff60cc54166149e257565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614a65575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614a6d610964565b614a10565b60405190614a7f8261097b565b6008825260203681840137565b90614a96826109f2565b614aa360405191826109a3565b8281528092614ab4601f19916109f2565b0190602036910137565b805115614b9057614acd6149f5565b614af1614aec614ae7614ae08551612129565b6003900490565b614410565b614a8c565b9160208301918182518301915b828210614b3e57505050600390510680600114614b2b57600214614b20575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614afe565b506108706114fc565b60208183031261095c578051906001600160401b03821161083c570181601f8201121561095c578051614bcb816109f2565b92614bd960405194856109a3565b8184526020828401011161083c576108709160208085019101610881565b92614c236108709593614c15614c319460808852608088019061106f565b90868203602088015261106f565b90848203604086015261106f565b9160608184039101526108b6565b600092918154614c4e81611033565b92600191808316908115614ca65750600114614c6a5750505050565b90919293945060005260209081600020906000915b858310614c95575050505001903880808061109c565b805485840152918301918101614c7f565b60ff191684525050500191503880808061109c565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614df0575b506d04ee2d6d415b85acef810000000080831015614de1575b50662386f26fc1000080831015614dd2575b506305f5e10080831015614dc3575b5061271080831015614db4575b506064821015614da4575b600a80921015614d9a575b600190816021614d52828701614a8c565b95860101905b614d64575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614d9557919082614d58565b614d5d565b9160010191614d41565b9190606460029104910191614d36565b60049193920491019138614d2b565b60089193920491019138614d1e565b60109193920491019138614d0f565b60209193920491019138614cfd565b604093508104915038614ce4565b60405190614e0b8261097b565b6007825260203681840137565b50634e487b7160e01b600052603260045260246000fd5b602090805115614e3d570190565b612125614e18565b602190805160011015614e3d570190565b906020918051821015614e6857010190565b614e70614e18565b010190565b15614e7c57565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117614f69575b604052602a825260403660208401376030614ef683614e2f565b536078614f0283614e45565b536029905b60018211614f1a57610870915015614e75565b80600f614f5692166010811015614f5c575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8486614e56565b5360041c9161400e565b90614f07565b614f64614e18565b614f2c565b614f71610964565b614edc565b15614f9b57604051614f878161097b565b60048152637472756560e01b602082015290565b604051614fa78161097b565b600581526466616c736560d81b602082015290565b62ffffff16614fc9614a72565b906030614fd583614e2f565b536078614fe183614e45565b5360079081905b6001821161507d57614ffb915015614e75565b615003614dfe565b91825115615070575b60236020840153600190815b838110615026575050505090565b61505e906001198111615063575b6001600160f81b031961504982860185614e56565b511660001a6150588288614e56565b53613f5e565b615018565b61506b6120f6565b615034565b615078614e18565b61500c565b80600f6150af921660108110156150b5575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a614f4c8487614e56565b90614fe8565b6150bd614e18565b61508f56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a3646970667358221220649d06dd22516cb769346c4d824089015f3dc6af7ad4ca0d63914e92c2f6e0046c6578706572696d656e74616cf564736f6c634300080c0041", - "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - the contract must be not paused. IMPORTANT: The payment is not set yet\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string)\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0xebea929fabed84ed7e45572a13124087264e732a1b55dd7b07c5c26fcde46566\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://232fcba746f4bea888df7258a57031fbe82c6782861941b21a2b745766b8f97d\",\"dweb:/ipfs/QmSnK97Z6Mk1CXvGbf9PbK4Wi3MFNYLcy1vRrXaFSEQgfx\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x4e72d7848d5c44fcc6502054e74d26ede597641342be60e1f8c2978f607db715\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c020f490edc637208060b41dda06ea99c0dc9714917e4cb7729268b8a8ec85f2\",\"dweb:/ipfs/QmRmwK8YXk19kYG9w1qNMe2FAVEtRytKow4u8TRJyb3NPJ\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", + "bytecode": "0x60808060405234610016576152f2908161001d8239f35b50600080fdfe6040608081526004361015610015575b50600080fd5b600090813560e01c806301468deb1461083f57806301ffc9a71461082357806302dba24d146104a757806306fdde0314610807578063081812fc146107eb578063095ea7b3146107d357806323b872dd146107bb578063246a908b146107a357806327dc5cec146107875780632d957aad1461076f5780633806f152146107575780633ccfd60b146107405780633e233205146107285780633f4ba83a1461071157806342842e0e146106f957806342966c68146106e257806342e44bbf146106ca5780635aa6ab3b146106b25780636352211e1461067d57806370a0823114610661578063736d323a1461064a5780637469a03b1461063357806378278cca1461061b57806383c4c00d146105ff5780638456cb59146105e85780638a2e25be146105d05780638b9ec977146105ac5780638c3c0a441461059457806394ec65c51461057d57806395d89b4114610561578063a09a160114610531578063a22cb46514610519578063a27d0b2714610501578063a397c830146104ea578063aad045a2146104d2578063ac8cf285146104a7578063b187bd261461047b578063b20b94f114610463578063b30437a014610450578063b42dbe38146103f0578063b88d4fde146103d5578063b948a3c5146103bd578063ba4c458a146103a5578063c87b56dd1461037e578063cdb0e89e14610366578063d7a75be11461034a578063e4b50cb81461031a578063e9447250146102f6578063e985e9c514610289578063eb5fd26b146102715763f931517714610253575061000f565b3461026d5761026a61026436610b0a565b90612f73565b51f35b5080fd5b503461026d5761026a61028336611095565b90613734565b503461026d576102f291506102e16102da6102c36102a636611062565b6001600160a01b039091166000908152606a602052604090209091565b9060018060a01b0316600052602052604060002090565b5460ff1690565b905190151581529081906020820190565b0390f35b503461026d576102f291506102e16102da6102c361031336610b63565b9190611b95565b503461026d576102f291506103366103313661097e565b612ca7565b949795969390939291925197889788610ff2565b503461026d576102f291506102e161036136610b39565b613fc4565b503461026d5761026a61037836610b0a565b906132c7565b503461026d576102f2915061039a6103953661097e565b612831565b90519182918261096d565b503461026d5761026a6103b736610f31565b91611bdf565b503461026d5761026a6103cf36610b0a565b906135bb565b503461026d5761026a6103e736610ec1565b929190916116d5565b503461026d576102f291506102e16102da61044b6102c36104103661087f565b93909161043c61042a826000526099602052604060002090565b5491600052609a602052604060002090565b90600052602052604060002090565b611bc7565b5061026a61045d36610b0a565b90613954565b503461026d5761026a61047536610c09565b9061410a565b503461026d576102f2915061048f36610905565b60cc54905160ff909116151581529081906020820190565b503461026d576102f291506104c36104be366108ea565b610e99565b90519081529081906020820190565b503461026d5761026a6104e436610e62565b90612e8f565b503461026d5761026a6104fc36610b39565b6140a3565b503461026d5761026a6105133661087f565b91614722565b503461026d5761026a61052b36610e31565b90611521565b503461026d576102f2915061054536610905565b60cc54905160089190911c60ff16151581529081906020820190565b503461026d576102f2915061057536610905565b61039a611324565b503461026d5761026a61058f36610b39565b61400c565b503461026d5761026a6105a636610b63565b90614831565b506102f291506104c36105be36610d1a565b9897909796919695929594939461238a565b503461026d5761026a6105e236610cda565b91613c2a565b503461026d576105f736610905565b61026a6149df565b503461026d576102f2915061061336610905565b6104c3612d73565b503461026d5761026a61062d36610b0a565b9061314f565b503461026d5761026a61064536610b39565b613d26565b503461026d5761026a61065c36610cbe565b614aa8565b503461026d576102f291506104c361067836610c9b565b6110b8565b503461026d576102f291506106996106943661097e565b61117e565b90516001600160a01b0390911681529081906020820190565b503461026d5761026a6106c436610c58565b916137f1565b503461026d5761026a6106dc36610c09565b906141cb565b503461026d5761026a6106f43661097e565b6143d9565b503461026d5761026a61070b366109b7565b9161169b565b503461026d5761072036610905565b61026a614a4b565b503461026d5761026a61073a36610bd9565b90614b1e565b503461026d5761074f36610905565b61026a614b30565b503461026d5761026a61076936610b93565b9161426c565b503461026d5761026a61078136610b63565b906145e0565b503461026d576102f2915061039a61079e36610b39565b613e1f565b503461026d5761026a6107b536610b0a565b9061343d565b503461026d5761026a6107cd366109b7565b9161164d565b503461026d5761026a6107e536610990565b906113bd565b503461026d576102f291506106996108023661097e565b6114e3565b503461026d576102f2915061081b36610905565b61039a61126d565b503461026d576102f291506102e161083a366108cf565b612da0565b503461026d5761026a6108513661087f565b91614916565b6001111561000f57565b600435906001600160a01b03821682141561087857565b5050600080fd5b606090600319011261000f576004359060243561089b81610857565b906044356001600160a01b0381168114156108b35790565b50505050600080fd5b6001600160e01b03198116141561000f57565b602090600319011261000f576004356108e7816108bc565b90565b602090600319011261000f5760043560028110156108785790565b600090600319011261000f57565b918091926000905b82821061093357501161092c575050565b6000910152565b9150806020918301518186015201829161091b565b9060209161096181518092818552858086019101610913565b601f01601f1916010190565b9060206108e7928181520190610948565b602090600319011261000f5760043590565b604090600319011261000f576004356001600160a01b038116811415610878579060243590565b606090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee579060443590565b505050600080fd5b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610a2857604052565b610a306109f6565b604052565b90601f801991011681019081106001600160401b03821117610a2857604052565b60405190610a6382610a0d565b565b6040519060c082018281106001600160401b03821117610a2857604052565b6020906001600160401b038111610aa1575b601f01601f19160190565b610aa96109f6565b610a96565b929192610aba82610a84565b91610ac86040519384610a35565b829481845281830111610ae5578281602093846000960137010152565b5050505050600080fd5b9080601f830112156109ee578160206108e793359101610aae565b9060406003198301126108785760043591602435906001600160401b0382116108b3576108e791600401610aef565b602060031982011261087857600435906001600160401b0382116109ee576108e791600401610aef565b604090600319011261000f57600435610b7b81610857565b906024356001600160a01b0381168114156109ee5790565b606060031982011261087857600435916001600160401b03602435818111610ae55783610bc291600401610aef565b92604435918211610ae5576108e791600401610aef565b604090600319011261000f576004356002811015610878579060243590565b610124359081151582141561087857565b604060031982011261087857600435906001600160401b0382116109ee57610c3391600401610aef565b906024358015158114156109ee5790565b610104359062ffffff821682141561087857565b9060606003198301126108785760043591602435906001600160401b0382116108b357610c8791600401610aef565b9060443562ffffff81168114156108b35790565b602090600319011261000f576004356001600160a01b0381168114156108785790565b602090600319011261000f576004358015158114156108785790565b9060606003198301126108785760043591602435906001600160401b0382116108b357610d0991600401610aef565b906044358015158114156108b35790565b61014060031982011261087857610d2f610861565b916001600160401b0390602435828111610ae557610d51846004928301610aef565b93604435848111610e255781610d68918401610aef565b93606435818111610e185782610d7f918501610aef565b93608435828111610e0a5783610d96918601610aef565b9360a435838111610dfb5784610dad918301610aef565b9360c435848111610deb5781610dc4918401610aef565b9360e435908111610deb57610dd99201610aef565b90610de2610c44565b906108e7610bf8565b5050505050505050505050600080fd5b50505050505050505050600080fd5b505050505050505050600080fd5b5050505050505050600080fd5b50505050505050600080fd5b604090600319011261000f576004356001600160a01b03811681141561087857906024358015158114156109ee5790565b604090600319011261000f57600435906024358015158114156109ee5790565b50634e487b7160e01b600052602160045260246000fd5b6002811015610eb4575b60005260fe60205260406000205490565b610ebc610e82565b610ea3565b906080600319830112610878576001600160a01b03916004358381168114156108b357926024359081168114156108b3579160443591606435906001600160401b038211610f265780602383011215610f26578160246108e793600401359101610aae565b505050505050600080fd5b906060600319830112610878576001600160401b03906004358281116108b35783610f5e91600401610aef565b92602435838111610ae55781610f7691600401610aef565b9260443591818311610f265780602384011215610f26578260040135918211610fe5575b8160051b60405193602093610fb185840187610a35565b8552602484860192820101928311610e1857602401905b828210610fd6575050505090565b81358152908301908301610fc8565b610fed6109f6565b610f9a565b959062ffffff9461103a61105b9561102c60c0999661101e611048969d9e9d60e08e8181520190610948565b8c810360208e015290610948565b908a820360408c0152610948565b9088820360608a0152610948565b91608087015285820360a0870152610948565b9416910152565b604090600319011261000f576001600160a01b03906004358281168114156109ee57916024359081168114156109ee5790565b604090600319011261000f576004359060243562ffffff81168114156109ee5790565b6001600160a01b031680156110d857600052606860205260406000205490565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608490fd5b1561113857565b5060405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606490fd5b6000908152606760205260409020546001600160a01b03166108e7811515611131565b90600182811c921680156111d3575b60208310146111bb57565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916111b0565b90600092918054916111ee836111a1565b9182825260019384811690816000146112505750600114611210575b50505050565b90919394506000526020928360002092846000945b83861061123c57505050500101903880808061120a565b805485870183015294019385908201611225565b60ff1916602084015250506040019350389150819050808061120a565b6040519060008260655491611281836111a1565b8083529260019081811690811561130757506001146112a8575b50610a6392500383610a35565b6065600090815291507f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c75b8483106112ec5750610a6393505081016020013861129b565b81935090816020925483858a010152019101909185926112d3565b94505050505060ff19166020830152610a6382604081013861129b565b6040519060008260665491611338836111a1565b80835292600190818116908115611307575060011461135e5750610a6392500383610a35565b6066600090815291507f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943545b8483106113a25750610a6393505081016020013861129b565b81935090816020925483858a01015201910190918592611389565b906113c78161117e565b6001600160a01b038181169084168114611490573314908115611462575b50156113f457610a63916119bf565b505060405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260849150fd5b6001600160a01b03166000908152606a6020526040902060ff91506114889033906102c3565b5416386113e5565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b600081815260676020526040902054611506906001600160a01b03161515611131565b6000908152606960205260409020546001600160a01b031690565b6001600160a01b03811691903383146115a257816115616115729233600052606a60205260406000209060018060a01b0316600052602052604060002090565b9060ff801983541691151516179055565b60405190151581527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152fd5b156115f157565b5060405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608490fd5b90610a6392916116656116608433611771565b6115ea565b611844565b60405190602082018281106001600160401b0382111761168e575b60405260008252565b6116966109f6565b611685565b9091610a639260405192602084018481106001600160401b038211176116c8575b604052600084526116d5565b6116d06109f6565b6116bc565b906116f99392916116e96116608433611771565b6116f4838383611844565b611acb565b1561170057565b5060405162461bcd60e51b81528061171a6004820161171e565b0390fd5b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b6001600160a01b03806117838461117e565b1692818316928484149485156117b9575b505083156117a3575b50505090565b6117af919293506114e3565b161438808061179d565b6000908152606a602090815260408083206001600160a01b03949094168352929052205460ff1693503880611794565b156117f057565b5060405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608490fd5b611868906118518461117e565b6001600160a01b03828116939091821684146117e9565b8316928315611969576118e682611883878461194096612de4565b6118a58561189f6118938a61117e565b6001600160a01b031690565b146117e9565b6118cc6118bc886000526069602052604060002090565b80546001600160a01b0319169055565b6001600160a01b0316600090815260686020526040902090565b80546000190190556001600160a01b038116600090815260686020526040902060018154019055611921856000526067602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000604051a4565b505050505050608460405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152fd5b600082815260696020526040902080546001600160a01b0319166001600160a01b0383161790556001600160a01b03806119f88461117e565b169116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256000604051a4565b600090815260676020526040902054610a63906001600160a01b03161515611131565b9081602091031261087857516108e7816108bc565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526108e792910190610948565b506040513d6000823e3d90fd5b3d15611ac6573d90611aac82610a84565b91611aba6040519384610a35565b82523d6000602084013e565b606090565b92909190823b15611b7a57611afe926020926000604051809681958294630a85bd0160e11b9a8b85523360048601611a5d565b03926001600160a01b03165af160009181611b5a575b50611b4c57505050611b24611a9b565b80519081611b4757505060405162461bcd60e51b81528061171a6004820161171e565b602001fd5b6001600160e01b0319161490565b611b73919250611b6a3d82610a35565b3d810190611a48565b9038611b14565b50505050600190565b60011115611b8d57565b610a63610e82565b611b9e81611b83565b6000526098602052604060002090565b611bb781611b83565b6000526097602052604060002090565b90611bd181611b83565b600052602052604060002090565b90916000549260ff8460081c161580948195611d01575b8115611ce1575b5015611c8157611c239284611c1a600160ff196000541617600055565b611c6857611d0f565b611c2957565b611c3961ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b611c7c61010061ff00196000541617600055565b611d0f565b5050505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081611cf3575b5038611bfd565b6001915060ff161438611cec565b600160ff8216109150611bf6565b929190611d2c60ff60005460081c16611d2781611e51565b611e51565b83516001600160401b038111611e44575b611d5181611d4c6065546111a1565b611ec9565b602080601f8311600114611dae57509080611d8e9392611d9b9697600092611da3575b50508160011b916000199060031b1c191617606555611fba565b611d9661218d565b612299565b610a63614b97565b015190503880611d74565b90601f19831696611de160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790565b926000905b898210611e2c575050918391600193611d8e9695611d9b999a10611e13575b505050811b01606555611fba565b015160001960f88460031b161c19169055388080611e05565b80600185968294968601518155019501930190611de6565b611e4c6109f6565b611d3d565b15611e5857565b5060405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b818110611ebd575050565b60008155600101611eb2565b90601f8211611ed6575050565b610a639160656000527f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c7906020601f840160051c83019310611f20575b601f0160051c0190611eb2565b9091508190611f13565b90601f8211611f37575050565b610a639160666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9190601f8111611f8f57505050565b610a63926000526020600020906020601f840160051c83019310611f2057601f0160051c0190611eb2565b9081516001600160401b0381116120a4575b611fe081611fdb6066546111a1565b611f2a565b602080601f831160011461201c5750819293600092612011575b50508160011b916000199060031b1c191617606655565b015190503880611ffa565b90601f1983169461204f60666000527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e9435490565b926000905b87821061208c575050836001959610612073575b505050811b01606655565b015160001960f88460031b161c19169055388080612068565b80600185968294968601518155019501930190612054565b6120ac6109f6565b611fcc565b91909182516001600160401b038111612180575b6120d9816120d384546111a1565b84611f80565b602080601f831160011461211557508192939460009261210a575b50508160011b916000199060031b1c1916179055565b0151905038806120f4565b90601f1983169561212b85600052602060002090565b926000905b8882106121685750508360019596971061214f575b505050811b019055565b015160001960f88460031b161c19169055388080612145565b80600185968294968601518155019501930190612130565b6121886109f6565b6120c5565b600061219f60ff825460081c16611e51565b808052609860209081526040808320336000908152925290205460ff1661224257808052609860209081526040808320336000908152925290206121eb905b805460ff19166001179055565b808052609760205260408120612201815461226d565b90556040805160018152336020820181905292917faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a9190819081015b0390a3565b50506040516397b705ed60e01b8152600490fd5b50634e487b7160e01b600052601160045260246000fd5b600190600119811161227d570190565b612285612256565b0190565b600290600219811161227d570190565b906122ab60ff60005460081c16611e51565b60005b8251811015612306578060026122e79210156122f9575b83518110156122ec575b6122e260208260051b8601015182612332565b61230b565b6122ae565b6122f461231b565b6122cf565b612301610e82565b6122c5565b509050565b600190600019811461227d570190565b50634e487b7160e01b600052603260045260246000fd5b6040907f6819853ffee8927169953e7bdc42aaba347fb03ff918a45bfccaf88626d9009692600282101561237d575b8160005260fe60205280836000205582519182526020820152a1565b612385610e82565b612361565b93949891969790929761239b612798565b6101309687549a8b986123ae8a8961268d565b546123b89061226d565b610130556123d189600052610131602052604060002090565b6123db87826120b1565b6123e88b600183016120b1565b6123f58c600283016120b1565b61240289600383016120b1565b61240f84600683016120b1565b60078101805463ff00000088151560181b1663ffffffff1990911662ffffff88161717905560006004820155612443610a56565b908282528360208301526005016124639060008052602052604060002090565b9061246d916124b1565b604051978897600160a01b60019003169b339b61248a988a6125a8565b037f9a20c55b8a65284ed13ddf442c21215df16c2959509d6547b7c38832c9f9fa8591a490565b9080519081516001600160401b03811161259b575b6124da816124d486546111a1565b86611f80565b6020928390601f831160011461252657918060019492610a6397969460009261251b575b5050600019600383901b1c191690841b1784555b015191016120b1565b0151905038806124fe565b90601f1983169161253c87600052602060002090565b9260005b81811061258457509260019593928592610a6399989688951061256b575b505050811b018455612512565b015160001960f88460031b161c1916905538808061255e565b929387600181928786015181550195019301612540565b6125a36109f6565b6124c6565b979998959062ffffff95612608612632966125fa8c6101009c986125ec612624996125de61261699610120808752860190610948565b908482036020860152610948565b916040818403910152610948565b8c810360608e015290610948565b908a820360808c0152610948565b9088820360a08a0152610948565b9086820360c0880152610948565b951660e08401521515910152565b1561264757565b5060405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606490fd5b6001600160a01b0381169081156127505760008381526067602052604090205461272691906126c8906001600160a01b031615155b15612640565b6126d0614bb9565b6000848152606760205260409020546126f3906001600160a01b031615156126c2565b6001600160a01b038116600090815260686020526040902060018154019055611921846000526067602052604060002090565b60007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef81604051a4565b50505050606460405162461bcd60e51b815260206004820152602060248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152fd5b6000805260fe6020527f32796e36004994222362c2f9423d5e208bb848170964890784a8d59ed40f50af54348114156127ce5750565b6024915060405190635f7e28df60e01b82526004820152fd5b600160005260fe6020527f457c8a48b4735f56b938837eb0a8a5f9c55f23c1a85767ce3b65c3e59d3d32b754348114156127ce5750565b9061228560209282815194859201610913565b600081815260676020526040902054612854906001600160a01b03161515611131565b61285d8161117e565b9060005261013160205260406000206128b46040519261287c84610a0d565b601d84527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000060208501526001600160a01b031661508d565b6128f6600383016007840160006128d66128d1835462ffffff1690565b615188565b6040518095819263891c235f60e01b835260068a01878b60048601614dda565b038173__$ecf603b2c2aa531f37c90ec146d2a3e91a$__5af4928315612c9a575b600093612c77575b5054908160181c60ff1661293290615142565b9060058601906004870154928261295485809590600052602052604060002090565b936129689190600052602052604060002090565b6001019361297590614e9e565b9462ffffff1661298490615188565b604051607b60f81b602082015267113730b6b2911d1160c11b60218201529889989197916129b560298b0183614e22565b61088b60f21b81526002016e113232b9b1b934b83a34b7b7111d1160891b8152600f016129e59060018401614e22565b61088b60f21b8152600201681137bbb732b9111d1160b91b8152600901612a0b9161281e565b61088b60f21b81526002016f1132bc3a32b93730b62fbab936111d1160811b8152601001612a3b91600201614e22565b61088b60f21b8152600201681134b6b0b3b2911d1160b91b8152600901612a619161281e565b61088b60f21b81526002017f226163636573735f706f696e745f6175746f5f617070726f76616c223a0000008152601d01612a9b9161281e565b600b60fa1b81526001016e2261747472696275746573223a205b60881b8152600f017f7b2274726169745f74797065223a2022454e53222c202276616c7565223a22008152601f01612aec91614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227681526630b63ab2911d1160c91b6020820152602701612b3791614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a20225265706f7369746f7279222c20227661815265363ab2911d1160d11b6020820152602601612b8191614e22565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a202256657273696f6e222c202276616c7565815262111d1160e91b6020820152602301612bc89161281e565b62089f4b60ea1b81526003017f7b2274726169745f74797065223a2022436f6c6f72222c202276616c7565223a8152601160f91b6020820152602101612c0d9161281e565b61227d60f01b8152600201605d60f81b8152600101607d60f81b81526001010390601f19918281018252612c419082610a35565b612c4a90614ca1565b9160405192839160208301612c5e9161281e565b612c679161281e565b0390810182526108e79082610a35565b612c9391933d90823e612c8a3d82610a35565b3d810190614d7c565b913861291f565b612ca2611a8e565b612917565b600081815260676020526040902054612cca906001600160a01b03161515611131565b60005261013160205260409081600020600481015462ffffff600783015416938051612d0181612cfa81876111dd565b0382610a35565b948151612d1581612cfa81600189016111dd565b946006612d528451612d2e81612cfa8160028c016111dd565b96612cfa8651612d4581612cfa81600387016111dd565b97965180948193016111dd565b9190565b60018110612d66575b6000190190565b612d6e612256565b612d5f565b610130548015612d8c5760018110612d66576000190190565b50506040516327e4ec1b60e21b8152600490fd5b63ffffffff60e01b166380ac58cd60e01b8114908115612dd3575b8115612dc5575090565b6301ffc9a760e01b14919050565b635b5e139f60e01b81149150612dbb565b90612ded614bb9565b6001600160a01b0391821615158080612e2d575b15612e1257505050610a6390612e38565b612e1b57505050565b1615612e245750565b610a6390612e38565b508282161515612e01565b80600052609960205260406000206001815481198111612e82575b0190557f8c7eb22d1ba10f86d9249f2a8eb0e3e35b4f0b2f21f92dea9ec25a4d84b20fa06020604051338152a2565b612e8a612256565b612e53565b612e988161117e565b6001600160a01b0316331415612f5857600081815260676020526040902054612ecb906001600160a01b03161515611131565b600081815261013160205260409020600701805463ff000000191683151560181b63ff000000161790556040519160408352601760408401527f616363657373506f696e744175746f417070726f76616c0000000000000000006060840152151560208301527e91a55492d3e3f4e2c9b36ff4134889d9118003521f9d531728503da510b11f60803393a3565b905060249150604051906355d2292f60e11b82526004820152fd5b612f7c8161117e565b6001600160a01b03163314156130b2575b600081815260676020526040902054612fb0906001600160a01b03161515611131565b8060005260206101318152600260406000200190835180916001600160401b0382116130a5575b612fe5826124d486546111a1565b80601f8311600114613037575060009161302c575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d3395826130c0565b905084015138612ffa565b9150601f19831661304d85600052602060002090565b926000905b82821061308d5750509083600194939210613074575b5050811b01905561300e565b86015160001960f88460031b161c191690553880613068565b80600185968294968c01518155019501930190613052565b6130ad6109f6565b612fd7565b6130bb816130f3565b612f8d565b9060806108e79260408152600b60408201526a195e1d195c9b985b15549360aa1b60608201528160208201520190610948565b600081815260996020908152604080832054609a83528184209084528252808320838052825280832033845290915281205460ff1615613131575050565b604492506040519163158eff0360e21b835260048301526024820152fd5b6131588161117e565b6001600160a01b031633141561328e575b60008181526067602052604090205461318c906001600160a01b03161515611131565b8060005260206101318152600360406000200190835180916001600160401b038211613281575b6131c1826124d486546111a1565b80601f83116001146132135750600091613208575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d33958261329c565b9050840151386131d6565b9150601f19831661322985600052602060002090565b926000905b8282106132695750509083600194939210613250575b5050811b0190556131ea565b86015160001960f88460031b161c191690553880613244565b80600185968294968c0151815501950193019061322e565b6132896109f6565b6131b3565b613297816130f3565b613169565b9060806108e792604081526003604082015262454e5360e81b60608201528160208201520190610948565b6132d08161117e565b6001600160a01b0316331415613403575b600081815260676020526040902054613304906001600160a01b03161515611131565b8060005260206101318152604060002090835180916001600160401b0382116133f6575b613336826124d486546111a1565b80601f8311600114613388575060009161337d575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613411565b90508401513861334b565b9150601f19831661339e85600052602060002090565b926000905b8282106133de57505090836001949392106133c5575b5050811b01905561335f565b86015160001960f88460031b161c1916905538806133b9565b80600185968294968c015181550195019301906133a3565b6133fe6109f6565b613328565b61340c816130f3565b6132e1565b9060806108e7926040815260046040820152636e616d6560e01b60608201528160208201520190610948565b6134468161117e565b6001600160a01b031633141561357a575b60008181526067602052604090205461347a906001600160a01b03161515611131565b8060005260206101318152600180604060002001918451906001600160401b03821161356d575b6134af826124d486546111a1565b80601f83116001146135025750819282916000936134f7575b501b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613588565b8701519250386134c8565b9082601f19811661351887600052602060002090565b936000905b87838310613553575050501061353a575b5050811b0190556134d9565b86015160001960f88460031b161c19169055388061352e565b8b860151875590950194938401938693509081019061351d565b6135756109f6565b6134a1565b613583816130f3565b613457565b9060806108e79260408152600b60408201526a3232b9b1b934b83a34b7b760a91b60608201528160208201520190610948565b6135c48161117e565b6001600160a01b03163314156136fa575b6000818152606760205260409020546135f8906001600160a01b03161515611131565b8060005260206101318152600660406000200190835180916001600160401b0382116136ed575b61362d826124d486546111a1565b80601f831160011461367f5750600091613674575b508160011b916000199060031b1c19161790555b60008051602061528f8339815191526040518061223d339582613708565b905084015138613642565b9150601f19831661369585600052602060002090565b926000905b8282106136d557505090836001949392106136bc575b5050811b019055613656565b86015160001960f88460031b161c1916905538806136b0565b80600185968294968c0151815501950193019061369a565b6136f56109f6565b61361f565b613703816130f3565b6135d5565b9060806108e7926040815260046040820152636c6f676f60e01b60608201528160208201520190610948565b61373d8161117e565b6001600160a01b03163314156137e3575b600081815260676020526040902054613771906001600160a01b03161515611131565b600081815261013160205260409020600701805462ffffff191662ffffff841617905562ffffff6040519260408452600560408501526431b7b637b960d91b60608501521660208301527f7a3039988e102050cb4e0b6fe203e58afd9545e192ef2ca50df8d14ee2483e7e60803393a3565b6137ec816130f3565b61374e565b929190926137fe8161117e565b6001600160a01b0316331415613946575b600081815260676020526040902054613832906001600160a01b03161515611131565b80600052602093610131855260066040600020018151956001600160401b038711613939575b613866876120d384546111a1565b80601f88116001146138c857509580610a6396976000916138bd575b508160011b916000199060031b1c19161790555b8160008051602061528f833981519152604051806138b5339582613708565b0390a3613734565b905083015138613882565b90601f1988166138dd84600052602060002090565b926000905b828210613921575050918891610a63989960019410613908575b5050811b019055613896565b85015160001960f88460031b161c1916905538806138fc565b80600185968294968a015181550195019301906138e2565b6139416109f6565b613858565b61394f816130f3565b61380f565b61395c614bb9565b6139646127e7565b61396d81611a25565b6001600160a01b03613994600261398385613acf565b015460101c6001600160a01b031690565b16613aba577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe890604051817f8140554c907b4ba66a04ea1f43b882cba992d3db4cd5c49298a56402d7b36ca23392806139ed888261096d565b0390a3613a156007613a0a83600052610131602052604060002090565b015460181c60ff1690565b15613a6f57613a6a90613a5c613a29610a65565b828152600060208201819052604082018190526060820152336080820152600160a0820152613a5786613acf565b613b00565b604051918291339583613bdc565b0390a2565b613a6a90613aac613a7e610a65565b828152600060208201819052604082018190526060820152336080820152600060a0820152613a5786613acf565b604051918291339583613bb8565b505060405163142d0c2f60e11b815260049150fd5b6020613ae8918160405193828580945193849201610913565b810161013281520301902090565b60041115611b8d57565b60029082518155602083015160018201550190613b2f60408201511515839060ff801983541691151516179055565b6060810151825461ff00191690151560081b61ff00161782556080810151825462010000600160b01b0319811660109290921b62010000600160b01b0316918217845560a090920151613b8181613af6565b6004811015613bab575b62010000600160b81b03199092161760b09190911b60ff60b01b16179055565b613bb3610e82565b613b8b565b604090613bd2600093959495606083526060830190610948565b9460208201520152565b604090613bd2600193959495606083526060830190610948565b604090613bd2600293959495606083526060830190610948565b604090613bd2600393959495606083526060830190610948565b919091613c368161117e565b6001600160a01b0316331415613d0a57613c4f83613acf565b8181541415613cf45760020190613c6b825460ff9060b01c1690565b613c7481613af6565b613cde577fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe89215613cba57815460ff60b01b1916600160b01b17909155613a6a90613a5c565b815460ff60b01b1916600160b11b17909155613a6a90604051918291339583613bf6565b5050505050600460405163d9e5c51160e01b8152fd5b50505050506004604051636653b1a360e01b8152fd5b91505060249150604051906355d2292f60e11b82526004820152fd5b613d2e614bb9565b6001600160a01b03806002613d4284613acf565b015460101c1615613e0a576002613d5883613acf565b015460101c16331415613df657613d876002613d7383613acf565b01805460ff60b01b1916600360b01b179055565b613d9081613acf565b546040517fb3f4be48c43e81d71721c23e88ed2db7f6782bf8b181c690104db1e31f82bbe8339180613dc3858783613c10565b0390a27fef2f6bed86b96d79b41799f5285f73b31274bb303ebe5d55a3cb48c567ab2db06040518061223d33958261096d565b5050604051631851b23d60e01b8152600490fd5b5050604051630d436c3560e21b815260049150fd5b6001600160a01b0390816002613e3483613acf565b015460101c1615613e0a57613e4890613acf565b908154613e5490614e9e565b906001830154613e6390614e9e565b92600201548060081c60ff16613e7890615142565b91613e8560ff8316615142565b908260101c16613e949061508d565b9160b01c60ff16613ea481613af6565b613ead90614e9e565b604051607b60f81b60208201529586959194916021870169113a37b5b2b724b2111d60b11b8152600a01613ee09161281e565b600b60fa1b8152600101671139b1b7b932911d60c11b8152600801613f049161281e565b600b60fa1b81526001016e113730b6b2ab32b934b334b2b2111d60891b8152600f01613f2f9161281e565b600b60fa1b8152600101711131b7b73a32b73a2b32b934b334b2b2111d60711b8152601201613f5d9161281e565b600b60fa1b8152600101681137bbb732b9111d1160b91b8152600901613f829161281e565b61088b60f21b8152600201681139ba30ba3ab9911d60b91b8152600901613fa89161281e565b607d60f81b815260010103601f19810182526108e79082610a35565b6001600160a01b036002613fd783613acf565b015460101c1615613ff8576002613fef60ff92613acf565b015460081c1690565b5050604051630d436c3560e21b8152600490fd5b6001600160a01b03600261401f83613acf565b015460101c1615613ff857600161403582613acf565b01614040815461230b565b905561404b81613acf565b547f3ea1c0fcf71b86fca8f96ccac3cf26fba8983d3bbbe7bd720f1865d67fbaee4361223d600161407b85613acf565b01546040519182913396835b92919061409e602091604086526040860190610948565b930152565b6001600160a01b0360026140b683613acf565b015460101c1615613ff85760016140cc82613acf565b0154156140e95760016140de82613acf565b0161404081546140fd565b50506040516341f3125f60e11b8152600490fd5b8015612d66576000190190565b6001600160a01b0380600261411e84613acf565b015460101c16156141b65761413282613acf565b549061413d8261117e565b163314156141a7575b5061416882600261415684613acf565b019060ff801983541691151516179055565b7fe2e598f7ff2dfd4bc3bd989635401b4c56846b7893cb7eace51d099f21e69bff61223d61419583613acf565b54604051918291339615159583614087565b6141b0906130f3565b38614146565b505050506004604051630d436c3560e21b8152fd5b6001600160a01b038060026141df84613acf565b015460101c16156141b6576141f382613acf565b54906141fe8261117e565b1633141561425d575b5061423082600261421784613acf565b019061ff00825491151560081b169061ff001916179055565b7f17bd9b465aa0cdc6b308874903e9c38b13f561ecb1f2edaa8bf3969fe603d11c61223d61419583613acf565b614266906130f3565b38614207565b90917f1df66319cf29e55bca75419e56e75507b2b443b0a062a59d4b06b8d4dd13ce6b906142998361117e565b6001600160a01b031633141561435d575b6000838152606760205260409020546142cd906001600160a01b03161515611131565b60409061433382518381018181106001600160401b03821117614350575b84528681528260208201528560005261013160205261432e60058560002001600486600020019061431c825461230b565b80925590600052602052604060002090565b6124b1565b61433b610a56565b9485526020850152518061223d33958261436b565b6143586109f6565b6142eb565b614366836130f3565b6142aa565b604081526005604082015264189d5a5b1960da1b606082015260808101906020916080838301529160c0820193926000905b600282106143ad57505050505090565b909192939483806143ca600193607f198982030186528951610948565b9701920192019093929161439d565b6143e28161117e565b6001600160a01b039081163314156145035760008183926144028461117e565b61440a614bb9565b16151580806144fc575b83146144e5575061442483612e38565b61442d8361117e565b6144446118bc856000526069602052604060002090565b6001600160a01b03811660009081526068602052604090208319815401905561447a6118bc856000526067602052604060002090565b167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef82604051a46144c160026144bb83600052610131602052604060002090565b0161451d565b6144c85750565b6144e0610a6391600052610131602052604060002090565b614598565b6144ee57614424565b6144f783612e38565b614424565b5082614414565b5060249150604051906355d2292f60e11b82526004820152fd5b6108e790546111a1565b6001600160fe1b03811160011661453f575b60021b90565b614547612256565b614539565b61455681546111a1565b9081614560575050565b81601f60009311600114614572575055565b8183526020832061458e91601f0160051c810190600101611eb2565b8160208120915555565b60076000916145a68161454c565b6145b26001820161454c565b6145be6002820161454c565b6145ca6003820161454c565b8260048201556145dc6006820161454c565b0155565b6145e8614bb9565b6145f06146cf565b6145f981611b83565b60008181526098602090815260408083206001600160a01b038616845290915290205460ff166146ba5761462c81611b83565b60008181526098602090815260408083206001600160a01b03861684529091529020614657906121de565b61466081611bae565b61466a815461226d565b905561467581611b83565b60408051600181523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516397b705ed60e01b815260049150fd5b3360009081527fddaeee8e61001dbcfaf4f92c6943552c392a86665d734d3c1905d7b3c23b1b1e602052604090205460ff161561470857565b5060405163070198dd60e51b815260006004820152602490fd5b61472a614bb9565b6147338161117e565b6001600160a01b039081163314156148145781600052609960205261477b6102da856102c38661044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906147d86121de866102c38761044b6147c3896000526099602052604060002090565b5461043c8a600052609a602052604060002090565b6147e184611b83565b60408051600181523360208201529190951694819081015b0390a4565b505050505060046040516397b705ed60e01b8152fd5b5091505060249150604051906355d2292f60e11b82526004820152fd5b614839614bb9565b6148416146cf565b6148586148546102da846102c385611b95565b1590565b6146ba5761486581611b83565b801580614903575b6148ee5761488b614881836102c384611b95565b805460ff19169055565b61489481611bae565b61489e8154612d56565b90556148a981611b83565b60408051600081523360208201526001600160a01b03909316927faf048a30703f33a377518eb62cc39bd3a14d6d1a1bb8267dcc440f1bde67b61a918190810161223d565b50506040516360ed092b60e01b815260049150fd5b50600161490f82611bae565b541461486d565b61491e614bb9565b6149278161117e565b6001600160a01b03908116331415614814578160005260996020526149726148546102da866102c38761044b604060002054609a602052604060002090600052602052604060002090565b6147fe577fa4e6ad394cc40a3bae0d24623f88f7bb2e1463d19dab64bafd9985b0bc782118906149ba614881866102c38761044b6147c3896000526099602052604060002090565b6149c384611b83565b60408051600081523360208201529190951694819081016147f9565b6149e76146cf565b6149ef614bb9565b60cc5460ff8160081c1615614a375760019060ff19161760cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b5050604051635970d9f560e11b8152600490fd5b614a536146cf565b60cc5460ff811615614a945760ff191660cc5560007f07e8f74f605213c41c1a057118d86bca5540e9cf52c351026d0d65e46421aa1a6020604051338152a2565b50506040516355d413dd60e01b8152600490fd5b614ab06146cf565b60cc549015159060ff8160081c1615158214614b045761ff008260081b169061ff0019161760cc557f959581ef17eb8c8936ef9832169bc89dbcd1358765adca8ca81f28b416bb5efa6020604051338152a2565b506024915060405190632e15c5c160e21b82526004820152fd5b90610a6391614b2b6146cf565b612332565b614b386146cf565b478060008115614b8e575b600080809381933390f115614b81575b6040519081527f8c7cdad0d12a8db3e23561b42da6f10c8137914c97beff202213a410e1f520a360203392a2565b614b89611a8e565b614b53565b506108fc614b43565b614ba860ff60005460081c16611e51565b60cc805461ffff1916610100179055565b60ff60cc5416614bc557565b506040516306d39fcd60e41b8152600490fd5b60405190606082018281106001600160401b03821117614c48575b604052604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b614c506109f6565b614bf3565b60405190614c6282610a0d565b6008825260203681840137565b90614c7982610a84565b614c866040519182610a35565b8281528092614c97601f1991610a84565b0190602036910137565b805115614d7357614cb0614bd8565b614cd4614ccf614cca614cc38551612289565b6003900490565b614527565b614c6f565b9160208301918182518301915b828210614d2157505050600390510680600114614d0e57600214614d03575090565b603d90600019015390565b50603d9081600019820153600119015390565b9091936004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301939190614ce1565b506108e761166a565b6020818303126109ee578051906001600160401b0382116108b3570181601f820112156109ee578051614dae81610a84565b92614dbc6040519485610a35565b818452602082840101116108b3576108e79160208085019101610913565b92614e066108e79593614df8614e14946080885260808801906111dd565b9086820360208801526111dd565b9084820360408601526111dd565b916060818403910152610948565b600092918154614e31816111a1565b92600191808316908115614e895750600114614e4d5750505050565b90919293945060005260209081600020906000915b858310614e78575050505001903880808061120a565b805485840152918301918101614e62565b60ff191684525050500191503880808061120a565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000080821015614fd3575b506d04ee2d6d415b85acef810000000080831015614fc4575b50662386f26fc1000080831015614fb5575b506305f5e10080831015614fa6575b5061271080831015614f97575b506064821015614f87575b600a80921015614f7d575b600190816021614f35828701614c6f565b95860101905b614f47575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215614f7857919082614f3b565b614f40565b9160010191614f24565b9190606460029104910191614f19565b60049193920491019138614f0e565b60089193920491019138614f01565b60109193920491019138614ef2565b60209193920491019138614ee0565b604093508104915038614ec7565b60405190614fee82610a0d565b6007825260203681840137565b602090805115615009570190565b61228561231b565b602190805160011015615009570190565b90602091805182101561503457010190565b61503c61231b565b010190565b1561504857565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b60405190606082018281106001600160401b03821117615135575b604052602a8252604036602084013760306150c283614ffb565b5360786150ce83615011565b536029905b600182116150e6576108e7915015615041565b80600f61512292166010811015615128575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188486615022565b5360041c916140fd565b906150d3565b61513061231b565b6150f8565b61513d6109f6565b6150a8565b156151675760405161515381610a0d565b60048152637472756560e01b602082015290565b60405161517381610a0d565b600581526466616c736560d81b602082015290565b62ffffff16615195614c55565b9060306151a183614ffb565b5360786151ad83615011565b5360079081905b60018211615249576151c7915015615041565b6151cf614fe1565b9182511561523c575b60236020840153600190815b8381106151f2575050505090565b61522a90600119811161522f575b6001600160f81b031961521582860185615022565b511660001a6152248288615022565b5361230b565b6151e4565b615237612256565b615200565b61524461231b565b6151d8565b80600f61527b92166010811015615281575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a6151188487615022565b906151b4565b61528961231b565b61525b56fe0eef1ffa5f2982ad38bb9f5022d2ac4c29b22af1469b6ed4f49176c737d74a18a36469706673582212202e75744fc556eafe78e883a2f3183bc7de9ed6d92b284cb784cf309e243d27256c6578706572696d656e74616cf564736f6c634300080c0041", + "metadata": "{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AccessPointAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointCreationStatusAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointNotExistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AccessPointScoreCannotBeLower\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPausable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsNotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractIsPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenIdForAccessPoint\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeAccessPointOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"MustBeTokenOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustHaveAtLeastOneOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveCollectionRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"MustHaveTokenRole\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"state\",\"type\":\"bool\"}],\"name\":\"PausableIsSetTo\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requiredValue\",\"type\":\"uint256\"}],\"name\":\"RequiredPayment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RoleAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ThereIsNoTokenMinted\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BillingChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointContentVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum FleekERC721.AccessPointCreationStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointCreationStatus\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointNameVerify\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"score\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"ChangeAccessPointScore\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"CollectionRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"value\",\"type\":\"uint24\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string[2]\",\"name\":\"value\",\"type\":\"string[2]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"MetadataUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewMint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPausable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PausableStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"PauseStatusChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemoveAccessPoint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRoleChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"TokenRolesCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"byAddress\",\"type\":\"address\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"_billings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"addAccessPoint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"decreaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"getAccessPointJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"}],\"name\":\"getBilling\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastTokenId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasCollectionRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasTokenRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"increaseAccessPointScore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint256[]\",\"name\":\"initialBillings\",\"type\":\"uint256[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"isAccessPointNameVerified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPausable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPaused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"externalURL\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ENS\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"gitRepository\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"logo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"color\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"accessPointAutoApproval\",\"type\":\"bool\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"}],\"name\":\"removeAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekAccessControl.CollectionRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeCollectionRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"enum FleekAccessControl.TokenRoles\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeTokenRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_apAutoApproval\",\"type\":\"bool\"}],\"name\":\"setAccessPointAutoApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointContentVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"verified\",\"type\":\"bool\"}],\"name\":\"setAccessPointNameVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"apName\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAccessPoint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum FleekBilling.Billing\",\"name\":\"key\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"setBilling\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pausable\",\"type\":\"bool\"}],\"name\":\"setPausable\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_commitHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_gitRepository\",\"type\":\"string\"}],\"name\":\"setTokenBuild\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenDescription\",\"type\":\"string\"}],\"name\":\"setTokenDescription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenENS\",\"type\":\"string\"}],\"name\":\"setTokenENS\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenExternalURL\",\"type\":\"string\"}],\"name\":\"setTokenExternalURL\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"}],\"name\":\"setTokenLogo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenLogo\",\"type\":\"string\"},{\"internalType\":\"uint24\",\"name\":\"_tokenColor\",\"type\":\"uint24\"}],\"name\":\"setTokenLogoAndColor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"}],\"name\":\"setTokenName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addAccessPoint(uint256,string)\":{\"details\":\"Add a new AccessPoint register for an app token. The AP name should be a DNS or ENS url and it should be unique. Anyone can add an AP but it should requires a payment. May emit a {NewAccessPoint} event. Requirements: - the tokenId must be minted and valid. - billing for add acess point may be applied. - the contract must be not paused.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"burn(uint256)\":{\"details\":\"Burns a previously minted `tokenId`. May emit a {Transfer} event. Requirements: - the tokenId must be minted and valid. - the sender must be the owner of the token. - the contract must be not paused.\"},\"decreaseAccessPointScore(string)\":{\"details\":\"Decreases the score of a AccessPoint registry if is greater than 0. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"getAccessPointJSON(string)\":{\"details\":\"A view function to gether information about an AccessPoint. It returns a JSON string representing the AccessPoint information. Requirements: - the AP must exist.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getBilling(uint8)\":{\"details\":\"Returns the billing value for a given key.\"},\"getLastTokenId()\":{\"details\":\"Returns the last minted tokenId.\"},\"getToken(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns multiple string and uint values in relation to metadata fields of the App struct. Requirements: - the tokenId must be minted and valid.\"},\"grantCollectionRole(uint8,address)\":{\"details\":\"Grants the collection role to an address. Requirements: - the caller should have the collection role.\"},\"grantTokenRole(uint256,uint8,address)\":{\"details\":\"Grants the token role to an address. Requirements: - the caller should have the token role.\"},\"hasCollectionRole(uint8,address)\":{\"details\":\"Returns `True` if a certain address has the collection role.\"},\"hasTokenRole(uint256,uint8,address)\":{\"details\":\"Returns `True` if a certain address has the token role.\"},\"increaseAccessPointScore(string)\":{\"details\":\"Increases the score of a AccessPoint registry. May emit a {ChangeAccessPointScore} event. Requirements: - the AP must exist.\"},\"initialize(string,string,uint256[])\":{\"details\":\"Initializes the contract by setting a `name` and a `symbol` to the token collection.\"},\"isAccessPointNameVerified(string)\":{\"details\":\"A view function to check if a AccessPoint is verified. Requirements: - the AP must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"isPausable()\":{\"details\":\"Returns true if the contract is pausable, and false otherwise.\"},\"isPaused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"mint(address,string,string,string,string,string,string,string,uint24,bool)\":{\"details\":\"Mints a token and returns a tokenId. If the `tokenId` has not been minted before, and the `to` address is not zero, emits a {Transfer} event. Requirements: - the caller must have ``collectionOwner``'s admin role. - billing for the minting may be applied. - the contract must be not paused.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"pause()\":{\"details\":\"Sets the contract to paused state. Requirements: - the sender must have the `controller` role. - the contract must be pausable. - the contract must be not paused.\"},\"removeAccessPoint(string)\":{\"details\":\"Remove an AccessPoint registry for an app token. It will also remove the AP from the app token APs list. May emit a {RemoveAccessPoint} event. Requirements: - the AP must exist. - must be called by the AP owner. - the contract must be not paused.\"},\"revokeCollectionRole(uint8,address)\":{\"details\":\"Revokes the collection role of an address. Requirements: - the caller should have the collection role.\"},\"revokeTokenRole(uint256,uint8,address)\":{\"details\":\"Revokes the token role of an address. Requirements: - the caller should have the token role.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setAccessPointAutoApproval(uint256,bool)\":{\"details\":\"Updates the `accessPointAutoApproval` settings on minted `tokenId`. May emit a {MetadataUpdate} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setAccessPointContentVerify(string,bool)\":{\"details\":\"Set the content verification of a AccessPoint registry. May emit a {ChangeAccessPointContentVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setAccessPointNameVerify(string,bool)\":{\"details\":\"Set the name verification of a AccessPoint registry. May emit a {ChangeAccessPointNameVerify} event. Requirements: - the AP must exist. - the sender must have the token controller role.\"},\"setApprovalForAccessPoint(uint256,string,bool)\":{\"details\":\"Set approval settings for an access point. It will add the access point to the token's AP list, if `approved` is true. May emit a {ChangeAccessPointApprovalStatus} event. Requirements: - the tokenId must exist and be the same as the tokenId that is set for the AP. - the AP must exist. - must be called by a token controller.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"setBilling(uint8,uint256)\":{\"details\":\"Sets the billing value for a given key. May emit a {BillingChanged} event. Requirements: - the sender must have the `collectionOwner` role.\"},\"setPausable(bool)\":{\"details\":\"Sets the contract to pausable state. Requirements: - the sender must have the `owner` role. - the contract must be in the oposite pausable state.\"},\"setTokenBuild(uint256,string,string)\":{\"details\":\"Adds a new build to a minted `tokenId`'s builds mapping. May emit a {NewBuild} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenColor(uint256,uint24)\":{\"details\":\"Updates the `color` metadata field of a minted `tokenId`. May emit a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenDescription(uint256,string)\":{\"details\":\"Updates the `description` metadata field of a minted `tokenId`. May emit a {NewTokenDescription} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenENS(uint256,string)\":{\"details\":\"Updates the `ENS` metadata field of a minted `tokenId`. May emit a {NewTokenENS} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenExternalURL(uint256,string)\":{\"details\":\"Updates the `externalURL` metadata field of a minted `tokenId`. May emit a {NewTokenExternalURL} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogo(uint256,string)\":{\"details\":\"Updates the `logo` metadata field of a minted `tokenId`. May emit a {NewTokenLogo} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenLogoAndColor(uint256,string,uint24)\":{\"details\":\"Updates the `logo` and `color` metadata fields of a minted `tokenId`. May emit a {NewTokenLogo} and a {NewTokenColor} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"setTokenName(uint256,string)\":{\"details\":\"Updates the `name` metadata field of a minted `tokenId`. May emit a {NewTokenName} event. Requirements: - the tokenId must be minted and valid. - the sender must have the `tokenController` role.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the token metadata associated with the `tokenId`. Returns a based64 encoded string value of the URI. Requirements: - the tokenId must be minted and valid.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"unpause()\":{\"details\":\"Sets the contract to unpaused state. Requirements: - the sender must have the `controller` role. - the contract must be paused.\"},\"withdraw()\":{\"details\":\"Withdraws all the funds from contract. May emmit a {Withdrawn} event. Requirements: - the sender must have the `collectionOwner` role.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/FleekERC721.sol\":\"FleekERC721\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x037c334add4b033ad3493038c25be1682d78c00992e1acb0e2795caff3925271\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a313cf42389440e2706837c91370323b85971c06afd6d056d21e2bc86459618\",\"dweb:/ipfs/QmT8XUrUvQ9aZaPKrqgRU2JVGWnaxBcUYJA7Q7K5KcLBSZ\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"keccak256\":\"0x2a6a0b9fd2d316dcb4141159a9d13be92654066d6c0ae92757ed908ecdfecff0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c05d9be7ee043009eb9f2089b452efc0961345531fc63354a249d7337c69f3bb\",\"dweb:/ipfs/QmTXhzgaYrh6og76BP85i6exNFAv5NYw64uVWyworNogyG\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8bc3c6a456dba727d8dd9fd33420febede490abb49a07469f61d2a3ace66a95a\",\"dweb:/ipfs/QmVAWtEVj7K5AbvgJa9Dz22KiDq9eoptCjnVZqsTMtKXyd\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"keccak256\":\"0x2c0b89cef83f353c6f9488c013d8a5968587ffdd6dfc26aad53774214b97e229\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a68e662c2a82412308b1feb24f3d61a44b3b8772f44cbd440446237313c3195\",\"dweb:/ipfs/QmfBuWUE2TQef9hghDzzuVkDskw3UGAyPgLmPifTNV7K6g\"]},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ffbd627e6958983d288801acdedbf3491ee0ebf1a430338bce47c96481ce9e3\",\"dweb:/ipfs/QmUM1vpmNgBV34sYf946SthDJNGhwwqjoRggmj4TUUQmdB\"]},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://72460c66cd1c3b1c11b863e0d8df0a1c56f37743019e468dc312c754f43e3b06\",\"dweb:/ipfs/QmPExYKiNb9PUsgktQBupPaM33kzDHxaYoVeJdLhv8s879\"]},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://187b5c3a1c9e77678732a2cc5284237f9cfca6bc28ee8bc0a0f4f951d7b3a2f8\",\"dweb:/ipfs/Qmb2KFr7WuQu7btdCiftQG64vTzrG4UyzVmo53EYHcnHYA\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0895399d170daab2d69b4c43a0202e5a07f2e67a93b26e3354dcbedb062232f7\",\"dweb:/ipfs/QmUM1VH3XDk559Dsgh4QPvupr3YVKjz87HrSyYzzVFZbxw\"]},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92ad7e572cf44e6b4b37631b44b62f9eb9fb1cf14d9ce51c1504d5dc7ccaf758\",\"dweb:/ipfs/QmcnbqX85tsWnUXPmtuPLE4SczME2sJaTfmqEFkuAJvWhy\"]},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://056027a78e6f4b78a39be530983551651ee5a052e786ca2c1c6a3bb1222b03b4\",\"dweb:/ipfs/QmXRUpywAqNwAfXS89vrtiE2THRM9dX9pQ4QxAkV1Wx9kt\"]},\"@openzeppelin/contracts/utils/Base64.sol\":{\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77e5309e2cc4cdc3395214edb0ff43ff5a5f7373f5a425383e540f6fab530f96\",\"dweb:/ipfs/QmTV8DZ9knJDa3b5NPBFQqjvTzodyZVjRUg5mx5A99JPLJ\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8c969013129ba9e651a20735ef659fef6d8a1139ea3607bd4b26ddea2d645634\",\"dweb:/ipfs/QmVhVa6LGuzAcB8qgDtVHRkucn4ihj5UZr8xBLcJkP6ucb\"]},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://33bbf48cc069be677705037ba7520c22b1b622c23b33e1a71495f2d36549d40b\",\"dweb:/ipfs/Qmct36zWXv3j7LZB83uwbg7TXwnZSN1fqHNDZ93GG98bGz\"]},\"contracts/FleekAccessControl.sol\":{\"keccak256\":\"0x95f7195cc0f546e06ab49a57e8d22a0ca482175ffa2a74b71ff4c7c395b7394a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://045d686ba6ddf6e1b296b87511e0610bd838a949e108b75c5f960675c4f8de0a\",\"dweb:/ipfs/QmWTyAVAg4KmoE19iKir78TNtCCjtqhJPqGqt7rNyBA6Qv\"]},\"contracts/FleekBilling.sol\":{\"keccak256\":\"0x6fed8b7faba37011bd15b0bc395ca40e24a85499dec167de6942acabc5407d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1f71b1173e8cd21e14e44e97a1add07d1f08115aa2a4053e40aacfbbc270a19\",\"dweb:/ipfs/QmSej6eRfhhL84SMMFrPJWesTUhMRc4HSTY85b2zAKzzhs\"]},\"contracts/FleekERC721.sol\":{\"keccak256\":\"0x33d8a71103d4d5c8c39120e514cce5220530485aa05fb13bb64010daaaaac8a1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f4ac13123b77e53ae8ae1c220853254e4f1aae04c8602da594f812e0a5224b3e\",\"dweb:/ipfs/QmXyFDqEJc5fWFVRYLq9bmwMAfuXXdAUTJwSH2dArFgz3v\"]},\"contracts/FleekPausable.sol\":{\"keccak256\":\"0x4d172714ea6231b283f96cb8e355cc9f5825e01039aa5a521e7a29bcb3ccd1cb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f099c1af04b71bf43bb34fe8413dffb51a8962f91fd99d61693160c3272bd58\",\"dweb:/ipfs/QmWQe9XyVeD955es4fgbHJuSDNZuqsdTCSDMrfJvioZCdj\"]},\"contracts/util/FleekSVG.sol\":{\"keccak256\":\"0x825f901fea144b1994171e060f996301a261a55a9c8482e5fdd31e21adab0e26\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d2f7572678c540100ba8a08ec771e991493a4f6fd626765747e588fd7844892b\",\"dweb:/ipfs/QmWATHHJm8b7BvT8vprdJ9hUbFLsvLqkPe1jZh8qudoDc7\"]},\"contracts/util/FleekStrings.sol\":{\"keccak256\":\"0x224494355d4f03ce5f2fa5d5b954dc0b415b51e8ffd21a01e815e5a9e72971df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b483c2b31cf9ed0a553f85688b26292a02ae71521952a2ad595fb56811496991\",\"dweb:/ipfs/QmeLa7yCdu2Cn7bHDAYcodiNqnB4JBf2pDuwH4Z6mWLQVZ\"]}},\"version\":1}", "storageLayout": { "storage": [ { @@ -1733,7 +1880,7 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 5764, + "astId": 5991, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_paused", "offset": 0, @@ -1741,7 +1888,7 @@ "type": "t_bool" }, { - "astId": 5766, + "astId": 5993, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_canPause", "offset": 1, @@ -1749,7 +1896,7 @@ "type": "t_bool" }, { - "astId": 5917, + "astId": 6144, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "__gap", "offset": 0, @@ -1757,28 +1904,44 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 4434, + "astId": 4255, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "_appIds", + "label": "_billings", "offset": 0, "slot": "254", + "type": "t_mapping(t_enum(Billing)4234,t_uint256)" + }, + { + "astId": 4383, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "255", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 4611, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_appIds", + "offset": 0, + "slot": "304", "type": "t_uint256" }, { - "astId": 4439, + "astId": 4616, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_apps", "offset": 0, - "slot": "255", - "type": "t_mapping(t_uint256,t_struct(App)4408_storage)" + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(App)4585_storage)" }, { - "astId": 4444, + "astId": 4621, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_accessPoints", "offset": 0, - "slot": "256", - "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)" + "slot": "306", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)" } ], "types": { @@ -1810,11 +1973,16 @@ "label": "bool", "numberOfBytes": "1" }, - "t_enum(AccessPointCreationStatus)4418": { + "t_enum(AccessPointCreationStatus)4595": { "encoding": "inplace", "label": "enum FleekERC721.AccessPointCreationStatus", "numberOfBytes": "1" }, + "t_enum(Billing)4234": { + "encoding": "inplace", + "label": "enum FleekBilling.Billing", + "numberOfBytes": "1" + }, "t_enum(CollectionRoles)3829": { "encoding": "inplace", "label": "enum FleekAccessControl.CollectionRoles", @@ -1846,6 +2014,13 @@ "numberOfBytes": "32", "value": "t_uint256" }, + "t_mapping(t_enum(Billing)4234,t_uint256)": { + "encoding": "mapping", + "key": "t_enum(Billing)4234", + "label": "mapping(enum FleekBilling.Billing => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, "t_mapping(t_enum(CollectionRoles)3829,t_mapping(t_address,t_bool))": { "encoding": "mapping", "key": "t_enum(CollectionRoles)3829", @@ -1867,12 +2042,12 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_bool)" }, - "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4432_storage)": { + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4609_storage)": { "encoding": "mapping", "key": "t_string_memory_ptr", "label": "mapping(string => struct FleekERC721.AccessPoint)", "numberOfBytes": "32", - "value": "t_struct(AccessPoint)4432_storage" + "value": "t_struct(AccessPoint)4609_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1895,19 +2070,19 @@ "numberOfBytes": "32", "value": "t_mapping(t_uint256,t_mapping(t_enum(TokenRoles)3831,t_mapping(t_address,t_bool)))" }, - "t_mapping(t_uint256,t_struct(App)4408_storage)": { + "t_mapping(t_uint256,t_struct(App)4585_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.App)", "numberOfBytes": "32", - "value": "t_struct(App)4408_storage" + "value": "t_struct(App)4585_storage" }, - "t_mapping(t_uint256,t_struct(Build)4413_storage)": { + "t_mapping(t_uint256,t_struct(Build)4590_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.Build)", "numberOfBytes": "32", - "value": "t_struct(Build)4413_storage" + "value": "t_struct(Build)4590_storage" }, "t_mapping(t_uint256,t_uint256)": { "encoding": "mapping", @@ -1926,12 +2101,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(AccessPoint)4432_storage": { + "t_struct(AccessPoint)4609_storage": { "encoding": "inplace", "label": "struct FleekERC721.AccessPoint", "members": [ { - "astId": 4420, + "astId": 4597, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "tokenId", "offset": 0, @@ -1939,7 +2114,7 @@ "type": "t_uint256" }, { - "astId": 4422, + "astId": 4599, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "score", "offset": 0, @@ -1947,7 +2122,7 @@ "type": "t_uint256" }, { - "astId": 4424, + "astId": 4601, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "contentVerified", "offset": 0, @@ -1955,7 +2130,7 @@ "type": "t_bool" }, { - "astId": 4426, + "astId": 4603, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "nameVerified", "offset": 1, @@ -1963,7 +2138,7 @@ "type": "t_bool" }, { - "astId": 4428, + "astId": 4605, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "owner", "offset": 2, @@ -1971,22 +2146,22 @@ "type": "t_address" }, { - "astId": 4431, + "astId": 4608, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "status", "offset": 22, "slot": "2", - "type": "t_enum(AccessPointCreationStatus)4418" + "type": "t_enum(AccessPointCreationStatus)4595" } ], "numberOfBytes": "96" }, - "t_struct(App)4408_storage": { + "t_struct(App)4585_storage": { "encoding": "inplace", "label": "struct FleekERC721.App", "members": [ { - "astId": 4388, + "astId": 4565, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "name", "offset": 0, @@ -1994,7 +2169,7 @@ "type": "t_string_storage" }, { - "astId": 4390, + "astId": 4567, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "description", "offset": 0, @@ -2002,7 +2177,7 @@ "type": "t_string_storage" }, { - "astId": 4392, + "astId": 4569, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "externalURL", "offset": 0, @@ -2010,7 +2185,7 @@ "type": "t_string_storage" }, { - "astId": 4394, + "astId": 4571, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "ENS", "offset": 0, @@ -2018,7 +2193,7 @@ "type": "t_string_storage" }, { - "astId": 4396, + "astId": 4573, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "currentBuild", "offset": 0, @@ -2026,15 +2201,15 @@ "type": "t_uint256" }, { - "astId": 4401, + "astId": 4578, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "builds", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(Build)4413_storage)" + "type": "t_mapping(t_uint256,t_struct(Build)4590_storage)" }, { - "astId": 4403, + "astId": 4580, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "logo", "offset": 0, @@ -2042,7 +2217,7 @@ "type": "t_string_storage" }, { - "astId": 4405, + "astId": 4582, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "color", "offset": 0, @@ -2050,7 +2225,7 @@ "type": "t_uint24" }, { - "astId": 4407, + "astId": 4584, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "accessPointAutoApproval", "offset": 3, @@ -2060,12 +2235,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Build)4413_storage": { + "t_struct(Build)4590_storage": { "encoding": "inplace", "label": "struct FleekERC721.Build", "members": [ { - "astId": 4410, + "astId": 4587, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "commitHash", "offset": 0, @@ -2073,7 +2248,7 @@ "type": "t_string_storage" }, { - "astId": 4412, + "astId": 4589, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "gitRepository", "offset": 0, diff --git a/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx b/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx index 6fbaed0f..7a76c6d7 100644 --- a/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx +++ b/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx @@ -19,7 +19,10 @@ const createWriteContractContext = < TAbi extends EthereumHooks.Abi, TArgumentsMap extends EthereumHooks.WriteContext.ArgumentsMap, TFunctionName extends keyof TArgumentsMap & string, - TFunctionArguments extends TArgumentsMap[TFunctionName] + TFunctionArguments extends [ + ...TArgumentsMap[TFunctionName], + EthereumHooks.WriteContext.SettingsParam + ] >( address: string, abi: TAbi, @@ -89,7 +92,10 @@ export const EthereumHooks = { */ createFleekERC721WriteContext: < TFunctionName extends keyof ArgumentsMaps.FleekERC721 & string, - TFunctionArguments extends ArgumentsMaps.FleekERC721[TFunctionName] + TFunctionArguments extends [ + ...ArgumentsMaps.FleekERC721[TFunctionName], + EthereumHooks.WriteContext.SettingsParam + ] >( functionName: TFunctionName ) => { @@ -115,7 +121,10 @@ export namespace EthereumHooks { TAbi extends Abi, TArgumentsMap extends ArgumentsMap, TFunctionName extends keyof TArgumentsMap & string, - TFunctionArguments extends TArgumentsMap[TFunctionName] + TFunctionArguments extends [ + ...TArgumentsMap[TFunctionName], + EthereumHooks.WriteContext.SettingsParam + ] > { functionName: TFunctionName; prepare: ReturnType< @@ -147,6 +156,8 @@ export namespace EthereumHooks { children?: React.ReactNode | React.ReactNode[]; config?: ProviderConfig; } + + export type SettingsParam = { value?: string }; } } diff --git a/ui/src/integrations/ethereum/lib/fleek-erc721.ts b/ui/src/integrations/ethereum/lib/fleek-erc721.ts index 905381e6..c3a3baaa 100644 --- a/ui/src/integrations/ethereum/lib/fleek-erc721.ts +++ b/ui/src/integrations/ethereum/lib/fleek-erc721.ts @@ -5,6 +5,11 @@ import { import { BytesLike } from 'ethers'; import { Ethereum } from '../ethereum'; +enum Billing { + Mint, + AddAccessPoint, +} + enum CollectionRoles { Owner, Verifier, @@ -17,6 +22,12 @@ enum TokenRoles { export const FleekERC721 = { contract: Ethereum.getContract('FleekERC721'), + Enums: { + Billing, + CollectionRoles, + TokenRoles, + }, + async mint( params: FleekERC721.MintParams, provider: Ethereum.Providers @@ -36,9 +47,7 @@ export const FleekERC721 = { }, async tokenMetadata(tokenId: number): Promise { - const contract = Ethereum.getContract('FleekERC721'); - - const response = await contract.tokenURI(Number(tokenId)); + const response = await this.contract.tokenURI(Number(tokenId)); const parsed = JSON.parse( Buffer.from(response.slice(29), 'base64') @@ -50,8 +59,15 @@ export const FleekERC721 = { }, async lastTokenId(): Promise { - // TODO: fetch last token id - return 7; + const contract = Ethereum.getContract('FleekERC721'); + + return contract.getLastTokenId(); + }, + + async getBilling(key: keyof typeof Billing): Promise { + const contract = Ethereum.getContract('FleekERC721'); + + return (await contract.getBilling(this.Enums.Billing[key])).toString(); }, parseError(error: BytesLike): FleekERC721.TransactionError { diff --git a/ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts b/ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts new file mode 100644 index 00000000..a362e6dd --- /dev/null +++ b/ui/src/store/features/fleek-erc721/async-thunk/fetch-billing.ts @@ -0,0 +1,25 @@ +import { FleekERC721 } from '@/integrations'; +import { FleekERC721State, fleekERC721Actions, RootState } from '@/store'; +import { createAsyncThunk } from '@reduxjs/toolkit'; + +type FetchBilling = FleekERC721State.BillingKeys; + +export const fetchBilling = createAsyncThunk( + 'fleekERC721/fetchBilling', + async (key, { dispatch, getState }) => { + const { billingState } = (getState() as RootState).fleekERC721; + + if (billingState[key] === 'loading') return; + + try { + dispatch(fleekERC721Actions.setBillingState({ key, value: 'loading' })); + + const value = await FleekERC721.getBilling(key); + + dispatch(fleekERC721Actions.setBilling({ key, value })); + } catch (error) { + console.log(error); + dispatch(fleekERC721Actions.setBillingState({ key, value: 'failed' })); + } + } +); diff --git a/ui/src/store/features/fleek-erc721/async-thunk/index.ts b/ui/src/store/features/fleek-erc721/async-thunk/index.ts new file mode 100644 index 00000000..8a4440b5 --- /dev/null +++ b/ui/src/store/features/fleek-erc721/async-thunk/index.ts @@ -0,0 +1 @@ +export * from './fetch-billing'; diff --git a/ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts b/ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts new file mode 100644 index 00000000..5add0aab --- /dev/null +++ b/ui/src/store/features/fleek-erc721/fleek-erc721-slice.ts @@ -0,0 +1,68 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { RootState } from '@/store'; +import { useAppSelector } from '@/store/hooks'; +import * as asyncThunk from './async-thunk'; +import { FleekERC721 } from '@/integrations'; + +export namespace FleekERC721State { + export type QueryState = undefined | 'loading' | 'failed' | 'success'; + + export type BillingKeys = keyof typeof FleekERC721.Enums.Billing; + + export type Billing = { + [key in BillingKeys]?: string; + }; + + export type BillingState = { + [key in BillingKeys]?: QueryState; + }; +} + +export interface FleekERC721State { + billing: FleekERC721State.Billing; + billingState: FleekERC721State.BillingState; +} + +const initialState: FleekERC721State = { + billing: {}, + billingState: {}, +}; + +export const fleekERC721Slice = createSlice({ + name: 'fleekERC721', + initialState, + reducers: { + setBilling: ( + state, + action: PayloadAction<{ + key: FleekERC721State.BillingKeys; + value: string; + }> + ) => { + state.billing[action.payload.key] = action.payload.value; + state.billingState[action.payload.key] = 'success'; + }, + setBillingState: ( + state, + action: PayloadAction<{ + key: FleekERC721State.BillingKeys; + value: Exclude; + }> + ) => { + state.billingState[action.payload.key] = action.payload.value; + }, + }, +}); + +export const fleekERC721Actions = { + ...fleekERC721Slice.actions, + ...asyncThunk, +}; + +const selectFleekERC721State = (state: RootState): FleekERC721State => + state.fleekERC721; + +export const useFleekERC721Store = (): FleekERC721State => + useAppSelector(selectFleekERC721State); + +export default fleekERC721Slice.reducer; diff --git a/ui/src/store/features/fleek-erc721/hooks/index.ts b/ui/src/store/features/fleek-erc721/hooks/index.ts new file mode 100644 index 00000000..2e5e8c6d --- /dev/null +++ b/ui/src/store/features/fleek-erc721/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-fleek-erc721-billing'; diff --git a/ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts b/ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts new file mode 100644 index 00000000..9c0cb5fc --- /dev/null +++ b/ui/src/store/features/fleek-erc721/hooks/use-fleek-erc721-billing.ts @@ -0,0 +1,24 @@ +import { useAppDispatch } from '@/store/hooks'; +import { useEffect } from 'react'; +import { + fleekERC721Actions, + FleekERC721State, + useFleekERC721Store, +} from '../fleek-erc721-slice'; + +export const useFleekERC721Billing = (key: FleekERC721State.BillingKeys) => { + const { billing, billingState } = useFleekERC721Store(); + const dispatch = useAppDispatch(); + + const refresh = (): void => { + dispatch(fleekERC721Actions.fetchBilling(key)); + }; + + useEffect(() => { + if (typeof billingState[key] !== 'undefined') return; + + refresh(); + }, []); + + return [billing[key], billingState[key], refresh] as const; +}; diff --git a/ui/src/store/features/fleek-erc721/index.ts b/ui/src/store/features/fleek-erc721/index.ts new file mode 100644 index 00000000..e452949a --- /dev/null +++ b/ui/src/store/features/fleek-erc721/index.ts @@ -0,0 +1,2 @@ +export * from './fleek-erc721-slice'; +export * from './hooks'; diff --git a/ui/src/store/features/index.ts b/ui/src/store/features/index.ts index 22ab4b09..9cb174a3 100644 --- a/ui/src/store/features/index.ts +++ b/ui/src/store/features/index.ts @@ -1,3 +1,4 @@ export * from './ens'; +export * from './fleek-erc721'; export * from './github'; export * from './toasts'; diff --git a/ui/src/store/store.ts b/ui/src/store/store.ts index db53f7bd..a8b801c1 100644 --- a/ui/src/store/store.ts +++ b/ui/src/store/store.ts @@ -2,10 +2,12 @@ import { configureStore } from '@reduxjs/toolkit'; import githubReducer from './features/github/github-slice'; import toastsReducer from './features/toasts/toasts-slice'; import ensReducer from './features/ens/ens-slice'; +import fleekERC721Reducer from './features/fleek-erc721/fleek-erc721-slice'; export const store = configureStore({ reducer: { ens: ensReducer, + fleekERC721: fleekERC721Reducer, github: githubReducer, toasts: toastsReducer, }, diff --git a/ui/src/views/mint/mint.context.tsx b/ui/src/views/mint/mint.context.tsx index 7cd4ff54..46709219 100644 --- a/ui/src/views/mint/mint.context.tsx +++ b/ui/src/views/mint/mint.context.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; import { ComboboxItem, DropdownItem } from '@/components'; -import { Ethereum, EthereumHooks } from '@/integrations'; -import { GithubState } from '@/store'; +import { EthereumHooks } from '@/integrations'; +import { GithubState, useFleekERC721Billing } from '@/store'; import { createContext } from '@/utils'; export type MintContext = { + billing: string | undefined; selectedUserOrg: ComboboxItem; repositoryName: GithubState.Repository; branchName: DropdownItem; //get value from DropdownItem to mint @@ -68,6 +69,7 @@ export abstract class Mint { const [ens, setEns] = useState({} as ComboboxItem); const [domain, setDomain] = useState(''); const [verifyNFA, setVerifyNFA] = useState(true); + const [billing] = useFleekERC721Billing('Mint'); //Field validations const [ensError, setEnsError] = useState(''); @@ -81,6 +83,7 @@ export abstract class Mint { return ( { const { address } = useAccount(); const { nextStep } = Stepper.useContext(); const { + billing, appName, appDescription, domain, @@ -43,6 +44,7 @@ export const MintFormStep = () => { appLogo, parseColorToNumber(logoColor), verifyNFA, + { value: billing }, ]); nextStep(); From 9f97ce2ad16a571c395cd90bc27b7fc7d9749bf3 Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Mon, 13 Mar 2023 12:52:04 -0500 Subject: [PATCH 15/23] chore: UI clean up console logs (#175) * chore: add logger * chore: remove svg-test folder * chore: remove console logs and add toast --- ui/.eslintrc.js | 1 - ui/src/app.tsx | 64 ++-- ui/src/components/toast/toast.styles.tsx | 1 + .../github/async-thunk/fetch-branches.ts | 5 +- .../async-thunk/fetch-user-organizations.ts | 3 +- .../features/github/async-thunk/login.ts | 5 +- ui/src/store/features/github/github-slice.ts | 2 +- ui/src/utils/index.ts | 1 + ui/src/utils/log.ts | 29 ++ ui/src/views/components-test/toast-test.tsx | 12 + ui/src/views/index.ts | 1 - ui/src/views/mint-test/mint-test.tsx | 7 +- .../steps/github-connect/github-button.tsx | 16 +- ui/src/views/mint/mint.context.tsx | 4 +- .../fields/logo-field/logo-field.tsx | 4 +- .../mint/nfa-step/form-step/mint-form.tsx | 6 +- ui/src/views/svg-test/index.ts | 1 - ui/src/views/svg-test/svg-test.tsx | 286 ------------------ 18 files changed, 104 insertions(+), 344 deletions(-) create mode 100644 ui/src/utils/log.ts delete mode 100644 ui/src/views/svg-test/index.ts delete mode 100644 ui/src/views/svg-test/svg-test.tsx diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index 88428cb4..e8e27ab9 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -23,7 +23,6 @@ module.exports = { ], '@typescript-eslint/no-namespace': 'off', 'simple-import-sort/imports': 2, - '@typescript-eslint/explicit-function-return-type': 'off', 'no-console': 'error', 'react/react-in-jsx-scope': 'off', }, diff --git a/ui/src/app.tsx b/ui/src/app.tsx index a4062260..303cc4ef 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,33 +1,31 @@ -import { HashRouter, Route, Routes, Navigate } from 'react-router-dom'; -import { themeGlobals } from '@/theme/globals'; -import { ComponentsTest, Home, Mint } from './views'; -import { SVGTestScreen } from './views/svg-test'; // TODO: remove when done -import { ConnectKitButton } from 'connectkit'; -import { MintTest } from './views/mint-test'; -import { ToastProvider } from './components'; -import { CreateAP } from './views/access-point'; - -export const App = () => { - themeGlobals(); - return ( - <> -
- {/* TODO remove after adding NavBar */} - -
- - - - } /> - } /> - } /> - } /> - {/** TODO remove for release */} - } /> - } /> - } /> - - - - ); -}; +import { HashRouter, Route, Routes, Navigate } from 'react-router-dom'; +import { themeGlobals } from '@/theme/globals'; +import { ComponentsTest, Home, Mint } from './views'; +import { ConnectKitButton } from 'connectkit'; +import { MintTest } from './views/mint-test'; +import { ToastProvider } from './components'; +import { CreateAP } from './views/access-point'; + +export const App = () => { + themeGlobals(); + return ( + <> +
+ {/* TODO remove after adding NavBar */} + +
+ + + + } /> + } /> + } /> + {/** TODO remove for release */} + } /> + } /> + } /> + + + + ); +}; diff --git a/ui/src/components/toast/toast.styles.tsx b/ui/src/components/toast/toast.styles.tsx index f4d11e53..308d4b76 100644 --- a/ui/src/components/toast/toast.styles.tsx +++ b/ui/src/components/toast/toast.styles.tsx @@ -85,6 +85,7 @@ export abstract class ToastStyles { display: 'flex', flexDirection: 'column', gap: '$4', + zIndex: '$toast', }); static readonly Layout = styled(Flex, { diff --git a/ui/src/store/features/github/async-thunk/fetch-branches.ts b/ui/src/store/features/github/async-thunk/fetch-branches.ts index 3b4966d6..a85643c5 100644 --- a/ui/src/store/features/github/async-thunk/fetch-branches.ts +++ b/ui/src/store/features/github/async-thunk/fetch-branches.ts @@ -1,5 +1,6 @@ import { DropdownItem } from '@/components'; import { githubActions, RootState } from '@/store'; +import { AppLog } from '@/utils'; import { createAsyncThunk } from '@reduxjs/toolkit'; import { GithubClient } from '../github-client'; @@ -24,7 +25,9 @@ export const fetchBranchesThunk = createAsyncThunk( dispatch(githubActions.setBranches(branches as DropdownItem[])); } catch (error) { - console.log(error); + AppLog.errorToast( + 'We have a problem trying to get your branches. Please try again later.' + ); dispatch(githubActions.setQueryState('failed')); } } diff --git a/ui/src/store/features/github/async-thunk/fetch-user-organizations.ts b/ui/src/store/features/github/async-thunk/fetch-user-organizations.ts index 5532d141..04f4ed16 100644 --- a/ui/src/store/features/github/async-thunk/fetch-user-organizations.ts +++ b/ui/src/store/features/github/async-thunk/fetch-user-organizations.ts @@ -1,5 +1,6 @@ import { ComboboxItem } from '@/components'; import { RootState } from '@/store'; +import { AppLog } from '@/utils'; import { createAsyncThunk } from '@reduxjs/toolkit'; import { GithubClient, UserData } from '../github-client'; import { githubActions } from '../github-slice'; @@ -36,7 +37,7 @@ export const fetchUserAndOrgsThunk = createAsyncThunk( dispatch(githubActions.setUserAndOrgs(comboboxItems)); } catch (error) { - console.log(error); + AppLog.errorToast('We have a problem. Please try again later.'); dispatch(githubActions.setQueryState('failed')); } } diff --git a/ui/src/store/features/github/async-thunk/login.ts b/ui/src/store/features/github/async-thunk/login.ts index 558602d3..09dc3e35 100644 --- a/ui/src/store/features/github/async-thunk/login.ts +++ b/ui/src/store/features/github/async-thunk/login.ts @@ -3,6 +3,7 @@ import { env } from '@/constants'; import { initializeApp } from 'firebase/app'; import { getAuth, signInWithPopup, GithubAuthProvider } from 'firebase/auth'; import { githubActions, RootState } from '@/store'; +import { AppLog } from '@/utils'; const GithubScopes = ['repo', 'read:org', 'read:user', 'public_repo', 'user']; @@ -43,8 +44,8 @@ export const login = createAsyncThunk( throw Error('Invalid response type'); } } catch (error) { - console.log('Could not connect to GitHub', error); - dispatch(githubActions.setState('disconnected')); + AppLog.errorToast('Github login failed. Please try again later.'); + dispatch(githubActions.setState('failed')); } } ); diff --git a/ui/src/store/features/github/github-slice.ts b/ui/src/store/features/github/github-slice.ts index f00b3f22..dc4203af 100644 --- a/ui/src/store/features/github/github-slice.ts +++ b/ui/src/store/features/github/github-slice.ts @@ -8,7 +8,7 @@ import { UserData } from './github-client'; export namespace GithubState { export type Token = string; - export type State = 'disconnected' | 'loading' | 'connected'; + export type State = 'disconnected' | 'loading' | 'connected' | 'failed'; export type QueryUserAndOrganizations = | 'idle' diff --git a/ui/src/utils/index.ts b/ui/src/utils/index.ts index aa68340d..6edc7fd0 100644 --- a/ui/src/utils/index.ts +++ b/ui/src/utils/index.ts @@ -3,3 +3,4 @@ export * from './validation'; export * from './object'; export * from './context'; export * from './toast'; +export * from './log'; diff --git a/ui/src/utils/log.ts b/ui/src/utils/log.ts new file mode 100644 index 00000000..905fa8b7 --- /dev/null +++ b/ui/src/utils/log.ts @@ -0,0 +1,29 @@ +import { pushToast } from './toast'; + +export abstract class AppLog { + static readonly IDENTIFIER = '[nfa]'; + + static error(...args: any[]): void { + // eslint-disable-next-line no-console + console.error(this.IDENTIFIER, ...args); + } + + static warn(...args: any[]): void { + // eslint-disable-next-line no-console + console.warn(this.IDENTIFIER, ...args); + } + + static info(...args: any[]): void { + // eslint-disable-next-line no-console + console.info(this.IDENTIFIER, ...args); + } + + static errorToast(message: string, ...args: any[]): void { + this.error(message, ...args); + pushToast('error', message); + } + + static successToast(message: string): void { + pushToast('success', message); + } +} diff --git a/ui/src/views/components-test/toast-test.tsx b/ui/src/views/components-test/toast-test.tsx index 1ba13166..e002887b 100644 --- a/ui/src/views/components-test/toast-test.tsx +++ b/ui/src/views/components-test/toast-test.tsx @@ -1,7 +1,9 @@ import { Button, Flex } from '@/components'; import { pushToast } from '@/utils'; +import { useNavigate } from 'react-router-dom'; export const ToastTest = () => { + const navigate = useNavigate(); return (

ToastTest

@@ -19,6 +21,16 @@ export const ToastTest = () => { > Toggle Succes Toast + +
); }; diff --git a/ui/src/views/index.ts b/ui/src/views/index.ts index 6319a92a..5bc47558 100644 --- a/ui/src/views/index.ts +++ b/ui/src/views/index.ts @@ -1,4 +1,3 @@ export * from './home'; export * from './mint'; -export * from './svg-test'; export * from './components-test'; diff --git a/ui/src/views/mint-test/mint-test.tsx b/ui/src/views/mint-test/mint-test.tsx index ec8dd192..554e5994 100644 --- a/ui/src/views/mint-test/mint-test.tsx +++ b/ui/src/views/mint-test/mint-test.tsx @@ -1,6 +1,7 @@ import { Button, Flex } from '@/components'; import { Separator } from '@/components/core/separator.styles'; import { EthereumHooks } from '@/integrations'; +import { AppLog } from '@/utils'; import { ConnectKitButton } from 'connectkit'; import { useAccount } from 'wagmi'; @@ -180,19 +181,19 @@ export const MintTest: React.FC = () => { // We can setup callbacks for every stage of the process in this config prepare: { onSuccess: (data) => { - console.log('Prepared', data); + AppLog.info('Prepared', data); }, }, write: { onSuccess: (data) => { - console.log('Mint sent', data); + AppLog.info('Mint sent', data); }, }, transaction: { onSuccess: (data) => { - console.log('Transaction success', data); + AppLog.info('Transaction success', data); }, }, }} diff --git a/ui/src/views/mint/github-step/steps/github-connect/github-button.tsx b/ui/src/views/mint/github-step/steps/github-connect/github-button.tsx index 70656438..38ef9023 100644 --- a/ui/src/views/mint/github-step/steps/github-connect/github-button.tsx +++ b/ui/src/views/mint/github-step/steps/github-connect/github-button.tsx @@ -1,22 +1,22 @@ +import { useCallback, useEffect } from 'react'; + import { Button, Icon } from '@/components'; import { githubActions, useAppDispatch, useGithubStore } from '@/store'; import { Mint } from '@/views/mint/mint.context'; -import { useCallback } from 'react'; -export const GithubButton = () => { +export const GithubButton: React.FC = () => { const { state } = useGithubStore(); const dispatch = useAppDispatch(); const { setGithubStep } = Mint.useContext(); const handleGithubLogin = useCallback(() => { - dispatch(githubActions.login()) - .then(() => setGithubStep(2)) - .catch((error) => { - //TODO show toast with error message - console.log(error); - }); + dispatch(githubActions.login()); }, [dispatch]); + useEffect(() => { + if (state === 'connected') setGithubStep(2); + }, [setGithubStep, state]); + return ( diff --git a/ui/src/views/mint/github-step/steps/repository-row.tsx b/ui/src/views/mint/github-step/steps/repository-row.tsx new file mode 100644 index 00000000..60f262b0 --- /dev/null +++ b/ui/src/views/mint/github-step/steps/repository-row.tsx @@ -0,0 +1,28 @@ +import { Flex, Icon } from '@/components'; +import { forwardRef } from 'react'; + +type RepoRowProps = { + repo: string; + button: React.ReactNode; +} & React.ComponentProps; + +export const RepoRow = forwardRef( + ({ repo, button, ...props }, ref) => ( + + + + {repo} + + {button} + + ) +); diff --git a/ui/src/views/mint/nfa-step/form-step/fields/app-description-field.tsx b/ui/src/views/mint/nfa-step/form-step/fields/app-description-field.tsx index d268c217..8c063e32 100644 --- a/ui/src/views/mint/nfa-step/form-step/fields/app-description-field.tsx +++ b/ui/src/views/mint/nfa-step/form-step/fields/app-description-field.tsx @@ -1,24 +1,30 @@ import { Form } from '@/components'; import { Mint } from '../../../mint.context'; +const maxCharacters = 250; + export const AppDescriptionField = () => { const { appDescription, setAppDescription } = Mint.useContext(); const handleAppDescriptionChange = ( e: React.ChangeEvent ) => { + if (e.target.value.length > maxCharacters) return; setAppDescription(e.target.value); }; return ( - Description + Description + + {appDescription.length}/{maxCharacters} + ); }; diff --git a/ui/src/views/mint/nfa-step/form-step/fields/app-name-field.tsx b/ui/src/views/mint/nfa-step/form-step/fields/app-name-field.tsx index 3f369595..ca9cfdd9 100644 --- a/ui/src/views/mint/nfa-step/form-step/fields/app-name-field.tsx +++ b/ui/src/views/mint/nfa-step/form-step/fields/app-name-field.tsx @@ -1,6 +1,8 @@ import { Form } from '@/components'; import { Mint } from '../../../mint.context'; +const maxCharacters = 100; + export const AppNameField = () => { const { appName, setAppName } = Mint.useContext(); @@ -9,12 +11,15 @@ export const AppNameField = () => { }; return ( - Name + Name + + {appName.length}/{maxCharacters} + ); }; diff --git a/ui/src/views/mint/nfa-step/form-step/fields/ens-domain-field/domain-field.tsx b/ui/src/views/mint/nfa-step/form-step/fields/ens-domain-field/domain-field.tsx index bf3f25e1..bce006d8 100644 --- a/ui/src/views/mint/nfa-step/form-step/fields/ens-domain-field/domain-field.tsx +++ b/ui/src/views/mint/nfa-step/form-step/fields/ens-domain-field/domain-field.tsx @@ -9,7 +9,7 @@ export const DomainField = () => { }; return ( - Domain + Domain { return ( - Logo + Logo {errorMessage && {errorMessage}} From 2c0cfd9b9b78972240fdc2598de0d5bfcf835704 Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Tue, 14 Mar 2023 07:44:25 -0500 Subject: [PATCH 19/23] chore: final mint step and share (#174) * chore: final mint step and share * chore: fix comments PR * Update ui/src/views/mint/mint-stepper.tsx Co-authored-by: Felipe Mendes * Update ui/src/views/mint/mint.context.tsx Co-authored-by: Felipe Mendes --------- Co-authored-by: Felipe Mendes --- ui/src/app.tsx | 62 ++++++++++++------------ ui/src/constants/env.ts | 3 ++ ui/src/views/home/nfa-list/nfa-list.tsx | 18 ++++--- ui/src/views/mint/mint-stepper.tsx | 63 +++++++++++++++---------- ui/src/views/mint/mint.context.tsx | 8 ++-- ui/src/views/mint/nft-minted.tsx | 13 +++-- ui/yarn.lock | 43 +---------------- 7 files changed, 99 insertions(+), 111 deletions(-) diff --git a/ui/src/app.tsx b/ui/src/app.tsx index 303cc4ef..e2aec21d 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,31 +1,31 @@ -import { HashRouter, Route, Routes, Navigate } from 'react-router-dom'; -import { themeGlobals } from '@/theme/globals'; -import { ComponentsTest, Home, Mint } from './views'; -import { ConnectKitButton } from 'connectkit'; -import { MintTest } from './views/mint-test'; -import { ToastProvider } from './components'; -import { CreateAP } from './views/access-point'; - -export const App = () => { - themeGlobals(); - return ( - <> -
- {/* TODO remove after adding NavBar */} - -
- - - - } /> - } /> - } /> - {/** TODO remove for release */} - } /> - } /> - } /> - - - - ); -}; +import { HashRouter, Route, Routes, Navigate } from 'react-router-dom'; +import { themeGlobals } from '@/theme/globals'; +import { ComponentsTest, Home, Mint } from './views'; +import { ConnectKitButton } from 'connectkit'; +import { MintTest } from './views/mint-test'; +import { ToastProvider } from './components'; +import { CreateAP } from './views/access-point'; + +export const App = () => { + themeGlobals(); + return ( + <> +
+ {/* TODO remove after adding NavBar */} + +
+ + + + } /> + } /> + } /> + {/** TODO remove for release */} + } /> + } /> + } /> + + + + ); +}; diff --git a/ui/src/constants/env.ts b/ui/src/constants/env.ts index 12ba134d..95a983f3 100644 --- a/ui/src/constants/env.ts +++ b/ui/src/constants/env.ts @@ -16,4 +16,7 @@ export const env = Object.freeze({ appId: import.meta.env.VITE_FIREBASE_APP_ID || '', measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID || '', }, + twitter: { + url: import.meta.env.VITE_TWITTER_URL || '', + }, }); diff --git a/ui/src/views/home/nfa-list/nfa-list.tsx b/ui/src/views/home/nfa-list/nfa-list.tsx index f8ea4980..f8c879ae 100644 --- a/ui/src/views/home/nfa-list/nfa-list.tsx +++ b/ui/src/views/home/nfa-list/nfa-list.tsx @@ -1,10 +1,12 @@ -import { lastMintsPaginatedDocument, totalTokensDocument } from '@/graphclient'; -import { Button, Card, Flex, NoResults } from '@/components'; -import { FleekERC721 } from '@/integrations/ethereum/contracts'; +/* eslint-disable react/react-in-jsx-scope */ import { useQuery } from '@apollo/client'; import { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; +import { Button, Card, Flex, NoResults } from '@/components'; +import { lastMintsPaginatedDocument, totalTokensDocument } from '@/graphclient'; +import { FleekERC721 } from '@/integrations/ethereum/contracts'; + const pageSize = 10; //Set this size to test pagination export const NFAList = () => { @@ -65,15 +67,19 @@ export const NFAList = () => { Next page
- +
{dataMintedTokens && dataMintedTokens.newMints.length > 0 ? ( dataMintedTokens.newMints.map((mint) => ( - + Open NFA on Opensea @@ -84,7 +90,7 @@ export const NFAList = () => { ) : ( )} - +
); }; diff --git a/ui/src/views/mint/mint-stepper.tsx b/ui/src/views/mint/mint-stepper.tsx index 454e0dc4..e532c57f 100644 --- a/ui/src/views/mint/mint-stepper.tsx +++ b/ui/src/views/mint/mint-stepper.tsx @@ -4,35 +4,46 @@ import { GithubStep } from './github-step'; import { MintStep } from './mint-step'; import { WalletStep } from './wallet-step'; import { NFAStep } from './nfa-step'; +import { Mint } from './mint.context'; +import { NftMinted } from './nft-minted'; export const MintStepper = () => { - return ( - - - - - - - + const { + transaction: { isSuccess }, + } = Mint.useTransactionContext(); - - - - - - - - - - + if (!isSuccess) { + return ( + + + + + + + - - - - - - - - ); + + + + + + + + + + + + + + + + + + + + ); + } else { + return ; + } }; diff --git a/ui/src/views/mint/mint.context.tsx b/ui/src/views/mint/mint.context.tsx index 32a9d19b..e9363180 100644 --- a/ui/src/views/mint/mint.context.tsx +++ b/ui/src/views/mint/mint.context.tsx @@ -2,8 +2,8 @@ import { useState } from 'react'; import { ComboboxItem, DropdownItem } from '@/components'; import { EthereumHooks } from '@/integrations'; -import { GithubState, useFleekERC721Billing } from '@/store'; import { AppLog, createContext } from '@/utils'; +import { GithubState, useFleekERC721Billing } from '@/store'; export type MintContext = { billing: string | undefined; @@ -118,8 +118,10 @@ export abstract class Mint { config={{ transaction: { onSuccess: (data) => { - AppLog.successToast('Successfully minted!'); - alert('transaction hash: ' + data.transactionHash); + AppLog.info('Transaction:', data); + }, + onError: (error) => { + AppLog.errorToast(error.message); }, }, }} diff --git a/ui/src/views/mint/nft-minted.tsx b/ui/src/views/mint/nft-minted.tsx index f2e3c2f8..89db182b 100644 --- a/ui/src/views/mint/nft-minted.tsx +++ b/ui/src/views/mint/nft-minted.tsx @@ -1,10 +1,19 @@ import { Icon } from '@/components'; +import { env } from '@/constants'; +import { useNavigate } from 'react-router-dom'; import { NftCard } from './nft-card'; export const NftMinted = () => { + const navigate = useNavigate(); + const handleButtonClick = () => { + window.open(env.twitter.url, '_blank'); //TODO replace with twitter share + navigate('/home'); + }; + return ( { } message="You have successfully minted your NFA." buttonText="Tweet about your NFA!" - onClick={() => { - alert('TODO: Tweet about your NFA!'); - }} + onClick={handleButtonClick} leftIconButton={} /> ); diff --git a/ui/yarn.lock b/ui/yarn.lock index 8173725c..fd32cf29 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -5442,32 +5442,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.45.0": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" - integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/type-utils" "5.54.1" - "@typescript-eslint/utils" "5.54.1" - debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.45.0": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" - integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" - debug "^4.3.4" - "@typescript-eslint/scope-manager@5.54.1": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" @@ -5476,16 +5450,6 @@ "@typescript-eslint/types" "5.54.1" "@typescript-eslint/visitor-keys" "5.54.1" -"@typescript-eslint/type-utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" - integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== - dependencies: - "@typescript-eslint/typescript-estree" "5.54.1" - "@typescript-eslint/utils" "5.54.1" - debug "^4.3.4" - tsutils "^3.21.0" - "@typescript-eslint/types@5.54.1": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" @@ -5504,7 +5468,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.54.1", "@typescript-eslint/utils@^5.10.0": +"@typescript-eslint/utils@^5.10.0": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== @@ -12868,11 +12832,6 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" From d30fcc35cdc18bce9aa0a1f5ecea6af652c56ab6 Mon Sep 17 00:00:00 2001 From: Camila Sosa Morales Date: Wed, 15 Mar 2023 10:30:16 -0500 Subject: [PATCH 20/23] style: fix bg color due to bad conflicts resolved (#178) --- ui/src/components/core/combobox/combobox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/core/combobox/combobox.tsx b/ui/src/components/core/combobox/combobox.tsx index 7816faf7..8f943119 100644 --- a/ui/src/components/core/combobox/combobox.tsx +++ b/ui/src/components/core/combobox/combobox.tsx @@ -45,7 +45,7 @@ const ComboboxInput = ({ /> Date: Thu, 16 Mar 2023 11:23:50 -0300 Subject: [PATCH 21/23] feat: contract when minting can set verifier (#164) * feat: add token verifier token data and requirement * feat: add verifier argument on mint function * test: fix current foundry tests * test: fix current hardhat tests * test: add test for non token verifier with verifier role * fix: mint signature on hardhat tests * refactor: single mint function * fix: overloaded mint calls on javascript side --- contracts/contracts/FleekERC721.sol | 77 +++++++++++++------ contracts/contracts/IERCX.sol | 15 ---- contracts/scripts/mint.js | 7 +- .../foundry/FleekERC721/AccessControl.t.sol | 4 +- .../AccessPointsAutoApprovalOff.t.sol | 9 +++ .../AccessPointsAutoApprovalOn.t.sol | 9 +++ .../FleekERC721/AccessPoints/ApBase.sol | 4 + .../test/foundry/FleekERC721/Billing.t.sol | 9 ++- contracts/test/foundry/FleekERC721/Mint.t.sol | 9 ++- .../test/foundry/FleekERC721/TestBase.sol | 3 +- .../contracts/FleekERC721/billing.t.ts | 11 +-- .../FleekERC721/collection-roles.t.ts | 15 ++-- .../FleekERC721/get-last-token-id.t.ts | 13 ++-- .../contracts/FleekERC721/helpers/fixture.ts | 11 +-- .../contracts/FleekERC721/helpers/index.ts | 1 - .../helpers/overloaded-functions.ts | 8 -- .../contracts/FleekERC721/minting.t.ts | 14 ++-- .../contracts/FleekERC721/pausable.t.ts | 13 ++-- 18 files changed, 131 insertions(+), 101 deletions(-) delete mode 100644 contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts diff --git a/contracts/contracts/FleekERC721.sol b/contracts/contracts/FleekERC721.sol index 46e673b9..f9b2d042 100644 --- a/contracts/contracts/FleekERC721.sol +++ b/contracts/contracts/FleekERC721.sol @@ -13,6 +13,7 @@ import "./util/FleekStrings.sol"; import "./IERCX.sol"; error MustBeTokenOwner(uint256 tokenId); +error MustBeTokenVerifier(uint256 tokenId); error ThereIsNoTokenMinted(); contract FleekERC721 is @@ -43,8 +44,11 @@ contract FleekERC721 is address indexed owner ); + event MetadataUpdate(uint256 indexed _tokenId, string key, address value, address indexed triggeredBy); + uint256 private _appIds; mapping(uint256 => Token) private _apps; + mapping(uint256 => address) private _tokenVerifier; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. @@ -60,6 +64,14 @@ contract FleekERC721 is __FleekPausable_init(); } + /** + * @dev Checks if caller is the verifier of the token. + */ + modifier requireTokenVerifier(uint256 tokenId) { + if (_tokenVerifier[tokenId] != msg.sender) revert MustBeTokenVerifier(tokenId); + _; + } + /** * @dev Mints a token and returns a tokenId. * @@ -81,7 +93,9 @@ contract FleekERC721 is string memory commitHash, string memory gitRepository, string memory logo, - uint24 color + uint24 color, + bool accessPointAutoApproval, + address verifier ) public payable requirePayment(Billing.Mint) returns (uint256) { uint256 tokenId = _appIds; _mint(to, tokenId); @@ -99,6 +113,7 @@ contract FleekERC721 is // 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. app.currentBuild = 0; app.builds[0] = Build(commitHash, gitRepository); + emit NewMint( tokenId, name, @@ -112,6 +127,10 @@ contract FleekERC721 is msg.sender, to ); + + _tokenVerifier[tokenId] = verifier; + _setAccessPointAutoApproval(tokenId, accessPointAutoApproval); + return tokenId; } @@ -380,30 +399,44 @@ contract FleekERC721 is } } - /*////////////////////////////////////////////////////////////// - ACCESS POINTS - //////////////////////////////////////////////////////////////*/ + /** + * @dev Sets an address as verifier of a token. + * The verifier must have `CollectionRoles.Verifier` role. + * + * May emit a {MetadataUpdate} event. + * + * Requirements: + * + * - the tokenId must be minted and valid. + * - the sender must be the owner of the token. + * - the verifier must have `CollectionRoles.Verifier` role. + * + */ + function setTokenVerifier(uint256 tokenId, address verifier) public requireTokenOwner(tokenId) { + if (!hasCollectionRole(CollectionRoles.Verifier, verifier)) + revert MustHaveCollectionRole(uint8(CollectionRoles.Verifier)); + _requireMinted(tokenId); + _tokenVerifier[tokenId] = verifier; + emit MetadataUpdate(tokenId, "verifier", verifier, msg.sender); + } /** - * @dev Mints with access auto approval setting + * @dev Returns the verifier of a token. + * + * Requirements: + * + * - the tokenId must be minted and valid. + * */ - function mint( - address to, - string memory name, - string memory description, - string memory externalURL, - string memory ENS, - string memory commitHash, - string memory gitRepository, - string memory logo, - uint24 color, - bool accessPointAutoApproval - ) public payable returns (uint256) { - uint256 tokenId = mint(to, name, description, externalURL, ENS, commitHash, gitRepository, logo, color); - _setAccessPointAutoApproval(tokenId, accessPointAutoApproval); - return tokenId; + function getTokenVerifier(uint256 tokenId) public view returns (address) { + _requireMinted(tokenId); + return _tokenVerifier[tokenId]; } + /*////////////////////////////////////////////////////////////// + ACCESS POINTS + //////////////////////////////////////////////////////////////*/ + /** * @dev Add a new AccessPoint register for an app token. * The AP name should be a DNS or ENS url and it should be unique. @@ -494,7 +527,7 @@ contract FleekERC721 is function setAccessPointContentVerify( string memory apName, bool verified - ) public requireCollectionRole(CollectionRoles.Verifier) { + ) public requireCollectionRole(CollectionRoles.Verifier) requireTokenVerifier(_getAccessPointTokenId(apName)) { _setAccessPointContentVerify(apName, verified); } @@ -512,7 +545,7 @@ contract FleekERC721 is function setAccessPointNameVerify( string memory apName, bool verified - ) public requireCollectionRole(CollectionRoles.Verifier) { + ) public requireCollectionRole(CollectionRoles.Verifier) requireTokenVerifier(_getAccessPointTokenId(apName)) { _setAccessPointNameVerify(apName, verified); } diff --git a/contracts/contracts/IERCX.sol b/contracts/contracts/IERCX.sol index c41c62fa..a0e6c850 100644 --- a/contracts/contracts/IERCX.sol +++ b/contracts/contracts/IERCX.sol @@ -51,21 +51,6 @@ interface IERCX { mapping(uint256 => Build) builds; // Mapping to build details for each build number } - /** - * @dev Mints a token and returns a tokenId. - */ - function mint( - address to, - string memory name, - string memory description, - string memory externalURL, - string memory ENS, - string memory commitHash, - string memory gitRepository, - string memory logo, - uint24 color - ) external payable returns (uint256); - /** * @dev Sets a minted token's external URL. */ diff --git a/contracts/scripts/mint.js b/contracts/scripts/mint.js index bd93a023..d8b91389 100644 --- a/contracts/scripts/mint.js +++ b/contracts/scripts/mint.js @@ -80,6 +80,7 @@ const DEFAULT_MINTS = { const params = DEFAULT_MINTS.fleek; const mintTo = '0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049'; +const verifier = '0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049'; (async () => { const contract = await getContract('FleekERC721'); @@ -90,10 +91,10 @@ const mintTo = '0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049'; params.push(await getSVGBase64(svgPath)); console.log('SVG length: ', params[params.length - 1].length); params.push(await getSVGColor(svgPath)); + params.push(false); + params.push(verifier); - const transaction = await contract[ - 'mint(address,string,string,string,string,string,string,string,uint24)' - ](...params); + const transaction = await contract.mint(...params); console.log('Response: ', transaction); })(); diff --git a/contracts/test/foundry/FleekERC721/AccessControl.t.sol b/contracts/test/foundry/FleekERC721/AccessControl.t.sol index 961ef3ed..3450cf29 100644 --- a/contracts/test/foundry/FleekERC721/AccessControl.t.sol +++ b/contracts/test/foundry/FleekERC721/AccessControl.t.sol @@ -34,8 +34,10 @@ contract Test_FleekERC721_AccessControl is Test_FleekERC721_Base, Test_FleekERC7 // Mint to tokenOwner to set tokenOwner mintDefault(tokenOwner); // Set tokenController to minted token - vm.prank(tokenOwner); + vm.startPrank(tokenOwner); CuT.grantTokenRole(tokenId, FleekAccessControl.TokenRoles.Controller, tokenController); + CuT.setTokenVerifier(tokenId, collectionVerifier); + vm.stopPrank(); } function test_setUp() public { diff --git a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol index fe528a4a..f12914d4 100644 --- a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol +++ b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOff.t.sol @@ -177,6 +177,15 @@ contract Test_FleekERC721_AccessPoint is Test_FleekERC721_Base, APConstants { CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Verifier, randomAddress); + vm.startPrank(randomAddress); + expectRevertWithMustBeTokenVerifier(tokenId); + CuT.setAccessPointNameVerify(accessPointName, true); + expectRevertWithMustBeTokenVerifier(tokenId); + CuT.setAccessPointContentVerify(accessPointName, true); + vm.stopPrank(); + + CuT.setTokenVerifier(tokenId, randomAddress); + vm.startPrank(randomAddress); CuT.setAccessPointNameVerify(accessPointName, true); CuT.setAccessPointContentVerify(accessPointName, true); diff --git a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol index 18ae4bd9..78c94f0e 100644 --- a/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol +++ b/contracts/test/foundry/FleekERC721/AccessPoints/AccessPointsAutoApprovalOn.t.sol @@ -179,6 +179,15 @@ contract Test_FleekERC721_AccessPoint is Test_FleekERC721_Base, APConstants { CuT.grantCollectionRole(FleekAccessControl.CollectionRoles.Verifier, randomAddress); + vm.startPrank(randomAddress); + expectRevertWithMustBeTokenVerifier(tokenId); + CuT.setAccessPointNameVerify(accessPointName, true); + expectRevertWithMustBeTokenVerifier(tokenId); + CuT.setAccessPointContentVerify(accessPointName, true); + vm.stopPrank(); + + CuT.setTokenVerifier(tokenId, randomAddress); + vm.startPrank(randomAddress); CuT.setAccessPointNameVerify(accessPointName, true); CuT.setAccessPointContentVerify(accessPointName, true); diff --git a/contracts/test/foundry/FleekERC721/AccessPoints/ApBase.sol b/contracts/test/foundry/FleekERC721/AccessPoints/ApBase.sol index 335c64b7..1ecc8d99 100644 --- a/contracts/test/foundry/FleekERC721/AccessPoints/ApBase.sol +++ b/contracts/test/foundry/FleekERC721/AccessPoints/ApBase.sol @@ -7,6 +7,10 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; contract APConstants is Test { using Strings for address; + function expectRevertWithMustBeTokenVerifier(uint256 tokenId) public { + vm.expectRevert(abi.encodeWithSelector(MustBeTokenVerifier.selector, tokenId)); + } + function assertAccessPointJSON( string memory accessPointName, string memory _tokenId, diff --git a/contracts/test/foundry/FleekERC721/Billing.t.sol b/contracts/test/foundry/FleekERC721/Billing.t.sol index dbde3542..8a87e790 100644 --- a/contracts/test/foundry/FleekERC721/Billing.t.sol +++ b/contracts/test/foundry/FleekERC721/Billing.t.sol @@ -56,7 +56,8 @@ contract Test_FleekERC721_Billing is Test_FleekERC721_Base, Test_FleekERC721_Bil TestConstants.APP_GIT_REPOSITORY, TestConstants.LOGO_0, TestConstants.APP_COLOR, - TestConstants.APP_ACCESS_POINT_AUTO_APPROVAL_SETTINGS + TestConstants.APP_ACCESS_POINT_AUTO_APPROVAL_SETTINGS, + deployer ); assertEq(CuT.ownerOf(tokenId), deployer); assertEq(address(CuT).balance, mintPrice); @@ -76,7 +77,8 @@ contract Test_FleekERC721_Billing is Test_FleekERC721_Base, Test_FleekERC721_Bil TestConstants.APP_GIT_REPOSITORY, TestConstants.LOGO_0, TestConstants.APP_COLOR, - TestConstants.APP_ACCESS_POINT_AUTO_APPROVAL_SETTINGS + TestConstants.APP_ACCESS_POINT_AUTO_APPROVAL_SETTINGS, + deployer ); assertEq(address(CuT).balance, 0); } @@ -98,7 +100,8 @@ contract Test_FleekERC721_Billing is Test_FleekERC721_Base, Test_FleekERC721_Bil TestConstants.APP_GIT_REPOSITORY, TestConstants.LOGO_0, TestConstants.APP_COLOR, - TestConstants.APP_ACCESS_POINT_AUTO_APPROVAL_SETTINGS + TestConstants.APP_ACCESS_POINT_AUTO_APPROVAL_SETTINGS, + deployer ); assertEq(CuT.ownerOf(tokenId), deployer); assertEq(address(CuT).balance, value); diff --git a/contracts/test/foundry/FleekERC721/Mint.t.sol b/contracts/test/foundry/FleekERC721/Mint.t.sol index ad401a0b..01e94e94 100644 --- a/contracts/test/foundry/FleekERC721/Mint.t.sol +++ b/contracts/test/foundry/FleekERC721/Mint.t.sol @@ -36,7 +36,8 @@ contract Test_FleekERC721_Mint is Test_FleekERC721_Base { "https://github.com/a-different/repository", TestConstants.LOGO_1, 0x654321, - false + false, + deployer ); assertEq(firstMint, 0); @@ -54,7 +55,8 @@ contract Test_FleekERC721_Mint is Test_FleekERC721_Base { "https://github.com/a-different/repository", TestConstants.LOGO_1, 0x654321, - true + true, + deployer ); assertEq(mint, 0); @@ -91,7 +93,8 @@ contract Test_FleekERC721_Mint is Test_FleekERC721_Base { gitRepository, logo, color, - autoApprovalAp + autoApprovalAp, + deployer ); assertEq(tokenId, 0); assertEq(CuT.ownerOf(tokenId), to); diff --git a/contracts/test/foundry/FleekERC721/TestBase.sol b/contracts/test/foundry/FleekERC721/TestBase.sol index fe0a6812..3711a089 100644 --- a/contracts/test/foundry/FleekERC721/TestBase.sol +++ b/contracts/test/foundry/FleekERC721/TestBase.sol @@ -61,7 +61,8 @@ abstract contract Test_FleekERC721_Base is Test, Test_FleekERC721_Assertions { TestConstants.APP_GIT_REPOSITORY, TestConstants.LOGO_0, TestConstants.APP_COLOR, - false // Auto Approval Is OFF + false, // Auto Approval Is OFF + deployer ); return mint; diff --git a/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts b/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts index 7156891f..7bf97aae 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/billing.t.ts @@ -1,12 +1,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { ethers } from 'hardhat'; import { expect } from 'chai'; -import { - Fixtures, - TestConstants, - Errors, - OverloadedFunctions, -} from './helpers'; +import { Fixtures, TestConstants, Errors } from './helpers'; const { Billing, MintParams } = TestConstants; @@ -17,7 +12,7 @@ describe('FleekERC721.Billing', () => { const mint = (value?: any) => { const { contract, owner } = fixture; - return contract[OverloadedFunctions.Mint.Default]( + return contract.mint( owner.address, MintParams.name, MintParams.description, @@ -27,6 +22,8 @@ describe('FleekERC721.Billing', () => { MintParams.gitRepository, MintParams.logo, MintParams.color, + MintParams.accessPointAutoApprovalSettings, + owner.address, { value } ); }; diff --git a/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts b/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts index a278d3db..2e879755 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/collection-roles.t.ts @@ -1,11 +1,6 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { - TestConstants, - Fixtures, - Errors, - OverloadedFunctions, -} from './helpers'; +import { TestConstants, Fixtures, Errors } from './helpers'; const { CollectionRoles } = TestConstants; @@ -182,9 +177,9 @@ describe('FleekERC721.CollectionRoles', () => { }); it('should not be able to verify access point if not verifier', async () => { - const { contract, otherAccount } = fixture; + const { contract, otherAccount, owner } = fixture; - await contract[OverloadedFunctions.Mint.Default]( + await contract.mint( otherAccount.address, TestConstants.MintParams.name, TestConstants.MintParams.description, @@ -193,7 +188,9 @@ describe('FleekERC721.CollectionRoles', () => { TestConstants.MintParams.commitHash, TestConstants.MintParams.gitRepository, TestConstants.MintParams.logo, - TestConstants.MintParams.color + TestConstants.MintParams.color, + TestConstants.MintParams.accessPointAutoApprovalSettings, + owner.address ); await contract.addAccessPoint(0, 'random.com'); diff --git a/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts b/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts index de0d1032..f9193f2e 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/get-last-token-id.t.ts @@ -1,17 +1,12 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { - TestConstants, - Fixtures, - Errors, - OverloadedFunctions, -} from './helpers'; +import { TestConstants, Fixtures, Errors } from './helpers'; describe('FleekERC721.GetLastTokenId', () => { let fixture: Awaited>; const mint = async () => { - const response = await fixture.contract[OverloadedFunctions.Mint.Default]( + const response = await fixture.contract.mint( fixture.owner.address, TestConstants.MintParams.name, TestConstants.MintParams.description, @@ -20,7 +15,9 @@ describe('FleekERC721.GetLastTokenId', () => { TestConstants.MintParams.commitHash, TestConstants.MintParams.gitRepository, TestConstants.MintParams.logo, - TestConstants.MintParams.color + TestConstants.MintParams.color, + false, + fixture.owner.address ); return response; diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts index fda52cf4..f16d5e05 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/helpers/fixture.ts @@ -1,10 +1,7 @@ import { ethers, upgrades } from 'hardhat'; import { TestConstants } from './constants'; -import { OverloadedFunctions } from './overloaded-functions'; export abstract class Fixtures { - static async paused() {} - static async default() { // Contracts are deployed using the first signer/account by default const [owner, otherAccount] = await ethers.getSigners(); @@ -36,9 +33,7 @@ export abstract class Fixtures { static async withMint() { const fromDefault = await Fixtures.default(); - const response = await fromDefault.contract[ - OverloadedFunctions.Mint.Default - ]( + const response = await fromDefault.contract.mint( fromDefault.owner.address, TestConstants.MintParams.name, TestConstants.MintParams.description, @@ -47,7 +42,9 @@ export abstract class Fixtures { TestConstants.MintParams.commitHash, TestConstants.MintParams.gitRepository, TestConstants.MintParams.logo, - TestConstants.MintParams.color + TestConstants.MintParams.color, + TestConstants.MintParams.accessPointAutoApprovalSettings, + fromDefault.owner.address ); const tokenId = response.value.toNumber(); diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts index 9209e635..650cdb03 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/helpers/index.ts @@ -3,4 +3,3 @@ export * from './fixture'; export * from './utils'; export * from './errors'; export * from './events'; -export * from './overloaded-functions'; diff --git a/contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts b/contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts deleted file mode 100644 index a4f9d629..00000000 --- a/contracts/test/hardhat/contracts/FleekERC721/helpers/overloaded-functions.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const OverloadedFunctions = Object.freeze({ - Mint: { - Default: - 'mint(address,string,string,string,string,string,string,string,uint24)', - WithAPAutoApproval: - 'mint(address,string,string,string,string,string,string,string,uint24,bool)', - }, -}); diff --git a/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts b/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts index 0afa770a..6441ca6e 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/minting.t.ts @@ -1,6 +1,6 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { TestConstants, Fixtures, OverloadedFunctions } from './helpers'; +import { TestConstants, Fixtures } from './helpers'; import { ethers } from 'hardhat'; const { MintParams } = TestConstants; @@ -9,7 +9,7 @@ describe('FleekERC721.Minting', () => { it('should be able to mint a new token', async () => { const { owner, contract } = await loadFixture(Fixtures.default); - const response = await contract[OverloadedFunctions.Mint.Default]( + const response = await contract.mint( owner.address, MintParams.name, MintParams.description, @@ -18,7 +18,9 @@ describe('FleekERC721.Minting', () => { MintParams.commitHash, MintParams.gitRepository, MintParams.logo, - MintParams.color + MintParams.color, + MintParams.accessPointAutoApprovalSettings, + owner.address ); expect(response.value).to.be.instanceOf(ethers.BigNumber); @@ -30,7 +32,7 @@ describe('FleekERC721.Minting', () => { Fixtures.default ); - const response = await contract[OverloadedFunctions.Mint.Default]( + const response = await contract.mint( owner.address, MintParams.name, MintParams.description, @@ -39,7 +41,9 @@ describe('FleekERC721.Minting', () => { MintParams.commitHash, MintParams.gitRepository, MintParams.logo, - MintParams.color + MintParams.color, + MintParams.accessPointAutoApprovalSettings, + owner.address ); const tokenId = response.value.toNumber(); diff --git a/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts b/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts index 1d52c367..2dd00455 100644 --- a/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts +++ b/contracts/test/hardhat/contracts/FleekERC721/pausable.t.ts @@ -1,11 +1,6 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { - TestConstants, - Fixtures, - Errors, - OverloadedFunctions, -} from './helpers'; +import { TestConstants, Fixtures, Errors } from './helpers'; const { MintParams, CollectionRoles, TokenRoles } = TestConstants; @@ -15,7 +10,7 @@ describe('FleekERC721.Pausable', () => { const mint = () => { const { owner, contract } = fixture; - return contract[OverloadedFunctions.Mint.Default]( + return contract.mint( owner.address, MintParams.name, MintParams.description, @@ -24,7 +19,9 @@ describe('FleekERC721.Pausable', () => { MintParams.commitHash, MintParams.gitRepository, MintParams.logo, - MintParams.color + MintParams.color, + false, + owner.address ); }; From 2eca4be8f03b29c12ad9754597628986e2d24fc2 Mon Sep 17 00:00:00 2001 From: Shredder <110225819+EmperorOrokuSaki@users.noreply.github.com> Date: Fri, 17 Mar 2023 19:08:17 +0330 Subject: [PATCH 22/23] feat: update subgraph and its new mint handler + test refactor (#186) * feat: update newMint and add verifier and apAutoApproval, update subgraph accordingly. * remove: bugged tests. --- contracts/contracts/FleekERC721.sol | 8 +- subgraph/schema.graphql | 8 ++ subgraph/src/access-point.ts | 2 + subgraph/src/mint.ts | 12 +- subgraph/src/transfer.ts | 1 + subgraph/subgraph.yaml | 2 +- subgraph/tests/matchstick/.latest.json | 4 +- .../CollectionRoleChanged.test.ts | 80 ----------- .../access-control/TokenRoleChanged.test.ts | 124 ------------------ .../access-points/newAccessPoint.test.ts | 100 -------------- subgraph/tests/matchstick/helpers/utils.ts | 37 +----- 11 files changed, 28 insertions(+), 350 deletions(-) delete mode 100644 subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts delete mode 100644 subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts delete mode 100644 subgraph/tests/matchstick/access-points/newAccessPoint.test.ts diff --git a/contracts/contracts/FleekERC721.sol b/contracts/contracts/FleekERC721.sol index f9b2d042..df1df5af 100644 --- a/contracts/contracts/FleekERC721.sol +++ b/contracts/contracts/FleekERC721.sol @@ -40,8 +40,10 @@ contract FleekERC721 is string gitRepository, string logo, uint24 color, + bool accessPointAutoApproval, address indexed minter, - address indexed owner + address indexed owner, + address verifier ); event MetadataUpdate(uint256 indexed _tokenId, string key, address value, address indexed triggeredBy); @@ -124,8 +126,10 @@ contract FleekERC721 is gitRepository, logo, color, + accessPointAutoApproval, msg.sender, - to + to, + verifier ); _tokenVerifier[tokenId] = verifier; diff --git a/subgraph/schema.graphql b/subgraph/schema.graphql index e3528ccf..11292c6f 100644 --- a/subgraph/schema.graphql +++ b/subgraph/schema.graphql @@ -32,6 +32,7 @@ type NewMint @entity(immutable: true) { accessPointAutoApproval: Boolean! triggeredBy: Bytes! # address owner: Owner! # address + verifier: Bytes! blockNumber: BigInt! blockTimestamp: BigInt! transactionHash: Bytes! @@ -78,6 +79,7 @@ type Token @entity { gitRepository: GitRepository! commitHash: String! accessPoints: [AccessPoint!] @derivedFrom(field: "token") + verifier: Verifier! # Address } # Owner entity for collection, access points, and tokens @@ -94,6 +96,12 @@ type Controller @entity { tokens: [Token!] @derivedFrom(field: "controllers") } +# Verifier entity for tokens +type Verifier @entity { + id: Bytes! # address + tokens: [Token!] @derivedFrom(field: "verifier") +} + type GitRepository @entity { id: String! # transaction hash of the first transaction this repository appeared in tokens: [Token!] @derivedFrom(field: "gitRepository") diff --git a/subgraph/src/access-point.ts b/subgraph/src/access-point.ts index 02816b7d..7d598ccc 100644 --- a/subgraph/src/access-point.ts +++ b/subgraph/src/access-point.ts @@ -46,6 +46,8 @@ export function handleNewAccessPoint(event: NewAccessPointEvent): void { if (!ownerEntity) { // Create a new owner entity ownerEntity = new Owner(event.params.owner); + // Since no CollectionRoleChanged event was emitted before for this address, we can set `collection` to false. + ownerEntity.collection = false; } // Save entities. diff --git a/subgraph/src/mint.ts b/subgraph/src/mint.ts index 71b91059..e3e01d48 100644 --- a/subgraph/src/mint.ts +++ b/subgraph/src/mint.ts @@ -32,6 +32,7 @@ export function handleNewMint(event: NewMintEvent): void { let accessPointAutoApproval = event.params.accessPointAutoApproval; let tokenId = event.params.tokenId; let ownerAddress = event.params.owner; + let verifierAddress = event.params.verifier; newMintEntity.tokenId = tokenId; newMintEntity.name = name; @@ -45,6 +46,7 @@ export function handleNewMint(event: NewMintEvent): void { newMintEntity.accessPointAutoApproval = accessPointAutoApproval; newMintEntity.triggeredBy = event.params.minter; newMintEntity.owner = ownerAddress; + newMintEntity.verifier = verifierAddress; newMintEntity.blockNumber = event.block.number; newMintEntity.blockTimestamp = event.block.timestamp; newMintEntity.transactionHash = event.transaction.hash; @@ -54,17 +56,13 @@ export function handleNewMint(event: NewMintEvent): void { // Create Token, Owner, and Controller entities let owner = Owner.load(ownerAddress); - let gitRepositoryEntity = GitRepositoryEntity.load(gitRepository); let token = new Token(Bytes.fromByteArray(Bytes.fromBigInt(tokenId))); if (!owner) { // Create a new owner entity owner = new Owner(ownerAddress); - } - - if (!gitRepositoryEntity) { - // Create a new gitRepository entity - gitRepositoryEntity = new GitRepositoryEntity(gitRepository); + // Since no CollectionRoleChanged event was emitted before for this address, we can set `collection` to false. + owner.collection = false; } // Populate Token with data from the event @@ -79,6 +77,7 @@ export function handleNewMint(event: NewMintEvent): void { token.color = color; token.accessPointAutoApproval = accessPointAutoApproval; token.owner = ownerAddress; + token.verifier = verifierAddress; token.mintTransaction = event.transaction.hash.concatI32( event.logIndex.toI32() ); @@ -87,6 +86,5 @@ export function handleNewMint(event: NewMintEvent): void { // Save entities owner.save(); - gitRepositoryEntity.save(); token.save(); } \ No newline at end of file diff --git a/subgraph/src/transfer.ts b/subgraph/src/transfer.ts index 6dea3d2b..faa64a47 100644 --- a/subgraph/src/transfer.ts +++ b/subgraph/src/transfer.ts @@ -1,6 +1,7 @@ import { Bytes, log, + store } from '@graphprotocol/graph-ts'; // Event Imports [based on the yaml config] diff --git a/subgraph/subgraph.yaml b/subgraph/subgraph.yaml index 27b3d768..d64b7c76 100644 --- a/subgraph/subgraph.yaml +++ b/subgraph/subgraph.yaml @@ -47,7 +47,7 @@ dataSources: 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) + - event: NewMint(indexed uint256,string,string,string,string,string,string,string,uint24,bool,indexed address,indexed address,address) handler: handleNewMint - event: Transfer(indexed address,indexed address,indexed uint256) handler: handleTransfer diff --git a/subgraph/tests/matchstick/.latest.json b/subgraph/tests/matchstick/.latest.json index 1d88be34..870c04b7 100644 --- a/subgraph/tests/matchstick/.latest.json +++ b/subgraph/tests/matchstick/.latest.json @@ -1,4 +1,4 @@ { "version": "0.5.4", - "timestamp": 1678390993500 -} + "timestamp": 1679061942846 +} \ No newline at end of file diff --git a/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts b/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts deleted file mode 100644 index ef4ba96d..00000000 --- a/subgraph/tests/matchstick/access-control/CollectionRoleChanged.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - assert, - describe, - test, - clearStore, - beforeAll, - afterAll, -} from 'matchstick-as/assembly/index'; -import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { - createNewCollectionRoleChanged, - handleCollectionRoleChangedList, - makeEventId, - USER_ONE, - USER_TWO, -} from '../helpers/utils'; -import { CollectionRoleChanged } from '../../../generated/FleekNFA/FleekNFA'; - -describe('Collection Role Changed tests', () => { - beforeAll(() => { - // Collection Role Changed - let collectionRoleChangedList: CollectionRoleChanged[] = []; - - collectionRoleChangedList.push( - createNewCollectionRoleChanged(0, 0, USER_ONE, true, USER_TWO) // User Two grants collection owner access to User One - ); - - collectionRoleChangedList.push( - createNewCollectionRoleChanged(2, 0, USER_ONE, false, USER_TWO) // User Two revokes the owner access of User One to the collection - ); - - handleCollectionRoleChangedList(collectionRoleChangedList); - }); - - afterAll(() => { - clearStore(); - }); - - describe('Assertions', () => { - test('Check the `role` field of each CollectionRoleChanged event entity', () => { - assert.fieldEquals('CollectionRoleChanged', makeEventId(0), 'role', '0'); - assert.fieldEquals('CollectionRoleChanged', makeEventId(2), 'role', '0'); - }); - - test('Check the `toAddress` field of each CollectionRoleChanged event entity', () => { - assert.fieldEquals( - 'CollectionRoleChanged', - makeEventId(0), - 'toAddress', - USER_ONE.toString() - ); - assert.fieldEquals( - 'CollectionRoleChanged', - makeEventId(2), - 'toAddress', - USER_ONE.toString() - ); - }); - - test('Check the `byAddress` field of each CollectionRoleChanged event entity', () => { - assert.fieldEquals( - 'CollectionRoleChanged', - makeEventId(0), - 'byAddress', - USER_TWO.toString() - ); - assert.fieldEquals( - 'CollectionRoleChanged', - makeEventId(2), - 'byAddress', - USER_TWO.toString() - ); - }); - - test('Check the `status` field of each CollectionRoleChanged event entity', () => { - assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'status', 'true'); - assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'status', 'false'); - }); - }); -}); diff --git a/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts b/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts deleted file mode 100644 index e0e6fdd6..00000000 --- a/subgraph/tests/matchstick/access-control/TokenRoleChanged.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { - assert, - describe, - test, - clearStore, - beforeAll, - afterAll, -} from 'matchstick-as/assembly/index'; -import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { - createNewTokenRoleChanged, - handleTokenRoleChangedList, - makeEventId, - USER_ONE, - USER_TWO, -} from '../helpers/utils'; -import { TokenRoleChanged } from '../../../generated/FleekNFA/FleekNFA'; - -describe('Token Role Changed tests', () => { - beforeAll(() => { - // Token Role Changed - let tokenRoleChangedList: TokenRoleChanged[] = []; - - tokenRoleChangedList.push( - createNewTokenRoleChanged( - 0, - BigInt.fromI32(0), - 0, - USER_ONE, - true, - USER_TWO - ) // User Two gives User One controller access to TokenId 0 - ); - - tokenRoleChangedList.push( - createNewTokenRoleChanged( - 1, - BigInt.fromI32(1), - 0, - USER_TWO, - true, - USER_ONE - ) // User One gives User Two controller access to TokenId 1 - ); - - tokenRoleChangedList.push( - createNewTokenRoleChanged( - 2, - BigInt.fromI32(0), - 0, - USER_ONE, - false, - USER_TWO - ) // User Two revokes the controller access of User One to tokenId 0 - ); - - handleTokenRoleChangedList(tokenRoleChangedList); - }); - - afterAll(() => { - clearStore(); - }); - - describe('Assertions', () => { - test('Check the `tokenId` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'tokenId', '0'); - assert.fieldEquals('TokenRoleChanged', makeEventId(1), 'tokenId', '1'); - assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'tokenId', '0'); - }); - test('Check the `role` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'role', '0'); - assert.fieldEquals('TokenRoleChanged', makeEventId(1), 'role', '0'); - assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'role', '0'); - }); - - test('Check the `toAddress` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(0), - 'toAddress', - USER_ONE.toString() - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(1), - 'toAddress', - USER_TWO.toString() - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(2), - 'toAddress', - USER_ONE.toString() - ); - }); - - test('Check the `byAddress` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(0), - 'byAddress', - USER_TWO.toString() - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(1), - 'byAddress', - USER_ONE.toString() - ); - assert.fieldEquals( - 'TokenRoleChanged', - makeEventId(2), - 'byAddress', - USER_TWO.toString() - ); - }); - - test('Check the `status` field of each TokenRoleChanged event entity', () => { - assert.fieldEquals('TokenRoleChanged', makeEventId(0), 'status', 'true'); - assert.fieldEquals('TokenRoleChanged', makeEventId(1), 'status', 'true'); - assert.fieldEquals('TokenRoleChanged', makeEventId(2), 'status', 'false'); - }); - }); -}); diff --git a/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts b/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts deleted file mode 100644 index aaaf06ce..00000000 --- a/subgraph/tests/matchstick/access-points/newAccessPoint.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { - assert, - describe, - test, - clearStore, - beforeAll, - afterAll, -} from 'matchstick-as/assembly/index'; -import { BigInt, Bytes } from '@graphprotocol/graph-ts'; -import { - createNewAccessPointEvent, - handleNewAccessPoints, - makeEventId, - USER_ONE, - USER_TWO, -} from '../helpers/utils'; -import { NewAccessPoint } from '../../../generated/FleekNFA/FleekNFA'; - -describe('New Access Point tests', () => { - beforeAll(() => { - // New Access Points - let newAccessPoints: NewAccessPoint[] = []; - - // User One has two access points: one for tokenId 0 and one for tokenId 1 - newAccessPoints.push( - createNewAccessPointEvent(0, 'firstAP', BigInt.fromI32(0), USER_ONE) - ); - newAccessPoints.push( - createNewAccessPointEvent(1, 'secondAP', BigInt.fromI32(1), USER_ONE) - ); - - // User Two has one access point for tokenId 0 - newAccessPoints.push( - createNewAccessPointEvent(2, 'thirdAP', BigInt.fromI32(0), USER_TWO) - ); - handleNewAccessPoints(newAccessPoints); - }); - - afterAll(() => { - clearStore(); - }); - - describe('Assertions', () => { - test('Check the number of `NewAccessPoint` events to be valid', () => { - assert.entityCount('NewAccessPoint', 3); - }); - - test('Check the `apName` field of each event', () => { - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(0), - 'apName', - 'firstAP'.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(1), - 'apName', - 'secondAP'.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(2), - 'apName', - 'thirdAP'.toString() - ); - }); - - test('Check the `tokenId` field of each event', () => { - assert.fieldEquals('NewAccessPoint', makeEventId(0), 'tokenId', '0'); - assert.fieldEquals('NewAccessPoint', makeEventId(1), 'tokenId', '1'); - assert.fieldEquals('NewAccessPoint', makeEventId(2), 'tokenId', '0'); - }); - - test('Check the `owner` field of each event', () => { - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(0), - 'owner', - USER_ONE.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(1), - 'owner', - USER_ONE.toString() - ); - assert.fieldEquals( - 'NewAccessPoint', - makeEventId(2), - 'owner', - USER_TWO.toString() - ); - }); - - test('check the existence of a nonexistent event in the database', () => { - assert.notInStore('NewAccessPoint', makeEventId(3)); - }); - }); -}); diff --git a/subgraph/tests/matchstick/helpers/utils.ts b/subgraph/tests/matchstick/helpers/utils.ts index 18aaf069..0388d41d 100644 --- a/subgraph/tests/matchstick/helpers/utils.ts +++ b/subgraph/tests/matchstick/helpers/utils.ts @@ -10,7 +10,6 @@ import { ChangeAccessPointNameVerify, TokenRoleChanged, CollectionRoleChanged, - TokenRolesCleared, } from '../../../generated/FleekNFA/FleekNFA'; import { handleApproval, @@ -22,7 +21,6 @@ import { handleTransfer, handleTokenRoleChanged, handleCollectionRoleChanged, - handleTokenRolesCleared, } from '../../../src/fleek-nfa'; export function createApprovalEvent( @@ -166,6 +164,9 @@ export function createNewMintEvent( newMintEvent.parameters.push( new ethereum.EventParam('owner', ethereum.Value.fromAddress(to)) ); + newMintEvent.parameters.push( + new ethereum.EventParam('verifier', ethereum.Value.fromAddress(to)) + ); newMintEvent.transaction.hash = Bytes.fromI32(event_count); newMintEvent.logIndex = new BigInt(event_count); @@ -368,32 +369,6 @@ export function createNewCollectionRoleChanged( return collectionRoleChanged; } -export function createNewTokenRolesCleared( - event_count: i32, - tokenId: BigInt, - byAddress: Address -): TokenRolesCleared { - let tokenRolesCleared = changetype(newMockEvent()); - - tokenRolesCleared.parameters = new Array(); - - tokenRolesCleared.parameters.push( - new ethereum.EventParam( - 'tokenId', - ethereum.Value.fromUnsignedBigInt(tokenId) - ) - ); - - tokenRolesCleared.parameters.push( - new ethereum.EventParam('byAddress', ethereum.Value.fromAddress(byAddress)) - ); - - tokenRolesCleared.transaction.hash = Bytes.fromI32(event_count); - tokenRolesCleared.logIndex = new BigInt(event_count); - - return tokenRolesCleared; -} - export const CONTRACT: Address = Address.fromString( '0x0000000000000000000000000000000000000000' ); @@ -467,12 +442,6 @@ export function handleCollectionRoleChangedList( }); } -export function handleTokenRolesClearedList(events: TokenRolesCleared[]): void { - events.forEach((event) => { - handleTokenRolesCleared(event); - }); -} - export function makeEventId(id: i32): string { return Bytes.fromI32(id).toHexString() + '00000000'; } From 4682be82e91b4e21734b8963f93302d2e69116a4 Mon Sep 17 00:00:00 2001 From: Shredder <110225819+EmperorOrokuSaki@users.noreply.github.com> Date: Fri, 17 Mar 2023 19:43:43 +0330 Subject: [PATCH 23/23] refactor: metadataUpdate handlers in the subgraph (#187) * feat: update newMint and add verifier and apAutoApproval, update subgraph accordingly. * remove: bugged tests. * refactor: update metadataUpdate handlers to match the new interface. --- subgraph/src/metadata-update.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/subgraph/src/metadata-update.ts b/subgraph/src/metadata-update.ts index 9d14dd1a..91f6ebf8 100644 --- a/subgraph/src/metadata-update.ts +++ b/subgraph/src/metadata-update.ts @@ -6,6 +6,7 @@ import { MetadataUpdate1 as MetadataUpdateEvent1, MetadataUpdate2 as MetadataUpdateEvent2, MetadataUpdate3 as MetadataUpdateEvent3, + MetadataUpdate4 as MetadataUpdateEvent4, } from '../generated/FleekNFA/FleekNFA'; // Entity Imports [based on the schema] @@ -16,7 +17,7 @@ import { } from '../generated/schema'; export function handleMetadataUpdateWithStringValue( - event: MetadataUpdateEvent + event: MetadataUpdateEvent1 ): void { /** * Metadata handled here: @@ -62,7 +63,7 @@ export function handleMetadataUpdateWithStringValue( } export function handleMetadataUpdateWithDoubleStringValue( - event: MetadataUpdateEvent2 + event: MetadataUpdateEvent3 ): void { /** * setTokenBuild @@ -101,7 +102,7 @@ export function handleMetadataUpdateWithDoubleStringValue( } export function handleMetadataUpdateWithIntValue( - event: MetadataUpdateEvent1 + event: MetadataUpdateEvent2 ): void { /** * setTokenColor @@ -132,7 +133,7 @@ export function handleMetadataUpdateWithIntValue( } export function handleMetadataUpdateWithBooleanValue( - event: MetadataUpdateEvent3 + event: MetadataUpdateEvent4 ): void { /** * accessPointAutoApproval