From b957e87a830f67305618a7f49206542b3098033d Mon Sep 17 00:00:00 2001 From: Felipe Mendes Date: Mon, 27 Feb 2023 11:57:44 -0300 Subject: [PATCH] feat: UI mint integration (#139) * feat: add base hook for fleekerc721 * feat: add test view for minting using wagmi * refactor: from hook to context creation * refactor: work on provider configs * feat: append mint transaction to mint view * chore: add comments * feat: add nfa price estimation * fix: remove forgotten logs * fix: repo and branch url creating and variable misspells * fix: accidently removed yarn.lock file * fix: misspelled repositores * chore: add disclaimer comment at mint-test view * refactor: remove wallet store --- ui/package.json | 1 + ui/src/app.tsx | 5 +- ui/src/components/core/button/button.tsx | 136 +-- ui/src/global.d.ts | 7 - ui/src/hooks/index.ts | 2 +- ui/src/hooks/use-toast.ts | 8 - ui/src/hooks/use-transaction-cost.ts | 22 + .../ethereum/contracts/FleekERC721.json | 1067 +++++++++++++---- .../ethereum/hooks/ethereum-hooks.tsx | 175 +++ ui/src/integrations/ethereum/hooks/index.ts | 1 + ui/src/integrations/ethereum/index.ts | 1 + .../github/async-thunk/fetch-repositories.ts | 13 +- ui/src/store/features/github/github-slice.ts | 16 +- ui/src/store/features/index.ts | 1 - .../features/wallet/async-thunk/connect.ts | 34 - .../features/wallet/async-thunk/index.ts | 1 - ui/src/store/features/wallet/index.ts | 2 - ui/src/store/features/wallet/utils.ts | 18 - ui/src/store/features/wallet/wallet-slice.ts | 64 - ui/src/store/store.ts | 2 - ui/src/views/mint-test/index.ts | 1 + ui/src/views/mint-test/mint-test.tsx | 203 ++++ ui/src/views/mint/form-step/mint-form.tsx | 41 +- .../repo-branch-commit-fields.tsx | 6 +- .../repository.tsx | 8 +- ui/src/views/mint/mint.context.tsx | 39 +- ui/src/views/mint/nft-card/nft-card.tsx | 4 + .../views/mint/preview-step/mint-preview.tsx | 37 +- ui/yarn.lock | 5 + yarn.lock | 491 ++++---- 30 files changed, 1662 insertions(+), 749 deletions(-) delete mode 100644 ui/src/global.d.ts delete mode 100644 ui/src/hooks/use-toast.ts create mode 100644 ui/src/hooks/use-transaction-cost.ts create mode 100644 ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx create mode 100644 ui/src/integrations/ethereum/hooks/index.ts delete mode 100644 ui/src/store/features/wallet/async-thunk/connect.ts delete mode 100644 ui/src/store/features/wallet/async-thunk/index.ts delete mode 100644 ui/src/store/features/wallet/index.ts delete mode 100644 ui/src/store/features/wallet/utils.ts delete mode 100644 ui/src/store/features/wallet/wallet-slice.ts create mode 100644 ui/src/views/mint-test/index.ts create mode 100644 ui/src/views/mint-test/mint-test.tsx diff --git a/ui/package.json b/ui/package.json index ca5787d..afbcba8 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,6 +20,7 @@ "@react-icons/all-files": "^4.1.0", "@reduxjs/toolkit": "^1.9.1", "@stitches/react": "^1.2.8", + "abitype": "^0.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 64be2d3..f75b169 100644 --- a/ui/src/app.tsx +++ b/ui/src/app.tsx @@ -1,11 +1,9 @@ import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom'; -import { initializeWallet } from './store'; import { themeGlobals } from '@/theme/globals'; import { Home, Mint } from './views'; import { SVGTestScreen } from './views/svg-test'; // TODO: remove when done import { ConnectKitButton } from 'connectkit'; - -initializeWallet(); +import { MintTest } from './views/mint-test'; export const App = () => { themeGlobals(); @@ -20,6 +18,7 @@ export const App = () => { } /> } /> } /> + } /> } /> diff --git a/ui/src/components/core/button/button.tsx b/ui/src/components/core/button/button.tsx index 4766bc9..a629df8 100644 --- a/ui/src/components/core/button/button.tsx +++ b/ui/src/components/core/button/button.tsx @@ -3,74 +3,76 @@ import { ButtonContent } from './button-content'; import { ButtonSpinner } from './button-spinner'; import { forwardRef } from 'react'; -export const Button = forwardRef((props, ref) => { - const { - isActive, - isLoading, - isDisabled, - spinnerPlacement = 'start', - spinner, - loadingText, - iconSpacing, - topIcon, - bottomIcon, - rightIcon, - leftIcon, - isFullWidth, - children, - ...ownProps - } = props; +export const Button = forwardRef( + (props, ref) => { + const { + isActive, + isLoading, + isDisabled, + spinnerPlacement = 'start', + spinner, + loadingText, + iconSpacing, + topIcon, + bottomIcon, + rightIcon, + leftIcon, + isFullWidth, + children, + ...ownProps + } = props; - const contentProps = { - rightIcon, - leftIcon, - bottomIcon, - topIcon, - iconSpacing, - children, - }; + const contentProps = { + rightIcon, + leftIcon, + bottomIcon, + topIcon, + iconSpacing, + children, + }; - return ( - - {isLoading && spinnerPlacement === 'start' && ( - - {spinner} - - )} + return ( + + {isLoading && spinnerPlacement === 'start' && ( + + {spinner} + + )} - {isLoading ? ( - loadingText || ( - - - - ) - ) : ( - - )} + {isLoading ? ( + loadingText || ( + + + + ) + ) : ( + + )} - {isLoading && spinnerPlacement === 'end' && ( - - {spinner} - - )} - - ); -}); + {isLoading && spinnerPlacement === 'end' && ( + + {spinner} + + )} + + ); + } +); diff --git a/ui/src/global.d.ts b/ui/src/global.d.ts deleted file mode 100644 index 593449a..0000000 --- a/ui/src/global.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ExternalProvider } from '@ethersproject/providers'; - -declare global { - interface Window { - ethereum: ExternalProvider; - } -} diff --git a/ui/src/hooks/index.ts b/ui/src/hooks/index.ts index 2a26346..4d095a7 100644 --- a/ui/src/hooks/index.ts +++ b/ui/src/hooks/index.ts @@ -1 +1 @@ -export * from './use-toast'; +export * from './use-transaction-cost'; diff --git a/ui/src/hooks/use-toast.ts b/ui/src/hooks/use-toast.ts deleted file mode 100644 index 1c69992..0000000 --- a/ui/src/hooks/use-toast.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { useToast as useToastChakra } from '@chakra-ui/react'; - -export const useToast = () => { - return useToastChakra({ - duration: 3000, - isClosable: true, - }); -}; diff --git a/ui/src/hooks/use-transaction-cost.ts b/ui/src/hooks/use-transaction-cost.ts new file mode 100644 index 0000000..e3e7477 --- /dev/null +++ b/ui/src/hooks/use-transaction-cost.ts @@ -0,0 +1,22 @@ +import { useFeeData, useNetwork } from 'wagmi'; +import { ethers } from 'ethers'; +import { useMemo } from 'react'; + +export const useTransactionCost = ( + value = ethers.BigNumber.from(0), + gasLimit = ethers.BigNumber.from(0) +): [ethers.BigNumber, string, boolean] => { + const { data: feeData } = useFeeData(); + const { chain } = useNetwork(); + + return useMemo(() => { + if (!feeData || !feeData.gasPrice || !chain) + return [ethers.BigNumber.from(0), '', true]; + + return [ + gasLimit.mul(feeData.gasPrice).add(value), + chain.nativeCurrency.symbol, + false, + ]; + }, [feeData, chain, value, gasLimit]); +}; diff --git a/ui/src/integrations/ethereum/contracts/FleekERC721.json b/ui/src/integrations/ethereum/contracts/FleekERC721.json index 49bd5d1..ca6a54c 100644 --- a/ui/src/integrations/ethereum/contracts/FleekERC721.json +++ b/ui/src/integrations/ethereum/contracts/FleekERC721.json @@ -1,22 +1,9 @@ { - "address": "0x645BD6fB363510e8D047566626ef4534d8dfEE21", + "timestamp": "2/15/2023, 12:43:39 PM", + "address": "0x11Cd77Eac1a0883DE9435B5586474903A2a084cD", + "transactionHash": "0x5166318336c9e0bef146562d58e01ddbb937a61b721aca6b24d41b0a189fde39", + "gasPrice": 1500000021, "abi": [ - { - "inputs": [ - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "string", - "name": "_symbol", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, { "anonymous": false, "inputs": [ @@ -67,6 +54,155 @@ "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": [ @@ -120,14 +256,52 @@ { "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": "token", + "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" @@ -148,11 +322,115 @@ { "indexed": true, "internalType": "uint256", - "name": "token", + "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" @@ -173,11 +451,11 @@ { "indexed": true, "internalType": "uint256", - "name": "token", + "name": "tokenId", "type": "uint256" }, { - "indexed": true, + "indexed": false, "internalType": "string", "name": "ENS", "type": "string" @@ -198,11 +476,11 @@ { "indexed": true, "internalType": "uint256", - "name": "token", + "name": "tokenId", "type": "uint256" }, { - "indexed": true, + "indexed": false, "internalType": "string", "name": "externalURL", "type": "string" @@ -223,13 +501,13 @@ { "indexed": true, "internalType": "uint256", - "name": "token", + "name": "tokenId", "type": "uint256" }, { - "indexed": true, + "indexed": false, "internalType": "string", - "name": "image", + "name": "logo", "type": "string" }, { @@ -239,7 +517,7 @@ "type": "address" } ], - "name": "NewTokenImage", + "name": "NewTokenLogo", "type": "event" }, { @@ -248,11 +526,11 @@ { "indexed": true, "internalType": "uint256", - "name": "token", + "name": "tokenId", "type": "uint256" }, { - "indexed": true, + "indexed": false, "internalType": "string", "name": "name", "type": "string" @@ -267,6 +545,31 @@ "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": [ @@ -354,6 +657,24 @@ "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": [ { @@ -404,6 +725,38 @@ "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": [ { @@ -560,6 +913,56 @@ "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": [ { @@ -601,11 +1004,6 @@ "name": "description", "type": "string" }, - { - "internalType": "string", - "name": "image", - "type": "string" - }, { "internalType": "string", "name": "externalURL", @@ -625,6 +1023,21 @@ "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", @@ -670,6 +1083,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "string", + "name": "apName", + "type": "string" + } + ], + "name": "removeAccessPoint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -762,6 +1188,83 @@ "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": [ { @@ -803,6 +1306,24 @@ "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": [ { @@ -866,11 +1387,34 @@ }, { "internalType": "string", - "name": "_tokenImage", + "name": "_tokenLogo", "type": "string" } ], - "name": "setTokenImage", + "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" @@ -968,253 +1512,153 @@ "type": "function" } ], - "transactionHash": "0xf0fd5f90e880efa81c1bd2e80c996e96860126503b4782f1c3a16ef58ab8a2fd", - "receipt": { - "to": null, - "from": "0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049", - "contractAddress": "0x645BD6fB363510e8D047566626ef4534d8dfEE21", - "transactionIndex": 1, - "gasUsed": "4978823", - "logsBloom": "0x00000000000000000000000000000000000000101000000000000000000000000000000000200000000000000000000000008000000000000000000000008000000000000000000000000000010000800000000000000000000100000000000000000000060000000000000000000800000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000080000000000000000000800000000000000000000004000000000000000000101000000000100000000000000000000100000000020008000000000000000000000000000000000000100000000000000000000100000", - "blockHash": "0x49c25d0255cbd39b52994adf9201eec62aeeda0b6a1a605e2ae793dffa0e7175", - "transactionHash": "0xf0fd5f90e880efa81c1bd2e80c996e96860126503b4782f1c3a16ef58ab8a2fd", - "logs": [ - { - "transactionIndex": 1, - "blockNumber": 29975815, - "transactionHash": "0xf0fd5f90e880efa81c1bd2e80c996e96860126503b4782f1c3a16ef58ab8a2fd", - "address": "0x645BD6fB363510e8D047566626ef4534d8dfEE21", - "topics": [ - "0xcf081ed2b728e3115904be00eb8927b2375ff3401839b37f7accfa1bb2bee15c", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000007ed735b7095c05d78df169f991f2b7f1a1f1a049" - ], - "data": "0x0000000000000000000000007ed735b7095c05d78df169f991f2b7f1a1f1a049", - "logIndex": 4, - "blockHash": "0x49c25d0255cbd39b52994adf9201eec62aeeda0b6a1a605e2ae793dffa0e7175" - }, - { - "transactionIndex": 1, - "blockNumber": 29975815, - "transactionHash": "0xf0fd5f90e880efa81c1bd2e80c996e96860126503b4782f1c3a16ef58ab8a2fd", - "address": "0x0000000000000000000000000000000000001010", - "topics": [ - "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", - "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x0000000000000000000000007ed735b7095c05d78df169f991f2b7f1a1f1a049", - "0x0000000000000000000000003a22c8bc68e98b0faf40f349dd2b2890fae01484" - ], - "data": "0x000000000000000000000000000000000000000000000000001a8851d878c9000000000000000000000000000000000000000000000000000286b97bf2638bb80000000000000000000000000000000000000000000001320df3c8e740942c46000000000000000000000000000000000000000000000000026c312a19eac2b80000000000000000000000000000000000000000000001320e0e5139190cf546", - "logIndex": 5, - "blockHash": "0x49c25d0255cbd39b52994adf9201eec62aeeda0b6a1a605e2ae793dffa0e7175" - } - ], - "blockNumber": 29975815, - "cumulativeGasUsed": "5140072", - "status": 1, - "byzantium": true - }, - "args": ["FleekSites", "FLKSITE"], - "numDeployments": 2, - "solcInputHash": "b88731ab6401d18abef5bd8425a23961", - "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\":\"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\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"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\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"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\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"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\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"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\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"image\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenImage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"token\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"triggeredBy\",\"type\":\"address\"}],\"name\":\"NewTokenName\",\"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\":\"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\":\"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\":\"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\":\"image\",\"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\"}],\"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\":\"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\":\"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\":\"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\":\"_tokenImage\",\"type\":\"string\"}],\"name\":\"setTokenImage\",\"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\":{\"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.\"},\"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.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"mint(address,string,string,string,string,string,string,string)\":{\"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}.\"},\"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}.\"},\"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.\"},\"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.\"},\"setTokenImage(uint256,string)\":{\"details\":\"Updates the `image` metadata field of a minted `tokenId`. May emit a {NewTokenImage} 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\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/ERC721.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 \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.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 ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings 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 constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).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 = ERC721.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 = ERC721.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 = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.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(ERC721.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(ERC721.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(ERC721.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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.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\",\"keccak256\":\"0xd89f3585b211fc9e3408384a4c4efdc3a93b2f877a3821046fa01c219d35be1b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.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/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\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\",\"keccak256\":\"0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.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 IERC721Receiver {\\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\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.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 \\\"../IERC721.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 IERC721Metadata is IERC721 {\\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\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.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 Address {\\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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(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\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x5f3461639fe20794cfb4db4a6d8477388a15b2e70a018043084b7c4bedfa8136\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\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 Context {\\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\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.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 ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.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 IERC165 {\\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\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@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 // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `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\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/FleekAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\n\\ncontract FleekAccessControl {\\n using Counters for Counters.Counter;\\n\\n enum Roles {\\n Owner,\\n Controller\\n }\\n\\n event TokenRoleGranted(uint256 indexed tokenId, Roles indexed role, address indexed toAddress, address byAddress);\\n event TokenRoleRevoked(uint256 indexed tokenId, Roles indexed role, address indexed toAddress, address byAddress);\\n event CollectionRoleGranted(Roles indexed role, address indexed toAddress, address byAddress);\\n event CollectionRoleRevoked(Roles indexed role, address indexed toAddress, address byAddress);\\n\\n struct Role {\\n mapping(address => uint256) indexes;\\n address[] members;\\n }\\n\\n Counters.Counter private _collectionRolesVersion;\\n // _collectionRoles[version][role]\\n mapping(uint256 => mapping(Roles => Role)) private _collectionRoles;\\n\\n mapping(uint256 => Counters.Counter) private _tokenRolesVersion;\\n // _tokenRoles[tokenId][version][role]\\n mapping(uint256 => mapping(uint256 => mapping(Roles => Role))) private _tokenRoles;\\n\\n constructor() {\\n _grantCollectionRole(Roles.Owner, msg.sender);\\n }\\n\\n modifier requireCollectionRole(Roles role) {\\n require(\\n hasCollectionRole(role, msg.sender) || hasCollectionRole(Roles.Owner, msg.sender),\\n \\\"FleekAccessControl: must have collection role\\\"\\n );\\n _;\\n }\\n\\n modifier requireTokenRole(uint256 tokenId, Roles role) {\\n require(\\n hasTokenRole(tokenId, role, msg.sender) || hasTokenRole(tokenId, Roles.Owner, msg.sender),\\n \\\"FleekAccessControl: must have token role\\\"\\n );\\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(Roles role, address account) public requireCollectionRole(Roles.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 Roles role,\\n address account\\n ) public requireTokenRole(tokenId, Roles.Owner) {\\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(Roles role, address account) public requireCollectionRole(Roles.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 Roles role,\\n address account\\n ) public requireTokenRole(tokenId, Roles.Owner) {\\n _revokeTokenRole(tokenId, role, account);\\n }\\n\\n /**\\n * @dev Returns `True` if a certain address has the collection role.\\n */\\n function hasCollectionRole(Roles role, address account) public view returns (bool) {\\n uint256 currentVersion = _collectionRolesVersion.current();\\n\\n return _collectionRoles[currentVersion][role].indexes[account] != 0;\\n }\\n\\n /**\\n * @dev Returns `True` if a certain address has the token role.\\n */\\n function hasTokenRole(uint256 tokenId, Roles role, address account) public view returns (bool) {\\n uint256 currentVersion = _tokenRolesVersion[tokenId].current();\\n return _tokenRoles[tokenId][currentVersion][role].indexes[account] != 0;\\n }\\n\\n /**\\n * @dev Returns an array of addresses that all have the collection role.\\n */\\n function getCollectionRoleMembers(Roles role) public view returns (address[] memory) {\\n uint256 currentVersion = _collectionRolesVersion.current();\\n return _collectionRoles[currentVersion][role].members;\\n }\\n\\n /**\\n * @dev Returns an array of addresses that all have the same token role for a certain tokenId.\\n */\\n function getTokenRoleMembers(uint256 tokenId, Roles role) public view returns (address[] memory) {\\n uint256 currentVersion = _tokenRolesVersion[tokenId].current();\\n return _tokenRoles[tokenId][currentVersion][role].members;\\n }\\n\\n /**\\n * @dev Grants the collection role to an address.\\n */\\n function _grantCollectionRole(Roles role, address account) internal {\\n uint256 currentVersion = _collectionRolesVersion.current();\\n _grantRole(_collectionRoles[currentVersion][role], account);\\n emit CollectionRoleGranted(role, account, msg.sender);\\n }\\n\\n /**\\n * @dev Revokes the collection role of an address.\\n */\\n function _revokeCollectionRole(Roles role, address account) internal {\\n uint256 currentVersion = _collectionRolesVersion.current();\\n _revokeRole(_collectionRoles[currentVersion][role], account);\\n emit CollectionRoleRevoked(role, account, msg.sender);\\n }\\n\\n /**\\n * @dev Grants the token role to an address.\\n */\\n function _grantTokenRole(uint256 tokenId, Roles role, address account) internal {\\n uint256 currentVersion = _tokenRolesVersion[tokenId].current();\\n _grantRole(_tokenRoles[tokenId][currentVersion][role], account);\\n emit TokenRoleGranted(tokenId, role, account, msg.sender);\\n }\\n\\n /**\\n * @dev Revokes the token role of an address.\\n */\\n function _revokeTokenRole(uint256 tokenId, Roles role, address account) internal {\\n uint256 currentVersion = _tokenRolesVersion[tokenId].current();\\n _revokeRole(_tokenRoles[tokenId][currentVersion][role], account);\\n emit TokenRoleRevoked(tokenId, role, account, msg.sender);\\n }\\n\\n /**\\n * @dev Grants a certain role to a certain address.\\n */\\n function _grantRole(Role storage role, address account) internal {\\n if (role.indexes[account] == 0) {\\n role.members.push(account);\\n role.indexes[account] = role.members.length;\\n }\\n }\\n\\n /**\\n * @dev Revokes a certain role from a certain address.\\n */\\n function _revokeRole(Role storage role, address account) internal {\\n if (role.indexes[account] != 0) {\\n uint256 index = role.indexes[account] - 1;\\n uint256 lastIndex = role.members.length - 1;\\n address lastAccount = role.members[lastIndex];\\n\\n role.members[index] = lastAccount;\\n role.indexes[lastAccount] = index + 1;\\n\\n role.members.pop();\\n delete role.indexes[account];\\n }\\n }\\n\\n /**\\n * @dev Clears all token roles for a certain tokenId.\\n * Should only be used for burning tokens.\\n */\\n function _clearAllTokenRoles(uint256 tokenId) internal {\\n _tokenRolesVersion[tokenId].increment();\\n }\\n\\n /**\\n * @dev Clears all token roles for a certain tokenId and grants the owner role to a new address.\\n * Should only be used for transferring tokens.\\n */\\n function _clearAllTokenRoles(uint256 tokenId, address newOwner) internal {\\n _clearAllTokenRoles(tokenId);\\n _grantTokenRole(tokenId, Roles.Owner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xfe5a878a86e13f126add51ad06700ec7f5e597c1add7b62e76b26f6f8b72ed24\",\"license\":\"MIT\"},\"contracts/FleekERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.7;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Base64.sol\\\";\\nimport \\\"./FleekAccessControl.sol\\\";\\n\\ncontract FleekERC721 is ERC721, FleekAccessControl {\\n using Strings for uint256;\\n using Counters for Counters.Counter;\\n\\n event NewBuild(uint256 indexed token, string indexed commitHash, address indexed triggeredBy);\\n event NewTokenName(uint256 indexed token, string indexed name, address indexed triggeredBy);\\n event NewTokenDescription(uint256 indexed token, string indexed description, address indexed triggeredBy);\\n event NewTokenImage(uint256 indexed token, string indexed image, address indexed triggeredBy);\\n event NewTokenExternalURL(uint256 indexed token, string indexed externalURL, address indexed triggeredBy);\\n event NewTokenENS(uint256 indexed token, string indexed ENS, address indexed triggeredBy);\\n\\n struct Build {\\n string commitHash;\\n string gitRepository;\\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 image; // Preview Image IPFS Link\\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 }\\n\\n Counters.Counter private _tokenIds;\\n mapping(uint256 => App) private _apps;\\n\\n constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}\\n\\n modifier requireTokenOwner(uint256 tokenId) {\\n require(msg.sender == ownerOf(tokenId), \\\"FleekERC721: must be token owner\\\");\\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 *\\n */\\n function mint(\\n address to,\\n string memory name,\\n string memory description,\\n string memory image,\\n string memory externalURL,\\n string memory ENS,\\n string memory commitHash,\\n string memory gitRepository\\n ) public payable requireCollectionRole(Roles.Owner) returns (uint256) {\\n uint256 tokenId = _tokenIds.current();\\n _mint(to, tokenId);\\n _tokenIds.increment();\\n\\n App storage app = _apps[tokenId];\\n app.name = name;\\n app.description = description;\\n app.image = image;\\n app.externalURL = externalURL;\\n app.ENS = ENS;\\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\\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 // prettier-ignore\\n bytes memory dataURI = abi.encodePacked(\\n '{',\\n '\\\"name\\\":\\\"', app.name, '\\\",',\\n '\\\"description\\\":\\\"', app.description, '\\\",',\\n '\\\"owner\\\":\\\"', Strings.toHexString(uint160(owner), 20), '\\\",',\\n '\\\"external_url\\\":\\\"', app.externalURL, '\\\",',\\n '\\\"image\\\":\\\"', app.image, '\\\",',\\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\\\":\\\"', Strings.toString(app.currentBuild),'\\\"}',\\n ']',\\n '}'\\n );\\n\\n return string(abi.encodePacked(_baseURI(), Base64.encode((dataURI))));\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) 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 * IMPORTANT: The function for clearing token controllers is not implemented yet.\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 tokenId,\\n uint256 batchSize\\n ) internal virtual override {\\n if (from != address(0) && to != address(0)) {\\n // Transfer\\n _clearAllTokenRoles(tokenId, to);\\n } else if (from == address(0)) {\\n // Mint\\n _grantTokenRole(tokenId, Roles.Owner, to);\\n } else if (to == address(0)) {\\n // Burn\\n _clearAllTokenRoles(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 `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, Roles.Controller) {\\n _requireMinted(tokenId);\\n _apps[tokenId].externalURL = _tokenExternalURL;\\n emit NewTokenExternalURL(tokenId, _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, Roles.Controller) {\\n _requireMinted(tokenId);\\n _apps[tokenId].ENS = _tokenENS;\\n emit NewTokenENS(tokenId, _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, Roles.Controller) {\\n _requireMinted(tokenId);\\n _apps[tokenId].name = _tokenName;\\n emit NewTokenName(tokenId, _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, Roles.Controller) {\\n _requireMinted(tokenId);\\n _apps[tokenId].description = _tokenDescription;\\n emit NewTokenDescription(tokenId, _tokenDescription, msg.sender);\\n }\\n\\n /**\\n * @dev Updates the `image` metadata field of a minted `tokenId`.\\n *\\n * May emit a {NewTokenImage} 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 setTokenImage(\\n uint256 tokenId,\\n string memory _tokenImage\\n ) public virtual requireTokenRole(tokenId, Roles.Controller) {\\n _requireMinted(tokenId);\\n _apps[tokenId].image = _tokenImage;\\n emit NewTokenImage(tokenId, _tokenImage, 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, Roles.Controller) {\\n _requireMinted(tokenId);\\n _apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(_commitHash, _gitRepository);\\n emit NewBuild(tokenId, _commitHash, 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 have the `tokenOwner` role.\\n *\\n */\\n function burn(uint256 tokenId) public virtual requireTokenRole(tokenId, Roles.Owner) {\\n super._burn(tokenId);\\n\\n if (bytes(_apps[tokenId].externalURL).length != 0) {\\n delete _apps[tokenId];\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7a13c1d1816e56a2aef81a4a5316f990e36a6886b11c09943501c75f4b3afa76\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b5060405162005d4738038062005d478339818101604052810190620000379190620003ab565b81818160009080519060200190620000519291906200027d565b5080600190805190602001906200006a9291906200027d565b505050620000806000336200008860201b60201c565b505062000645565b6000620000a160066200016d60201b62001b961760201c565b905062000102600760008381526020019081526020016000206000856001811115620000d257620000d162000593565b5b6001811115620000e757620000e662000593565b5b8152602001908152602001600020836200017b60201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff168360018111156200012f576200012e62000593565b5b7fcf081ed2b728e3115904be00eb8927b2375ff3401839b37f7accfa1bb2bee15c3360405162000160919062000441565b60405180910390a3505050565b600081600001549050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415620002795781600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600101805490508260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b8280546200028b9062000527565b90600052602060002090601f016020900481019282620002af5760008555620002fb565b82601f10620002ca57805160ff1916838001178555620002fb565b82800160010185558215620002fb579182015b82811115620002fa578251825591602001919060010190620002dd565b5b5090506200030a91906200030e565b5090565b5b80821115620003295760008160009055506001016200030f565b5090565b6000620003446200033e8462000487565b6200045e565b90508281526020810184848401111562000363576200036262000625565b5b62000370848285620004f1565b509392505050565b600082601f83011262000390576200038f62000620565b5b8151620003a28482602086016200032d565b91505092915050565b60008060408385031215620003c557620003c46200062f565b5b600083015167ffffffffffffffff811115620003e657620003e56200062a565b5b620003f48582860162000378565b925050602083015167ffffffffffffffff8111156200041857620004176200062a565b5b620004268582860162000378565b9150509250929050565b6200043b81620004bd565b82525050565b600060208201905062000458600083018462000430565b92915050565b60006200046a6200047d565b90506200047882826200055d565b919050565b6000604051905090565b600067ffffffffffffffff821115620004a557620004a4620005f1565b5b620004b08262000634565b9050602081019050919050565b6000620004ca82620004d1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b8381101562000511578082015181840152602081019050620004f4565b8381111562000521576000848401525b50505050565b600060028204905060018216806200054057607f821691505b60208210811415620005575762000556620005c2565b5b50919050565b620005688262000634565b810181811067ffffffffffffffff821117156200058a5762000589620005f1565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6156f280620006556000396000f3fe6080604052600436106101c25760003560e01c806364140ec0116100f7578063b42dbe3811610095578063cdb0e89e11610064578063cdb0e89e14610673578063e94472501461069c578063e985e9c5146106d9578063f931517714610716576101c2565b8063b42dbe38146105a0578063b543be12146105dd578063b88d4fde1461060d578063c87b56dd14610636576101c2565b80638c3c0a44116100d15780638c3c0a44146104fa57806395d89b4114610523578063a22cb4651461054e578063a27d0b2714610577576101c2565b806364140ec01461046b57806370a082311461049457806378278cca146104d1576101c2565b80632d957aad116101645780633806f1521161013e5780633806f152146103b357806342842e0e146103dc57806342966c68146104055780636352211e1461042e576101c2565b80632d957aad146103105780632f1e8f0a14610339578063353b07a414610376576101c2565b8063081812fc116101a0578063081812fc14610258578063095ea7b31461029557806323b872dd146102be578063246a908b146102e7576101c2565b806301468deb146101c757806301ffc9a7146101f057806306fdde031461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613ede565b61073f565b005b3480156101fc57600080fd5b5061021760048036038101906102129190613daa565b6107b1565b604051610224919061483b565b60405180910390f35b34801561023957600080fd5b506102426107c3565b60405161024f9190614856565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190613e71565b610855565b60405161028c91906147b2565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190613d6a565b61089b565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190613ada565b6109b3565b005b3480156102f357600080fd5b5061030e60048036038101906103099190613f31565b610a13565b005b34801561031c57600080fd5b5061033760048036038101906103329190613e31565b610b07565b005b34801561034557600080fd5b50610360600480360381019061035b9190613e9e565b610b73565b60405161036d9190614819565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613e04565b610c7e565b6040516103aa9190614819565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613f8d565b610d66565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613ada565b610ed1565b005b34801561041157600080fd5b5061042c60048036038101906104279190613e71565b610ef1565b005b34801561043a57600080fd5b5061045560048036038101906104509190613e71565b610ff8565b60405161046291906147b2565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613f31565b61107f565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613a6d565b611173565b6040516104c89190614a38565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613f31565b61122b565b005b34801561050657600080fd5b50610521600480360381019061051c9190613e31565b61131f565b005b34801561052f57600080fd5b5061053861138b565b6040516105459190614856565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190613bb0565b61141d565b005b34801561058357600080fd5b5061059e60048036038101906105999190613ede565b611433565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190613ede565b6114a5565b6040516105d4919061483b565b60405180910390f35b6105f760048036038101906105f29190613bf0565b61156d565b6040516106049190614a38565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613b2d565b611704565b005b34801561064257600080fd5b5061065d60048036038101906106589190613e71565b611766565b60405161066a9190614856565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190613f31565b611875565b005b3480156106a857600080fd5b506106c360048036038101906106be9190613e31565b611969565b6040516106d0919061483b565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190613a9a565b611a0e565b60405161070d919061483b565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190613f31565b611aa2565b005b82600061074d8282336114a5565b80610760575061075f826000336114a5565b5b61079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690614a18565b60405180910390fd5b6107aa858585611ba4565b5050505050565b60006107bc82611c8d565b9050919050565b6060600080546107d290614d60565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe90614d60565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b5050505050905090565b600061086082611d6f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a682610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906149d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610936611dba565b73ffffffffffffffffffffffffffffffffffffffff16148061096557506109648161095f611dba565b611a0e565b5b6109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b906149f8565b60405180910390fd5b6109ae8383611dc2565b505050565b6109c46109be611dba565b82611e7b565b610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90614898565b60405180910390fd5b610a0e838383611f10565b505050565b816001610a218282336114a5565b80610a345750610a33826000336114a5565b5b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90614a18565b60405180910390fd5b610a7c84611d6f565b82600b60008681526020019081526020016000206001019080519060200190610aa692919061382c565b503373ffffffffffffffffffffffffffffffffffffffff1683604051610acc9190614606565b6040518091039020857fd771eaa1c1382b0a9867125fcd921fdeddd211538b5381353a877abfbe3b50a460405160405180910390a450505050565b6000610b138133611969565b80610b255750610b24600033611969565b5b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90614918565b60405180910390fd5b610b6e838361220a565b505050565b60606000610b9260086000868152602001908152602001600020611b96565b90506009600085815260200190815260200160002060008281526020019081526020016000206000846001811115610bcd57610bcc614e6a565b5b6001811115610bdf57610bde614e6a565b5b8152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610c7057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c26575b505050505091505092915050565b60606000610c8c6006611b96565b9050600760008281526020019081526020016000206000846001811115610cb657610cb5614e6a565b5b6001811115610cc857610cc7614e6a565b5b8152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610d5957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d0f575b5050505050915050919050565b826001610d748282336114a5565b80610d875750610d86826000336114a5565b5b610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614a18565b60405180910390fd5b610dcf85611d6f565b604051806040016040528085815260200184815250600b60008781526020019081526020016000206006016000600b600089815260200190815260200160002060050160008154610e1f90614dc3565b91905081905581526020019081526020016000206000820151816000019080519060200190610e4f92919061382c565b506020820151816001019080519060200190610e6c92919061382c565b509050503373ffffffffffffffffffffffffffffffffffffffff1684604051610e959190614606565b6040518091039020867f73b929bf4db6be678cdbc6d41a5fe0a2cbb84ca95572062c4a978d8bd80a41b160405160405180910390a45050505050565b610eec83838360405180602001604052806000815250611704565b505050565b806000610eff8282336114a5565b80610f125750610f11826000336114a5565b5b610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614a18565b60405180910390fd5b610f5a836122cf565b6000600b60008581526020019081526020016000206003018054610f7d90614d60565b905014610ff357600b600084815260200190815260200160002060008082016000610fa891906138b2565b600182016000610fb891906138b2565b600282016000610fc891906138b2565b600382016000610fd891906138b2565b600482016000610fe891906138b2565b600582016000905550505b505050565b6000806110048361241d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d906149b8565b60405180910390fd5b80915050919050565b81600161108d8282336114a5565b806110a0575061109f826000336114a5565b5b6110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690614a18565b60405180910390fd5b6110e884611d6f565b82600b6000868152602001908152602001600020600201908051906020019061111292919061382c565b503373ffffffffffffffffffffffffffffffffffffffff16836040516111389190614606565b6040518091039020857f80f081796a13b5a4269815447e37462c5739a69ea7f1460301b595e0c4003d8360405160405180910390a450505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90614978565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160016112398282336114a5565b8061124c575061124b826000336114a5565b5b61128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614a18565b60405180910390fd5b61129484611d6f565b82600b600086815260200190815260200160002060040190805190602001906112be92919061382c565b503373ffffffffffffffffffffffffffffffffffffffff16836040516112e49190614606565b6040518091039020857f91ce7fcd4462481791c3fe849f7049373c5b43ef44aed48e7f1ecce781586e1560405160405180910390a450505050565b600061132b8133611969565b8061133d575061133c600033611969565b5b61137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390614918565b60405180910390fd5b611386838361245a565b505050565b60606001805461139a90614d60565b80601f01602080910402602001604051908101604052809291908181526020018280546113c690614d60565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b5050505050905090565b61142f611428611dba565b838361251f565b5050565b8260006114418282336114a5565b806114545750611453826000336114a5565b5b611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a90614a18565b60405180910390fd5b61149e85858561268c565b5050505050565b6000806114c360086000878152602001908152602001600020611b96565b905060006009600087815260200190815260200160002060008381526020019081526020016000206000866001811115611500576114ff614e6a565b5b600181111561151257611511614e6a565b5b815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414159150509392505050565b60008061157a8133611969565b8061158c575061158b600033611969565b5b6115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290614918565b60405180910390fd5b60006115d7600a611b96565b90506115e38b82612775565b6115ed600a612993565b6000600b600083815260200190815260200160002090508a81600001908051906020019061161c92919061382c565b508981600101908051906020019061163592919061382c565b508881600201908051906020019061164e92919061382c565b508781600301908051906020019061166792919061382c565b508681600401908051906020019061168092919061382c565b506000816005018190555060405180604001604052808781526020018681525081600601600080815260200190815260200160002060008201518160000190805190602001906116d192919061382c565b5060208201518160010190805190602001906116ee92919061382c565b5090505081935050505098975050505050505050565b61171561170f611dba565b83611e7b565b611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614898565b60405180910390fd5b611760848484846129a9565b50505050565b606061177182611d6f565b600061177c83610ff8565b90506000600b60008581526020019081526020016000209050600081600001826001016117c08573ffffffffffffffffffffffffffffffffffffffff166014612a05565b846003018560020186600401876006016000896005015481526020019081526020016000206000018860060160008a6005015481526020019081526020016000206001016118118a60050154612c41565b60405160200161182999989796959493929190614641565b6040516020818303038152906040529050611842612d19565b61184b82612d56565b60405160200161185c92919061461d565b6040516020818303038152906040529350505050919050565b8160016118838282336114a5565b806118965750611895826000336114a5565b5b6118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90614a18565b60405180910390fd5b6118de84611d6f565b82600b6000868152602001908152602001600020600001908051906020019061190892919061382c565b503373ffffffffffffffffffffffffffffffffffffffff168360405161192e9190614606565b6040518091039020857ffbbfca16a2770c7ca6e7063ab1a7eea5fe441ffef818325db51752066a6b128a60405160405180910390a450505050565b6000806119766006611b96565b905060006007600083815260200190815260200160002060008660018111156119a2576119a1614e6a565b5b60018111156119b4576119b3614e6a565b5b815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141591505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816001611ab08282336114a5565b80611ac35750611ac2826000336114a5565b5b611b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af990614a18565b60405180910390fd5b611b0b84611d6f565b82600b60008681526020019081526020016000206003019080519060200190611b3592919061382c565b503373ffffffffffffffffffffffffffffffffffffffff1683604051611b5b9190614606565b6040518091039020857fedbf1209b3baa7c1b5c43052ce5c511e243b3241d9f67733141d14f1da88cba160405160405180910390a450505050565b600081600001549050919050565b6000611bc160086000868152602001908152602001600020611b96565b9050611c256009600086815260200190815260200160002060008381526020019081526020016000206000856001811115611bff57611bfe614e6a565b5b6001811115611c1157611c10614e6a565b5b815260200190815260200160002083612eba565b8173ffffffffffffffffffffffffffffffffffffffff16836001811115611c4f57611c4e614e6a565b5b857fe52d746e4c78c98c6bfa291b273406905c3e8550b7d911a6bea686368c2dc79d33604051611c7f91906147b2565b60405180910390a450505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d685750611d67826130f9565b5b9050919050565b611d7881613163565b611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906149b8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e3583610ff8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e8783610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ec95750611ec88185611a0e565b5b80611f0757508373ffffffffffffffffffffffffffffffffffffffff16611eef84610855565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3082610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d906148d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614938565b60405180910390fd5b61200383838360016131a4565b8273ffffffffffffffffffffffffffffffffffffffff1661202382610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614612079576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612070906148d8565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461220583838360016132bb565b505050565b60006122166006611b96565b905061226960076000838152602001908152602001600020600085600181111561224357612242614e6a565b5b600181111561225557612254614e6a565b5b8152602001908152602001600020836132c1565b8173ffffffffffffffffffffffffffffffffffffffff1683600181111561229357612292614e6a565b5b7fcf081ed2b728e3115904be00eb8927b2375ff3401839b37f7accfa1bb2bee15c336040516122c291906147b2565b60405180910390a3505050565b60006122da82610ff8565b90506122ea8160008460016131a4565b6122f382610ff8565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124198160008460016132bb565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006124666006611b96565b90506124b960076000838152602001908152602001600020600085600181111561249357612492614e6a565b5b60018111156124a5576124a4614e6a565b5b815260200190815260200160002083612eba565b8173ffffffffffffffffffffffffffffffffffffffff168360018111156124e3576124e2614e6a565b5b7faeff57f0f5e4d3d10a37d4a70fde8ed67a95e67b251d5c512c0ea98c380d2f953360405161251291906147b2565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590614958565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161267f919061483b565b60405180910390a3505050565b60006126a960086000868152602001908152602001600020611b96565b905061270d60096000868152602001908152602001600020600083815260200190815260200160002060008560018111156126e7576126e6614e6a565b5b60018111156126f9576126f8614e6a565b5b8152602001908152602001600020836132c1565b8173ffffffffffffffffffffffffffffffffffffffff1683600181111561273757612736614e6a565b5b857f0bf5a13b362503fcc74b8b9b1598aba2f3a9af85d05ba7978f7e9f447f22c2393360405161276791906147b2565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90614998565b60405180910390fd5b6127ee81613163565b1561282e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612825906148f8565b60405180910390fd5b61283c6000838360016131a4565b61284581613163565b15612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287c906148f8565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461298f6000838360016132bb565b5050565b6001816000016000828254019250508190555050565b6129b4848484611f10565b6129c0848484846133c2565b6129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f6906148b8565b60405180910390fd5b50505050565b606060006002836002612a189190614bf2565b612a229190614b6b565b67ffffffffffffffff811115612a3b57612a3a614f26565b5b6040519080825280601f01601f191660200182016040528015612a6d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612aa557612aa4614ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b0957612b08614ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b499190614bf2565b612b539190614b6b565b90505b6001811115612bf3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b9557612b94614ef7565b5b1a60f81b828281518110612bac57612bab614ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612bec90614d36565b9050612b56565b5060008414612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90614878565b60405180910390fd5b8091505092915050565b606060006001612c5084613559565b01905060008167ffffffffffffffff811115612c6f57612c6e614f26565b5b6040519080825280601f01601f191660200182016040528015612ca15781602001600182028036833780820191505090505b509050600082602001820190505b600115612d0e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612cf857612cf7614e3b565b5b0494506000851415612d0957612d0e565b612caf565b819350505050919050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b6060600082511415612d7957604051806020016040528060008152509050612eb5565b600060405180606001604052806040815260200161567d6040913990506000600360028551612da89190614b6b565b612db29190614bc1565b6004612dbe9190614bf2565b67ffffffffffffffff811115612dd757612dd6614f26565b5b6040519080825280601f01601f191660200182016040528015612e095781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612e75576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612e1a565b5050600386510660018114612e915760028114612ea457612eac565b603d6001830353603d6002830353612eac565b603d60018303535b50505080925050505b919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146130f557600060018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f539190614c4c565b9050600060018460010180549050612f6b9190614c4c565b90506000846001018281548110612f8557612f84614ef7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080856001018481548110612fc957612fc8614ef7565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018361301e9190614b6b565b8560000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460010180548061307757613076614ec8565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050505b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166131858361241d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561320e5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156132225761321d82846136ac565b6132a9565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613268576132638260008561268c565b6132a8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132a7576132a6826136c5565b5b5b5b6132b5848484846136e3565b50505050565b50505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156133be5781600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600101805490508260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60006133e38473ffffffffffffffffffffffffffffffffffffffff16613809565b1561354c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340c611dba565b8786866040518563ffffffff1660e01b815260040161342e94939291906147cd565b602060405180830381600087803b15801561344857600080fd5b505af192505050801561347957506040513d601f19601f820116820180604052508101906134769190613dd7565b60015b6134fc573d80600081146134a9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ae565b606091505b506000815114156134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134eb906148b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613551565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106135b7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816135ad576135ac614e3b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106135f4576d04ee2d6d415b85acef810000000083816135ea576135e9614e3b565b5b0492506020810190505b662386f26fc10000831061362357662386f26fc10000838161361957613618614e3b565b5b0492506010810190505b6305f5e100831061364c576305f5e100838161364257613641614e3b565b5b0492506008810190505b612710831061367157612710838161366757613666614e3b565b5b0492506004810190505b60648310613694576064838161368a57613689614e3b565b5b0492506002810190505b600a83106136a3576001810190505b80915050919050565b6136b5826136c5565b6136c18260008361268c565b5050565b6136e060086000838152602001908152602001600020612993565b50565b600181111561380357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146137775780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461376f9190614c4c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138025780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137fa9190614b6b565b925050819055505b5b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461383890614d60565b90600052602060002090601f01602090048101928261385a57600085556138a1565b82601f1061387357805160ff19168380011785556138a1565b828001600101855582156138a1579182015b828111156138a0578251825591602001919060010190613885565b5b5090506138ae91906138f2565b5090565b5080546138be90614d60565b6000825580601f106138d057506138ef565b601f0160209004906000526020600020908101906138ee91906138f2565b5b50565b5b8082111561390b5760008160009055506001016138f3565b5090565b600061392261391d84614a78565b614a53565b90508281526020810184848401111561393e5761393d614f5a565b5b613949848285614cf4565b509392505050565b600061396461395f84614aa9565b614a53565b9050828152602081018484840111156139805761397f614f5a565b5b61398b848285614cf4565b509392505050565b6000813590506139a281615610565b92915050565b6000813590506139b781615627565b92915050565b6000813590506139cc8161563e565b92915050565b6000815190506139e18161563e565b92915050565b600082601f8301126139fc576139fb614f55565b5b8135613a0c84826020860161390f565b91505092915050565b600081359050613a2481615655565b92915050565b600082601f830112613a3f57613a3e614f55565b5b8135613a4f848260208601613951565b91505092915050565b600081359050613a6781615665565b92915050565b600060208284031215613a8357613a82614f64565b5b6000613a9184828501613993565b91505092915050565b60008060408385031215613ab157613ab0614f64565b5b6000613abf85828601613993565b9250506020613ad085828601613993565b9150509250929050565b600080600060608486031215613af357613af2614f64565b5b6000613b0186828701613993565b9350506020613b1286828701613993565b9250506040613b2386828701613a58565b9150509250925092565b60008060008060808587031215613b4757613b46614f64565b5b6000613b5587828801613993565b9450506020613b6687828801613993565b9350506040613b7787828801613a58565b925050606085013567ffffffffffffffff811115613b9857613b97614f5f565b5b613ba4878288016139e7565b91505092959194509250565b60008060408385031215613bc757613bc6614f64565b5b6000613bd585828601613993565b9250506020613be6858286016139a8565b9150509250929050565b600080600080600080600080610100898b031215613c1157613c10614f64565b5b6000613c1f8b828c01613993565b985050602089013567ffffffffffffffff811115613c4057613c3f614f5f565b5b613c4c8b828c01613a2a565b975050604089013567ffffffffffffffff811115613c6d57613c6c614f5f565b5b613c798b828c01613a2a565b965050606089013567ffffffffffffffff811115613c9a57613c99614f5f565b5b613ca68b828c01613a2a565b955050608089013567ffffffffffffffff811115613cc757613cc6614f5f565b5b613cd38b828c01613a2a565b94505060a089013567ffffffffffffffff811115613cf457613cf3614f5f565b5b613d008b828c01613a2a565b93505060c089013567ffffffffffffffff811115613d2157613d20614f5f565b5b613d2d8b828c01613a2a565b92505060e089013567ffffffffffffffff811115613d4e57613d4d614f5f565b5b613d5a8b828c01613a2a565b9150509295985092959890939650565b60008060408385031215613d8157613d80614f64565b5b6000613d8f85828601613993565b9250506020613da085828601613a58565b9150509250929050565b600060208284031215613dc057613dbf614f64565b5b6000613dce848285016139bd565b91505092915050565b600060208284031215613ded57613dec614f64565b5b6000613dfb848285016139d2565b91505092915050565b600060208284031215613e1a57613e19614f64565b5b6000613e2884828501613a15565b91505092915050565b60008060408385031215613e4857613e47614f64565b5b6000613e5685828601613a15565b9250506020613e6785828601613993565b9150509250929050565b600060208284031215613e8757613e86614f64565b5b6000613e9584828501613a58565b91505092915050565b60008060408385031215613eb557613eb4614f64565b5b6000613ec385828601613a58565b9250506020613ed485828601613a15565b9150509250929050565b600080600060608486031215613ef757613ef6614f64565b5b6000613f0586828701613a58565b9350506020613f1686828701613a15565b9250506040613f2786828701613993565b9150509250925092565b60008060408385031215613f4857613f47614f64565b5b6000613f5685828601613a58565b925050602083013567ffffffffffffffff811115613f7757613f76614f5f565b5b613f8385828601613a2a565b9150509250929050565b600080600060608486031215613fa657613fa5614f64565b5b6000613fb486828701613a58565b935050602084013567ffffffffffffffff811115613fd557613fd4614f5f565b5b613fe186828701613a2a565b925050604084013567ffffffffffffffff81111561400257614001614f5f565b5b61400e86828701613a2a565b9150509250925092565b60006140248383614030565b60208301905092915050565b61403981614c80565b82525050565b61404881614c80565b82525050565b600061405982614aff565b6140638185614b2d565b935061406e83614ada565b8060005b8381101561409f5781516140868882614018565b975061409183614b20565b925050600181019050614072565b5085935050505092915050565b6140b581614c92565b82525050565b60006140c682614b0a565b6140d08185614b3e565b93506140e0818560208601614d03565b6140e981614f69565b840191505092915050565b60006140ff82614b15565b6141098185614b4f565b9350614119818560208601614d03565b61412281614f69565b840191505092915050565b600061413882614b15565b6141428185614b60565b9350614152818560208601614d03565b80840191505092915050565b6000815461416b81614d60565b6141758186614b60565b9450600182166000811461419057600181146141a1576141d4565b60ff198316865281860193506141d4565b6141aa85614aea565b60005b838110156141cc578154818901526001820191506020810190506141ad565b838801955050505b50505092915050565b60006141ea602083614b4f565b91506141f582614f7a565b602082019050919050565b600061420d602d83614b4f565b915061421882614fa3565b604082019050919050565b6000614230601083614b60565b915061423b82614ff2565b601082019050919050565b6000614253603283614b4f565b915061425e8261501b565b604082019050919050565b6000614276600f83614b60565b91506142818261506a565b600f82019050919050565b6000614299600283614b60565b91506142a482615093565b600282019050919050565b60006142bc602583614b4f565b91506142c7826150bc565b604082019050919050565b60006142df602383614b60565b91506142ea8261510b565b602382019050919050565b6000614302601c83614b4f565b915061430d8261515a565b602082019050919050565b6000614325600383614b60565b915061433082615183565b600382019050919050565b6000614348602d83614b4f565b9150614353826151ac565b604082019050919050565b600061436b602483614b4f565b9150614376826151fb565b604082019050919050565b600061438e601983614b4f565b91506143998261524a565b602082019050919050565b60006143b1602683614b60565b91506143bc82615273565b602682019050919050565b60006143d4600883614b60565b91506143df826152c2565b600882019050919050565b60006143f7602983614b4f565b9150614402826152eb565b604082019050919050565b600061441a600983614b60565b91506144258261533a565b600982019050919050565b600061443d600283614b60565b915061444882615363565b600282019050919050565b6000614460602083614b4f565b915061446b8261538c565b602082019050919050565b6000614483600183614b60565b915061448e826153b5565b600182019050919050565b60006144a6600183614b60565b91506144b1826153de565b600182019050919050565b60006144c9600f83614b60565b91506144d482615407565b600f82019050919050565b60006144ec600983614b60565b91506144f782615430565b600982019050919050565b600061450f601883614b4f565b915061451a82615459565b602082019050919050565b6000614532601f83614b60565b915061453d82615482565b601f82019050919050565b6000614555600183614b60565b9150614560826154ab565b600182019050919050565b6000614578602183614b4f565b9150614583826154d4565b604082019050919050565b600061459b602783614b60565b91506145a682615523565b602782019050919050565b60006145be603d83614b4f565b91506145c982615572565b604082019050919050565b60006145e1602883614b4f565b91506145ec826155c1565b604082019050919050565b61460081614cea565b82525050565b6000614612828461412d565b915081905092915050565b6000614629828561412d565b9150614635828461412d565b91508190509392505050565b600061464c82614499565b9150614657826143c7565b9150614663828c61415e565b915061466e8261428c565b915061467982614269565b9150614685828b61415e565b91506146908261428c565b915061469b826144df565b91506146a7828a61412d565b91506146b28261428c565b91506146bd82614223565b91506146c9828961415e565b91506146d48261428c565b91506146df8261440d565b91506146eb828861415e565b91506146f68261428c565b9150614701826144bc565b915061470c82614525565b9150614718828761415e565b915061472382614318565b915061472e8261458e565b915061473a828661415e565b915061474582614318565b9150614750826143a4565b915061475c828561415e565b915061476782614318565b9150614772826142d2565b915061477e828461412d565b915061478982614430565b915061479482614548565b915061479f82614476565b91508190509a9950505050505050505050565b60006020820190506147c7600083018461403f565b92915050565b60006080820190506147e2600083018761403f565b6147ef602083018661403f565b6147fc60408301856145f7565b818103606083015261480e81846140bb565b905095945050505050565b60006020820190508181036000830152614833818461404e565b905092915050565b600060208201905061485060008301846140ac565b92915050565b6000602082019050818103600083015261487081846140f4565b905092915050565b60006020820190508181036000830152614891816141dd565b9050919050565b600060208201905081810360008301526148b181614200565b9050919050565b600060208201905081810360008301526148d181614246565b9050919050565b600060208201905081810360008301526148f1816142af565b9050919050565b60006020820190508181036000830152614911816142f5565b9050919050565b600060208201905081810360008301526149318161433b565b9050919050565b600060208201905081810360008301526149518161435e565b9050919050565b6000602082019050818103600083015261497181614381565b9050919050565b60006020820190508181036000830152614991816143ea565b9050919050565b600060208201905081810360008301526149b181614453565b9050919050565b600060208201905081810360008301526149d181614502565b9050919050565b600060208201905081810360008301526149f18161456b565b9050919050565b60006020820190508181036000830152614a11816145b1565b9050919050565b60006020820190508181036000830152614a31816145d4565b9050919050565b6000602082019050614a4d60008301846145f7565b92915050565b6000614a5d614a6e565b9050614a698282614d92565b919050565b6000604051905090565b600067ffffffffffffffff821115614a9357614a92614f26565b5b614a9c82614f69565b9050602081019050919050565b600067ffffffffffffffff821115614ac457614ac3614f26565b5b614acd82614f69565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7682614cea565b9150614b8183614cea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb657614bb5614e0c565b5b828201905092915050565b6000614bcc82614cea565b9150614bd783614cea565b925082614be757614be6614e3b565b5b828204905092915050565b6000614bfd82614cea565b9150614c0883614cea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4157614c40614e0c565b5b828202905092915050565b6000614c5782614cea565b9150614c6283614cea565b925082821015614c7557614c74614e0c565b5b828203905092915050565b6000614c8b82614cca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d21578082015181840152602081019050614d06565b83811115614d30576000848401525b50505050565b6000614d4182614cea565b91506000821415614d5557614d54614e0c565b5b600182039050919050565b60006002820490506001821680614d7857607f821691505b60208210811415614d8c57614d8b614e99565b5b50919050565b614d9b82614f69565b810181811067ffffffffffffffff82111715614dba57614db9614f26565b5b80604052505050565b6000614dce82614cea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e0157614e00614e0c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f2265787465726e616c5f75726c223a2200000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a202256657273696f6e222c202276616c756560008201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60008201527f6c6c656374696f6e20726f6c6500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b2274726169745f74797065223a20225265706f7369746f7279222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b7f226f776e6572223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f7b2274726169745f74797065223a2022454e53222c202276616c7565223a2200600082015250565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f60008201527f6b656e20726f6c65000000000000000000000000000000000000000000000000602082015250565b61561981614c80565b811461562457600080fd5b50565b61563081614c92565b811461563b57600080fd5b50565b61564781614c9e565b811461565257600080fd5b50565b6002811061566257600080fd5b50565b61566e81614cea565b811461567957600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202ad793148892cb17843bc8ddfc8da3cf80fb0141adeabdb33bfc6d87fe628c9b64736f6c63430008070033", - "deployedBytecode": "0x6080604052600436106101c25760003560e01c806364140ec0116100f7578063b42dbe3811610095578063cdb0e89e11610064578063cdb0e89e14610673578063e94472501461069c578063e985e9c5146106d9578063f931517714610716576101c2565b8063b42dbe38146105a0578063b543be12146105dd578063b88d4fde1461060d578063c87b56dd14610636576101c2565b80638c3c0a44116100d15780638c3c0a44146104fa57806395d89b4114610523578063a22cb4651461054e578063a27d0b2714610577576101c2565b806364140ec01461046b57806370a082311461049457806378278cca146104d1576101c2565b80632d957aad116101645780633806f1521161013e5780633806f152146103b357806342842e0e146103dc57806342966c68146104055780636352211e1461042e576101c2565b80632d957aad146103105780632f1e8f0a14610339578063353b07a414610376576101c2565b8063081812fc116101a0578063081812fc14610258578063095ea7b31461029557806323b872dd146102be578063246a908b146102e7576101c2565b806301468deb146101c757806301ffc9a7146101f057806306fdde031461022d575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613ede565b61073f565b005b3480156101fc57600080fd5b5061021760048036038101906102129190613daa565b6107b1565b604051610224919061483b565b60405180910390f35b34801561023957600080fd5b506102426107c3565b60405161024f9190614856565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a9190613e71565b610855565b60405161028c91906147b2565b60405180910390f35b3480156102a157600080fd5b506102bc60048036038101906102b79190613d6a565b61089b565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190613ada565b6109b3565b005b3480156102f357600080fd5b5061030e60048036038101906103099190613f31565b610a13565b005b34801561031c57600080fd5b5061033760048036038101906103329190613e31565b610b07565b005b34801561034557600080fd5b50610360600480360381019061035b9190613e9e565b610b73565b60405161036d9190614819565b60405180910390f35b34801561038257600080fd5b5061039d60048036038101906103989190613e04565b610c7e565b6040516103aa9190614819565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613f8d565b610d66565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190613ada565b610ed1565b005b34801561041157600080fd5b5061042c60048036038101906104279190613e71565b610ef1565b005b34801561043a57600080fd5b5061045560048036038101906104509190613e71565b610ff8565b60405161046291906147b2565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190613f31565b61107f565b005b3480156104a057600080fd5b506104bb60048036038101906104b69190613a6d565b611173565b6040516104c89190614a38565b60405180910390f35b3480156104dd57600080fd5b506104f860048036038101906104f39190613f31565b61122b565b005b34801561050657600080fd5b50610521600480360381019061051c9190613e31565b61131f565b005b34801561052f57600080fd5b5061053861138b565b6040516105459190614856565b60405180910390f35b34801561055a57600080fd5b5061057560048036038101906105709190613bb0565b61141d565b005b34801561058357600080fd5b5061059e60048036038101906105999190613ede565b611433565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190613ede565b6114a5565b6040516105d4919061483b565b60405180910390f35b6105f760048036038101906105f29190613bf0565b61156d565b6040516106049190614a38565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190613b2d565b611704565b005b34801561064257600080fd5b5061065d60048036038101906106589190613e71565b611766565b60405161066a9190614856565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190613f31565b611875565b005b3480156106a857600080fd5b506106c360048036038101906106be9190613e31565b611969565b6040516106d0919061483b565b60405180910390f35b3480156106e557600080fd5b5061070060048036038101906106fb9190613a9a565b611a0e565b60405161070d919061483b565b60405180910390f35b34801561072257600080fd5b5061073d60048036038101906107389190613f31565b611aa2565b005b82600061074d8282336114a5565b80610760575061075f826000336114a5565b5b61079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690614a18565b60405180910390fd5b6107aa858585611ba4565b5050505050565b60006107bc82611c8d565b9050919050565b6060600080546107d290614d60565b80601f01602080910402602001604051908101604052809291908181526020018280546107fe90614d60565b801561084b5780601f106108205761010080835404028352916020019161084b565b820191906000526020600020905b81548152906001019060200180831161082e57829003601f168201915b5050505050905090565b600061086082611d6f565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a682610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906149d8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610936611dba565b73ffffffffffffffffffffffffffffffffffffffff16148061096557506109648161095f611dba565b611a0e565b5b6109a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099b906149f8565b60405180910390fd5b6109ae8383611dc2565b505050565b6109c46109be611dba565b82611e7b565b610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90614898565b60405180910390fd5b610a0e838383611f10565b505050565b816001610a218282336114a5565b80610a345750610a33826000336114a5565b5b610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90614a18565b60405180910390fd5b610a7c84611d6f565b82600b60008681526020019081526020016000206001019080519060200190610aa692919061382c565b503373ffffffffffffffffffffffffffffffffffffffff1683604051610acc9190614606565b6040518091039020857fd771eaa1c1382b0a9867125fcd921fdeddd211538b5381353a877abfbe3b50a460405160405180910390a450505050565b6000610b138133611969565b80610b255750610b24600033611969565b5b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90614918565b60405180910390fd5b610b6e838361220a565b505050565b60606000610b9260086000868152602001908152602001600020611b96565b90506009600085815260200190815260200160002060008281526020019081526020016000206000846001811115610bcd57610bcc614e6a565b5b6001811115610bdf57610bde614e6a565b5b8152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610c7057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c26575b505050505091505092915050565b60606000610c8c6006611b96565b9050600760008281526020019081526020016000206000846001811115610cb657610cb5614e6a565b5b6001811115610cc857610cc7614e6a565b5b8152602001908152602001600020600101805480602002602001604051908101604052809291908181526020018280548015610d5957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d0f575b5050505050915050919050565b826001610d748282336114a5565b80610d875750610d86826000336114a5565b5b610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd90614a18565b60405180910390fd5b610dcf85611d6f565b604051806040016040528085815260200184815250600b60008781526020019081526020016000206006016000600b600089815260200190815260200160002060050160008154610e1f90614dc3565b91905081905581526020019081526020016000206000820151816000019080519060200190610e4f92919061382c565b506020820151816001019080519060200190610e6c92919061382c565b509050503373ffffffffffffffffffffffffffffffffffffffff1684604051610e959190614606565b6040518091039020867f73b929bf4db6be678cdbc6d41a5fe0a2cbb84ca95572062c4a978d8bd80a41b160405160405180910390a45050505050565b610eec83838360405180602001604052806000815250611704565b505050565b806000610eff8282336114a5565b80610f125750610f11826000336114a5565b5b610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614a18565b60405180910390fd5b610f5a836122cf565b6000600b60008581526020019081526020016000206003018054610f7d90614d60565b905014610ff357600b600084815260200190815260200160002060008082016000610fa891906138b2565b600182016000610fb891906138b2565b600282016000610fc891906138b2565b600382016000610fd891906138b2565b600482016000610fe891906138b2565b600582016000905550505b505050565b6000806110048361241d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d906149b8565b60405180910390fd5b80915050919050565b81600161108d8282336114a5565b806110a0575061109f826000336114a5565b5b6110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690614a18565b60405180910390fd5b6110e884611d6f565b82600b6000868152602001908152602001600020600201908051906020019061111292919061382c565b503373ffffffffffffffffffffffffffffffffffffffff16836040516111389190614606565b6040518091039020857f80f081796a13b5a4269815447e37462c5739a69ea7f1460301b595e0c4003d8360405160405180910390a450505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90614978565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160016112398282336114a5565b8061124c575061124b826000336114a5565b5b61128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290614a18565b60405180910390fd5b61129484611d6f565b82600b600086815260200190815260200160002060040190805190602001906112be92919061382c565b503373ffffffffffffffffffffffffffffffffffffffff16836040516112e49190614606565b6040518091039020857f91ce7fcd4462481791c3fe849f7049373c5b43ef44aed48e7f1ecce781586e1560405160405180910390a450505050565b600061132b8133611969565b8061133d575061133c600033611969565b5b61137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390614918565b60405180910390fd5b611386838361245a565b505050565b60606001805461139a90614d60565b80601f01602080910402602001604051908101604052809291908181526020018280546113c690614d60565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b5050505050905090565b61142f611428611dba565b838361251f565b5050565b8260006114418282336114a5565b806114545750611453826000336114a5565b5b611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a90614a18565b60405180910390fd5b61149e85858561268c565b5050505050565b6000806114c360086000878152602001908152602001600020611b96565b905060006009600087815260200190815260200160002060008381526020019081526020016000206000866001811115611500576114ff614e6a565b5b600181111561151257611511614e6a565b5b815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414159150509392505050565b60008061157a8133611969565b8061158c575061158b600033611969565b5b6115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290614918565b60405180910390fd5b60006115d7600a611b96565b90506115e38b82612775565b6115ed600a612993565b6000600b600083815260200190815260200160002090508a81600001908051906020019061161c92919061382c565b508981600101908051906020019061163592919061382c565b508881600201908051906020019061164e92919061382c565b508781600301908051906020019061166792919061382c565b508681600401908051906020019061168092919061382c565b506000816005018190555060405180604001604052808781526020018681525081600601600080815260200190815260200160002060008201518160000190805190602001906116d192919061382c565b5060208201518160010190805190602001906116ee92919061382c565b5090505081935050505098975050505050505050565b61171561170f611dba565b83611e7b565b611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90614898565b60405180910390fd5b611760848484846129a9565b50505050565b606061177182611d6f565b600061177c83610ff8565b90506000600b60008581526020019081526020016000209050600081600001826001016117c08573ffffffffffffffffffffffffffffffffffffffff166014612a05565b846003018560020186600401876006016000896005015481526020019081526020016000206000018860060160008a6005015481526020019081526020016000206001016118118a60050154612c41565b60405160200161182999989796959493929190614641565b6040516020818303038152906040529050611842612d19565b61184b82612d56565b60405160200161185c92919061461d565b6040516020818303038152906040529350505050919050565b8160016118838282336114a5565b806118965750611895826000336114a5565b5b6118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90614a18565b60405180910390fd5b6118de84611d6f565b82600b6000868152602001908152602001600020600001908051906020019061190892919061382c565b503373ffffffffffffffffffffffffffffffffffffffff168360405161192e9190614606565b6040518091039020857ffbbfca16a2770c7ca6e7063ab1a7eea5fe441ffef818325db51752066a6b128a60405160405180910390a450505050565b6000806119766006611b96565b905060006007600083815260200190815260200160002060008660018111156119a2576119a1614e6a565b5b60018111156119b4576119b3614e6a565b5b815260200190815260200160002060000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141591505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816001611ab08282336114a5565b80611ac35750611ac2826000336114a5565b5b611b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af990614a18565b60405180910390fd5b611b0b84611d6f565b82600b60008681526020019081526020016000206003019080519060200190611b3592919061382c565b503373ffffffffffffffffffffffffffffffffffffffff1683604051611b5b9190614606565b6040518091039020857fedbf1209b3baa7c1b5c43052ce5c511e243b3241d9f67733141d14f1da88cba160405160405180910390a450505050565b600081600001549050919050565b6000611bc160086000868152602001908152602001600020611b96565b9050611c256009600086815260200190815260200160002060008381526020019081526020016000206000856001811115611bff57611bfe614e6a565b5b6001811115611c1157611c10614e6a565b5b815260200190815260200160002083612eba565b8173ffffffffffffffffffffffffffffffffffffffff16836001811115611c4f57611c4e614e6a565b5b857fe52d746e4c78c98c6bfa291b273406905c3e8550b7d911a6bea686368c2dc79d33604051611c7f91906147b2565b60405180910390a450505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d5857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d685750611d67826130f9565b5b9050919050565b611d7881613163565b611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906149b8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e3583610ff8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e8783610ff8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ec95750611ec88185611a0e565b5b80611f0757508373ffffffffffffffffffffffffffffffffffffffff16611eef84610855565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3082610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d906148d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614938565b60405180910390fd5b61200383838360016131a4565b8273ffffffffffffffffffffffffffffffffffffffff1661202382610ff8565b73ffffffffffffffffffffffffffffffffffffffff1614612079576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612070906148d8565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461220583838360016132bb565b505050565b60006122166006611b96565b905061226960076000838152602001908152602001600020600085600181111561224357612242614e6a565b5b600181111561225557612254614e6a565b5b8152602001908152602001600020836132c1565b8173ffffffffffffffffffffffffffffffffffffffff1683600181111561229357612292614e6a565b5b7fcf081ed2b728e3115904be00eb8927b2375ff3401839b37f7accfa1bb2bee15c336040516122c291906147b2565b60405180910390a3505050565b60006122da82610ff8565b90506122ea8160008460016131a4565b6122f382610ff8565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124198160008460016132bb565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006124666006611b96565b90506124b960076000838152602001908152602001600020600085600181111561249357612492614e6a565b5b60018111156124a5576124a4614e6a565b5b815260200190815260200160002083612eba565b8173ffffffffffffffffffffffffffffffffffffffff168360018111156124e3576124e2614e6a565b5b7faeff57f0f5e4d3d10a37d4a70fde8ed67a95e67b251d5c512c0ea98c380d2f953360405161251291906147b2565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590614958565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161267f919061483b565b60405180910390a3505050565b60006126a960086000868152602001908152602001600020611b96565b905061270d60096000868152602001908152602001600020600083815260200190815260200160002060008560018111156126e7576126e6614e6a565b5b60018111156126f9576126f8614e6a565b5b8152602001908152602001600020836132c1565b8173ffffffffffffffffffffffffffffffffffffffff1683600181111561273757612736614e6a565b5b857f0bf5a13b362503fcc74b8b9b1598aba2f3a9af85d05ba7978f7e9f447f22c2393360405161276791906147b2565b60405180910390a450505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90614998565b60405180910390fd5b6127ee81613163565b1561282e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612825906148f8565b60405180910390fd5b61283c6000838360016131a4565b61284581613163565b15612885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287c906148f8565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461298f6000838360016132bb565b5050565b6001816000016000828254019250508190555050565b6129b4848484611f10565b6129c0848484846133c2565b6129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f6906148b8565b60405180910390fd5b50505050565b606060006002836002612a189190614bf2565b612a229190614b6b565b67ffffffffffffffff811115612a3b57612a3a614f26565b5b6040519080825280601f01601f191660200182016040528015612a6d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612aa557612aa4614ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b0957612b08614ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b499190614bf2565b612b539190614b6b565b90505b6001811115612bf3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b9557612b94614ef7565b5b1a60f81b828281518110612bac57612bab614ef7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612bec90614d36565b9050612b56565b5060008414612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e90614878565b60405180910390fd5b8091505092915050565b606060006001612c5084613559565b01905060008167ffffffffffffffff811115612c6f57612c6e614f26565b5b6040519080825280601f01601f191660200182016040528015612ca15781602001600182028036833780820191505090505b509050600082602001820190505b600115612d0e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612cf857612cf7614e3b565b5b0494506000851415612d0957612d0e565b612caf565b819350505050919050565b60606040518060400160405280601d81526020017f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250905090565b6060600082511415612d7957604051806020016040528060008152509050612eb5565b600060405180606001604052806040815260200161567d6040913990506000600360028551612da89190614b6b565b612db29190614bc1565b6004612dbe9190614bf2565b67ffffffffffffffff811115612dd757612dd6614f26565b5b6040519080825280601f01601f191660200182016040528015612e095781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612e75576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612e1a565b5050600386510660018114612e915760028114612ea457612eac565b603d6001830353603d6002830353612eac565b603d60018303535b50505080925050505b919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146130f557600060018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f539190614c4c565b9050600060018460010180549050612f6b9190614c4c565b90506000846001018281548110612f8557612f84614ef7565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080856001018481548110612fc957612fc8614ef7565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018361301e9190614b6b565b8560000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508460010180548061307757613076614ec8565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090555050505b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166131858361241d565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561320e5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156132225761321d82846136ac565b6132a9565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613268576132638260008561268c565b6132a8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132a7576132a6826136c5565b5b5b5b6132b5848484846136e3565b50505050565b50505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156133be5781600101819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600101805490508260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60006133e38473ffffffffffffffffffffffffffffffffffffffff16613809565b1561354c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261340c611dba565b8786866040518563ffffffff1660e01b815260040161342e94939291906147cd565b602060405180830381600087803b15801561344857600080fd5b505af192505050801561347957506040513d601f19601f820116820180604052508101906134769190613dd7565b60015b6134fc573d80600081146134a9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ae565b606091505b506000815114156134f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134eb906148b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613551565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106135b7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816135ad576135ac614e3b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106135f4576d04ee2d6d415b85acef810000000083816135ea576135e9614e3b565b5b0492506020810190505b662386f26fc10000831061362357662386f26fc10000838161361957613618614e3b565b5b0492506010810190505b6305f5e100831061364c576305f5e100838161364257613641614e3b565b5b0492506008810190505b612710831061367157612710838161366757613666614e3b565b5b0492506004810190505b60648310613694576064838161368a57613689614e3b565b5b0492506002810190505b600a83106136a3576001810190505b80915050919050565b6136b5826136c5565b6136c18260008361268c565b5050565b6136e060086000838152602001908152602001600020612993565b50565b600181111561380357600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146137775780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461376f9190614c4c565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138025780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137fa9190614b6b565b925050819055505b5b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461383890614d60565b90600052602060002090601f01602090048101928261385a57600085556138a1565b82601f1061387357805160ff19168380011785556138a1565b828001600101855582156138a1579182015b828111156138a0578251825591602001919060010190613885565b5b5090506138ae91906138f2565b5090565b5080546138be90614d60565b6000825580601f106138d057506138ef565b601f0160209004906000526020600020908101906138ee91906138f2565b5b50565b5b8082111561390b5760008160009055506001016138f3565b5090565b600061392261391d84614a78565b614a53565b90508281526020810184848401111561393e5761393d614f5a565b5b613949848285614cf4565b509392505050565b600061396461395f84614aa9565b614a53565b9050828152602081018484840111156139805761397f614f5a565b5b61398b848285614cf4565b509392505050565b6000813590506139a281615610565b92915050565b6000813590506139b781615627565b92915050565b6000813590506139cc8161563e565b92915050565b6000815190506139e18161563e565b92915050565b600082601f8301126139fc576139fb614f55565b5b8135613a0c84826020860161390f565b91505092915050565b600081359050613a2481615655565b92915050565b600082601f830112613a3f57613a3e614f55565b5b8135613a4f848260208601613951565b91505092915050565b600081359050613a6781615665565b92915050565b600060208284031215613a8357613a82614f64565b5b6000613a9184828501613993565b91505092915050565b60008060408385031215613ab157613ab0614f64565b5b6000613abf85828601613993565b9250506020613ad085828601613993565b9150509250929050565b600080600060608486031215613af357613af2614f64565b5b6000613b0186828701613993565b9350506020613b1286828701613993565b9250506040613b2386828701613a58565b9150509250925092565b60008060008060808587031215613b4757613b46614f64565b5b6000613b5587828801613993565b9450506020613b6687828801613993565b9350506040613b7787828801613a58565b925050606085013567ffffffffffffffff811115613b9857613b97614f5f565b5b613ba4878288016139e7565b91505092959194509250565b60008060408385031215613bc757613bc6614f64565b5b6000613bd585828601613993565b9250506020613be6858286016139a8565b9150509250929050565b600080600080600080600080610100898b031215613c1157613c10614f64565b5b6000613c1f8b828c01613993565b985050602089013567ffffffffffffffff811115613c4057613c3f614f5f565b5b613c4c8b828c01613a2a565b975050604089013567ffffffffffffffff811115613c6d57613c6c614f5f565b5b613c798b828c01613a2a565b965050606089013567ffffffffffffffff811115613c9a57613c99614f5f565b5b613ca68b828c01613a2a565b955050608089013567ffffffffffffffff811115613cc757613cc6614f5f565b5b613cd38b828c01613a2a565b94505060a089013567ffffffffffffffff811115613cf457613cf3614f5f565b5b613d008b828c01613a2a565b93505060c089013567ffffffffffffffff811115613d2157613d20614f5f565b5b613d2d8b828c01613a2a565b92505060e089013567ffffffffffffffff811115613d4e57613d4d614f5f565b5b613d5a8b828c01613a2a565b9150509295985092959890939650565b60008060408385031215613d8157613d80614f64565b5b6000613d8f85828601613993565b9250506020613da085828601613a58565b9150509250929050565b600060208284031215613dc057613dbf614f64565b5b6000613dce848285016139bd565b91505092915050565b600060208284031215613ded57613dec614f64565b5b6000613dfb848285016139d2565b91505092915050565b600060208284031215613e1a57613e19614f64565b5b6000613e2884828501613a15565b91505092915050565b60008060408385031215613e4857613e47614f64565b5b6000613e5685828601613a15565b9250506020613e6785828601613993565b9150509250929050565b600060208284031215613e8757613e86614f64565b5b6000613e9584828501613a58565b91505092915050565b60008060408385031215613eb557613eb4614f64565b5b6000613ec385828601613a58565b9250506020613ed485828601613a15565b9150509250929050565b600080600060608486031215613ef757613ef6614f64565b5b6000613f0586828701613a58565b9350506020613f1686828701613a15565b9250506040613f2786828701613993565b9150509250925092565b60008060408385031215613f4857613f47614f64565b5b6000613f5685828601613a58565b925050602083013567ffffffffffffffff811115613f7757613f76614f5f565b5b613f8385828601613a2a565b9150509250929050565b600080600060608486031215613fa657613fa5614f64565b5b6000613fb486828701613a58565b935050602084013567ffffffffffffffff811115613fd557613fd4614f5f565b5b613fe186828701613a2a565b925050604084013567ffffffffffffffff81111561400257614001614f5f565b5b61400e86828701613a2a565b9150509250925092565b60006140248383614030565b60208301905092915050565b61403981614c80565b82525050565b61404881614c80565b82525050565b600061405982614aff565b6140638185614b2d565b935061406e83614ada565b8060005b8381101561409f5781516140868882614018565b975061409183614b20565b925050600181019050614072565b5085935050505092915050565b6140b581614c92565b82525050565b60006140c682614b0a565b6140d08185614b3e565b93506140e0818560208601614d03565b6140e981614f69565b840191505092915050565b60006140ff82614b15565b6141098185614b4f565b9350614119818560208601614d03565b61412281614f69565b840191505092915050565b600061413882614b15565b6141428185614b60565b9350614152818560208601614d03565b80840191505092915050565b6000815461416b81614d60565b6141758186614b60565b9450600182166000811461419057600181146141a1576141d4565b60ff198316865281860193506141d4565b6141aa85614aea565b60005b838110156141cc578154818901526001820191506020810190506141ad565b838801955050505b50505092915050565b60006141ea602083614b4f565b91506141f582614f7a565b602082019050919050565b600061420d602d83614b4f565b915061421882614fa3565b604082019050919050565b6000614230601083614b60565b915061423b82614ff2565b601082019050919050565b6000614253603283614b4f565b915061425e8261501b565b604082019050919050565b6000614276600f83614b60565b91506142818261506a565b600f82019050919050565b6000614299600283614b60565b91506142a482615093565b600282019050919050565b60006142bc602583614b4f565b91506142c7826150bc565b604082019050919050565b60006142df602383614b60565b91506142ea8261510b565b602382019050919050565b6000614302601c83614b4f565b915061430d8261515a565b602082019050919050565b6000614325600383614b60565b915061433082615183565b600382019050919050565b6000614348602d83614b4f565b9150614353826151ac565b604082019050919050565b600061436b602483614b4f565b9150614376826151fb565b604082019050919050565b600061438e601983614b4f565b91506143998261524a565b602082019050919050565b60006143b1602683614b60565b91506143bc82615273565b602682019050919050565b60006143d4600883614b60565b91506143df826152c2565b600882019050919050565b60006143f7602983614b4f565b9150614402826152eb565b604082019050919050565b600061441a600983614b60565b91506144258261533a565b600982019050919050565b600061443d600283614b60565b915061444882615363565b600282019050919050565b6000614460602083614b4f565b915061446b8261538c565b602082019050919050565b6000614483600183614b60565b915061448e826153b5565b600182019050919050565b60006144a6600183614b60565b91506144b1826153de565b600182019050919050565b60006144c9600f83614b60565b91506144d482615407565b600f82019050919050565b60006144ec600983614b60565b91506144f782615430565b600982019050919050565b600061450f601883614b4f565b915061451a82615459565b602082019050919050565b6000614532601f83614b60565b915061453d82615482565b601f82019050919050565b6000614555600183614b60565b9150614560826154ab565b600182019050919050565b6000614578602183614b4f565b9150614583826154d4565b604082019050919050565b600061459b602783614b60565b91506145a682615523565b602782019050919050565b60006145be603d83614b4f565b91506145c982615572565b604082019050919050565b60006145e1602883614b4f565b91506145ec826155c1565b604082019050919050565b61460081614cea565b82525050565b6000614612828461412d565b915081905092915050565b6000614629828561412d565b9150614635828461412d565b91508190509392505050565b600061464c82614499565b9150614657826143c7565b9150614663828c61415e565b915061466e8261428c565b915061467982614269565b9150614685828b61415e565b91506146908261428c565b915061469b826144df565b91506146a7828a61412d565b91506146b28261428c565b91506146bd82614223565b91506146c9828961415e565b91506146d48261428c565b91506146df8261440d565b91506146eb828861415e565b91506146f68261428c565b9150614701826144bc565b915061470c82614525565b9150614718828761415e565b915061472382614318565b915061472e8261458e565b915061473a828661415e565b915061474582614318565b9150614750826143a4565b915061475c828561415e565b915061476782614318565b9150614772826142d2565b915061477e828461412d565b915061478982614430565b915061479482614548565b915061479f82614476565b91508190509a9950505050505050505050565b60006020820190506147c7600083018461403f565b92915050565b60006080820190506147e2600083018761403f565b6147ef602083018661403f565b6147fc60408301856145f7565b818103606083015261480e81846140bb565b905095945050505050565b60006020820190508181036000830152614833818461404e565b905092915050565b600060208201905061485060008301846140ac565b92915050565b6000602082019050818103600083015261487081846140f4565b905092915050565b60006020820190508181036000830152614891816141dd565b9050919050565b600060208201905081810360008301526148b181614200565b9050919050565b600060208201905081810360008301526148d181614246565b9050919050565b600060208201905081810360008301526148f1816142af565b9050919050565b60006020820190508181036000830152614911816142f5565b9050919050565b600060208201905081810360008301526149318161433b565b9050919050565b600060208201905081810360008301526149518161435e565b9050919050565b6000602082019050818103600083015261497181614381565b9050919050565b60006020820190508181036000830152614991816143ea565b9050919050565b600060208201905081810360008301526149b181614453565b9050919050565b600060208201905081810360008301526149d181614502565b9050919050565b600060208201905081810360008301526149f18161456b565b9050919050565b60006020820190508181036000830152614a11816145b1565b9050919050565b60006020820190508181036000830152614a31816145d4565b9050919050565b6000602082019050614a4d60008301846145f7565b92915050565b6000614a5d614a6e565b9050614a698282614d92565b919050565b6000604051905090565b600067ffffffffffffffff821115614a9357614a92614f26565b5b614a9c82614f69565b9050602081019050919050565b600067ffffffffffffffff821115614ac457614ac3614f26565b5b614acd82614f69565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7682614cea565b9150614b8183614cea565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb657614bb5614e0c565b5b828201905092915050565b6000614bcc82614cea565b9150614bd783614cea565b925082614be757614be6614e3b565b5b828204905092915050565b6000614bfd82614cea565b9150614c0883614cea565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4157614c40614e0c565b5b828202905092915050565b6000614c5782614cea565b9150614c6283614cea565b925082821015614c7557614c74614e0c565b5b828203905092915050565b6000614c8b82614cca565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d21578082015181840152602081019050614d06565b83811115614d30576000848401525b50505050565b6000614d4182614cea565b91506000821415614d5557614d54614e0c565b5b600182039050919050565b60006002820490506001821680614d7857607f821691505b60208210811415614d8c57614d8b614e99565b5b50919050565b614d9b82614f69565b810181811067ffffffffffffffff82111715614dba57614db9614f26565b5b80604052505050565b6000614dce82614cea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e0157614e00614e0c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b7f2265787465726e616c5f75726c223a2200000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f226465736372697074696f6e223a220000000000000000000000000000000000600082015250565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a202256657273696f6e222c202276616c756560008201527f223a220000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520636f60008201527f6c6c656374696f6e20726f6c6500000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b2274726169745f74797065223a20225265706f7369746f7279222c2022766160008201527f6c7565223a220000000000000000000000000000000000000000000000000000602082015250565b7f226e616d65223a22000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f22696d616765223a220000000000000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b7f226f776e6572223a220000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f7b2274726169745f74797065223a2022454e53222c202276616c7565223a2200600082015250565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2022436f6d6d69742048617368222c20227660008201527f616c7565223a2200000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b7f466c65656b416363657373436f6e74726f6c3a206d757374206861766520746f60008201527f6b656e20726f6c65000000000000000000000000000000000000000000000000602082015250565b61561981614c80565b811461562457600080fd5b50565b61563081614c92565b811461563b57600080fd5b50565b61564781614c9e565b811461565257600080fd5b50565b6002811061566257600080fd5b50565b61566e81614cea565b811461567957600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202ad793148892cb17843bc8ddfc8da3cf80fb0141adeabdb33bfc6d87fe628c9b64736f6c63430008070033", - "devdoc": { - "kind": "dev", - "methods": { - "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." - }, - "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." - }, - "isApprovedForAll(address,address)": { - "details": "See {IERC721-isApprovedForAll}." - }, - "mint(address,string,string,string,string,string,string,string)": { - "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}." - }, - "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}." - }, - "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." - }, - "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." - }, - "setTokenImage(uint256,string)": { - "details": "Updates the `image` metadata field of a minted `tokenId`. May emit a {NewTokenImage} 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 - }, + "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}", "storageLayout": { "storage": [ { - "astId": 25, + "astId": 6, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 9, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 1624, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 1843, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 197, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_name", "offset": 0, - "slot": "0", + "slot": "101", "type": "t_string_storage" }, { - "astId": 27, + "astId": 199, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_symbol", "offset": 0, - "slot": "1", + "slot": "102", "type": "t_string_storage" }, { - "astId": 31, + "astId": 203, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_owners", "offset": 0, - "slot": "2", + "slot": "103", "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 35, + "astId": 207, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_balances", "offset": 0, - "slot": "3", + "slot": "104", "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 39, + "astId": 211, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_tokenApprovals", "offset": 0, - "slot": "4", + "slot": "105", "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 45, + "astId": 217, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_operatorApprovals", "offset": 0, - "slot": "5", + "slot": "106", "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" }, { - "astId": 2715, + "astId": 1137, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage" + }, + { + "astId": 3946, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_collectionRolesVersion", "offset": 0, - "slot": "6", - "type": "t_struct(Counter)1510_storage" + "slot": "151", + "type": "t_struct(Counter)2774_storage" }, { - "astId": 2723, + "astId": 3954, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_collectionRoles", "offset": 0, - "slot": "7", - "type": "t_mapping(t_uint256,t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage))" + "slot": "152", + "type": "t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage))" }, { - "astId": 2728, + "astId": 3959, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_tokenRolesVersion", "offset": 0, - "slot": "8", - "type": "t_mapping(t_uint256,t_struct(Counter)1510_storage)" + "slot": "153", + "type": "t_mapping(t_uint256,t_struct(Counter)2774_storage)" }, { - "astId": 2738, + "astId": 3969, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_tokenRoles", "offset": 0, - "slot": "9", - "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage)))" + "slot": "154", + "type": "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)))" }, { - "astId": 3377, + "astId": 4743, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "_tokenIds", + "label": "_appIds", "offset": 0, - "slot": "10", - "type": "t_struct(Counter)1510_storage" + "slot": "155", + "type": "t_struct(Counter)2774_storage" }, { - "astId": 3382, + "astId": 4748, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_apps", "offset": 0, - "slot": "11", - "type": "t_mapping(t_uint256,t_struct(App)3374_storage)" + "slot": "156", + "type": "t_mapping(t_uint256,t_struct(App)4722_storage)" + }, + { + "astId": 4753, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "_accessPoints", + "offset": 0, + "slot": "157", + "type": "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4740_storage)" } ], "types": { @@ -1229,12 +1673,24 @@ "label": "address[]", "numberOfBytes": "32" }, + "t_array(t_uint256)44_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, "t_bool": { "encoding": "inplace", "label": "bool", "numberOfBytes": "1" }, - "t_enum(Roles)2664": { + "t_enum(Roles)3895": { "encoding": "inplace", "label": "enum FleekAccessControl.Roles", "numberOfBytes": "1" @@ -1260,12 +1716,19 @@ "numberOfBytes": "32", "value": "t_uint256" }, - "t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage)": { + "t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)": { "encoding": "mapping", - "key": "t_enum(Roles)2664", + "key": "t_enum(Roles)3895", "label": "mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role)", "numberOfBytes": "32", - "value": "t_struct(Role)2712_storage" + "value": "t_struct(Role)3943_storage" + }, + "t_mapping(t_string_memory_ptr,t_struct(AccessPoint)4740_storage)": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => struct FleekERC721.AccessPoint)", + "numberOfBytes": "32", + "value": "t_struct(AccessPoint)4740_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1274,52 +1737,112 @@ "numberOfBytes": "32", "value": "t_address" }, - "t_mapping(t_uint256,t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage))": { + "t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage))": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role))", "numberOfBytes": "32", - "value": "t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage)" + "value": "t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)" }, - "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage)))": { + "t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage)))": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => mapping(uint256 => mapping(enum FleekAccessControl.Roles => struct FleekAccessControl.Role)))", "numberOfBytes": "32", - "value": "t_mapping(t_uint256,t_mapping(t_enum(Roles)2664,t_struct(Role)2712_storage))" + "value": "t_mapping(t_uint256,t_mapping(t_enum(Roles)3895,t_struct(Role)3943_storage))" }, - "t_mapping(t_uint256,t_struct(App)3374_storage)": { + "t_mapping(t_uint256,t_struct(App)4722_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.App)", "numberOfBytes": "32", - "value": "t_struct(App)3374_storage" + "value": "t_struct(App)4722_storage" }, - "t_mapping(t_uint256,t_struct(Build)3356_storage)": { + "t_mapping(t_uint256,t_struct(Build)4727_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct FleekERC721.Build)", "numberOfBytes": "32", - "value": "t_struct(Build)3356_storage" + "value": "t_struct(Build)4727_storage" }, - "t_mapping(t_uint256,t_struct(Counter)1510_storage)": { + "t_mapping(t_uint256,t_struct(Counter)2774_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct Counters.Counter)", "numberOfBytes": "32", - "value": "t_struct(Counter)1510_storage" + "value": "t_struct(Counter)2774_storage" + }, + "t_string_memory_ptr": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" }, "t_string_storage": { "encoding": "bytes", "label": "string", "numberOfBytes": "32" }, - "t_struct(App)3374_storage": { + "t_struct(AccessPoint)4740_storage": { + "encoding": "inplace", + "label": "struct FleekERC721.AccessPoint", + "members": [ + { + "astId": 4729, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "tokenId", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 4731, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "score", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 4733, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "contentVerified", + "offset": 0, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 4735, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "nameVerified", + "offset": 1, + "slot": "2", + "type": "t_bool" + }, + { + "astId": 4737, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "owner", + "offset": 2, + "slot": "2", + "type": "t_address" + }, + { + "astId": 4739, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "status", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + } + ], + "numberOfBytes": "128" + }, + "t_struct(App)4722_storage": { "encoding": "inplace", "label": "struct FleekERC721.App", "members": [ { - "astId": 3358, + "astId": 4702, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "name", "offset": 0, @@ -1327,7 +1850,7 @@ "type": "t_string_storage" }, { - "astId": 3360, + "astId": 4704, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "description", "offset": 0, @@ -1335,54 +1858,70 @@ "type": "t_string_storage" }, { - "astId": 3362, + "astId": 4706, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "image", + "label": "externalURL", "offset": 0, "slot": "2", "type": "t_string_storage" }, { - "astId": 3364, + "astId": 4708, "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "externalURL", + "label": "ENS", "offset": 0, "slot": "3", "type": "t_string_storage" }, { - "astId": 3366, - "contract": "contracts/FleekERC721.sol:FleekERC721", - "label": "ENS", - "offset": 0, - "slot": "4", - "type": "t_string_storage" - }, - { - "astId": 3368, + "astId": 4710, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "currentBuild", "offset": 0, - "slot": "5", + "slot": "4", "type": "t_uint256" }, { - "astId": 3373, + "astId": 4715, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "builds", "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(Build)4727_storage)" + }, + { + "astId": 4717, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "logo", + "offset": 0, "slot": "6", - "type": "t_mapping(t_uint256,t_struct(Build)3356_storage)" + "type": "t_string_storage" + }, + { + "astId": 4719, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "color", + "offset": 0, + "slot": "7", + "type": "t_uint24" + }, + { + "astId": 4721, + "contract": "contracts/FleekERC721.sol:FleekERC721", + "label": "accessPointAutoApprovalSettings", + "offset": 3, + "slot": "7", + "type": "t_bool" } ], - "numberOfBytes": "224" + "numberOfBytes": "256" }, - "t_struct(Build)3356_storage": { + "t_struct(Build)4727_storage": { "encoding": "inplace", "label": "struct FleekERC721.Build", "members": [ { - "astId": 3353, + "astId": 4724, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "commitHash", "offset": 0, @@ -1390,7 +1929,7 @@ "type": "t_string_storage" }, { - "astId": 3355, + "astId": 4726, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "gitRepository", "offset": 0, @@ -1400,12 +1939,12 @@ ], "numberOfBytes": "64" }, - "t_struct(Counter)1510_storage": { + "t_struct(Counter)2774_storage": { "encoding": "inplace", "label": "struct Counters.Counter", "members": [ { - "astId": 1509, + "astId": 2773, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "_value", "offset": 0, @@ -1415,12 +1954,12 @@ ], "numberOfBytes": "32" }, - "t_struct(Role)2712_storage": { + "t_struct(Role)3943_storage": { "encoding": "inplace", "label": "struct FleekAccessControl.Role", "members": [ { - "astId": 2708, + "astId": 3939, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "indexes", "offset": 0, @@ -1428,7 +1967,7 @@ "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 2711, + "astId": 3942, "contract": "contracts/FleekERC721.sol:FleekERC721", "label": "members", "offset": 0, @@ -1438,10 +1977,20 @@ ], "numberOfBytes": "64" }, + "t_uint24": { + "encoding": "inplace", + "label": "uint24", + "numberOfBytes": "3" + }, "t_uint256": { "encoding": "inplace", "label": "uint256", "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" } } } diff --git a/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx b/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx new file mode 100644 index 0000000..6fbaed0 --- /dev/null +++ b/ui/src/integrations/ethereum/hooks/ethereum-hooks.tsx @@ -0,0 +1,175 @@ +import { + Address, + useContractWrite, + usePrepareContractWrite, + useWaitForTransaction, + UsePrepareContractWriteConfig, +} from 'wagmi'; +import type { Abi as AbiType } from 'abitype'; +import { FleekERC721 } from '../contracts'; +import { createContext } from '@/utils'; +import { useState } from 'react'; + +/** + * This is a factory to create context factories for contracts write. + * It should be used inside other context factories specific for each + * contract. + */ +const createWriteContractContext = < + TAbi extends EthereumHooks.Abi, + TArgumentsMap extends EthereumHooks.WriteContext.ArgumentsMap, + TFunctionName extends keyof TArgumentsMap & string, + TFunctionArguments extends TArgumentsMap[TFunctionName] +>( + address: string, + abi: TAbi, + functionName: TFunctionName, + name = `WriteContractContext[${functionName}]`, + hookName = `[${functionName}] write contract hook`, + providerName = `Write contract [${functionName}] provider` +) => { + const [InternalProvider, useInternalProvider] = createContext< + EthereumHooks.WriteContext.InternalContextProps< + TAbi, + TArgumentsMap, + TFunctionName, + TFunctionArguments + > + >({ + name, + hookName, + providerName, + }); + + const Provider = ({ + children, + config: { + prepare: prepareConfig = {}, + transaction: transactionConfig = {}, + write: writeConfig = {}, + } = {}, + }: EthereumHooks.WriteContext.ProviderProps) => { + const [args, setArgs] = useState(); + + const prepare = usePrepareContractWrite({ + address: address as Address, + abi: abi as unknown[], + functionName, + args, + ...prepareConfig, + }); + + const write = useContractWrite({ ...prepare.config, ...writeConfig }); + + const transaction = useWaitForTransaction({ + hash: write.data?.hash, + ...transactionConfig, + }); + + const value = { + functionName, + prepare, + write, + transaction, + setArgs, + }; + + return {children}; + }; + + return [Provider, useInternalProvider] as const; +}; + +/** + * React hooks and related to interact with Ethereum. + */ +export const EthereumHooks = { + /** + * Context factory for FleekERC721 write functions. + */ + createFleekERC721WriteContext: < + TFunctionName extends keyof ArgumentsMaps.FleekERC721 & string, + TFunctionArguments extends ArgumentsMaps.FleekERC721[TFunctionName] + >( + functionName: TFunctionName + ) => { + return createWriteContractContext< + typeof FleekERC721.abi, + ArgumentsMaps.FleekERC721, + TFunctionName, + TFunctionArguments + >(FleekERC721.address, FleekERC721.abi, functionName); + }, +}; + +/** + * EthereumHooks used typings. + */ +export namespace EthereumHooks { + export type Abi = AbiType | readonly unknown[]; + + export namespace WriteContext { + export type ArgumentsMap = Record; + + export interface InternalContextProps< + TAbi extends Abi, + TArgumentsMap extends ArgumentsMap, + TFunctionName extends keyof TArgumentsMap & string, + TFunctionArguments extends TArgumentsMap[TFunctionName] + > { + functionName: TFunctionName; + prepare: ReturnType< + typeof usePrepareContractWrite + >; + write: ReturnType< + typeof useContractWrite<'prepared', TAbi, TFunctionName> + >; + transaction: ReturnType; + setArgs: (args: TFunctionArguments) => void; + } + + export interface ProviderConfig { + prepare?: Omit< + UsePrepareContractWriteConfig, + 'address' | 'abi' | 'functionName' | 'args' + >; + write?: Omit< + Exclude[0], undefined>, + 'mode' | 'address' | 'abi' | 'functionName' | 'args' + >; + transaction?: Omit< + Exclude[0], undefined>, + 'hash' + >; + } + + export interface ProviderProps { + children?: React.ReactNode | React.ReactNode[]; + config?: ProviderConfig; + } + } +} + +/** + * Identified types to interact with known contracts using EthereumHooks contexts. + */ +export namespace ArgumentsMaps { + export interface FleekERC721 extends EthereumHooks.WriteContext.ArgumentsMap { + mint: [ + string, // address to + string, // string name + string, // string description + string, // string externalURL + string, // string ENS + string, // string commitHash + string, // string gitRepository + string, // string logo + number, // uint24 color + boolean // bool accessPointAutoApproval + ]; + + /** + * TODO: Add other functions arguments as they are needed. + */ + } +} diff --git a/ui/src/integrations/ethereum/hooks/index.ts b/ui/src/integrations/ethereum/hooks/index.ts new file mode 100644 index 0000000..05955a9 --- /dev/null +++ b/ui/src/integrations/ethereum/hooks/index.ts @@ -0,0 +1 @@ +export * from './ethereum-hooks'; diff --git a/ui/src/integrations/ethereum/index.ts b/ui/src/integrations/ethereum/index.ts index c4816e8..c13915c 100644 --- a/ui/src/integrations/ethereum/index.ts +++ b/ui/src/integrations/ethereum/index.ts @@ -1,2 +1,3 @@ export * from './ethereum'; export * from './lib'; +export * from './hooks'; 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 4539fbd..152b109 100644 --- a/ui/src/store/features/github/async-thunk/fetch-repositories.ts +++ b/ui/src/store/features/github/async-thunk/fetch-repositories.ts @@ -1,4 +1,4 @@ -import { githubActions, Repository, RootState } from '@/store'; +import { githubActions, RootState } from '@/store'; import { createAsyncThunk } from '@reduxjs/toolkit'; import { GithubClient } from '../github-client'; @@ -16,11 +16,14 @@ export const fetchRepositoriesThunk = createAsyncThunk( const repositories = await githubClient.fetchRepos(url); + console.log(repositories); + dispatch( - githubActions.setRepositoires( - repositories.map( - (repo: any) => ({ name: repo.name, url: repo.url } as Repository) - ) + githubActions.setRepositories( + repositories.map((repo: any) => ({ + name: repo.name, + url: repo.html_url, + })) ) ); } catch (error) { diff --git a/ui/src/store/features/github/github-slice.ts b/ui/src/store/features/github/github-slice.ts index 2361806..f00b3f2 100644 --- a/ui/src/store/features/github/github-slice.ts +++ b/ui/src/store/features/github/github-slice.ts @@ -2,14 +2,9 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '@/store'; import { useAppSelector } from '@/store/hooks'; import * as asyncThunk from './async-thunk'; -import { ComboboxItem, DropdownItem } from '@/components'; +import { DropdownItem } from '@/components'; import { UserData } from './github-client'; -export type Repository = { - name: string; - url: string; -}; - export namespace GithubState { export type Token = string; @@ -25,6 +20,11 @@ export namespace GithubState { export type UserAndOrganizations = Array; + export type Repository = { + name: string; + url: string; + }; + export type Repositories = Array; export type Branches = Array; @@ -65,9 +65,9 @@ export const githubSlice = createSlice({ state.token = ''; state.state = action.payload; }, - setRepositoires: ( + setRepositories: ( state, - action: PayloadAction + action: PayloadAction ) => { state.repositories = action.payload; state.queryLoading = 'success'; diff --git a/ui/src/store/features/index.ts b/ui/src/store/features/index.ts index 0f0a5d7..8e3e83e 100644 --- a/ui/src/store/features/index.ts +++ b/ui/src/store/features/index.ts @@ -1,2 +1 @@ -export * from './wallet'; export * from './github'; diff --git a/ui/src/store/features/wallet/async-thunk/connect.ts b/ui/src/store/features/wallet/async-thunk/connect.ts deleted file mode 100644 index 9d0c84c..0000000 --- a/ui/src/store/features/wallet/async-thunk/connect.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createAsyncThunk } from '@reduxjs/toolkit'; -import { walletActions, WalletState } from '../wallet-slice'; -import { RootState } from '@/store/store'; -import { Ethereum } from '@/integrations'; - -export const connect = createAsyncThunk< - void, - Exclude ->('wallet/connect', async (providerName, { dispatch, getState }) => { - if ((getState() as RootState).wallet.state === 'loading') return; - - try { - dispatch(walletActions.setState('loading')); - dispatch(walletActions.setProvider(providerName)); - - const response = await Ethereum.provider[providerName].send( - 'eth_requestAccounts', - [] - ); - - if (Array.isArray(response)) { - const [account] = response; - - if (typeof account !== 'string') throw Error('Invalid account type'); - dispatch(walletActions.setAccount(account)); - return; - } - - throw Error('Invalid response type'); - } catch (e) { - console.error('Could not connect to Wallet', e); - dispatch(walletActions.setState('disconnected')); - } -}); diff --git a/ui/src/store/features/wallet/async-thunk/index.ts b/ui/src/store/features/wallet/async-thunk/index.ts deleted file mode 100644 index 3c1ca14..0000000 --- a/ui/src/store/features/wallet/async-thunk/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './connect'; diff --git a/ui/src/store/features/wallet/index.ts b/ui/src/store/features/wallet/index.ts deleted file mode 100644 index 6566b83..0000000 --- a/ui/src/store/features/wallet/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './wallet-slice'; -export * from './utils'; diff --git a/ui/src/store/features/wallet/utils.ts b/ui/src/store/features/wallet/utils.ts deleted file mode 100644 index 343b841..0000000 --- a/ui/src/store/features/wallet/utils.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Ethereum } from '@/integrations'; -import { store } from '../../store'; -import { walletActions } from './wallet-slice'; - -export const initializeWallet = async (): Promise => { - // metamask - try { - const metamask = Ethereum.provider.metamask; - const accounts = await metamask.listAccounts(); - if (accounts && accounts.length > 0) { - store.dispatch(walletActions.setAccount(accounts[0])); - } - metamask.on('accountsChanged', (accounts: string[]) => { - store.dispatch(walletActions.setAccount(accounts[0])); - }); - store.dispatch(walletActions.setProvider('metamask')); - } catch {} -}; diff --git a/ui/src/store/features/wallet/wallet-slice.ts b/ui/src/store/features/wallet/wallet-slice.ts deleted file mode 100644 index b31dec3..0000000 --- a/ui/src/store/features/wallet/wallet-slice.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import * as asyncThunk from './async-thunk'; -import { RootState } from '@/store'; -import { useAppSelector } from '@/store/hooks'; -import { Ethereum } from '@/integrations'; - -export namespace WalletState { - export type Provider = Ethereum.Providers | null; - - export type State = 'disconnected' | 'loading' | 'connected'; - - export type Account = string; -} - -export interface WalletState { - provider: WalletState.Provider; - state: WalletState.State; - account?: WalletState.Account; -} - -const initialState: WalletState = { - provider: null, - state: 'disconnected', - account: undefined, -}; - -export const walletSlice = createSlice({ - name: 'wallet', - initialState, - reducers: { - setProvider: (state, action: PayloadAction) => { - state.provider = action.payload; - }, - setAccount: (state, action: PayloadAction) => { - state.state = 'connected'; - state.account = action.payload; - }, - setState: ( - state, - action: PayloadAction> - ) => { - state.state = action.payload; - state.provider = null; - state.account = undefined; - }, - disconnect: (state) => { - state.state = 'disconnected'; - state.provider = null; - state.account = undefined; - }, - }, -}); - -export const walletActions = { - ...walletSlice.actions, - ...asyncThunk, -}; - -const selectWalletState = (state: RootState): WalletState => state.wallet; - -export const useWalletStore = (): WalletState => - useAppSelector(selectWalletState); - -export default walletSlice.reducer; diff --git a/ui/src/store/store.ts b/ui/src/store/store.ts index 0e73521..0a9377f 100644 --- a/ui/src/store/store.ts +++ b/ui/src/store/store.ts @@ -1,10 +1,8 @@ import { configureStore } from '@reduxjs/toolkit'; -import walletReducer from './features/wallet/wallet-slice'; import githubReducer from './features/github/github-slice'; export const store = configureStore({ reducer: { - wallet: walletReducer, github: githubReducer, }, middleware: (getDefaultMiddleware) => diff --git a/ui/src/views/mint-test/index.ts b/ui/src/views/mint-test/index.ts new file mode 100644 index 0000000..61e1ba7 --- /dev/null +++ b/ui/src/views/mint-test/index.ts @@ -0,0 +1 @@ +export * from './mint-test'; diff --git a/ui/src/views/mint-test/mint-test.tsx b/ui/src/views/mint-test/mint-test.tsx new file mode 100644 index 0000000..ec8dd19 --- /dev/null +++ b/ui/src/views/mint-test/mint-test.tsx @@ -0,0 +1,203 @@ +import { Button, Flex } from '@/components'; +import { Separator } from '@/components/core/separator.styles'; +import { EthereumHooks } from '@/integrations'; +import { ConnectKitButton } from 'connectkit'; +import { useAccount } from 'wagmi'; + +/** + * This is an example about how to use the EthereumHooks to create a context for a contract method + * + * TODO: this view must be removed before releasing the app + */ + +// We first create a context for a selected contract method +const [MintProvider, useMintContext] = + EthereumHooks.createFleekERC721WriteContext('mint'); + +const Preparing: React.FC = () => { + // We can check the states of the stage of the contract using the context + const { + prepare: { status: prepareStatus, data: prepareData, error: prepareError }, + setArgs, + } = useMintContext(); + + const handlePrepare = () => { + // `setArgs` will fulfill the arguments used to call the contract method + setArgs([ + '0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049', + 'App NFT', + 'App NFT Description', + 'https://appnft.com', + 'appnft.eth', + '5843ce0ce03607180d9f0b58d4df048bf8a202c7', + 'https://github.com/fleekxyz/non-fungible-apps', + 'test-logo', + 0x123456, + true, + ]); + }; + + // We can change the UI rendering based on the states + if (prepareStatus !== 'success') { + const isLoading = prepareStatus === 'loading'; + return ( + <> + {prepareStatus === 'error' && ( + +

Prepare Error:

+
{JSON.stringify(prepareError, null, 2)}
+
+ )} + + + + ); + } + + return ( + +

Prepare Data:

+
{JSON.stringify(prepareData, null, 2)}
+
+ ); +}; + +const Minting: React.FC = () => { + const { + prepare: { status: prepareStatus }, + // In the write key we will have the trigger to call the contract method + write: { + status: mintStatus, + write: mint, + data: mintData, + error: mintError, + }, + } = useMintContext(); + + const handleMint = () => { + // The trigger function will be undefined in case the contract method is not ready to be called + // Preparing the contract method will run a gas estimation and will set the trigger function + // If the gas estimation fails, the trigger function will be undefined + // This may happen for invalid arguments, if the user has no permissions to call the method, etc. + if (mint) mint(); + }; + + if (prepareStatus !== 'success') { + return null; + } + + if (mintStatus !== 'success') { + const isLoading = mintStatus === 'loading'; + return ( + <> + {mintStatus === 'error' && ( + +

Mint Error:

+
{JSON.stringify(mintError, null, 2)}
+
+ )} + + + + ); + } + + return ( + +

Mint Data:

+
{JSON.stringify(mintData, null, 2)}
+
+ ); +}; + +const Waiting: React.FC = () => { + const { + write: { status: mintStatus }, + transaction: { + status: transactionStatus, + data: transactionData, + error: transactionError, + }, + } = useMintContext(); + + if (mintStatus !== 'success') { + return null; + } + + if (transactionStatus !== 'success') { + if (transactionStatus === 'error') { + console.error(transactionError); + return
Transaction error
; + } + if (transactionStatus === 'loading') + return
Waiting for transaction...
; + } + + return ( + +

Transaction Data:

+
{JSON.stringify(transactionData, null, 2)}
+
+ ); +}; + +const Container: React.FC = () => ( + + + + + + + +); + +export const MintTest: React.FC = () => { + const { isConnected } = useAccount(); + + return ( + // The provider must wrap the UI that will use the context + { + console.log('Prepared', data); + }, + }, + + write: { + onSuccess: (data) => { + console.log('Mint sent', data); + }, + }, + + transaction: { + onSuccess: (data) => { + console.log('Transaction success', data); + }, + }, + }} + > + {isConnected ? : } + + ); +}; diff --git a/ui/src/views/mint/form-step/mint-form.tsx b/ui/src/views/mint/form-step/mint-form.tsx index 2f1aa44..176adab 100644 --- a/ui/src/views/mint/form-step/mint-form.tsx +++ b/ui/src/views/mint/form-step/mint-form.tsx @@ -9,21 +9,48 @@ import { } from './fields'; import { MintCardHeader } from '../mint-card'; import { useAccount } from 'wagmi'; +import { parseColorToNumber } from './form.utils'; export const FormStep = () => { const { address } = useAccount(); const { prevStep, nextStep } = Stepper.useContext(); - const { appName, appDescription, domain } = Mint.useContext(); + const { + appName, + appDescription, + domain, + appLogo, + branchName, + commitHash, + ens, + logoColor, + repositoryName, + verifyNFA, + } = Mint.useContext(); + const { setArgs } = Mint.useTransactionContext(); - //TODO remove once it's integrated with mint function - console.log('address', address); - const handlePrevStep = () => { - prevStep(); + const handleNextStep = () => { + if (!address) return console.log('No address was found'); + // TODO: we need to make sure all values are correct before + // setting the args otherwise mint may fail + setArgs([ + address, + appName, + appDescription, + domain, + ens.value, + commitHash, + `${repositoryName.url}/tree/${branchName.label}`, + appLogo, + parseColorToNumber(logoColor), + verifyNFA, + ]); + + nextStep(); }; return ( - + { disabled={!appName || !appDescription || !domain} colorScheme="blue" variant="solid" - onClick={nextStep} + onClick={handleNextStep} > Continue diff --git a/ui/src/views/mint/github-step/steps/github-repo-configuration/repo-branch-commit-fields.tsx b/ui/src/views/mint/github-step/steps/github-repo-configuration/repo-branch-commit-fields.tsx index 02f1310..1c6b002 100644 --- a/ui/src/views/mint/github-step/steps/github-repo-configuration/repo-branch-commit-fields.tsx +++ b/ui/src/views/mint/github-step/steps/github-repo-configuration/repo-branch-commit-fields.tsx @@ -27,9 +27,9 @@ export const RepoBranchCommitFields = () => { } }, [queryLoading, dispatch]); - const handleBranchChange = (dorpdownOption: DropdownItem) => { - setBranchName(dorpdownOption); - setCommitHash(dorpdownOption.value); + const handleBranchChange = (dropdownOption: DropdownItem) => { + setBranchName(dropdownOption); + setCommitHash(dropdownOption.value); }; const handleCommitHashChange = (e: React.ChangeEvent) => { diff --git a/ui/src/views/mint/github-step/steps/github-repository-selection/repository.tsx b/ui/src/views/mint/github-step/steps/github-repository-selection/repository.tsx index d425e1a..2a0b0e6 100644 --- a/ui/src/views/mint/github-step/steps/github-repository-selection/repository.tsx +++ b/ui/src/views/mint/github-step/steps/github-repository-selection/repository.tsx @@ -1,14 +1,10 @@ import { Button, Separator } from '@/components'; -import { - githubActions, - Repository as RepositoryType, - useAppDispatch, -} from '@/store'; +import { githubActions, GithubState, useAppDispatch } from '@/store'; import { Mint } from '@/views/mint/mint.context'; import { RepoRow } from './github-repository-selection'; type RepositoryProps = { - repository: RepositoryType; + repository: GithubState.Repository; index: number; length: number; }; diff --git a/ui/src/views/mint/mint.context.tsx b/ui/src/views/mint/mint.context.tsx index 29c6ce0..778a231 100644 --- a/ui/src/views/mint/mint.context.tsx +++ b/ui/src/views/mint/mint.context.tsx @@ -1,11 +1,12 @@ import { ComboboxItem, DropdownItem } from '@/components'; -import { Repository } from '@/store'; +import { GithubState } from '@/store'; +import { EthereumHooks } from '@/integrations'; import { createContext } from '@/utils'; import { useState } from 'react'; export type MintContext = { selectedUserOrg: ComboboxItem; - repositoryName: Repository; + repositoryName: GithubState.Repository; branchName: DropdownItem; //get value from DropdownItem to mint commitHash: string; githubStep: number; @@ -16,10 +17,9 @@ export type MintContext = { ens: DropdownItem; domain: string; verifyNFA: boolean; - sucessMint: boolean | undefined; setGithubStep: (step: number) => void; setSelectedUserOrg: (userOrg: ComboboxItem) => void; - setRepositoryName: (repo: Repository) => void; + setRepositoryName: (repo: GithubState.Repository) => void; setBranchName: (branch: DropdownItem) => void; setCommitHash: (hash: string) => void; setAppName: (name: string) => void; @@ -29,7 +29,6 @@ export type MintContext = { setEns: (ens: DropdownItem) => void; setDomain: (domain: string) => void; setVerifyNFA: (verify: boolean) => void; - setSucessMint: (sucess: boolean) => void; }; const [MintProvider, useContext] = createContext({ @@ -38,15 +37,19 @@ const [MintProvider, useContext] = createContext({ providerName: 'Mint.Provider', }); +const [TransactionProvider, useTransactionContext] = + EthereumHooks.createFleekERC721WriteContext('mint'); + export abstract class Mint { static readonly useContext = useContext; + static readonly useTransactionContext = useTransactionContext; + static readonly Provider: React.FC = ({ children }) => { //Github Connection const [selectedUserOrg, setSelectedUserOrg] = useState({} as ComboboxItem); - const [repositoryName, setRepositoryName] = useState( - {} as Repository - ); + const [repositoryName, setRepositoryName] = + useState({} as GithubState.Repository); const [branchName, setBranchName] = useState({} as DropdownItem); const [commitHash, setCommitHash] = useState(''); const [githubStep, setGithubStepContext] = useState(1); @@ -60,11 +63,6 @@ export abstract class Mint { const [domain, setDomain] = useState(''); const [verifyNFA, setVerifyNFA] = useState(true); - //Mint state - //true means it's minted - //false means it's not minted yet - const [sucessMint, setSucessMint] = useState(false); - const setGithubStep = (step: number): void => { if (step > 0 && step <= 3) { setGithubStepContext(step); @@ -86,7 +84,6 @@ export abstract class Mint { ens, domain, verifyNFA, - sucessMint, setSelectedUserOrg, setGithubStep, setRepositoryName, @@ -99,10 +96,20 @@ export abstract class Mint { setEns, setDomain, setVerifyNFA, - setSucessMint, }} > - {children} + { + console.log('Successfully minted! what now?', data); + alert('transaction hash: ' + data.transactionHash); + }, + }, + }} + > + {children} + ); }; diff --git a/ui/src/views/mint/nft-card/nft-card.tsx b/ui/src/views/mint/nft-card/nft-card.tsx index 03eea9e..058f739 100644 --- a/ui/src/views/mint/nft-card/nft-card.tsx +++ b/ui/src/views/mint/nft-card/nft-card.tsx @@ -10,6 +10,7 @@ type NftCardProps = { buttonText: string; leftIconButton?: React.ReactNode; onClick: () => void; + isLoading: boolean; }; export const NftCard: React.FC = ({ @@ -20,6 +21,7 @@ export const NftCard: React.FC = ({ buttonText, leftIconButton, onClick, + isLoading, }) => { const size = '26.5rem'; const { appLogo, logoColor, appName, ens } = Mint.useContext(); @@ -50,6 +52,8 @@ export const NftCard: React.FC = ({ variant="solid" onClick={onClick} leftIcon={leftIconButton} + isLoading={isLoading} + isDisabled={isLoading} > {buttonText} diff --git a/ui/src/views/mint/preview-step/mint-preview.tsx b/ui/src/views/mint/preview-step/mint-preview.tsx index 31fc467..14d50ea 100644 --- a/ui/src/views/mint/preview-step/mint-preview.tsx +++ b/ui/src/views/mint/preview-step/mint-preview.tsx @@ -1,13 +1,41 @@ import { Icon, IconButton, Stepper } from '@/components'; +import { useTransactionCost } from '@/hooks'; import { Mint } from '@/views/mint/mint.context'; +import { ethers } from 'ethers'; +import { useMemo } from 'react'; import { NftCard } from '../nft-card'; export const MintPreview = () => { const { prevStep } = Stepper.useContext(); - const { setSucessMint } = Mint.useContext(); + const { + prepare: { status: prepareStatus, data: prepareData }, + write: { status: writeStatus, write }, + transaction: { status: transactionStatus }, + } = Mint.useTransactionContext(); + + const [cost, currency, isCostLoading] = useTransactionCost( + prepareData?.request.value, + prepareData?.request.gasLimit + ); //TODO handle error when minting + const message = useMemo(() => { + if (isCostLoading || prepareStatus === 'loading') + return 'Calculating cost...'; + + const formattedCost = ethers.utils.formatEther(cost).slice(0, 9); + return `Minting this NFA will cost ${formattedCost} ${currency}.`; + }, [prepareData, isCostLoading, prepareStatus]); + + const isLoading = useMemo( + () => + [prepareStatus, writeStatus, transactionStatus].some( + (status) => status === 'loading' + ), + [prepareStatus, writeStatus, transactionStatus] + ); + return ( { icon={} /> } - message="Minting this NFA will cost 0.0008 MATIC." + message={message} buttonText="Mint NFA" - onClick={() => { - setSucessMint(true); - }} + onClick={write!} + isLoading={isLoading} /> ); }; diff --git a/ui/yarn.lock b/ui/yarn.lock index 9485498..f852e3d 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -5223,6 +5223,11 @@ abitype@^0.3.0: resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.3.0.tgz#75150e337d88cc0b2423ed0d3fc36935f139d04c" integrity sha512-0YokyAV4hKMcy97Pl+6QgZBlBdZJN2llslOs7kiFY+cu7kMlVXDBpxMExfv0krzBCQt2t7hNovpQ3y/zvEm18A== +abitype@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.5.0.tgz#5c04fcbbb34b680bd7f82cbfb351d37fb3543d05" + integrity sha512-xQJ1aEiOmR6TPGF/JKoDZgUCxxpG7t55Zl2cXRdoQv1IndYqyST6pS1c556c4kuaLbkocNstal3hIjXGVygGzw== + abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: version "0.12.4" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" diff --git a/yarn.lock b/yarn.lock index f30c7bc..605be5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ardatan/sync-fetch@0.0.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== @@ -16,13 +16,14 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/generator@^7.18.13", "@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== +"@babel/generator@^7.18.13", "@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.20.7" + "@babel/types" "^7.21.0" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-environment-visitor@^7.18.9": @@ -30,13 +31,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@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== +"@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.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -76,10 +77,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.8", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== +"@babel/parser@^7.16.8", "@babel/parser@^7.20.7", "@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-syntax-import-assertions@7.20.0": version "7.20.0" @@ -88,7 +89,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/template@^7.18.10": +"@babel/template@^7.18.10", "@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -98,25 +99,25 @@ "@babel/types" "^7.20.7" "@babel/traverse@^7.16.8": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + 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.20.7" + "@babel/generator" "^7.21.1" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@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.20.13" - "@babel/types" "^7.20.7" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.20.7", "@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" @@ -193,188 +194,188 @@ tslib "~2.4.0" "@graphql-tools/apollo-engine-loader@^7.3.6": - version "7.3.23" - resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.23.tgz#ecfea6939b6588acbf4e39585e31379ba1246551" - integrity sha512-OGS0fGUeqBn2NNSfDBVIV7mjch6/7M4JCxvA7fpvVUAmdjjnQ6Z/CGyLIH2bv1eNv75gX/Kkj3baI0lwAWzsXw== + version "7.3.26" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-7.3.26.tgz#91e54460d5579933e42a2010b8688c3459c245d8" + integrity sha512-h1vfhdJFjnCYn9b5EY1Z91JTF0KB3hHVJNQIsiUV2mpQXZdeOXQoaWeYEKaiI5R6kwBw5PP9B0fv3jfUIG8LyQ== dependencies: - "@ardatan/sync-fetch" "0.0.1" - "@graphql-tools/utils" "9.2.0" - "@whatwg-node/fetch" "^0.6.0" + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/utils" "^9.2.1" + "@whatwg-node/fetch" "^0.8.0" tslib "^2.4.0" -"@graphql-tools/batch-execute@8.5.16": - version "8.5.16" - resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.5.16.tgz#ced188d096906a7fe477708c63304d4e70291013" - integrity sha512-x/gXA6R1Q/qigT5LDesZYemErzFYvBBuTaVgiIJuE2wG6oMV1cln0O35Z7WVQw6H3I4vF7cCG7c7wKSoC+3z4Q== +"@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.0" - dataloader "2.1.0" + "@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.13": - version "7.3.18" - resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.3.18.tgz#fba541ebe58cda6c0913f693cbc8ec75a4a0f97d" - integrity sha512-DK0YjsJWKkLF6HQYuuqiDwMr9rwRojm8yR/T+J8vXCOR4ndYa1EvUm9wRHPhxHVOYeptO2u+APoWNEhuMN9Hbw== + 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.4.4" - "@graphql-tools/utils" "9.2.0" + "@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.25": - version "9.0.25" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-9.0.25.tgz#bdfdb6cba67e4c01993c0545733b3d00563f6c1f" - integrity sha512-M7DMrPx8uEjXUshkki0ufcL//9Dj12eR3vykvteFB6odYL9cX5dhZC9l1D2IdQRuHzLMskhkhRtfnXRoa82KTA== +"@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.16" - "@graphql-tools/executor" "0.0.13" - "@graphql-tools/schema" "9.0.15" - "@graphql-tools/utils" "9.2.0" - dataloader "2.1.0" - tslib "~2.5.0" - value-or-promise "1.0.12" + "@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.9": - version "0.0.9" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.9.tgz#ba709b38ec7e83d7a0d4c2b5b9d6bc925907a030" - integrity sha512-S323OGzc8TQHOw8n7pFSl1+oG5pzhQhXRmgW6sAvA1F79FLjQ95TltEa6jSH7Jqw+tZobMyylJ13CQ1zFDjBPg== +"@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.0" + "@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.0" + ws "8.12.1" -"@graphql-tools/executor-http@0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-0.1.4.tgz#350f498c9516c75a8093ef34438dc53eadd5f669" - integrity sha512-6NGxLA9Z/cSOLExxfgddXqoS9JHr0QzvC4YmrjeMz533eW/SDnCf+4803PxkLi0j5CUTUPBnt9hC79l1AD2rZQ== +"@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.0" - "@repeaterjs/repeater" "3.0.4" - "@whatwg-node/fetch" "0.6.5" - dset "3.1.2" + "@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" + meros "^1.2.1" tslib "^2.4.0" - value-or-promise "1.0.12" + value-or-promise "^1.0.12" -"@graphql-tools/executor-legacy-ws@0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.7.tgz#d3d6255ab0b6f6b8487adbda70c2711fdb4f5ac4" - integrity sha512-tSBJE/uv/r0iQjsU16QZkRLLCT0cmVWPqn8NVuAp3yqEeYlU7bzf38L4wNYTn46OHIYElFxXBFsGgMdyvrQLzg== +"@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.0" + "@graphql-tools/utils" "9.2.1" "@types/ws" "^8.0.0" isomorphic-ws "5.0.0" tslib "^2.4.0" - ws "8.12.0" + ws "8.12.1" -"@graphql-tools/executor@0.0.13": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-0.0.13.tgz#29bc084d273822f1189bce5b64cfdae0c89bc333" - integrity sha512-bZ7QdUV5URLCjD/WuDkvyROYoDVoueTN5W1PatkcN949lwIwEKXUW6y3gRSpiZjXw8IH4/NmN3xPk10OT1emRw== +"@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.0" - "@graphql-typed-document-node/core" "3.1.1" + "@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/git-loader@^7.2.13": - version "7.2.17" - resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-7.2.17.tgz#34ecfce400da0c7b66b3f9abd9641c3724714698" - integrity sha512-VbJQEgjy3oH0IQvkCJFKsIatep9Qv8mToBf0QSMXvS9fZkLM5wwTM4KPtw0Loim/1BAAnomBpHy6I4kiwqYU4A== + version "7.2.20" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-7.2.20.tgz#b17917c89be961c272bfbf205dcf32287247494b" + integrity sha512-D/3uwTzlXxG50HI8BEixqirT4xiUp6AesTdfotRXAs2d4CT9wC6yuIWOHkSBqgI1cwKWZb6KXZr467YPS5ob1w== dependencies: - "@graphql-tools/graphql-tag-pluck" "7.4.4" - "@graphql-tools/utils" "9.2.0" + "@graphql-tools/graphql-tag-pluck" "7.5.0" + "@graphql-tools/utils" "9.2.1" is-glob "4.0.3" micromatch "^4.0.4" tslib "^2.4.0" unixify "^1.0.0" "@graphql-tools/github-loader@^7.3.20": - version "7.3.24" - resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-7.3.24.tgz#3bfbb0480d79acefb7d496c2afb681658ed15a2d" - integrity sha512-URlH4tJFk/a97tIFTzAZuQTiFiQrwKjr0fKGohbyKMMycBf82XZ6F199PZP3GtigNmzTqV/vTkf1VLTJU97jRw== + version "7.3.27" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-7.3.27.tgz#77a2fbaeb7bf5f8edc4a865252ecb527a5399e01" + integrity sha512-fFFC35qenyhjb8pfcYXKknAt0CXP5CkQYtLfJXgTXSgBjIsfAVMrqxQ/Y0ejeM19XNF/C3VWJ7rE308yOX6ywA== dependencies: - "@ardatan/sync-fetch" "0.0.1" - "@graphql-tools/graphql-tag-pluck" "7.4.4" - "@graphql-tools/utils" "9.2.0" - "@whatwg-node/fetch" "^0.6.0" + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/graphql-tag-pluck" "^7.4.6" + "@graphql-tools/utils" "^9.2.1" + "@whatwg-node/fetch" "^0.8.0" tslib "^2.4.0" "@graphql-tools/graphql-file-loader@^7.3.7", "@graphql-tools/graphql-file-loader@^7.5.0": - version "7.5.15" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.15.tgz#60b94400bbcb9b285a4434aa91186b8ad97bd6df" - integrity sha512-K6yOfKkQdXQRBl+UY4FzGdoSzGG09GLPZv4q7OFp8do16CXhaxAI+kmJvsvrutSyBfLETPTkCHtzFmdRmTeLpg== + 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.16" - "@graphql-tools/utils" "9.2.0" + "@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.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.4.4.tgz#16f8f7c5c5579f98106c58473b65806f2839da8a" - integrity sha512-yHIEcapR/kVSrn4W4Nf3FYpJKPcoGvJbdbye8TnW3dD5GkG4UqVnKuyqFvQPOhgqXKbloFZqUhNqEuyqxqIPRw== +"@graphql-tools/graphql-tag-pluck@7.5.0", "@graphql-tools/graphql-tag-pluck@^7.4.6": + 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.0" + "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" -"@graphql-tools/import@6.7.16": - version "6.7.16" - resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.7.16.tgz#5383db75b8fd173788d1c307084cdc6fcf0d8880" - integrity sha512-m07u+8YsBtKg5w5BG04KFTd59PCAPMAy5Dv/NlR4zCiH/Zbpy5PoetokCZKDrFHYUzjPlm8r//vfCG+JTvHw7g== +"@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.0" + "@graphql-tools/utils" "9.2.1" resolve-from "5.0.0" tslib "^2.4.0" "@graphql-tools/json-file-loader@^7.3.7", "@graphql-tools/json-file-loader@^7.4.1": - version "7.4.16" - resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.4.16.tgz#f2ca1e162ddee1424b39078c74c14b6bd9d177bf" - integrity sha512-9MsqpwIrCx0l880V0dud01DhkwYwqCIlZlCA3bN+TExWa9U3aZhyPO/5BWQU6W52wKk61TvyN6agUa+f4R7jVQ== + version "7.4.17" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.4.17.tgz#3f08e74ab1a3534c02dc97875acc7f15aa460011" + integrity sha512-KOSTP43nwjPfXgas90rLHAFgbcSep4nmiYyR9xRVz4ZAmw8VYHcKhOLTSGylCAzi7KUfyBXajoW+6Z7dQwdn3g== dependencies: - "@graphql-tools/utils" "9.2.0" + "@graphql-tools/utils" "9.2.1" globby "^11.0.3" tslib "^2.4.0" unixify "^1.0.0" "@graphql-tools/load@^7.5.5", "@graphql-tools/load@^7.8.0": - version "7.8.11" - resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.8.11.tgz#b9026dd15729dec1e4c318c67d0d3036b583fd1f" - integrity sha512-pVn3fYP/qZ3m2NE86gSexyZpEmvTSUe+OIRfWBM60a4L/SycMxgVfYB5+PyDCzruFZg/didIG3v7RfPlZ7zNTQ== + 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.15" - "@graphql-tools/utils" "9.2.0" + "@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.17", "@graphql-tools/merge@^8.2.6": - version "8.3.17" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.17.tgz#d7e184a296eb455c1550ab95991c5a2f68ea16a4" - integrity sha512-CLzz49lc6BavPhH9gPRm0sJeNA7kC/tF/jLUTQsyef6xj82Jw3rqIJ9PE+bk1cqPCOG01WLOfquBu445OMDO2g== +"@graphql-tools/merge@8.3.18", "@graphql-tools/merge@^8.2.6": + 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.0" + "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" "@graphql-tools/prisma-loader@^7.2.49": - version "7.2.60" - resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.2.60.tgz#333138cb9ba2bfef1132cbf4b90003f3aa669069" - integrity sha512-6C/Hicwu/luLlaIqSud3YHJ1HbrIsZ0jHfxWju9aWs3dJLSwRv8Lgw1eHSoWFDEZjc+zNETYNe9GgUwt4BBZzQ== + version "7.2.64" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-7.2.64.tgz#e9fc85054b15a22a16c8e69ad4f9543da30c0164" + integrity sha512-W8GfzfBKiBSIEgw+/nJk6zUlF6k/jterlNoFhM27mBsbeMtWxKnm1+gEU6KA0N1PNEdq2RIa2W4AfVfVBl2GgQ== dependencies: - "@graphql-tools/url-loader" "7.17.9" - "@graphql-tools/utils" "9.2.0" + "@graphql-tools/url-loader" "7.17.13" + "@graphql-tools/utils" "9.2.1" "@types/js-yaml" "^4.0.0" "@types/json-stable-stringify" "^1.0.32" "@types/jsonwebtoken" "^9.0.0" @@ -393,58 +394,58 @@ tslib "^2.4.0" yaml-ast-parser "^0.0.43" -"@graphql-tools/schema@9.0.15", "@graphql-tools/schema@^9.0.0": - version "9.0.15" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.15.tgz#6632765e0281a6c890c7ea6865f13c10bc98fc1b" - integrity sha512-p2DbpkOBcsi+yCEjwoS+r4pJ5z+3JjlJdhbPkCwC4q8lGf5r93dVYrExOrqGKTU5kxLXI/mxabSxcunjNIsDIg== +"@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.17" - "@graphql-tools/utils" "9.2.0" + "@graphql-tools/merge" "8.3.18" + "@graphql-tools/utils" "9.2.1" tslib "^2.4.0" value-or-promise "1.0.12" -"@graphql-tools/url-loader@7.17.9", "@graphql-tools/url-loader@^7.13.2", "@graphql-tools/url-loader@^7.9.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.17.9.tgz#5a79a3bce2926f72f1e4c6ee7ed8a3312454d39b" - integrity sha512-qAXQ9Tr/Am2hEelGVLCfO/YOyCMzCd4FyWMRRqcoMYIaK91arIb5X13pgILD28SUN+6H3NDsx7fgq/Z/OhwGrQ== +"@graphql-tools/url-loader@7.17.13", "@graphql-tools/url-loader@^7.13.2", "@graphql-tools/url-loader@^7.9.7": + 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.25" - "@graphql-tools/executor-graphql-ws" "0.0.9" - "@graphql-tools/executor-http" "0.1.4" - "@graphql-tools/executor-legacy-ws" "0.0.7" - "@graphql-tools/utils" "9.2.0" - "@graphql-tools/wrap" "9.3.4" + "@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.6.0" - isomorphic-ws "5.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" + ws "^8.12.0" -"@graphql-tools/utils@9.2.0", "@graphql-tools/utils@^9.0.0", "@graphql-tools/utils@^9.1.1": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.0.tgz#d74d0376231c0e8bf897a715fafaf53d0f6bf06c" - integrity sha512-s3lEG1iYkyYEnKCWrIFECX3XH2wmZvbg6Ir3udCvIDynq+ydaO7JQXobclpPtwSJtjlS353haF//6V7mnBQ4bg== +"@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/wrap@9.3.4": - version "9.3.4" - resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-9.3.4.tgz#67c1e78ac22a076dbe4be60bf716dec2c39d2102" - integrity sha512-MJY6lZqi+j96izjOYOLk5fys34oiLt7U34SQ4Wd6V/sy1utVMbh2H7XiZAuDJ38JIKmr72qN7kLgNcnNOxXjHQ== +"@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.25" - "@graphql-tools/schema" "9.0.15" - "@graphql-tools/utils" "9.2.0" + "@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", "@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== "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" @@ -478,7 +479,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.9": +"@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== @@ -534,15 +535,15 @@ tslib "^2.4.1" webcrypto-core "^1.7.4" -"@repeaterjs/repeater@3.0.4": +"@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== -"@solidity-parser/parser@^0.14.5": - version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" - integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== +"@solidity-parser/parser@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.15.0.tgz#1d359be40be84f174dd616ccfadcf43346c6bf63" + integrity sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w== dependencies: antlr4ts "^0.5.0-alpha.4" @@ -589,9 +590,9 @@ "@types/node" "*" "@types/node@*": - version "18.11.19" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.19.tgz#35e26df9ec441ab99d73e99e9aca82935eea216d" - integrity sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw== + version "18.14.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.1.tgz#90dad8476f1e42797c49d6f8b69aaf9f876fc69f" + integrity sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ== "@types/parse-json@^4.0.0": version "4.0.0" @@ -605,49 +606,51 @@ dependencies: "@types/node" "*" -"@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.6.5": - version "0.6.5" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.6.5.tgz#ff96288e9a6295faafac79f13e3b3fd831cad11f" - integrity sha512-3XQ78RAMX8Az0LlUqMoGM3jbT+FE0S+IKr4yiTiqzQ5S/pNxD52K/kFLcLQiEbL+3rkk/glCHqjxF1QI5155Ig== - dependencies: - "@peculiar/webcrypto" "^1.4.0" - "@whatwg-node/node-fetch" "0.0.1" - busboy "^1.6.0" - urlpattern-polyfill "^6.0.2" - web-streams-polyfill "^3.2.1" - "@whatwg-node/fetch@^0.6.0": - version "0.6.7" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.6.7.tgz#ddfa97d9498b6e6147532272b4867b8c0638e914" - integrity sha512-n29y5RtM7pmH9VXFC4flV0Kv0VZIoLJcncDki/bTpxC525EFLze5JR9l+WmPYBNfLQgMtDti30ANuOmbETeubw== + version "0.6.9" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.6.9.tgz#6cc694cc0378e27b8dfed427c5bf633eda6972b9" + integrity sha512-JfrBCJdMu9n9OARc0e/hPHcD98/8Nz1CKSdGYDg6VbObDkV/Ys30xe5i/wPOatYbxuvatj1kfWeHf7iNX3i17w== dependencies: "@peculiar/webcrypto" "^1.4.0" - "@whatwg-node/node-fetch" "0.0.3" + "@whatwg-node/node-fetch" "^0.0.5" busboy "^1.6.0" urlpattern-polyfill "^6.0.2" web-streams-polyfill "^3.2.1" -"@whatwg-node/node-fetch@0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.0.1.tgz#ffad65f3f8b73d6d2c2e8b179d557a5863b0db13" - integrity sha512-dMbh604yf2jl37IzvYGA6z3heQg3dMzlqoNsiNToe46SVmKusfJXGf4KYIuiJTzh9mEEu/uVF//QakUfsLJpwA== +"@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: - "@whatwg-node/events" "0.0.2" - busboy "1.6.0" + "@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.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.0.5.tgz#bebf18891088e5e2fc449dea8d1bc94af5ec38df" + integrity sha512-hbccmaSZaItdsRuBKBEEhLoO+5oXJPxiyd0kG2xXd0Dh3Rt+vZn4pADHxuSiSHLd9CM+S2z4+IxlEGbWUgiz9g== + dependencies: + "@whatwg-node/events" "^0.0.2" + busboy "^1.6.0" tslib "^2.3.1" -"@whatwg-node/node-fetch@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.0.3.tgz#ca5dd28925571fb61e72d27d095b4c2145408975" - integrity sha512-kUFCR5Qf8n5FYqhk5PzEi8WoCoP89MhlvZzDnoKcCjne8VM5rW8bjJMnSO/4oMHLIN+hqHD1pDeN63xmmpmtIA== +"@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" + "@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" acorn-walk@^8.1.1: @@ -800,7 +803,7 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@1.6.0, busboy@^1.6.0: +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== @@ -1037,10 +1040,10 @@ cross-fetch@^3.1.5: dependencies: node-fetch "2.6.7" -dataloader@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.1.0.tgz#c69c538235e85e7ac6c6c444bae8ecabf5de9df7" - integrity sha512-qTcEYLen3r7ojZNgVUaRggOI+KM7jrKxXeSHhogh/TWxYMeONEMqY+hmkobiYQozsGIyg9OYVzO4ZIfoB4I0pQ== +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== debounce@^1.2.0: version "1.2.1" @@ -1096,7 +1099,7 @@ dotenv@^16.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -dset@3.1.2: +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== @@ -1149,6 +1152,11 @@ extract-files@^9.0.0: resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== +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-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -1160,6 +1168,20 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +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-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" @@ -1422,7 +1444,7 @@ isomorphic-fetch@^3.0.0: node-fetch "^2.6.1" whatwg-fetch "^3.4.1" -isomorphic-ws@5.0.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== @@ -1569,7 +1591,7 @@ 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: +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== @@ -1753,18 +1775,23 @@ pinst@^3.0.0: integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw== prettier-plugin-solidity@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.1.tgz#4d3375b85f97812ffcbe48d5a8b3fe914d69c91f" - integrity sha512-uD24KO26tAHF+zMN2nt1OUzfknzza5AgxjogQQrMLZc7j8xiQrDoNWNeOlfFC0YLTwo12CLD10b9niLyP6AqXg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.2.tgz#452be4df925a4b16a974a04235839c9f56c2d10d" + integrity sha512-KC5oNbFJfyBaFiO0kl56J6AXnDmr9tUlBV1iqo864x4KQrKYKaBZvW9jhT2oC0NHoNp7/GoMJNxqL8pp8k7C/g== dependencies: - "@solidity-parser/parser" "^0.14.5" + "@solidity-parser/parser" "^0.15.0" semver "^7.3.8" solidity-comments-extractor "^0.0.7" prettier@^2.7.1: - 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== + +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== pvtsutils@^1.3.2: version "1.3.2" @@ -1784,9 +1811,9 @@ queue-microtask@^1.2.2: integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== readable-stream@^3.4.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" @@ -2064,7 +2091,7 @@ ts-node@^10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -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: +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" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -2117,7 +2144,7 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -value-or-promise@1.0.12, value-or-promise@^1.0.11: +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== @@ -2135,9 +2162,9 @@ web-streams-polyfill@^3.2.1: integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== webcrypto-core@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.5.tgz#c02104c953ca7107557f9c165d194c6316587ca4" - integrity sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A== + 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" @@ -2181,10 +2208,10 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -ws@8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" - integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== +ws@8.12.1, ws@^8.12.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== y18n@^5.0.5: version "5.0.8" @@ -2212,9 +2239,9 @@ yargs-parser@^21.1.1: integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.0.0: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + 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"