From a0affdaa4d7e1c7b3491281b7e70aaf190b61a6f Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Thu, 14 Jul 2022 13:16:50 +0300 Subject: [PATCH] Added contract helpers for minter, sg721 & whitelist --- .env.example | 2 +- components/Anchor.tsx | 2 + components/AnchorButton.tsx | 2 + components/Button.tsx | 5 +- components/LinkTabs.data.ts | 14 +- components/Sidebar.tsx | 3 +- .../cw721/base/ExecuteCombobox.hooks.ts | 7 - .../contracts/cw721/base/ExecuteCombobox.tsx | 92 -- contexts/collection.ts | 56 + contexts/contracts.tsx | 46 +- contracts/cw721/base/contract.ts | 458 -------- contracts/cw721/base/useContract.ts | 73 -- contracts/minter/contract.ts | 256 +++++ contracts/{cw721/base => minter}/index.ts | 0 contracts/minter/useContract.ts | 98 ++ contracts/sg721/contract.ts | 434 ++++++++ contracts/sg721/index.ts | 2 + contracts/sg721/useContract.ts | 73 ++ contracts/whitelist/contract.ts | 201 ++++ contracts/whitelist/index.ts | 2 + contracts/whitelist/useContract.ts | 83 ++ env.d.ts | 2 +- package.json | 1 + pages/collection/index.tsx | 1 + pages/collection/upload.tsx | 315 ++++++ pages/contracts/cw721/base/execute.tsx | 148 --- pages/contracts/cw721/base/index.tsx | 1 - pages/contracts/cw721/base/instantiate.tsx | 113 -- pages/contracts/cw721/base/query.tsx | 140 --- pages/contracts/index.tsx | 5 - pages/contracts/upload.tsx | 117 --- pages/index.tsx | 2 +- tailwind.config.js | 22 +- utils/contracts/cw721/base/execute.ts | 170 --- utils/contracts/cw721/base/query.ts | 90 -- utils/isValidFile.ts | 45 + utils/sort.ts | 21 + yarn.lock | 978 +++++++++++++++++- 38 files changed, 2615 insertions(+), 1465 deletions(-) delete mode 100644 components/contracts/cw721/base/ExecuteCombobox.hooks.ts delete mode 100644 components/contracts/cw721/base/ExecuteCombobox.tsx create mode 100644 contexts/collection.ts delete mode 100644 contracts/cw721/base/contract.ts delete mode 100644 contracts/cw721/base/useContract.ts create mode 100644 contracts/minter/contract.ts rename contracts/{cw721/base => minter}/index.ts (100%) create mode 100644 contracts/minter/useContract.ts create mode 100644 contracts/sg721/contract.ts create mode 100644 contracts/sg721/index.ts create mode 100644 contracts/sg721/useContract.ts create mode 100644 contracts/whitelist/contract.ts create mode 100644 contracts/whitelist/index.ts create mode 100644 contracts/whitelist/useContract.ts create mode 100644 pages/collection/index.tsx create mode 100644 pages/collection/upload.tsx delete mode 100644 pages/contracts/cw721/base/execute.tsx delete mode 100644 pages/contracts/cw721/base/index.tsx delete mode 100644 pages/contracts/cw721/base/instantiate.tsx delete mode 100644 pages/contracts/cw721/base/query.tsx delete mode 100644 pages/contracts/index.tsx delete mode 100644 pages/contracts/upload.tsx delete mode 100644 utils/contracts/cw721/base/execute.ts delete mode 100644 utils/contracts/cw721/base/query.ts create mode 100644 utils/isValidFile.ts create mode 100644 utils/sort.ts diff --git a/.env.example b/.env.example index 473e90b..ea62d0f 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,6 @@ APP_VERSION=0.1.0 -NEXT_PUBLIC_CW721_BASE_CODE_ID=5 +NEXT_PUBLIC_SG721_CODE_ID=5 NEXT_PUBLIC_API_URL=https:// NEXT_PUBLIC_BLOCK_EXPLORER_URL=https://testnet-explorer.publicawesome.dev/stargaze diff --git a/components/Anchor.tsx b/components/Anchor.tsx index 1009f21..d032537 100644 --- a/components/Anchor.tsx +++ b/components/Anchor.tsx @@ -33,3 +33,5 @@ export function Anchor({ children, external, href = '', rel = '', ...rest }: Anc function trimHttp(str: string) { return str.replace(/https?:\/\//, '') } + +export default Anchor diff --git a/components/AnchorButton.tsx b/components/AnchorButton.tsx index 09d2999..f1a5b0e 100644 --- a/components/AnchorButton.tsx +++ b/components/AnchorButton.tsx @@ -34,3 +34,5 @@ export const AnchorButton = (props: AnchorButtonProps) => { ) } + +export default AnchorButton diff --git a/components/Button.tsx b/components/Button.tsx index 75331cb..ecba0e9 100644 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -22,8 +22,8 @@ export const Button = (props: ButtonProps) => { 'group flex items-center py-2 space-x-2 font-bold focus:ring', isWide ? 'px-8' : 'px-4', { - 'bg-plumbus-60 hover:bg-plumbus-50 rounded ': variant === 'solid', - 'bg-plumbus/10 hover:bg-plumbus/20 rounded border border-plumbus': variant === 'outline', + 'bg-plumbus hover:bg-plumbus-light rounded ': variant === 'solid', + 'bg-plumbus hover:bg-plumbus-light rounded border border-plumbus-dark': variant === 'outline', 'opacity-50 cursor-not-allowed pointer-events-none': isDisabled, 'animate-pulse cursor-wait pointer-events-none': isLoading, }, @@ -39,3 +39,4 @@ export const Button = (props: ButtonProps) => { ) } +export default Button diff --git a/components/LinkTabs.data.ts b/components/LinkTabs.data.ts index 40a6614..5017c4a 100644 --- a/components/LinkTabs.data.ts +++ b/components/LinkTabs.data.ts @@ -1,19 +1,19 @@ import type { LinkTabProps } from './LinkTab' -export const cw721BaseLinkTabs: LinkTabProps[] = [ +export const sg721LinkTabs: LinkTabProps[] = [ { title: 'Instantiate', - description: `Create a new CW721 Base contract`, - href: '/contracts/cw721/base/instantiate', + description: `Create a new SG721 contract`, + href: '/contracts/sg721/instantiate', }, { title: 'Query', - description: `Dispatch queries with your CW721 Base contract`, - href: '/contracts/cw721/base/query', + description: `Dispatch queries with your SG721 contract`, + href: '/contracts/sg721/query', }, { title: 'Execute', - description: `Execute CW721 Base contract actions`, - href: '/contracts/cw721/base/execute', + description: `Execute SG721 contract actions`, + href: '/contracts/sg721/execute', }, ] diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx index 058044c..0c5e1a6 100644 --- a/components/Sidebar.tsx +++ b/components/Sidebar.tsx @@ -9,8 +9,7 @@ import { SidebarLayout } from './SidebarLayout' import { WalletLoader } from './WalletLoader' const routes = [ - { text: 'Create Collection', href: `/collection/create` }, - { text: 'CW721 Base', href: `/contracts/cw721/base` }, + { text: 'Create Collection', href: `/collection/` }, ] export const Sidebar = () => { diff --git a/components/contracts/cw721/base/ExecuteCombobox.hooks.ts b/components/contracts/cw721/base/ExecuteCombobox.hooks.ts deleted file mode 100644 index 7fedcf9..0000000 --- a/components/contracts/cw721/base/ExecuteCombobox.hooks.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useState } from 'react' -import type { ExecuteListItem } from 'utils/contracts/cw721/base/execute' - -export const useExecuteComboboxState = () => { - const [value, setValue] = useState(null) - return { value, onChange: (item: ExecuteListItem) => setValue(item) } -} diff --git a/components/contracts/cw721/base/ExecuteCombobox.tsx b/components/contracts/cw721/base/ExecuteCombobox.tsx deleted file mode 100644 index 3da56ff..0000000 --- a/components/contracts/cw721/base/ExecuteCombobox.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { Combobox, Transition } from '@headlessui/react' -import clsx from 'clsx' -import { FormControl } from 'components/FormControl' -import { matchSorter } from 'match-sorter' -import { Fragment, useState } from 'react' -import { FaChevronDown, FaInfoCircle } from 'react-icons/fa' -import type { ExecuteListItem } from 'utils/contracts/cw721/base/execute' -import { EXECUTE_LIST } from 'utils/contracts/cw721/base/execute' - -export interface ExecuteComboboxProps { - value: ExecuteListItem | null - onChange: (item: ExecuteListItem) => void -} - -export const ExecuteCombobox = ({ value, onChange }: ExecuteComboboxProps) => { - const [search, setSearch] = useState('') - - const filtered = - search === '' ? EXECUTE_LIST : matchSorter(EXECUTE_LIST, search, { keys: ['id', 'name', 'description'] }) - - return ( - -
- val?.name ?? ''} - id="message-type" - onChange={(event) => setSearch(event.target.value)} - placeholder="Select message type" - /> - - - {({ open }) => - - setSearch('')} as={Fragment}> - - {filtered.length < 1 && ( - - Message type not found. - - )} - {filtered.map((entry) => ( - - clsx('flex relative flex-col py-2 px-4 space-y-1 cursor-pointer', { 'bg-plumbus-70': active }) - } - value={entry} - > - {entry.name} - {entry.description} - - ))} - - -
- - {value && ( -
-
- -
- {value.description} -
- )} -
- ) -} diff --git a/contexts/collection.ts b/contexts/collection.ts new file mode 100644 index 0000000..8f78686 --- /dev/null +++ b/contexts/collection.ts @@ -0,0 +1,56 @@ +import create from 'zustand' + +export const useCollectionStore = create(() => ({ + name: 'Example', + base_token_uri: + 'ipfs://bafkreiei4e437w3hqf5vy4yqroukx22fag7akbajygettvylzqg6shvkfq', + description: 'Lorem', + image: + 'ipfs://bafybeigi3bwpvyvsmnbj46ra4hyffcxdeaj6ntfk5jpic5mx27x6ih2qvq/images/1.png', + num_tokens: 10, + per_address_limit: 1, + start_time: '1650982532000000000', + symbol: 'EXP', + unit_price: 50, + whitelist: '', +})) + +export const setName = (value: string) => { + useCollectionStore.setState({ name: value }) +} + +export const setBaseTokenUri = (value: string) => { + useCollectionStore.setState({ base_token_uri: value }) +} + +export const setDescription = (value: string) => { + useCollectionStore.setState({ description: value }) +} + +export const setImage = (value: string) => { + useCollectionStore.setState({ image: value }) +} + +export const setNumTokens = (value: number) => { + useCollectionStore.setState({ num_tokens: value }) +} + +export const setPerAddressLimit = (value: number) => { + useCollectionStore.setState({ per_address_limit: value }) +} + +export const setStartTime = (value: string) => { + useCollectionStore.setState({ start_time: value }) +} + +export const setSymbol = (value: string) => { + useCollectionStore.setState({ symbol: value }) +} + +export const setUnitPrice = (value: number) => { + useCollectionStore.setState({ unit_price: value }) +} + +export const setWhitelist = (value: string) => { + useCollectionStore.setState({ whitelist: value }) +} diff --git a/contexts/contracts.tsx b/contexts/contracts.tsx index 6876be5..d1f74b1 100644 --- a/contexts/contracts.tsx +++ b/contexts/contracts.tsx @@ -1,22 +1,30 @@ -import type { UseCW721BaseContractProps } from 'contracts/cw721/base' -import { useCW721BaseContract } from 'contracts/cw721/base' -import type { ReactNode } from 'react' -import { useEffect } from 'react' -import type { State } from 'zustand' -import create from 'zustand' +import { useMinterContract, UseMinterContractProps } from 'contracts/minter' +import { useSG721Contract, UseSG721ContractProps } from 'contracts/sg721' +import { + useWhiteListContract, + useWhiteListContractProps, +} from 'contracts/whitelist' + +import { Fragment, ReactNode, useEffect, VFC } from 'react' +import create, { State } from 'zustand' + /** * Contracts store type definitions */ export interface ContractsStore extends State { - cw721Base: UseCW721BaseContractProps | null + sg721: UseSG721ContractProps | null + minter: UseMinterContractProps | null + whitelist: useWhiteListContractProps | null } /** * Contracts store default values as a separate variable for reusability */ export const defaultValues: ContractsStore = { - cw721Base: null, + sg721: null, + minter: null, + whitelist: null, } /** @@ -32,28 +40,34 @@ export const useContracts = create(() => ({ */ export const ContractsProvider = ({ children }: { children: ReactNode }) => { return ( - <> + {children} - + ) } /** * Contracts store subscriptions (side effects) * - * TODO: refactor all contract logics to zustand store + * @todo refactor all contract logics to zustand store */ -const ContractsSubscription = () => { - const cw721Base = useCW721BaseContract() +const ContractsSubscription: VFC = () => { + const sg721 = useSG721Contract() + const minter = useMinterContract() + const whitelist = useWhiteListContract() + useEffect(() => { useContracts.setState({ - cw721Base, + sg721, + minter, + whitelist, }) }, [ - cw721Base, - // + sg721, + minter, + whitelist, ]) return null diff --git a/contracts/cw721/base/contract.ts b/contracts/cw721/base/contract.ts deleted file mode 100644 index f266b62..0000000 --- a/contracts/cw721/base/contract.ts +++ /dev/null @@ -1,458 +0,0 @@ -import type { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate' -import { toBase64, toUtf8 } from '@cosmjs/encoding' -import type { Coin } from '@cosmjs/proto-signing' -// import { isDeliverTxFailure } from '@cosmjs/stargate' -// import { TxRaw } from 'cosmjs-types/cosmos/tx/v1beta1/tx' -// import { MsgExecuteContract } from 'cosmjs-types/cosmwasm/wasm/v1/tx' -import { getExecuteFee } from 'utils/fees' - -const jsonToBinary = (json: Record): string => { - return toBase64(toUtf8(JSON.stringify(json))) -} - -type Expiration = { at_height: number } | { at_time: string } | { never: object } - -// interface ExecuteWithSignDataResponse { -// signed: TxRaw -// txHash: string -// } - -export interface InstantiateResponse { - readonly contractAddress: string - readonly transactionHash: string -} - -export interface CW721BaseInstance { - readonly contractAddress: string - - // Queries - ownerOf: (tokenId: string, includeExpired?: boolean) => Promise - approval: (tokenId: string, spender: string, includeExpired?: boolean) => Promise - approvals: (tokenId: string, includeExpired?: boolean) => Promise - allOperators: (owner: string, includeExpired?: boolean, startAfter?: string, limit?: number) => Promise - numTokens: () => Promise - contractInfo: () => Promise - nftInfo: (tokenId: string) => Promise - allNftInfo: (tokenId: string, includeExpired?: boolean) => Promise - tokens: (owner: string, startAfter?: string, limit?: number) => Promise - allTokens: (startAfter?: string, limit?: number) => Promise - minter: () => Promise - - // Execute - transferNft: (recipient: string, tokenId: string) => Promise - sendNft: (contract: string, tokenId: string, msg: Record) => Promise - approve: (spender: string, tokenId: string, expires?: Expiration) => Promise - revoke: (spender: string, tokenId: string) => Promise - approveAll: (operator: string, expires?: Expiration) => Promise - revokeAll: (operator: string) => Promise - mint: (tokenId: string, owner: string, tokenUri?: string) => Promise - burn: (tokenId: string) => Promise -} - -export interface CW721BaseMessages { - transferNft: (contractAddress: string, recipient: string, tokenId: string) => TransferNftMessage - sendNft: (contractAddress: string, contract: string, tokenId: string, msg: Record) => SendNFtMessage - approve: (contractAddress: string, spender: string, tokenId: string, expires?: Expiration) => ApproveMessage - revoke: (contractAddress: string, spender: string, tokenId: string) => RevokeMessage - approveAll: (contractAddress: string, operator: string, expires?: Expiration) => ApproveAllMessage - revokeAll: (contractAddress: string, operator: string) => RevokeAllMessage - mint: (contractAddress: string, tokenId: string, owner: string, tokenUri?: string) => MintMessage - burn: (contractAddress: string, tokenId: string) => BurnMessage -} - -export interface TransferNftMessage { - sender: string - contract: string - msg: { - transfer_nft: { - recipient: string - token_id: string - } - } - funds: Coin[] -} - -export interface SendNFtMessage { - sender: string - contract: string - msg: { - send_nft: { - contract: string - token_id: string - msg: Record - } - } - funds: Coin[] -} - -export interface ApproveMessage { - sender: string - contract: string - msg: { - approve: { - spender: string - token_id: string - expires?: Expiration - } - } - funds: Coin[] -} - -export interface RevokeMessage { - sender: string - contract: string - msg: { - revoke: { - spender: string - token_id: string - } - } - funds: Coin[] -} - -export interface ApproveAllMessage { - sender: string - contract: string - msg: { - approve_all: { - operator: string - expires?: Expiration - } - } - funds: Coin[] -} - -export interface RevokeAllMessage { - sender: string - contract: string - msg: { - revoke_all: { - operator: string - } - } - funds: Coin[] -} - -export interface MintMessage { - sender: string - contract: string - msg: { - mint: { - token_id: string - owner: string - token_uri?: string - } - } - funds: Coin[] -} - -export interface BurnMessage { - sender: string - contract: string - msg: { - burn: { - token_id: string - } - } - funds: Coin[] -} - -export interface CW721BaseContract { - instantiate: ( - senderAddress: string, - codeId: number, - initMsg: Record, - label: string, - admin?: string, - ) => Promise - - use: (contractAddress: string) => CW721BaseInstance - - messages: () => CW721BaseMessages -} - -export const CW721Base = (client: SigningCosmWasmClient, txSigner: string): CW721BaseContract => { - const fee = getExecuteFee() - - const use = (contractAddress: string): CW721BaseInstance => { - const ownerOf = async (tokenId: string, includeExpired?: boolean) => { - return client.queryContractSmart(contractAddress, { - owner_of: { token_id: tokenId, include_expired: includeExpired }, - }) - } - - const approval = async (tokenId: string, spender: string, includeExpired?: boolean) => { - return client.queryContractSmart(contractAddress, { - approval: { token_id: tokenId, spender, include_expired: includeExpired }, - }) - } - - const approvals = async (tokenId: string, includeExpired?: boolean) => { - return client.queryContractSmart(contractAddress, { - approvals: { token_id: tokenId, include_expired: includeExpired }, - }) - } - - const allOperators = async (owner: string, includeExpired?: boolean, startAfter?: string, limit?: number) => { - return client.queryContractSmart(contractAddress, { - all_operators: { owner, include_expired: includeExpired, start_after: startAfter, limit }, - }) - } - - const numTokens = async () => { - return client.queryContractSmart(contractAddress, { - num_tokens: {}, - }) - } - - const contractInfo = async () => { - return client.queryContractSmart(contractAddress, { - contract_info: {}, - }) - } - - const nftInfo = async (tokenId: string) => { - return client.queryContractSmart(contractAddress, { - nft_info: { token_id: tokenId }, - }) - } - - const allNftInfo = async (tokenId: string, includeExpired?: boolean) => { - return client.queryContractSmart(contractAddress, { - all_nft_info: { token_id: tokenId, include_expired: includeExpired }, - }) - } - - const tokens = async (owner: string, startAfter?: string, limit?: number) => { - return client.queryContractSmart(contractAddress, { - tokens: { owner, start_after: startAfter, limit }, - }) - } - - const allTokens = async (startAfter?: string, limit?: number) => { - return client.queryContractSmart(contractAddress, { - all_tokens: { start_after: startAfter, limit }, - }) - } - - const minter = async () => { - return client.queryContractSmart(contractAddress, { - minter: {}, - }) - } - - const transferNft = async (recipient: string, tokenId: string): Promise => { - const result = await client.execute( - txSigner, - contractAddress, - { transfer_nft: { recipient, token_id: tokenId } }, - fee, - ) - return result.transactionHash - } - - const sendNft = async (contract: string, tokenId: string, msg: Record): Promise => { - const result = await client.execute( - txSigner, - contractAddress, - { send_nft: { contract, token_id: tokenId, msg: jsonToBinary(msg) } }, - fee, - ) - return result.transactionHash - } - - const approve = async (spender: string, tokenId: string, expires?: Expiration): Promise => { - const result = await client.execute( - txSigner, - contractAddress, - { approve: { spender, token_id: tokenId, expires } }, - fee, - ) - return result.transactionHash - } - - const revoke = async (spender: string, tokenId: string): Promise => { - const result = await client.execute(txSigner, contractAddress, { revoke: { spender, token_id: tokenId } }, fee) - return result.transactionHash - } - - const approveAll = async (operator: string, expires?: Expiration): Promise => { - const result = await client.execute(txSigner, contractAddress, { approve_all: { operator, expires } }, fee) - return result.transactionHash - } - - const revokeAll = async (operator: string): Promise => { - const result = await client.execute(txSigner, contractAddress, { revoke_all: { operator } }, fee) - return result.transactionHash - } - - const mint = async (tokenId: string, owner: string, tokenUri?: string): Promise => { - const result = await client.execute( - txSigner, - contractAddress, - { mint: { token_id: tokenId, owner, token_uri: tokenUri } }, - fee, - ) - return result.transactionHash - } - - const burn = async (tokenId: string): Promise => { - const result = await client.execute(txSigner, contractAddress, { burn: { token_id: tokenId } }, fee) - return result.transactionHash - } - - return { - contractAddress, - ownerOf, - approval, - approvals, - allOperators, - numTokens, - contractInfo, - nftInfo, - allNftInfo, - tokens, - allTokens, - minter, - transferNft, - sendNft, - approve, - revoke, - approveAll, - revokeAll, - mint, - burn, - } - } - - const instantiate = async ( - senderAddress: string, - codeId: number, - initMsg: Record, - label: string, - admin?: string, - ): Promise => { - const result = await client.instantiate(senderAddress, codeId, initMsg, label, 'auto', { - memo: '', - admin, - }) - - return { - contractAddress: result.contractAddress, - transactionHash: result.transactionHash, - } - } - - const messages = () => { - const transferNft = (contractAddress: string, recipient: string, tokenId: string): TransferNftMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - transfer_nft: { recipient, token_id: tokenId }, - }, - funds: [], - } - } - - const sendNft = ( - contractAddress: string, - contract: string, - tokenId: string, - msg: Record, - ): SendNFtMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - send_nft: { contract, token_id: tokenId, msg }, - }, - funds: [], - } - } - - const approve = ( - contractAddress: string, - spender: string, - tokenId: string, - expires?: Expiration, - ): ApproveMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - approve: { spender, token_id: tokenId, expires }, - }, - funds: [], - } - } - - const revoke = (contractAddress: string, spender: string, tokenId: string): RevokeMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - revoke: { spender, token_id: tokenId }, - }, - funds: [], - } - } - - const approveAll = (contractAddress: string, operator: string, expires?: Expiration): ApproveAllMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - approve_all: { operator, expires }, - }, - funds: [], - } - } - - const revokeAll = (contractAddress: string, operator: string): RevokeAllMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - revoke_all: { operator }, - }, - funds: [], - } - } - - const mint = (contractAddress: string, tokenId: string, owner: string, tokenUri?: string): MintMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - mint: { token_id: tokenId, owner, token_uri: tokenUri }, - }, - funds: [], - } - } - - const burn = (contractAddress: string, tokenId: string): BurnMessage => { - return { - sender: txSigner, - contract: contractAddress, - msg: { - burn: { token_id: tokenId }, - }, - funds: [], - } - } - - return { - transferNft, - sendNft, - approve, - revoke, - approveAll, - revokeAll, - mint, - burn, - } - } - - return { instantiate, use, messages } -} diff --git a/contracts/cw721/base/useContract.ts b/contracts/cw721/base/useContract.ts deleted file mode 100644 index 10e4f7a..0000000 --- a/contracts/cw721/base/useContract.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { useWallet } from 'contexts/wallet' -import { useCallback, useEffect, useState } from 'react' - -import type { CW721BaseContract, CW721BaseInstance, CW721BaseMessages } from './contract' -import { CW721Base as initContract } from './contract' - -interface InstantiateResponse { - readonly contractAddress: string - readonly transactionHash: string -} - -export interface UseCW721BaseContractProps { - instantiate: ( - codeId: number, - initMsg: Record, - label: string, - admin?: string, - ) => Promise - use: (customAddress: string) => CW721BaseInstance | undefined - updateContractAddress: (contractAddress: string) => void - messages: () => CW721BaseMessages | undefined -} - -export function useCW721BaseContract(): UseCW721BaseContractProps { - const wallet = useWallet() - - const [address, setAddress] = useState('') - const [CW721Base, setCW721Base] = useState() - - useEffect(() => { - setAddress(localStorage.getItem('contract_address') || '') - }, []) - - useEffect(() => { - const cw721BaseContract = initContract(wallet.getClient(), wallet.address) - setCW721Base(cw721BaseContract) - }, [wallet]) - - const updateContractAddress = (contractAddress: string) => { - setAddress(contractAddress) - } - - const instantiate = useCallback( - (codeId: number, initMsg: Record, label: string, admin?: string): Promise => { - return new Promise((resolve, reject) => { - if (!CW721Base) { - reject(new Error('Contract is not initialized.')) - return - } - CW721Base.instantiate(wallet.address, codeId, initMsg, label, admin).then(resolve).catch(reject) - }) - }, - [CW721Base, wallet], - ) - - const use = useCallback( - (customAddress = ''): CW721BaseInstance | undefined => { - return CW721Base?.use(address || customAddress) - }, - [CW721Base, address], - ) - - const messages = useCallback((): CW721BaseMessages | undefined => { - return CW721Base?.messages() - }, [CW721Base]) - - return { - instantiate, - use, - updateContractAddress, - messages, - } -} diff --git a/contracts/minter/contract.ts b/contracts/minter/contract.ts new file mode 100644 index 0000000..608671f --- /dev/null +++ b/contracts/minter/contract.ts @@ -0,0 +1,256 @@ +import { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate' +import { Coin } from '@cosmjs/proto-signing' +import { logs } from '@cosmjs/stargate' +import { Timestamp } from '@stargazezone/types/contracts/minter/shared-types' + +export interface InstantiateResponse { + readonly contractAddress: string + readonly transactionHash: string + readonly logs: readonly logs.Log[] +} + +export type RoyalityInfo = { + payment_address: string + share: string +} + +export interface MinterInstance { + readonly contractAddress: string + + //Query + getConfig: () => Promise + getMintableNumTokens: () => Promise + getStartTime: () => Promise + getMintPrice: () => Promise + getMintCount: (address: string) => Promise + + //Execute + mint: (senderAddress: string) => Promise + setWhitelist: (senderAddress: string, whitelist: string) => Promise + updateStartTime: (senderAddress: string, time: Timestamp) => Promise + updatePerAddressLimit: ( + senderAddress: string, + per_address_limit: number + ) => Promise + mintTo: (senderAddress: string, recipient: string) => Promise + mintFor: ( + senderAddress: string, + token_id: number, + recipient: string + ) => Promise + withdraw: (senderAddress: string) => Promise +} + +export interface MinterContract { + instantiate: ( + senderAddress: string, + codeId: number, + initMsg: Record, + label: string, + admin?: string, + funds?: Coin[] + ) => Promise + + use: (contractAddress: string) => MinterInstance +} + +export const minter = (client: SigningCosmWasmClient): MinterContract => { + const use = (contractAddress: string): MinterInstance => { + //Query + const getConfig = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + config: {}, + }) + return res + } + + const getMintableNumTokens = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + mintable_num_tokens: {}, + }) + return res + } + + const getStartTime = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + start_time: {}, + }) + return res + } + + const getMintPrice = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + mint_price: {}, + }) + return res + } + + const getMintCount = async (address: string): Promise => { + const res = await client.queryContractSmart(contractAddress, { + mint_count: { address }, + }) + return res + } + + //Execute + const mint = async (senderAddress: string): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + mint: {}, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const setWhitelist = async ( + senderAddress: string, + whitelist: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + set_whitelist: { whitelist }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const updateStartTime = async ( + senderAddress: string, + time: Timestamp + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + update_start_time: { time }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const updatePerAddressLimit = async ( + senderAddress: string, + per_address_limit: number + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + update_per_address_limit: { per_address_limit }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const mintTo = async ( + senderAddress: string, + recipient: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + mint_to: { recipient }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const mintFor = async ( + senderAddress: string, + token_id: number, + recipient: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + mint_for: { token_id, recipient }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const withdraw = async (senderAddress: string): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + withdraw: {}, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + return { + contractAddress, + getConfig, + getMintableNumTokens, + getStartTime, + getMintPrice, + getMintCount, + mint, + setWhitelist, + updateStartTime, + updatePerAddressLimit, + mintTo, + mintFor, + withdraw, + } + } + + const instantiate = async ( + senderAddress: string, + codeId: number, + initMsg: Record, + label: string, + admin?: string, + funds?: Coin[] + ): Promise => { + console.log(funds) + const result = await client.instantiate( + senderAddress, + codeId, + initMsg, + label, + 'auto', + { + funds, + admin, + } + ) + + return { + contractAddress: result.contractAddress, + transactionHash: result.transactionHash, + logs: result.logs, + } + } + + return { use, instantiate } +} diff --git a/contracts/cw721/base/index.ts b/contracts/minter/index.ts similarity index 100% rename from contracts/cw721/base/index.ts rename to contracts/minter/index.ts diff --git a/contracts/minter/useContract.ts b/contracts/minter/useContract.ts new file mode 100644 index 0000000..e02903f --- /dev/null +++ b/contracts/minter/useContract.ts @@ -0,0 +1,98 @@ +import { Coin } from '@cosmjs/proto-signing' +import { logs } from '@cosmjs/stargate' +import { useWallet } from 'contexts/wallet' +import { useCallback, useEffect, useState } from 'react' + +import { + minter as initContract, + MinterContract, + MinterInstance, +} from './contract' + +/*export interface InstantiateResponse { + /** The address of the newly instantiated contract *-/ + readonly contractAddress: string + readonly logs: readonly logs.Log[] + /** Block height in which the transaction is included *-/ + readonly height: number + /** Transaction hash (might be used as transaction ID). Guaranteed to be non-empty upper-case hex *-/ + readonly transactionHash: string + readonly gasWanted: number + readonly gasUsed: number +}*/ + +interface InstantiateResponse { + readonly contractAddress: string + readonly transactionHash: string + readonly logs: readonly logs.Log[] +} + +export interface UseMinterContractProps { + instantiate: ( + codeId: number, + initMsg: Record, + label: string, + admin?: string, + funds?: Coin[] + ) => Promise + use: (customAddress: string) => MinterInstance | undefined + updateContractAddress: (contractAddress: string) => void + getContractAddress: () => string | undefined +} + +export function useMinterContract(): UseMinterContractProps { + const wallet = useWallet() + + const [address, setAddress] = useState('') + const [minter, setMinter] = useState() + + useEffect(() => { + setAddress(localStorage.getItem('contract_address') || '') + }, []) + + useEffect(() => { + if (wallet.initialized) { + const getMinterBaseInstance = async (): Promise => { + const MinterBaseContract = initContract(wallet.getClient()) + setMinter(MinterBaseContract) + } + + getMinterBaseInstance() + } + }, [wallet]) + + const updateContractAddress = (contractAddress: string) => { + setAddress(contractAddress) + } + + const instantiate = useCallback( + (codeId, initMsg, label, admin?, funds?): Promise => { + return new Promise((resolve, reject) => { + if (!minter) return reject('Contract is not initialized.') + minter + .instantiate(wallet.address, codeId, initMsg, label, admin, funds) + .then(resolve) + .catch(reject) + }) + }, + [minter, wallet] + ) + + const use = useCallback( + (customAddress = ''): MinterInstance | undefined => { + return minter?.use(address || customAddress) + }, + [minter, address] + ) + + const getContractAddress = (): string | undefined => { + return address + } + + return { + instantiate, + use, + updateContractAddress, + getContractAddress, + } +} diff --git a/contracts/sg721/contract.ts b/contracts/sg721/contract.ts new file mode 100644 index 0000000..5e104ee --- /dev/null +++ b/contracts/sg721/contract.ts @@ -0,0 +1,434 @@ +import { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate' +import { Coin } from '@cosmjs/stargate' + +export interface InstantiateResponse { + readonly contractAddress: string + readonly transactionHash: string +} + +export type Expiration = + | { at_height: number } + | { at_time: string } + | { never: {} } + +export interface SG721Instance { + readonly contractAddress: string + + // queries + getOwnerOf: ( + token_id: string, + include_expired: boolean | null + ) => Promise + + getApproval: ( + token_id: string, + spender: string, + include_expired: boolean | null + ) => Promise + + getApprovals: ( + token_id: string, + include_expired: boolean | null + ) => Promise + + getAllOperators: ( + owner: string, + include_expired: boolean | null, + start_after: string | null, + limit: number | null + ) => Promise + + getNumTokens: () => Promise + + getContractInfo: () => Promise + + getNftInfo: (token_id: string) => Promise + + getAllNftInfo: ( + token_id: string, + include_expired: boolean | null + ) => Promise + + getTokens: ( + owner: string, + start_after: string | null, + limit: number | null + ) => Promise + + getAllTokens: ( + start_after: string | null, + limit: number | null + ) => Promise + + getMinter: () => Promise + + getCollectionInfo: () => Promise + + //Execute + transferNft: ( + senderAddress: string, + recipient: string, + token_id: string + ) => Promise + /// Send is a base message to transfer a token to a contract and trigger an action + /// on the receiving contract. + sendNft: ( + senderAddress: string, + contract: string, + token_id: string, + msg: string //Binary + ) => Promise + /// Allows operator to transfer / send the token from the owner's account. + /// If expiration is set, then this allowance has a time/height limit + approve: ( + senderAddress: string, + spender: string, + token_id: string, + expires: Expiration | null + ) => Promise + /// Remove previously granted Approval + revoke: ( + senderAddress: string, + spender: string, + token_id: string + ) => Promise + /// Allows operator to transfer / send any token from the owner's account. + /// If expiration is set, then this allowance has a time/height limit + approveAll: ( + senderAddress: string, + operator: string, + expires: Expiration | null + ) => Promise + /// Remove previously granted ApproveAll permission + revokeAll: (senderAddress: string, operator: string) => Promise + /// Mint a new NFT, can only be called by the contract minter + mint: (senderAddress: string, msg: string) => Promise //MintMsg + + /// Burn an NFT the sender has access to + burn: (senderAddress: string, token_id: string) => Promise +} + +export interface SG721Contract { + instantiate: ( + senderAddress: string, + codeId: number, + initMsg: Record, + label: string, + funds: Coin[], + admin?: string + ) => Promise + + use: (contractAddress: string) => SG721Instance +} + +export const SG721 = (client: SigningCosmWasmClient): SG721Contract => { + const use = (contractAddress: string): SG721Instance => { + const encode = (str: string): string => + Buffer.from(str, 'binary').toString('base64') + + const getOwnerOf = async ( + token_id: string, + include_expired: boolean | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + owner_of: { token_id, include_expired }, + }) + return res + } + + const getApproval = async ( + token_id: string, + spender: string, + include_expired: boolean | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + approval: { token_id, spender, include_expired }, + }) + return res + } + + const getApprovals = async ( + token_id: string, + include_expired: boolean | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + approvals: { token_id, include_expired }, + }) + return res + } + + const getAllOperators = async ( + owner: string, + include_expired: boolean | null, + start_after: string | null, + limit: number | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + all_operators: { owner, include_expired, start_after, limit }, + }) + return res + } + + const getNumTokens = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + num_tokens: {}, + }) + return res + } + + const getContractInfo = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + contract_info: {}, + }) + return res + } + + const getNftInfo = async (token_id: string): Promise => { + const res = await client.queryContractSmart(contractAddress, { + nft_info: { token_id }, + }) + return res + } + + const getAllNftInfo = async ( + token_id: string, + include_expired: boolean | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + all_nft_info: { token_id, include_expired }, + }) + return res + } + + const getTokens = async ( + owner: string, + start_after: string | null, + limit: number | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + tokens: { owner, start_after, limit }, + }) + return res + } + + const getAllTokens = async ( + start_after: string | null, + limit: number | null + ): Promise => { + const res = await client.queryContractSmart(contractAddress, { + all_tokens: { start_after, limit }, + }) + return res + } + + const getMinter = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + minter: {}, + }) + return res + } + + const getCollectionInfo = async (): Promise => { + const res = await client.queryContractSmart(contractAddress, { + collection_info: {}, + }) + return res + } + + //Execute + const transferNft = async ( + senderAddress: string, + recipient: string, + token_id: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + transfer_nft: { recipient, token_id }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const sendNft = async ( + senderAddress: string, + contract: string, + token_id: string, + msg: string //Binary + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + send_nft: { contract, token_id, msg: encode(msg) }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const approve = async ( + senderAddress: string, + spender: string, + token_id: string, + expires: Expiration | null + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + approve: { spender, token_id, expires }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const revoke = async ( + senderAddress: string, + spender: string, + token_id: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + revoke: { spender, token_id }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const approveAll = async ( + senderAddress: string, + operator: string, + expires: Expiration | null + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + approve_all: { operator, expires }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const revokeAll = async ( + senderAddress: string, + operator: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + revoke_all: { operator }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const mint = async ( + senderAddress: string, + msg: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + mint: { msg }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + const burn = async ( + senderAddress: string, + token_id: string + ): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { + burn: { token_id }, + }, + 'auto', + '' + ) + + return res.transactionHash + } + + return { + contractAddress, + getOwnerOf, + getApproval, + getApprovals, + getAllOperators, + getNumTokens, + getContractInfo, + getNftInfo, + getAllNftInfo, + getTokens, + getAllTokens, + getMinter, + getCollectionInfo, + transferNft, + sendNft, + approve, + revoke, + approveAll, + revokeAll, + mint, + burn, + } + } + + const instantiate = async ( + senderAddress: string, + codeId: number, + initMsg: Record, + label: string, + funds: Coin[], + admin?: string + ): Promise => { + const result = await client.instantiate( + senderAddress, + codeId, + initMsg, + label, + 'auto', + { + funds, + memo: '', + admin, + } + ) + return { + contractAddress: result.contractAddress, + transactionHash: result.transactionHash, + } + } + + return { use, instantiate } +} diff --git a/contracts/sg721/index.ts b/contracts/sg721/index.ts new file mode 100644 index 0000000..6dc6461 --- /dev/null +++ b/contracts/sg721/index.ts @@ -0,0 +1,2 @@ +export * from './contract' +export * from './useContract' diff --git a/contracts/sg721/useContract.ts b/contracts/sg721/useContract.ts new file mode 100644 index 0000000..d29ca6c --- /dev/null +++ b/contracts/sg721/useContract.ts @@ -0,0 +1,73 @@ +import { useWallet } from 'contexts/wallet' +import { Coin } from 'cosmwasm' +import { useCallback, useEffect, useState } from 'react' + +import { SG721 as initContract, SG721Contract, SG721Instance } from './contract' + +interface InstantiateResponse { + readonly contractAddress: string + readonly transactionHash: string +} + +export interface UseSG721ContractProps { + instantiate: ( + codeId: number, + initMsg: Record, + label: string, + funds: Coin[], + admin?: string + ) => Promise + use: (customAddress: string) => SG721Instance | undefined + updateContractAddress: (contractAddress: string) => void +} + +export function useSG721Contract(): UseSG721ContractProps { + const wallet = useWallet() + + const [address, setAddress] = useState('') + const [SG721, setSG721] = useState() + + useEffect(() => { + setAddress(localStorage.getItem('contract_address') || '') + }, []) + + useEffect(() => { + if (wallet.initialized) { + const getSG721Instance = async (): Promise => { + const SG721Contract = initContract(wallet.getClient()) + setSG721(SG721Contract) + } + + getSG721Instance() + } + }, [wallet]) + + const updateContractAddress = (contractAddress: string) => { + setAddress(contractAddress) + } + + const instantiate = useCallback( + (codeId, initMsg, label, admin?): Promise => { + return new Promise((resolve, reject) => { + if (!SG721) return reject('Contract is not initialized.') + SG721.instantiate(wallet.address, codeId, initMsg, label, admin) + .then(resolve) + .catch(reject) + }) + }, + [SG721, wallet] + ) + + const use = useCallback( + (customAddress = ''): SG721Instance | undefined => { + return SG721?.use(address || customAddress) + }, + [SG721, address] + ) + + return { + instantiate, + use, + updateContractAddress, + } +} diff --git a/contracts/whitelist/contract.ts b/contracts/whitelist/contract.ts new file mode 100644 index 0000000..012aa6a --- /dev/null +++ b/contracts/whitelist/contract.ts @@ -0,0 +1,201 @@ +import { SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate' +import { Coin } from '@cosmjs/proto-signing' + +type Expiration = { at_height: number } | { at_time: string } | { never: {} } + +export interface InstantiateResponse { + readonly contractAddress: string + readonly transactionHash: string +} + +export interface ConfigResponse { + readonly num_members: number + readonly per_address: number + readonly member_limit: number + readonly start_time: string + readonly end_time: string + readonly unit_price: Coin + readonly is_active: boolean +} +export interface WhiteListInstance { + readonly contractAddress: string + //Query + hasStarted: () => Promise + hasEnded: () => Promise + isActive: () => Promise + members: (limit: number, startAfter?: string) => Promise + hasMember: (member: string) => Promise + config: () => Promise + + //Execute + updateStartTime: (startTime: string) => Promise + updateEndTime: (endTime: string) => Promise + addMembers: (to_add: string[]) => Promise + removeMembers: (to_remove: string[]) => Promise + updatePerAddressLimit: (limit: number) => Promise + increaseMemberLimit: (limit: number) => Promise +} + +export interface WhiteListContract { + instantiate: ( + senderAddress: string, + codeId: number, + initMsg: Record, + label: string, + admin?: string, + funds?: Coin[] + ) => Promise + + use: (contractAddress: string) => WhiteListInstance +} + +export const WhiteList = ( + client: SigningCosmWasmClient, + senderAddress: string +): WhiteListContract => { + const use = (contractAddress: string): WhiteListInstance => { + console.log(client, 'client') + console.log(senderAddress, 'senderAddress') + ///QUERY START + const hasStarted = async (): Promise => { + return client.queryContractSmart(contractAddress, { has_started: {} }) + } + + const hasEnded = async (): Promise => { + return client.queryContractSmart(contractAddress, { has_ended: {} }) + } + + const isActive = async (): Promise => { + return client.queryContractSmart(contractAddress, { is_active: {} }) + } + + const members = async ( + limit: number, + startAfter?: string + ): Promise => { + return client.queryContractSmart(contractAddress, { + members: { limit, start_after: startAfter }, + }) + } + + const hasMember = async (member: string): Promise => { + return client.queryContractSmart(contractAddress, { + has_member: { member }, + }) + } + + const config = async (): Promise => { + return client.queryContractSmart(contractAddress, { + config: {}, + }) + } + /// QUERY END + /// EXECUTE START + const updateStartTime = async (startTime: string): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { update_start_time: startTime }, + 'auto', + 'memo' + ) + return res.transactionHash + } + + const updateEndTime = async (endTime: string): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { update_end_time: endTime }, + 'auto' + ) + return res.transactionHash + } + + const addMembers = async (to_add: string[]): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { add_members: to_add }, + 'auto' + ) + return res.transactionHash + } + + const removeMembers = async (to_remove: string[]): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { remove_members: to_remove }, + 'auto' + ) + return res.transactionHash + } + + const updatePerAddressLimit = async (limit: number): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { update_per_address_limit: limit }, + 'auto' + ) + return res.transactionHash + } + + const increaseMemberLimit = async (limit: number): Promise => { + const res = await client.execute( + senderAddress, + contractAddress, + { increase_member_limit: limit }, + 'auto' + ) + return res.transactionHash + } + /// EXECUTE END + + return { + contractAddress, + updateStartTime, + updateEndTime, + addMembers, + removeMembers, + updatePerAddressLimit, + increaseMemberLimit, + hasStarted, + hasEnded, + isActive, + members, + hasMember, + config, + } + } + + const instantiate = async ( + senderAddress: string, + codeId: number, + initMsg: Record, + label: string, + admin?: string, + funds?: Coin[] + ): Promise => { + console.log('Funds:' + funds) + const result = await client.instantiate( + senderAddress, + codeId, + initMsg, + label, + 'auto', + { + funds, + admin, + } + ) + + return { + contractAddress: result.contractAddress, + transactionHash: result.transactionHash, + } + } + + return { use, instantiate } +} diff --git a/contracts/whitelist/index.ts b/contracts/whitelist/index.ts new file mode 100644 index 0000000..6dc6461 --- /dev/null +++ b/contracts/whitelist/index.ts @@ -0,0 +1,2 @@ +export * from './contract' +export * from './useContract' diff --git a/contracts/whitelist/useContract.ts b/contracts/whitelist/useContract.ts new file mode 100644 index 0000000..bb5ab48 --- /dev/null +++ b/contracts/whitelist/useContract.ts @@ -0,0 +1,83 @@ +import { Coin } from '@cosmjs/proto-signing' +import { useWallet } from 'contexts/wallet' +import { useCallback, useEffect, useState } from 'react' + +import { WhiteList } from './contract' +import { + InstantiateResponse, + WhiteList as initContract, + WhiteListContract, + WhiteListInstance, +} from './contract' + +export interface useWhiteListContractProps { + instantiate: ( + codeId: number, + initMsg: Record, + label: string, + admin?: string, + funds?: Coin[] + ) => Promise + + use: (customAddress: string) => WhiteListInstance | undefined + updateContractAddress: (contractAddress: string) => void +} + +export function useWhiteListContract(): useWhiteListContractProps { + const wallet = useWallet() + + const [address, setAddress] = useState('') + const [WhiteList, setWhiteList] = useState() + + useEffect(() => { + setAddress(localStorage.getItem('contract_address') || '') + }, []) + + useEffect(() => { + if (wallet.initialized) { + const getWhiteListInstance = async (): Promise => { + const client = wallet.getClient() + const whiteListContract = initContract(client, wallet.address) + setWhiteList(whiteListContract) + } + + getWhiteListInstance() + } + }, [wallet]) + + const updateContractAddress = (contractAddress: string) => { + setAddress(contractAddress) + } + + const instantiate = useCallback( + (codeId, initMsg, label, admin?, funds?): Promise => { + return new Promise((resolve, reject) => { + if (!WhiteList) return reject('Contract is not initialized.') + WhiteList.instantiate( + wallet.address, + codeId, + initMsg, + label, + admin, + funds + ) + .then(resolve) + .catch(reject) + }) + }, + [WhiteList, wallet] + ) + + const use = useCallback( + (customAddress = ''): WhiteListInstance | undefined => { + return WhiteList?.use(address || customAddress) + }, + [WhiteList] + ) + + return { + instantiate, + use, + updateContractAddress, + } +} diff --git a/env.d.ts b/env.d.ts index bd3fba4..f527c1b 100644 --- a/env.d.ts +++ b/env.d.ts @@ -14,7 +14,7 @@ declare namespace NodeJS { declare interface ProcessEnv { readonly APP_VERSION: string - readonly NEXT_PUBLIC_CW721_BASE_CODE_ID: string + readonly NEXT_PUBLIC_SG721_CODE_ID: string readonly NEXT_PUBLIC_API_URL: string readonly NEXT_PUBLIC_BLOCK_EXPLORER_URL: string diff --git a/package.json b/package.json index 5eb8d0d..79d73fc 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "match-sorter": "^6", "next": "^12", "next-seo": "^4", + "nft.storage": "^6.3.0", "react": "^18", "react-datetime-picker": "^3", "react-dom": "^18", diff --git a/pages/collection/index.tsx b/pages/collection/index.tsx new file mode 100644 index 0000000..6e7a0cd --- /dev/null +++ b/pages/collection/index.tsx @@ -0,0 +1 @@ +export { default } from './upload' diff --git a/pages/collection/upload.tsx b/pages/collection/upload.tsx new file mode 100644 index 0000000..33afa8f --- /dev/null +++ b/pages/collection/upload.tsx @@ -0,0 +1,315 @@ +import clsx from 'clsx' +import Anchor from 'components/Anchor' +import AnchorButton from 'components/AnchorButton' +import Button from 'components/Button' +import { useCollectionStore } from 'contexts/collection' +import { setBaseTokenUri, setImage } from 'contexts/collection' +import { useWallet } from 'contexts/wallet' +import { NextPage } from 'next' +import { NextSeo } from 'next-seo' +import { Blob, File, NFTStorage } from 'nft.storage' +import { useEffect, useRef, useState } from 'react' +import toast from 'react-hot-toast' +import { FaArrowRight } from 'react-icons/fa' +import { withMetadata } from 'utils/layout' +import { links } from 'utils/links' +import { naturalCompare } from 'utils/sort' + +const UploadPage: NextPage = () => { + const wallet = useWallet() + + const baseTokenURI = useCollectionStore().base_token_uri + const [baseImageURI, setBaseImageURI] = useState('') + const [uploadMethod, setUploadMethod] = useState('New') + + const [imageFiles, setImageFiles] = useState([]) + const [metadataFiles, setMetadataFiles] = useState([]) + const [updatedMetadataFiles, setUpdatedMetadataFiles] = useState([]) + let imageFilesArray: File[] = [] + let metadataFilesArray: File[] = [] + let updatedMetadataFilesArray: File[] = [] + + const imageFilesRef = useRef(null) + const metadataFilesRef = useRef(null) + + const NFT_STORAGE_TOKEN = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDJBODk5OGI4ZkE2YTM1NzMyYmMxQTRDQzNhOUU2M0Y2NUM3ZjA1RWIiLCJpc3MiOiJuZnQtc3RvcmFnZSIsImlhdCI6MTY1NTE5MTcwNDQ2MiwibmFtZSI6IlRlc3QifQ.IbdV_26bkPHSdd81sxox5AoG-5a4CCEY4aCrdbCXwAE' + const client = new NFTStorage({ token: NFT_STORAGE_TOKEN }) + + const handleChangeBaseTokenUri = (event: { + target: { value: React.SetStateAction } + }) => { + setBaseTokenUri(event.target.value.toString()) + } + + const handleChangeImage = (event: { + target: { value: React.SetStateAction } + }) => { + setImage(event.target.value.toString()) + } + + const selectImages = async () => { + imageFilesArray = [] + let reader: FileReader + if (!imageFilesRef.current?.files) return toast.error('No files selected.') + for (let i = 0; i < imageFilesRef.current.files.length; i++) { + reader = new FileReader() + reader.onload = function (e) { + if (!e.target?.result) return toast.error('Error parsing file.') + if (!imageFilesRef.current?.files) + return toast.error('No files selected.') + let imageFile = new File( + [e.target.result], + imageFilesRef.current.files[i].name, + { type: 'image/jpg' } + ) + imageFilesArray.push(imageFile) + if (i === imageFilesRef.current.files.length - 1) { + imageFilesArray.sort((a, b) => naturalCompare(a.name, b.name)) + console.log(imageFilesArray) + selectMetadata() + } + } + if (!imageFilesRef.current.files) return toast.error('No file selected.') + reader.readAsArrayBuffer(imageFilesRef.current.files[i]) + //reader.onloadend = function (e) { ... + } + } + const selectMetadata = async () => { + metadataFilesArray = [] + + let reader: FileReader + if (!metadataFilesRef.current?.files) + return toast.error('No files selected.') + for (let i = 0; i < metadataFilesRef.current.files.length; i++) { + reader = new FileReader() + reader.onload = function (e) { + if (!e.target?.result) return toast.error('Error parsing file.') + if (!metadataFilesRef.current?.files) + return toast.error('No files selected.') + let metadataFile = new File( + [e.target.result], + metadataFilesRef.current.files[i].name, + { type: 'image/jpg' } + ) + metadataFilesArray.push(metadataFile) + if (i === metadataFilesRef.current.files.length - 1) { + metadataFilesArray.sort((a, b) => naturalCompare(a.name, b.name)) + console.log(metadataFilesArray) + updateMetadata() + } + + } + if (!metadataFilesRef.current?.files) + return toast.error('No file selected.') + reader.readAsText(metadataFilesRef.current.files[i], 'utf8') + //reader.onloadend = function (e) { ... + } + } + const updateMetadata = async () => { + const imageURI = await client.storeDirectory(imageFilesArray) + console.log(imageURI) + updatedMetadataFilesArray = [] + let reader: FileReader + for (let i = 0; i < metadataFilesArray.length; i++) { + reader = new FileReader() + reader.onload = function (e) { + let metadataJSON = JSON.parse(e.target?.result as string) + metadataJSON.image = `ipfs://${imageURI}/${imageFilesArray[i].name}` + let metadataFileBlob = new Blob([JSON.stringify(metadataJSON)], { + type: 'application/json', + }) + let updatedMetadataFile = new File( + [metadataFileBlob], + metadataFilesArray[i].name, + { type: 'application/json' } + ) + updatedMetadataFilesArray.push(updatedMetadataFile) + console.log(updatedMetadataFile.name + ' => ' + metadataJSON.image) + if (i === metadataFilesArray.length - 1) { + upload() + } + } + reader.readAsText(metadataFilesArray[i], 'utf8') + //reader.onloadend = function (e) { ... + } + } + const upload = async () => { + const baseTokenURI = await client.storeDirectory(updatedMetadataFilesArray) + console.log(baseTokenURI) + } + + return ( +
+ + +
+

+ Upload Assets & Metadata +

+ +

+ Make sure you check our{' '} + + documentation + {' '} + on how to create your collection +

+
+ +
+ +
+
+ { + setUploadMethod('Existing') + }} + onChange={() => { }} + checked={uploadMethod === 'Existing'} + /> + +
+
+ { + setUploadMethod('New') + }} + onChange={() => { }} + checked={uploadMethod === 'New'} + /> + +
+
+ +
+ + {uploadMethod == 'Existing' && ( +
+

+ Though Stargaze's sg721 contract allows for off-chain metadata + storage, it is recommended to use a decentralized storage solution, + such as IPFS.
You may head over to{' '} + + NFT Storage + {' '} + and upload your assets & metadata manually to get a base URI for + your collection. +

+
+ + +
+
+ + +
+
+ )} + {uploadMethod == 'New' && ( +
+ +
+ { }} + ref={imageFilesRef} + type="file" + multiple + /> +
+ + +
+ { }} + ref={metadataFilesRef} + type="file" + multiple + /> +
+ +
+ +
+
+ )} +
+ ) +} + +export default withMetadata(UploadPage, { center: false }) diff --git a/pages/contracts/cw721/base/execute.tsx b/pages/contracts/cw721/base/execute.tsx deleted file mode 100644 index f5b0947..0000000 --- a/pages/contracts/cw721/base/execute.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { Button } from 'components/Button' -import { ContractPageHeader } from 'components/ContractPageHeader' -import { ExecuteCombobox } from 'components/contracts/cw721/base/ExecuteCombobox' -import { useExecuteComboboxState } from 'components/contracts/cw721/base/ExecuteCombobox.hooks' -import { FormControl } from 'components/FormControl' -import { AddressInput } from 'components/forms/FormInput' -import { useInputState } from 'components/forms/FormInput.hooks' -import { JsonTextArea } from 'components/forms/FormTextArea' -import { JsonPreview } from 'components/JsonPreview' -import { LinkTabs } from 'components/LinkTabs' -import { cw721BaseLinkTabs } from 'components/LinkTabs.data' -import { TransactionHash } from 'components/TransactionHash' -import { useContracts } from 'contexts/contracts' -import { useWallet } from 'contexts/wallet' -import type { NextPage } from 'next' -import { NextSeo } from 'next-seo' -import type { FormEvent } from 'react' -import { useMemo, useState } from 'react' -import { toast } from 'react-hot-toast' -import { FaArrowRight } from 'react-icons/fa' -import { useMutation } from 'react-query' -import type { DispatchExecuteArgs } from 'utils/contracts/cw721/base/execute' -import { dispatchExecute, isEitherType, previewExecutePayload } from 'utils/contracts/cw721/base/execute' -import { parseJson } from 'utils/json' -import { withMetadata } from 'utils/layout' -import { links } from 'utils/links' - -const CW721BaseExecutePage: NextPage = () => { - const { cw721Base: contract } = useContracts() - const wallet = useWallet() - const [lastTx, setLastTx] = useState('') - - const comboboxState = useExecuteComboboxState() - const type = comboboxState.value?.id - - const contractState = useInputState({ - id: 'contract-address', - name: 'contract-address', - title: 'CW721 Contract Address', - subtitle: 'Address of the CW721 contract', - }) - - const messageState = useInputState({ - id: 'message', - name: 'message', - title: 'Message', - subtitle: 'Message to execute on the contract', - defaultValue: JSON.stringify({ key: 'value' }, null, 2), - }) - - const recipientState = useInputState({ - id: 'recipient-address', - name: 'recipient', - title: 'Recipient Address', - subtitle: 'Address of the recipient', - }) - - const tokenIdState = useInputState({ - id: 'token-id', - name: 'token-id', - title: 'Token ID', - subtitle: 'Identifier of the token', - placeholder: 'some_token_id', - }) - - const showMessageField = type === 'send_nft' - const showRecipientField = isEitherType(type, [ - 'transfer_nft', - 'send_nft', - 'approve', - 'revoke', - 'approve_all', - 'revoke_all', - 'mint', - ]) - const showTokenIdField = isEitherType(type, ['transfer_nft', 'send_nft', 'approve', 'revoke', 'mint', 'burn']) - - const messages = useMemo(() => contract?.use(contractState.value), [contract, wallet.address, contractState.value]) - const payload: DispatchExecuteArgs = { - contract: contractState.value, - messages, - msg: parseJson(messageState.value) || {}, - recipient: recipientState.value, - txSigner: wallet.address, - type, - tokenId: tokenIdState.value, - } - - const { isLoading, mutate } = useMutation( - async (event: FormEvent) => { - event.preventDefault() - if (!type) { - throw new Error('Please select message type!') - } - const txHash = await toast.promise(dispatchExecute(payload), { - error: `${type.charAt(0).toUpperCase() + type.slice(1)} execute failed!`, - loading: 'Executing message...', - success: (tx) => `Transaction ${tx} success!`, - }) - if (txHash) { - setLastTx(txHash) - } - }, - { - onError: (error) => { - console.error(error) - toast.error(String(error)) - }, - }, - ) - - return ( -
- - - - -
-
- - - {showRecipientField && } - {showTokenIdField && } - {showMessageField && } -
-
-
- - - - -
- - - -
-
-
- ) -} - -export default withMetadata(CW721BaseExecutePage, { center: false }) diff --git a/pages/contracts/cw721/base/index.tsx b/pages/contracts/cw721/base/index.tsx deleted file mode 100644 index 561b4b3..0000000 --- a/pages/contracts/cw721/base/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from './instantiate' diff --git a/pages/contracts/cw721/base/instantiate.tsx b/pages/contracts/cw721/base/instantiate.tsx deleted file mode 100644 index 4410408..0000000 --- a/pages/contracts/cw721/base/instantiate.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { Alert } from 'components/Alert' -import { Button } from 'components/Button' -import { Conditional } from 'components/Conditional' -import { ContractPageHeader } from 'components/ContractPageHeader' -import { FormGroup } from 'components/FormGroup' -import { TextInput } from 'components/forms/FormInput' -import { useInputState } from 'components/forms/FormInput.hooks' -import { JsonPreview } from 'components/JsonPreview' -import { LinkTabs } from 'components/LinkTabs' -import { cw721BaseLinkTabs } from 'components/LinkTabs.data' -import { useContracts } from 'contexts/contracts' -import { useWallet } from 'contexts/wallet' -import type { InstantiateResponse } from 'contracts/cw721/base' -import type { NextPage } from 'next' -import { NextSeo } from 'next-seo' -import type { FormEvent } from 'react' -import { toast } from 'react-hot-toast' -import { FaAsterisk } from 'react-icons/fa' -import { useMutation } from 'react-query' -import { CW721_BASE_CODE_ID } from 'utils/constants' -import { withMetadata } from 'utils/layout' -import { links } from 'utils/links' - -const CW721BaseInstantiatePage: NextPage = () => { - const wallet = useWallet() - const contract = useContracts().cw721Base - - const nameState = useInputState({ - id: 'name', - name: 'name', - title: 'Name', - placeholder: 'My Awesome CW721 Contract', - }) - - const symbolState = useInputState({ - id: 'symbol', - name: 'symbol', - title: 'Symbol', - placeholder: 'AWSM', - }) - - const minterState = useInputState({ - id: 'minter-address', - name: 'minterAddress', - title: 'Minter Address', - placeholder: 'stars1234567890abcdefghijklmnopqrstuvwxyz...', - }) - - const { data, isLoading, mutate } = useMutation( - async (event: FormEvent): Promise => { - event.preventDefault() - if (!contract) { - throw new Error('Smart contract connection failed') - } - const msg = { - name: nameState.value, - symbol: symbolState.value, - minter: minterState.value, - } - return toast.promise( - contract.instantiate(CW721_BASE_CODE_ID, msg, 'StargazeTools CW721 Base Contract', wallet.address), - { - loading: 'Instantiating contract...', - error: 'Instantiation failed!', - success: 'Instantiation success!', - }, - ) - }, - { - onError: (error) => { - toast.error(String(error)) - }, - }, - ) - - const txHash = data?.transactionHash - - return ( -
- - - - - - - Instantiate success! Here is the transaction result containing the contract address and the transaction - hash. - - -
-
- - - - - - - -
-
- -
- - ) -} - -export default withMetadata(CW721BaseInstantiatePage, { center: false }) diff --git a/pages/contracts/cw721/base/query.tsx b/pages/contracts/cw721/base/query.tsx deleted file mode 100644 index 6a27013..0000000 --- a/pages/contracts/cw721/base/query.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import clsx from 'clsx' -import { Conditional } from 'components/Conditional' -import { ContractPageHeader } from 'components/ContractPageHeader' -import { FormControl } from 'components/FormControl' -import { AddressInput } from 'components/forms/FormInput' -import { useInputState } from 'components/forms/FormInput.hooks' -import { JsonPreview } from 'components/JsonPreview' -import { LinkTabs } from 'components/LinkTabs' -import { cw721BaseLinkTabs } from 'components/LinkTabs.data' -import { useContracts } from 'contexts/contracts' -import { useWallet } from 'contexts/wallet' -import type { NextPage } from 'next' -import { useRouter } from 'next/router' -import { NextSeo } from 'next-seo' -import { useEffect, useState } from 'react' -import { toast } from 'react-hot-toast' -import { useQuery } from 'react-query' -import type { QueryType } from 'utils/contracts/cw721/base/query' -import { dispatchQuery, QUERY_LIST } from 'utils/contracts/cw721/base/query' -import { withMetadata } from 'utils/layout' -import { links } from 'utils/links' - -const CW721QueryPage: NextPage = () => { - const { cw721Base: contract } = useContracts() - const wallet = useWallet() - - const contractState = useInputState({ - id: 'contract-address', - name: 'contract-address', - title: 'CW721 contract Address', - subtitle: 'Address of the CW721 contract', - }) - const address = contractState.value - - const ownerState = useInputState({ - id: 'owner-address', - name: 'owner-address', - title: 'Owner Address', - subtitle: 'Address of the owner', - }) - const ownerAddress = ownerState.value - - const tokenIdState = useInputState({ - id: 'token-id', - name: 'token-id', - title: 'Token ID', - subtitle: 'Identifier of the token', - placeholder: 'some_token_id', - }) - const tokenId = tokenIdState.value - - const [type, setType] = useState('owner_of') - - const addressVisible = type === 'approval' || type === 'all_operators' || type === 'tokens' - const tokenVisible = - type === 'owner_of' || type === 'approval' || type === 'approvals' || type === 'nft_info' || type === 'all_nft_info' - - const { data: response } = useQuery( - [address, type, contract, wallet, ownerAddress, tokenId] as const, - async ({ queryKey }) => { - const [_address, _type, _contract, _wallet, _ownerAddress, _tokenId] = queryKey - const messages = contract?.use(_address) - // eslint-disable-next-line @typescript-eslint/no-shadow - const ownerAddress = _ownerAddress || _wallet.address - - const result = await dispatchQuery({ - ownerAddress, - tokenId, - messages, - type, - }) - return result - }, - { - placeholderData: null, - onError: (error: any) => { - toast.error(error.message) - }, - enabled: Boolean(address && type && contract && wallet), - }, - ) - - const router = useRouter() - - useEffect(() => { - if (address.length > 0) { - void router.replace({ query: { contractAddress: address } }) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [address]) - useEffect(() => { - const initial = new URL(document.URL).searchParams.get('contractAddress') - if (initial && initial.length > 0) contractState.onChange(initial) - }, []) - - return ( -
- - - - -
-
- - - - - - - - - - -
- -
-
- ) -} - -export default withMetadata(CW721QueryPage, { center: false }) diff --git a/pages/contracts/index.tsx b/pages/contracts/index.tsx deleted file mode 100644 index 4d73fc4..0000000 --- a/pages/contracts/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const Minting = () => { - return
dsadsa
-} - -export default Minting diff --git a/pages/contracts/upload.tsx b/pages/contracts/upload.tsx deleted file mode 100644 index b1e7b98..0000000 --- a/pages/contracts/upload.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import clsx from 'clsx' -import { Alert } from 'components/Alert' -import { Button } from 'components/Button' -import { Conditional } from 'components/Conditional' -import { ContractPageHeader } from 'components/ContractPageHeader' -import { JsonPreview } from 'components/JsonPreview' -import { useWallet } from 'contexts/wallet' -import type { NextPage } from 'next' -import { NextSeo } from 'next-seo' -import { useEffect, useRef, useState } from 'react' -import toast from 'react-hot-toast' -import { FaAsterisk } from 'react-icons/fa' -import { withMetadata } from 'utils/layout' - -const UploadContract: NextPage = () => { - const { getClient, address } = useWallet() - - const [loading, setLoading] = useState(false) - const [transactionResult, setTransactionResult] = useState() - const [wasmFile, setWasmFile] = useState(null) - const [wasmByteArray, setWasmByteArray] = useState(null) - - const inputFile = useRef(null) - - const onFileChange = (e: React.ChangeEvent) => { - if (!e.target.files) return - setWasmFile(e.target.files[0]) - } - - useEffect(() => { - if (wasmFile) { - const reader = new FileReader() - reader.onload = (e) => { - try { - if (!e.target?.result) return toast.error('Error parsing file.') - const byteArray = new Uint8Array(e.target.result as ArrayBuffer) - setWasmByteArray(byteArray) - } catch (error: any) { - toast.error(error.message) - } - } - reader.readAsArrayBuffer(wasmFile) - } - }, [wasmFile]) - - const upload = async () => { - try { - if (!wasmFile || !wasmByteArray) return toast.error('No file selected.') - - setLoading(true) - - const client = getClient() - - const result = await client.upload(address, wasmByteArray, 'auto') - - setTransactionResult({ - transactionHash: result.transactionHash, - codeId: result.codeId, - originalSize: result.originalSize, - compressedSize: result.compressedSize, - originalChecksum: result.originalChecksum, - compressedChecksum: result.compressedChecksum, - }) - - setLoading(false) - } catch (err: any) { - setLoading(false) - toast.error(err.message, { style: { maxWidth: 'none' } }) - } - } - - return ( -
- - -
- - - - Upload success! Here is the transaction result containing the code ID, transaction hash and other data. - - -
-
- -
- -
- -
- -
-
- ) -} - -export default withMetadata(UploadContract, { center: false }) diff --git a/pages/index.tsx b/pages/index.tsx index 9296a59..7ab2944 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -26,7 +26,7 @@ const HomePage: NextPage = () => {
Lorem ipsum dolor sit amet, consectetur adipiscing elit. diff --git a/tailwind.config.js b/tailwind.config.js index 3604ab9..f38e47c 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -8,7 +8,7 @@ module.exports = { theme: { extend: { colors: { - stargaze: { DEFAULT: '#FDC06D' }, + stargaze: { DEFAULT: '#FFA900' }, dark: { DEFAULT: '#06090B' }, gray: { DEFAULT: '#F3F6F8' }, 'dark-gray': { DEFAULT: '#191D20' }, @@ -16,16 +16,16 @@ module.exports = { neutral: colors.neutral, plumbus: { - DEFAULT: '#FFC27D', - light: '#FFC27D', - matte: '#FFC27D', - dark: '#FFC27D', + DEFAULT: '#FFA900', + light: '#FFC922', + matte: '#5D89E9', + dark: '#FFC900', 10: '#FFF0ED', - 20: '#FACBC8', + 20: '#5D89E9', 30: '#F5A7A2', - 40: '#F0827D', - 50: '#D9726F', - 60: '#C26261', + 40: '#FFA900', + 50: '#FFA900', + 60: '#FFA900', 70: '#AB5152', 80: '#944144', 90: '#7D3136', @@ -54,10 +54,10 @@ module.exports = { plugin(({ addUtilities }) => { addUtilities({ '.stargaze-gradient-bg': { - background: `linear-gradient(64.38deg, #00027D 15.06%, #FFC27D 100.6%), #252020`, + background: `linear-gradient(64.38deg, #00027D 15.06%, #7F97D2 100.6%), #252020`, }, '.stargaze-gradient-brand': { - background: `linear-gradient(102.33deg, #FFC27D 10.96%, #FFC27D 93.51%)`, + background: `linear-gradient(102.33deg, #FFC27D 10.96%, #7F97D2 93.51%)`, }, }) }), diff --git a/utils/contracts/cw721/base/execute.ts b/utils/contracts/cw721/base/execute.ts deleted file mode 100644 index 5cc69b9..0000000 --- a/utils/contracts/cw721/base/execute.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { CW721BaseInstance } from './../../../../contracts/cw721/base/contract'; -import { useCW721BaseContract } from 'contracts/cw721/base' - -export type ExecuteType = typeof EXECUTE_TYPES[number] - -export const EXECUTE_TYPES = [ - 'transfer_nft', - 'send_nft', - 'approve', - 'revoke', - 'approve_all', - 'revoke_all', - 'mint', - 'burn', -] as const - -export interface ExecuteListItem { - id: ExecuteType - name: string - description?: string -} - -export const EXECUTE_LIST: ExecuteListItem[] = [ - { - id: 'transfer_nft', - name: 'Transfer NFT', - description: `Transfer a token to an address`, - }, - { - id: 'send_nft', - name: 'Send NFT', - description: `Send a token to a contract and execute a message afterwards`, - }, - { - id: 'approve', - name: 'Approve', - description: `Allow an operator to transfer/send a given token from the owner's account`, - }, - { - id: 'revoke', - name: 'Revoke', - description: `Remove permissions of an operator from the owner's account`, - }, - { - id: 'approve_all', - name: 'Approve All', - description: `Allow an operator to transfer/send all tokens from owner's account`, - }, - { - id: 'revoke_all', - name: 'Revoke All', - description: `Remove permissions of an operator from the owner's account`, - }, - { - id: 'mint', - name: 'Mint', - description: `Mint a new token to owner's account`, - }, - { - id: 'burn', - name: 'Burn', - description: `Burn a token transaction sender has access to`, - }, -] - -export interface DispatchExecuteProps { - type: ExecuteType - [k: string]: unknown -} - -type Select = T - -/** @see {@link CW721BaseInstance} */ -export type DispatchExecuteArgs = { - contract: string - messages?: CW721BaseInstance - txSigner: string -} & ( - | { type: undefined } - | { type: Select<'transfer_nft'>; recipient: string; tokenId: string } - | { type: Select<'send_nft'>; recipient: string; tokenId: string; msg: Record } - | { type: Select<'approve'>; recipient: string; tokenId: string } - | { type: Select<'revoke'>; recipient: string; tokenId: string } - | { type: Select<'approve_all'>; recipient: string } - | { type: Select<'revoke_all'>; recipient: string } - | { type: Select<'mint'>; recipient: string; tokenId: string } - | { type: Select<'burn'>; tokenId: string } -) - -export const dispatchExecute = async (args: DispatchExecuteArgs) => { - const { messages } = args - if (!messages) { - throw new Error('cannot dispatch execute, messages is not defined') - } - switch (args.type) { - case 'transfer_nft': { - return messages.transferNft(args.recipient, args.tokenId) - } - case 'send_nft': { - return messages.sendNft(args.contract, args.tokenId, args.msg) - } - case 'approve': { - return messages.approve(args.recipient, args.tokenId) - } - case 'revoke': { - return messages.revoke(args.recipient, args.tokenId) - } - case 'approve_all': { - return messages.approveAll(args.recipient) - } - case 'revoke_all': { - return messages.revokeAll(args.recipient) - } - case 'mint': { - return messages.mint(args.tokenId, args.recipient) - } - case 'burn': { - return messages.burn(args.tokenId) - } - default: { - throw new Error('unknown execute type') - } - } -} - -export const previewExecutePayload = (args: DispatchExecuteArgs) => { - // eslint-disable-next-line react-hooks/rules-of-hooks - const { messages } = useCW721BaseContract() - switch (args.type) { - case 'transfer_nft': { - const { contract, recipient, tokenId } = args - return messages()?.transferNft(contract, recipient, tokenId) - } - case 'send_nft': { - const { contract, recipient, tokenId, msg } = args - return messages()?.sendNft(contract, recipient, tokenId, msg) - } - case 'approve': { - const { contract, recipient, tokenId } = args - return messages()?.approve(contract, recipient, tokenId) - } - case 'revoke': { - const { contract, recipient, tokenId } = args - return messages()?.revoke(contract, recipient, tokenId) - } - case 'approve_all': { - const { contract, recipient } = args - return messages()?.approveAll(contract, recipient) - } - case 'revoke_all': { - const { contract, recipient } = args - return messages()?.revokeAll(contract, recipient) - } - case 'mint': { - const { contract, recipient, tokenId } = args - return messages()?.mint(contract, tokenId, recipient) - } - case 'burn': { - const { contract, tokenId } = args - return messages()?.burn(contract, tokenId) - } - default: { - return {} - } - } -} - -export const isEitherType = (type: unknown, arr: T[]): type is T => { - return arr.some((val) => type === val) -} diff --git a/utils/contracts/cw721/base/query.ts b/utils/contracts/cw721/base/query.ts deleted file mode 100644 index 303bb46..0000000 --- a/utils/contracts/cw721/base/query.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type { CW721BaseInstance } from 'contracts/cw721/base' - -export type QueryType = typeof QUERY_TYPES[number] - -export const QUERY_TYPES = [ - 'owner_of', - 'approval', - 'approvals', - 'all_operators', - 'num_tokens', - 'contract_info', - 'nft_info', - 'all_nft_info', - 'tokens', - 'all_tokens', - 'minter', -] as const - -export interface QueryListItem { - id: QueryType - name: string - description?: string -} - -export const QUERY_LIST: QueryListItem[] = [ - { id: 'owner_of', name: 'Owner Of', description: 'View current owner of given token' }, - { id: 'approval', name: 'Approval', description: 'View address that has access to given token' }, - { id: 'approvals', name: 'Approvals', description: 'View all approvals of a given token' }, - { - id: 'all_operators', - name: 'All Operators', - description: "List all the operators that has access all of the owner's tokens", - }, - { id: 'num_tokens', name: 'Number of Tokens', description: 'View total number of tokens minted' }, - { id: 'contract_info', name: 'Contract Info', description: 'View top-level metadata of contract' }, - { id: 'nft_info', name: 'NFT Info', description: 'View metadata of a given token' }, - { id: 'all_nft_info', name: 'All NFT Info', description: 'View metadata and owner info of a given token' }, - { id: 'tokens', name: 'Tokens', description: 'View all the tokens owned by given address' }, - { id: 'all_tokens', name: 'All Tokens', description: 'List all the tokens controlled by the contract' }, - { id: 'minter', name: 'Minter', description: 'View current minter of the contract' }, -] - -export interface DispatchQueryProps { - ownerAddress: string - tokenId: string - messages: CW721BaseInstance | undefined - type: QueryType -} - -export const dispatchQuery = async (props: DispatchQueryProps) => { - const { ownerAddress, tokenId, messages, type } = props - switch (type) { - case 'owner_of': { - return messages?.ownerOf(tokenId) - } - case 'approval': { - return messages?.approval(tokenId, ownerAddress) - } - case 'approvals': { - return messages?.approvals(tokenId) - } - case 'all_operators': { - return messages?.allOperators(ownerAddress) - } - case 'num_tokens': { - return messages?.numTokens() - } - case 'contract_info': { - return messages?.contractInfo() - } - case 'nft_info': { - return messages?.nftInfo(tokenId) - } - case 'all_nft_info': { - return messages?.allNftInfo(tokenId) - } - case 'tokens': { - return messages?.tokens(ownerAddress) - } - case 'all_tokens': { - return messages?.allTokens() - } - case 'minter': { - return messages?.minter() - } - default: { - throw new Error('unknown query type') - } - } -} diff --git a/utils/isValidFile.ts b/utils/isValidFile.ts new file mode 100644 index 0000000..b12aee7 --- /dev/null +++ b/utils/isValidFile.ts @@ -0,0 +1,45 @@ +export const checkFiles = (images: string[], metadata: string[]) => { + // Check images length is equal to metadata length + if (images.length !== metadata.length) { + throw Error('Images files must have matching number of metadata files') + } + + function parseFileName(path: string | null): number { + // Check file name is not null + if (!path) { + throw Error('File cannot be null') + } + + // Extract fileName from path + const fileName = path.match( + /([a-zA-Z0-9\s_\\.\-:]+)(.png|.jpg|.gif|.json)?$/i + )![1] + + // Check that file name is an Integer + if (isNaN(parseInt(fileName, 10))) { + throw Error('Filenames must be numbers. Invalid fileName: ' + fileName) + } + return parseInt(fileName, 10) + } + + // We need to ensure that the files are numerically sorted (as opposed to lexicographically) + const sortedImages = [...images.map(parseFileName)].sort(function (a, b) { + return a - b + }) + const sortedMetadata = [...metadata.map(parseFileName)].sort(function (a, b) { + return a - b + }) + let lastValue + // Check each image is sequentially named with a number and has a matching metadata file + for (let i = 0; i < sortedImages.length; i++) { + const image = sortedImages[i] + const json = sortedMetadata[i] + if (image !== json) { + throw Error('Images must have matching JSON files') + } + if (lastValue && lastValue + 1 !== image) { + throw Error('Images must be sequential') + } + lastValue = image + } +} diff --git a/utils/sort.ts b/utils/sort.ts new file mode 100644 index 0000000..a9d416a --- /dev/null +++ b/utils/sort.ts @@ -0,0 +1,21 @@ +// @ts-nocheck +// https://stackoverflow.com/questions/15478954/sort-array-elements-string-with-numbers-natural-sort/15479354#15479354 +export function naturalCompare(a: string, b: string) { + var ax = [] + var bx = [] + a.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { + ax.push([$1 || Infinity, $2 || '']) + }) + b.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { + bx.push([$1 || Infinity, $2 || '']) + }) + + while (ax.length && bx.length) { + var an = ax.shift() + var bn = bx.shift() + var nn = an[0] - bn[0] || an[1].localeCompare(bn[1]) + if (nn) return nn + } + + return ax.length - bx.length +} diff --git a/yarn.lock b/yarn.lock index f6cf3c5..ec65409 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,6 +10,11 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" +"@assemblyscript/loader@^0.9.4": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.9.4.tgz#a483c54c1253656bb33babd464e3154a173e1577" + integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA== + "@aws-crypto/crc32@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-2.0.0.tgz#4ad432a3c03ec3087c5540ff6e41e6565d2dc153" @@ -2249,6 +2254,38 @@ resolved "https://registry.yarnpkg.com/@iov/utils/-/utils-2.0.2.tgz#3527f376d26100e07ac823bf87bebd0f24680d1c" integrity sha512-4D8MEvTcFc/DVy5q25vHxRItmgJyeX85dixMH+MxdKr+yy71h3sYk+sVBEIn70uqGP7VqAJkGOPNFs08/XYELw== +"@ipld/car@^3.0.1", "@ipld/car@^3.2.3": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@ipld/car/-/car-3.2.4.tgz#115951ba2255ec51d865773a074e422c169fb01c" + integrity sha512-rezKd+jk8AsTGOoJKqzfjLJ3WVft7NZNH95f0pfPbicROvzTyvHCNy567HzSUd6gRXZ9im29z5ZEv9Hw49jSYw== + dependencies: + "@ipld/dag-cbor" "^7.0.0" + multiformats "^9.5.4" + varint "^6.0.0" + +"@ipld/dag-cbor@^6.0.13", "@ipld/dag-cbor@^6.0.3": + version "6.0.15" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-6.0.15.tgz#aebe7a26c391cae98c32faedb681b1519e3d2372" + integrity sha512-Vm3VTSTwlmGV92a3C5aeY+r2A18zbH2amehNhsX8PBa3muXICaWrN8Uri85A5hLH7D7ElhE8PdjxD6kNqUmTZA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + +"@ipld/dag-cbor@^7.0.0", "@ipld/dag-cbor@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-7.0.2.tgz#a64c2ae6fa32decf655fbb9bee8f543cfae4c3f6" + integrity sha512-V9EhJVWXqzjjRs0kiZfUXOaq8y6R2C4AAmfGoMeszqGOBgfACr5tFAgAwZY0e8z/OpmJWpCrZhzPRTZV0c/gjA== + dependencies: + cborg "^1.6.0" + multiformats "^9.5.4" + +"@ipld/dag-pb@^2.0.2": + version "2.1.17" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-2.1.17.tgz#baafe2fc6bbd1654c402a804ea54b8860cfb2912" + integrity sha512-AmzOdmdv5hT8iGsrbpzm5R0Fvk7DEbtwcglG2gJLvW9q3zwb+E681hY4EwEELypM1Rfnp/JDA9dGqYcpEi/iAg== + dependencies: + multiformats "^9.5.4" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -2342,6 +2379,14 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz#3b0efb6d3903bd49edb073696f60e90df08efb26" integrity sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg== +"@multiformats/murmur3@^1.0.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@multiformats/murmur3/-/murmur3-1.1.3.tgz#70349166992e5f981f1ddff0200fa775b2bf6606" + integrity sha512-wAPLUErGR8g6Lt+bAZn6218k9YQPym+sjszsXL6o4zfxbA22P+gxWZuuD9wDbwL55xrKO5idpcuQUX7/E3oHcw== + dependencies: + multiformats "^9.5.4" + murmurhash3js-revisited "^3.0.0" + "@next/env@12.1.5": version "12.1.5" resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.5.tgz#a21ba6708022d630402ca2b340316e69a0296dfc" @@ -2639,6 +2684,16 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== +"@types/minimatch@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + "@types/node@10.12.18": version "10.12.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" @@ -2707,6 +2762,11 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -2861,11 +2921,67 @@ eslint-plugin-tsdoc "0.2.14" eslint-plugin-unicorn "41.0.1" +"@web-std/blob@^3.0.1", "@web-std/blob@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@web-std/blob/-/blob-3.0.4.tgz#dd67a685547331915428d69e723c7da2015c3fc5" + integrity sha512-+dibyiw+uHYK4dX5cJ7HA+gtDAaUUe6JsOryp2ZpAC7h4ICsh49E34JwHoEKPlPvP0llCrNzz45vvD+xX5QDBg== + dependencies: + "@web-std/stream" "1.0.0" + web-encoding "1.1.5" + +"@web-std/fetch@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@web-std/fetch/-/fetch-3.0.3.tgz#507e1371825298aae61172b0da439570437d3982" + integrity sha512-PtaKr6qvw2AmKChugzhQWuTa12dpbogHRBxwcleAZ35UhWucnfD4N+g3f7qYK2OeioSWTK3yMf6n/kOOfqxHaQ== + dependencies: + "@web-std/blob" "^3.0.3" + "@web-std/form-data" "^3.0.2" + "@web3-storage/multipart-parser" "^1.0.0" + data-uri-to-buffer "^3.0.1" + +"@web-std/file@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@web-std/file/-/file-3.0.2.tgz#b84cc9ed754608b18dcf78ac62c40dbcc6a94692" + integrity sha512-pIH0uuZsmY8YFvSHP1NsBIiMT/1ce0suPrX74fEeO3Wbr1+rW0fUGEe4d0R99iLwXtyCwyserqCFI4BJkJlkRA== + dependencies: + "@web-std/blob" "^3.0.3" + +"@web-std/form-data@^3.0.0", "@web-std/form-data@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@web-std/form-data/-/form-data-3.0.2.tgz#c71d9def6a593138ea92fe3d1ffbce19f43e869c" + integrity sha512-rhc8IRw66sJ0FHcnC84kT3mTN6eACTuNftkt1XSl1Ef6WRKq4Pz65xixxqZymAZl1K3USpwhLci4SKNn4PYxWQ== + dependencies: + web-encoding "1.1.5" + +"@web-std/stream@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@web-std/stream/-/stream-1.0.0.tgz#01066f40f536e4329d9b696dc29872f3a14b93c1" + integrity sha512-jyIbdVl+0ZJyKGTV0Ohb9E6UnxP+t7ZzX4Do3AHjZKxUXKMs9EmqnBDQgHF7bEw0EzbQygOjtt/7gvtmi//iCQ== + dependencies: + web-streams-polyfill "^3.1.1" + +"@web3-storage/multipart-parser@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" + integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== + "@wojtekmaj/date-utils@^1.0.0", "@wojtekmaj/date-utils@^1.0.2", "@wojtekmaj/date-utils@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@wojtekmaj/date-utils/-/date-utils-1.0.3.tgz#2dcfd92881425c5923e429c2aec86fb3609032a1" integrity sha512-1VPkkTBk07gMR1fjpBtse4G+oJqpmE+0gUFB0dg3VIL7qJmUVaBoD/vlzMm/jNeOPfvlmerl1lpnsZyBUFIRuw== +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-jsx@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2949,6 +3065,19 @@ ansi-styles@^6.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== +any-signal@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + +any-signal@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6" + integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg== + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -3011,6 +3140,11 @@ array.prototype.flatmap@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" @@ -3038,6 +3172,11 @@ autoprefixer@^10: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + axe-core@^4.3.5: version "4.4.1" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" @@ -3163,6 +3302,36 @@ bip39@^3.0.2, bip39@^3.0.3: pbkdf2 "^3.0.9" randombytes "^2.0.1" +bl@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.0.0.tgz#6928804a41e9da9034868e1c50ca88f21f57aea2" + integrity sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blob-to-it@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" + integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== + dependencies: + browser-readablestream-to-it "^1.0.3" + +blockstore-core@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/blockstore-core/-/blockstore-core-1.0.5.tgz#2e34b6a7faae0d4b6c98dc8573c6f998eb457f36" + integrity sha512-i/9CUMMvBALVbtSqUIuiWB3tk//a4Q2I2CEWiBuYNnhJvk/DWplXjLt8Sqc5VGkRVXVPSsEuH8fUtqJt5UFYcA== + dependencies: + err-code "^3.0.1" + interface-blockstore "^2.0.2" + interface-store "^2.0.1" + it-all "^1.0.4" + it-drain "^1.0.4" + it-filter "^1.0.2" + it-take "^1.0.1" + multiformats "^9.4.7" + bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -3217,6 +3386,11 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2, browser-readablestream-to-it@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + browserslist@^4.17.5, browserslist@^4.20.2: version "4.20.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" @@ -3244,7 +3418,7 @@ bs58check@<3.0.0, bs58check@^2.1.1: create-hash "^1.1.0" safe-buffer "^5.1.2" -buffer@6.0.3, buffer@^6.0.3: +buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -3283,6 +3457,20 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -3293,6 +3481,21 @@ caniuse-lite@^1.0.30001283, caniuse-lite@^1.0.30001332: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== +carbites@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/carbites/-/carbites-1.0.6.tgz#0eac206c87b60e09b758a4e820af000dda4f8dd1" + integrity sha512-dS9IQvnrb5VIRvSTNz5Ff+mB9d2MFfi5mojtJi7Rlss79VeF190jr0sZdA7eW0CGHotvHkZaWuM6wgfD9PEFRg== + dependencies: + "@ipld/car" "^3.0.1" + "@ipld/dag-cbor" "^6.0.3" + "@ipld/dag-pb" "^2.0.2" + multiformats "^9.0.4" + +cborg@^1.5.4, cborg@^1.6.0: + version "1.9.4" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.9.4.tgz#85354ee6e0fe017dd34e300c3dcd044407a27800" + integrity sha512-ltobKo17xKYJolhg8UxQhvzcqXhjtUnovwe9Xx59Izo32gLwozGoJs/efp+8dZ5+zu9pNJYnHtmp6iJnDUapww== + chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3571,6 +3774,11 @@ damerau-levenshtein@^1.0.7: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3585,13 +3793,26 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3602,7 +3823,7 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -define-properties@^1.1.3: +define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== @@ -3656,6 +3877,15 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +dns-over-http-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -3705,6 +3935,13 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +electron-fetch@^1.7.2: + version "1.7.4" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.7.4.tgz#af975ab92a14798bfaa025f88dcd2e54a7b0b769" + integrity sha512-+fBLXEy4CJWQ5bz8dyaeSG1hD6JJ15kBZyj3eh24pIVrd3hLM47H/umffrdQfS6GZ0falF0g9JT9f3Rs6AVUhw== + dependencies: + encoding "^0.1.13" + electron-to-chromium@^1.4.118: version "1.4.124" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.124.tgz#e9015e234d8632920dcdf5480351da9e845ed220" @@ -3733,6 +3970,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + entities@2.2.0, entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -3743,6 +3987,11 @@ entities@^3.0.1: resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3750,6 +3999,35 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + es-abstract@^1.19.1, es-abstract@^1.19.2: version "1.19.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" @@ -4101,6 +4379,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -4131,6 +4414,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-fifo@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.1.0.tgz#17d1a3646880b9891dfa0c54e69c5fef33cad779" + integrity sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g== + fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -4216,6 +4504,13 @@ follow-redirects@^1.10.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -4245,6 +4540,16 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -4269,6 +4574,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -4363,6 +4673,19 @@ goober@^2.1.1: resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.9.tgz#0faee08fab1a5d55b23e9ec043bb5a1b46fa025a" integrity sha512-PAtnJbrWtHbfpJUIveG5PJIB6Mc9Kd0gimu9wZwPyA+wQUSeOeA4x4Ug16lyaaUUKZ/G6QEH1xunKOuXP1F4Vw== +hamt-sharding@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hamt-sharding/-/hamt-sharding-2.0.1.tgz#f45686d0339e74b03b233bee1bde9587727129b6" + integrity sha512-vnjrmdXG9dDs1m/H4iJ6z0JFI2NtgsW5keRkTcM85NGak69Mkf5PHUqBz+Xs0T4sg0ppvj9O5EGAJo40FTxmmA== + dependencies: + sparse-array "^1.3.1" + uint8arrays "^3.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -4435,6 +4758,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -4445,6 +4775,20 @@ husky@^7: resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +idb-keyval@^6.0.3: + version "6.2.0" + resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.0.tgz#3af94a3cc0689d6ee0bc9e045d2a3340ea897173" + integrity sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng== + dependencies: + safari-14-idb-fix "^3.0.0" + ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -4486,6 +4830,28 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +interface-blockstore@^2.0.2, interface-blockstore@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/interface-blockstore/-/interface-blockstore-2.0.3.tgz#b85270eb5180e65e46c9f66980a0fa4d98f5d73e" + integrity sha512-OwVUnlNcx7H5HloK0Myv6c/C1q9cNG11HX6afdeU6q6kbuNj8jKCwVnmJHhC94LZaJ+9hvVOk4IUstb3Esg81w== + dependencies: + interface-store "^2.0.2" + multiformats "^9.0.4" + +interface-datastore@^6.0.2: + version "6.1.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-6.1.1.tgz#5150a00de2e7513eaadba58bcafd059cb50004c1" + integrity sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg== + dependencies: + interface-store "^2.0.2" + nanoid "^3.0.2" + uint8arrays "^3.0.0" + +interface-store@^2.0.1, interface-store@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-2.0.2.tgz#83175fd2b0c501585ed96db54bb8ba9d55fce34c" + integrity sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg== + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -4495,6 +4861,146 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ipfs-car@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/ipfs-car/-/ipfs-car-0.6.2.tgz#ec645cebe29056344abb3545e4e2e99788a4405c" + integrity sha512-tliuakkKKtCa4TTnFT3zJKjq/aD8EGKX8Y0ybCyrAW0fo/n2koZpxiLjBvtTs47Rqyji6ggXo+atPbJJ60hJmg== + dependencies: + "@ipld/car" "^3.2.3" + "@web-std/blob" "^3.0.1" + bl "^5.0.0" + blockstore-core "^1.0.2" + browser-readablestream-to-it "^1.0.2" + idb-keyval "^6.0.3" + interface-blockstore "^2.0.2" + ipfs-core-types "^0.8.3" + ipfs-core-utils "^0.12.1" + ipfs-unixfs-exporter "^7.0.4" + ipfs-unixfs-importer "^9.0.4" + ipfs-utils "^9.0.2" + it-all "^1.0.5" + it-last "^1.0.5" + it-pipe "^1.1.0" + meow "^9.0.0" + move-file "^2.1.0" + multiformats "^9.6.3" + stream-to-it "^0.2.3" + streaming-iterables "^6.0.0" + uint8arrays "^3.0.0" + +ipfs-core-types@^0.8.3, ipfs-core-types@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.8.4.tgz#4d483dc6035714ea48a0b02e3f82b6c6d55c8525" + integrity sha512-sbRZA1QX3xJ6ywTiVQZMOxhlhp4osAZX2SXx3azOLxAtxmGWDMkHYt722VV4nZ2GyJy8qyk5GHQIZ0uvQnpaTg== + dependencies: + interface-datastore "^6.0.2" + multiaddr "^10.0.0" + multiformats "^9.4.13" + +ipfs-core-utils@^0.12.1: + version "0.12.2" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.12.2.tgz#f5365ac884fd93a3bcb6e7b6f17cebe09d841501" + integrity sha512-RfxP3rPhXuqKIUmTAUhmee6fmaV3A7LMnjOUikRKpSyqESz/DR7aGK7tbttMxkZdkSEr0rFXlqbyb0vVwmn0wQ== + dependencies: + any-signal "^2.1.2" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.8.4" + ipfs-unixfs "^6.0.3" + ipfs-utils "^9.0.2" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.2" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiaddr-to-uri "^8.0.0" + multiformats "^9.4.13" + nanoid "^3.1.23" + parse-duration "^1.0.0" + timeout-abort-controller "^1.1.1" + uint8arrays "^3.0.0" + +ipfs-unixfs-exporter@^7.0.4: + version "7.0.11" + resolved "https://registry.yarnpkg.com/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-7.0.11.tgz#48c4c7605601bddc27cf1de97a2ad81a87e5fe32" + integrity sha512-qTYa69J7HbI2EIYNUddKPg9Y3rHkYZV0bNdmzZKA5+ZbwRVoUEuBW/cguEqTp22zHygh3sMnzYZFm0naVIdMgQ== + dependencies: + "@ipld/dag-cbor" "^7.0.2" + "@ipld/dag-pb" "^2.0.2" + "@multiformats/murmur3" "^1.0.3" + err-code "^3.0.1" + hamt-sharding "^2.0.0" + interface-blockstore "^2.0.3" + ipfs-unixfs "^6.0.0" + it-last "^1.0.5" + multiformats "^9.4.2" + uint8arrays "^3.0.0" + +ipfs-unixfs-importer@^9.0.4: + version "9.0.10" + resolved "https://registry.yarnpkg.com/ipfs-unixfs-importer/-/ipfs-unixfs-importer-9.0.10.tgz#2527ea0b4e018a9e80fa981101485babcd05c494" + integrity sha512-W+tQTVcSmXtFh7FWYWwPBGXJ1xDgREbIyI1E5JzDcimZLIyT5gGMfxR3oKPxxWj+GKMpP5ilvMQrbsPzWcm3Fw== + dependencies: + "@ipld/dag-pb" "^2.0.2" + "@multiformats/murmur3" "^1.0.3" + bl "^5.0.0" + err-code "^3.0.1" + hamt-sharding "^2.0.0" + interface-blockstore "^2.0.3" + ipfs-unixfs "^6.0.0" + it-all "^1.0.5" + it-batch "^1.0.8" + it-first "^1.0.6" + it-parallel-batch "^1.0.9" + merge-options "^3.0.4" + multiformats "^9.4.2" + rabin-wasm "^0.1.4" + uint8arrays "^3.0.0" + +ipfs-unixfs@^6.0.0, ipfs-unixfs@^6.0.3: + version "6.0.9" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-6.0.9.tgz#f6613b8e081d83faa43ed96e016a694c615a9374" + integrity sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ== + dependencies: + err-code "^3.0.1" + protobufjs "^6.10.2" + +ipfs-utils@^9.0.2: + version "9.0.7" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.7.tgz#b8644b9d053e4dd258f69773b146ac243921aa1f" + integrity sha512-Umvb0Zydy2zZiTmQBGLfLISr8vOmXX8cxEIP+N8zGHrtRShG/j32yl1xd/BtS+Hbg0FIbVm3opwvxB2gmta0YA== + dependencies: + any-signal "^3.0.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" + is-electron "^2.2.0" + iso-url "^1.1.5" + it-glob "^1.0.1" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-fetch "^3.0.0" + node-fetch "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz" + react-native-fetch-api "^2.0.0" + stream-to-it "^0.2.2" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4534,12 +5040,12 @@ is-builtin-module@^3.1.0: dependencies: builtin-modules "^3.0.0" -is-callable@^1.1.4, is-callable@^1.2.4: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-core-module@^2.1.0, is-core-module@^2.2.0, is-core-module@^2.8.0, is-core-module@^2.8.1: +is-core-module@^2.1.0, is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.0, is-core-module@^2.8.1: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -4553,6 +5059,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-electron@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.1.tgz#751b1dd8a74907422faa5c35aaa0cf66d98086e9" + integrity sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4568,6 +5079,13 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -4575,6 +5093,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -4592,6 +5117,16 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4626,6 +5161,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -4638,11 +5184,93 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +iso-url@^1.1.5: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== + isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== +it-all@^1.0.4, it-all@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-batch@^1.0.8, it-batch@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/it-batch/-/it-batch-1.0.9.tgz#7e95aaacb3f9b1b8ca6c8b8367892171d6a5b37f" + integrity sha512-7Q7HXewMhNFltTsAMdSz6luNhyhkhEtGGbYek/8Xb/GiqYMtwUmopE1ocPSiJKKp3rM4Dt045sNFoUu+KZGNyA== + +it-drain@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/it-drain/-/it-drain-1.0.5.tgz#0466d4e286b37bcd32599d4e99b37a87cb8cfdf6" + integrity sha512-r/GjkiW1bZswC04TNmUnLxa6uovme7KKwPhc+cb1hHU65E3AByypHH6Pm91WHuvqfFsm+9ws0kPtDBV3/8vmIg== + +it-filter@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-filter/-/it-filter-1.0.3.tgz#66ea0cc4bf84af71bebd353c05a9c5735fcba751" + integrity sha512-EI3HpzUrKjTH01miLHWmhNWy3Xpbx4OXMXltgrNprL5lDpF3giVpHIouFpr5l+evXw6aOfxhnt01BIB+4VQA+w== + +it-first@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-1.0.7.tgz#a4bef40da8be21667f7d23e44dae652f5ccd7ab1" + integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== + +it-glob@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e" + integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q== + dependencies: + "@types/minimatch" "^3.0.4" + minimatch "^3.0.4" + +it-last@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" + integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== + +it-map@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-parallel-batch@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/it-parallel-batch/-/it-parallel-batch-1.0.10.tgz#43aa348e30cc360fa6bedc183b631d6f9c81e20e" + integrity sha512-3+4gW15xdf/BOx9zij0QVnB1bDGSLOTABlaVm7ebHH1S9gDUgd5aLNb0WsFXPTfKe104iC6lxdzfbMGh1B07rg== + dependencies: + it-batch "^1.0.9" + +it-peekable@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" + integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== + +it-pipe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/it-pipe/-/it-pipe-1.1.0.tgz#f5964c6bb785dd776f11a62d1e75964787ab95ce" + integrity sha512-lF0/3qTVeth13TOnHVs0BTFaziwQF7m5Gg+E6JV0BXcLKutC92YjSi7bASgkPOXaLEb+YvNZrPorGMBIJvZfxg== + +it-take@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-take/-/it-take-1.0.2.tgz#b5f1570014db7c3454897898b69bb7ac9c3bffc1" + integrity sha512-u7I6qhhxH7pSevcYNaMECtkvZW365ARqAIt9K+xjdK1B2WUDEjQSfETkOCT8bxFq/59LqrN3cMLUtTgmDBaygw== + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + jju@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" @@ -4756,6 +5384,11 @@ json5@^2.2.1: array-includes "^3.1.4" object.assign "^4.1.2" +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + language-subtag-registry@~0.3.2: version "0.3.21" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" @@ -4906,6 +5539,16 @@ make-event-props@^1.1.0: resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.3.0.tgz#2434cb390d58bcf40898d009ef5b1f936de9671b" integrity sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q== +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + match-sorter@^6, match-sorter@^6.0.2: version "6.3.1" resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" @@ -4937,11 +5580,36 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize "^1.2.0" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-class-names@^1.1.1: version "1.4.2" resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835" integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge-refs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.0.0.tgz#388348bce22e623782c6df9d3c4fc55888276120" @@ -5014,7 +5682,16 @@ minimatch@^3.0.4, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6: +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== @@ -5024,6 +5701,13 @@ miscreant@0.3.2: resolved "https://registry.yarnpkg.com/miscreant/-/miscreant-0.3.2.tgz#a91c046566cca70bd6b5e9fbdd3f67617fa85034" integrity sha512-fL9KxsQz9BJB2KGPMHFrReioywkiomBiuaLk6EuChijK0BsJsIKJXdVomR+/bPj5mvbFD6wM0CM3bZio9g7OHA== +move-file@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.1.0.tgz#3bec9d34fbe4832df6865f112cda4492b56e8507" + integrity sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA== + dependencies: + path-exists "^4.0.0" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5039,6 +5723,35 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multiaddr-to-uri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz#65efe4b1f9de5f6b681aa42ff36a7c8db7625e58" + integrity sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA== + dependencies: + multiaddr "^10.0.0" + +multiaddr@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-10.0.1.tgz#0d15848871370860a4d266bb44d93b3dac5d90ef" + integrity sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg== + dependencies: + dns-over-http-resolver "^1.2.3" + err-code "^3.0.1" + is-ip "^3.1.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" + +multiformats@^9.0.4, multiformats@^9.4.13, multiformats@^9.4.2, multiformats@^9.4.5, multiformats@^9.4.7, multiformats@^9.5.4, multiformats@^9.6.3, multiformats@^9.6.4: + version "9.7.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.7.0.tgz#845799e8df70fbb6b15922500e45cb87cf12f7e5" + integrity sha512-uv/tcgwk0yN4DStopnBN4GTgvaAlYdy6KnZpuzEPFOYQd71DYFJjs0MN1ERElAflrZaYyGBWXyGxL5GgrxIx0Q== + +murmurhash3js-revisited@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" + integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== + nan@^2.13.2: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" @@ -5051,11 +5764,26 @@ nano-time@1.0.0: dependencies: big-integer "^1.6.16" +nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + nanoid@^3.1.30, nanoid@^3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +native-abort-controller@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" + integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== + +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5089,6 +5817,28 @@ next@^12: "@next/swc-win32-ia32-msvc" "12.1.5" "@next/swc-win32-x64-msvc" "12.1.5" +nft.storage@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/nft.storage/-/nft.storage-6.4.0.tgz#3b9aee48a75e86881ca3b5fd045d89cfcc2b22a9" + integrity sha512-b5kgIi9xk+euZpiTzhaDzJey12bOCcOW74ipK5Zwczhgkm3sTFa4F1Bp2XYNqUtPQMXc6DO2v0r3NZ4ctl3iCg== + dependencies: + "@ipld/car" "^3.2.3" + "@ipld/dag-cbor" "^6.0.13" + "@web-std/blob" "^3.0.1" + "@web-std/fetch" "^3.0.3" + "@web-std/file" "^3.0.0" + "@web-std/form-data" "^3.0.0" + carbites "^1.0.6" + ipfs-car "^0.6.2" + multiformats "^9.6.4" + p-retry "^4.6.1" + streaming-iterables "^6.0.0" + throttled-queue "^2.1.2" + +node-fetch@^2.6.1, "node-fetch@https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz": + version "2.6.7" + resolved "https://registry.npmjs.org/@achingbrain/node-fetch/-/node-fetch-2.6.7.tgz#1b5d62978f2ed07b99444f64f0df39f960a6d34d" + node-releases@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" @@ -5104,6 +5854,16 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5224,6 +5984,19 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -5259,6 +6032,14 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-retry@^4.6.1: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -5286,6 +6067,11 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-duration@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.0.2.tgz#b9aa7d3a1363cc7e8845bea8fd3baf8a11df5805" + integrity sha512-Dg27N6mfok+ow1a2rj/nRjtCfaKrHUZV2SJpEn/s8GaVUSlf4GGRCRP1c13Hj+wfPKVMrFDqLMLITkYKgKxyyg== + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -5489,11 +6275,28 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +rabin-wasm@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/rabin-wasm/-/rabin-wasm-0.1.5.tgz#5b625ca007d6a2cbc1456c78ae71d550addbc9c9" + integrity sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA== + dependencies: + "@assemblyscript/loader" "^0.9.4" + bl "^5.0.0" + debug "^4.3.1" + minimist "^1.2.5" + node-fetch "^2.6.1" + readable-stream "^3.6.0" + randombytes@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -5597,6 +6400,13 @@ react-is@^16.13.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-native-fetch-api@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-2.0.0.tgz#c4af188b4fce3f3eaf1f1ff4e61dae1a00d4ffa0" + integrity sha512-GOA8tc1EVYLnHvma/TU9VTgLOyralO7eATRuCDchQveXW9Fr9vXygyq9iwqmM7YRZ8qRJfEt9xOS7OYMdJvRFw== + dependencies: + p-defer "^3.0.0" + react-popper@^2: version "2.2.5" resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" @@ -5663,7 +6473,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -5684,6 +6494,21 @@ readonly-date@^1.0.0: resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + regenerate-unicode-properties@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" @@ -5713,7 +6538,7 @@ regexp-tree@^0.1.24, regexp-tree@~0.1.1: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== -regexp.prototype.flags@^1.4.1: +regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -5794,6 +6619,16 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retimer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-2.0.0.tgz#e8bd68c5e5a8ec2f49ccb5c636db84c04063bbca" + integrity sha512-KLXY85WkEq2V2bKex/LOO1ViXVn2KGYe4PYysAdYdjmraYIUsVkXu8O4am+8+5UbaaGl1qho4aqAAPHNQ4GSbg== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5833,6 +6668,11 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" +safari-14-idb-fix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz#450fc049b996ec7f3fd9ca2f89d32e0761583440" + integrity sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog== + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -5850,6 +6690,11 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + scheduler@^0, scheduler@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" @@ -5894,7 +6739,7 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.5: +semver@^7.3.4, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -5988,6 +6833,11 @@ source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sparse-array@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/sparse-array/-/sparse-array-1.3.2.tgz#0e1a8b71706d356bc916fe754ff496d450ec20b0" + integrity sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg== + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -6019,6 +6869,18 @@ stable@^0.1.8: resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== +stream-to-it@^0.2.2, stream-to-it@^0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== + dependencies: + get-iterator "^1.0.2" + +streaming-iterables@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/streaming-iterables/-/streaming-iterables-6.2.0.tgz#e8079bc56272335b287e2f13274602fbef008e56" + integrity sha512-3AYC8oB60WyD1ic7uHmN/vm2oRGzRnQ3XFBl/bFMDi1q1+nc5/vjMmiE4vroIya3jG59t87VpyAj/iXYxyw9AA== + string-argv@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -6064,6 +6926,15 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -6072,6 +6943,15 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6199,11 +7079,24 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +throttled-queue@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/throttled-queue/-/throttled-queue-2.1.4.tgz#4e2008c73ab3f72ba1bb09496c3cc9c5b745dbee" + integrity sha512-YGdk8sdmr4ge3g+doFj/7RLF5kLM+Mi7DEciu9PHxnMJZMeVuZeTj31g4VE7ekUffx/IdbvrtOCiz62afg0mkg== + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +timeout-abort-controller@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-1.1.1.tgz#2c3c3c66f13c783237987673c276cbd7a9762f29" + integrity sha512-BsF9i3NAJag6T0ZEjki9j654zoafI2X6ayuNd6Tp8+Ul6Tr5s4jo973qFeiWrRSweqvskC+AHDKUmIW4b7pdhQ== + dependencies: + abort-controller "^3.0.0" + retimer "^2.0.0" + tiny-secp256k1@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" @@ -6232,6 +7125,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + tsconfig-paths@^3.12.0, tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -6266,6 +7164,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -6301,7 +7204,14 @@ typescript@^4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== -unbox-primitive@^1.0.1: +uint8arrays@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.0.0.tgz#260869efb8422418b6f04e3fac73a3908175c63b" + integrity sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA== + dependencies: + multiformats "^9.4.2" + +unbox-primitive@^1.0.1, unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== @@ -6369,6 +7279,18 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util@^0.12.3: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + utility-types@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" @@ -6392,6 +7314,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== + warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" @@ -6399,6 +7326,20 @@ warning@^4.0.2: dependencies: loose-envify "^1.0.0" +web-encoding@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +web-streams-polyfill@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -6410,6 +7351,18 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -6480,6 +7433,11 @@ yaml@^1.10.0, yaml@^1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + zustand@^3: version "3.7.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d"