diff --git a/.vscode/settings.json b/.vscode/settings.json index bf6b9c08ba..29b83e6a9f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { "typescript.tsdk": "node_modules/typescript/lib", - "cSpell.words": ["Addin", "blockworks", "solana"] + "cSpell.words": ["Addin", "blockworks", "lamports", "solana"] } diff --git a/NftVotePlugin/sdk/accounts.tsx b/NftVotePlugin/sdk/accounts.tsx index 93b610d766..c58ec8deee 100644 --- a/NftVotePlugin/sdk/accounts.tsx +++ b/NftVotePlugin/sdk/accounts.tsx @@ -1,6 +1,6 @@ import { PublicKey } from '@solana/web3.js' -export const unusedMintPk = '11111111111111111111111111111111' +export const emptyPk = '11111111111111111111111111111111' export const getNftRegistrarPDA = async ( realmPk: PublicKey, @@ -22,17 +22,15 @@ export const getNftMaxVoterWeightRecord = async ( mint: PublicKey, clientProgramId: PublicKey ) => { - const [ - maxVoterWeightRecord, - maxVoterWeightRecordBump, - ] = await PublicKey.findProgramAddress( - [ - Buffer.from('max-voter-weight-record'), - realmPk.toBuffer(), - mint.toBuffer(), - ], - clientProgramId - ) + const [maxVoterWeightRecord, maxVoterWeightRecordBump] = + await PublicKey.findProgramAddress( + [ + Buffer.from('max-voter-weight-record'), + realmPk.toBuffer(), + mint.toBuffer(), + ], + clientProgramId + ) return { maxVoterWeightRecord, maxVoterWeightRecordBump, @@ -45,18 +43,16 @@ export const getNftVoterWeightRecord = async ( walletPk: PublicKey, clientProgramId: PublicKey ) => { - const [ - voterWeightPk, - voterWeightRecordBump, - ] = await PublicKey.findProgramAddress( - [ - Buffer.from('voter-weight-record'), - realmPk.toBuffer(), - mint.toBuffer(), - walletPk.toBuffer(), - ], - clientProgramId - ) + const [voterWeightPk, voterWeightRecordBump] = + await PublicKey.findProgramAddress( + [ + Buffer.from('voter-weight-record'), + realmPk.toBuffer(), + mint.toBuffer(), + walletPk.toBuffer(), + ], + clientProgramId + ) return { voterWeightPk, voterWeightRecordBump, diff --git a/NftVotePlugin/store/nftPluginStore.ts b/NftVotePlugin/store/nftPluginStore.ts index a25eb4ae65..0f3a2e6b96 100644 --- a/NftVotePlugin/store/nftPluginStore.ts +++ b/NftVotePlugin/store/nftPluginStore.ts @@ -39,11 +39,14 @@ const useNftPluginStore = create((set, _get) => ({ }) }, setVotingNfts: (nfts, votingClient, nftMintRegistrar) => { - votingClient._setCurrentVoterNfts(nfts) + const filteredNfts = nfts.filter( + (x) => x.token.account.amount.cmpn(1) === 0 + ) + votingClient._setCurrentVoterNfts(filteredNfts) set((s) => { - s.state.votingNfts = nfts + s.state.votingNfts = filteredNfts }) - _get().setVotingPower(nfts, nftMintRegistrar) + _get().setVotingPower(filteredNfts, nftMintRegistrar) }, setVotingPower: (nfts, nftMintRegistrar) => { const votingPower = nfts diff --git a/Strategies/components/MangoDepositComponent.tsx b/Strategies/components/MangoDepositComponent.tsx index ba1436ea37..9e95264ab1 100644 --- a/Strategies/components/MangoDepositComponent.tsx +++ b/Strategies/components/MangoDepositComponent.tsx @@ -73,12 +73,10 @@ const MangoDepositComponent = ({ symbol, } = useRealm() const [isDepositing, setIsDepositing] = useState(false) - const [ - selectedMangoAccount, - setSelectedMangoAccount, - ] = useState( - mangoAccounts.length ? mangoAccounts[0] : null - ) + const [selectedMangoAccount, setSelectedMangoAccount] = + useState( + mangoAccounts.length ? mangoAccounts[0] : null + ) const [voteByCouncil, setVoteByCouncil] = useState(false) const client = useVotePluginsClientStore( (s) => s.state.currentRealmVotingClient @@ -161,9 +159,10 @@ const MangoDepositComponent = ({ ) } - const minRentAmount = await connection.current.getMinimumBalanceForRentExemption( - MangoAccountLayout.span - ) + const minRentAmount = + await connection.current.getMinimumBalanceForRentExemption( + MangoAccountLayout.span + ) const transferIx = SystemProgram.transfer({ fromPubkey: wallet!.publicKey!, @@ -220,7 +219,7 @@ const MangoDepositComponent = ({ }, realm!, governedTokenAccount!, - ownTokenRecord.pubkey, + ownTokenRecord, defaultProposalMint!, governedTokenAccount!.governance!.account!.proposalCount, prerequisiteInstructions, diff --git a/Strategies/protocols/foresight/tools.ts b/Strategies/protocols/foresight/tools.ts new file mode 100644 index 0000000000..db42d1ef84 --- /dev/null +++ b/Strategies/protocols/foresight/tools.ts @@ -0,0 +1,2 @@ +export const FORESIGHT_MINT_DEVNET = + 'H7uqouPsJkeEiLpCEoC1qYVVquDrZan6ZfdPK2gS44zm' diff --git a/Strategies/protocols/mango/tools.ts b/Strategies/protocols/mango/tools.ts index bbc8d56fcd..372800c885 100644 --- a/Strategies/protocols/mango/tools.ts +++ b/Strategies/protocols/mango/tools.ts @@ -122,9 +122,9 @@ export const calculateAllDepositsInMangoAccountsForMint = ( ) => { let deposited = 0 const group = market!.group - const depositIndex = group?.tokens.findIndex( - (x) => x.mint.toBase58() === mint.toBase58() - ) + const depositIndex = + mint && + group?.tokens.findIndex((x) => x.mint.toBase58() === mint.toBase58()) if (accounts?.length && typeof depositIndex !== 'undefined' && group) { const depositsWithAmountHiherThenZero = accounts .map((x) => x.deposits[depositIndex]) @@ -211,8 +211,8 @@ const HandleMangoDeposit: HandleCreateProposalWithStrategy = async ( ) ) ), - holdUpTime: matchedTreasury.governance!.account!.config - .minInstructionHoldUpTime, + holdUpTime: + matchedTreasury.governance!.account!.config.minInstructionHoldUpTime, prerequisiteInstructions: [], chunkSplitByDefault: true, } @@ -230,8 +230,8 @@ const HandleMangoDeposit: HandleCreateProposalWithStrategy = async ( data: getInstructionDataFromBase64( serializeInstructionToBase64(createMangoAccountIns) ), - holdUpTime: matchedTreasury.governance!.account!.config - .minInstructionHoldUpTime, + holdUpTime: + matchedTreasury.governance!.account!.config.minInstructionHoldUpTime, prerequisiteInstructions: [...prerequisiteInstructions], splitToChunkByDefault: true, } @@ -249,8 +249,8 @@ const HandleMangoDeposit: HandleCreateProposalWithStrategy = async ( data: getInstructionDataFromBase64( serializeInstructionToBase64(delegateMangoAccount) ), - holdUpTime: matchedTreasury.governance!.account!.config - .minInstructionHoldUpTime, + holdUpTime: + matchedTreasury.governance!.account!.config.minInstructionHoldUpTime, prerequisiteInstructions: [], splitToChunkByDefault: true, } diff --git a/Strategies/types/types.ts b/Strategies/types/types.ts index f0a2677f0a..177036ae7a 100644 --- a/Strategies/types/types.ts +++ b/Strategies/types/types.ts @@ -1,5 +1,10 @@ import { MangoAccount } from '@blockworks-foundation/mango-client' -import { ProgramAccount, Realm, RpcContext } from '@solana/spl-governance' +import { + ProgramAccount, + Realm, + RpcContext, + TokenOwnerRecord, +} from '@solana/spl-governance' import { PublicKey, TransactionInstruction } from '@solana/web3.js' import { VotingClient } from '@utils/uiTypes/VotePlugin' import { AssetAccount } from '@utils/uiTypes/assets' @@ -31,7 +36,7 @@ export type HandleCreateProposalWithStrategy = ( form: MNGODepositForm, realm: ProgramAccount, treasuaryAccount: AssetAccount, - tokenOwnerRecord: PublicKey, + tokenOwnerRecord: ProgramAccount, governingTokenMint: PublicKey, proposalIndex: number, prerequisiteInstructions: TransactionInstruction[], diff --git a/VoteStakeRegistry/actions/closeDeposit.ts b/VoteStakeRegistry/actions/closeDeposit.ts index 1a9a86e2aa..e4eae3f57b 100644 --- a/VoteStakeRegistry/actions/closeDeposit.ts +++ b/VoteStakeRegistry/actions/closeDeposit.ts @@ -37,14 +37,14 @@ export const closeDeposit = async ({ wallet!.publicKey!, clientProgramId ) - instructions.push( - client!.program.instruction.closeDepositEntry(depositIndex, { - accounts: { - voter: voter, - voterAuthority: wallet!.publicKey!, - }, + const closeDepositEntry = await client!.program.methods + .closeDepositEntry(depositIndex) + .accounts({ + voter: voter, + voterAuthority: wallet!.publicKey!, }) - ) + .instruction() + instructions.push(closeDepositEntry) const transaction = new Transaction() transaction.add(...instructions) diff --git a/VoteStakeRegistry/actions/getClawbackInstruction.ts b/VoteStakeRegistry/actions/getClawbackInstruction.ts index 4b8441b5b4..4dc08fb39c 100644 --- a/VoteStakeRegistry/actions/getClawbackInstruction.ts +++ b/VoteStakeRegistry/actions/getClawbackInstruction.ts @@ -48,15 +48,16 @@ export const getClawbackInstruction = async ({ true ) - const clawbackIx = client?.program.instruction.clawback(voterDepositIndex, { - accounts: { + const clawbackIx = await client?.program.methods + .clawback(voterDepositIndex) + .accounts({ registrar, realmAuthority, voter, vault: voterATAPk, destination, tokenProgram: TOKEN_PROGRAM_ID, - }, - }) + }) + .instruction() return clawbackIx } diff --git a/VoteStakeRegistry/actions/getGrantInstruction.ts b/VoteStakeRegistry/actions/getGrantInstruction.ts index 7e79d7b457..7dc4baa85c 100644 --- a/VoteStakeRegistry/actions/getGrantInstruction.ts +++ b/VoteStakeRegistry/actions/getGrantInstruction.ts @@ -69,32 +69,32 @@ export const getGrantInstruction = async ({ true ) - const grantIx = client?.program.instruction.grant( - voterBump, - voterWeightBump, - { [lockupKind]: {} }, - new BN(startTime), - lockupPeriod, - allowClawback, - new BN(amount), - { - accounts: { - registrar, - voter, - voterAuthority: toPk, - voterWeightRecord: voterWeightPk, - vault: voterATAPk, - depositToken: fromPk, - tokenAuthority: grantAuthority, - grantAuthority: toPk, - depositMint: grantMintPk, - payer: toPk, - systemProgram: systemProgram, - tokenProgram: TOKEN_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - rent: SYSVAR_RENT_PUBKEY, - }, - } - ) + const grantIx = await client?.program.methods + .grant( + voterBump, + voterWeightBump, + { [lockupKind]: {} }, + new BN(startTime), + lockupPeriod, + allowClawback, + new BN(amount) + ) + .accounts({ + registrar, + voter, + voterAuthority: toPk, + voterWeightRecord: voterWeightPk, + vault: voterATAPk, + depositToken: fromPk, + tokenAuthority: grantAuthority, + grantAuthority: toPk, + depositMint: grantMintPk, + payer: toPk, + systemProgram: systemProgram, + tokenProgram: TOKEN_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + rent: SYSVAR_RENT_PUBKEY, + }) + .instruction() return grantIx } diff --git a/VoteStakeRegistry/actions/voteRegistryLockDeposit.ts b/VoteStakeRegistry/actions/voteRegistryLockDeposit.ts index 162a4dda1b..653f37d9e1 100644 --- a/VoteStakeRegistry/actions/voteRegistryLockDeposit.ts +++ b/VoteStakeRegistry/actions/voteRegistryLockDeposit.ts @@ -27,6 +27,7 @@ export const voteRegistryLockDeposit = async ({ tokenOwnerRecordPk, sourceTokenAccount, communityMintPk, + allowClawback = false, }: { rpcContext: RpcContext mintPk: PublicKey @@ -41,6 +42,7 @@ export const voteRegistryLockDeposit = async ({ tokenOwnerRecordPk: PublicKey | null sourceTokenAccount: PublicKey communityMintPk: PublicKey + allowClawback?: boolean client?: VsrClient }) => { const signers: Keypair[] = [] @@ -55,73 +57,63 @@ export const voteRegistryLockDeposit = async ({ amountFromVoteRegistryDeposit ) const instructions: TransactionInstruction[] = [] - const { - depositIdx, - voter, - registrar, - voterATAPk, - } = await withCreateNewDeposit({ - instructions, - walletPk: rpcContext.walletPubkey, - mintPk, - realmPk, - programId, - tokenOwnerRecordPk, - lockUpPeriodInDays, - lockupKind, - communityMintPk, - client, - }) + const { depositIdx, voter, registrar, voterATAPk } = + await withCreateNewDeposit({ + instructions, + walletPk: rpcContext.walletPubkey, + mintPk, + realmPk, + programId, + tokenOwnerRecordPk, + lockUpPeriodInDays, + lockupKind, + communityMintPk, + client, + allowClawback, + }) if (!amountFromVoteRegistryDeposit.isZero()) { - const internalTransferUnlockedInstruction = client?.program.instruction.internalTransferUnlocked( - sourceDepositIdx!, - depositIdx, - amountFromVoteRegistryDeposit, - { - accounts: { - registrar: registrar, - voter: voter, - voterAuthority: wallet!.publicKey, - }, - } - ) + const internalTransferUnlockedInstruction = await client?.program.methods + .internalTransferUnlocked( + sourceDepositIdx!, + depositIdx, + amountFromVoteRegistryDeposit + ) + .accounts({ + registrar: registrar, + voter: voter, + voterAuthority: wallet!.publicKey, + }) + .instruction() instructions.push(internalTransferUnlockedInstruction) } if (!fromWalletTransferAmount.isZero() && !fromWalletTransferAmount.isNeg()) { - const depositInstruction = client?.program.instruction.deposit( - depositIdx, - fromWalletTransferAmount, - { - accounts: { - registrar: registrar, - voter: voter, - vault: voterATAPk, - depositToken: sourceTokenAccount, - depositAuthority: wallet!.publicKey!, - tokenProgram: TOKEN_PROGRAM_ID, - }, - } - ) + const depositInstruction = await client?.program.methods + .deposit(depositIdx, fromWalletTransferAmount) + .accounts({ + registrar: registrar, + voter: voter, + vault: voterATAPk, + depositToken: sourceTokenAccount, + depositAuthority: wallet!.publicKey!, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .instruction() instructions.push(depositInstruction) } if (!amountFromVoteRegistryDeposit.isZero()) { const period = getPeriod(lockUpPeriodInDays, lockupKind) - const resetLockup = client?.program.instruction.resetLockup( - depositIdx, - { [lockupKind]: {} }, - period, - { - accounts: { - registrar: registrar, - voter: voter, - voterAuthority: wallet!.publicKey, - }, - } - ) + const resetLockup = await client?.program.methods + .resetLockup(depositIdx, { [lockupKind]: {} }, period) + .accounts({ + registrar: registrar, + voter: voter, + voterAuthority: wallet!.publicKey, + }) + .instruction() instructions.push(resetLockup) } diff --git a/VoteStakeRegistry/actions/voteRegistryStartUnlock.ts b/VoteStakeRegistry/actions/voteRegistryStartUnlock.ts index 7a3b1be730..72aef459fc 100644 --- a/VoteStakeRegistry/actions/voteRegistryStartUnlock.ts +++ b/VoteStakeRegistry/actions/voteRegistryStartUnlock.ts @@ -63,30 +63,24 @@ export const voteRegistryStartUnlock = async ({ client, }) - const internalTransferInst = client?.program.instruction.internalTransferLocked( - sourceDepositIdx, - depositIdx, - transferAmount, - { - accounts: { - registrar, - voter, - voterAuthority: wallet.publicKey, - }, - } - ) + const internalTransferInst = await client?.program.methods + .internalTransferLocked(sourceDepositIdx, depositIdx, transferAmount) + .accounts({ + registrar, + voter, + voterAuthority: wallet.publicKey, + }) + .instruction() instructions.push(internalTransferInst) if (amountAfterOperation && amountAfterOperation?.isZero()) { - const close = client.program.instruction.closeDepositEntry( - sourceDepositIdx, - { - accounts: { - voter: voter, - voterAuthority: wallet.publicKey, - }, - } - ) + const close = await client.program.methods + .closeDepositEntry(sourceDepositIdx) + .accounts({ + voter: voter, + voterAuthority: wallet.publicKey, + }) + .instruction() instructions.push(close) } diff --git a/VoteStakeRegistry/components/Account/DepositCard.tsx b/VoteStakeRegistry/components/Account/DepositCard.tsx index 39f8721ba1..00a91ca712 100644 --- a/VoteStakeRegistry/components/Account/DepositCard.tsx +++ b/VoteStakeRegistry/components/Account/DepositCard.tsx @@ -37,7 +37,6 @@ const DepositCard = ({ deposit }: { deposit: DepositWithMintAccount }) => { const { fetchRealm, fetchWalletTokenAccounts } = useWalletStore( (s) => s.actions ) - const handleWithDrawFromDeposit = async ( depositEntry: DepositWithMintAccount ) => { @@ -67,8 +66,8 @@ const DepositCard = ({ deposit }: { deposit: DepositWithMintAccount }) => { amount: depositEntry.available, communityMintPk: realm!.account.communityMint, closeDepositAfterOperation: depositEntry.currentlyLocked.isZero(), - tokenOwnerRecordPubKey: tokenRecords[wallet!.publicKey!.toBase58()] - .pubkey!, + tokenOwnerRecordPubKey: + tokenRecords[wallet!.publicKey!.toBase58()].pubkey!, depositIndex: depositEntry.index, client: client, }) @@ -152,6 +151,10 @@ const DepositCard = ({ deposit }: { deposit: DepositWithMintAccount }) => { label="Lockup Type" value={typeName.charAt(0).toUpperCase() + typeName.slice(1)} /> + {isVest && ( { wallet?.publicKey && client ) { - const { - deposits, - votingPower, - votingPowerFromDeposits, - } = await getDeposits({ - realmPk: realm!.pubkey, - communityMintPk: realm!.account.communityMint, - walletPk: tokenOwnerRecordWalletPk - ? new PublicKey(tokenOwnerRecordWalletPk) - : wallet.publicKey, - client: client!, - connection: connection, - }) + const { deposits, votingPower, votingPowerFromDeposits } = + await getDeposits({ + realmPk: realm!.pubkey, + communityMintPk: realm!.account.communityMint, + walletPk: tokenOwnerRecordWalletPk + ? new PublicKey(tokenOwnerRecordWalletPk) + : wallet.publicKey, + client: client!, + connection: connection, + }) const reducedDeposits = deposits.reduce((curr, next) => { const nextType = Object.keys(next.lockup.kind)[0] const isUnlockedType = unlockedTypes.includes(nextType) @@ -132,6 +129,7 @@ const LockTokensAccount = ({ tokenOwnerRecordPk }) => { setReducedDeposits([]) } } catch (e) { + console.log(e) notify({ type: 'error', message: "Can't fetch deposits", diff --git a/VoteStakeRegistry/components/Account/LockTokensModal.tsx b/VoteStakeRegistry/components/Account/LockTokensModal.tsx index 7be96970f1..1e52842e43 100644 --- a/VoteStakeRegistry/components/Account/LockTokensModal.tsx +++ b/VoteStakeRegistry/components/Account/LockTokensModal.tsx @@ -42,6 +42,8 @@ import { calcMintMultiplier } from 'VoteStakeRegistry/tools/deposits' import ButtonGroup from '@components/ButtonGroup' import InlineNotification from '@components/InlineNotification' import Tooltip from '@components/Tooltip' +//import Switch from '@components/Switch' +import { notify } from '@utils/notifications' const YES = 'Yes' const NO = 'No' @@ -96,7 +98,8 @@ const LockTokensModal = ({ }, ].filter((x) => depositToUnlock - ? getMinDurationInDays(depositToUnlock) <= x.defaultValue + ? getMinDurationInDays(depositToUnlock) <= x.defaultValue || + x.display === 'Custom' : true ) @@ -117,11 +120,12 @@ const LockTokensModal = ({ x.lockup.kind.none ) const [lockupPeriodDays, setLockupPeriodDays] = useState(0) + const [allowClawback, setAllowClawback] = useState(false) + console.log(setAllowClawback) const [lockupPeriod, setLockupPeriod] = useState(lockupPeriods[0]) const [amount, setAmount] = useState() - const [lockMoreThenDeposited, setLockMoreThenDeposited] = useState( - YES - ) + const [lockMoreThenDeposited, setLockMoreThenDeposited] = + useState(YES) const [lockupType, setLockupType] = useState(lockupTypes[0]) const [ vestingPeriod, @@ -216,12 +220,19 @@ const LockTokensModal = ({ ) const totalAmountInDeposit = depositRecord?.amountDepositedNative || new BN(0) - const whatWillBeLeftInsideDeposit = totalAmountInDeposit.sub( - totalAmountToLock - ) + const whatWillBeLeftInsideDeposit = + totalAmountInDeposit.sub(totalAmountToLock) const amountFromDeposit = whatWillBeLeftInsideDeposit.isNeg() ? totalAmountInDeposit : totalAmountToLock + if (!amountFromDeposit.isZero() && allowClawback) { + notify({ + type: 'warn', + message: `Please withdraw your tokens to the wallet`, + description: `To lock tokens with clawback option you must first withdraw them to wallet`, + }) + throw 'To lock tokens with clawback option you must first withdraw them to wallet' + } await voteRegistryLockDeposit({ rpcContext, mintPk: realm!.account.communityMint!, @@ -234,6 +245,7 @@ const LockTokensModal = ({ lockupKind: lockupType.value, sourceDepositIdx: depositRecord!.index, sourceTokenAccount: realmTokenAccount!.publicKey, + allowClawback: allowClawback, tokenOwnerRecordPk: tokenRecords[wallet!.publicKey!.toBase58()]?.pubkey || null, client: client, @@ -254,6 +266,7 @@ const LockTokensModal = ({ if (!depositToUnlock) { throw 'No deposit to unlock selected' } + const rpcContext = new RpcContext( realm!.owner, getProgramVersionForRealm(realmInfo!), @@ -268,9 +281,8 @@ const LockTokensModal = ({ const totalAmountInDeposit = depositToUnlock.currentlyLocked - const whatWillBeLeftInsideDeposit = totalAmountInDeposit.sub( - totalAmountToUnlock - ) + const whatWillBeLeftInsideDeposit = + totalAmountInDeposit.sub(totalAmountToUnlock) await voteRegistryStartUnlock({ rpcContext, @@ -402,7 +414,9 @@ const LockTokensModal = ({ min={1} value={lockupPeriodDays} type="number" - onChange={(e) => setLockupPeriodDays(e.target.value)} + onChange={(e) => + setLockupPeriodDays(Number(e.target.value)) + } step={1} /> @@ -459,12 +473,35 @@ const LockTokensModal = ({ {currentMultiplier}x -
+
100 + ? 100 + : currentPercentOfMaxMultiplier + }%`, + }} className="bg-primary-light h-2 rounded-lg" >
+ {/* {!depositToUnlock && ( +
+
+ Allow dao to clawback -{' '} + + It will give ability to propose clawback of your locked + tokens to any given address If you use constant lockup + type with this option turn on only way to retrieve tokens + from that deposit will be dao vote + +
+ setAllowClawback(checked)} + /> +
+ )} */}
) diff --git a/VoteStakeRegistry/components/LockTokenStats/InfoBox.tsx b/VoteStakeRegistry/components/LockTokenStats/InfoBox.tsx new file mode 100644 index 0000000000..1ac27eb657 --- /dev/null +++ b/VoteStakeRegistry/components/LockTokenStats/InfoBox.tsx @@ -0,0 +1,49 @@ +import Tooltip from '@components/Tooltip' +import { InformationCircleIcon } from '@heroicons/react/outline' +import useRealm from '@hooks/useRealm' +import { getMintDecimalAmount } from '@tools/sdk/units' +import tokenService from '@utils/services/token' +import { MANGO_MINT } from 'Strategies/protocols/mango/tools' + +const InfoBox = ({ title, val, tooltip = '', className = '' }) => { + const { mint } = useRealm() + const formatter = Intl.NumberFormat('en', { + notation: 'compact', + }) + const fmtMangoAmount = (val) => { + return mint + ? formatter.format(getMintDecimalAmount(mint!, val).toNumber()) + : '0' + } + const price = tokenService.getUSDTokenPrice(MANGO_MINT) + const totalPrice = mint + ? formatter.format(getMintDecimalAmount(mint!, val).toNumber() * price) + : '' + return ( +
+
+ {title} + {tooltip && ( + + + + + + )} +
+
+ {fmtMangoAmount(val)} + {totalPrice && ( + + {' '} + ≈ ${totalPrice} + + )} +
+
+ ) +} + +export default InfoBox diff --git a/VoteStakeRegistry/components/LockTokenStats/LockTokenRow.tsx b/VoteStakeRegistry/components/LockTokenStats/LockTokenRow.tsx new file mode 100644 index 0000000000..e4c31fb1e1 --- /dev/null +++ b/VoteStakeRegistry/components/LockTokenStats/LockTokenRow.tsx @@ -0,0 +1,80 @@ +import { AddressImage, DisplayAddress } from '@cardinal/namespaces-components' +import { UserCircleIcon } from '@heroicons/react/outline' +import useRealm from '@hooks/useRealm' +import { PublicKey } from '@solana/web3.js' +import { getMintDecimalAmount } from '@tools/sdk/units' +import { useMemo } from 'react' +import useWalletStore from 'stores/useWalletStore' +import { LockupType } from 'VoteStakeRegistry/sdk/accounts' +import { + getMinDurationFmt, + getTimeLeftFromNowFmt, +} from 'VoteStakeRegistry/tools/dateTools' +import { DepositWithWallet } from './tools' + +const LockTokenRow = ({ + depositWithWallet, + index, +}: { + depositWithWallet: DepositWithWallet + index: number +}) => { + const connection = useWalletStore((s) => s.connection) + const { mint } = useRealm() + const fmtMangoAmount = (val) => { + return mint ? getMintDecimalAmount(mint!, val).toFormat(0) : '0' + } + const renderAddressName = useMemo(() => { + return ( + + ) + }, [depositWithWallet.wallet.toBase58()]) + const renderAddressImage = useMemo( + () => ( + } + /> + ), + [depositWithWallet.wallet.toBase58()] + ) + const type = Object.keys( + depositWithWallet.deposit.lockup.kind + )[0] as LockupType + const typeName = type !== 'monthly' ? type : 'Vested' + const isConstant = type === 'constant' + const lockedTokens = fmtMangoAmount( + depositWithWallet.deposit.amountDepositedNative + ) + return ( +
+
+ {renderAddressImage} {renderAddressName} +
+
{typeName}
+
+ {isConstant + ? getMinDurationFmt(depositWithWallet.deposit as any) + : getTimeLeftFromNowFmt(depositWithWallet.deposit as any)} +
+
{lockedTokens}
+
+ ) +} + +export default LockTokenRow diff --git a/VoteStakeRegistry/components/LockTokenStats/VestingVsTime.tsx b/VoteStakeRegistry/components/LockTokenStats/VestingVsTime.tsx new file mode 100644 index 0000000000..1c734fcfd4 --- /dev/null +++ b/VoteStakeRegistry/components/LockTokenStats/VestingVsTime.tsx @@ -0,0 +1,49 @@ +import { ResponsiveBar } from '@nivo/bar' + +const VestingVsTime = ({ data, fmtMangoAmount /* see data tab */ }) => ( + fmtMangoAmount(v.value)} + axisLeft={{ format: (v) => fmtMangoAmount(v) }} + labelSkipWidth={12} + labelSkipHeight={12} + labelTextColor="#fff" + role="application" + /> +) +export default VestingVsTime diff --git a/VoteStakeRegistry/components/LockTokenStats/tools.tsx b/VoteStakeRegistry/components/LockTokenStats/tools.tsx new file mode 100644 index 0000000000..1e373d24ed --- /dev/null +++ b/VoteStakeRegistry/components/LockTokenStats/tools.tsx @@ -0,0 +1,97 @@ +import { BN } from '@project-serum/anchor' +import { + ProposalTransaction, + getGovernanceSchemaForAccount, + getAccountTypes, + GovernanceAccountClass, + deserializeBorsh, + ProgramAccount, +} from '@solana/spl-governance' +import { PublicKey } from '@solana/web3.js' +import { ConnectionContext } from '@utils/connection' +import axios from 'axios' +import { Deposit } from 'VoteStakeRegistry/sdk/accounts' + +export interface DepositWithWallet { + voter: PublicKey + wallet: PublicKey + deposit: Deposit +} +export interface DepoistWithVoter { + amount: BN | undefined + voterPk: PublicKey + startTs: BN | undefined +} + +//TODO fcn specific to grant instruction => make it generic for all governanceAccounts and move to sdk +export const getProposalsTransactions = async ( + pubkeys: PublicKey[], + connection: ConnectionContext, + programId: PublicKey +) => { + const getTransactions = await axios.request({ + url: connection.endpoint, + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: JSON.stringify([ + ...pubkeys.map((x) => { + return { + jsonrpc: '2.0', + id: 1, + method: 'getProgramAccounts', + params: [ + programId.toBase58(), + { + commitment: connection.current.commitment, + encoding: 'base64', + filters: [ + { + memcmp: { + offset: 0, // number of bytes + bytes: 'E', // base58 encoded string + }, + }, + { + memcmp: { + offset: 1, + bytes: x.toBase58(), + }, + }, + ], + }, + ], + } + }), + ]), + }) + + const accounts: ProgramAccount[] = [] + const rawAccounts = getTransactions.data + ? getTransactions.data.flatMap((x) => x.result) + : [] + for (const rawAccount of rawAccounts) { + try { + const getSchema = getGovernanceSchemaForAccount + const data = Buffer.from(rawAccount.account.data[0], 'base64') + const accountTypes = getAccountTypes( + ProposalTransaction as any as GovernanceAccountClass + ) + const account: ProgramAccount = { + pubkey: new PublicKey(rawAccount.pubkey), + account: deserializeBorsh( + getSchema(accountTypes[1]), + ProposalTransaction, + data + ), + owner: new PublicKey(rawAccount.account.owner), + } + + accounts.push(account) + } catch (ex) { + console.info(`Can't deserialize @ ${rawAccount.pubkey}, ${ex}.`) + } + } + return accounts +} diff --git a/VoteStakeRegistry/components/TokenBalance/WithdrawCommunityTokensBtn.tsx b/VoteStakeRegistry/components/TokenBalance/WithdrawCommunityTokensBtn.tsx index 122386d791..735538deff 100644 --- a/VoteStakeRegistry/components/TokenBalance/WithdrawCommunityTokensBtn.tsx +++ b/VoteStakeRegistry/components/TokenBalance/WithdrawCommunityTokensBtn.tsx @@ -102,7 +102,7 @@ const WithDrawCommunityTokens = () => { // Note: We might hit single transaction limits here (accounts and size) if user has too many unrelinquished votes // It's not going to be an issue for now due to the limited number of proposals so I'm leaving it for now // As a temp. work around I'm leaving the 'Release Tokens' button on finalized Proposal to make it possible to release the tokens from one Proposal at a time - withRelinquishVote( + await withRelinquishVote( instructions, realmInfo!.programId, proposal.account.governance, @@ -123,8 +123,8 @@ const WithDrawCommunityTokens = () => { realmPk: realm!.pubkey!, amount: depositRecord!.amountDepositedNative, communityMintPk: realm!.account.communityMint, - tokenOwnerRecordPubKey: tokenRecords[wallet!.publicKey!.toBase58()] - .pubkey!, + tokenOwnerRecordPubKey: + tokenRecords[wallet!.publicKey!.toBase58()].pubkey!, depositIndex: depositRecord!.index, connection, client: client, diff --git a/VoteStakeRegistry/components/instructions/Clawback.tsx b/VoteStakeRegistry/components/instructions/Clawback.tsx index 42b2eacd74..efc8daabbe 100644 --- a/VoteStakeRegistry/components/instructions/Clawback.tsx +++ b/VoteStakeRegistry/components/instructions/Clawback.tsx @@ -21,7 +21,7 @@ import { Deposit, DepositWithMintAccount, getRegistrarPDA, - unusedMintPk, + emptyPk, Voter, } from 'VoteStakeRegistry/sdk/accounts' import Select from '@components/inputs/Select' @@ -43,10 +43,8 @@ const Clawback = ({ const client = useVotePluginsClientStore((s) => s.state.vsrClient) const connection = useWalletStore((s) => s.connection) const { realm } = useRealm() - const { - governedTokenAccountsWithoutNfts, - governancesArray, - } = useGovernanceAssets() + const { governedTokenAccountsWithoutNfts, governancesArray } = + useGovernanceAssets() const shouldBeGoverned = index !== 0 && governance const [voters, setVoters] = useState([]) const [deposits, setDeposits] = useState([]) @@ -76,8 +74,8 @@ const Clawback = ({ form.voter && form.deposit ) { - const clawbackDestination = form.governedTokenAccount!.extensions.token - .account.address + const clawbackDestination = + form.governedTokenAccount!.extensions.token.account.address const voterWalletAddress = form.voter.voterAuthority const clawbackIx = await getClawbackInstruction({ realmPk: realm!.pubkey, @@ -159,7 +157,7 @@ const Clawback = ({ const mints = {} if (mintCfgs) { for (const i of mintCfgs) { - if (i.mint.toBase58() !== unusedMintPk) { + if (i.mint.toBase58() !== emptyPk) { const mint = await tryGetMint(connection.current, i.mint) mints[i.mint.toBase58()] = mint } diff --git a/VoteStakeRegistry/sdk/accounts.tsx b/VoteStakeRegistry/sdk/accounts.tsx index 37f6716e11..a935073265 100644 --- a/VoteStakeRegistry/sdk/accounts.tsx +++ b/VoteStakeRegistry/sdk/accounts.tsx @@ -59,7 +59,7 @@ export interface DepositWithMintAccount extends Deposit { votingPowerBaseline: BN } -export const unusedMintPk = '11111111111111111111111111111111' +export const emptyPk = '11111111111111111111111111111111' export const getRegistrarPDA = async ( realmPk: PublicKey, diff --git a/VoteStakeRegistry/sdk/withCreateNewDeposit.ts b/VoteStakeRegistry/sdk/withCreateNewDeposit.ts index 3369b1c43d..8952535795 100644 --- a/VoteStakeRegistry/sdk/withCreateNewDeposit.ts +++ b/VoteStakeRegistry/sdk/withCreateNewDeposit.ts @@ -11,7 +11,6 @@ import { Token, TOKEN_PROGRAM_ID, } from '@solana/spl-token' -import { BN } from '@project-serum/anchor' import { getRegistrarPDA, getVoterPDA, @@ -33,6 +32,7 @@ export const withCreateNewDeposit = async ({ lockUpPeriodInDays, lockupKind, client, + allowClawback = false, }: { instructions: TransactionInstruction[] walletPk: PublicKey @@ -43,6 +43,7 @@ export const withCreateNewDeposit = async ({ tokenOwnerRecordPk: PublicKey | null lockUpPeriodInDays: number lockupKind: LockupType + allowClawback?: boolean client?: VsrClient }) => { if (!client) { @@ -89,20 +90,20 @@ export const withCreateNewDeposit = async ({ ) } if (!existingVoter) { - instructions.push( - client?.program.instruction.createVoter(voterBump, voterWeightBump, { - accounts: { - registrar: registrar, - voter: voter, - voterAuthority: walletPk, - voterWeightRecord: voterWeightPk, - payer: walletPk, - systemProgram: systemProgram, - rent: SYSVAR_RENT_PUBKEY, - instructions: SYSVAR_INSTRUCTIONS_PUBKEY, - }, + const createVoterIx = await client?.program.methods + .createVoter(voterBump, voterWeightBump) + .accounts({ + registrar: registrar, + voter: voter, + voterAuthority: walletPk, + voterWeightRecord: voterWeightPk, + payer: walletPk, + systemProgram: systemProgram, + rent: SYSVAR_RENT_PUBKEY, + instructions: SYSVAR_INSTRUCTIONS_PUBKEY, }) - ) + .instruction() + instructions.push(createVoterIx) } const mintCfgIdx = await getMintCfgIdx(registrar, mintPk, client) @@ -131,29 +132,28 @@ export const withCreateNewDeposit = async ({ if (createNewDeposit) { //in case we do monthly close up we pass months not days. const period = getPeriod(lockUpPeriodInDays, lockupKind) - const allowClawback = false - const startTime = new BN(new Date().getTime() / 1000) - const createDepositEntryInstruction = client?.program.instruction.createDepositEntry( - firstFreeIdx, - { [lockupKind]: {} }, - startTime, - period, - allowClawback, - { - accounts: { - registrar: registrar, - voter: voter, - payer: walletPk, - voterAuthority: walletPk, - depositMint: mintPk, - rent: SYSVAR_RENT_PUBKEY, - systemProgram: systemProgram, - tokenProgram: TOKEN_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - vault: voterATAPk, - }, - } - ) + const createDepositEntryInstruction = await client?.program.methods + .createDepositEntry( + firstFreeIdx, + { [lockupKind]: {} }, + //lockup starts now + null, + period, + allowClawback + ) + .accounts({ + registrar: registrar, + voter: voter, + payer: walletPk, + voterAuthority: walletPk, + depositMint: mintPk, + rent: SYSVAR_RENT_PUBKEY, + systemProgram: systemProgram, + tokenProgram: TOKEN_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + vault: voterATAPk, + }) + .instruction() instructions.push(createDepositEntryInstruction) } diff --git a/VoteStakeRegistry/sdk/withVoteRegistryDeposit.ts b/VoteStakeRegistry/sdk/withVoteRegistryDeposit.ts index ee06657f50..345191f1de 100644 --- a/VoteStakeRegistry/sdk/withVoteRegistryDeposit.ts +++ b/VoteStakeRegistry/sdk/withVoteRegistryDeposit.ts @@ -37,36 +37,29 @@ export const withVoteRegistryDeposit = async ({ throw 'no vote registry plugin' } - const { - depositIdx, - voter, - registrar, - voterATAPk, - } = await withCreateNewDeposit({ - instructions, - walletPk, - mintPk, - realmPk, - programId, - tokenOwnerRecordPk, - lockUpPeriodInDays, - lockupKind, - communityMintPk, - client, - }) - const depositInstruction = client?.program.instruction.deposit( - depositIdx, - amount, - { - accounts: { - registrar: registrar, - voter: voter, - vault: voterATAPk, - depositToken: fromPk, - depositAuthority: walletPk, - tokenProgram: TOKEN_PROGRAM_ID, - }, - } - ) + const { depositIdx, voter, registrar, voterATAPk } = + await withCreateNewDeposit({ + instructions, + walletPk, + mintPk, + realmPk, + programId, + tokenOwnerRecordPk, + lockUpPeriodInDays, + lockupKind, + communityMintPk, + client, + }) + const depositInstruction = await client?.program.methods + .deposit(depositIdx, amount) + .accounts({ + registrar: registrar, + voter: voter, + vault: voterATAPk, + depositToken: fromPk, + depositAuthority: walletPk, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .instruction() instructions.push(depositInstruction) } diff --git a/VoteStakeRegistry/sdk/withVoteRegistryWithdraw.ts b/VoteStakeRegistry/sdk/withVoteRegistryWithdraw.ts index 9c6d2971b3..f0b643d243 100644 --- a/VoteStakeRegistry/sdk/withVoteRegistryWithdraw.ts +++ b/VoteStakeRegistry/sdk/withVoteRegistryWithdraw.ts @@ -84,29 +84,29 @@ export const withVoteRegistryWithdraw = async ({ ) ) } - - instructions.push( - client?.program.instruction.withdraw(depositIndex!, amount, { - accounts: { - registrar: registrar, - voter: voter, - voterAuthority: walletPk, - tokenOwnerRecord: tokenOwnerRecordPubKey, - voterWeightRecord: voterWeightPk, - vault: voterATAPk, - destination: ataPk, - tokenProgram: TOKEN_PROGRAM_ID, - }, + const withdrawInstruction = await client?.program.methods + .withdraw(depositIndex!, amount) + .accounts({ + registrar: registrar, + voter: voter, + voterAuthority: walletPk, + tokenOwnerRecord: tokenOwnerRecordPubKey, + voterWeightRecord: voterWeightPk, + vault: voterATAPk, + destination: ataPk, + tokenProgram: TOKEN_PROGRAM_ID, }) - ) + .instruction() + instructions.push(withdrawInstruction) if (closeDepositAfterOperation) { - const close = client.program.instruction.closeDepositEntry(depositIndex, { - accounts: { + const close = await client.program.methods + .closeDepositEntry(depositIndex) + .accounts({ voter: voter, voterAuthority: walletPk, - }, - }) + }) + .instruction() instructions.push(close) } } diff --git a/VoteStakeRegistry/stores/useDepositStore.tsx b/VoteStakeRegistry/stores/useDepositStore.tsx index 35182b2697..7e7ebc0a98 100644 --- a/VoteStakeRegistry/stores/useDepositStore.tsx +++ b/VoteStakeRegistry/stores/useDepositStore.tsx @@ -2,8 +2,8 @@ import create, { State } from 'zustand' import { DepositWithMintAccount } from 'VoteStakeRegistry/sdk/accounts' import { Connection, PublicKey } from '@solana/web3.js' import { VsrClient } from '@blockworks-foundation/voter-stake-registry-client' -import { BN } from '@blockworks-foundation/voter-stake-registry-client/node_modules/@project-serum/anchor' import { getDeposits } from 'VoteStakeRegistry/tools/deposits' +import { BN } from '@project-serum/anchor' interface DepositStore extends State { state: { @@ -52,18 +52,15 @@ const useDepositStore = create((set, _get) => ({ client, connection, }) => { - const { - votingPower, - deposits, - votingPowerFromDeposits, - } = await getDeposits({ - isUsed, - realmPk, - walletPk, - communityMintPk, - client, - connection, - }) + const { votingPower, deposits, votingPowerFromDeposits } = + await getDeposits({ + isUsed, + realmPk, + walletPk, + communityMintPk, + client, + connection, + }) set((s) => { s.state.votingPower = votingPower diff --git a/VoteStakeRegistry/tools/dateTools.ts b/VoteStakeRegistry/tools/dateTools.ts index bcf1f2eb9a..8409bebcd8 100644 --- a/VoteStakeRegistry/tools/dateTools.ts +++ b/VoteStakeRegistry/tools/dateTools.ts @@ -18,9 +18,9 @@ export function getFormattedStringFromDays( const hours = (numberOfDays - Math.floor(numberOfDays)) * HOURS_PER_DAY const hoursInt = Math.floor(hours) const minutes = Math.floor((hours - hoursInt) * MINS_PER_HOUR) - const yearSuffix = years > 1 ? 'years' : 'year' - const monthSuffix = months > 1 ? 'months' : 'month' - const daysSuffix = days > 1 ? 'days' : 'day' + const yearSuffix = years > 1 ? ' years' : ' year' + const monthSuffix = months > 1 ? ' months' : ' month' + const daysSuffix = days > 1 ? ' days' : ' day' const yearsDisplay = years > 0 ? years + `${fullFormat ? yearSuffix : 'y'} ` : '' const monthsDisplay = diff --git a/VoteStakeRegistry/tools/deposits.ts b/VoteStakeRegistry/tools/deposits.ts index 00f9da0210..a5bab0c6e2 100644 --- a/VoteStakeRegistry/tools/deposits.ts +++ b/VoteStakeRegistry/tools/deposits.ts @@ -1,8 +1,5 @@ import { VsrClient } from '@blockworks-foundation/voter-stake-registry-client' -import { - BN, - EventParser, -} from '@blockworks-foundation/voter-stake-registry-client/node_modules/@project-serum/anchor' +import { BN, EventParser } from '@project-serum/anchor' import { ProgramAccount, Realm, @@ -13,7 +10,7 @@ import { tryGetMint } from '@utils/tokens' import { getRegistrarPDA, getVoterPDA, - unusedMintPk, + emptyPk, DepositWithMintAccount, LockupType, Registrar, @@ -52,7 +49,7 @@ export const getDeposits = async ({ let votingPowerFromDeposits = new BN(0) let deposits: DepositWithMintAccount[] = [] for (const i of mintCfgs) { - if (i.mint.toBase58() !== unusedMintPk) { + if (i.mint.toBase58() !== emptyPk) { const mint = await tryGetMint(connection, i.mint) mints[i.mint.toBase58()] = mint } @@ -70,7 +67,6 @@ export const getDeposits = async ({ .filter((x) => typeof isUsed === 'undefined' || x.isUsed === isUsed) const usedDeposits = deposits.filter((x) => x.isUsed) const areThereAnyUsedDeposits = usedDeposits.length - if (areThereAnyUsedDeposits) { const events = await getDepositsAdditionalInfoEvents( client, @@ -163,16 +159,16 @@ export const getPeriod = ( lockupKind !== MONTHLY ? lockUpPeriodInDays : lockUpPeriodInDays / DAYS_PER_MONTH - const maxMonthsNumber = 72 - const daysLimit = 2190 + // const maxMonthsNumber = 72 + // const daysLimit = 2190 //additional prevention of lockup being to high in case of monthly lockup 72 months as 6 years //in case of other types 2190 days as 6 years - if (lockupKind === MONTHLY && period > maxMonthsNumber) { - throw 'lockup period is to hight' - } - if (lockupKind !== MONTHLY && period > daysLimit) { - throw 'lockup period is to hight' - } + // if (lockupKind === MONTHLY && period > maxMonthsNumber) { + // throw 'lockup period is to hight' + // } + // if (lockupKind !== MONTHLY && period > daysLimit) { + // throw 'lockup period is to hight' + // } return period } @@ -192,12 +188,14 @@ export const calcMintMultiplier = ( maxExtraLockupVoteWeightScaledFactor, } = mintCfg const depositScaledFactorNum = baselineVoteWeightScaledFactor.toNumber() - const maxExtraLockupVoteWeightScaledFactorNum = maxExtraLockupVoteWeightScaledFactor.toNumber() + const maxExtraLockupVoteWeightScaledFactorNum = + maxExtraLockupVoteWeightScaledFactor.toNumber() const lockupSaturationSecsNum = lockupSaturationSecs.toNumber() //(deposit_scaled_factor + max_extra_lockup_vote_weight_scaled_factor * min(lockup_secs, lockup_saturation_secs) / lockup_saturation_secs) / deposit_scaled_factor const calced = calcMultiplier({ depositScaledFactor: depositScaledFactorNum, - maxExtraLockupVoteWeightScaledFactor: maxExtraLockupVoteWeightScaledFactorNum, + maxExtraLockupVoteWeightScaledFactor: + maxExtraLockupVoteWeightScaledFactorNum, lockupSaturationSecs: lockupSaturationSecsNum, lockupSecs, }) @@ -223,19 +221,16 @@ const getDepositsAdditionalInfoEvents = async ( const events: any[] = [] const parser = new EventParser(client.program.programId, client.program.coder) const maxRange = 8 - const itemsCount = usedDeposits.length - const numberOfSimulations = Math.ceil(itemsCount / maxRange) + const maxIndex = Math.max(...usedDeposits.map((x) => x.index)) + 1 + const numberOfSimulations = Math.ceil(maxIndex / maxRange) for (let i = 0; i < numberOfSimulations; i++) { const take = maxRange const transaction = new Transaction({ feePayer: walletPk }) - transaction.add( - client.program.instruction.logVoterInfo(maxRange * i, take, { - accounts: { - registrar, - voter, - }, - }) - ) + const logVoterInfoIx = await client.program.methods + .logVoterInfo(maxRange * i, take) + .accounts({ registrar, voter }) + .instruction() + transaction.add(logVoterInfoIx) const batchOfDeposits = await simulateTransaction( connection, transaction, diff --git a/actions/castVote.ts b/actions/castVote.ts index 928da799e7..069269b9aa 100644 --- a/actions/castVote.ts +++ b/actions/castVote.ts @@ -1,15 +1,11 @@ -import { - Keypair, - PublicKey, - Transaction, - TransactionInstruction, -} from '@solana/web3.js' +import { Keypair, Transaction, TransactionInstruction } from '@solana/web3.js' import { ChatMessageBody, getGovernanceProgramVersion, GOVERNANCE_CHAT_PROGRAM_ID, Proposal, Realm, + TokenOwnerRecord, withPostChatMessage, YesNoVote, } from '@solana/spl-governance' @@ -19,14 +15,17 @@ import { RpcContext } from '@solana/spl-governance' import { Vote } from '@solana/spl-governance' import { withCastVote } from '@solana/spl-governance' -import { sendTransaction } from '../utils/send' import { VotingClient } from '@utils/uiTypes/VotePlugin' +import { chunks } from '@utils/helpers' +import { sendTransactions, SequenceType } from '@utils/sendTransactions' +import { sendTransaction } from '@utils/send' +import { NftVoterClient } from '@solana/governance-program-library' export async function castVote( { connection, wallet, programId, walletPubkey }: RpcContext, realm: ProgramAccount, proposal: ProgramAccount, - tokeOwnerRecord: PublicKey, + tokeOwnerRecord: ProgramAccount, yesNoVote: YesNoVote, message?: ChatMessageBody | undefined, votingPlugin?: VotingClient @@ -46,7 +45,8 @@ export async function castVote( //will run only if any plugin is connected with realm const plugin = await votingPlugin?.withCastPluginVote( instructions, - proposal.pubkey + proposal, + tokeOwnerRecord ) await withCastVote( instructions, @@ -56,7 +56,7 @@ export async function castVote( proposal.account.governance, proposal.pubkey, proposal.account.tokenOwnerRecord, - tokeOwnerRecord, + tokeOwnerRecord.pubkey, governanceAuthority, proposal.account.governingTokenMint, Vote.fromYesNoVote(yesNoVote), @@ -68,6 +68,7 @@ export async function castVote( if (message) { const plugin = await votingPlugin?.withUpdateVoterWeightRecord( instructions, + tokeOwnerRecord, 'commentProposal' ) await withPostChatMessage( @@ -78,7 +79,7 @@ export async function castVote( realm.pubkey, proposal.account.governance, proposal.pubkey, - tokeOwnerRecord, + tokeOwnerRecord.pubkey, governanceAuthority, payer, undefined, @@ -86,9 +87,42 @@ export async function castVote( plugin?.voterWeightPk ) } + const shouldChunk = votingPlugin?.client instanceof NftVoterClient + const instructionsCountThatMustHaveTheirOwnChunk = message ? 4 : 2 + if (shouldChunk) { + const instructionsWithTheirOwnChunk = instructions.slice( + -instructionsCountThatMustHaveTheirOwnChunk + ) + const remainingInstructionsToChunk = instructions.slice( + 0, + instructions.length - instructionsCountThatMustHaveTheirOwnChunk + ) + const splInstructionsWithAccountsChunk = chunks( + instructionsWithTheirOwnChunk, + 2 + ) + const nftsAccountsChunks = chunks(remainingInstructionsToChunk, 2) + const signerChunks = Array( + splInstructionsWithAccountsChunk.length + nftsAccountsChunks.length + ).fill([]) + const singersMap = message + ? [...signerChunks.slice(0, signerChunks.length - 1), signers] + : signerChunks + const instructionsChunks = [ + ...nftsAccountsChunks, + ...splInstructionsWithAccountsChunk, + ] + await sendTransactions( + connection, + wallet, + instructionsChunks, + singersMap, + SequenceType.Sequential + ) + } else { + const transaction = new Transaction() + transaction.add(...instructions) - const transaction = new Transaction() - transaction.add(...instructions) - - await sendTransaction({ transaction, wallet, connection, signers }) + await sendTransaction({ transaction, wallet, connection, signers }) + } } diff --git a/actions/chat/postMessage.ts b/actions/chat/postMessage.ts index 1edf041f83..3965d01935 100644 --- a/actions/chat/postMessage.ts +++ b/actions/chat/postMessage.ts @@ -8,6 +8,7 @@ import { GOVERNANCE_CHAT_PROGRAM_ID, Proposal, Realm, + TokenOwnerRecord, } from '@solana/spl-governance' import { ChatMessageBody } from '@solana/spl-governance' import { withPostChatMessage } from '@solana/spl-governance' @@ -20,7 +21,7 @@ export async function postChatMessage( { connection, wallet, programId, walletPubkey }: RpcContext, realm: ProgramAccount, proposal: ProgramAccount, - tokeOwnerRecord: PublicKey, + tokeOwnerRecord: ProgramAccount, body: ChatMessageBody, replyTo?: PublicKey, client?: VotingClient @@ -30,10 +31,10 @@ export async function postChatMessage( const governanceAuthority = walletPubkey const payer = walletPubkey - //will run only if plugin is connected with realm const plugin = await client?.withUpdateVoterWeightRecord( instructions, + tokeOwnerRecord, 'commentProposal' ) @@ -45,7 +46,7 @@ export async function postChatMessage( realm.pubkey, proposal.account.governance, proposal.pubkey, - tokeOwnerRecord, + tokeOwnerRecord.pubkey, governanceAuthority, payer, replyTo, diff --git a/actions/createProposal.ts b/actions/createProposal.ts index 7ff29d61a8..00139bbffe 100644 --- a/actions/createProposal.ts +++ b/actions/createProposal.ts @@ -12,6 +12,7 @@ import { Governance, ProgramAccount, Realm, + TokenOwnerRecord, VoteType, withCreateProposal, } from '@solana/spl-governance' @@ -25,6 +26,7 @@ import { sendTransactions, SequenceType } from '@utils/sendTransactions' import { chunks } from '@utils/helpers' import { UiInstruction } from '@utils/uiTypes/proposalCreationTypes' import { VotingClient } from '@utils/uiTypes/VotePlugin' +import { NftVoterClient } from '@solana/governance-program-library' export interface InstructionDataWithHoldUpTime { data: InstructionData | null @@ -60,7 +62,7 @@ export const createProposal = async ( { connection, wallet, programId, walletPubkey }: RpcContext, realm: ProgramAccount, governance: PublicKey, - tokenOwnerRecord: PublicKey, + tokenOwnerRecord: ProgramAccount, name: string, descriptionLink: string, governingTokenMint: PublicKey, @@ -98,6 +100,7 @@ export const createProposal = async ( //will run only if plugin is connected with realm const plugin = await client?.withUpdateVoterWeightRecord( instructions, + tokenOwnerRecord, 'createProposal' ) @@ -107,7 +110,7 @@ export const createProposal = async ( programVersion, realm.pubkey!, governance, - tokenOwnerRecord, + tokenOwnerRecord.pubkey, name, descriptionLink, governingTokenMint, @@ -125,7 +128,7 @@ export const createProposal = async ( programId, programVersion, proposalAddress, - tokenOwnerRecord, + tokenOwnerRecord.pubkey, governanceAuthority, signatory, payer @@ -156,7 +159,7 @@ export const createProposal = async ( programVersion, governance, proposalAddress, - tokenOwnerRecord, + tokenOwnerRecord.pubkey, governanceAuthority, index, 0, @@ -207,7 +210,11 @@ export const createProposal = async ( sendingMessage: `inserting into ${notificationTitle}`, successMessage: `inserted into ${notificationTitle}`, }) - } else if (insertInstructionCount <= 2 && !splitToChunkByDefault) { + } else if ( + insertInstructionCount <= 2 && + !splitToChunkByDefault && + !(client?.client instanceof NftVoterClient) + ) { // This is an arbitrary threshold and we assume that up to 2 instructions can be inserted as a single Tx // This is conservative setting and we might need to revise it if we have more empirical examples or // reliable way to determine Tx size diff --git a/actions/createTreasuryAccount.ts b/actions/createTreasuryAccount.ts index 49756ca8e1..d3cb951a87 100644 --- a/actions/createTreasuryAccount.ts +++ b/actions/createTreasuryAccount.ts @@ -10,6 +10,7 @@ import { GovernanceConfig, ProgramAccount, Realm, + TokenOwnerRecord, withCreateGovernance, withCreateNativeTreasury, } from '@solana/spl-governance' @@ -25,7 +26,7 @@ export const createTreasuryAccount = async ( realm: ProgramAccount, mint: PublicKey | null, config: GovernanceConfig, - tokenOwnerRecord: PublicKey, + tokenOwnerRecord: ProgramAccount, client?: VotingClient ): Promise => { const instructions: TransactionInstruction[] = [] @@ -41,6 +42,7 @@ export const createTreasuryAccount = async ( //will run only if plugin is connected with realm const plugin = await client?.withUpdateVoterWeightRecord( instructions, + tokenOwnerRecord, 'createGovernance' ) @@ -66,7 +68,7 @@ export const createTreasuryAccount = async ( config, true, walletPubkey, - tokenOwnerRecord, + tokenOwnerRecord.pubkey, walletPubkey, governanceAuthority, plugin?.voterWeightPk @@ -78,7 +80,7 @@ export const createTreasuryAccount = async ( realm.pubkey, undefined, config, - tokenOwnerRecord, + tokenOwnerRecord.pubkey, walletPubkey, governanceAuthority, plugin?.voterWeightPk diff --git a/actions/dryRunInstruction.ts b/actions/dryRunInstruction.ts index ec35c835ba..275b5f2235 100644 --- a/actions/dryRunInstruction.ts +++ b/actions/dryRunInstruction.ts @@ -12,12 +12,23 @@ export async function dryRunInstruction( connection: Connection, wallet: WalletAdapter, instructionData: InstructionData, - prerequisiteInstructionsToRun?: TransactionInstruction[] | undefined + prerequisiteInstructionsToRun?: TransactionInstruction[] | undefined, + additionalInstructions?: InstructionData[] ) { const transaction = new Transaction({ feePayer: wallet.publicKey }) if (prerequisiteInstructionsToRun) { prerequisiteInstructionsToRun.map((x) => transaction.add(x)) } + if (additionalInstructions) { + for (const i of additionalInstructions) { + transaction.add({ + keys: i.accounts, + programId: i.programId, + data: Buffer.from(i.data), + }) + } + } + transaction.add({ keys: instructionData.accounts, programId: instructionData.programId, diff --git a/actions/registerProgramGovernance.ts b/actions/registerProgramGovernance.ts index 7ca164bedf..e73e073710 100644 --- a/actions/registerProgramGovernance.ts +++ b/actions/registerProgramGovernance.ts @@ -9,6 +9,7 @@ import { GovernanceType, ProgramAccount, Realm, + TokenOwnerRecord, } from '@solana/spl-governance' import { GovernanceConfig } from '@solana/spl-governance' import { withCreateProgramGovernance } from '@solana/spl-governance' @@ -23,7 +24,7 @@ export const registerProgramGovernance = async ( governedAccount: PublicKey, config: GovernanceConfig, transferAuthority: boolean, - tokenOwnerRecord: PublicKey, + tokenOwnerRecord: ProgramAccount, client?: VotingClient ): Promise => { const instructions: TransactionInstruction[] = [] @@ -41,6 +42,7 @@ export const registerProgramGovernance = async ( //will run only if plugin is connected with realm const plugin = await client?.withUpdateVoterWeightRecord( instructions, + tokenOwnerRecord, 'createGovernance' ) @@ -55,7 +57,7 @@ export const registerProgramGovernance = async ( config, transferAuthority!, walletPubkey, - tokenOwnerRecord, + tokenOwnerRecord.pubkey, walletPubkey, governanceAuthority, plugin?.voterWeightPk diff --git a/actions/relinquishVote.ts b/actions/relinquishVote.ts index d6e1d3e95f..15cdb4f399 100644 --- a/actions/relinquishVote.ts +++ b/actions/relinquishVote.ts @@ -11,6 +11,8 @@ import { ProgramAccount } from '@solana/spl-governance' import { sendTransaction } from '../utils/send' import { withRelinquishVote } from '@solana/spl-governance' import { VotingClient } from '@utils/uiTypes/VotePlugin' +import { chunks } from '@utils/helpers' +import { sendTransactions, SequenceType } from '@utils/sendTransactions' export const relinquishVote = async ( { connection, wallet, programId, walletPubkey }: RpcContext, @@ -24,7 +26,7 @@ export const relinquishVote = async ( const governanceAuthority = walletPubkey const beneficiary = walletPubkey - withRelinquishVote( + await withRelinquishVote( instructions, programId, proposal.account.governance, @@ -35,11 +37,24 @@ export const relinquishVote = async ( governanceAuthority, beneficiary ) - await plugin.withRelinquishVote(instructions, proposal, voteRecord) + const chunkTreshold = 2 + const shouldChunk = instructions.length > chunkTreshold + if (shouldChunk) { + const insertChunks = chunks(instructions, 2) + const signerChunks = Array(instructions.length).fill([]) + const instArray = [...insertChunks] + await sendTransactions( + connection, + wallet, + instArray, + [...signerChunks], + SequenceType.Sequential + ) + } else { + const transaction = new Transaction() + transaction.add(...instructions) - const transaction = new Transaction() - transaction.add(...instructions) - - await sendTransaction({ transaction, wallet, connection, signers }) + await sendTransaction({ transaction, wallet, connection, signers }) + } } diff --git a/components/AssetsList/AssetItem.tsx b/components/AssetsList/AssetItem.tsx index 375ed362bf..a69bac7bb2 100644 --- a/components/AssetsList/AssetItem.tsx +++ b/components/AssetsList/AssetItem.tsx @@ -61,7 +61,7 @@ const AssetItem = ({ { /> { - } + icon={} > { /> - {enableTelegramInput && ( + {telegramEnabled && ( } > { ? 'Save settings for notifications' : 'Fetch stored values for existing accounts' } - className="sm:w-1/2" + className="sm:w-full" disabled={disabled} onClick={ hasUnsavedChanges || isAuthenticated() @@ -262,21 +302,26 @@ const NotificationsCard = () => { } isLoading={isLoading} > - {hasUnsavedChanges || isAuthenticated() ? 'Save' : 'Refresh'} + {hasUnsavedChanges || isAuthenticated() + ? 'Subscribe' + : 'Refresh'} - @@ -302,7 +347,7 @@ const InputRow: FunctionComponent = ({ label, }) => { return ( -
+
{icon} {label} diff --git a/components/RealmHeader.tsx b/components/RealmHeader.tsx index 72ae64793b..e87a470674 100644 --- a/components/RealmHeader.tsx +++ b/components/RealmHeader.tsx @@ -1,6 +1,6 @@ import React from 'react' import useRealm from 'hooks/useRealm' -import { CogIcon, UsersIcon } from '@heroicons/react/outline' +import { ChartPieIcon, CogIcon, UsersIcon } from '@heroicons/react/outline' import { ChevronLeftIcon, BadgeCheckIcon } from '@heroicons/react/solid' import Link from 'next/link' import useQueryContext from 'hooks/useQueryContext' @@ -8,13 +8,18 @@ import { ExternalLinkIcon } from '@heroicons/react/outline' import { getRealmExplorerHost } from 'tools/routing' import Tooltip from './Tooltip' import useMembersStore from 'stores/useMembersStore' +import { vsrPluginsPks } from '@hooks/useVotingPlugins' const RealmHeader = () => { const { fmtUrlWithCluster } = useQueryContext() - const { realm, realmInfo, realmDisplayName, symbol } = useRealm() + const { realm, realmInfo, realmDisplayName, symbol, config } = useRealm() const { REALM } = process.env const activeMembers = useMembersStore((s) => s.compact.activeMembers) - + const isLockTokensMode = + config?.account.communityVoterWeightAddin && + vsrPluginsPks.includes( + config?.account.communityVoterWeightAddin?.toBase58() + ) const isBackNavVisible = realmInfo?.symbol !== REALM // hide backnav for the default realm const explorerHost = getRealmExplorerHost(realmInfo) @@ -72,6 +77,14 @@ const RealmHeader = () => { )} + {isLockTokensMode && symbol === 'MNGO' && ( + + + + MNGO stats + + + )} diff --git a/components/TableElements.tsx b/components/TableElements.tsx new file mode 100644 index 0000000000..744c5556db --- /dev/null +++ b/components/TableElements.tsx @@ -0,0 +1,107 @@ +import { Disclosure, Transition } from '@headlessui/react' +import { ChevronDownIcon } from '@heroicons/react/solid' +import { Fragment, ReactNode } from 'react' +import dayjs from 'dayjs' + +export const Table = ({ children }) => ( + {children}
+) + +export const TrHead = ({ children }) => ( + {children} +) + +export const Th = ({ children }) => ( + + {children} + +) + +export const TrBody = ({ children, className = '' }) => ( + {children} +) + +export const Td = ({ + children, + className, +}: { + children: ReactNode + className?: string +}) => ( + {children} +) + +type ExpandableRowProps = { + buttonTemplate: React.ReactNode + panelTemplate: React.ReactNode + rounded?: boolean +} + +export const ExpandableRow = ({ + buttonTemplate, + panelTemplate, + rounded, +}: ExpandableRowProps) => { + return ( + + {({ open }) => ( + <> + + {buttonTemplate} +
+ +
+
+ + +
{panelTemplate}
+
+
+ + )} +
+ ) +} + +type RowProps = { + children: React.ReactNode +} + +export const Row = ({ children }: RowProps) => { + return ( +
+ {children} +
+ ) +} + +export const TableDateDisplay = ({ date }: { date: string | number }) => ( + <> +

{dayjs(date).format('DD MMM YYYY')}

+

{dayjs(date).format('h:mma')}

+ +) diff --git a/components/TokenBalance/NftBalanceCard.tsx b/components/TokenBalance/NftBalanceCard.tsx index 13840d4712..8991dda06e 100644 --- a/components/TokenBalance/NftBalanceCard.tsx +++ b/components/TokenBalance/NftBalanceCard.tsx @@ -43,21 +43,20 @@ const NftBalanceCard = () => { wallet!.publicKey!, client.client!.program.programId ) - instructions.push( - (client.client as NftVoterClient).program.instruction.createVoterWeightRecord( - wallet!.publicKey!, - { - accounts: { - voterWeightRecord: voterWeightPk, - governanceProgramId: realm!.owner, - realm: realm!.pubkey, - realmGoverningTokenMint: realm!.account.communityMint, - payer: wallet!.publicKey!, - systemProgram: SYSTEM_PROGRAM_ID, - }, - } - ) - ) + const createVoterWeightRecordIx = await ( + client.client as NftVoterClient + ).program.methods + .createVoterWeightRecord(wallet!.publicKey!) + .accounts({ + voterWeightRecord: voterWeightPk, + governanceProgramId: realm!.owner, + realm: realm!.pubkey, + realmGoverningTokenMint: realm!.account.communityMint, + payer: wallet!.publicKey!, + systemProgram: SYSTEM_PROGRAM_ID, + }) + .instruction() + instructions.push(createVoterWeightRecordIx) await withCreateTokenOwnerRecord( instructions, realm!.owner!, @@ -128,7 +127,7 @@ const NftBalanceCard = () => { onNftSelect={() => { return null }} - ownerPk={wallet!.publicKey!} + ownersPk={[wallet!.publicKey!]} nftHeight="50px" nftWidth="50px" selectable={false} @@ -140,7 +139,7 @@ const NftBalanceCard = () => {
{connected && !ownTokenRecord && ( )}
diff --git a/components/TokenBalance/TokenBalanceCard.tsx b/components/TokenBalance/TokenBalanceCard.tsx index ccc3edf8d5..a960d7342f 100644 --- a/components/TokenBalance/TokenBalanceCard.tsx +++ b/components/TokenBalance/TokenBalanceCard.tsx @@ -286,7 +286,7 @@ const TokenDeposit = ({ // Note: We might hit single transaction limits here (accounts and size) if user has too many unrelinquished votes // It's not going to be an issue for now due to the limited number of proposals so I'm leaving it for now // As a temp. work around I'm leaving the 'Release Tokens' button on finalized Proposal to make it possible to release the tokens from one Proposal at a time - withRelinquishVote( + await withRelinquishVote( instructions, realmInfo!.programId, proposal.account.governance, diff --git a/components/TokenBalance/TokenBalanceCardWrapper.tsx b/components/TokenBalance/TokenBalanceCardWrapper.tsx index d5da213469..6a5c37fdc5 100644 --- a/components/TokenBalance/TokenBalanceCardWrapper.tsx +++ b/components/TokenBalance/TokenBalanceCardWrapper.tsx @@ -18,12 +18,8 @@ const TokenBalanceCardWrapper = ({ }: { proposal?: Option }) => { - const { - ownTokenRecord, - config, - ownCouncilTokenRecord, - councilTokenAccount, - } = useRealm() + const { ownTokenRecord, config, ownCouncilTokenRecord, councilTokenAccount } = + useRealm() const currentPluginPk = config?.account?.communityVoterWeightAddin const getTokenBalanceCard = () => { //based on realm config it will provide proper tokenBalanceCardComponent @@ -46,8 +42,10 @@ const TokenBalanceCardWrapper = ({ return ( <> - {(!ownCouncilTokenRecord?.account.governingTokenDepositAmount.isZero() || - !councilTokenAccount?.account.amount.isZero()) && ( + {((ownCouncilTokenRecord && + !ownCouncilTokenRecord?.account.governingTokenDepositAmount.isZero()) || + (councilTokenAccount && + !councilTokenAccount?.account.amount.isZero())) && ( )} diff --git a/components/TreasuryAccount/AccountHeader.tsx b/components/TreasuryAccount/AccountHeader.tsx index 02004f2635..35a1b8d662 100644 --- a/components/TreasuryAccount/AccountHeader.tsx +++ b/components/TreasuryAccount/AccountHeader.tsx @@ -7,10 +7,10 @@ import BaseAccountHeader from './BaseAccountHeader' const AccountHeader = () => { const currentAccount = useTreasuryAccountStore((s) => s.currentAccount) - const governanceNfts = useTreasuryAccountStore((s) => s.governanceNfts) + const nftsPerPubkey = useTreasuryAccountStore((s) => s.governanceNfts) const nftsCount = currentAccount?.governance && currentAccount.isNft - ? governanceNfts[currentAccount?.governance?.pubkey.toBase58()]?.length + ? nftsPerPubkey[currentAccount?.governance?.pubkey.toBase58()]?.length : 0 const isNFT = currentAccount?.isNft const tokenInfo = useTreasuryAccountStore((s) => s.tokenInfo) diff --git a/components/TreasuryAccount/AccountItemNFT.tsx b/components/TreasuryAccount/AccountItemNFT.tsx index 9a14dc200c..1c20e59346 100644 --- a/components/TreasuryAccount/AccountItemNFT.tsx +++ b/components/TreasuryAccount/AccountItemNFT.tsx @@ -17,7 +17,7 @@ const AccountItemNFT = ({ border?: boolean }) => { const connection = useWalletStore((s) => s.connection) - const governanceNfts = useTreasuryAccountStore((s) => s.governanceNfts) + const nftsPerPubkey = useTreasuryAccountStore((s) => s.governanceNfts) const { setCurrentAccount } = useTreasuryAccountStore() const accountPublicKey = governedAccountTokenAccount @@ -30,6 +30,14 @@ const AccountItemNFT = ({ const info = governedAccountTokenAccount.isSol ? tokenService.getTokenInfo(WSOL_MINT) : undefined + const nftsCount = governedAccountTokenAccount.isSol + ? nftsPerPubkey[governedAccountTokenAccount.governance.pubkey.toBase58()] + ?.length + + nftsPerPubkey[ + governedAccountTokenAccount.extensions.transferAddress!.toBase58() + ]?.length + : nftsPerPubkey[governedAccountTokenAccount.governance.pubkey.toBase58()] + ?.length return (
- {governedAccountTokenAccount.governance - ? governanceNfts[ - governedAccountTokenAccount.governance.pubkey.toBase58() - ]?.length - : 0}{' '} - NFTS + {governedAccountTokenAccount.governance ? nftsCount : 0} NFTS
diff --git a/components/TreasuryAccount/AccountOverview.tsx b/components/TreasuryAccount/AccountOverview.tsx index c9262c8835..7a708e450d 100644 --- a/components/TreasuryAccount/AccountOverview.tsx +++ b/components/TreasuryAccount/AccountOverview.tsx @@ -15,7 +15,6 @@ import useWalletStore from 'stores/useWalletStore' import AccountHeader from './AccountHeader' import DepositNFT from './DepositNFT' import SendTokens from './SendTokens' -import GenericSendTokens, { GenericSendTokensProps } from './GenericSendTokens' import { ExternalLinkIcon, PlusCircleIcon, @@ -35,19 +34,23 @@ import { } from 'Strategies/protocols/mango/tools' import useMarketStore from 'Strategies/store/marketStore' import LoadingRows from './LoadingRows' +import TradeOnSerum, { TradeOnSerumProps } from './TradeOnSerum' +import { AccountType } from '@utils/uiTypes/assets' const AccountOverview = () => { const router = useRouter() const currentAccount = useTreasuryAccountStore((s) => s.currentAccount) - const governanceNfts = useTreasuryAccountStore((s) => s.governanceNfts) + const nftsPerPubkey = useTreasuryAccountStore((s) => s.governanceNfts) const nftsCount = currentAccount?.governance && currentAccount.isNft - ? governanceNfts[currentAccount?.governance?.pubkey.toBase58()]?.length + ? nftsPerPubkey[currentAccount?.governance?.pubkey.toBase58()]?.length : 0 const { symbol } = useRealm() const { fmtUrlWithCluster } = useQueryContext() const isNFT = currentAccount?.isNft const isSol = currentAccount?.isSol + const isSplToken = currentAccount?.type === AccountType.TOKEN + const isAuxiliaryAccount = currentAccount?.type === AccountType.AuxiliaryToken const { canUseTransferInstruction } = useGovernanceAssets() const connection = useWalletStore((s) => s.connection) const recentActivity = useTreasuryAccountStore((s) => s.recentActivity) @@ -69,15 +72,11 @@ const AccountOverview = () => { TreasuryStrategy[] >([]) const [showStrategies, setShowStrategies] = useState(false) - const [ - genericSendTokenInfo, - setGenericSendTokenInfo, - ] = useState(null) - const [ - proposedInvestment, - setProposedInvestment, - ] = useState(null) + const [proposedInvestment, setProposedInvestment] = + useState(null) const [isCopied, setIsCopied] = useState(false) + const [tradeSerumInfo, setTradeSerumInfo] = + useState(null) useEffect(() => { if (strategies.length > 0) { @@ -157,9 +156,7 @@ const AccountOverview = () => {

{ - const url = fmtUrlWithCluster( - `/dao/${symbol}/gallery/${currentAccount.extensions.transferAddress}` - ) + const url = fmtUrlWithCluster(`/dao/${symbol}/gallery`) router.push(url) }} > @@ -170,7 +167,7 @@ const AccountOverview = () => { className="default-transition flex items-center text-primary-light hover:text-primary-dark text-sm" href={ accountPublicKey - ? getExplorerUrl(connection.endpoint, accountPublicKey) + ? getExplorerUrl(connection.cluster, accountPublicKey) : '' } target="_blank" @@ -184,16 +181,16 @@ const AccountOverview = () => {

-
+
{isCopied && (
Copied to Clipboard
)}
- - {isSol ? ( + {isSplToken && ( + )} + {!isAuxiliaryAccount && ( + + )} + {isSol ? ( + ) : null}
-
-
-

- {showStrategies ? 'Available Investments' : 'Current Investments'} -

- setShowStrategies(!showStrategies)} - > - {showStrategies ? ( - <> - - Cancel - + {!isAuxiliaryAccount && ( +
+
+

+ {showStrategies ? 'Available Investments' : 'Current Investments'} +

+ setShowStrategies(!showStrategies)} + > + {showStrategies ? ( + <> + + Cancel + + ) : ( + <> + + New Investment + + )} + +
+ {showStrategies ? ( + eligibleInvestments.length > 0 ? ( + eligibleInvestments.map((strat, i) => ( + setProposedInvestment(strat)} + strat={strat} + /> + )) ) : ( - <> - - New Investment - - )} - -
- {showStrategies ? ( - eligibleInvestments.length > 0 ? ( - eligibleInvestments.map((strat, i) => ( +
+

+ No investments available for this account +

+
+ ) + ) : accountInvestments.length > 0 ? ( + accountInvestments.map((strat, i) => ( setProposedInvestment(strat)} strat={strat} + currentMangoDeposits={currentMangoDeposits} /> )) ) : (

- No investments available for this account + No investments for this account

- ) - ) : accountInvestments.length > 0 ? ( - accountInvestments.map((strat, i) => ( - - )) - ) : ( -
-

- No investments for this account -

-
- )} -
+ )} +
+ )}

Recent Activity

{isLoadingRecentActivity ? ( @@ -300,11 +315,7 @@ const AccountOverview = () => { { )} - {genericSendTokenInfo && ( + {tradeSerumInfo && ( { - setGenericSendTokenInfo(null) + setTradeSerumInfo(null) }} - isOpen={!!genericSendTokenInfo} + isOpen={!!tradeSerumInfo} > - + )} diff --git a/components/TreasuryAccount/AccountsCompactWrapper.tsx b/components/TreasuryAccount/AccountsCompactWrapper.tsx index a268165b81..cb47112ea4 100644 --- a/components/TreasuryAccount/AccountsCompactWrapper.tsx +++ b/components/TreasuryAccount/AccountsCompactWrapper.tsx @@ -15,7 +15,12 @@ import useGovernanceAssetsStore from 'stores/useGovernanceAssetsStore' import Loading from '@components/Loading' const AccountsCompactWrapper = () => { - const { governedTokenAccountsWithoutNfts } = useGovernanceAssets() + const { governedTokenAccountsWithoutNfts, auxiliaryTokenAccounts } = + useGovernanceAssets() + const accounts = [ + ...governedTokenAccountsWithoutNfts, + ...auxiliaryTokenAccounts, + ] const { ownVoterWeight, symbol, @@ -47,7 +52,7 @@ const AccountsCompactWrapper = () => {
- {governedTokenAccountsWithoutNfts.length ? ( + {accounts.length ? (
diff --git a/components/TreasuryAccount/AccountsItems.tsx b/components/TreasuryAccount/AccountsItems.tsx index 07655c80fb..a978773b24 100644 --- a/components/TreasuryAccount/AccountsItems.tsx +++ b/components/TreasuryAccount/AccountsItems.tsx @@ -1,12 +1,23 @@ import useGovernanceAssets from '@hooks/useGovernanceAssets' +import { getTreasuryAccountItemInfoV2 } from '@utils/treasuryTools' import React from 'react' import AccountItem from './AccountItem' const AccountsItems = () => { - const { governedTokenAccountsWithoutNfts } = useGovernanceAssets() + const { governedTokenAccountsWithoutNfts, auxiliaryTokenAccounts } = + useGovernanceAssets() + const accounts = [ + ...governedTokenAccountsWithoutNfts, + ...auxiliaryTokenAccounts, + ] + const accountsSorted = accounts.sort((a, b) => { + const infoA = getTreasuryAccountItemInfoV2(a) + const infoB = getTreasuryAccountItemInfoV2(b) + return infoB.totalPrice - infoA.totalPrice + }) return (
- {governedTokenAccountsWithoutNfts.map((account) => { + {accountsSorted.map((account) => { return ( { const currentAccount = useTreasuryAccountStore((s) => s.currentAccount) const connection = useWalletStore((s) => s.connection) const connected = useWalletStore((s) => s.connected) - const [ - currentDepositView, - setCurrentDepositView, - ] = useState(null) + const [currentDepositView, setCurrentDepositView] = + useState(null) return ( <> @@ -36,7 +34,7 @@ const DepositNFT = ({ onClose }) => { href={ currentAccount?.governance?.pubkey ? getExplorerUrl( - connection.endpoint, + connection.cluster, currentAccount!.governance!.pubkey.toBase58() ) : '' diff --git a/components/TreasuryAccount/DepositNFTFromWallet.tsx b/components/TreasuryAccount/DepositNFTFromWallet.tsx index e4351732c0..d2b9f40bc8 100644 --- a/components/TreasuryAccount/DepositNFTFromWallet.tsx +++ b/components/TreasuryAccount/DepositNFTFromWallet.tsx @@ -50,7 +50,7 @@ const DepositNFTFromWallet = ({ additionalBtns }: { additionalBtns?: any }) => { (x) => x.account.owner.toBase58() === ConnectedWalletAddress?.toBase58() )?.publicKey //we check is there ata created for nft before - const isAtaForGovernanceExist = tokenAccountsWithNftMint.find( + const doseAtaForReciverAddressExisit = tokenAccountsWithNftMint.find( (x) => x.account.owner.toBase58() === owner.toBase58() ) @@ -61,7 +61,7 @@ const DepositNFTFromWallet = ({ additionalBtns }: { additionalBtns?: any }) => { owner!, // owner true ) - if (!isAtaForGovernanceExist) { + if (!doseAtaForReciverAddressExisit) { await createATA( connection.current, wallet, @@ -114,7 +114,7 @@ const DepositNFTFromWallet = ({ additionalBtns }: { additionalBtns?: any }) => { > setSelectedNfts(selected)} >
diff --git a/components/TreasuryAccount/GenericSendTokens.tsx b/components/TreasuryAccount/GenericSendTokens.tsx deleted file mode 100644 index 540307f98c..0000000000 --- a/components/TreasuryAccount/GenericSendTokens.tsx +++ /dev/null @@ -1,442 +0,0 @@ -import Button from '@components/Button' -import Input from '@components/inputs/Input' -import { getAccountName } from '@components/instructions/tools' -import useRealm from '@hooks/useRealm' -import { AccountInfo } from '@solana/spl-token' -import { PublicKey } from '@solana/web3.js' -import { - fmtTokenInfoWithMint, - getMintDecimalAmountFromNatural, - // getMintDecimalAmountFromNatural, - getMintMinAmountAsDecimal, - getMintNaturalAmountFromDecimalAsBN, -} from '@tools/sdk/units' -import { tryParseKey } from '@tools/validators/pubkey' -import { debounce } from '@utils/debounce' -import { abbreviateAddress, precision } from '@utils/formatting' -import { TokenProgramAccount, tryGetTokenAccount } from '@utils/tokens' -import { - SendTokenCompactViewForm, - UiInstruction, -} from '@utils/uiTypes/proposalCreationTypes' -import React, { useEffect, useState } from 'react' -import useTreasuryAccountStore, { - TokenInfoWithMint, -} from 'stores/useTreasuryAccountStore' -import useWalletStore from 'stores/useWalletStore' - -import { getTokenTransferSchema } from '@utils/validations' -import { - ArrowCircleDownIcon, - ArrowCircleUpIcon, - // InformationCircleIcon, -} from '@heroicons/react/solid' -import tokenService from '@utils/services/token' -import BigNumber from 'bignumber.js' -import { getInstructionDataFromBase64 } from '@solana/spl-governance' -import useQueryContext from '@hooks/useQueryContext' -import { Governance } from '@solana/spl-governance' -import { ProgramAccount } from '@solana/spl-governance' -import { useRouter } from 'next/router' -import { notify } from '@utils/notifications' -import Textarea from '@components/inputs/Textarea' -import AccountLabel from './BaseAccountHeader' -import Tooltip from '@components/Tooltip' -import useGovernanceAssets from '@hooks/useGovernanceAssets' -import { getGenericTransferInstruction } from '@utils/instructionTools' -import VoteBySwitch from 'pages/dao/[symbol]/proposal/components/VoteBySwitch' -import NFTSelector from '@components/NFTS/NFTSelector' -import { NFTWithMint } from '@utils/uiTypes/nfts' -import useTotalTokenValue from '@hooks/useTotalTokenValue' -import useCreateProposal from '@hooks/useCreateProposal' - -export type GenericSendTokensProps = { - mintBeingTransferred: PublicKey - mintDecimals: number - tokenSource: PublicKey - tokenAccount: TokenInfoWithMint -} - -const GenericSendTokens: React.FC = ({ - mintBeingTransferred, - mintDecimals, - tokenSource, - tokenAccount, -}) => { - const tokenInfo = tokenAccount.tokenInfo - const currentAccount = useTreasuryAccountStore((s) => s.currentAccount) - const connection = useWalletStore((s) => s.connection) - const { realmInfo, symbol, realm, canChooseWhoVote } = useRealm() - const { handleCreateProposal } = useCreateProposal() - const { canUseTransferInstruction } = useGovernanceAssets() - const isNFT = currentAccount?.isNft - const { fmtUrlWithCluster } = useQueryContext() - const wallet = useWalletStore((s) => s.current) - const router = useRouter() - const { fetchRealmGovernance } = useWalletStore((s) => s.actions) - const programId: PublicKey | undefined = realmInfo?.programId - const [form, setForm] = useState({ - destinationAccount: '', - amount: isNFT ? 1 : undefined, - governedTokenAccount: undefined, - programId: programId?.toString(), - mintInfo: undefined, - title: '', - description: '', - }) - const totalPrice = useTotalTokenValue({ - amount: getMintDecimalAmountFromNatural( - tokenAccount.mintInfo, - tokenAccount.amount - ).toNumber(), - mintAddress: tokenAccount.mint.toString(), - }) - const [selectedNfts, setSelectedNfts] = useState([]) - const [voteByCouncil, setVoteByCouncil] = useState(false) - const [showOptions, setShowOptions] = useState(false) - const [ - destinationAccount, - setDestinationAccount, - ] = useState | null>(null) - const [isLoading, setIsLoading] = useState(false) - const [formErrors, setFormErrors] = useState({}) - const destinationAccountName = - destinationAccount?.publicKey && - getAccountName(destinationAccount?.account.address) - const mintMinAmount = form.governedTokenAccount?.extensions.mint - ? getMintMinAmountAsDecimal( - form.governedTokenAccount.extensions!.mint!.account - ) - : 1 - const currentPrecision = precision(mintMinAmount) - - const handleSetForm = ({ propertyName, value }) => { - setFormErrors({}) - setForm({ ...form, [propertyName]: value }) - } - const setAmount = (event) => { - const value = event.target.value - handleSetForm({ - value: value, - propertyName: 'amount', - }) - } - const validateAmountOnBlur = () => { - const value = form.amount - - handleSetForm({ - value: parseFloat( - Math.max( - Number(mintMinAmount), - Math.min(Number(Number.MAX_SAFE_INTEGER), Number(value)) - ).toFixed(currentPrecision) - ), - propertyName: 'amount', - }) - } - - const calcTransactionDolarAmount = (amount) => { - const price = tokenService.getUSDTokenPrice( - currentAccount!.extensions!.mint!.publicKey.toBase58() - ) - const totalPrice = amount * price - const totalPriceFormatted = - amount && price ? new BigNumber(totalPrice).toFormat(2) : '' - return totalPriceFormatted - } - - async function getInstruction(): Promise { - if (!currentAccount?.governance) { - throw new Error('No governance on currentAccount') - } - if (!currentAccount?.extensions.transferAddress) { - throw new Error('No transferAddress on currentAccount') - } - return getGenericTransferInstruction({ - schema, - form, - programId, - connection, - wallet, - requiredStateInfo: { - governance: currentAccount.governance, - owner: currentAccount.extensions.transferAddress, - mintDecimals, - tokenSource, - mint: mintBeingTransferred, - }, - - setFormErrors, - }) - } - const handlePropose = async () => { - setIsLoading(true) - const instruction: UiInstruction = await getInstruction() - if (instruction.isValid) { - const governance = currentAccount?.governance - let proposalAddress: PublicKey | null = null - if (!realm) { - setIsLoading(false) - throw 'No realm selected' - } - const instructionData = { - data: instruction.serializedInstruction - ? getInstructionDataFromBase64(instruction.serializedInstruction) - : null, - holdUpTime: governance?.account?.config.minInstructionHoldUpTime, - prerequisiteInstructions: instruction.prerequisiteInstructions || [], - } - try { - // Fetch governance to get up to date proposalCount - const selectedGovernance = (await fetchRealmGovernance( - governance?.pubkey - )) as ProgramAccount - - proposalAddress = await handleCreateProposal({ - title: form.title ? form.title : proposalTitle, - description: form.description ? form.description : '', - governance: selectedGovernance, - instructionsData: [instructionData], - voteByCouncil, - isDraft: false, - }) - const url = fmtUrlWithCluster( - `/dao/${symbol}/proposal/${proposalAddress}` - ) - - router.push(url) - } catch (ex) { - notify({ type: 'error', message: `${ex}` }) - } - } - setIsLoading(false) - } - const IsAmountNotHigherThenBalance = () => { - const mintValue = getMintNaturalAmountFromDecimalAsBN( - form.amount!, - form.governedTokenAccount!.extensions.mint!.account.decimals - ) - let gte: boolean | undefined = false - try { - gte = form.governedTokenAccount?.extensions.token?.account?.amount?.gte( - mintValue - ) - } catch (e) { - //silent fail - } - return form.governedTokenAccount?.extensions.token?.publicKey && gte - } - - useEffect(() => { - if (currentAccount) { - handleSetForm({ - value: currentAccount, - propertyName: 'governedTokenAccount', - }) - } - }, [currentAccount]) - useEffect(() => { - if (form.destinationAccount) { - debounce.debounceFcn(async () => { - const pubKey = tryParseKey(form.destinationAccount) - if (pubKey) { - const account = await tryGetTokenAccount(connection.current, pubKey) - setDestinationAccount(account ? account : null) - } else { - setDestinationAccount(null) - } - }) - } else { - setDestinationAccount(null) - } - }, [form.destinationAccount]) - - const schema = getTokenTransferSchema({ - form, - connection, - tokenAmount: tokenAccount.amount, - mintDecimals: tokenAccount.mintInfo.decimals, - }) - const transactionDolarAmount = calcTransactionDolarAmount(form.amount) - const nftName = selectedNfts[0]?.val?.name - const nftTitle = `Send ${nftName ? nftName : 'NFT'} to ${ - form.destinationAccount - }` - const proposalTitle = isNFT - ? nftTitle - : `Pay ${form.amount}${tokenInfo ? ` ${tokenInfo?.symbol} ` : ' '}to ${ - tryParseKey(form.destinationAccount) - ? abbreviateAddress(new PublicKey(form.destinationAccount)) - : '' - }` - - if (!currentAccount) { - return null - } - - return ( - <> -

- <> - Send {tokenInfo && tokenInfo?.symbol} {isNFT && 'NFT'} - -

- - -
- - handleSetForm({ - value: evt.target.value, - propertyName: 'destinationAccount', - }) - } - noMaxWidth={true} - error={formErrors['destinationAccount']} - /> - {destinationAccount && ( -
-
Account owner
-
- {destinationAccount.account.owner.toString()} -
-
- )} - {destinationAccountName && ( -
-
Account name
-
{destinationAccountName}
-
- )} - {isNFT ? ( - setSelectedNfts(nfts)} - ownerPk={currentAccount.governance!.pubkey} - > - ) : ( - - )} - - {transactionDolarAmount - ? IsAmountNotHigherThenBalance() - ? `~$${transactionDolarAmount}` - : 'Insufficient balance' - : null} - -
setShowOptions(!showOptions)} - > - {showOptions ? ( - - ) : ( - - )} - Options - {/* popover with description maybe will be needed later */} - {/* - - - - - -
- {`In case of empty fields of advanced options, title and description will be - combination of amount token symbol and destination account e.g - "Pay 10 sol to PF295R1YJ8n1..."`} -
-
-
*/} -
- {showOptions && ( - <> - - handleSetForm({ - value: evt.target.value, - propertyName: 'title', - }) - } - /> - - {canChooseWhoVote && ( - { - setVoteByCouncil(!voteByCouncil) - }} - > - )} - - )} -
-
- -
- - ) -} - -export default GenericSendTokens diff --git a/components/TreasuryAccount/HoldTokensTotalPrice.tsx b/components/TreasuryAccount/HoldTokensTotalPrice.tsx index f692460c47..040ed1ca7e 100644 --- a/components/TreasuryAccount/HoldTokensTotalPrice.tsx +++ b/components/TreasuryAccount/HoldTokensTotalPrice.tsx @@ -1,12 +1,14 @@ import { useTotalTreasuryPrice } from '@hooks/useTotalTreasuryPrice' const HoldTokensTotalPrice = () => { const { totalPriceFormatted } = useTotalTreasuryPrice() - return totalPriceFormatted ? ( + return (

Treasury Balance

- ${totalPriceFormatted} + + ${totalPriceFormatted ? totalPriceFormatted : 0} +
- ) : null + ) } export default HoldTokensTotalPrice diff --git a/components/TreasuryAccount/NewTreasuryAccountForm.tsx b/components/TreasuryAccount/NewTreasuryAccountForm.tsx index 7781c2442a..80b762a2e5 100644 --- a/components/TreasuryAccount/NewTreasuryAccountForm.tsx +++ b/components/TreasuryAccount/NewTreasuryAccountForm.tsx @@ -77,22 +77,22 @@ const NewAccountForm = () => { defaultMint: '', hide: !isCurrentVersionHigherThenV1(), }, - { - name: 'NFT Account', - value: NFT, - defaultMint: DEFAULT_NFT_TREASURY_MINT, - hide: isCurrentVersionHigherThenV1(), - }, { name: 'Token Account', value: OTHER, defaultMint: '', hide: isCurrentVersionHigherThenV1(), }, + { + name: 'NFT Account', + value: NFT, + defaultMint: DEFAULT_NFT_TREASURY_MINT, + hide: isCurrentVersionHigherThenV1(), + }, ] setTypes(accTypes) }, [realmInfo?.programVersion]) - + const filteredTypes = types.filter((x) => !x.hide) const wallet = useWalletStore((s) => s.current) const connection = useWalletStore((s) => s.connection) const connected = useWalletStore((s) => s.connected) @@ -105,19 +105,20 @@ const NewAccountForm = () => { const [isLoading, setIsLoading] = useState(false) const [formErrors, setFormErrors] = useState({}) const [treasuryType, setTreasuryType] = useState(null) - const tokenOwnerRecord = ownVoterWeight.canCreateGovernanceUsingCouncilTokens() - ? ownVoterWeight.councilTokenRecord - : realm && ownVoterWeight.canCreateGovernanceUsingCommunityTokens(realm) - ? ownVoterWeight.communityTokenRecord - : undefined + const tokenOwnerRecord = + ownVoterWeight.canCreateGovernanceUsingCouncilTokens() + ? ownVoterWeight.councilTokenRecord + : realm && ownVoterWeight.canCreateGovernanceUsingCommunityTokens(realm) + ? ownVoterWeight.communityTokenRecord + : undefined const handleSetForm = ({ propertyName, value }) => { setFormErrors({}) setForm({ ...form, [propertyName]: value }) } useEffect(() => { - setTreasuryType(types[0]) - }, [types.length]) + setTreasuryType(filteredTypes[0]) + }, [filteredTypes.length]) const handleCreate = async () => { try { if (!realm) { @@ -158,7 +159,7 @@ const NewAccountForm = () => { realm, treasuryType?.value === SOL ? null : new PublicKey(form.mintAddress), governanceConfig, - tokenOwnerRecord!.pubkey, + tokenOwnerRecord!, client ) setIsLoading(false) @@ -277,22 +278,24 @@ const NewAccountForm = () => {

Create new DAO wallet

- + {filteredTypes.map((x) => { return ( {x.name} ) })} - + + )} + {treasuryType?.value === OTHER && ( <> void + form: any + canChooseWhoVote?: boolean + voteByCouncil: boolean + setVoteByCouncil: React.Dispatch> +}> = ({ + handleSetForm, + form, + canChooseWhoVote, + voteByCouncil, + setVoteByCouncil, +}) => { + return ( + <> + + handleSetForm({ + value: evt.target.value, + propertyName: 'title', + }) + } + /> + + {canChooseWhoVote && ( + { + setVoteByCouncil(!voteByCouncil) + }} + > + )} + + ) +} + +export default ProposalOptions diff --git a/components/TreasuryAccount/SendTokens.tsx b/components/TreasuryAccount/SendTokens.tsx index 710bad8b19..f80770c55d 100644 --- a/components/TreasuryAccount/SendTokens.tsx +++ b/components/TreasuryAccount/SendTokens.tsx @@ -79,10 +79,8 @@ const SendTokens = ({ isNft = false }) => { const [selectedNfts, setSelectedNfts] = useState([]) const [voteByCouncil, setVoteByCouncil] = useState(false) const [showOptions, setShowOptions] = useState(false) - const [ - destinationAccount, - setDestinationAccount, - ] = useState | null>(null) + const [destinationAccount, setDestinationAccount] = + useState | null>(null) const [isLoading, setIsLoading] = useState(false) const [formErrors, setFormErrors] = useState({}) const destinationAccountName = @@ -232,7 +230,9 @@ const SendTokens = ({ isNft = false }) => { const transactionDolarAmount = calcTransactionDolarAmount(form.amount) const nftName = selectedNfts[0]?.val?.name const nftTitle = `Send ${nftName ? nftName : 'NFT'} to ${ - form.destinationAccount + tryParseKey(form.destinationAccount) + ? abbreviateAddress(new PublicKey(form.destinationAccount)) + : '' }` const proposalTitle = isNFT ? nftTitle @@ -293,7 +293,14 @@ const SendTokens = ({ isNft = false }) => { {isNFT ? ( setSelectedNfts(nfts)} - ownerPk={currentAccount.extensions.transferAddress!} + ownersPk={ + currentAccount.isSol + ? [ + currentAccount.extensions.transferAddress!, + currentAccount.governance.pubkey, + ] + : [currentAccount.governance.pubkey] + } > ) : ( , + token: TokenProgramAccount +) => { + return ( + yup + .object() + .shape({ + title: yup.string(), + description: yup.string(), + amount: yup + .number() + .typeError('Amount is required') + .test( + 'amount', + "Transfer amount must be less than the source account's available amount", + function (val: number) { + const mintValue = getMintNaturalAmountFromDecimalAsBN( + val, + mintInfo.account.decimals + ) + return token.account.amount.gte(mintValue) + } + ) + .test( + 'amount', + 'Transfer amount must be greater than 0', + function (val: number) { + return val > 0 + } + ), + boundedPrice: yup + .number() + .typeError('boundedPrice is required') + .test( + 'boundedPrice', + 'Bounded price must be greater than 0', + function (val: number) { + return val > 0 + } + ), + serumRemoteProgramId: yup + .string() + .test( + 'serumRemoteProgramId', + 'serumRemoteProgramId must be valid PublicKey', + function (serumRemoteProgramId: string) { + try { + getValidatedPublickKey(serumRemoteProgramId) + } catch (err) { + return false + } + return true + } + ), + serumProgramId: yup + .string() + .test( + 'serumProgramId', + 'serumProgramId must be valid PublicKey', + function (serumProgramId: string) { + try { + getValidatedPublickKey(serumProgramId) + } catch (err) { + return false + } + return true + } + ), + serumMarketId: yup + .string() + .test( + 'serumMarketId', + 'serumMarketId must be valid PublicKey', + function (serumMarketId: string) { + try { + getValidatedPublickKey(serumMarketId) + } catch (err) { + return false + } + return true + } + ), + assetMint: yup + .string() + .test( + 'assetMint', + 'assetMint must be valid PublicKey', + function (assetMint: string) { + try { + getValidatedPublickKey(assetMint) + } catch (err) { + return false + } + return true + } + ), + // TODO: [nice to have] Validate the date is at least min voting period ahead + reclaimDate: yup.date().typeError('reclaimDate must be a valid date'), + reclaimAddress: yup + .string() + .test( + 'reclaimAddress', + 'reclaimAddress must be valid PublicKey', + function (reclaimAddress: string) { + try { + getValidatedPublickKey(reclaimAddress) + } catch (err) { + return false + } + return true + } + ), + orderSide: yup + .number() + .typeError('orderSide is required') + .test( + 'orderSide', + 'orderSide must be 0 (Bid) or 1 (Ask)', + function (orderSide: number) { + return orderSide === 0 || orderSide === 1 + } + ), + bound: yup + .number() + .typeError('bound is required') + .test( + 'bound', + 'bound must be 0 (Lower) or 1 (Upper)', + function (bound: number) { + return bound === 0 || bound === 1 + } + ), + }) + // Check the Bound and Order Side are viable + .test('bound', 'Some check against other values', function (val) { + if (!val.bound) { + return true + } + if (val.bound === val.orderSide) { + return new yup.ValidationError( + `Bound cannot be ${Bound[val.bound]} when Order Side is ${ + OrderSide[val.orderSide] + }`, + undefined, + 'bound' + ) + } + return true + }) + ) +} + +const TradeOnSerum: React.FC = ({ tokenAccount }) => { + const currentAccount = useTreasuryAccountStore((s) => s.currentAccount) + const router = useRouter() + const connection = useWalletStore((s) => s.connection) + const wallet = useWalletStore((s) => s.current) + const { fetchRealmGovernance } = useWalletStore((s) => s.actions) + const { handleCreateProposal } = useCreateProposal() + const serumRemoteProgramId = getProgramId(connection.cluster) + const serumProgramKey = getDexId(connection.cluster) + const { canUseTransferInstruction } = useGovernanceAssets() + const { canChooseWhoVote, symbol } = useRealm() + const { fmtUrlWithCluster } = useQueryContext() + const [form, setForm] = useState({ + amount: 0, + boundedPrice: 0, + title: 'Diversify treasury with Serum', + description: + 'A proposal to trade some asset for another using Serum. PLEASE EXPLAIN IN MORE DETAIL', + serumRemoteProgramId: serumRemoteProgramId.toString(), + serumProgramId: serumProgramKey.toString(), + serumMarketId: '', + assetMint: tokenAccount.extensions.mint!.publicKey.toString(), + orderSide: 0, + bound: 1, + // Default reclaim date of 10 days + reclaimDate: new Date(new Date().getTime() + 1_000 * 3600 * 24 * 10), + // The reclaim address must be the same account where the initial assets come from + reclaimAddress: tokenAccount.pubkey.toString(), + }) + const [formErrors, setFormErrors] = useState({}) + const [showOptions, setShowOptions] = useState(false) + const [voteByCouncil, setVoteByCouncil] = useState(false) + const [isLoading, setIsLoading] = useState(false) + + if (!tokenAccount.extensions.mint || !tokenAccount.extensions.token) { + throw new Error('No mint information on the tokenAccount') + } + const mintAccount = tokenAccount.extensions.mint + const token = tokenAccount.extensions.token + const schema = formSchema(mintAccount, token) + + const tokenInfo = tokenService.getTokenInfo(mintAccount.publicKey.toString()) + + const totalValue = useTotalTokenValue({ + amount: getMintDecimalAmountFromNatural( + mintAccount.account, + token.account.amount + ).toNumber(), + mintAddress: mintAccount.publicKey.toString(), + }) + + const handleSetForm = ({ propertyName, value }) => { + setFormErrors({}) + setForm({ ...form, [propertyName]: value }) + } + + const handlePropose = useCallback(async () => { + setIsLoading(true) + const isValid = await validateInstruction({ schema, form, setFormErrors }) + if (!currentAccount || !currentAccount!.extensions!.token!.account.owner) { + throw new Error('currentAccount is null or undefined') + } + if (wallet && wallet.publicKey && isValid) { + // create the anchor Program + // @ts-ignore: Wallet compatability issues + const provider = new Provider(connection.current, wallet, {}) + const program = new Program( + SerumRemoteIDL, + serumRemoteProgramId, + provider + ) + // convert amount to mintAmount + const mintValue = getMintNaturalAmountFromDecimalAsBN( + form.amount, + mintAccount.account.decimals + ) + const dexProgramId = new web3.PublicKey(form.serumProgramId) + const serumMarketId = new web3.PublicKey(form.serumMarketId) + // Load the serumMarket + let market: SerumMarket + try { + market = await SerumMarket.load( + connection.current, + serumMarketId, + {}, + dexProgramId + ) + } catch (err) { + setFormErrors((e) => ({ + ...e, + serumMarketId: 'Error loading the SerumMarket', + })) + setIsLoading(false) + return + } + // Convert the form's numerical bounded price to market lots + const boundPrice = market.priceNumberToLots(form.boundedPrice) + // Validate the market and information + if ( + form.assetMint !== market.quoteMintAddress.toString() && + form.assetMint !== market.baseMintAddress.toString() + ) { + setFormErrors((e) => ({ + ...e, + serumMarketId: + "The asset you're looking to trade with does not exist on this Serum Market", + })) + setIsLoading(false) + return + } + if ( + (form.orderSide === 0 && + form.assetMint !== market.quoteMintAddress.toString()) || + (form.orderSide === 1 && + form.assetMint !== market.baseMintAddress.toString()) + ) { + setFormErrors((e) => ({ + ...e, + orderSide: `order side of ${ + OrderSide[form.orderSide] + } does not match the expected serum market mint`, + })) + setIsLoading(false) + return + } + + const proposalInstructions: InstructionDataWithHoldUpTime[] = [] + const prerequisiteInstructions: web3.TransactionInstruction[] = [] + // Check if an associated token account for the other side of the + // market is required. If so, add the create associated token account ix + const aTADepositAddress = await Token.getAssociatedTokenAddress( + ASSOCIATED_TOKEN_PROGRAM_ID, + TOKEN_PROGRAM_ID, + form.orderSide === 0 ? market.baseMintAddress : market.quoteMintAddress, + currentAccount!.extensions!.token!.account.owner + ) + const depositAccountInfo = await connection.current.getAccountInfo( + aTADepositAddress + ) + if (!depositAccountInfo) { + // generate the instruction for creating the ATA + const createAtaIx = Token.createAssociatedTokenAccountInstruction( + ASSOCIATED_TOKEN_PROGRAM_ID, + TOKEN_PROGRAM_ID, + form.orderSide === 0 + ? market.baseMintAddress + : market.quoteMintAddress, + aTADepositAddress, + currentAccount!.extensions!.token!.account.owner, + wallet.publicKey + ) + prerequisiteInstructions.push(createAtaIx) + } + + const instruction = await serumRemoteInstructions.initBoundedStrategyIx( + //@ts-ignore: differing anchor versions + program, + dexProgramId, + serumMarketId, + new web3.PublicKey(form.assetMint), + { + transferAmount: mintValue, + boundPrice, + reclaimDate: new BN(form.reclaimDate.getTime() / 1_000), + reclaimAddress: new web3.PublicKey(form.reclaimAddress), + depositAddress: aTADepositAddress, + orderSide: form.orderSide, + bound: form.bound, + }, + { owner: currentAccount!.extensions!.token!.account.owner } + ) + + const serializedIx = serializeInstructionToBase64(instruction) + + const instructionData = { + data: getInstructionDataFromBase64(serializedIx), + holdUpTime: + currentAccount?.governance?.account?.config.minInstructionHoldUpTime, + prerequisiteInstructions, + shouldSplitIntoSeparateTxs: true, + } + proposalInstructions.push(instructionData) + + try { + // Fetch governance to get up to date proposalCount + const selectedGovernance = (await fetchRealmGovernance( + currentAccount?.governance?.pubkey + )) as ProgramAccount + + const proposalAddress = await handleCreateProposal({ + title: form.title, + description: form.description, + governance: selectedGovernance, + instructionsData: proposalInstructions, + voteByCouncil, + isDraft: false, + }) + const url = fmtUrlWithCluster( + `/dao/${symbol}/proposal/${proposalAddress}` + ) + + router.push(url) + } catch (ex) { + notify({ type: 'error', message: `${ex}` }) + } + } + + setIsLoading(false) + }, [schema, form, setFormErrors, connection, currentAccount, symbol, wallet]) + return ( + <> +
+

Trade on Serum!

+
+ +
+ Serum Remote{' '} + +
+
+  is open sourced, yet unaudited. Do your own research. +
+ + {/* Add Serum Remote form */} +
+ + handleSetForm({ + value: evt.target.value, + propertyName: 'serumMarketId', + }) + } + noMaxWidth={true} + error={formErrors['serumMarketId']} + /> + + handleSetForm({ + value: evt.target.value, + propertyName: 'amount', + }) + } + error={formErrors['amount']} + noMaxWidth={true} + /> + + + {/* TODO: Add reclaim date picker */} + + handleSetForm({ + value: evt.target.value, + propertyName: 'boundedPrice', + }) + } + error={formErrors['boundedPrice']} + noMaxWidth={true} + /> +
+ +
setShowOptions(!showOptions)} + > + {showOptions ? ( + + ) : ( + + )} + Options +
+ {showOptions && ( + + )} +
+
+ +
+ + ) +} + +export default TradeOnSerum diff --git a/components/VoteCommentModal.tsx b/components/VoteCommentModal.tsx index 353be60100..cd6efc778f 100644 --- a/components/VoteCommentModal.tsx +++ b/components/VoteCommentModal.tsx @@ -68,7 +68,7 @@ const VoteCommentModal: FunctionComponent = ({ rpcContext, realm!, proposal!, - voterTokenRecord.pubkey, + voterTokenRecord, vote, msg, client diff --git a/components/VotePanel.tsx b/components/VotePanel.tsx index 85b5e4f490..148bb617e3 100644 --- a/components/VotePanel.tsx +++ b/components/VotePanel.tsx @@ -24,14 +24,11 @@ const VotePanel = () => { const client = useVotePluginsClientStore( (s) => s.state.currentRealmVotingClient ) + const [isLoading, setIsLoading] = useState(false) const router = useRouter() const { pk } = router.query - const { - governance, - proposal, - voteRecordsByVoter, - tokenType, - } = useWalletStore((s) => s.selectedProposal) + const { governance, proposal, voteRecordsByVoter, tokenType } = + useWalletStore((s) => s.selectedProposal) const { ownTokenRecord, ownCouncilTokenRecord, @@ -89,6 +86,7 @@ const VotePanel = () => { connection.endpoint ) try { + setIsLoading(true) const instructions: TransactionInstruction[] = [] if ( @@ -124,6 +122,7 @@ const VotePanel = () => { } catch (ex) { console.error("Can't relinquish vote", ex) } + setIsLoading(false) } const handleShowVoteModal = (vote: YesNoVote) => { @@ -187,10 +186,11 @@ const VotePanel = () => {
{isVoteCast && connected ? ( submitRelinquishVote()} - disabled={!isWithdrawEnabled} + disabled={!isWithdrawEnabled || isLoading} > {isVoting ? 'Withdraw' : 'Release Tokens'} diff --git a/components/chat/DiscussionForm.tsx b/components/chat/DiscussionForm.tsx index 5b12ef3552..77d277f53e 100644 --- a/components/chat/DiscussionForm.tsx +++ b/components/chat/DiscussionForm.tsx @@ -3,7 +3,7 @@ import Button from '../Button' import Input from '../inputs/Input' import useWalletStore from '../../stores/useWalletStore' import useRealm from '../../hooks/useRealm' -import { RpcContext } from '@solana/spl-governance' +import { RpcContext, GoverningTokenType } from '@solana/spl-governance' import { ChatMessageBody, ChatMessageBodyType } from '@solana/spl-governance' import { postChatMessage } from '../../actions/chat/postMessage' import Loading from '../Loading' @@ -14,7 +14,13 @@ import useVotePluginsClientStore from 'stores/useVotePluginsClientStore' const DiscussionForm = () => { const [comment, setComment] = useState('') const connected = useWalletStore((s) => s.connected) - const { ownVoterWeight, realmInfo, realm } = useRealm() + const { + ownVoterWeight, + realmInfo, + realm, + ownTokenRecord, + ownCouncilTokenRecord, + } = useRealm() const client = useVotePluginsClientStore( (s) => s.state.currentRealmVotingClient ) @@ -24,6 +30,11 @@ const DiscussionForm = () => { const connection = useWalletStore((s) => s.connection) const { proposal } = useWalletStore((s) => s.selectedProposal) const { fetchChatMessages } = useWalletStore((s) => s.actions) + const { tokenType } = useWalletStore((s) => s.selectedProposal) + const commenterVoterTokenRecord = + tokenType === GoverningTokenType.Community + ? ownTokenRecord + : ownCouncilTokenRecord const submitComment = async () => { setSubmitting(true) @@ -46,7 +57,7 @@ const DiscussionForm = () => { rpcContext, realm!, proposal!, - ownVoterWeight.getTokenRecord(), + commenterVoterTokenRecord!, msg, undefined, client @@ -72,6 +83,8 @@ const DiscussionForm = () => { ? 'You need to have deposited some tokens to submit your comment.' : !comment ? 'Write a comment to submit' + : !commenterVoterTokenRecord + ? 'You need to have voting power for this community to submit your comment.' : '' return ( @@ -88,7 +101,7 @@ const DiscussionForm = () => { diff --git a/components/explorer/inspectorButton.tsx b/components/explorer/inspectorButton.tsx index c3499be97d..95bf39c276 100644 --- a/components/explorer/inspectorButton.tsx +++ b/components/explorer/inspectorButton.tsx @@ -36,15 +36,16 @@ export default function InspectorButton({ ) } else { try { - const recentActivity = await connection.current.getConfirmedSignaturesForAddress2( - proposalInstruction.pubkey, - { - limit: 5, - }, - 'confirmed' - ) + const recentActivity = + await connection.current.getConfirmedSignaturesForAddress2( + proposalInstruction.pubkey, + { + limit: 5, + }, + 'confirmed' + ) inspectUrl = getExplorerUrl( - connection.endpoint, + connection.cluster, recentActivity[0].signature, 'tx' ) diff --git a/components/explorer/tools.ts b/components/explorer/tools.ts index dd0d6601e9..82cf129f6f 100644 --- a/components/explorer/tools.ts +++ b/components/explorer/tools.ts @@ -13,6 +13,10 @@ export function getExplorerUrl( 'http://127.0.0.1:8899' )}` } else if (endpoint === 'https://api.devnet.solana.com') { + // if the default free RPC for devnet is used + cluster = 'devnet' + } else if (endpoint === 'devnet') { + // connection.cluster is passed in cluster = 'devnet' } diff --git a/components/inputs/Select.tsx b/components/inputs/Select.tsx index 7844ac6484..0527e7a6fa 100644 --- a/components/inputs/Select.tsx +++ b/components/inputs/Select.tsx @@ -33,7 +33,10 @@ const Select = ({ minWidth?: string }) => { return ( -
+
{label && {label}}
diff --git a/components/instructions/instructionCard.tsx b/components/instructions/instructionCard.tsx index 79edd0e8bc..619b688500 100644 --- a/components/instructions/instructionCard.tsx +++ b/components/instructions/instructionCard.tsx @@ -22,7 +22,6 @@ import InspectorButton from '@components/explorer/inspectorButton' import { FlagInstructionErrorButton } from './FlagInstructionErrorButton' import { Metadata } from '@metaplex-foundation/mpl-token-metadata' import axios from 'axios' -import { notify } from '@utils/notifications' import useGovernanceAssets from '@hooks/useGovernanceAssets' import tokenService from '@utils/services/token' @@ -35,10 +34,8 @@ export default function InstructionCard({ proposal: ProgramAccount proposalInstruction: ProgramAccount }) { - const { - nftsGovernedTokenAccounts, - governedTokenAccountsWithoutNfts, - } = useGovernanceAssets() + const { nftsGovernedTokenAccounts, governedTokenAccountsWithoutNfts } = + useGovernanceAssets() const connection = useWalletStore((s) => s.connection) const tokenRecords = useWalletStore((s) => s.selectedRealm) const [descriptor, setDescriptor] = useState() @@ -55,8 +52,8 @@ export default function InstructionCard({ proposalInstruction.account.getSingleInstruction() ).then((d) => setDescriptor(d)) const getAmountImg = async () => { - const sourcePk = proposalInstruction.account.getSingleInstruction() - .accounts[0].pubkey + const sourcePk = + proposalInstruction.account.getSingleInstruction().accounts[0].pubkey const tokenAccount = await tryGetTokenAccount( connection.current, sourcePk @@ -67,7 +64,9 @@ export default function InstructionCard({ const isNFTAccount = nftsGovernedTokenAccounts.find( (x) => x.extensions.transferAddress?.toBase58() === - tokenAccount?.account.owner.toBase58() + tokenAccount?.account.owner.toBase58() || + x.governance.pubkey.toBase58() === + tokenAccount?.account.owner.toBase58() ) if (isNFTAccount) { const mint = tokenAccount?.account.mint @@ -81,10 +80,7 @@ export default function InstructionCard({ const url = (await axios.get(tokenMetadata.data.data.uri)).data setNftImgUrl(url.image) } catch (e) { - notify({ - type: 'error', - message: 'Unable to fetch nft', - }) + console.log(e) } } return diff --git a/components/instructions/programs/nftVotingClient.tsx b/components/instructions/programs/nftVotingClient.tsx index ed38e59332..d19bf16723 100644 --- a/components/instructions/programs/nftVotingClient.tsx +++ b/components/instructions/programs/nftVotingClient.tsx @@ -1,5 +1,5 @@ import { Wallet } from '@marinade.finance/marinade-ts-sdk' -import { Provider } from '@project-serum/anchor' +import { AnchorProvider, BorshInstructionCoder } from '@project-serum/anchor' import { NftVoterClient } from '@solana/governance-program-library' import { AccountMetaData, getRealm } from '@solana/spl-governance' import { Connection, Keypair } from '@solana/web3.js' @@ -20,16 +20,16 @@ export const NFT_VOTER_INSTRUCTIONS = { ], getDataUI: async (connection: Connection, data: Uint8Array) => { try { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection, new Wallet(Keypair.generate()), options ) const nftClient = await NftVoterClient.connect(provider) - const decodedInstructionData = nftClient.program.coder.instruction.decode( - Buffer.from(data) - )?.data as any + const decodedInstructionData = new BorshInstructionCoder( + nftClient.program.idl + ).decode(Buffer.from(data))?.data as any return (
@@ -58,8 +58,8 @@ export const NFT_VOTER_INSTRUCTIONS = { accounts: AccountMetaData[] ) => { try { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection, new Wallet(Keypair.generate()), options @@ -67,9 +67,9 @@ export const NFT_VOTER_INSTRUCTIONS = { const realm = await getRealm(connection, accounts[1].pubkey) const mint = await tryGetMint(connection, realm.account.communityMint) const nftClient = await NftVoterClient.connect(provider) - const decodedInstructionData = nftClient.program.coder.instruction.decode( - Buffer.from(data) - )?.data as any + const decodedInstructionData = new BorshInstructionCoder( + nftClient.program.idl + ).decode(Buffer.from(data))?.data as any const weight = fmtTokenAmount( decodedInstructionData.weight, mint?.account.decimals diff --git a/components/instructions/programs/splToken.tsx b/components/instructions/programs/splToken.tsx index b47b3f2f2f..57ec359976 100644 --- a/components/instructions/programs/splToken.tsx +++ b/components/instructions/programs/splToken.tsx @@ -16,6 +16,7 @@ export const MINT_METADATA = { SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt: { name: 'SRM' }, MyHd6a7HWKTMeJMHBkrbMq4hZwZxwn9x7dxXcopQ4Wd: { name: 'OMH' }, UXPhBoR3qG4UCiGNJfV7MqhHyFqKN68g45GoYvAeL2M: { name: 'UXP' }, + H7uqouPsJkeEiLpCEoC1qYVVquDrZan6ZfdPK2gS44zm: { name: 'FORE' }, } export function getMintMetadata( @@ -48,10 +49,9 @@ export const SPL_TOKEN_INSTRUCTIONS = { connection, accounts[0].pubkey ) - const tokenMint = await tryGetMint( - connection, - tokenAccount!.account.mint - ) + const tokenMint = tokenAccount + ? await tryGetMint(connection, tokenAccount!.account.mint) + : null const tokenMintDescriptor = getMintMetadata(tokenAccount?.account.mint) @@ -169,5 +169,16 @@ export const SPL_TOKEN_INSTRUCTIONS = { ) }, }, + 9: { + name: 'Close Token Account', + accounts: [ + { name: 'Token Account', important: true }, + { name: 'Rent destination' }, + { name: 'Account Owner' }, + ], + getDataUI: async () => { + return <> + }, + }, }, } diff --git a/components/instructions/programs/voteStakeRegistry.tsx b/components/instructions/programs/voteStakeRegistry.tsx index cc60e62d59..f2c4c16ff5 100644 --- a/components/instructions/programs/voteStakeRegistry.tsx +++ b/components/instructions/programs/voteStakeRegistry.tsx @@ -1,6 +1,10 @@ import { VsrClient } from '@blockworks-foundation/voter-stake-registry-client' import { Wallet } from '@marinade.finance/marinade-ts-sdk' -import { BN, Provider } from '@project-serum/anchor' +import { + AnchorProvider, + BN, + BorshInstructionCoder, +} from '@project-serum/anchor' import { AccountMetaData } from '@solana/spl-governance' import { Connection, Keypair, PublicKey } from '@solana/web3.js' import { fmtMintAmount } from '@tools/sdk/units' @@ -26,7 +30,7 @@ interface VotingMintCfgInstruction { lockupSaturationSecs: BN grantAuthority: PublicKey } -interface GrantInstruction { +export interface GrantInstruction { periods: number kind: object amount: BN @@ -52,16 +56,16 @@ export const VOTE_STAKE_REGISTRY_INSTRUCTIONS = { accounts: AccountMetaData[] ) => { try { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection, new Wallet(Keypair.generate()), options ) const vsrClient = await VsrClient.connect(provider) - const decodedInstructionData = vsrClient.program.coder.instruction.decode( - Buffer.from(data) - )?.data as ClawbackInstruction | null + const decodedInstructionData = new BorshInstructionCoder( + vsrClient.program.idl + ).decode(Buffer.from(data))?.data as ClawbackInstruction | null const existingVoter = await tryGetVoter(accounts[2].pubkey, vsrClient) const deposit = decodedInstructionData ? existingVoter?.deposits[decodedInstructionData.depositEntryIndex] @@ -112,16 +116,17 @@ export const VOTE_STAKE_REGISTRY_INSTRUCTIONS = { ], getDataUI: async (connection: Connection, data: Uint8Array) => { try { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection, new Wallet(Keypair.generate()), options ) const vsrClient = await VsrClient.connect(provider) - const decodedInstructionData = vsrClient.program.coder.instruction.decode( - Buffer.from(data) - )?.data as VotingMintCfgInstruction + + const decodedInstructionData = new BorshInstructionCoder( + vsrClient.program.idl + ).decode(Buffer.from(data))?.data as VotingMintCfgInstruction const { maxExtraLockupVoteWeightScaledFactor, lockupSaturationSecs, @@ -152,8 +157,10 @@ export const VOTE_STAKE_REGISTRY_INSTRUCTIONS = {
Max multiplier:{' '} {calcMultiplier({ - depositScaledFactor: baselineVoteWeightScaledFactor.toNumber(), - maxExtraLockupVoteWeightScaledFactor: maxExtraLockupVoteWeightScaledFactor.toNumber(), + depositScaledFactor: + baselineVoteWeightScaledFactor.toNumber(), + maxExtraLockupVoteWeightScaledFactor: + maxExtraLockupVoteWeightScaledFactor.toNumber(), lockupSaturationSecs: lockupSaturationSecs.toNumber(), lockupSecs: lockupSaturationSecs.toNumber(), })} @@ -190,16 +197,16 @@ export const VOTE_STAKE_REGISTRY_INSTRUCTIONS = { accounts: AccountMetaData[] ) => { try { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection, new Wallet(Keypair.generate()), options ) const vsrClient = await VsrClient.connect(provider) - const decodedInstructionData = vsrClient.program.coder.instruction.decode( - Buffer.from(data) - )?.data as GrantInstruction | null + const decodedInstructionData = new BorshInstructionCoder( + vsrClient.program.idl + ).decode(Buffer.from(data))?.data as GrantInstruction | null const mintPk = accounts[9].pubkey const mint = await tryGetMint(connection, mintPk!) const lockupKind = decodedInstructionData diff --git a/components/instructions/tools.tsx b/components/instructions/tools.tsx index 45954a038f..6c6ec14d12 100644 --- a/components/instructions/tools.tsx +++ b/components/instructions/tools.tsx @@ -18,6 +18,7 @@ import { VOTE_STAKE_REGISTRY_INSTRUCTIONS } from './programs/voteStakeRegistry' import { MARINADE_INSTRUCTIONS } from './programs/marinade' import { SOLEND_PROGRAM_INSTRUCTIONS } from './programs/solend' import { ATA_PROGRAM_INSTRUCTIONS } from './programs/associatedTokenAccount' +import { governance as foresightGov } from '@foresight-tmp/foresight-sdk' import { ConnectionContext } from '@utils/connection' import { NFT_VOTER_INSTRUCTIONS } from './programs/nftVotingClient' /** @@ -32,6 +33,8 @@ export const DEFAULT_GOVERNANCE_PROGRAM_ID = export const DEFAULT_TEST_GOVERNANCE_PROGRAM_ID = 'GTesTBiEWE32WHXXE2S4XbZvA5CrEc4xs6ZgRe895dP' +export const MANGO_DAO_TREASURY = '9RGoboEjmaAjSCXsKi6p6zJucnwF3Eg5NUN9jPS6ziL3' + // Well known account names displayed on the instruction card export const ACCOUNT_NAMES = { AQeo6r6jdwnmf48AMejgoKdUGtV8qzbVJH42Gb5sWdi: 'Deprecated: Mango IDO program', @@ -39,6 +42,10 @@ export const ACCOUNT_NAMES = { 'Mango Developer Council Mint', Guiwem4qBivtkSFrxZAEfuthBz6YuWyCwS4G3fjBYu5Z: 'Mango DAO MNGO Treasury Vault', + '7zGXUAeUkY9pEGfApsY26amibvqsf2dmty1cbtxHdfaQ': + 'Mango DAO SOL Treasury Vault Governance', + '5tgfd6XgwiXB9otEnzFpXK11m7Q7yZUaAJzWK4oT5UGF': + 'Mango DAO SOL Treasury Vault', '9RGoboEjmaAjSCXsKi6p6zJucnwF3Eg5NUN9jPS6ziL3': 'Mango DAO MNGO Treasury', '4PdEyhrV3gaUj4ffwjKGXBLo42jF2CQCCBoXenwCRWXf': 'Mango DAO USDC Treasury Vault', @@ -56,6 +63,8 @@ export const ACCOUNT_NAMES = { 'Mango v3 BTC-PERP Incentive Vault', '7Gm5zF6FNJpyhqdwKcEdMQw3r5YzitYUGVDKYMPT1cMy': 'Mango V3 Admin Key', MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac: 'MNGO Token Mint', + H7uqouPsJkeEiLpCEoC1qYVVquDrZan6ZfdPK2gS44zm: 'FORE Token Mint', + [foresightGov.DEVNET_TREASURY.toBase58()]: 'Foresight Devnet Governance', EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v: 'USDC Token Mint', MyHd6a7HWKTMeJMHBkrbMq4hZwZxwn9x7dxXcopQ4Wd: 'OMH Token', @@ -110,22 +119,22 @@ export const ACCOUNT_NAMES = { 'ClubDAO Main NFT Treasury Vault', //MonkeDAO - Cb4uLreZRcb7kbu6gbsGJp2xjnU5K25MDZbvFknBFyqU: 'ClubDAO NMBC Royalties Vault', - '9Z6x8sVq78saCddcveTSmQWFHCS9vaMS7eoeQMrGMUXw': 'Luna Holdings', DKdBj8KF9sieWq2XWkZVnRPyDrw9PwAHinkCMvjAkRdZ: "MonkeDAO NFT's", - EdNP7sERADU525E9bov6YdfL3oK3idnRTMdKUh2J7FCM: - 'SMB SOL Royalty Treasury Holdings', - '5bAHkmagXYJzjzxYPDht7AVZRxjiJ6r12NQU3L67bkTr': 'SMB USDC Royalty Holdings', - CYLSMKuMiDFNg4eDrZdaaWYCJedsLMAEQgUCtnoUq4n1: - 'Primary USDC Treasury Holdings', - '2qhApGpizKoCyw45oho8Z4F7c14Es4tKvHmBuTnCqubn': - 'Primary SOL Treasury Holdings', - J45sC6ow6u2cXZU8tvewC548CcFiU6VGnFpnxW71WNgm: 'GG SHDW Tokens', - wpSyytRSgo1b5RE6PYT9GMWubdq6EdbGC8PEbcz4Kff: 'DAOPool Fee Collection', - xuEfu6gmCn1RSXSAVpWLTYttx685m9rAbzqwwYUjYXJ: 'DAOJones Fractionalized Tokens', - GQDFqZ7URyWAiPMQs4ywZ9pKBqrUg4srdkqnZpRUstQz: 'Merch Escrow Holdings', - '7JPpGyJTEXwR9uQSqhi6RAK5GiSTr41oq72PJ4fU5CXf': 'Marketing Wallet SOL', - '2FCKVvw3JmRD6Q2DFb3ZzW697GKjYka8JwGMSF7juWZd': 'Marketing Wallet USDC', + '7r6xoSMC9xvrmM3LDV6p67hW4MqDmf4iocQB7CarqWGv': 'Primary Treasury Wallet', + '3Gaxab6KF9SHVq8qvKLAdDQMX6ZYJxctmLL8QYk5gGRE': 'Treasury USDC', + BQxsFSHwoWAi6MQyUXusvNjD6kAbBtcxGcZZ11zz2vGy: 'Treasury SOL', + BQ2nz8oWcZ4PuEskvFboUtJDa1AVzdXaJh1vHajgUWiq: 'Marketing Wallet', + H3fxHgqXBpXjoSnWHPYSsNkVTuZcP9jRXDE6eT6kganp: 'Marketing USDC', + HAryckvjyViFQEmhmMoCtqqBMJnpXEYViamyDhZUJfnG: 'SMB Royalty Wallet', + E3KpSoZL3EDeXw8EtgHfi83n663LFfyEZ8r9J7kdaEC2: 'SMB Royalty SOL', + CNz3mg35f5HQ7wT2XsrBVNcSVdpWSSG8dwVLhCzsmUPo: 'Merch Escrow Wallet', + '2rhSFgwgwuKYMaQUa5QcHBpaW5zoBL32ib3aqDW9zkcM': 'Merch USDC', + '6VWfsPjYRGetHhQMJBh7cksKoN7MWimgeyeYHg824jRR': 'UST', + '2eBFMe5jCG4hw3ooNr3UFQbVs6hE7bacHuuhZg4n8nCP': 'SHDW', + Gr6PqrrZqiay44937AKthj7FEpShCBb94Jgw89BUr2b2: 'daoSOL', + '2fEL6au59KfmtarX5cJD4a6EaxRr6gLBvFkE65uEPJ4U': 'DAOJONES', + FboFh3DkwmAeH4GyM5Ttd8ismd2wq6c8MrRkSsmr5nQW: 'LUNA', + GnfeSuTwbXcxVnuXJTzx172174PJAHUfXpNgsBdGCncd: 'Solend Holdings', } // Blacklisted governances which should not be displayed in the UI @@ -136,6 +145,7 @@ export const HIDDEN_GOVERNANCES = new Map([ ['2j2oe8YXdYJyS7G8CeEW5KARijdjjZkuPy5MnN8gBQqQ', ''], ['56yqzBEr9BqDGjYPJz9G8LVQrbXsQM2t2Yq3Gk8S56d1', ''], ['4styeLGsBRpV4xKsCNMRPb94U7JN8ZXoXJTLZA5hdjo9', ''], + ['CKWNNwtn5nbsGMkvtRwHDv4QTyoHMByKVd7Ypo2deNpc', ''], ]) // Blacklisted proposals which should not be displayed in the UI @@ -159,6 +169,7 @@ export const CHAT_PROGRAM_ID = new PublicKey( ) export const WSOL_MINT = 'So11111111111111111111111111111111111111112' +export const WSOL_MINT_PK = new PublicKey(WSOL_MINT) const HIDDEN_MNGO_TREASURES = [ 'GZQSF4Fh9xK7rf9WBEhawXYFw8qPXeatZLUqVQeuW3X8', @@ -173,6 +184,18 @@ const HIDDEN_MNGO_TREASURES = [ 'CaoFkVyPJugKMdzDT1NGnsQJ8dWe4kZFaETCbtWz1QBr', ] +//owner and desired accounts we want to show +export const MNGO_AUXILIARY_TOKEN_ACCOUNTS = [ + { + owner: '9BVcYqEQxyccuwznvxXqDkSJFavvTyheiTYk231T1A8S', + accounts: ['59BEyxwrFpt3x4sZ7TcXC3bHx3seGfqGkATcDx6siLWy'], + }, +] + +export const AUXILIARY_TOKEN_ACCOUNTS = { + Mango: MNGO_AUXILIARY_TOKEN_ACCOUNTS, +} + export const HIDDEN_TREASURES = [...HIDDEN_MNGO_TREASURES] export interface AccountDescriptor { diff --git a/hooks/useCreateProposal.ts b/hooks/useCreateProposal.ts index 445d8097b3..69a0841d1c 100644 --- a/hooks/useCreateProposal.ts +++ b/hooks/useCreateProposal.ts @@ -15,13 +15,8 @@ export default function useCreateProposal() { const { fetchRealmGovernance, refetchProposals } = useWalletStore( (s) => s.actions ) - const { - realm, - ownVoterWeight, - mint, - councilMint, - canChooseWhoVote, - } = useRealm() + const { realm, ownVoterWeight, mint, councilMint, canChooseWhoVote } = + useRealm() const { getRpcContext } = useRpcContext() const handleCreateProposal = async ({ title, @@ -67,7 +62,7 @@ export default function useCreateProposal() { rpcContext, realm!, selectedGovernance.pubkey, - ownTokenRecord!.pubkey, + ownTokenRecord!, title, description, proposalMint, diff --git a/hooks/useGovernanceAssets.ts b/hooks/useGovernanceAssets.ts index 2274b2b26a..ac6ade93ff 100644 --- a/hooks/useGovernanceAssets.ts +++ b/hooks/useGovernanceAssets.ts @@ -10,8 +10,12 @@ export default function useGovernanceAssets() { const governedTokenAccounts: AssetAccount[] = useGovernanceAssetsStore( (s) => s.governedTokenAccounts ) - const assetAccounts = useGovernanceAssetsStore((s) => s.assetAccounts) - + const assetAccounts = useGovernanceAssetsStore((s) => + s.assetAccounts.filter((x) => x.type !== AccountType.AuxiliaryToken) + ) + const auxiliaryTokenAccounts = useGovernanceAssetsStore( + (s) => s.assetAccounts + ).filter((x) => x.type === AccountType.AuxiliaryToken) const currentPluginPk = config?.account.communityVoterWeightAddin const governancesArray = useGovernanceAssetsStore((s) => s.governancesArray) @@ -58,11 +62,15 @@ export default function useGovernanceAssets() { realm?.account.config.councilMint?.toBase58() ) } - // TODO: Check governedAccounts from all governances plus search for token accounts owned by governances - const canUseTransferInstruction = canUseGovernanceForInstruction([ - GovernanceAccountType.TokenGovernanceV1, - GovernanceAccountType.TokenGovernanceV2, - ]) + const canUseTransferInstruction = governedTokenAccounts.some((acc) => { + const governance = governancesArray.find( + (x) => acc.governance.pubkey.toBase58() === x.pubkey.toBase58() + ) + return ( + governance && + ownVoterWeight.canCreateProposal(governance?.account?.config) + ) + }) const canUseProgramUpgradeInstruction = canUseGovernanceForInstruction([ GovernanceAccountType.ProgramGovernanceV1, @@ -222,6 +230,36 @@ export default function useGovernanceAssets() { name: 'Solend: Withdraw Funds', isVisible: canUseAnyInstruction, }, + { + id: Instructions.ForesightInitMarket, + name: 'Foresight: Init Market', + isVisible: canUseAnyInstruction, + }, + { + id: Instructions.ForesightInitMarketList, + name: 'Foresight: Init Market List', + isVisible: canUseAnyInstruction, + }, + { + id: Instructions.ForesightInitCategory, + name: 'Foresight: Init Category', + isVisible: canUseAnyInstruction, + }, + { + id: Instructions.ForesightResolveMarket, + name: 'Foresight: Resolve Market', + isVisible: canUseAnyInstruction, + }, + { + id: Instructions.ForesightAddMarketListToCategory, + name: 'Foresight: Add Market List To Category', + isVisible: canUseAnyInstruction, + }, + { + id: Instructions.ForesightAddMarketMetadata, + name: 'Foresight: Add Market Metadata', + isVisible: canUseAnyInstruction, + }, { id: Instructions.ProgramUpgrade, name: 'Upgrade Program', @@ -247,6 +285,11 @@ export default function useGovernanceAssets() { name: 'Create NFT plugin max voter weight', isVisible: canUseAuthorityInstruction, }, + { + id: Instructions.CloseTokenAccount, + name: 'Close token account', + isVisible: canUseTransferInstruction, + }, { id: Instructions.None, name: 'None', @@ -274,5 +317,6 @@ export default function useGovernanceAssets() { nftsGovernedTokenAccounts, canUseAuthorityInstruction, assetAccounts, + auxiliaryTokenAccounts, } } diff --git a/hooks/useHydrateStore.tsx b/hooks/useHydrateStore.tsx index 4b7cab740e..eadce8469f 100644 --- a/hooks/useHydrateStore.tsx +++ b/hooks/useHydrateStore.tsx @@ -15,7 +15,6 @@ export default function useHydrateStore() { fetchRealmBySymbol(cluster as string, symbol as string) } }, [symbol, cluster]) - useEffect(() => { if (pk && Object.entries(selectedRealmMints).length > 0) { fetchProposal(pk) diff --git a/hooks/useRealm.tsx b/hooks/useRealm.tsx index 6e275f2456..a6e9949838 100644 --- a/hooks/useRealm.tsx +++ b/hooks/useRealm.tsx @@ -114,7 +114,11 @@ export default function useRealm() { realmCfgMaxOutstandingProposalCount const currentPluginPk = config?.account?.communityVoterWeightAddin - + //based on realm config it will provide proper tokenBalanceCardComponent + const isLockTokensMode = + currentPluginPk && vsrPluginsPks.includes(currentPluginPk?.toBase58()) + const isNftMode = + currentPluginPk && nftPluginsPks.includes(currentPluginPk?.toBase58()) const ownVoterWeight = getVoterWeight( currentPluginPk, ownTokenRecord, @@ -122,7 +126,6 @@ export default function useRealm() { nftVotingPower, ownCouncilTokenRecord ) - return { realm, realmInfo, @@ -143,6 +146,9 @@ export default function useRealm() { toManyCouncilOutstandingProposalsForUse, toManyCommunityOutstandingProposalsForUser, config, + currentPluginPk, + isLockTokensMode, + isNftMode, } } diff --git a/hooks/useTotalTreasuryPrice.ts b/hooks/useTotalTreasuryPrice.ts index 51891d6f17..4ce9ebaea2 100644 --- a/hooks/useTotalTreasuryPrice.ts +++ b/hooks/useTotalTreasuryPrice.ts @@ -1,4 +1,3 @@ -import { WSOL_MINT } from '@components/instructions/tools' import { BN } from '@project-serum/anchor' import { getMintDecimalAmountFromNatural } from '@tools/sdk/units' import tokenService from '@utils/services/token' @@ -12,11 +11,7 @@ export function useTotalTreasuryPrice() { useEffect(() => { async function calcTotalTokensPrice() { const totalPrice = governedTokenAccountsWithoutNfts - .filter( - (x) => - typeof x.extensions.mint !== 'undefined' && - typeof x.extensions.token !== 'undefined' - ) + .filter((x) => typeof x.extensions.mint !== 'undefined') .map((x) => { return ( getMintDecimalAmountFromNatural( @@ -28,7 +23,7 @@ export function useTotalTreasuryPrice() { ) ).toNumber() * tokenService.getUSDTokenPrice( - x.isSol ? WSOL_MINT : x.extensions.mint!.publicKey.toBase58() + x.extensions.mint!.publicKey.toBase58() ) ) }) @@ -39,6 +34,8 @@ export function useTotalTreasuryPrice() { } if (governedTokenAccountsWithoutNfts.length) { calcTotalTokensPrice() + } else { + setTotalPriceFormatted('') } }, [ JSON.stringify(governedTokenAccountsWithoutNfts), diff --git a/package.json b/package.json index 5fe457a0df..3af4fa8c24 100644 --- a/package.json +++ b/package.json @@ -4,102 +4,107 @@ "license": "MIT", "version": "1.0.0", "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "prepare": "husky install", - "analyze": "ANALYZE=true next build", - "tc": "yarn type-check --watch", - "type-check": "tsc --pretty --noEmit", - "format": "prettier --write .", - "lint": "eslint . --ext ts --ext tsx --ext js --ext jsx", - "test": "jest", - "test-all": "yarn lint && yarn type-check && yarn test", - "notifier": "ts-node scripts/governance-notifier.ts" + "dev": "next dev", + "build": "next build", + "start": "next start", + "prepare": "husky install", + "analyze": "ANALYZE=true next build", + "tc": "yarn type-check --watch", + "type-check": "tsc --pretty --noEmit", + "format": "prettier --write .", + "lint": "eslint . --ext ts --ext tsx --ext js --ext jsx", + "test": "jest", + "test-all": "yarn lint && yarn type-check && yarn test", + "notifier": "ts-node scripts/governance-notifier.ts" }, "lint-staged": { - "*.@(ts|tsx|js|jsx)": [ - "yarn format" - ] + "*.@(ts|tsx|js|jsx)": [ + "yarn format" + ] }, "dependencies": { - "@blockworks-foundation/mango-client": "^3.4.3", - "@blockworks-foundation/voter-stake-registry-client": "^0.2.1", - "@cardinal/namespaces-components": "^2.5.5", - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.3.0", - "@friktion-labs/friktion-sdk": "^1.1.59", - "@headlessui/react": "^1.5.0", - "@heroicons/react": "^1.0.1", - "@marinade.finance/marinade-ts-sdk": "^2.0.9", - "@metaplex-foundation/mpl-token-metadata": "^1.2.5", - "@next/bundle-analyzer": "^12.1.4", - "@nfteyez/sol-rayz": "^0.10.2", - "@notifi-network/notifi-react-hooks": "^0.11.0", - "@project-serum/anchor": "^0.24.1", - "@project-serum/common": "^0.0.1-beta.3", - "@project-serum/sol-wallet-adapter": "^0.2.6", - "@solana/governance-program-library": "^0.15.0", - "@solana/spl-governance": "^0.0.34", - "@solana/spl-token": "^0.1.3", - "@solana/spl-token-registry": "^0.2.3300", - "@solana/wallet-adapter-base": "^0.9.5", - "@solana/wallet-adapter-phantom": "^0.9.3", - "@solana/wallet-adapter-solflare": "^0.6.6", - "@solana/wallet-adapter-sollet": "^0.11.1", - "@solana/web3.js": "^1.37.1", - "@solendprotocol/solend-sdk": "^0.5.5", - "@tippyjs/react": "^4.2.6", - "axios": "^0.26.1", - "bignumber.js": "^9.0.2", - "buffer-layout": "^1.2.2", - "classnames": "^2.3.1", - "dayjs": "^1.10.7", - "immer": "^9.0.12", - "next": "^12.1.4", - "next-themes": "^0.1.1", - "next-transpile-modules": "^8.0.0", - "node-fetch": "^2.6.1", - "rc-slider": "^9.7.5", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "react-headless-pagination": "^0.1.0", - "react-markdown": "^7.0.0", - "react-portal": "^4.2.2", - "remark-gfm": "^3.0.1", - "superstruct": "^0.15.4", - "ts-node": "^10.7.0", - "tsconfig-paths": "^3.12.0", - "yup": "^0.32.11", - "zustand": "^3.7.2" + "@blockworks-foundation/mango-client": "^3.4.3", + "@blockworks-foundation/voter-stake-registry-client": "^0.2.3", + "@cardinal/namespaces-components": "^2.5.5", + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@foresight-tmp/foresight-sdk": "^0.1.38", + "@friktion-labs/friktion-sdk": "^1.1.25", + "@headlessui/react": "^1.5.0", + "@heroicons/react": "^1.0.1", + "@marinade.finance/marinade-ts-sdk": "^2.0.9", + "@metaplex-foundation/mpl-token-metadata": "^1.2.5", + "@next/bundle-analyzer": "^12.1.5", + "@mithraic-labs/serum-remote": "^0.0.1-rc.16", + "@nfteyez/sol-rayz": "^0.10.2", + "@nivo/bar": "^0.79.1", + "@nivo/core": "^0.79.0", + "@notifi-network/notifi-react-hooks": "^0.12.1", + "@project-serum/anchor": "^0.24.2", + "@project-serum/common": "^0.0.1-beta.3", + "@project-serum/sol-wallet-adapter": "^0.2.6", + "@project-serum/serum": "^0.13.61", + "@solana/governance-program-library": "^0.15.2", + "@solana/spl-governance": "^0.0.34", + "@solana/spl-token": "0.1.8", + "@solana/spl-token-registry": "^0.2.3470", + "@solana/wallet-adapter-base": "^0.9.5", + "@solana/wallet-adapter-phantom": "^0.9.3", + "@solana/wallet-adapter-solflare": "^0.6.6", + "@solana/wallet-adapter-sollet": "^0.11.1", + "@solana/web3.js": "^1.37.1", + "@solendprotocol/solend-sdk": "^0.5.5", + "@tippyjs/react": "^4.2.6", + "axios": "^0.26.1", + "bignumber.js": "^9.0.2", + "buffer-layout": "^1.2.2", + "classnames": "^2.3.1", + "dayjs": "^1.10.7", + "immer": "^9.0.12", + "next": "^12.1.5", + "next-themes": "^0.1.1", + "next-transpile-modules": "^8.0.0", + "node-fetch": "^2.6.1", + "rc-slider": "^9.7.5", + "react": "^18.1.0", + "react-dom": "^18.0.0", + "react-headless-pagination": "^0.1.0", + "react-markdown": "^7.0.0", + "react-portal": "^4.2.2", + "remark-gfm": "^3.0.1", + "superstruct": "^0.15.4", + "ts-node": "^10.7.0", + "tsconfig-paths": "^3.14.1", + "yup": "^0.32.11", + "zustand": "^3.7.2" }, "devDependencies": { - "@notifi-network/notifi-core": "^0.10.1", - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "^11.2.5", - "@types/jest": "^27.4.1", - "@types/node": "^14.14.25", - "@types/react": "^17.0.44", - "@typescript-eslint/eslint-plugin": "^5.19.0", - "@typescript-eslint/parser": "^5.18.0", - "eslint": "^8.13.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.3.0", - "husky": "^6.0.0", - "jest": "^27.4.5", - "lint-staged": "^10.0.10", - "next-router-mock": "^0.6.3", - "postcss": "^8.2.12", - "postcss-preset-env": "^6.7.0", - "prettier": "^2.6.2", - "tailwindcss": "^3.0.23", - "twin.macro": "^2.4.0", - "typescript": "^4.6.3" + "@notifi-network/notifi-core": "^0.12.0", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^11.2.5", + "@types/jest": "^27.4.1", + "@types/node": "^14.14.25", + "@types/react": "^17.0.44", + "@typescript-eslint/eslint-plugin": "^5.21.0", + "@typescript-eslint/parser": "^5.18.0", + "eslint": "^8.12.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-react": "^7.29.4", + "eslint-plugin-react-hooks": "^4.3.0", + "husky": "^6.0.0", + "jest": "^27.4.5", + "lint-staged": "^10.0.10", + "next-router-mock": "^0.6.7", + "postcss": "^8.2.12", + "postcss-preset-env": "^6.7.0", + "prettier": "^2.0.2", + "tailwindcss": "^3.0.23", + "twin.macro": "^2.4.0", + "typescript": "^4.6.3" }, "babelMacros": { - "twin": { - "preset": "emotion" - } + "twin": { + "preset": "emotion" } -} + } + } \ No newline at end of file diff --git a/pages/api/daoStatistics.ts b/pages/api/daoStatistics.ts new file mode 100644 index 0000000000..d1ecec5f79 --- /dev/null +++ b/pages/api/daoStatistics.ts @@ -0,0 +1,146 @@ +import { + getAllGovernances, + getNativeTreasuryAddress, + getRealms, + ProgramAccount, + Realm, + tryGetRealmConfig, +} from '@solana/spl-governance' +import { Connection, PublicKey } from '@solana/web3.js' +import tokenService from '@utils/services/token' +import { getOwnedTokenAccounts, tryGetMint } from '@utils/tokens' +import { NextApiRequest, NextApiResponse } from 'next' +import { getAllSplGovernanceProgramIds } from './tools/realms' +import BigNumber from 'bignumber.js' +import BN from 'bn.js' +import { WSOL_MINT_PK } from '@components/instructions/tools' + +const handler = async (req: NextApiRequest, res: NextApiResponse) => { + const conn = new Connection( + 'https://explorer-api.mainnet-beta.solana.com', + 'recent' + ) + + console.log('fetching spl-gov instances...') + // Get all realms + //const allProgramIds = getAllSplGovernanceProgramIds().slice(0, 1) + const allProgramIds = getAllSplGovernanceProgramIds() + + console.log(`spl-gov instance count: ${allProgramIds.length}`) + + console.log('fetching realms...') + let allRealms: ProgramAccount[] = [] + + for (const programId of allProgramIds) { + const allProgramRealms = await getRealms(conn, new PublicKey(programId)) + + allRealms = allRealms.concat(allProgramRealms) + } + + //allRealms = allRealms.slice(251) + + console.log(`realms count: ${allRealms.length}`) + + const nftRealms: ProgramAccount[] = [] + const tokenAmountMap = new Map() + + const updateTokenAmount = (mintPk: PublicKey, amount: BN) => { + const mintKey = mintPk.toBase58() + tokenAmountMap.set( + mintKey, + (tokenAmountMap.get(mintKey) ?? new BigNumber(0)).plus( + new BigNumber(amount.toString()) + ) + ) + } + + for (const [idx, realm] of allRealms.entries()) { + console.log( + `fetching ${realm.account.name} governances and token accounts ${idx}/${allRealms.length}...` + ) + + const programId = realm.owner + + // Get NFT DAOs + if (realm.account.config.useCommunityVoterWeightAddin) { + const realmConfig = await tryGetRealmConfig(conn, programId, realm.pubkey) + if ( + realmConfig.account.communityVoterWeightAddin?.equals( + new PublicKey('GnftV5kLjd67tvHpNGyodwWveEKivz3ZWvvE3Z4xi2iw') + ) + ) { + nftRealms.push(realm) + } + } + + // Get Governances + const governances = await getAllGovernances(conn, programId, realm.pubkey) + for (const governance of governances) { + // Check governance owned token accounts + let tokenAccounts = await getOwnedTokenAccounts(conn, governance.pubkey) + for (const tokenAccount of tokenAccounts.filter( + (ta) => !ta.account.amount.isZero() + )) { + updateTokenAmount( + tokenAccount.account.mint, + tokenAccount.account.amount + ) + } + + // Check SOL wallet owned token accounts + const solWalletPk = await getNativeTreasuryAddress( + programId, + governance.pubkey + ) + + const solWallet = await conn.getAccountInfo(solWalletPk) + + if (solWallet) { + if (solWallet.lamports > 0) { + updateTokenAmount(WSOL_MINT_PK, new BN(solWallet.lamports)) + } + + tokenAccounts = await getOwnedTokenAccounts(conn, solWalletPk) + for (const tokenAccount of tokenAccounts.filter( + (ta) => !ta.account.amount.isZero() + )) { + updateTokenAmount( + tokenAccount.account.mint, + tokenAccount.account.amount + ) + } + } + } + } + + console.log('fetching tokens and prices...') + + await tokenService.fetchSolanaTokenList() + await tokenService.fetchTokenPrices([...tokenAmountMap.keys()]) + + let totalUsdAmount = 0 + + for (const [mintPk, amount] of tokenAmountMap.entries()) { + const tokenUsdPrice = tokenService.getUSDTokenPrice(mintPk) + if (tokenUsdPrice > 0) { + const mint = await tryGetMint(conn, new PublicKey(mintPk)) + const decimalAmount = amount.shiftedBy(-mint!.account.decimals) + const usdAmount = decimalAmount.toNumber() * tokenUsdPrice + totalUsdAmount += usdAmount + } + } + + const daoStatistics = { + asOf: new Date().toLocaleDateString('en-GB'), + programIdCount: allProgramIds.length, + daoCount: allRealms.length, + nftDaoCount: nftRealms.length, + totalUsdAmount, + } + + console.log('STATS', daoStatistics) + + res.status(200).json(daoStatistics) +} + +export default handler diff --git a/pages/api/daoVoteStatistics.ts b/pages/api/daoVoteStatistics.ts new file mode 100644 index 0000000000..6920079c48 --- /dev/null +++ b/pages/api/daoVoteStatistics.ts @@ -0,0 +1,82 @@ +import { + getGovernanceAccounts, + ProgramAccount, + Proposal, + TokenOwnerRecord, + VoteRecord, +} from '@solana/spl-governance' +import { Connection, PublicKey } from '@solana/web3.js' + +import { NextApiRequest, NextApiResponse } from 'next' +import { getAllSplGovernanceProgramIds } from './tools/realms' + +const handler = async (req: NextApiRequest, res: NextApiResponse) => { + const conn = new Connection( + 'https://explorer-api.mainnet-beta.solana.com', + 'recent' + ) + + console.log('fetching spl-gov instances...') + // Get all realms + //const allProgramIds = getAllSplGovernanceProgramIds().slice(0, 1) + const allProgramIds = getAllSplGovernanceProgramIds() + + console.log(`spl-gov instance count: ${allProgramIds.length}`) + + console.log('fetching proposals...') + let allProposals: ProgramAccount[] = [] + + for (const programId of allProgramIds) { + const allProgramProposals = await getGovernanceAccounts( + conn, + new PublicKey(programId), + Proposal + ) + + allProposals = allProposals.concat(allProgramProposals) + } + + console.log('fetching vote records...') + let allVoteRecords: ProgramAccount[] = [] + + for (const programId of allProgramIds) { + const allProgramVoteRecords = await getGovernanceAccounts( + conn, + new PublicKey(programId), + VoteRecord + ) + + allVoteRecords = allVoteRecords.concat(allProgramVoteRecords) + } + + console.log('fetching members...') + let allMembers = new Set() + + for (const programId of allProgramIds) { + const allOwnerRecords = await getGovernanceAccounts( + conn, + new PublicKey(programId), + TokenOwnerRecord + ) + + for (const ownerRecord of allOwnerRecords) { + allMembers = allMembers.add( + ownerRecord.account.governingTokenOwner.toBase58() + ) + } + } + + const daoStatistics = { + asOf: new Date().toLocaleDateString('en-GB'), + programIdCount: allProgramIds.length, + proposalCount: allProposals.length, + voteCount: allVoteRecords.length, + membersCount: allMembers.size, + } + + console.log('STATS', daoStatistics) + + res.status(200).json(daoStatistics) +} + +export default handler diff --git a/pages/api/splGovernancePrograms.ts b/pages/api/splGovernancePrograms.ts new file mode 100644 index 0000000000..bb15daa873 --- /dev/null +++ b/pages/api/splGovernancePrograms.ts @@ -0,0 +1,9 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import { getAllSplGovernanceProgramIds } from './tools/realms' + +// Returns unique spl-governance program ids +const handler = (req: NextApiRequest, res: NextApiResponse) => { + res.status(200).json(getAllSplGovernanceProgramIds()) +} + +export default handler diff --git a/pages/api/tools/realms.ts b/pages/api/tools/realms.ts new file mode 100644 index 0000000000..52ae9a7923 --- /dev/null +++ b/pages/api/tools/realms.ts @@ -0,0 +1,12 @@ +import { getCertifiedRealmInfos } from '@models/registry/api' +import { getConnectionContext } from '@utils/connection' + +export function getAllSplGovernanceProgramIds() { + return [ + ...new Set( + getCertifiedRealmInfos(getConnectionContext('mainnet')).map((info) => + info.programId.toBase58() + ) + ), + ] +} diff --git a/pages/dao/[symbol]/gallery/[governancePk].tsx b/pages/dao/[symbol]/gallery/index.tsx similarity index 80% rename from pages/dao/[symbol]/gallery/[governancePk].tsx rename to pages/dao/[symbol]/gallery/index.tsx index a10b816bc2..cbfb3e7350 100644 --- a/pages/dao/[symbol]/gallery/[governancePk].tsx +++ b/pages/dao/[symbol]/gallery/index.tsx @@ -1,16 +1,12 @@ import { getExplorerUrl } from '@components/explorer/tools' import PreviousRouteBtn from '@components/PreviousRouteBtn' -import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import useWalletStore from 'stores/useWalletStore' import { PhotographIcon, PlusCircleIcon } from '@heroicons/react/outline' import { NFTWithMint } from '@utils/uiTypes/nfts' -import { DEFAULT_NFT_TREASURY_MINT } from '@components/instructions/tools' import useGovernanceAssets from '@hooks/useGovernanceAssets' import Select from '@components/inputs/Select' import AccountItemNFT from '@components/TreasuryAccount/AccountItemNFT' -import useRealm from '@hooks/useRealm' -import useQueryContext from '@hooks/useQueryContext' import useTreasuryAccountStore from 'stores/useTreasuryAccountStore' import ImgWithLoader from '@components/ImgWithLoader' import Modal from '@components/Modal' @@ -18,26 +14,19 @@ import DepositNFT from '@components/TreasuryAccount/DepositNFT' import { LinkButton } from '@components/Button' import SendTokens from '@components/TreasuryAccount/SendTokens' import useGovernanceAssetsStore from 'stores/useGovernanceAssetsStore' +import { AssetAccount } from '@utils/uiTypes/assets' const gallery = () => { - const router = useRouter() const connection = useWalletStore((s) => s.connection) const realmNfts = useTreasuryAccountStore((s) => s.allNfts) const isLoading = useTreasuryAccountStore((s) => s.isLoadingNfts) const isLoadingGovernances = useGovernanceAssetsStore( (s) => s.loadGovernedAccounts ) - const governanceNfts = useTreasuryAccountStore((s) => s.governanceNfts) - const { symbol } = useRealm() - const governancePk = router?.query?.governancePk + const nftsPerPubkey = useTreasuryAccountStore((s) => s.governanceNfts) const { nftsGovernedTokenAccounts } = useGovernanceAssets() - const { fmtUrlWithCluster } = useQueryContext() - const fetchAllNftsForRealm = DEFAULT_NFT_TREASURY_MINT === governancePk - const currentAccount = nftsGovernedTokenAccounts.find( - (x) => x.governance?.pubkey.toBase58() === governancePk - ) const { setCurrentAccount } = useTreasuryAccountStore() - + const [currentAccount, setStateAccount] = useState(null) const [nfts, setNfts] = useState([]) const [openNftDepositModal, setOpenNftDepositModal] = useState(false) const [openSendNftsModal, setOpenSendNftsModal] = useState(false) @@ -48,13 +37,35 @@ const gallery = () => { setOpenSendNftsModal(false) } useEffect(() => { - const governedNfts = governanceNfts[governancePk as string] - if (fetchAllNftsForRealm) { + if (currentAccount === null) { setNfts(realmNfts) - } else if (governedNfts) { - setNfts(governanceNfts[governancePk as string]) + } else { + const curretnAccountNfts: NFTWithMint[] = [] + const hasNftsInWithGovernanceOwner = + nftsPerPubkey[currentAccount.governance.pubkey.toBase58()].length + const hasNftsInSolAccount = + currentAccount.isSol && + nftsPerPubkey[currentAccount.extensions.transferAddress!.toBase58()] + .length + if (hasNftsInWithGovernanceOwner) { + curretnAccountNfts.push( + ...nftsPerPubkey[currentAccount.governance.pubkey.toBase58()] + ) + } + if (hasNftsInSolAccount) { + curretnAccountNfts.push( + ...nftsPerPubkey[ + currentAccount.extensions.transferAddress!.toBase58() + ] + ) + } + setNfts(curretnAccountNfts) } - }, [realmNfts.length, JSON.stringify(governanceNfts), governancePk]) + }, [ + realmNfts.length, + JSON.stringify(nftsPerPubkey), + currentAccount?.extensions.transferAddress?.toBase58(), + ]) return (
@@ -90,12 +101,8 @@ const gallery = () => {
filterMembers(e.target.value)} + placeholder={`Search by Wallet Address...`} + prefix={} + /> +
+ ) : null} +
+

+ {searchString.length > 0 + ? `${filteredMembers.length} Members Found` + : `${activeMembers.length} Members`} +

+ + setOpenAddMemberModal(!openAddMemberModal)} + className={`flex items-center text-primary-light whitespace-nowrap ${ + addNewMemberTooltip + ? 'cursor-not-allowed pointer-events-none opacity-60' + : 'cursor-pointer' + }`} + > + + New Member + + +
+
+ +
+
+ setActiveMember(t)} + tabs={paginatedMembers} + /> + +
+
+
+ {activeMember ? : null} +
+
+ {openAddMemberModal && ( + setOpenAddMemberModal(false)} + isOpen={openAddMemberModal} + > + setOpenAddMemberModal(false)} /> + + )} +
+ ) +} + +export default Members diff --git a/pages/dao/[symbol]/members/index.tsx b/pages/dao/[symbol]/members/index.tsx index 34d9790fbd..387da64d6f 100644 --- a/pages/dao/[symbol]/members/index.tsx +++ b/pages/dao/[symbol]/members/index.tsx @@ -1,200 +1,10 @@ import useRealm from '@hooks/useRealm' -import React, { useEffect, useRef, useState } from 'react' -import MemberOverview from '@components/Members/MemberOverview' -import { PlusCircleIcon, SearchIcon, UsersIcon } from '@heroicons/react/outline' -import useGovernanceAssets from '@hooks/useGovernanceAssets' -import Tooltip from '@components/Tooltip' -import useWalletStore from 'stores/useWalletStore' -import Modal from '@components/Modal' -import AddMemberForm from '@components/Members/AddMemberForm' -import PreviousRouteBtn from '@components/PreviousRouteBtn' -import { LinkButton } from '@components/Button' -import MembersTabs from '@components/Members/MembersTabs' -import Select from '@components/inputs/Select' -import Input from '@components/inputs/Input' -import { Member } from '@utils/uiTypes/members' -import useMembersStore from 'stores/useMembersStore' -import PaginationComponent from '@components/Pagination' - +import Members from './Members' const MembersPage = () => { - const { - realmInfo, - toManyCouncilOutstandingProposalsForUse, - toManyCommunityOutstandingProposalsForUser, - } = useRealm() - const pagination = useRef<{ setPage: (val) => void }>(null) - const membersPerPage = 10 - const activeMembers = useMembersStore((s) => s.compact.activeMembers) - const connected = useWalletStore((s) => s.connected) - const { - canUseMintInstruction, - canMintRealmCouncilToken, - } = useGovernanceAssets() - const [paginatedMembers, setPaginatedMembers] = useState([]) - const [activeMember, setActiveMember] = useState(activeMembers[0]) - const [openAddMemberModal, setOpenAddMemberModal] = useState(false) - const [searchString, setSearchString] = useState('') - const [filteredMembers, setFilteredMembers] = useState([]) - const filterMembers = (v) => { - setSearchString(v) - if (v.length > 0) { - const filtered = activeMembers.filter((r) => - r.walletAddress?.toLowerCase().includes(v.toLowerCase()) - ) - setFilteredMembers(filtered) - } else { - setFilteredMembers(activeMembers) - } - } - - const addNewMemberTooltip = !connected - ? 'Connect your wallet to add new council member' - : !canMintRealmCouncilToken() - ? 'Your realm need mint governance for council token to add new member' - : !canUseMintInstruction - ? "You don't have enough governance power to add new council member" - : toManyCommunityOutstandingProposalsForUser - ? 'You have too many community outstanding proposals. You need to finalize them before creating a new council member.' - : toManyCouncilOutstandingProposalsForUse - ? 'You have too many council outstanding proposals. You need to finalize them before creating a new council member.' - : '' - const onPageChange = (page) => { - setPaginatedMembers(paginateMembers(page)) - } - const paginateMembers = (page) => { - return filteredMembers.slice( - page * membersPerPage, - (page + 1) * membersPerPage - ) - } - useEffect(() => { - if (activeMembers.length > 0) { - setActiveMember(activeMembers[0]) - setFilteredMembers(activeMembers) - } - }, [JSON.stringify(activeMembers)]) - useEffect(() => { - setPaginatedMembers(paginateMembers(0)) - pagination?.current?.setPage(0) - }, [JSON.stringify(filteredMembers)]) + const { realm } = useRealm() return ( -
-
-
-
- -
-
-
- {realmInfo?.ogImage ? ( - - ) : null} -
-

{realmInfo?.displayName}

-

Members

-
-
-
-
-
- -
-

Members

-
- {activeMembers.length} -
-
-
-
-
-
-
-
- {activeMembers.length > 15 ? ( -
- filterMembers(e.target.value)} - placeholder={`Search by Wallet Address...`} - prefix={} - /> -
- ) : null} -
-

- {searchString.length > 0 - ? `${filteredMembers.length} Members Found` - : `${activeMembers.length} Members`} -

- - setOpenAddMemberModal(!openAddMemberModal)} - className={`flex items-center text-primary-light whitespace-nowrap ${ - addNewMemberTooltip - ? 'cursor-not-allowed pointer-events-none opacity-60' - : 'cursor-pointer' - }`} - > - - New Member - - -
-
- -
-
- setActiveMember(t)} - tabs={paginatedMembers} - /> - -
-
-
- {activeMember ? : null} -
-
- {openAddMemberModal && ( - setOpenAddMemberModal(false)} - isOpen={openAddMemberModal} - > - setOpenAddMemberModal(false)} /> - - )} +
+ {!realm?.account.config.useCommunityVoterWeightAddin ? : null}
) } diff --git a/pages/dao/[symbol]/params/components/AccountsView.tsx b/pages/dao/[symbol]/params/components/AccountsView.tsx new file mode 100644 index 0000000000..2468bb2540 --- /dev/null +++ b/pages/dao/[symbol]/params/components/AccountsView.tsx @@ -0,0 +1,155 @@ +import { getTreasuryAccountItemInfoV2 } from '@utils/treasuryTools' +import { AccountType } from '@utils/uiTypes/assets' +import { AddressField } from '../index' +import useGovernanceAssets from '@hooks/useGovernanceAssets' + +const AccountsView = ({ + activeGovernance, + getYesNoString, + auxiliaryMode = false, +}) => { + const { assetAccounts, auxiliaryTokenAccounts } = useGovernanceAssets() + const accounts = auxiliaryMode ? auxiliaryTokenAccounts : assetAccounts + return ( +
+ {accounts + .filter((x) => + !auxiliaryMode + ? x.governance.pubkey.toBase58() === + activeGovernance.pubkey.toBase58() + : auxiliaryMode + ) + .map((x) => { + const info = getTreasuryAccountItemInfoV2(x) + if (x.isToken || x.isSol || x.type === AccountType.AuxiliaryToken) { + return ( +
+ + + + {info.logo && ( + + )} + {`${info.amountFormatted} ${ + info.info?.symbol && info.info?.symbol + }`} +
+ } + /> + + {x.type !== AccountType.SOL && ( + + )} +
+ ) + } + + if (x.type === AccountType.NFT) { + return ( +
+ + +
+ ) + } + if (x.type === AccountType.MINT) { + return ( +
+ + + + + + + {x.extensions.mint?.account.freezeAuthority ? ( + + ) : null} +
+ ) + } + if (x.type === AccountType.PROGRAM) { + return ( +
+ + +
+ ) + } + })} +
+ ) +} + +export default AccountsView diff --git a/pages/dao/[symbol]/params/components/ParamsView.tsx b/pages/dao/[symbol]/params/components/ParamsView.tsx new file mode 100644 index 0000000000..6ea6a230cf --- /dev/null +++ b/pages/dao/[symbol]/params/components/ParamsView.tsx @@ -0,0 +1,98 @@ +import useRealm from '@hooks/useRealm' +import { fmtMintAmount } from '@tools/sdk/units' +import { + getFormattedStringFromDays, + SECS_PER_DAY, +} from 'VoteStakeRegistry/tools/dateTools' +import Button from '@components/Button' +import { VoteTipping } from '@solana/spl-governance' +import { AddressField, NumberField } from '../index' + +const ParamsView = ({ activeGovernance, openGovernanceProposalModal }) => { + const { realm, mint, councilMint, ownVoterWeight } = useRealm() + + const realmAccount = realm?.account + const communityMint = realmAccount?.communityMint.toBase58() + + return ( + <> + {activeGovernance && ( + <> + {realmAccount?.authority?.toBase58() === + activeGovernance.pubkey.toBase58() && ( + + )} + + {communityMint && ( + + )} + {councilMint && ( + + )} + + {/* NOT NEEDED RIGHT NOW */} + {/* */} + + +
+ +
+ + )} + + ) +} + +export default ParamsView diff --git a/pages/dao/[symbol]/params/components/StatsView.tsx b/pages/dao/[symbol]/params/components/StatsView.tsx new file mode 100644 index 0000000000..a0181c43fd --- /dev/null +++ b/pages/dao/[symbol]/params/components/StatsView.tsx @@ -0,0 +1,24 @@ +import { AddressField, NumberField } from '../index' + +const StatsView = ({ activeGovernance }) => { + return ( +
+ {activeGovernance && ( + <> + + + + )} +
+ ) +} + +export default StatsView diff --git a/pages/dao/[symbol]/params/index.tsx b/pages/dao/[symbol]/params/index.tsx index 9decdb1776..3157bbe5e4 100644 --- a/pages/dao/[symbol]/params/index.tsx +++ b/pages/dao/[symbol]/params/index.tsx @@ -4,12 +4,7 @@ import PreviousRouteBtn from '@components/PreviousRouteBtn' import useRealm from '@hooks/useRealm' import { fmtMintAmount } from '@tools/sdk/units' import { capitalize } from '@utils/helpers' -import { getTreasuryAccountItemInfoV2 } from '@utils/treasuryTools' import useGovernanceAssetsStore from 'stores/useGovernanceAssetsStore' -import { - getFormattedStringFromDays, - SECS_PER_DAY, -} from 'VoteStakeRegistry/tools/dateTools' import Tabs from '@components/Tabs' import Select from '@components/inputs/Select' import Button from '@components/Button' @@ -17,39 +12,38 @@ import useGovernanceAssets from '@hooks/useGovernanceAssets' import RealmConfigModal from './RealmConfigModal' import GovernanceConfigModal from './GovernanceConfigModal' -import { VoteTipping } from '@solana/spl-governance' import { tryParsePublicKey } from '@tools/core/pubkey' import { getAccountName } from '@components/instructions/tools' import useWalletStore from 'stores/useWalletStore' import SetRealmAuthorityModal from './SetRealmAuthorityModal' -import BigNumber from 'bignumber.js' -import { AccountType } from '@utils/uiTypes/assets' + +import ParamsView from './components/ParamsView' +import AccountsView from './components/AccountsView' +import StatsView from './components/StatsView' +import { ExclamationIcon } from '@heroicons/react/outline' +import Tooltip from '@components/Tooltip' const Params = () => { - const { realm, mint, councilMint, ownVoterWeight } = useRealm() + const { realm, mint } = useRealm() const wallet = useWalletStore((s) => s.current) - const { canUseAuthorityInstruction, assetAccounts } = useGovernanceAssets() + const { canUseAuthorityInstruction, assetAccounts, auxiliaryTokenAccounts } = + useGovernanceAssets() const governancesArray = useGovernanceAssetsStore((s) => s.governancesArray) const loadGovernedAccounts = useGovernanceAssetsStore( (s) => s.loadGovernedAccounts ) - const realmAuthorityGovernance = assetAccounts.find( - (x) => - x.governance.pubkey.toBase58() === realm?.account.authority?.toBase58() - ) - const [isRealmProposalModalOpen, setIsRealmProposalModalOpen] = useState( - false + const realmAuthorityGovernance = governancesArray.find( + (x) => x.pubkey.toBase58() === realm?.account.authority?.toBase58() ) - const [ - isGovernanceProposalModalOpen, - setIsGovernanceProposalModalOpen, - ] = useState(false) + const [isRealmProposalModalOpen, setIsRealmProposalModalOpen] = + useState(false) + const [isGovernanceProposalModalOpen, setIsGovernanceProposalModalOpen] = + useState(false) const [activeGovernance, setActiveGovernance] = useState(null) const [activeTab, setActiveTab] = useState('Params') - const [isRealmAuthorityModalOpen, setRealmAuthorityModalIsOpen] = useState( - false - ) + const [isRealmAuthorityModalOpen, setRealmAuthorityModalIsOpen] = + useState(false) const realmAccount = realm?.account const communityMint = realmAccount?.communityMint.toBase58() const councilMintPk = realmAccount?.config.councilMint?.toBase58() @@ -83,6 +77,7 @@ const Params = () => { setActiveGovernance(governancesArray[0]) } }, [governancesArray]) + return (
{isRealmProposalModalOpen && ( @@ -118,30 +113,32 @@ const Params = () => { <>

Addresses

- - - {communityMint && ( - )} {councilMintPk && ( - {

Config

{communityMintMaxVoteWeightSource && ( - )} - { ) } /> - - { )} />
- {realmAuthorityGovernance && ( - - )} +
@@ -217,308 +218,89 @@ const Params = () => { )}
{!loadGovernedAccounts ? ( -
-
- -
-
-

{governancesArray.length} Governances

- setActiveGovernance(g)} - tabs={governancesArray} - /> -
- {activeGovernance ? ( -
-

- {activeGovernance.pubkey.toBase58()} -

- {assetAccounts.filter( - (x) => - x.governance.pubkey.toBase58() === - activeGovernance.pubkey.toBase58() - ).length > 0 ? ( - setActiveTab(t)} - tabs={['Params', 'Accounts']} - /> - ) : null} - {activeTab === 'Params' ? ( - <> - - {realmAccount?.authority?.toBase58() === - activeGovernance.pubkey.toBase58() && ( - - )} - - - - {communityMint && ( - - )} - {councilMint && ( - - )} - - +
+
+ +
+
+

{governancesArray.length} Governances

+ setActiveGovernance(g)} + tabs={governancesArray} + /> +
+ {activeGovernance ? ( +
+

+ {activeGovernance.pubkey.toBase58()} +

+ {assetAccounts.filter( + (x) => + x.governance.pubkey.toBase58() === + activeGovernance.pubkey.toBase58() + ).length > 0 ? ( + setActiveTab(t)} + tabs={['Params', 'Accounts', 'Statistics']} /> - - -
- -
- - ) : ( -
- {assetAccounts - .filter( - (x) => - x.governance.pubkey.toBase58() === - activeGovernance.pubkey.toBase58() - ) - .map((x) => { - const info = getTreasuryAccountItemInfoV2(x) - if (x.isToken || x.isSol) { - return ( -
- - - - {info.logo && ( - - )} - {`${info.amountFormatted} ${ - info.info?.symbol || '' - }`} -
- } - /> - - {x.type !== AccountType.SOL && ( - - )} -
- ) - } - - if (x.type === AccountType.NFT) { - return ( -
- - -
- ) - } - if (x.type === AccountType.MINT) { - return ( -
- - - - - - - {x.extensions.mint?.account.freezeAuthority ? ( - - ) : null} -
- ) - } - if (x.type === AccountType.PROGRAM) { - return ( -
- - -
- ) - } - })} -
- )} + )} + {activeTab === 'Statistics' && ( + + )} +
+ ) : null} +
+ {auxiliaryTokenAccounts.length !== 0 && ( +
+
+

Auxiliary Accounts

+ +
- ) : null} -
+ )} + ) : (
)} @@ -527,7 +309,14 @@ const Params = () => { ) } -const DisplayField = ({ label, val, padding = false, bg = false }) => { +export const AddressField = ({ + label, + val, + padding = false, + bg = false, + warn = false, + warningText = '', +}) => { const pubkey = isNaN(val) && tryParsePublicKey(val) const name = pubkey ? getAccountName(pubkey) : '' return ( @@ -541,7 +330,16 @@ const DisplayField = ({ label, val, padding = false, bg = false }) => { {pubkey && name ? ( <>
{name}
-
{val}
+
+ {val} + {warn && ( +
+ + + +
+ )} +
) : (
{val}
@@ -551,4 +349,24 @@ const DisplayField = ({ label, val, padding = false, bg = false }) => { ) } +export const NumberField = ({ + label, + val = 0, + padding = false, + bg = false, +}) => { + return ( +
+
{capitalize(label)}
+
+
{val}
+
+
+ ) +} + export default Params diff --git a/pages/dao/[symbol]/proposal/components/ApproveAllBtn.tsx b/pages/dao/[symbol]/proposal/components/ApproveAllBtn.tsx deleted file mode 100644 index f877956775..0000000000 --- a/pages/dao/[symbol]/proposal/components/ApproveAllBtn.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import useRealm from '@hooks/useRealm' -import React, { useMemo, useState } from 'react' -import useWalletStore from 'stores/useWalletStore' -import { - ProposalState, - Vote, - withCastVote, - YesNoVote, -} from '@solana/spl-governance' -import { CheckCircleIcon } from '@heroicons/react/outline' -import { Transaction, TransactionInstruction } from '@solana/web3.js' -import { sendSignedTransaction } from '@utils/sendTransactions' -import { notify } from '@utils/notifications' -import Loading from '@components/Loading' -import useVotePluginsClientStore from 'stores/useVotePluginsClientStore' -import { NftVoterClient } from '@solana/governance-program-library' -import { LinkButton } from '@components/Button' - -const ApproveAllBtn = () => { - const wallet = useWalletStore((s) => s.current) - const connected = useWalletStore((s) => s.connected) - const { current: connection } = useWalletStore((s) => s.connection) - const ownVoteRecordsByProposal = useWalletStore( - (s) => s.ownVoteRecordsByProposal - ) - - const client = useVotePluginsClientStore( - (s) => s.state.currentRealmVotingClient - ) - const { proposals, realmInfo, realm, tokenRecords } = useRealm() - const [isLoading, setIsLoading] = useState(false) - const refetchProposals = useWalletStore((s) => s.actions.refetchProposals) - const votingProposals = useMemo( - () => - Object.values(proposals).filter( - (p) => - p.account.state == ProposalState.Voting && - !ownVoteRecordsByProposal[p.pubkey.toBase58()] - ), - [proposals, ownVoteRecordsByProposal] - ) - - const canApproveProposals = connected && votingProposals.length > 0 - - const approveAll = async () => { - if (!wallet || !realmInfo!.programId || !realm) return - - const governanceAuthority = wallet.publicKey! - const payer = wallet.publicKey! - - try { - setIsLoading(true) - const { - blockhash: recentBlockhash, - } = await connection.getLatestBlockhash() - - const transactions: Transaction[] = [] - for (let i = 0; i < votingProposals.length; i++) { - const proposal = votingProposals[i] - const ownTokenRecord = tokenRecords[wallet.publicKey!.toBase58()] - - const instructions: TransactionInstruction[] = [] - - //will run only if plugin is connected with realm - const plugin = await client?.withCastPluginVote( - instructions, - proposal.pubkey - ) - if (client.client instanceof NftVoterClient === false) { - await withCastVote( - instructions, - realmInfo!.programId, - realmInfo!.programVersion!, - realm.pubkey, - proposal.account.governance, - proposal.pubkey, - proposal.account.tokenOwnerRecord, - ownTokenRecord.pubkey, - governanceAuthority, - proposal.account.governingTokenMint, - Vote.fromYesNoVote(YesNoVote.Yes), - payer, - plugin?.voterWeightPk, - plugin?.maxVoterWeightRecord - ) - } - - const transaction = new Transaction() - transaction.add(...instructions) - transaction.recentBlockhash = recentBlockhash - transaction.setSigners( - // fee payed by the wallet owner - wallet.publicKey! - ) - transactions.push(transaction) - } - const signedTXs = await wallet.signAllTransactions(transactions) - await Promise.all( - signedTXs.map((transaction) => - sendSignedTransaction({ signedTransaction: transaction, connection }) - ) - ) - await refetchProposals() - notify({ - message: 'Successfully voted on all proposals', - type: 'success', - }) - } catch (e) { - notify({ type: 'erorr', message: `Something went wrong, ${e}` }) - } - setIsLoading(false) - } - - return canApproveProposals ? ( - isLoading ? ( - - ) : ( - - - Approve All - - ) - ) : null -} - -export default ApproveAllBtn diff --git a/pages/dao/[symbol]/proposal/components/DryRunInstructionBtn.tsx b/pages/dao/[symbol]/proposal/components/DryRunInstructionBtn.tsx index 9a3e62c3ea..d49a0bc412 100644 --- a/pages/dao/[symbol]/proposal/components/DryRunInstructionBtn.tsx +++ b/pages/dao/[symbol]/proposal/components/DryRunInstructionBtn.tsx @@ -46,6 +46,8 @@ const DryRunInstructionBtn = ({ const instructionData = await getInstructionDataFcn() const prerequisiteInstructionsToRun = instructionData.prerequisiteInstructions + const additionalInstructions = + instructionData.additionalSerializedInstructions if (!instructionData?.isValid) { setIsPending(false) throw new Error('Invalid instruction') @@ -54,7 +56,8 @@ const DryRunInstructionBtn = ({ connection.current, wallet!, getInstructionDataFromBase64(instructionData?.serializedInstruction), - prerequisiteInstructionsToRun + prerequisiteInstructionsToRun, + additionalInstructions?.map((x) => getInstructionDataFromBase64(x)) ) setResult(result) setIsOpen(true) @@ -94,7 +97,7 @@ const DryRunInstructionBtn = ({ disabled={isPending || !wallet?.connected} small > - {isPending ? : 'Preview instruction'} + {isPending ? : 'Preview transaction'} {result?.response && ( diff --git a/pages/dao/[symbol]/proposal/components/GovernedAccountSelect.tsx b/pages/dao/[symbol]/proposal/components/GovernedAccountSelect.tsx index 293fb1b623..f180b97ec0 100644 --- a/pages/dao/[symbol]/proposal/components/GovernedAccountSelect.tsx +++ b/pages/dao/[symbol]/proposal/components/GovernedAccountSelect.tsx @@ -34,22 +34,23 @@ const GovernedAccountSelect = ({ function getLabel(value: AssetAccount) { if (value) { const accountType = value.governance.account.accountType - switch (accountType) { - case GovernanceAccountType.MintGovernanceV1: - case GovernanceAccountType.MintGovernanceV2: - return getMintAccountLabelComponent(getMintAccountLabelInfo(value)) - case GovernanceAccountType.TokenGovernanceV1: - case GovernanceAccountType.TokenGovernanceV2: - return getTokenAccountLabelComponent( - value.isSol - ? getSolAccountLabel(value) - : getTokenAccountLabelInfo(value) - ) - case GovernanceAccountType.ProgramGovernanceV1: - case GovernanceAccountType.ProgramGovernanceV2: - return getProgramAccountLabel(value.governance) - default: - return value.governance.account.governedAccount.toBase58() + if (value.isSol || value.isToken) { + return getTokenAccountLabelComponent( + value.isSol + ? getSolAccountLabel(value) + : getTokenAccountLabelInfo(value) + ) + } else { + switch (accountType) { + case GovernanceAccountType.MintGovernanceV1: + case GovernanceAccountType.MintGovernanceV2: + return getMintAccountLabelComponent(getMintAccountLabelInfo(value)) + case GovernanceAccountType.ProgramGovernanceV1: + case GovernanceAccountType.ProgramGovernanceV2: + return getProgramAccountLabel(value.governance) + default: + return value.governance.account.governedAccount.toBase58() + } } } else { return null diff --git a/pages/dao/[symbol]/proposal/components/MyProposalsBtn.tsx b/pages/dao/[symbol]/proposal/components/MyProposalsBtn.tsx index a05b72f342..94b242b02b 100644 --- a/pages/dao/[symbol]/proposal/components/MyProposalsBtn.tsx +++ b/pages/dao/[symbol]/proposal/components/MyProposalsBtn.tsx @@ -1,5 +1,5 @@ import useRealm from '@hooks/useRealm' -import React, { useMemo, useState } from 'react' +import React, { useEffect, useMemo, useState } from 'react' import useWalletStore from 'stores/useWalletStore' import { ProgramAccount, @@ -20,6 +20,12 @@ import { sendSignedTransaction } from '@utils/sendTransactions' import useVotePluginsClientStore from 'stores/useVotePluginsClientStore' import useNftPluginStore from 'NftVotePlugin/store/nftPluginStore' import { sleep } from '@project-serum/common' +import { NftVoterClient } from '@solana/governance-program-library' +import { chunks } from '@utils/helpers' +import { + getNftRegistrarPDA, + getNftVoterWeightRecord, +} from 'NftVotePlugin/sdk/accounts' const MyProposalsBn = () => { const [modalIsOpen, setModalIsOpen] = useState(false) @@ -31,6 +37,10 @@ const MyProposalsBn = () => { const ownVoteRecordsByProposal = useWalletStore( (s) => s.ownVoteRecordsByProposal ) + const [ownNftVoteRecords, setOwnNftVoteRecords] = useState([]) + const ownNftVoteRecordsFilterd = ownNftVoteRecords.filter( + (x) => !ownVoteRecordsByProposal[x.account.proposal.toBase58()] + ) const maxVoterWeight = useNftPluginStore((s) => s.state.maxVoteRecord)?.pubkey || undefined const { realm, programId } = useWalletStore((s) => s.selectedRealm) @@ -43,6 +53,7 @@ const MyProposalsBn = () => { ownTokenRecord, ownCouncilTokenRecord, realmInfo, + isNftMode, } = useRealm() const myProposals = useMemo( () => @@ -86,10 +97,13 @@ const MyProposalsBn = () => { x.account.state === ProposalState.Executing || x.account.state === ProposalState.SigningOff || x.account.state === ProposalState.Succeeded || - x.account.state === ProposalState.ExecutingWithErrors) && + x.account.state === ProposalState.ExecutingWithErrors || + x.account.state === ProposalState.Defeated || + x.account.state === ProposalState.Cancelled) && ownVoteRecordsByProposal[x.pubkey.toBase58()] && !ownVoteRecordsByProposal[x.pubkey.toBase58()]?.account.isRelinquished ) + const createdVoting = myProposals.filter((x) => { return ( x.account.state === ProposalState.Voting && !x.account.isVoteFinalized() @@ -103,9 +117,8 @@ const MyProposalsBn = () => { if (!wallet || !programId || !realm) return setIsLoading(true) try { - const { - blockhash: recentBlockhash, - } = await connection.getLatestBlockhash() + const { blockhash: recentBlockhash } = + await connection.getLatestBlockhash() const transactions: Transaction[] = [] for (let i = 0; i < proposalsArray.length; i++) { @@ -169,7 +182,7 @@ const MyProposalsBn = () => { : ownCouncilTokenRecord const governanceAuthority = wallet!.publicKey! const beneficiary = wallet!.publicKey! - const inst = withRelinquishVote( + const inst = await withRelinquishVote( instructions, realm!.owner, proposal.account.governance, @@ -214,6 +227,93 @@ const MyProposalsBn = () => { withInstruction ) } + const releaseNfts = async () => { + setIsLoading(true) + const instructions: TransactionInstruction[] = [] + const { registrar } = await getNftRegistrarPDA( + realm!.pubkey, + realm!.account.communityMint, + client.client!.program.programId + ) + const { voterWeightPk } = await getNftVoterWeightRecord( + realm!.pubkey, + realm!.account.communityMint, + wallet!.publicKey!, + client.client!.program.programId + ) + for (const i of ownNftVoteRecords) { + const relinquishNftVoteIx = await ( + client.client as NftVoterClient + ).program.methods + .relinquishNftVote() + .accounts({ + registrar, + voterWeightRecord: voterWeightPk, + governance: proposals[i.account.proposal].account.governance, + proposal: i.account.proposal, + governingTokenOwner: wallet!.publicKey!, + voteRecord: i.publicKey, + beneficiary: wallet!.publicKey!, + }) + .remainingAccounts([ + { pubkey: i.publicKey, isSigner: false, isWritable: true }, + ]) + .instruction() + instructions.push(relinquishNftVoteIx) + } + try { + const insertChunks = chunks(instructions, 10) + const instArray = [...insertChunks] + const transactions: Transaction[] = [] + const { blockhash: recentBlockhash } = + await connection.getLatestBlockhash() + for (let i = 0; i < instArray.length; i++) { + const instructionsChunk = instArray[i] + + const transaction = new Transaction({ + recentBlockhash, + feePayer: wallet!.publicKey!, + }) + transaction.add(...instructionsChunk) + transaction.recentBlockhash = recentBlockhash + transaction.setSigners( + // fee payed by the wallet owner + wallet!.publicKey! + ) + transactions.push(transaction) + } + const signedTXs = await wallet!.signAllTransactions(transactions) + await Promise.all( + signedTXs.map((transaction) => + sendSignedTransaction({ signedTransaction: transaction, connection }) + ) + ) + setIsLoading(false) + getNftsVoteRecord() + } catch (e) { + setIsLoading(false) + console.log(e) + } + } + const getNftsVoteRecord = async () => { + const nftClient = client.client as NftVoterClient + const nftVoteRecords = await nftClient.program.account.nftVoteRecord.all([ + { + memcmp: { + offset: 72, + bytes: wallet!.publicKey!.toBase58(), + }, + }, + ]) + const nftVoteRecordsFiltered = nftVoteRecords + setOwnNftVoteRecords(nftVoteRecordsFiltered) + } + useEffect(() => { + if (wallet?.publicKey && isNftMode && client.client && modalIsOpen) { + getNftsVoteRecord() + } + }, [client.clientType, isNftMode, wallet?.publicKey?.toBase58(), modalIsOpen]) + return ( <>
@@ -246,7 +346,7 @@ const MyProposalsBn = () => { isLoading={isLoading} > { proposals={createdVoting} isLoading={isLoading} > + {isNftMode && ownNftVoteRecordsFilterd.length !== 0 && ( +
+

+ Unreleased nfts ({ownNftVoteRecordsFilterd.length}) + +

+
+ )} )} @@ -279,22 +395,29 @@ const ProposalList = ({ proposals: ProgramAccount[] isLoading: boolean }) => { + const { isNftMode } = useRealm() return ( <> {' '}

{title} ({proposals.length}) - {btnName && proposals.length !== 0 && ( + {!isNftMode && btnName && proposals.length !== 0 && (
-
diff --git a/pages/dao/[symbol]/proposal/components/instructions/CloseTokenAccount.tsx b/pages/dao/[symbol]/proposal/components/instructions/CloseTokenAccount.tsx new file mode 100644 index 0000000000..9fcc1f05c2 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/CloseTokenAccount.tsx @@ -0,0 +1,199 @@ +import React, { useContext, useEffect, useState } from 'react' +import { + Governance, + ProgramAccount, + serializeInstructionToBase64, +} from '@solana/spl-governance' +import { + getTransferInstructionObj, + validateInstruction, +} from '@utils/instructionTools' +import { UiInstruction } from '@utils/uiTypes/proposalCreationTypes' +import useWalletStore from 'stores/useWalletStore' + +import { NewProposalContext } from '../../new' +import useRealm from '@hooks/useRealm' +import useGovernanceAssets from '@hooks/useGovernanceAssets' +import { AssetAccount } from '@utils/uiTypes/assets' +import InstructionForm, { + InstructionInput, + InstructionInputType, +} from './FormCreator' +import { Token, TOKEN_PROGRAM_ID } from '@solana/spl-token' +import * as yup from 'yup' +import { getValidatedPublickKey } from '@utils/validations' +import { PublicKey } from '@solana/web3.js' + +export interface CloseTokenAccountForm { + governedAccount: AssetAccount | undefined + fundsDestinationAccount: string + solRentDestination: string +} + +const CloseTokenAccount = ({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) => { + const { realm } = useRealm() + const wallet = useWalletStore((s) => s.current) + const connection = useWalletStore((s) => s.connection) + const shouldBeGoverned = index !== 0 && governance + const { governedTokenAccountsWithoutNfts } = useGovernanceAssets() + const [form, setForm] = useState() + const [formErrors, setFormErrors] = useState({}) + const { handleSetInstructions } = useContext(NewProposalContext) + const schema = yup.object().shape({ + governedAccount: yup + .object() + .nullable() + .required('Program governed account is required'), + fundsDestinationAccount: yup + .string() + .test( + 'fundsDestinationAccountTest', + 'Funds destination address validation error', + function (val: string) { + if (form?.governedAccount?.extensions.amount?.isZero()) { + return true + } + if (val) { + try { + return !!getValidatedPublickKey(val) + } catch (e) { + console.log(e) + return this.createError({ + message: `${e}`, + }) + } + } else { + return this.createError({ + message: `Funds destination address is required`, + }) + } + } + ), + solRentDestination: yup + .string() + .test( + 'solRentDestinationTest', + 'Sol rent destination address validation error', + function (val: string) { + if (val) { + try { + return !!getValidatedPublickKey(val) + } catch (e) { + console.log(e) + return this.createError({ + message: `${e}`, + }) + } + } else { + return this.createError({ + message: `Sol rent destination address is required`, + }) + } + } + ), + }) + async function getInstruction(): Promise { + const isValid = await validateInstruction({ schema, form, setFormErrors }) + let serializedInstructionClose = '' + let serializedTransfer = '' + let instructions: any = null + if ( + isValid && + form!.governedAccount?.governance?.account && + wallet?.publicKey && + realm + ) { + instructions = + !form!.governedAccount.extensions.token!.account.amount?.isZero() + ? await getTransferInstructionObj({ + connection: connection, + governedTokenAccount: form!.governedAccount!, + amount: form!.governedAccount.extensions.token!.account.amount!, + destinationAccount: form!.fundsDestinationAccount!, + wallet: wallet, + }) + : null + const closeInstruction = Token.createCloseAccountInstruction( + TOKEN_PROGRAM_ID, + form!.governedAccount.extensions.token!.publicKey!, + new PublicKey(form!.solRentDestination), + form!.governedAccount.extensions.token!.account.owner!, + [] + ) + serializedTransfer = instructions?.transferInstruction + ? serializeInstructionToBase64(instructions?.transferInstruction) + : '' + serializedInstructionClose = + serializeInstructionToBase64(closeInstruction) + } + const obj: UiInstruction = { + prerequisiteInstructions: [], + serializedInstruction: serializedInstructionClose, + additionalSerializedInstructions: [], + isValid, + governance: form!.governedAccount?.governance, + } + if (instructions?.ataInstruction) { + obj.prerequisiteInstructions?.push(instructions?.ataInstruction) + } + if (serializedTransfer) { + obj.additionalSerializedInstructions!.push(serializedTransfer) + } + return obj + } + useEffect(() => { + handleSetInstructions( + { governedAccount: form?.governedAccount?.governance, getInstruction }, + index + ) + }, [form]) + const inputs: InstructionInput[] = [ + { + label: 'Token account', + initialValue: null, + name: 'governedAccount', + type: InstructionInputType.GOVERNED_ACCOUNT, + shouldBeGoverned: shouldBeGoverned as any, + governance: governance, + options: governedTokenAccountsWithoutNfts.filter((x) => !x.isSol), + }, + { + label: 'Token recipient', + initialValue: '', + name: 'fundsDestinationAccount', + type: InstructionInputType.INPUT, + inputType: 'text', + hide: form?.governedAccount?.extensions.amount?.isZero(), + }, + { + label: 'Sol recipient', + initialValue: + governedTokenAccountsWithoutNfts + .find((x) => x.isSol) + ?.extensions.transferAddress?.toBase58() || + wallet?.publicKey?.toBase58(), + name: 'solRentDestination', + type: InstructionInputType.INPUT, + inputType: 'text', + }, + ] + return ( + <> + + + ) +} + +export default CloseTokenAccount diff --git a/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeAddMarketListToCategoryParams.tsx b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeAddMarketListToCategoryParams.tsx new file mode 100644 index 0000000000..73af5123b7 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeAddMarketListToCategoryParams.tsx @@ -0,0 +1,50 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React from 'react' +import { ForesightMakeAddMarketListToCategoryParams } from '@utils/uiTypes/proposalCreationTypes' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import { + governance as foresightGov, + consts, +} from '@foresight-tmp/foresight-sdk' +import { + commonAssets, + ForesightCategoryIdInput, + ForesightMarketListIdInput, +} from '@utils/Foresight' +import { PublicKey } from '@solana/web3.js' + +function MakeAddMarketListToCategoryParams({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) { + const { inputProps, effector, governedAccountSelect, wallet } = + commonAssets( + { categoryId: '', marketListId: '' }, + index, + governance + ) + async function ixCreator(form: ForesightMakeAddMarketListToCategoryParams) { + const { ix } = await foresightGov.genAddMarketListToCategoryIx( + Buffer.from(form.categoryId.padEnd(20)), + Buffer.from(form.marketListId.padEnd(20)), + new PublicKey(consts.DEVNET_PID), + wallet!.publicKey! + ) + return ix + } + effector(ixCreator) + + return ( + <> + {governedAccountSelect} + + + + ) +} + +export default MakeAddMarketListToCategoryParams diff --git a/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeAddMarketMetadataParams.tsx b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeAddMarketMetadataParams.tsx new file mode 100644 index 0000000000..33e53e1d07 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeAddMarketMetadataParams.tsx @@ -0,0 +1,63 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React from 'react' +import { ForesightMakeAddMarketMetadataParams } from '@utils/uiTypes/proposalCreationTypes' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import { + governance as foresightGov, + consts as foresightConsts, + utils, + consts, +} from '@foresight-tmp/foresight-sdk' +import { + commonAssets, + ForesightContentInput, + ForesightMarketIdInput, + ForesightMarketListIdInput, + ForesightMarketMetadataFieldSelect, +} from '@utils/Foresight' +import { PublicKey } from '@solana/web3.js' + +export default function MakeAddMarketMetadataParams({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) { + const { inputProps, effector, governedAccountSelect, wallet } = + commonAssets( + { + marketListId: '', + marketId: 0, + content: '', + field: Object.keys( + foresightConsts.MARKET_METADATA_FIELDS + )[0] as foresightConsts.MarketMetadataFieldName, + }, + index, + governance + ) + async function ixCreator(form: ForesightMakeAddMarketMetadataParams) { + const field = foresightConsts.MARKET_METADATA_FIELDS[form.field] + const { ix } = await foresightGov.genWriteToFieldMarketMetadataIx( + utils.intToArray(form.marketId, 1), + Buffer.from(form.marketListId.padEnd(20)), + form.content, + new field(), + new PublicKey(consts.DEVNET_PID), + wallet!.publicKey! + ) + return ix + } + effector(ixCreator) + return ( + <> + {governedAccountSelect} + + + + + + ) +} diff --git a/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitCategoryParams.tsx b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitCategoryParams.tsx new file mode 100644 index 0000000000..1e4a1f6b39 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitCategoryParams.tsx @@ -0,0 +1,39 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React from 'react' +import { ForesightHasCategoryId } from '@utils/uiTypes/proposalCreationTypes' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import { + governance as foresightGov, + consts as foresightConsts, +} from '@foresight-tmp/foresight-sdk' +import { commonAssets, ForesightCategoryIdInput } from '@utils/Foresight' +import { PublicKey } from '@solana/web3.js' + +const MakeInitCategoryParams = ({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) => { + const { inputProps, effector, governedAccountSelect, wallet } = + commonAssets({ categoryId: '' }, index, governance) + async function ixCreator(form: ForesightHasCategoryId) { + const { ix } = await foresightGov.genInitCategoryIx( + Buffer.from(form.categoryId.padEnd(20)), + new PublicKey(foresightConsts.DEVNET_PID), + wallet!.publicKey! + ) + return ix + } + effector(ixCreator) + return ( + <> + {governedAccountSelect} + + + ) +} + +export default MakeInitCategoryParams diff --git a/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitMarketListParams.tsx b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitMarketListParams.tsx new file mode 100644 index 0000000000..5e99783792 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitMarketListParams.tsx @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React from 'react' +import { ForesightHasMarketListId } from '@utils/uiTypes/proposalCreationTypes' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import { + governance as foresightGov, + consts, +} from '@foresight-tmp/foresight-sdk' +import { commonAssets, ForesightMarketListIdInput } from '@utils/Foresight' +import { PublicKey } from '@solana/web3.js' + +const MakeInitMarketListParams = ({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) => { + const { inputProps, effector, governedAccountSelect, wallet } = + commonAssets( + { marketListId: '' }, + index, + governance + ) + async function ixCreator(form: ForesightHasMarketListId) { + const { ix } = await foresightGov.genInitMarketListIx( + Buffer.from(form.marketListId.padEnd(20)), + new PublicKey(consts.DEVNET_PID), + wallet!.publicKey!, + form.governedAccount.extensions.transferAddress! + ) + return ix + } + effector(ixCreator) + + return ( + <> + {governedAccountSelect} + + + ) +} + +export default MakeInitMarketListParams diff --git a/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitMarketParams.tsx b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitMarketParams.tsx new file mode 100644 index 0000000000..342459e743 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeInitMarketParams.tsx @@ -0,0 +1,51 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React from 'react' +import { ForesightHasMarketId } from '@utils/uiTypes/proposalCreationTypes' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import { + governance as foresightGov, + utils, + consts, +} from '@foresight-tmp/foresight-sdk' +import { + commonAssets, + ForesightMarketIdInput, + ForesightMarketListIdInput, +} from '@utils/Foresight' +import { PublicKey } from '@solana/web3.js' + +const MakeInitMarketParams = ({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) => { + const { inputProps, effector, governedAccountSelect, wallet } = + commonAssets( + { marketListId: '', marketId: 0 }, + index, + governance + ) + async function ixCreator(form: ForesightHasMarketId) { + const { ix } = await foresightGov.genInitMarketIx( + Buffer.from(form.marketListId.padEnd(20)), + utils.intToArray(form.marketId, 1), + new PublicKey(consts.DEVNET_PID), + wallet!.publicKey! + ) + return ix + } + effector(ixCreator) + + return ( + <> + {governedAccountSelect} + + + + ) +} + +export default MakeInitMarketParams diff --git a/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeResolveMarketParams.tsx b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeResolveMarketParams.tsx new file mode 100644 index 0000000000..63028f7db1 --- /dev/null +++ b/pages/dao/[symbol]/proposal/components/instructions/Foresight/MakeResolveMarketParams.tsx @@ -0,0 +1,54 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import React from 'react' +import { ForesightMakeResolveMarketParams } from '@utils/uiTypes/proposalCreationTypes' +import { Governance } from '@solana/spl-governance' +import { ProgramAccount } from '@solana/spl-governance' +import { + governance as foresightGov, + utils, + consts, +} from '@foresight-tmp/foresight-sdk' +import { + commonAssets, + ForesightMarketIdInput, + ForesightMarketListIdInput, + ForesightWinnerInput, +} from '@utils/Foresight' +import { PublicKey } from '@solana/web3.js' + +const MakeResolveMarketParams = ({ + index, + governance, +}: { + index: number + governance: ProgramAccount | null +}) => { + const { inputProps, effector, governedAccountSelect } = + commonAssets( + { marketListId: '', marketId: 0, winner: 0 }, + index, + governance + ) + async function ixCreator(form: ForesightMakeResolveMarketParams) { + const ix = await foresightGov.genResolveMarketIx( + form.winner, + utils.intToArray(form.marketId, 1), + Buffer.from(form.marketListId.padEnd(20)), + new PublicKey(consts.DEVNET_PID), + form.governedAccount.extensions.transferAddress! + ) + return ix + } + effector(ixCreator) + + return ( + <> + {governedAccountSelect} + + + + + ) +} + +export default MakeResolveMarketParams diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeAddSpotMarket.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeAddSpotMarket.tsx index bd8df57e9e..7072a02601 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeAddSpotMarket.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeAddSpotMarket.tsx @@ -148,7 +148,7 @@ const MakeAddSpotMarket = ({ tx.add(rootBank.instruction) tx.recentBlockhash = ( - await connection.getRecentBlockhash('max') + await connection.getLatestBlockhash('max') ).blockhash const signers = [baseVault, nodeBank.account, rootBank.account] diff --git a/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeCreatePerpMarket.tsx b/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeCreatePerpMarket.tsx index 14c72141a1..b37492fc1e 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeCreatePerpMarket.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/Mango/MakeCreatePerpMarket.tsx @@ -138,7 +138,7 @@ const MakeCreatePerpMarket = ({ tx.add(makeAskAccountInstruction.instruction) tx.recentBlockhash = ( - await connection.getRecentBlockhash('max') + await connection.getLatestBlockhash('max') ).blockhash const signers = [ makeEventQueueAccountInstruction.account, @@ -238,13 +238,13 @@ const MakeCreatePerpMarket = ({ const recommendedLmSizeShift = form.maxDepthBps && - Math.floor(Math.log2((form.maxDepthBps as any) as number) - 3) + Math.floor(Math.log2(form.maxDepthBps as any as number) - 3) const recommendedMaintLeverage = - form.initLeverage && ((form.initLeverage as any) as number) * 2 + form.initLeverage && (form.initLeverage as any as number) * 2 const recommendedLiquidationFee = - form.initLeverage && 1 / (((form.initLeverage as any) as number) * 4) + form.initLeverage && 1 / ((form.initLeverage as any as number) * 4) return ( <> diff --git a/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/ConfigureCollection.tsx b/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/ConfigureCollection.tsx index e5198d6ccb..10ffe32d3f 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/ConfigureCollection.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/ConfigureCollection.tsx @@ -71,20 +71,19 @@ const ConfigureNftPluginCollection = ({ realm!.account.communityMint, nftClient!.program.programId ) - const instruction = nftClient!.program.instruction.configureCollection( - weight, - form!.size, - { - accounts: { - registrar, - realm: realm!.pubkey, - realmAuthority: realm!.account.authority!, - collection: new PublicKey(form!.collection), - maxVoterWeightRecord: maxVoterWeightRecord, - }, - } + const configureCollectionIx = await nftClient!.program.methods + .configureCollection(weight, form!.size) + .accounts({ + registrar, + realm: realm!.pubkey, + realmAuthority: realm!.account.authority!, + collection: new PublicKey(form!.collection), + maxVoterWeightRecord: maxVoterWeightRecord, + }) + .instruction() + serializedInstruction = serializeInstructionToBase64( + configureCollectionIx ) - serializedInstruction = serializeInstructionToBase64(instruction) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, diff --git a/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateMaxVoterWeightRecord.tsx b/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateMaxVoterWeightRecord.tsx index 0e9adcd8e7..918ce00205 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateMaxVoterWeightRecord.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateMaxVoterWeightRecord.tsx @@ -54,19 +54,20 @@ const CreateNftPluginMaxVoterWeightRecord = ({ realm!.account.communityMint, nftClient!.program.programId ) - const instruction = nftClient!.program.instruction.createMaxVoterWeightRecord( - { - accounts: { - maxVoterWeightRecord, - governanceProgramId: realmInfo!.programId, - realm: realm!.pubkey, - realmGoverningTokenMint: realm!.account.communityMint, - payer: wallet.publicKey!, - systemProgram: SYSTEM_PROGRAM_ID, - }, - } + const createMaxVoterWeightRecordix = await nftClient!.program.methods + .createMaxVoterWeightRecord() + .accounts({ + maxVoterWeightRecord, + governanceProgramId: realmInfo!.programId, + realm: realm!.pubkey, + realmGoverningTokenMint: realm!.account.communityMint, + payer: wallet.publicKey!, + systemProgram: SYSTEM_PROGRAM_ID, + }) + .instruction() + serializedInstruction = serializeInstructionToBase64( + createMaxVoterWeightRecordix ) - serializedInstruction = serializeInstructionToBase64(instruction) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, diff --git a/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateRegistrar.tsx b/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateRegistrar.tsx index 6c263bc617..1bc9ba3cdc 100644 --- a/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateRegistrar.tsx +++ b/pages/dao/[symbol]/proposal/components/instructions/NftVotingPlugin/CreateRegistrar.tsx @@ -52,21 +52,19 @@ const CreateNftPluginRegistrar = ({ nftClient!.program.programId ) - const instruction = nftClient!.program.instruction.createRegistrar( - form!.maxCollections, - { - accounts: { - registrar, - realm: realm!.pubkey, - governanceProgramId: realmInfo!.programId, - realmAuthority: realm!.account.authority!, - governingTokenMint: realm!.account.communityMint!, - payer: wallet.publicKey!, - systemProgram: SYSTEM_PROGRAM_ID, - }, - } - ) - serializedInstruction = serializeInstructionToBase64(instruction) + const createRegistrarIx = await nftClient!.program.methods + .createRegistrar(form!.maxCollections) + .accounts({ + registrar, + realm: realm!.pubkey, + governanceProgramId: realmInfo!.programId, + realmAuthority: realm!.account.authority!, + governingTokenMint: realm!.account.communityMint!, + payer: wallet.publicKey!, + systemProgram: SYSTEM_PROGRAM_ID, + }) + .instruction() + serializedInstruction = serializeInstructionToBase64(createRegistrarIx) } const obj: UiInstruction = { serializedInstruction: serializedInstruction, diff --git a/pages/dao/[symbol]/proposal/new.tsx b/pages/dao/[symbol]/proposal/new.tsx index 3b195ad668..8838ca1117 100644 --- a/pages/dao/[symbol]/proposal/new.tsx +++ b/pages/dao/[symbol]/proposal/new.tsx @@ -61,7 +61,15 @@ import MakeAddSpotMarket from './components/instructions/Mango/MakeAddSpotMarket import MakeChangeSpotMarket from './components/instructions/Mango/MakeChangeSpotMarket' import MakeCreatePerpMarket from './components/instructions/Mango/MakeCreatePerpMarket' import useCreateProposal from '@hooks/useCreateProposal' +import MakeInitMarketParams from './components/instructions/Foresight/MakeInitMarketParams' +import MakeInitMarketListParams from './components/instructions/Foresight/MakeInitMarketListParams' +import MakeInitCategoryParams from './components/instructions/Foresight/MakeInitCategoryParams' +import MakeResolveMarketParams from './components/instructions/Foresight/MakeResolveMarketParams' +import MakeAddMarketListToCategoryParams from './components/instructions/Foresight/MakeAddMarketListToCategoryParams' import RealmConfig from './components/instructions/RealmConfig' +import MakeAddMarketMetadataParams from './components/instructions/Foresight/MakeAddMarketMetadataParams' +import CloseTokenAccount from './components/instructions/CloseTokenAccount' +import { InstructionDataWithHoldUpTime } from 'actions/createProposal' const schema = yup.object().shape({ title: yup.string().required('Title is required'), @@ -72,9 +80,8 @@ const defaultGovernanceCtx: InstructionsContext = { governance: null, setGovernance: () => null, } -export const NewProposalContext = createContext( - defaultGovernanceCtx -) +export const NewProposalContext = + createContext(defaultGovernanceCtx) // Takes the first encountered governance account function extractGovernanceAccountFromInstructionsData( @@ -100,10 +107,8 @@ const New = () => { description: '', }) const [formErrors, setFormErrors] = useState({}) - const [ - governance, - setGovernance, - ] = useState | null>(null) + const [governance, setGovernance] = + useState | null>(null) const [isLoadingSignedProposal, setIsLoadingSignedProposal] = useState(false) const [isLoadingDraft, setIsLoadingDraft] = useState(false) const isLoading = isLoadingSignedProposal || isLoadingDraft @@ -200,20 +205,45 @@ const New = () => { handleTurnOffLoaders() throw Error('No governance selected') } - const instructionsData = instructions.map((x) => { - return { - data: x.serializedInstruction - ? getInstructionDataFromBase64(x.serializedInstruction) - : null, - holdUpTime: x.customHoldUpTime - ? getTimestampFromDays(x.customHoldUpTime) - : selectedGovernance?.account?.config.minInstructionHoldUpTime, - prerequisiteInstructions: x.prerequisiteInstructions || [], - chunkSplitByDefault: x.chunkSplitByDefault || false, - signers: x.signers, - shouldSplitIntoSeparateTxs: x.shouldSplitIntoSeparateTxs, - } - }) + + const additionalInstructions = [ + ...(instructions + .flatMap((instruction) => { + return instruction.additionalSerializedInstructions?.map((x) => { + return { + data: x ? getInstructionDataFromBase64(x) : null, + holdUpTime: instruction.customHoldUpTime + ? getTimestampFromDays(instruction.customHoldUpTime) + : selectedGovernance?.account?.config + .minInstructionHoldUpTime, + prerequisiteInstructions: [], + chunkSplitByDefault: instruction.chunkSplitByDefault || false, + signers: instruction.signers, + shouldSplitIntoSeparateTxs: + instruction.shouldSplitIntoSeparateTxs, + } + }) + }) + .filter((x) => x) as InstructionDataWithHoldUpTime[]), + ] + + const instructionsData = [ + ...additionalInstructions, + ...instructions.map((x) => { + return { + data: x.serializedInstruction + ? getInstructionDataFromBase64(x.serializedInstruction) + : null, + holdUpTime: x.customHoldUpTime + ? getTimestampFromDays(x.customHoldUpTime) + : selectedGovernance?.account?.config.minInstructionHoldUpTime, + prerequisiteInstructions: x.prerequisiteInstructions || [], + chunkSplitByDefault: x.chunkSplitByDefault || false, + signers: x.signers, + shouldSplitIntoSeparateTxs: x.shouldSplitIntoSeparateTxs, + } + }), + ] try { // Fetch governance to get up to date proposalCount @@ -248,9 +278,8 @@ const New = () => { }, [instructionsData[0].governedAccount?.pubkey]) useEffect(() => { - const governedAccount = extractGovernanceAccountFromInstructionsData( - instructionsData - ) + const governedAccount = + extractGovernanceAccountFromInstructionsData(instructionsData) setGovernance(governedAccount) }, [instructionsData]) @@ -371,12 +400,61 @@ const New = () => { governance={governance} > ) + case Instructions.ForesightInitMarket: + return ( + + ) + case Instructions.ForesightInitMarketList: + return ( + + ) + case Instructions.ForesightInitCategory: + return ( + + ) + case Instructions.ForesightResolveMarket: + return ( + + ) + case Instructions.ForesightAddMarketListToCategory: + return ( + + ) + case Instructions.ForesightAddMarketMetadata: + return ( + + ) case Instructions.RealmConfig: return case Instructions.Grant: return case Instructions.Clawback: return + case Instructions.CloseTokenAccount: + return ( + + ) default: null } @@ -448,11 +526,10 @@ const New = () => { setGovernance, }} > -

Instructions

+

Transactions

{instructionsData.map((instruction, idx) => { - const availableInstructionsForIdx = getAvailableInstructionsForIndex( - idx - ) + const availableInstructionsForIdx = + getAvailableInstructionsForIndex(idx) return (
{ ? 'Select instruction' : 'No available instructions' }`} - label={`Instruction ${idx + 1}`} + label={`Transaction ${idx + 1}`} onChange={(value) => setInstructionType({ value, idx })} value={instruction.type?.name} > @@ -506,7 +583,7 @@ const New = () => { onClick={addInstruction} > - Add instruction + Add transaction
diff --git a/pages/dao/[symbol]/token-stats/index.tsx b/pages/dao/[symbol]/token-stats/index.tsx new file mode 100644 index 0000000000..ac037b04c6 --- /dev/null +++ b/pages/dao/[symbol]/token-stats/index.tsx @@ -0,0 +1,625 @@ +import { Config, MangoClient } from '@blockworks-foundation/mango-client' +import Input from '@components/inputs/Input' +import { GrantInstruction } from '@components/instructions/programs/voteStakeRegistry' +import { MANGO_DAO_TREASURY } from '@components/instructions/tools' +import PreviousRouteBtn from '@components/PreviousRouteBtn' +import { SearchIcon, UserCircleIcon } from '@heroicons/react/outline' +import useRealm from '@hooks/useRealm' +import { BN, BorshInstructionCoder } from '@project-serum/anchor' +import { + GovernanceAccountType, + InstructionExecutionStatus, +} from '@solana/spl-governance' +import { PublicKey } from '@solana/web3.js' +import { getMintDecimalAmount } from '@tools/sdk/units' +import dayjs from 'dayjs' +import dynamic from 'next/dynamic' +import { useEffect, useRef, useState } from 'react' +import useGovernanceAssetsStore from 'stores/useGovernanceAssetsStore' +import useVotePluginsClientStore from 'stores/useVotePluginsClientStore' +import useWalletStore from 'stores/useWalletStore' +import { MANGO_MINT } from 'Strategies/protocols/mango/tools' +import { + DAYS_PER_MONTH, + SECS_PER_MONTH, +} from 'VoteStakeRegistry/tools/dateTools' +import InfoBox from 'VoteStakeRegistry/components/LockTokenStats/InfoBox' +import { AddressImage, DisplayAddress } from '@cardinal/namespaces-components' +import { LockupType } from 'VoteStakeRegistry/sdk/accounts' +import { + getMinDurationFmt, + getTimeLeftFromNowFmt, +} from 'VoteStakeRegistry/tools/dateTools' +import { + DepoistWithVoter, + DepositWithWallet, + getProposalsTransactions, +} from 'VoteStakeRegistry/components/LockTokenStats/tools' +import PaginationComponent from '@components/Pagination' +import { + ExpandableRow, + Table, + Td, + Th, + TrBody, + TrHead, +} from '@components/TableElements' +import { useRouter } from 'next/router' +const VestingVsTime = dynamic( + () => import('VoteStakeRegistry/components/LockTokenStats/VestingVsTime'), + { + ssr: false, + } +) +const isBetween = require('dayjs/plugin/isBetween') +dayjs.extend(isBetween) + +const LockTokenStats = () => { + const walletsPerPage = 10 + const pagination = useRef<{ setPage: (val) => void }>(null) + const { realmInfo, realm, symbol, mint, proposals } = useRealm() + const router = useRouter() + const vsrClient = useVotePluginsClientStore((s) => s.state.vsrClient) + const voteStakeRegistryRegistrarPk = useVotePluginsClientStore( + (s) => s.state.voteStakeRegistryRegistrarPk + ) + const voteStakeRegistryRegistrar = useVotePluginsClientStore( + (s) => s.state.voteStakeRegistryRegistrar + ) + const connection = useWalletStore((s) => s.connection) + const governedTokenAccounts = useGovernanceAssetsStore( + (s) => s.governedTokenAccounts + ) + const [search, setSearch] = useState('') + const [voters, setVoters] = useState< + { + publicKey: PublicKey + account: any + }[] + >([]) + const [depositsWithWallets, setDepositsWithWallets] = useState< + DepositWithWallet[] + >([]) + const [givenGrantsTokenAmounts, setGivenGrantsTokenAmounts] = useState< + DepoistWithVoter[] + >([]) + const [unlockedFromGrants, setUnlockedFromGrants] = useState(new BN(0)) + const [liquidityMiningEmissionPerMonth, setLiqudiityMiningEmissionPerMonth] = + useState(new BN(0)) + const [vestPerMonthStats, setVestPerMonthStats] = useState<{ + [key: string]: { vestingDate: dayjs.Dayjs; vestingAmount: BN }[] + }>({}) + const [statsMonths, setStatsMonths] = useState([]) + const [paginatedWallets, setPaginatedWallets] = useState( + [] + ) + const filteredDepositWithWallets = depositsWithWallets.filter((x) => + search ? x.wallet.toBase58().includes(search) : x + ) + const givenGrantsTokenAmount = givenGrantsTokenAmounts.reduce( + (acc, curr) => acc.add(curr.amount!), + new BN(0) + ) + const possibleGrantProposals = Object.values(proposals).filter( + (x) => + x.account.governance.toBase58() === MANGO_DAO_TREASURY && + x.account.accountType === GovernanceAccountType.ProposalV2 + ) + const currentMonthName = statsMonths.length ? statsMonths[0] : '' + const vestingThisMonth = + currentMonthName && vestPerMonthStats[currentMonthName] + ? vestPerMonthStats[currentMonthName].reduce( + (acc, val) => acc.add(val.vestingAmount), + new BN(0) + ) + : new BN(0) + const walletsCount = [ + ...new Set(depositsWithWallets.map((x) => x.wallet.toBase58())), + ].length + const mngoValut = governedTokenAccounts.find( + (x) => + x.extensions.mint?.publicKey.toBase58() === + realm?.account.communityMint.toBase58() + ) + const mngoLocked = depositsWithWallets.reduce( + (acc, curr) => acc.add(curr.deposit.amountDepositedNative), + new BN(0) + ) + const circulatingSupply = + mngoValut && mint + ? mint.supply.sub(mngoValut.extensions.amount!).sub(mngoLocked) + : new BN(0) + const mngoLockedWithClawback = depositsWithWallets + .filter((x) => x.deposit.allowClawback) + .reduce( + (acc, curr) => acc.add(curr.deposit.amountDepositedNative), + new BN(0) + ) + const calcVestingAmountsPerLastXMonths = (monthsNumber: number) => { + const depositsWithWalletsSortedByDate = [...depositsWithWallets].sort( + (x, y) => + x.deposit.lockup.startTs.toNumber() * 1000 - + y.deposit.lockup.startTs.toNumber() * 1000 + ) + const months: dayjs.Dayjs[] = [] + const vestingPerMonth = {} + const currentDate = dayjs() + const oldestDate = dayjs().subtract(monthsNumber, 'month') + for (let i = 0; i < monthsNumber; i++) { + const date = dayjs().subtract(i, 'month') + months.push(date) + vestingPerMonth[date.format('MMM')] = [] + } + for (const depositWithWallet of depositsWithWalletsSortedByDate) { + const unixLockupStart = + depositWithWallet.deposit.lockup.startTs.toNumber() * 1000 + const unixLockupEnd = + depositWithWallet.deposit.lockup.endTs.toNumber() * 1000 + const isPossibleToVest = + typeof depositWithWallet.deposit.lockup.kind.monthly !== 'undefined' && + currentDate.isAfter(unixLockupStart) && + oldestDate.isBefore(unixLockupEnd) + + if (isPossibleToVest) { + const vestingCount = Math.ceil( + dayjs(unixLockupEnd).diff(unixLockupStart, 'month', true) + ) + const vestingAmount = + depositWithWallet.deposit.amountInitiallyLockedNative.divn( + vestingCount + ) + for (let i = 1; i <= vestingCount; i++) { + const nextVestinDays = i * DAYS_PER_MONTH + const vestingDate = dayjs(unixLockupStart).add(nextVestinDays, 'day') + for (const date of months) { + if ( + //@ts-ignore + vestingDate.isBetween(date.startOf('month'), date.endOf('month')) + ) { + vestingPerMonth[date.format('MMM')] = [ + ...vestingPerMonth[date.format('MMM')], + { + vestingDate, + vestingAmount, + }, + ] + } + } + } + } + } + return { vestingPerMonth, months } + } + const fmtMangoAmount = (val) => { + const formatter = Intl.NumberFormat('en', { + notation: 'compact', + }) + return mint + ? formatter.format(getMintDecimalAmount(mint!, val).toNumber()) + : '0' + } + + useEffect(() => { + const getProposalsInstructions = async () => { + const accounts = await getProposalsTransactions( + possibleGrantProposals.map((x) => x.pubkey), + connection, + realmInfo!.programId + ) + + const givenGrantsTokenAmounts = accounts + .filter( + (x) => + x.account.executionStatus === InstructionExecutionStatus.Success + ) + .flatMap((x) => + x.account.instructions + .filter( + (x) => + x.data[0] === 145 && + x.accounts[9].pubkey.toBase58() === MANGO_MINT + ) + .map((instruction) => { + const data = new BorshInstructionCoder( + vsrClient!.program.idl + ).decode(Buffer.from(instruction.data)) + ?.data as GrantInstruction | null + + return { + voterPk: instruction.accounts[1].pubkey, + amount: data?.amount, + startTs: data?.startTs, + } + }) + ) + setGivenGrantsTokenAmounts(givenGrantsTokenAmounts) + } + if (realmInfo?.programId && vsrClient) { + getProposalsInstructions() + } + }, [possibleGrantProposals.length, realmInfo?.programId]) + useEffect(() => { + const depositsWithWalletsInner: DepositWithWallet[] = [] + for (const voter of voters) { + const deposits = voter.account.deposits.filter( + (x) => + x.isUsed && + typeof x.lockup?.kind.none === 'undefined' && + x.votingMintConfigIdx === + voteStakeRegistryRegistrar?.votingMints.findIndex( + (votingMint) => + votingMint.mint.toBase58() === + realm?.account.communityMint.toBase58() + ) + ) + for (const deposit of deposits) { + const depositWithWallet = { + voter: voter.publicKey, + wallet: voter.account.voterAuthority, + deposit: deposit, + } + depositsWithWalletsInner.push(depositWithWallet) + } + } + const depositWithWalletSorted = depositsWithWalletsInner.sort( + (a, b) => + b.deposit.amountDepositedNative.toNumber() - + a.deposit.amountDepositedNative.toNumber() + ) + setDepositsWithWallets(depositWithWalletSorted) + }, [voters.length]) + + useEffect(() => { + const getLockedDeposits = async () => { + const allVoters = await vsrClient?.program.account.voter.all() + const currentRealmVoters = + allVoters?.filter( + (x) => + x.account.registrar.toBase58() === + voteStakeRegistryRegistrarPk?.toBase58() + ) || [] + setVoters(currentRealmVoters) + } + + getLockedDeposits() + }, [ + vsrClient?.program.programId.toBase58(), + voteStakeRegistryRegistrarPk?.toBase58(), + ]) + useEffect(() => { + const { vestingPerMonth, months } = calcVestingAmountsPerLastXMonths(6) + const monthsFormat = months.map((x) => x.format('MMM')) + setVestPerMonthStats(vestingPerMonth) + setStatsMonths(monthsFormat) + }, [depositsWithWallets.length]) + useEffect(() => { + if (depositsWithWallets.length && givenGrantsTokenAmounts.length) { + const currentlyUnlocked = new BN(0) + for (const depostiWithVoter of givenGrantsTokenAmounts) { + const grantDeposit = depositsWithWallets.find((x) => { + return ( + x.deposit.amountInitiallyLockedNative.cmp( + depostiWithVoter.amount! + ) === 0 && + x.deposit.lockup.startTs.cmp(depostiWithVoter.startTs!) === 0 && + x.voter.toBase58() === depostiWithVoter.voterPk.toBase58() + ) + }) + if (grantDeposit) { + currentlyUnlocked.iadd( + grantDeposit.deposit.amountInitiallyLockedNative.sub( + grantDeposit.deposit.amountDepositedNative + ) + ) + } else { + currentlyUnlocked.iadd(depostiWithVoter.amount!) + } + } + setUnlockedFromGrants(currentlyUnlocked) + } + }, [depositsWithWallets.length, givenGrantsTokenAmounts.length]) + useEffect(() => { + const mngoPerpMarket = async () => { + const GROUP = connection.cluster === 'devnet' ? 'devnet.2' : 'mainnet.1' + const groupConfig = Config.ids().getGroupWithName(GROUP)! + const client = new MangoClient( + connection.current, + groupConfig.mangoProgramId + ) + const group = await client.getMangoGroup(groupConfig.publicKey) + const perpMarkets = await Promise.all([ + ...groupConfig!.perpMarkets.map((x) => + group.loadPerpMarket( + connection.current, + x.marketIndex, + x.baseDecimals, + x.quoteDecimals + ) + ), + ]) + + const emissionPerMonth = perpMarkets + .reduce( + (acc, next) => acc.iadd(next.liquidityMiningInfo.mngoPerPeriod), + new BN(0) + ) + .muln(SECS_PER_MONTH) + .div(perpMarkets[0].liquidityMiningInfo.targetPeriodLength) + setLiqudiityMiningEmissionPerMonth(emissionPerMonth) + } + mngoPerpMarket() + }, [connection.cluster]) + useEffect(() => { + setPaginatedWallets(paginateWallets(0)) + pagination?.current?.setPage(0) + }, [JSON.stringify(filteredDepositWithWallets)]) + const onPageChange = (page) => { + setPaginatedWallets(paginateWallets(page)) + } + const paginateWallets = (page) => { + return filteredDepositWithWallets.slice( + page * walletsPerPage, + (page + 1) * walletsPerPage + ) + } + + useEffect(() => { + if (symbol && symbol !== 'MNGO') { + router.push(`/dao/${symbol}`, undefined, { shallow: true }) + } + }, [symbol]) + + const renderAddressName = (wallet) => { + return ( + + ) + } + const renderAddressImage = (wallet) => ( + } + /> + ) + + return ( +
+
+
+
+ +
+
+ {realmInfo?.ogImage ? ( + + ) : null} +

{symbol} Stats

+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+

Vesting and Grants

+
+
+
+ + + +
+
+
+
+

MNGO Vesting vs. Time

+
+ { + return { + month: x, + amount: vestPerMonthStats[x] + .reduce((acc, curr) => { + return acc.add(curr.vestingAmount) + }, new BN(0)) + .toNumber(), + } + }), + ].reverse()} + fmtMangoAmount={fmtMangoAmount} + > +
+
+
+
+
+

+ Members with Locked MNGO{' '} + + ({walletsCount}) + +

+
+ { + return setSearch(e.target.value) + }} + prefix={} + /> +
+
+
+ + + + + + + + + + + {paginatedWallets.map((x, index) => { + const fmtMangoAmount = (val) => { + return mint + ? getMintDecimalAmount(mint!, val).toFormat(0) + : '0' + } + const type = Object.keys( + x.deposit.lockup.kind + )[0] as LockupType + const typeName = type !== 'monthly' ? type : 'Vested' + const isConstant = type === 'constant' + const lockedTokens = fmtMangoAmount( + x.deposit.amountDepositedNative + ) + return ( + + + + + + + ) + })} + +
AddressLock TypeDurationAmount (MNGO)
+
+
+ {renderAddressImage(x.wallet)} +
{' '} + {renderAddressName(x.wallet)} +
+
+ {typeName.charAt(0).toUpperCase() + typeName.slice(1)} + + {isConstant + ? getMinDurationFmt(x.deposit as any) + : getTimeLeftFromNowFmt(x.deposit as any)} + {lockedTokens}
+
+
+
+
Address
+
Amount
+
+ {paginatedWallets.map((x, index) => { + const fmtMangoAmount = (val) => { + return mint ? getMintDecimalAmount(mint!, val).toFormat(0) : '0' + } + const type = Object.keys(x.deposit.lockup.kind)[0] as LockupType + const typeName = type !== 'monthly' ? type : 'Vested' + const isConstant = type === 'constant' + const lockedTokens = fmtMangoAmount( + x.deposit.amountDepositedNative + ) + return ( + +
+
+ {renderAddressImage(x.wallet)} +
+ {renderAddressName(x.wallet)} +
+ {lockedTokens} +
+ } + key={`${x.deposit}${index}`} + panelTemplate={ +
+
+
+ Lock Type +
+
+ {typeName.charAt(0).toUpperCase() + typeName.slice(1)} +
+
+
+
+ Duration +
+
+ {isConstant + ? getMinDurationFmt(x.deposit as any) + : getTimeLeftFromNowFmt(x.deposit as any)} +
+
+
+ } + /> + ) + })} +
+ +
+
+
+ ) +} + +export default LockTokenStats diff --git a/pages/dao/[symbol]/treasury/index.tsx b/pages/dao/[symbol]/treasury/index.tsx index 0dff0653ed..e238ebf36c 100644 --- a/pages/dao/[symbol]/treasury/index.tsx +++ b/pages/dao/[symbol]/treasury/index.tsx @@ -22,7 +22,8 @@ export const NEW_TREASURY_ROUTE = `/treasury/new` const Treasury = () => { const { getStrategies } = useStrategiesStore() - const { governedTokenAccountsWithoutNfts } = useGovernanceAssets() + const { governedTokenAccountsWithoutNfts, auxiliaryTokenAccounts } = + useGovernanceAssets() const { setCurrentAccount } = useTreasuryAccountStore() const connection = useWalletStore((s) => s.connection) const { @@ -57,7 +58,16 @@ const Treasury = () => { (x) => x.extensions.transferAddress ) ) { - setTreasuryAccounts(governedTokenAccountsWithoutNfts) + const accounts = [ + ...governedTokenAccountsWithoutNfts, + ...auxiliaryTokenAccounts, + ] + const accountsSorted = accounts.sort((a, b) => { + const infoA = getTreasuryAccountItemInfoV2(a) + const infoB = getTreasuryAccountItemInfoV2(b) + return infoB.totalPrice - infoA.totalPrice + }) + setTreasuryAccounts(accountsSorted) } } prepTreasuryAccounts() diff --git a/pages/realms/components/RealmsDashboard.tsx b/pages/realms/components/RealmsDashboard.tsx index 38b6b09895..5e8aa4b5fd 100644 --- a/pages/realms/components/RealmsDashboard.tsx +++ b/pages/realms/components/RealmsDashboard.tsx @@ -24,13 +24,15 @@ export default function RealmsDashboard({ router.push(url) } - const certifiedRealms = useMemo(() => realms?.filter((r) => r.isCertified), [ - realms, - ]) + const certifiedRealms = useMemo( + () => realms?.filter((r) => r.isCertified), + [realms] + ) - const unchartedRealms = useMemo(() => realms?.filter((r) => !r.isCertified), [ - realms, - ]) + const unchartedRealms = useMemo( + () => realms?.filter((r) => !r.isCertified), + [realms] + ) return isLoading ? (
@@ -52,7 +54,7 @@ export default function RealmsDashboard({ certifiedRealms.map((realm: RealmInfo) => (
goToRealm(realm)} - className="bg-bkg-2 cursor-pointer default-transition flex flex-col items-center p-8 rounded-lg hover:bg-bkg-3" + className="bg-bkg-2 cursor-pointer default-transition flex flex-col items-center justify-center p-8 rounded-lg hover:bg-bkg-3" key={realm.realmId.toString()} >
@@ -96,7 +98,7 @@ export default function RealmsDashboard({ unchartedRealms.map((realm: RealmInfo) => (
goToRealm(realm)} - className="bg-bkg-2 cursor-pointer default-transition flex flex-col items-center p-8 rounded-lg hover:bg-bkg-3" + className="bg-bkg-2 cursor-pointer default-transition flex flex-col items-center justify-center p-8 rounded-lg hover:bg-bkg-3" key={realm.realmId.toString()} >
diff --git a/public/realms/EverSol/img/EverSol_Logo.jpg b/public/realms/EverSol/img/EverSol_Logo.jpg deleted file mode 100644 index f30527d9cb..0000000000 Binary files a/public/realms/EverSol/img/EverSol_Logo.jpg and /dev/null differ diff --git a/public/realms/EverSol/img/EverSol_Logo.png b/public/realms/EverSol/img/EverSol_Logo.png new file mode 100644 index 0000000000..37e87ff450 Binary files /dev/null and b/public/realms/EverSol/img/EverSol_Logo.png differ diff --git a/public/realms/FyfyDAO/img/logo.png b/public/realms/FyfyDAO/img/logo.png new file mode 100644 index 0000000000..ebdceec9e6 Binary files /dev/null and b/public/realms/FyfyDAO/img/logo.png differ diff --git a/public/realms/NFTClubBerlin/img/logo.png b/public/realms/NFTClubBerlin/img/logo.png new file mode 100644 index 0000000000..01a2e9fdfc Binary files /dev/null and b/public/realms/NFTClubBerlin/img/logo.png differ diff --git a/public/realms/NFTOFFROADFANCLUB/img/logo.png b/public/realms/NFTOFFROADFANCLUB/img/logo.png new file mode 100644 index 0000000000..673356459f Binary files /dev/null and b/public/realms/NFTOFFROADFANCLUB/img/logo.png differ diff --git a/public/realms/RAIN/img/rain_logo.png b/public/realms/RAIN/img/rain_logo.png new file mode 100644 index 0000000000..539cce17ec Binary files /dev/null and b/public/realms/RAIN/img/rain_logo.png differ diff --git a/public/realms/StreamDAO/img/stream_dao.png b/public/realms/StreamDAO/img/stream_dao.png new file mode 100644 index 0000000000..92b101aba3 Binary files /dev/null and b/public/realms/StreamDAO/img/stream_dao.png differ diff --git a/public/realms/TheSporagers/img/the_sporagers_banner.jpeg b/public/realms/TheSporagers/img/the_sporagers_banner.jpeg new file mode 100644 index 0000000000..13d569b916 Binary files /dev/null and b/public/realms/TheSporagers/img/the_sporagers_banner.jpeg differ diff --git a/public/realms/devnet.json b/public/realms/devnet.json index 7b7fa120bc..9f948c7b92 100644 --- a/public/realms/devnet.json +++ b/public/realms/devnet.json @@ -125,5 +125,41 @@ "ogImage": "https://media.discordapp.net/attachments/933224453326909490/952347955157950504/alpha-illuminati-logo.png", "website": "https://www.alphailluminati.xyz", "twitter": "@illuminatialpha" + }, + { + "symbol": "LEO", + "displayName": "LeoDaoNewYorkCity _ DEMO", + "programId": "GTesTBiEWE32WHXXE2S4XbZvA5CrEc4xs6ZgRe895dP", + "realmId": "hno4ciEEAB6P7MWkX7xWZx1RkpZqxRBJKveDg4YWoRP", + "ogImage": "https://images.squarespace-cdn.com/content/v1/5f09de13169cec7a4b6c23ac/3dd28380-4a26-40cf-b18c-684d73492feb/LeoDao.jpg", + "website": "https://leodaonyc.xyz", + "twitter": "@LeoDAONYC" + }, + { + "symbol": "FSHR", + "displayName": "Fashers", + "programId": "GTesTBiEWE32WHXXE2S4XbZvA5CrEc4xs6ZgRe895dP", + "realmId": "GwqCXifatWJvikdjkkPPsRn1RW8XGYLW8p4xwWzQ66gi", + "ogImage": "https://avatars.githubusercontent.com/u/46954203?s=400&u=6c777850a155eeb75586049e7c91dc2baeb97dd1&v=4", + "website": "https://fashers.xyz", + "twitter": "@Fashers" + }, + { + "symbol": "SquatchDAO", + "displayName": "SquatchDAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "5DqXtnSqxUukgQ8ZJQhTEdF7y3cu3zQuBpREC1g3bNjf", + "ogImage": "https://raw.githubusercontent.com/Exonft/SquatchDAO/main/SquatchDAO.jpg", + "website": "www.squatchdao.com", + "twitter": "@Squatch_DAO" + }, + { + "symbol": "FORE", + "displayName": "Foresight DAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "HymmUoabLo1sB8nTENxSFz1bAmobMJyGQoXqyXZ9FySB", + "ogImage": "https://www.foresight.exchange/logo.png", + "website": "https://www.foresight.exchange/", + "twitter": "@foresightmkt" } -] \ No newline at end of file +] diff --git a/public/realms/mainnet-beta.json b/public/realms/mainnet-beta.json index b35f9fbd24..f5384cc9c2 100644 --- a/public/realms/mainnet-beta.json +++ b/public/realms/mainnet-beta.json @@ -6,7 +6,26 @@ "realmId": "5piGF94RbCqaogoFFWA9cYmt29qUpQejGCEjRKuwCz7d", "bannerImage": "/realms/Ukraine/img/Flag_of_Ukraine.svg", "ogImage": "/realms/Ukraine/img/Ukraine_Logo.png", - "sharedWalletId": "66pJhhESDjdeBBDdkKmxYYd7q6GUggYPWjxpMKNX39KV" + "sharedWalletId": "66pJhhESDjdeBBDdkKmxYYd7q6GUggYPWjxpMKNX39KV", + "sortRank":3 + }, + { + "symbol": "MNGO", + "displayName": "Mango DAO", + "programId": "GqTPL6qRf5aUuqscLh8Rg2HTxPUXfhhAXDptTLhp1t2J", + "realmId": "DPiH3H3c7t47BMxqTxLsuPQpEC6Kne8GA9VXbxpnZxFE", + "website": "https://mango.markets", + "keywords": "Mango Markets, REALM, Governance, Serum, SRM, Serum DEX, DEFI, Decentralized Finance, Decentralised Finance, Crypto, ERC20, Ethereum, Decentralize, Solana, SOL, SPL, Cross-Chain, Trading, Fastest, Fast, SerumBTC, SerumUSD, SRM Tokens, SPL Tokens", + "twitter": "@mangomarkets", + "ogImage": "https://trade.mango.markets/assets/icons/logo.svg", + "sortRank":3 + }, + { + "symbol": "DTP", + "displayName": "The Imperium of Rain", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "6orGiJYGXYk9GT2NFoTv2ZMYpA6asMieAqdek4YRH2Dn", + "ogImage": "/realms/RAIN/img/rain_logo.png" }, { "symbol": "UkraineUnchained", @@ -20,15 +39,33 @@ "sharedWalletId": "BnBe9uwucnLWpKqzgtvGU2aURRXezcqEVCoL8L6CeDgF" }, { - "symbol": "MNGO", - "displayName": "Mango DAO", - "programId": "GqTPL6qRf5aUuqscLh8Rg2HTxPUXfhhAXDptTLhp1t2J", - "realmId": "DPiH3H3c7t47BMxqTxLsuPQpEC6Kne8GA9VXbxpnZxFE", + "symbol": "MangoLiquidityDAO", + "displayName": "Mango Liquidity DAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "DnWHRVRbA2XGwWth2da7iF3Q81cqRHhqJXSPS8J3G6fo", "website": "https://mango.markets", "keywords": "Mango Markets, REALM, Governance, Serum, SRM, Serum DEX, DEFI, Decentralized Finance, Decentralised Finance, Crypto, ERC20, Ethereum, Decentralize, Solana, SOL, SPL, Cross-Chain, Trading, Fastest, Fast, SerumBTC, SerumUSD, SRM Tokens, SPL Tokens", "twitter": "@mangomarkets", "ogImage": "https://trade.mango.markets/assets/icons/logo.svg" }, + { + "symbol": "ORCA", + "displayName": "Orca DAO", + "programId": "J9uWvULFL47gtCPvgR3oN7W357iehn5WF2Vn9MJvcSxz", + "realmId": "66Du7mXgS2KMQBUk6m9h3TszMjqZqdWhsG3Duuf69VNW", + "website": "https://www.orca.so/", + "twitter": "@orca_so", + "ogImage": "https://learn.orca.so/static/media/logomark.1ef55f8f.svg" + }, + { + "symbol": "JET", + "displayName": "Jet DAO", + "programId": "JPGov2SBA6f7XSJF5R4Si5jEJekGiyrwP2m7gSEqLUs", + "realmId": "78TbURwqF71Qk4w1Xp6Jd2gaoQb6EC7yKBh5xDJmq6qh", + "website": "https://www.jetassociation.org/", + "twitter": "@jet_association", + "ogImage": "https://govern.jetassociation.org/img/jet_assoc/assoc_turbine.jpg" + }, { "symbol": "The Sporagers", "displayName": "The Sporagers", @@ -36,7 +73,17 @@ "realmId": "896vmJYkitEGhnBnRo8XxywUJu2qtgxidR9HXm5kjwrM", "website": "https://www.thesporagers.io", "twitter": "@TheSporagers", - "ogImage": "/realms/TheSporagers/img/the_sporagers.png" + "ogImage": "/realms/TheSporagers/img/the_sporagers.png", + "bannerImage": "/realms/TheSporagers/img/the_sporagers_banner.jpeg" + }, + { + "symbol": "NFT Club Berlin", + "displayName": "NFT Club Berlin", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "E5DCxoF2vjzFeaDBi9kfFDZVoxrpe6nRFfKtm1J8Qdq7", + "ogImage": "/realms/NFTClubBerlin/img/logo.png", + "website": "http://nftclub.berlin", + "twitter": "@NFTClubBerlin" }, { "symbol": "POOR", @@ -200,7 +247,8 @@ "realmId": "By2sVGZXwfQq6rAiAM3rNPJ9iQfb5e2QhnF4YjJ4Bip", "ogImage": "/realms/Grape/img/grape.png", "website": "https://grapes.network/", - "twitter": "@grapeprotocol" + "twitter": "@grapeprotocol", + "sortRank":3 }, { "symbol": "MonkeDAO", @@ -299,6 +347,15 @@ "website": "https://woofsolana.io/", "twitter": "@WoofSolana" }, + { + "symbol": "NFTOFFROADFC", + "displayName": "NFT OFF ROAD FAN CLUB DAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "6NaoicaQtUCgEqUuniSzpsKYN9DRaSeGa3Ludk5Mxb18", + "ogImage": "/realms/NFTOFFROADFANCLUB/img/logo.png", + "website": "https://nftoffroadfan.club/", + "twitter": "@NFT_Off_Road_FC" + }, { "symbol": "GoblinGold", "displayName": "GoblinGold", @@ -578,11 +635,11 @@ }, { "symbol": "EVS", - "displayName": "EverSOL", + "displayName": "Eversol DAO", "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", "realmId": "7pX17rs38WKHVw5mpJNBCjGXRz5eZsPj5QHAEZv1Zu4d", "bannerImage": "/realms/EverSol/img/EverSol_Banner.jpg", - "ogImage": "/realms/EverSol/img/EverSol_Logo.jpg", + "ogImage": "/realms/EverSol/img/EverSol_Logo.png", "website": "https://eversol.one/", "twitter": "@eversol_pool" }, @@ -595,5 +652,50 @@ "keywords": "Fine Art, Provenance, ALLOVR, Token Economy, Artist, Art, Decentralized Art Network", "twitter": "@allovr_protocol", "ogImage": "https://raw.githubusercontent.com/ALLOVRStudios/ovr-program/main/img/logo.png" + }, + { + "symbol": "CARROT", + "displayName": "CARROT DAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "794Cz2u7BqcqjuQBB87E8Jg8rdtG46pBodrh5sJLMJdz", + "ogImage": "https://raw.githubusercontent.com/cmgonsalves/token/main/carrot-logo.png", + "website": "https://www.begrudgedbunnies.com/", + "twitter": "@begrudgeddao" + }, + { + "symbol": "STR", + "displayName": "StreamDAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "FUjE8nZ9WLch6bYMfxd2ybyfzw19odi6Yfnio9Dc2v2V", + "ogImage": "/realms/StreamDAO/img/stream_dao.png", + "website": "https://www.streamdao.org/", + "twitter": "@dao_stream" + }, + { + "symbol": "Fyfy", + "displayName": "FyfyDAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "4kofKQxGvnq5nXumXJaqPnPoHfmZxgH2YUqpxGWYjZ5c", + "ogImage": "/realms/FyfyDAO/img/logo.png", + "website": "https://www.fyfy.io/", + "twitter": "@fyfyio" + }, + { + "symbol": "LoS", + "displayName": "Legion of Sol", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "8PqcJBBsZRMHQwMYrP6wx7BFrX4TNpBTWTVegGDNiFEJ", + "ogImage": "https://raw.githubusercontent.com/SolStonez/Legion-Key-Logo/main/demon_logo.png", + "website": "https://www.legionofsol.io/", + "twitter": "@legion_of_sol" + }, + { + "symbol": "SquatchDAO", + "displayName": "SquatchDAO", + "programId": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw", + "realmId": "5DqXtnSqxUukgQ8ZJQhTEdF7y3cu3zQuBpREC1g3bNjf", + "ogImage": "https://raw.githubusercontent.com/Exonft/SquatchDAO/main/SquatchDAO.jpg", + "website": "www.squatchdao.com", + "twitter": "@Squatch_DAO" } -] \ No newline at end of file +] diff --git a/stores/useGovernanceAssetsStore.tsx b/stores/useGovernanceAssetsStore.tsx index bd381c80ba..545c9af6a5 100644 --- a/stores/useGovernanceAssetsStore.tsx +++ b/stores/useGovernanceAssetsStore.tsx @@ -8,6 +8,7 @@ import { } from '@solana/spl-governance' import { ProgramAccount } from '@solana/spl-governance' import { + AUXILIARY_TOKEN_ACCOUNTS, DEFAULT_NATIVE_SOL_MINT, DEFAULT_NFT_TREASURY_MINT, HIDDEN_GOVERNANCES, @@ -21,7 +22,7 @@ import { parseTokenAccountData, TokenProgramAccount, } from '@utils/tokens' -import { Connection, ParsedAccountData, PublicKey } from '@solana/web3.js' +import { ParsedAccountData, PublicKey } from '@solana/web3.js' import { AccountInfo, MintInfo } from '@solana/spl-token' import { AccountInfo as AccountInfoGeneric } from '@solana/web3.js' import { TokenAccountLayout } from '@blockworks-foundation/mango-client' @@ -30,6 +31,7 @@ import { ConnectionContext } from '@utils/connection' import axios from 'axios' import { AccountType, + AccountTypeAuxiliaryToken, AccountTypeMint, AccountTypeNFT, AccountTypeProgram, @@ -118,7 +120,7 @@ const useGovernanceAssetsStore = create((set, _get) => ({ (x) => x.pubkey.toBase58() === governancePk.toBase58() ) const previousAccounts = _get().assetAccounts.filter( - (x) => x.governance.pubkey.toBase58() !== governancePk.toBase58() + (x) => x.governance?.pubkey.toBase58() !== governancePk.toBase58() ) const accounts = await getAccountsForGovernances( connection, @@ -135,7 +137,7 @@ const useGovernanceAssetsStore = create((set, _get) => ({ x.type === AccountType.NFT || x.type === AccountType.SOL ), - ] + ].filter(filterOutHiddenAccs) s.assetAccounts = [...previousAccounts, ...accounts].filter( filterOutHiddenAccs ) @@ -144,27 +146,17 @@ const useGovernanceAssetsStore = create((set, _get) => ({ })) export default useGovernanceAssetsStore -const getAccountsByOwner = ( - connection: Connection, - programId: PublicKey, - owner: PublicKey -) => { - return connection.getTokenAccountsByOwner(owner, { - programId: programId, - }) -} - -const getTokenAccountsObj = async ( +const getTokenAccountObj = async ( governance: ProgramAccount, tokenAccount: TokenProgramAccount, mintAccounts: TokenProgramAccount[] ) => { - const isNft = + const isNftAccount = tokenAccount.account.mint.toBase58() === DEFAULT_NFT_TREASURY_MINT const mint = mintAccounts.find( (x) => x.publicKey.toBase58() === tokenAccount.account.mint.toBase58() ) - if (isNft) { + if (isNftAccount) { return new AccountTypeNFT(tokenAccount, mint!, governance) } @@ -177,20 +169,20 @@ const getTokenAccountsObj = async ( } } -const getSolAccounts = async ( +const getSolAccountsObj = async ( connection: ConnectionContext, accounts: AssetAccount[], - solAccounts: SolAccInfo[], + solAccountsInfo: SolAccInfo[], mintAccounts: TokenProgramAccount[], governances: ProgramAccount[] ) => { const solAccs: AccountTypeSol[] = [] - for (const i of solAccounts) { + for (const i of solAccountsInfo) { const mint = mintAccounts.find((x) => x.publicKey.toBase58() === WSOL_MINT) const governance = governances.find( (x) => x.pubkey.toBase58() === i.governancePk.toBase58() ) - const account = await getSolAccount( + const account = await getSolAccountObj( governance!, connection, mint!, @@ -214,11 +206,13 @@ const getTokenAssetAccounts = async ( connection: ConnectionContext ) => { const accounts: AssetAccount[] = [] - const mintAccounts = tokenAccounts.length - ? await getMintAccountsInfo(connection, [ - ...tokenAccounts.map((x) => x.account.mint), - new PublicKey(WSOL_MINT), - ]) + const mintsPks = [...tokenAccounts.map((x) => x.account.mint)] + //WSOL is used as mint for sol accounts to calculate amounts + if (!mintsPks.find((x) => x.toBase58() === WSOL_MINT)) { + mintsPks.push(new PublicKey(WSOL_MINT)) + } + const mintAccounts = mintsPks.length + ? await getMintAccountsInfo(connection, [...mintsPks]) : [] const nativeSolAddresses = await Promise.all( governances.map((x) => getNativeTreasuryAddress(realm.owner, x!.pubkey)) @@ -234,16 +228,30 @@ const getTokenAssetAccounts = async ( const governance = governances.find( (x) => x.pubkey.toBase58() === tokenAccount.account.owner.toBase58() ) - const account = await getTokenAccountsObj( - governance!, - tokenAccount, - mintAccounts - ) - if (account) { - accounts.push(account) + if (governance) { + const account = await getTokenAccountObj( + governance!, + tokenAccount, + mintAccounts + ) + if (account) { + accounts.push(account) + } + } else if ( + [...Object.values(AUXILIARY_TOKEN_ACCOUNTS).flatMap((x) => x)].find((x) => + x.accounts.includes(tokenAccount.publicKey.toBase58()) + ) + ) { + const mint = mintAccounts.find( + (x) => x.publicKey.toBase58() === tokenAccount.account.mint.toBase58() + ) + const account = new AccountTypeAuxiliaryToken(tokenAccount, mint) + if (account) { + accounts.push(account) + } } } - const solAccounts = await getSolAccounts( + const solAccounts = await getSolAccountsObj( connection, accounts, solAccs, @@ -301,7 +309,7 @@ const getGovernancesByAccountTypes = ( return governancesFiltered } -const getSolAccount = async ( +const getSolAccountObj = async ( governance: ProgramAccount, connection: ConnectionContext, mint: TokenProgramAccount, @@ -309,37 +317,39 @@ const getSolAccount = async ( solAcc: SolAccInfo ) => { if (solAcc.acc) { - const accountsByOwnerResp = await getAccountsByOwner( - connection.current, - TOKEN_PROGRAM_ID, - solAcc.nativeSolAddress - ) - const accountsOwnedBySolAccount = accountsByOwnerResp.value.map((x) => { - const publicKey = x.pubkey - const data = Buffer.from(x.account.data) - const account = parseTokenAccountData(publicKey, data) - return { publicKey, account } - }) + const tokenAccountsOwnedBySolAccountInfo = + await connection.current.getTokenAccountsByOwner( + solAcc.nativeSolAddress, + { + programId: TOKEN_PROGRAM_ID, + } + ) + const tokenAccountsOwnedBySolAccounts = + tokenAccountsOwnedBySolAccountInfo.value.map((x) => { + const publicKey = x.pubkey + const data = Buffer.from(x.account.data) + const account = parseTokenAccountData(publicKey, data) + return { publicKey, account } + }) - const mintAccounts = accountsOwnedBySolAccount.length + const mintAccounts = tokenAccountsOwnedBySolAccounts.length ? await getMintAccountsInfo( connection, - accountsOwnedBySolAccount.map((x) => x.account.mint) + tokenAccountsOwnedBySolAccounts.map((x) => x.account.mint) ) : [] - for (const acc of accountsOwnedBySolAccount) { - const account = await getTokenAccountsObj(governance, acc, mintAccounts) + for (const acc of tokenAccountsOwnedBySolAccounts) { + const account = await getTokenAccountObj(governance, acc, mintAccounts) if (account) { accounts.push(account) } } - const mintRentAmount = await connection.current.getMinimumBalanceForRentExemption( - 0 - ) + const minRentAmount = + await connection.current.getMinimumBalanceForRentExemption(0) const solAccount = solAcc.acc as AccountInfoGen solAccount.lamports = solAccount.lamports !== 0 - ? solAccount.lamports - mintRentAmount + ? solAccount.lamports - minRentAmount : solAccount.lamports return new AccountTypeSol( @@ -370,7 +380,11 @@ const getAccountsForGovernances = async ( ) const mintAccounts = getMintAccounts(mintGovernances, mintGovernancesMintInfo) const programAccounts = getProgramAssetAccounts(programGovernances) - const getOwnedTokenAccounts = await axios.request({ + const auxliaryTokenAccounts = AUXILIARY_TOKEN_ACCOUNTS[realm.account.name] + ?.length + ? AUXILIARY_TOKEN_ACCOUNTS[realm.account.name] + : [] + const ownedByGovernancesTokenAccounts = await axios.request({ url: connection.endpoint, method: 'POST', headers: { @@ -402,21 +416,54 @@ const getAccountsForGovernances = async ( ], } }), + ...auxliaryTokenAccounts.map((x) => { + return { + jsonrpc: '2.0', + id: x.owner, + method: 'getProgramAccounts', + params: [ + TOKEN_PROGRAM_ID.toBase58(), + { + commitment: connection.current.commitment, + encoding: 'base64', + filters: [ + { + dataSize: TokenAccountLayout.span, // number of bytes + }, + { + memcmp: { + offset: tokenAccountOwnerOffset, // number of bytes + bytes: x.owner, // base58 encoded string + }, + }, + ], + }, + ], + } + }), ]), }) - const tokenAccountsJson = getOwnedTokenAccounts.data - const tokenAccounts = tokenAccountsJson.length - ? tokenAccountsJson - .flatMap((x) => x.result) - .map((x) => { - const publicKey = new PublicKey(x.pubkey) - const data = Buffer.from(x.account.data[0], 'base64') - const account = parseTokenAccountData(publicKey, data) - return { publicKey, account } - }) + const tokenAccountsJson = ownedByGovernancesTokenAccounts.data.map((x) => { + const auxiliaryMatch = auxliaryTokenAccounts.find( + (auxAcc) => auxAcc.owner === x.id + ) + if (auxiliaryMatch) { + x.result = x.result?.filter((x) => + auxiliaryMatch.accounts.includes(x.pubkey) + ) + } + return x + }) + const tokenAccountsParsed = tokenAccountsJson.length + ? [...tokenAccountsJson.flatMap((x) => x.result)].map((x) => { + const publicKey = new PublicKey(x.pubkey) + const data = Buffer.from(x.account.data[0], 'base64') + const account = parseTokenAccountData(publicKey, data) + return { publicKey, account } + }) : [] const tokenAssetAccounts = await getTokenAssetAccounts( - tokenAccounts, + tokenAccountsParsed, governancesArray, realm, connection @@ -434,7 +481,7 @@ const getMintAccountsInfo = async ( connection: ConnectionContext, pubkeys: PublicKey[] ) => { - const getMintsAccounts = await axios.request({ + const mintAccountsInfo = await axios.request({ url: connection.endpoint, method: 'POST', headers: { @@ -457,22 +504,22 @@ const getMintAccountsInfo = async ( }), ]), }) - const mintAccountsJson = getMintsAccounts.data - const mintAccounts = mintAccountsJson?.map((x) => { + const mintAccountsJson = mintAccountsInfo.data + const mintAccountsParsed = mintAccountsJson?.map((x) => { const result = x.result const publicKey = new PublicKey(x.id) const data = Buffer.from(result.value.data[0], 'base64') const account = parseMintAccountData(data) return { publicKey, account } }) - return mintAccounts + return mintAccountsParsed } const getSolAccountsInfo = async ( connection: ConnectionContext, pubkeys: { governancePk: PublicKey; nativeSolAddress: PublicKey }[] ) => { - const getSolAccounts = await axios.request({ + const solAccountsInfo = await axios.request({ url: connection.endpoint, method: 'POST', headers: { @@ -495,9 +542,9 @@ const getSolAccountsInfo = async ( }), ]), }) - const solAccounts = getSolAccounts.data - const accounts = solAccounts?.length - ? solAccounts + const solAccountsJson = solAccountsInfo.data + const solAccountsParsed = solAccountsJson?.length + ? solAccountsJson .flatMap((x, index) => { return { acc: x.result.value, @@ -506,10 +553,13 @@ const getSolAccountsInfo = async ( }) .filter((x) => x.acc) : [] - return accounts as SolAccInfo[] + return solAccountsParsed as SolAccInfo[] } -const filterOutHiddenAccs = (x) => { +const filterOutHiddenAccs = (x: AssetAccount) => { const pubkey = typeof x.pubkey === 'string' ? x.pubkey : x.pubkey.toBase58() - return HIDDEN_TREASURES.findIndex((x) => x === pubkey) === -1 + return ( + HIDDEN_TREASURES.findIndex((x) => x === pubkey) === -1 && + (!x.extensions.token || !x.extensions.token?.account.isFrozen) + ) } diff --git a/stores/useTreasuryAccountStore.tsx b/stores/useTreasuryAccountStore.tsx index e10e46b3de..aa21dc19b1 100644 --- a/stores/useTreasuryAccountStore.tsx +++ b/stores/useTreasuryAccountStore.tsx @@ -7,17 +7,8 @@ import { NFTWithMint } from '@utils/uiTypes/nfts' import { Connection } from '@solana/web3.js' import { TokenInfo } from '@solana/spl-token-registry' import { WSOL_MINT } from '@components/instructions/tools' -import { MintInfo } from '@solana/spl-token' -import { TokenAccountWithKey } from '@utils/deserializeTokenAccount' import { AccountType, AssetAccount } from '@utils/uiTypes/assets' -type TokenAccountWithListInfo = TokenAccountWithKey & { - tokenInfo?: TokenInfo -} -export type TokenInfoWithMint = TokenAccountWithListInfo & { - mintInfo: MintInfo -} - interface TreasuryAccountStore extends State { currentAccount: AssetAccount | null mintAddress: string @@ -25,7 +16,6 @@ interface TreasuryAccountStore extends State { recentActivity: ConfirmedSignatureInfo[] allNfts: NFTWithMint[] - allTokenAccounts: TokenInfoWithMint[] governanceNfts: { [governance: string]: NFTWithMint[] } @@ -46,7 +36,6 @@ const useTreasuryAccountStore = create((set, _get) => ({ tokenInfo: undefined, recentActivity: [], allNfts: [], - allTokenAccounts: [], governanceNfts: {}, isLoadingNfts: false, isLoadingRecentActivity: false, @@ -56,7 +45,7 @@ const useTreasuryAccountStore = create((set, _get) => ({ s.isLoadingNfts = true }) let realmNfts: NFTWithMint[] = [] - const governanceNfts = {} + const nftsPerPubkey = {} for (const acc of nftsGovernedTokenAccounts) { const governance = acc.governance.pubkey.toBase58() try { @@ -71,19 +60,17 @@ const useTreasuryAccountStore = create((set, _get) => ({ ) : [] realmNfts = [...realmNfts, ...solAccountNfts] - if (governance) { - governanceNfts[governance] = [...solAccountNfts] - } + + nftsPerPubkey[acc.extensions.transferAddress!.toBase58()] = [ + ...solAccountNfts, + ] } realmNfts = [...realmNfts, ...nfts] if (governance) { - if (governanceNfts[governance]) { - governanceNfts[governance] = [ - ...governanceNfts[governance], - ...nfts, - ] + if (nftsPerPubkey[governance]) { + nftsPerPubkey[governance] = [...nftsPerPubkey[governance], ...nfts] } else { - governanceNfts[governance] = [...nfts] + nftsPerPubkey[governance] = [...nfts] } } } catch (e) { @@ -95,11 +82,20 @@ const useTreasuryAccountStore = create((set, _get) => ({ } set((s) => { s.allNfts = realmNfts - s.governanceNfts = governanceNfts + s.governanceNfts = nftsPerPubkey s.isLoadingNfts = false }) }, setCurrentAccount: async (account, connection) => { + if (!account) { + set((s) => { + s.currentAccount = null + s.mintAddress = '' + s.tokenInfo = undefined + s.recentActivity = [] + }) + return + } let mintAddress = account && account.extensions.token ? account.extensions.token.account.mint.toBase58() @@ -122,13 +118,14 @@ const useTreasuryAccountStore = create((set, _get) => ({ let recentActivity = [] const address = account.extensions.transferAddress try { - recentActivity = await connection.current.getConfirmedSignaturesForAddress2( - address, - { - limit: 5, - }, - 'confirmed' - ) + recentActivity = + await connection.current.getConfirmedSignaturesForAddress2( + address, + { + limit: 5, + }, + 'confirmed' + ) } catch (e) { notify({ type: 'error', diff --git a/stores/useVotePluginsClientStore.tsx b/stores/useVotePluginsClientStore.tsx index 3dc43ca7ef..f7ffbd870d 100644 --- a/stores/useVotePluginsClientStore.tsx +++ b/stores/useVotePluginsClientStore.tsx @@ -2,13 +2,14 @@ import create, { State } from 'zustand' import { VsrClient } from '@blockworks-foundation/voter-stake-registry-client' import { NftVoterClient } from '@solana/governance-program-library' import { getRegistrarPDA, Registrar } from 'VoteStakeRegistry/sdk/accounts' -import { Provider, Wallet } from '@project-serum/anchor' +import { AnchorProvider, Wallet } from '@project-serum/anchor' import { tryGetNftRegistrar, tryGetRegistrar } from 'VoteStakeRegistry/sdk/api' import { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { ConnectionContext } from '@utils/connection' import { ProgramAccount, Realm } from '@solana/spl-governance' import { getNftRegistrarPDA } from 'NftVotePlugin/sdk/accounts' import { VotingClient, VotingClientProps } from '@utils/uiTypes/VotePlugin' +import { PublicKey } from '@solana/web3.js' interface UseVotePluginsClientStore extends State { state: { @@ -18,6 +19,7 @@ interface UseVotePluginsClientStore extends State { voteStakeRegistryRegistrar: Registrar | null nftMintRegistrar: any currentRealmVotingClient: VotingClient + voteStakeRegistryRegistrarPk: PublicKey | null } handleSetVsrClient: ( wallet: SignerWalletAdapter | undefined, @@ -46,6 +48,7 @@ const defaultState = { vsrClient: undefined, nftClient: undefined, voteStakeRegistryRegistrar: null, + voteStakeRegistryRegistrarPk: null, nftMintRegistrar: null, currentRealmVotingClient: new VotingClient({ client: undefined, @@ -60,10 +63,10 @@ const useVotePluginsClientStore = create( ...defaultState, }, handleSetVsrClient: async (wallet, connection) => { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection.current, - (wallet as unknown) as Wallet, + wallet as unknown as Wallet, options ) const vsrClient = await VsrClient.connect( @@ -84,13 +87,14 @@ const useVotePluginsClientStore = create( const existingRegistrar = await tryGetRegistrar(registrar, client!) set((s) => { s.state.voteStakeRegistryRegistrar = existingRegistrar + s.state.voteStakeRegistryRegistrarPk = registrar }) }, handleSetNftClient: async (wallet, connection) => { - const options = Provider.defaultOptions() - const provider = new Provider( + const options = AnchorProvider.defaultOptions() + const provider = new AnchorProvider( connection.current, - (wallet as unknown) as Wallet, + wallet as unknown as Wallet, options ) const nftClient = await NftVoterClient.connect( diff --git a/stores/useWalletStore.tsx b/stores/useWalletStore.tsx index 62b6a494b0..09cf7d3d52 100644 --- a/stores/useWalletStore.tsx +++ b/stores/useWalletStore.tsx @@ -192,19 +192,29 @@ const useWalletStore = create((set, get) => ({ const connection = get().connection.current const connected = get().connected const programId = get().selectedRealm.programId + const realmId = get().selectedRealm.realm?.pubkey + const realmMintPk = get().selectedRealm.realm?.account.communityMint const wallet = get().current const walletOwner = wallet?.publicKey const set = get().set - if (connected && walletOwner && programId) { - const ownVoteRecordsByProposal = await getVoteRecordsByVoterMapByProposal( - connection, - programId, - walletOwner - ) - + if (connected && walletOwner && programId && realmId) { + const [ownVoteRecordsByProposal, tokenRecords] = await Promise.all([ + getVoteRecordsByVoterMapByProposal( + connection, + programId, + walletOwner + ), + getTokenOwnerRecordsForRealmMintMapByOwner( + connection, + programId, + realmId, + realmMintPk + ), + ]) set((state) => { state.ownVoteRecordsByProposal = ownVoteRecordsByProposal + state.selectedRealm.tokenRecords = tokenRecords }) } else { set((state) => { @@ -256,31 +266,27 @@ const useWalletStore = create((set, get) => ({ const realmCouncilMintPk = realm.account.config.councilMint const realmCouncilMint = realmCouncilMintPk && realmMints[realmCouncilMintPk.toBase58()] - const [ - governances, - tokenRecords, - councilTokenOwnerRecords, - config, - ] = await Promise.all([ - getGovernanceAccounts(connection, programId, Governance, [ - pubkeyFilter(1, realmId)!, - ]), - - getTokenOwnerRecordsForRealmMintMapByOwner( - connection, - programId, - realmId, - realmMintPk - ), - - getTokenOwnerRecordsForRealmMintMapByOwner( - connection, - programId, - realmId, - realmCouncilMintPk - ), - getRealmConfig(connection, programId, realmId), - ]) + const [governances, tokenRecords, councilTokenOwnerRecords, config] = + await Promise.all([ + getGovernanceAccounts(connection, programId, Governance, [ + pubkeyFilter(1, realmId)!, + ]), + + getTokenOwnerRecordsForRealmMintMapByOwner( + connection, + programId, + realmId, + realmMintPk + ), + + getTokenOwnerRecordsForRealmMintMapByOwner( + connection, + programId, + realmId, + realmCouncilMintPk + ), + getRealmConfig(connection, programId, realmId), + ]) const governancesMap = accountsToPubkeyMap(governances) diff --git a/styles/index.css b/styles/index.css index 4047933d8d..c0b7f93def 100644 --- a/styles/index.css +++ b/styles/index.css @@ -7,9 +7,9 @@ :root { --primary-light: theme('colors.dark-theme.primary.light'); --primary-dark: theme('colors.dark-theme.primary.dark'); - --secondary-1: theme('colors.dark-theme.secondary-1.light'); + --secondary-1-light: theme('colors.dark-theme.secondary-1.light'); --secondary-1-dark: theme('colors.dark-theme.secondary-1.dark'); - --secondary-2: theme('colors.dark-theme.secondary-2.light'); + --secondary-2-light: theme('colors.dark-theme.secondary-2.light'); --secondary-2-dark: theme('colors.dark-theme.secondary-2.dark'); --red: theme('colors.dark-theme.red'); --green: theme('colors.dark-theme.green'); @@ -28,9 +28,9 @@ [data-theme='Light'] { --primary-light: theme('colors.light-theme.primary.light'); --primary-dark: theme('colors.light-theme.primary.dark'); - --secondary-1: theme('colors.light-theme.secondary-1.light'); + --secondary-1-light: theme('colors.light-theme.secondary-1.light'); --secondary-1-dark: theme('colors.light-theme.secondary-1.dark'); - --secondary-2: theme('colors.light-theme.secondary-2.light'); + --secondary-2-light: theme('colors.light-theme.secondary-2.light'); --secondary-2-dark: theme('colors.light-theme.secondary-2.dark'); --red: theme('colors.light-theme.red'); --green: theme('colors.light-theme.green'); @@ -76,6 +76,10 @@ p { @apply break-words leading-normal text-fgd-2 text-sm; } +tbody { + @apply border-t border-bkg-4; +} + .hero-text { @apply text-2xl font-bold; } diff --git a/tailwind.config.js b/tailwind.config.js index c10526557f..4cb11ced57 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -23,7 +23,7 @@ module.exports = { 'dark-theme': { primary: { light: '#E1CE7A', dark: '#D2B537' }, 'secondary-1': { light: '#AFD803', dark: '#6CBF00' }, - 'secondary-2': { light: '#E54033', dark: '#C7251A' }, + 'secondary-2': { light: '#FFCB1B', dark: '#F48F25' }, 'bkg-1': '#121417', 'bkg-2': '#202429', 'bkg-3': '#2F343B', diff --git a/tools/sdk/units.ts b/tools/sdk/units.ts index 0d10d2de15..e5add455a7 100644 --- a/tools/sdk/units.ts +++ b/tools/sdk/units.ts @@ -1,7 +1,7 @@ -import { BN } from '@project-serum/anchor' +import { BN, ProgramAccount } from '@project-serum/anchor' import { MintInfo } from '@solana/spl-token' +import { TokenInfo } from '@solana/spl-token-registry' import { BigNumber } from 'bignumber.js' -import { TokenInfoWithMint } from 'stores/useTreasuryAccountStore' const SECONDS_PER_DAY = 86400 @@ -24,14 +24,15 @@ export function fmtMintAmount(mint: MintInfo | undefined, mintAmount: BN) { : new BigNumber(mintAmount.toString()).toFormat() } -export function fmtTokenInfoWithMint(tokenInfoWithMint: TokenInfoWithMint) { - return `${fmtBnMintDecimals( - tokenInfoWithMint.amount, - tokenInfoWithMint.mintInfo.decimals - )} ${ - tokenInfoWithMint.tokenInfo?.symbol - ? tokenInfoWithMint.tokenInfo?.symbol - : `${tokenInfoWithMint.mint.toString().substring(0, 12)}...` +export function fmtTokenInfoWithMint( + amount: BN, + mintInfo: ProgramAccount, + tokenInfo: TokenInfo | undefined = undefined +) { + return `${fmtBnMintDecimals(amount, mintInfo.account.decimals)} ${ + tokenInfo?.symbol + ? tokenInfo?.symbol + : `${mintInfo.publicKey.toString().substring(0, 12)}...` }` } diff --git a/utils/Foresight/index.tsx b/utils/Foresight/index.tsx new file mode 100644 index 0000000000..c4a3a0a4a6 --- /dev/null +++ b/utils/Foresight/index.tsx @@ -0,0 +1,405 @@ +import _ from 'lodash' +import useGovernanceAssets from '@hooks/useGovernanceAssets' +import { + governance as foresightGov, + consts as foresightConsts, +} from '@foresight-tmp/foresight-sdk' +import { isFormValid } from '@utils/formValidation' +import { AssetAccount } from '@utils/uiTypes/assets' +import { + Governance, + ProgramAccount, + serializeInstructionToBase64, +} from '@solana/spl-governance' +import GovernedAccountSelect from '../../pages/dao/[symbol]/proposal/components/GovernedAccountSelect' +import { Dispatch, useContext, useEffect, useState } from 'react' +import { + ForesightHasCategoryId, + ForesightHasGovernedAccount, + ForesightHasMarketId, + ForesightHasMarketListId, + ForesightMakeAddMarketMetadataParams, + UiInstruction, +} from '@utils/uiTypes/proposalCreationTypes' +import Input from '@components/inputs/Input' +import { SignerWalletAdapter } from '@solana/wallet-adapter-base' +import { PublicKey, TransactionInstruction } from '@solana/web3.js' +import * as yup from 'yup' +import { ObjectSchema, StringSchema, NumberSchema } from 'yup' +import useRealm from '@hooks/useRealm' +import useWalletStore from 'stores/useWalletStore' +import { NewProposalContext } from '../../pages/dao/[symbol]/proposal/new' +import Select from '@components/inputs/Select' + +type EmptyObject = Record +type SetFormErrors = Dispatch> + +export function getFilteredTokenAccounts(): AssetAccount[] { + const { governedTokenAccountsWithoutNfts } = useGovernanceAssets() + return governedTokenAccountsWithoutNfts.filter((x) => + x.extensions.transferAddress?.equals(foresightGov.DEVNET_TREASURY) + ) +} + +type HandleSetForm = ({ + propertyName, + value, +}: { + propertyName: string + value: any +}) => void + +type HandleSetInstructions = ( + val: { + governedAccount: ProgramAccount | undefined + getInstruction: GetInstruction + }, + index: number +) => void + +function makeValidateInstruction( + schema: ObjectSchema, + form: ForesightHasGovernedAccount, + setFormErrors: SetFormErrors +): () => Promise { + async function validateInstruction(): Promise { + const { isValid, validationErrors } = await isFormValid(schema, form) + setFormErrors(validationErrors) + return isValid + } + return validateInstruction +} + +function makeHandleSetFormWithErrors( + form: T, + setForm: Dispatch>, + setFormErrors: SetFormErrors +): HandleSetForm { + function handleSetForm({ + propertyName, + value, + }: { + propertyName: string + value: any + }) { + setFormErrors({}) + setForm({ ...form, [propertyName]: value }) + } + return handleSetForm +} + +type GetInstruction = () => Promise + +type IxCreator = ( + form: T +) => Promise + +function makeGetInstruction( + ixCreator: IxCreator, + form: T, + programId: PublicKey | undefined, + wallet: SignerWalletAdapter | undefined, + schema: ObjectSchema, + setFormErrors: SetFormErrors +): GetInstruction { + const validateInstruction = makeValidateInstruction( + schema, + form, + setFormErrors + ) + async function getInstruction(): Promise { + const isValid = await validateInstruction() + let serializedInstruction = '' + if (isValid && programId && wallet?.publicKey) { + const ix = await ixCreator(form) + serializedInstruction = serializeInstructionToBase64(ix) + } + return getUiInstruction(serializedInstruction, isValid, form) + } + return getInstruction +} + +type NonDefault = Omit< + T, + 'governedAccount' +> +type ValueOf = T[keyof T] +type AllowedSchema = NumberSchema | StringSchema + +function defaultValToYupSchema( + val: ValueOf> +): AllowedSchema { + if (typeof val === 'number') { + return yup.number().required() + } + return yup.string().required() +} + +type formEntryToSchema = { + [name in keyof NonDefault]: AllowedSchema +} + +export function commonAssets( + formDefaults: NonDefault, + index: number, + governance: ProgramAccount | null +): { + inputProps: InputProps + effector: (ixCreator: IxCreator) => void + governedAccountSelect: JSX.Element + wallet: SignerWalletAdapter | undefined +} { + const extraSchemaFields: formEntryToSchema = _.mapValues( + formDefaults, + defaultValToYupSchema + ) + const schema = getSchema(extraSchemaFields) + const wallet = useWalletStore((s) => s.current) + const filteredTokenAccounts = getFilteredTokenAccounts() + const [formErrors, setFormErrors] = useState({}) + const { handleSetInstructions } = useContext(NewProposalContext) + const [form, setForm] = useState({ + governedAccount: filteredTokenAccounts[0], + ...formDefaults, + } as T) + const handleSetForm = makeHandleSetFormWithErrors( + form, + setForm, + setFormErrors + ) + const inputProps = { + form, + handleSetForm, + formErrors, + } + function effector(ixCreator: IxCreator): void { + ForesightUseEffects( + handleSetForm, + form, + handleSetInstructions, + ixCreator, + wallet, + schema, + setFormErrors, + index + ) + } + const governedAccountSelect = ( + + ) + return { + inputProps, + effector, + governedAccountSelect, + wallet, + } +} + +function ForesightUseEffects( + handleSetForm: HandleSetForm, + form: T, + handleSetInstructions: HandleSetInstructions, + ixCreator: IxCreator, + wallet: SignerWalletAdapter | undefined, + schema: ObjectSchema, + setFormErrors: SetFormErrors, + index: number +): void { + const { realmInfo } = useRealm() + const programId: PublicKey | undefined = realmInfo?.programId + const getInstruction = makeGetInstruction( + ixCreator, + form, + programId, + wallet, + schema, + setFormErrors + ) + useEffect(() => { + handleSetForm({ + propertyName: 'programId', + value: programId?.toString(), + }) + }, [programId]) + + useEffect(() => { + handleSetInstructions( + { governedAccount: form.governedAccount?.governance, getInstruction }, + index + ) + }, [form]) +} + +export function getSchema(extraFields: { + [name in keyof Omit]: StringSchema | NumberSchema +}) { + return yup.object().shape({ + governedAccount: yup + .object() + .nullable() + .required('Program governed account is required'), + ...extraFields, + }) +} + +function getUiInstruction( + serializedInstruction: string, + isValid: boolean, + form: ForesightHasGovernedAccount +): UiInstruction { + return { + serializedInstruction: serializedInstruction, + isValid, + governance: form.governedAccount?.governance, + } +} + +function ForesightGovernedAccountSelect(props: { + filteredTokenAccounts: AssetAccount[] + form: ForesightHasGovernedAccount + handleSetForm: HandleSetForm + index: number + governance: ProgramAccount | null +}) { + const shouldBeGoverned = props.index !== 0 && props.governance + return ( + { + props.handleSetForm({ value, propertyName: 'governedAccount' }) + }} + value={props.form.governedAccount} + shouldBeGoverned={shouldBeGoverned} + governance={props.governance} + > + ) +} + +type InputProps = { + form: T + handleSetForm: HandleSetForm + formErrors: EmptyObject +} + +export function ForesightCategoryIdInput( + props: InputProps +) { + return ( + + props.handleSetForm({ + value: evt.target.value, + propertyName: 'categoryId', + }) + } + error={props.formErrors['categoryId']} + /> + ) +} + +export function ForesightMarketListIdInput( + props: InputProps +) { + return ( + + props.handleSetForm({ + value: evt.target.value, + propertyName: 'marketListId', + }) + } + error={props.formErrors['marketListId']} + /> + ) +} + +export function ForesightMarketIdInput( + props: InputProps +) { + return ( + + props.handleSetForm({ + value: evt.target.value, + propertyName: 'marketId', + }) + } + error={props.formErrors['marketId']} + /> + ) +} + +export function ForesightWinnerInput(props: InputProps) { + return ( + + props.handleSetForm({ + value: evt.target.value, + propertyName: 'winner', + }) + } + error={props.formErrors['winner']} + /> + ) +} + +export function ForesightContentInput( + props: InputProps +) { + return ( + + props.handleSetForm({ + value: evt.target.value, + propertyName: 'content', + }) + } + error={props.formErrors['content']} + /> + ) +} + +export function ForesightMarketMetadataFieldSelect( + props: InputProps +) { + return ( + + ) +} diff --git a/utils/connection.ts b/utils/connection.ts index 11f49d2c6c..fae71729f0 100644 --- a/utils/connection.ts +++ b/utils/connection.ts @@ -5,7 +5,7 @@ import type { EndpointInfo } from '../@types/types' const ENDPOINTS: EndpointInfo[] = [ { name: 'mainnet', - url: process.env.MAINNET_RPC || 'https://monkedao.genesysgo.net/', + url: process.env.MAINNET_RPC || 'https://api.dao.solana.com/', }, { name: 'devnet', diff --git a/utils/instructionTools.ts b/utils/instructionTools.ts index e8dcf8a9c6..30a844653e 100644 --- a/utils/instructionTools.ts +++ b/utils/instructionTools.ts @@ -9,7 +9,7 @@ import { TOKEN_PROGRAM_ID, u64, } from '@solana/spl-token' -import { WalletAdapter } from '@solana/wallet-adapter-base' +import { SignerWalletAdapter, WalletAdapter } from '@solana/wallet-adapter-base' import { Account, Keypair, @@ -79,7 +79,7 @@ export async function getFriktionDepositInstruction({ const sdk = new FriktionSDK({ provider: { connection: connection.current, - wallet: (wallet as unknown) as AnchorWallet, + wallet: wallet as unknown as AnchorWallet, }, }) const cVoltSDK = new ConnectedVoltSDK( @@ -166,7 +166,7 @@ export async function getFriktionDepositInstruction({ connection.current, governedTokenAccount.extensions.mint!.publicKey, TOKEN_PROGRAM_ID, - (null as unknown) as Account + null as unknown as Account ).getMintInfo() decimals = underlyingAssetMintInfo.decimals } @@ -451,12 +451,18 @@ export async function getTransferNftInstruction({ connection.current, nftMint ) - //we find ata from connected wallet that holds the nft - const sourceAccount = tokenAccountsWithNftMint.find( + const isSolAccSource = tokenAccountsWithNftMint.find( (x) => x.account.owner.toBase58() === form.governedTokenAccount.extensions.transferAddress.toBase58() )?.publicKey + const isGovernanceSource = tokenAccountsWithNftMint.find( + (x) => + x.account.owner.toBase58() === + form.governedTokenAccount.governance.pubkey.toBase58() + )?.publicKey + //we find ata from connected wallet that holds the nft + const sourceAccount = isSolAccSource || isGovernanceSource if (!sourceAccount) { throw 'Nft ata not found for governance' } @@ -489,7 +495,9 @@ export async function getTransferNftInstruction({ TOKEN_PROGRAM_ID, sourceAccount!, receiverAddress, - form.governedTokenAccount.extensions.transferAddress, + isSolAccSource + ? form.governedTokenAccount.extensions.transferAddress + : form.governedTokenAccount.governance.pubkey, [], mintAmount ) @@ -522,7 +530,6 @@ export async function getMintInstruction({ governedMintInfoAccount: AssetAccount | undefined setFormErrors: any }): Promise { - console.log(form) const isValid = await validateInstruction({ schema, form, setFormErrors }) let serializedInstruction = '' const prerequisiteInstructions: TransactionInstruction[] = [] @@ -630,3 +637,67 @@ export async function getConvertToMsolInstruction({ return obj } + +export const getTransferInstructionObj = async ({ + connection, + governedTokenAccount, + destinationAccount, + amount, + wallet, +}: { + connection: ConnectionContext + governedTokenAccount: AssetAccount + destinationAccount: string + amount: number | BN + wallet: SignerWalletAdapter +}) => { + const obj: { + transferInstruction: TransactionInstruction | null + ataInstruction: TransactionInstruction | null + } = { + transferInstruction: null, + ataInstruction: null, + } + const sourceAccount = governedTokenAccount.extensions.transferAddress + //this is the original owner + const destinationAccountPk = new PublicKey(destinationAccount) + const mintPK = governedTokenAccount!.extensions!.mint!.publicKey! + const mintAmount = + typeof amount === 'number' + ? parseMintNaturalAmountFromDecimal( + amount, + governedTokenAccount.extensions.mint!.account.decimals + ) + : amount + + //we find true receiver address if its wallet and we need to create ATA the ata address will be the receiver + const { currentAddress: receiverAddress, needToCreateAta } = await getATA({ + connection: connection, + receiverAddress: destinationAccountPk, + mintPK, + wallet: wallet!, + }) + //we push this createATA instruction to transactions to create right before creating proposal + //we don't want to create ata only when instruction is serialized + if (needToCreateAta) { + const ataInst = Token.createAssociatedTokenAccountInstruction( + ASSOCIATED_TOKEN_PROGRAM_ID, // always ASSOCIATED_TOKEN_PROGRAM_ID + TOKEN_PROGRAM_ID, // always TOKEN_PROGRAM_ID + mintPK, // mint + receiverAddress, // ata + destinationAccountPk, // owner of token account + wallet!.publicKey! // fee payer + ) + obj.ataInstruction = ataInst + } + const transferIx = Token.createTransferInstruction( + TOKEN_PROGRAM_ID, + sourceAccount!, + receiverAddress, + governedTokenAccount!.extensions!.token!.account.owner, + [], + new u64(mintAmount.toString()) + ) + obj.transferInstruction = transferIx + return obj +} diff --git a/utils/send.tsx b/utils/send.tsx index 29980f4fb1..51ba3482dc 100644 --- a/utils/send.tsx +++ b/utils/send.tsx @@ -71,7 +71,7 @@ export async function signTransaction({ connection: Connection }) { transaction.recentBlockhash = ( - await connection.getRecentBlockhash('max') + await connection.getLatestBlockhash('max') ).blockhash transaction.setSigners(wallet!.publicKey!, ...signers.map((s) => s.publicKey)) if (signers.length > 0) { @@ -92,7 +92,7 @@ export async function signTransactions({ wallet: Wallet connection: Connection }) { - const blockhash = (await connection.getRecentBlockhash('max')).blockhash + const blockhash = (await connection.getLatestBlockhash('max')).blockhash transactionsAndSigners.forEach(({ transaction, signers = [] }) => { transaction.recentBlockhash = blockhash transaction.setSigners( diff --git a/utils/sendTransactions.tsx b/utils/sendTransactions.tsx index 4a4de61bea..17eeb54c7e 100644 --- a/utils/sendTransactions.tsx +++ b/utils/sendTransactions.tsx @@ -2,7 +2,6 @@ import { SignerWalletAdapter } from '@solana/wallet-adapter-base' import { Commitment, Connection, - FeeCalculator, RpcResponseAndContext, SignatureStatus, SimulatedTransactionResponse, @@ -163,7 +162,7 @@ export const getUnixTs = () => { return new Date().getTime() / 1000 } -const DEFAULT_TIMEOUT = 30000 +const DEFAULT_TIMEOUT = 60000 ///////////////////////////////////////////////// export async function sendSignedTransaction({ signedTransaction, @@ -264,7 +263,6 @@ export const sendTransactions = async ( false, block?: { blockhash: string - feeCalculator: FeeCalculator } ): Promise => { if (!wallet.publicKey) throw new Error('Wallet not connected!') @@ -272,7 +270,7 @@ export const sendTransactions = async ( const unsignedTxns: Transaction[] = [] if (!block) { - block = await connection.getRecentBlockhash(commitment) + block = await connection.getLatestBlockhash(commitment) } for (let i = 0; i < instructionSet.length; i++) { @@ -298,9 +296,7 @@ export const sendTransactions = async ( unsignedTxns.push(transaction) } - const signedTxns = await wallet.signAllTransactions(unsignedTxns) - const pendingTxns: Promise<{ txid: string; slot: number }>[] = [] const breakEarlyObject = { breakEarly: false } diff --git a/utils/tokens.tsx b/utils/tokens.tsx index 0b2805af35..c21726ba0c 100644 --- a/utils/tokens.tsx +++ b/utils/tokens.tsx @@ -281,12 +281,10 @@ export function getSolAccountLabel(acc: AssetAccount | undefined) { let amount = '' let imgUrl = '' - if (acc?.extensions.token && acc.extensions.mint) { + if (acc?.extensions.mint) { const info = tokenService.getTokenInfo(WSOL_MINT) imgUrl = info?.logoURI ? info.logoURI : '' - tokenAccount = - acc.extensions.transferAddress?.toBase58() || - acc.extensions.token.publicKey.toBase58() + tokenAccount = acc.extensions.transferAddress!.toBase58() tokenName = 'SOL' tokenAccountName = acc.extensions.transferAddress @@ -373,22 +371,26 @@ export const getNfts = async (connection: Connection, ownerPk: PublicKey) => { publicAddress: ownerPk.toBase58(), connection: connection, }) + const tokenAccounts = await getOwnedTokenAccounts(connection, ownerPk) const data = Object.keys(nfts).map((key) => nfts[key]) const arr: NFTWithMint[] = [] for (let i = 0; i < data.length; i++) { try { const val = (await axios.get(data[i].data.uri)).data - const tokenAccounts = await getTokenAccountsByMint( - connection, - data[i].mint - ) - arr.push({ - val, - mint: data[i].mint, - tokenAddress: tokenAccounts - .find((x) => x.account.owner.toBase58() === ownerPk.toBase58())! - .publicKey.toBase58(), + const tokenAccount = tokenAccounts.find((x) => { + return ( + x.account.mint.toBase58() === data[i].mint && + x.account.amount.cmpn(0) === 1 + ) }) + if (tokenAccount) { + arr.push({ + val, + mint: data[i].mint, + tokenAddress: tokenAccount.publicKey.toBase58(), + token: tokenAccount, + }) + } } catch (e) { console.log(e) } diff --git a/utils/treasuryTools.tsx b/utils/treasuryTools.tsx index 1e64cdd923..c7befdd6db 100644 --- a/utils/treasuryTools.tsx +++ b/utils/treasuryTools.tsx @@ -29,7 +29,6 @@ export const getTreasuryAccountItemInfoV2 = (account: AssetAccount) => { const totalPriceFormatted = amount ? new BigNumber(totalPrice).toFormat(0) : '' - const info = tokenService.getTokenInfo(mintAddress!) const symbol = account.type === AccountType.NFT @@ -66,5 +65,6 @@ export const getTreasuryAccountItemInfoV2 = (account: AssetAccount) => { displayPrice, info, symbol, + totalPrice, } } diff --git a/utils/uiTypes/VotePlugin.ts b/utils/uiTypes/VotePlugin.ts index e7b67fd050..270af4e84d 100644 --- a/utils/uiTypes/VotePlugin.ts +++ b/utils/uiTypes/VotePlugin.ts @@ -6,8 +6,10 @@ import { Realm, SYSTEM_PROGRAM_ID, Proposal, + TokenOwnerRecord, } from '@solana/spl-governance' import { PublicKey, TransactionInstruction } from '@solana/web3.js' +import { chunks } from '@utils/helpers' import { getNftRegistrarPDA, getNftVoterWeightRecord, @@ -20,7 +22,7 @@ import { } from 'VoteStakeRegistry/sdk/accounts' import { NFTWithMint } from './nfts' -type updateVoterWeightRecordTypes = +type UpdateVoterWeightRecordTypes = | 'castVote' | 'commentProposal' | 'createGovernance' @@ -89,7 +91,8 @@ export class VotingClient { } withUpdateVoterWeightRecord = async ( instructions: TransactionInstruction[], - type: updateVoterWeightRecordTypes + tokenOwnerRecord: ProgramAccount, + type: UpdateVoterWeightRecordTypes ): Promise => { if (this.noClient) { return @@ -97,6 +100,13 @@ export class VotingClient { const clientProgramId = this.client!.program.programId const realm = this.realm! const walletPk = this.walletPk! + if ( + realm.account.communityMint.toBase58() !== + tokenOwnerRecord.account.governingTokenMint.toBase58() + ) { + return + } + if (this.client instanceof VsrClient) { const { registrar } = await getRegistrarPDA( realm.pubkey, @@ -109,33 +119,32 @@ export class VotingClient { walletPk, clientProgramId ) - instructions.push( - this.client!.program.instruction.updateVoterWeightRecord({ - accounts: { + const updateVoterWeightRecordIx = + await this.client!.program.methods.updateVoterWeightRecord() + .accounts({ registrar, voter, voterWeightRecord: voterWeightPk, systemProgram: SYSTEM_PROGRAM_ID, - }, - }) - ) + }) + .instruction() + instructions.push(updateVoterWeightRecordIx) return { voterWeightPk, maxVoterWeightRecord: undefined } } + if (this.client instanceof NftVoterClient) { const { registrar } = await getNftRegistrarPDA( realm.pubkey, realm.account.communityMint, this.client!.program.programId ) - const { - voterWeightPk, - maxVoterWeightRecord, - } = await this._withHandleNftVoterWeight( - realm, - walletPk, - clientProgramId, - instructions - ) + const { voterWeightPk, maxVoterWeightRecord } = + await this._withHandleNftVoterWeight( + realm, + walletPk, + clientProgramId, + instructions + ) const remainingAccounts: AccountData[] = [] for (let i = 0; i < this.votingNfts.length; i++) { const nft = this.votingNfts[i] @@ -144,25 +153,22 @@ export class VotingClient { new AccountData(nft.metadata.pubkey) ) } - - instructions.push( - this.client.program.instruction.updateVoterWeightRecord( - { [type]: {} }, - { - accounts: { - registrar, - voterWeightRecord: voterWeightPk, - }, - remainingAccounts: remainingAccounts, - } - ) - ) + const updateVoterWeightRecordIx = await this.client.program.methods + .updateVoterWeightRecord({ [type]: {} }) + .accounts({ + registrar: registrar, + voterWeightRecord: voterWeightPk, + }) + .remainingAccounts(remainingAccounts.slice(0, 10)) + .instruction() + instructions.push(updateVoterWeightRecordIx) return { voterWeightPk, maxVoterWeightRecord } } } withCastPluginVote = async ( - instructions, - proposalPk: PublicKey + instructions: TransactionInstruction[], + proposal: ProgramAccount, + tokeOwnerRecord: ProgramAccount ): Promise => { if (this.noClient) { return @@ -170,59 +176,102 @@ export class VotingClient { const clientProgramId = this.client!.program.programId const realm = this.realm! const walletPk = this.walletPk! + if ( + realm.account.communityMint.toBase58() !== + proposal.account.governingTokenMint.toBase58() + ) { + return + } + if (this.client instanceof NftVoterClient) { const { registrar } = await getNftRegistrarPDA( realm.pubkey, realm.account.communityMint, this.client!.program.programId ) - const { - voterWeightPk, - maxVoterWeightRecord, - } = await this._withHandleNftVoterWeight( - realm!, - walletPk, - clientProgramId, - instructions - ) + const { voterWeightPk, maxVoterWeightRecord } = + await this._withHandleNftVoterWeight( + realm!, + walletPk, + clientProgramId, + instructions + ) const remainingAccounts: { pubkey: PublicKey isSigner: boolean isWritable: boolean }[] = [] + const nftVoteRecordsFiltered = + await this.client.program.account.nftVoteRecord.all([ + { + memcmp: { + offset: 8, + bytes: proposal.pubkey.toBase58(), + }, + }, + ]) for (let i = 0; i < this.votingNfts.length; i++) { const nft = this.votingNfts[i] const [nftVoteRecord] = await PublicKey.findProgramAddress( [ Buffer.from('nft-vote-record'), - proposalPk.toBuffer(), + proposal.pubkey.toBuffer(), new PublicKey(nft.metadata.data.mint).toBuffer(), ], clientProgramId ) - remainingAccounts.push( - new AccountData(nft.tokenAddress), - new AccountData(nft.metadata.pubkey), - new AccountData(nftVoteRecord, false, true) + if ( + !nftVoteRecordsFiltered.find( + (x) => x.publicKey.toBase58() === nftVoteRecord.toBase58() + ) ) + remainingAccounts.push( + new AccountData(nft.tokenAddress), + new AccountData(nft.metadata.pubkey), + new AccountData(nftVoteRecord, false, true) + ) } - instructions.push( - this.client.program.instruction.castNftVote(proposalPk, { - accounts: { + //1 nft is 3 accounts + const firstFiveNfts = remainingAccounts.slice(0, 15) + const remainingNftsToChunk = remainingAccounts.slice( + 15, + remainingAccounts.length + ) + const nftsChunk = chunks(remainingNftsToChunk, 12) + for (const i of nftsChunk) { + const castNftVoteIx = await this.client.program.methods + .castNftVote(proposal.pubkey) + .accounts({ registrar, voterWeightRecord: voterWeightPk, governingTokenOwner: walletPk, payer: walletPk, systemProgram: SYSTEM_PROGRAM_ID, - }, - remainingAccounts: remainingAccounts, + }) + .remainingAccounts(i) + .instruction() + + instructions.push(castNftVoteIx) + } + const castNftVoteIx2 = await this.client.program.methods + .castNftVote(proposal.pubkey) + .accounts({ + registrar, + voterWeightRecord: voterWeightPk, + governingTokenOwner: walletPk, + payer: walletPk, + systemProgram: SYSTEM_PROGRAM_ID, }) - ) + .remainingAccounts(firstFiveNfts) + .instruction() + instructions.push(castNftVoteIx2) return { voterWeightPk, maxVoterWeightRecord } } + if (this.client instanceof VsrClient) { const props = await this.withUpdateVoterWeightRecord( instructions, + tokeOwnerRecord, 'castVote' ) return props @@ -239,41 +288,73 @@ export class VotingClient { const clientProgramId = this.client!.program.programId const realm = this.realm! const walletPk = this.walletPk! + if ( + realm.account.communityMint.toBase58() !== + proposal.account.governingTokenMint.toBase58() + ) { + return + } + if (this.client instanceof NftVoterClient) { const { registrar } = await getNftRegistrarPDA( realm.pubkey, realm.account.communityMint, this.client!.program.programId ) - const { - voterWeightPk, - maxVoterWeightRecord, - } = await this._withHandleNftVoterWeight( - realm!, - walletPk, - clientProgramId, - instructions - ) + const { voterWeightPk, maxVoterWeightRecord } = + await this._withHandleNftVoterWeight( + realm!, + walletPk, + clientProgramId, + instructions + ) const remainingAccounts: { pubkey: PublicKey isSigner: boolean isWritable: boolean }[] = [] - for (let i = 0; i < this.votingNfts.length; i++) { - const nft = this.votingNfts[i] - const [nftVoteRecord] = await PublicKey.findProgramAddress( - [ - Buffer.from('nft-vote-record'), - proposal.pubkey.toBuffer(), - new PublicKey(nft.metadata.data.mint).toBuffer(), - ], - clientProgramId + const nftVoteRecordsFiltered = ( + await this.client.program.account.nftVoteRecord.all([ + { + memcmp: { + offset: 8, + bytes: proposal.pubkey.toBase58(), + }, + }, + ]) + ).filter( + (x) => x.account.governingTokenOwner.toBase58() === walletPk.toBase58() + ) + for (const voteRecord of nftVoteRecordsFiltered) { + remainingAccounts.push( + new AccountData(voteRecord.publicKey, false, true) ) - remainingAccounts.push(new AccountData(nftVoteRecord, false, true)) } - instructions.push( - this.client.program.instruction.relinquishNftVote({ - accounts: { + + const firstFiveNfts = remainingAccounts.slice(0, 5) + const remainingNftsToChunk = remainingAccounts.slice( + 5, + remainingAccounts.length + ) + const nftsChunk = chunks(remainingNftsToChunk, 12) + const relinquishNftVoteIx = await this.client.program.methods + .relinquishNftVote() + .accounts({ + registrar, + voterWeightRecord: voterWeightPk, + governance: proposal.account.governance, + proposal: proposal.pubkey, + governingTokenOwner: walletPk, + voteRecord: voteRecordPk, + beneficiary: walletPk, + }) + .remainingAccounts(firstFiveNfts) + .instruction() + instructions.push(relinquishNftVoteIx) + for (const i of nftsChunk) { + const relinquishNftVote2Ix = await this.client.program.methods + .relinquishNftVote() + .accounts({ registrar, voterWeightRecord: voterWeightPk, governance: proposal.account.governance, @@ -281,10 +362,11 @@ export class VotingClient { governingTokenOwner: walletPk, voteRecord: voteRecordPk, beneficiary: walletPk, - }, - remainingAccounts: remainingAccounts, - }) - ) + }) + .remainingAccounts(i) + .instruction() + instructions.push(relinquishNftVote2Ix) + } return { voterWeightPk, maxVoterWeightRecord } } } @@ -297,48 +379,20 @@ export class VotingClient { if (this.client instanceof NftVoterClient === false) { throw 'Method only allowed for nft voter client' } - // let isExisting: any = undefined - // const client = this.client as NftVoterClient - const { - voterWeightPk, - voterWeightRecordBump, - } = await getNftVoterWeightRecord( - realm!.pubkey, - realm!.account.communityMint, - walletPk!, - clientProgramId - ) - - const { - maxVoterWeightRecord, - maxVoterWeightRecordBump, - } = await getNftMaxVoterWeightRecord( - realm!.pubkey, - realm!.account.communityMint, - clientProgramId - ) + const { voterWeightPk, voterWeightRecordBump } = + await getNftVoterWeightRecord( + realm!.pubkey, + realm!.account.communityMint, + walletPk!, + clientProgramId + ) - // try { - // isExisting = await client.program.account.voterWeightRecord.fetch( - // voterWeightPk - // ) - // } catch (e) { - // console.log('No voter, creating voter', e) - // } - // if (!isExisting) { - // instructions.push( - // client.program.instruction.createVoterWeightRecord(walletPk, { - // accounts: { - // voterWeightRecord: voterWeightPk, - // governanceProgramId: realm.owner, - // realm: realm.pubkey, - // realmGoverningTokenMint: realm.account.communityMint, - // payer: walletPk, - // systemProgram: SYSTEM_PROGRAM_ID, - // }, - // }) - // ) - // } + const { maxVoterWeightRecord, maxVoterWeightRecordBump } = + await getNftMaxVoterWeightRecord( + realm!.pubkey, + realm!.account.communityMint, + clientProgramId + ) return { voterWeightPk, diff --git a/utils/uiTypes/assets.ts b/utils/uiTypes/assets.ts index b941e5517a..c6048d6fb1 100644 --- a/utils/uiTypes/assets.ts +++ b/utils/uiTypes/assets.ts @@ -28,6 +28,7 @@ export enum AccountType { MINT, PROGRAM, NFT, + AuxiliaryToken, } export class AccountTypeToken implements AssetAccount { @@ -54,6 +55,27 @@ export class AccountTypeToken implements AssetAccount { } } +export class AccountTypeAuxiliaryToken implements AssetAccount { + governance: ProgramAccount + type: AccountType + extensions: AccountExtension + pubkey: PublicKey + constructor( + tokenAccount: TokenProgramAccount, + mint: TokenProgramAccount + ) { + this.governance = {} as any + this.pubkey = tokenAccount.publicKey + this.type = AccountType.AuxiliaryToken + this.extensions = { + token: tokenAccount, + mint: mint, + transferAddress: tokenAccount!.publicKey!, + amount: tokenAccount!.account.amount, + } + } +} + export class AccountTypeProgram implements AssetAccount { governance: ProgramAccount type: AccountType diff --git a/utils/uiTypes/nfts.ts b/utils/uiTypes/nfts.ts index 7de776f2a2..e758c83b6f 100644 --- a/utils/uiTypes/nfts.ts +++ b/utils/uiTypes/nfts.ts @@ -1,3 +1,6 @@ +import { AccountInfo } from '@solana/spl-token' +import { TokenProgramAccount } from '@utils/tokens' + interface NFTFiles { type: string uri: string @@ -20,4 +23,5 @@ export interface NFTWithMint { val: NFTData mint: string tokenAddress: string + token: TokenProgramAccount } diff --git a/utils/uiTypes/proposalCreationTypes.ts b/utils/uiTypes/proposalCreationTypes.ts index 512ddf73d4..751a323f8d 100644 --- a/utils/uiTypes/proposalCreationTypes.ts +++ b/utils/uiTypes/proposalCreationTypes.ts @@ -8,10 +8,12 @@ import { SupportedMintName } from '@tools/sdk/solend/configuration' import { SplTokenUIName } from '@utils/splTokens' import { DepositWithMintAccount, Voter } from 'VoteStakeRegistry/sdk/accounts' import { LockupKind } from 'VoteStakeRegistry/tools/types' +import { consts as foresightConsts } from '@foresight-tmp/foresight-sdk' import { AssetAccount } from '@utils/uiTypes/assets' export interface UiInstruction { serializedInstruction: string + additionalSerializedInstructions?: string[] isValid: boolean governance: ProgramAccount | undefined customHoldUpTime?: number @@ -180,6 +182,36 @@ export interface MangoMakeChangeReferralFeeParams { refShareCentibps: number refMngoRequired: number } + +export interface ForesightHasGovernedAccount { + governedAccount: AssetAccount +} + +export interface ForesightHasMarketListId extends ForesightHasGovernedAccount { + marketListId: string +} + +export interface ForesightHasMarketId extends ForesightHasMarketListId { + marketId: number +} + +export interface ForesightHasCategoryId extends ForesightHasGovernedAccount { + categoryId: string +} + +export interface ForesightMakeAddMarketListToCategoryParams + extends ForesightHasCategoryId, + ForesightHasMarketListId {} + +export interface ForesightMakeResolveMarketParams extends ForesightHasMarketId { + winner: number +} + +export interface ForesightMakeAddMarketMetadataParams + extends ForesightHasMarketId { + content: string + field: foresightConsts.MarketMetadataFieldName +} export interface Base64InstructionForm { governedAccount: AssetAccount | undefined base64: string @@ -250,10 +282,17 @@ export enum Instructions { WithdrawObligationCollateralAndRedeemReserveLiquidity, RefreshSolendObligation, RefreshSolendReserve, + ForesightInitMarket, + ForesightInitMarketList, + ForesightInitCategory, + ForesightResolveMarket, + ForesightAddMarketListToCategory, + ForesightAddMarketMetadata, RealmConfig, CreateNftPluginRegistrar, CreateNftPluginMaxVoterWeight, ConfigureNftPluginCollection, + CloseTokenAccount, } export type createParams = [ diff --git a/yarn.lock b/yarn.lock index 76aec60eed..7344d625d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -313,7 +313,7 @@ "@babel/parser@^7.16.7": version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz" integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== "@babel/plugin-syntax-async-generators@^7.8.4": @@ -432,7 +432,7 @@ "@babel/template@^7.14.5": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: "@babel/code-frame" "^7.16.7" @@ -494,7 +494,7 @@ "@babel/types@^7.16.7": version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz" integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== dependencies: "@babel/helper-validator-identifier" "^7.16.7" @@ -505,9 +505,9 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" "@blockworks-foundation/mango-client@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.4.3.tgz#a5d72cc4520736edf843caaf8aff5376d1c056a4" - integrity sha512-8JFyE3nlwolfcqbhAYIenv25VnNvvYcEIUUUczHc31WaCtrcwC96Epj7wprHQO4OP6uLc9TBF4zuuGlZY3Fd6Q== + version "3.4.4" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.4.4.tgz#5ccf688432c54c88b513499edde0dcb9af945a8f" + integrity sha512-r4qBcPbxgtfpTWO8Z/ChIY8bQKXXEG+4Bzce+IjHWN32g+UP0tVydMvfYi6WNN9JNrKccR58MujUWvEo7HyniQ== dependencies: "@project-serum/anchor" "^0.21.0" "@project-serum/serum" "0.13.55" @@ -522,12 +522,12 @@ toformat "^2.0.0" yargs "^17.0.1" -"@blockworks-foundation/voter-stake-registry-client@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/voter-stake-registry-client/-/voter-stake-registry-client-0.2.1.tgz#81fca48a7dd46d4ae6e1d5b4968c9227f60d0410" - integrity sha512-ocBcXc5FGSZyAcVfB3afnmpM6iRGfN4mkK6n8byFo8BaE35eQxHmvP2cQnvmvXKSmvcWiV5QxNHKPPqk6wgVFw== +"@blockworks-foundation/voter-stake-registry-client@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@blockworks-foundation/voter-stake-registry-client/-/voter-stake-registry-client-0.2.3.tgz#2d3f537c19635d1bdcf64ba00721dbaf98abc847" + integrity sha512-SS2cFXfVHI1dcN3zBE3MkqcXNe+47KVrk3JOiDgw2VbagxllZDAUKZRW8666HwUfmJSogVFyDwJvJD/WSBbXtQ== dependencies: - "@project-serum/anchor" "^0.18.0" + "@project-serum/anchor" "^0.24.2" "@project-serum/serum" "^0.13.61" "@cardinal/certificates@^1.2.3", "@cardinal/certificates@^1.3.0": @@ -568,7 +568,7 @@ "@cardinal/namespaces@^2.0.42": version "2.0.59" - resolved "https://registry.yarnpkg.com/@cardinal/namespaces/-/namespaces-2.0.59.tgz#9e251c3a38f78faca58e208d1c5f2e10fa8c829b" + resolved "https://registry.npmjs.org/@cardinal/namespaces/-/namespaces-2.0.59.tgz" integrity sha512-2waZMfLyzAKi5y7bWBPzuqP/FDSjLS5u9VhsBLfEQbNOR3BHmHrSwrYPpAfV+IrULNBSSg8jobxoD5b94C3GEQ== dependencies: "@cardinal/certificates" "^1.2.3" @@ -581,7 +581,7 @@ "@cardinal/namespaces@^3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@cardinal/namespaces/-/namespaces-3.1.0.tgz#bee4acdf3d2bcf63aa5c02502f61fb8024ac4039" + resolved "https://registry.npmjs.org/@cardinal/namespaces/-/namespaces-3.1.0.tgz" integrity sha512-eX44mI0EFZrzvIHKGS/j0iUJPmCrl1av89jfSqWf6ldYYwLyENQysyOQv2az718pbJd9H5IQb+kJX0JLlQCo/w== dependencies: "@cardinal/certificates" "^1.2.3" @@ -592,14 +592,19 @@ "@solana/spl-token" "^0.1.8" typescript "^4.5.4" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz" integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== "@cspotcode/source-map-support@0.7.0": version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz" integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== dependencies: "@cspotcode/source-map-consumer" "0.8.0" @@ -608,7 +613,7 @@ version "1.4.0" resolved "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz" -"@emotion/babel-plugin@^11.3.0", "@emotion/babel-plugin@^11.7.1": +"@emotion/babel-plugin@^11.7.1": version "11.7.2" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz#fec75f38a6ab5b304b0601c74e2a5e77c95e5fa0" integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ== @@ -628,7 +633,7 @@ "@emotion/cache@^11.7.1": version "11.7.1" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.7.1.tgz#08d080e396a42e0037848214e8aa7bf879065539" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz" integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A== dependencies: "@emotion/memoize" "^0.7.4" @@ -641,10 +646,10 @@ version "0.8.0" resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" -"@emotion/is-prop-valid@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz#cbd843d409dfaad90f9404e7c0404c55eae8c134" - integrity sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw== +"@emotion/is-prop-valid@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz#34ad6e98e871aa6f7a20469b602911b8b11b3a95" + integrity sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ== dependencies: "@emotion/memoize" "^0.7.4" @@ -678,19 +683,19 @@ "@emotion/sheet@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.0.tgz#56d99c41f0a1cda2726a05aa6a20afd4c63e58d2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz" integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g== -"@emotion/styled@^11.3.0", "@emotion/styled@^11.6.0": - version "11.6.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.6.0.tgz#9230d1a7bcb2ebf83c6a579f4c80e0664132d81d" - integrity sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw== +"@emotion/styled@^11.6.0", "@emotion/styled@^11.8.1": + version "11.8.1" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.8.1.tgz#856f6f63aceef0eb783985fa2322e2bf66d04e17" + integrity sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ== dependencies: "@babel/runtime" "^7.13.10" - "@emotion/babel-plugin" "^11.3.0" - "@emotion/is-prop-valid" "^1.1.1" + "@emotion/babel-plugin" "^11.7.1" + "@emotion/is-prop-valid" "^1.1.2" "@emotion/serialize" "^1.0.2" - "@emotion/utils" "^1.0.0" + "@emotion/utils" "^1.1.0" "@emotion/unitless@^0.7.5": version "0.7.5" @@ -722,19 +727,19 @@ "@ethersproject/bytes@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz" integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== dependencies: "@ethersproject/logger" "^5.5.0" "@ethersproject/logger@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== "@ethersproject/sha2@^5.5.0": version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz" integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== dependencies: "@ethersproject/bytes" "^5.5.0" @@ -743,7 +748,7 @@ "@fast-csv/format@4.3.5": version "4.3.5" - resolved "https://registry.yarnpkg.com/@fast-csv/format/-/format-4.3.5.tgz#90d83d1b47b6aaf67be70d6118f84f3e12ee1ff3" + resolved "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz" integrity sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A== dependencies: "@types/node" "^14.0.1" @@ -755,7 +760,7 @@ "@fast-csv/parse@4.3.6": version "4.3.6" - resolved "https://registry.yarnpkg.com/@fast-csv/parse/-/parse-4.3.6.tgz#ee47d0640ca0291034c7aa94039a744cfb019264" + resolved "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz" integrity sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA== dependencies: "@types/node" "^14.0.1" @@ -766,12 +771,23 @@ lodash.isundefined "^3.0.1" lodash.uniq "^4.5.0" -"@friktion-labs/entropy-client@^1.0.0", "@friktion-labs/entropy-client@^1.1.5": - version "1.4.6" - resolved "https://registry.yarnpkg.com/@friktion-labs/entropy-client/-/entropy-client-1.4.6.tgz#0dc8647fd7e6426dbab4589a1e81e863bb8d6691" - integrity sha512-vd+9vFJy0KKlav8UsynmlVgKvNLZpJRI+3gaZPPl/XFDGmu0qxKFQVp7YtUAZgBYnVDOodDKtPHp+Rux90pdwA== +"@foresight-tmp/foresight-sdk@^0.1.38": + version "0.1.38" + resolved "https://registry.yarnpkg.com/@foresight-tmp/foresight-sdk/-/foresight-sdk-0.1.38.tgz#601dffa26e88a3c3d4f580ccd433064328d06de1" + integrity sha512-Zn7IOm4JMnVFLUyn9bq0za9gvWnEmIVNfaJbVU8RV6M/Vco/w1lkwLGqe2o1jkmqUHlsb7rvv+FzCSGFbaZNqA== + dependencies: + "@project-serum/anchor" "^0.23.0" + "@project-serum/serum" "^0.13.61" + "@solana/web3.js" "^1.37.1" + axios "^0.24.0" + buffer-layout "^1.2.2" + lodash "^4.17.21" + +"@friktion-labs/entropy-client@^1.0.0": + version "1.4.78" + resolved "https://registry.yarnpkg.com/@friktion-labs/entropy-client/-/entropy-client-1.4.78.tgz#e50220243d29d27266fb2d1ab92a64ecad8f21ae" + integrity sha512-OgXTwyrqAMY0uSSZIqCFn5F7+l7ComNiOq9xqadkoKBRoytnP54qafCLmDVQy5o92JzsXIFyC1ULZcpF4f9Mow== dependencies: - "@friktion-labs/entropy-client" "^1.0.0" "@project-serum/anchor" "^0.16.2" "@project-serum/borsh" "^0.2.3" "@project-serum/serum" "0.13.55" @@ -786,22 +802,21 @@ dotenv-expand "^6.0.1" yargs "^17.0.1" -"@friktion-labs/friktion-sdk@^1.1.59": - version "1.1.59" - resolved "https://registry.yarnpkg.com/@friktion-labs/friktion-sdk/-/friktion-sdk-1.1.59.tgz#3f02a89fffd0a3e858551647794bf0fa6326fd09" - integrity sha512-Yu4zli2baLxkQT/YQCQnz6LH4hsVquMMYYu24PVcox4mwvO1XK4x1TQ7tlSKv/ROLeNRP/04eEE2fTM9L5oFag== +"@friktion-labs/friktion-sdk@^1.1.25": + version "1.1.25" + resolved "https://registry.yarnpkg.com/@friktion-labs/friktion-sdk/-/friktion-sdk-1.1.25.tgz#9233d3252cf38f04dc8cf8e5afef5047507c9291" + integrity sha512-RMnXNngfizYipSLBE+1fpSoptL940NYZTDv9vlDP+YdDVOyvAWc06pa2KLdKFyXQg/3pvcRRkaM12/+FgJtCWg== dependencies: - "@friktion-labs/entropy-client" "^1.1.5" + "@friktion-labs/entropy-client" "^1.0.0" "@oclif/command" "^1.8.16" - "@project-serum/anchor" "^0.23.0" - "@project-serum/common" "^0.0.1-beta.3" + "@project-serum/anchor" "^0.22.1" "@project-serum/serum" "^0.13.61" "@saberhq/anchor-contrib" "^1.11.3" "@saberhq/chai-solana" "^1.11.3" "@saberhq/solana-contrib" "^1.11.3" "@saberhq/token-utils" "^1.11.3" "@solana/spl-token" "^0.1.8" - "@solana/web3.js" "^1.31.0" + "@solana/web3.js" "1.31.0" "@switchboard-xyz/switchboard-v2" "^0.0.34" bn.js "^5.2.0" chalk "^5.0.0" @@ -821,8 +836,9 @@ integrity sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ== "@heroicons/react@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@heroicons/react/-/react-1.0.1.tgz" + version "1.0.6" + resolved "https://registry.yarnpkg.com/@heroicons/react/-/react-1.0.6.tgz#35dd26987228b39ef2316db3b1245c42eb19e324" + integrity sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ== "@humanwhocodes/config-array@^0.9.2": version "0.9.2" @@ -840,7 +856,7 @@ "@isaacs/string-locale-compare@^1.0.1", "@isaacs/string-locale-compare@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" + resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz" integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== "@istanbuljs/load-nyc-config@^1.0.0": @@ -1038,7 +1054,7 @@ "@ledgerhq/devices@^6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.20.0.tgz#4280aaa5dc16f821ecab9ee8ae882299411ba5b7" + resolved "https://registry.npmjs.org/@ledgerhq/devices/-/devices-6.20.0.tgz" integrity sha512-WehM7HGdb+nSUzyUlz1t2qJ8Tg4I+rQkOJJsx0/Dpjkx6/+1hHcX6My/apPuwh39qahqwYhjszq0H1YzGDS0Yg== dependencies: "@ledgerhq/errors" "^6.10.0" @@ -1048,12 +1064,12 @@ "@ledgerhq/errors@^6.10.0": version "6.10.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.10.0.tgz#dda9127b65f653fbb2f74a55e8f0e550d69de6e4" + resolved "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.10.0.tgz" integrity sha512-fQFnl2VIXh9Yd41lGjReCeK+Q2hwxQJvLZfqHnKqWapTz68NHOv5QcI0OHuZVNEbv0xhgdLhi5b65kgYeQSUVg== "@ledgerhq/hw-transport-webusb@^6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.20.0.tgz#ddf4db2727d2dc79930d3c672e11cd08658f22c8" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.20.0.tgz" integrity sha512-7rtgOEuEZ7/O5JofcglUVck7RXH5D8vS3zP5SjPURhvSFiJVGrtOVS+Qna7gXqGdkesDcNF0xBkwme+67n4Imw== dependencies: "@ledgerhq/devices" "^6.20.0" @@ -1063,7 +1079,7 @@ "@ledgerhq/hw-transport@^6.20.0": version "6.20.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.20.0.tgz#16e84c99fca2d10f637c0e36c87088322479a488" + resolved "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.20.0.tgz" integrity sha512-5KS0Y6CbWRDOv3FgNIfk53ViQOIZqMxAw0RuOexreW5GMwuYfK7ddGi4142qcu7YrxkGo7cNe42wBbx1hdXl0Q== dependencies: "@ledgerhq/devices" "^6.20.0" @@ -1072,12 +1088,12 @@ "@ledgerhq/logs@^6.10.0": version "6.10.0" - resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1" + resolved "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.10.0.tgz" integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw== "@marinade.finance/marinade-ts-sdk@^2.0.9": version "2.0.9" - resolved "https://registry.yarnpkg.com/@marinade.finance/marinade-ts-sdk/-/marinade-ts-sdk-2.0.9.tgz#0268d8776480d613cab43dbec913749242454148" + resolved "https://registry.npmjs.org/@marinade.finance/marinade-ts-sdk/-/marinade-ts-sdk-2.0.9.tgz" integrity sha512-teXINCXLTfspXzwNKDtfluZ/wvKBQmcQH2j7SNcFAbJzK6NYo3RdYALu4IHIXMwLs9hEs7XZU8AsKKh+HSLPLA== dependencies: "@project-serum/anchor" "^0.18.2" @@ -1124,7 +1140,7 @@ "@metaplex-foundation/mpl-token-metadata@^1.2.5": version "1.2.5" - resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-1.2.5.tgz#1a927b1c7d30cd634a1e4782022712a02f6865c2" + resolved "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-1.2.5.tgz" integrity sha512-pxRG53JsTSwXpiJJMHNulJhH8kO3hHztQ3QxslUoKw2hBYKXsg9TGsiHgNIhN2MPZGBJ2pDeK6kNGv0sd54HhA== dependencies: "@metaplex-foundation/mpl-core" "^0.0.2" @@ -1142,7 +1158,7 @@ "@metaplex/js@^4.2.1": version "4.11.7" - resolved "https://registry.yarnpkg.com/@metaplex/js/-/js-4.11.7.tgz#48d00ee7a2bf96aed7432ddb68bb227d02385156" + resolved "https://registry.npmjs.org/@metaplex/js/-/js-4.11.7.tgz" integrity sha512-/8X04VEHMfWF84H2DZwLY3yg0xq75vgt/VtLuChTm8iUHkj99Whnq0NLTe0OqfhiEV0qFvT5dbLFh7x2CZqrEQ== dependencies: "@metaplex-foundation/mpl-auction" "^0.0.2" @@ -1161,81 +1177,86 @@ crypto-hash "^1.3.0" form-data "^4.0.0" -"@next/bundle-analyzer@^12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.4.tgz#22afb920b769a54a8da118af0786df0a1f4fca47" - integrity sha512-Xw3gxBTOAS5bcayUl2hDYeCbAFIR+7poiGW4Wi/KGcsjgVRetKBS6akZ1AZsz36CUOdCxajKO45B6CeAaKtcqA== +"@mithraic-labs/serum-remote@^0.0.1-rc.16": + version "0.0.1-rc.16" + resolved "https://registry.yarnpkg.com/@mithraic-labs/serum-remote/-/serum-remote-0.0.1-rc.16.tgz#c7d1d8ed7b2e662dc16712ef34214ff3e5037d1a" + integrity sha512-nGzkVROoWa+DSSUstRVL3R6geXtareYwhjRQBkpCmvB1L9Ll47dVNSu9cWE8JLbfSJeFCElAjJjaLfDey8ZQqQ== + +"@next/bundle-analyzer@^12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-12.1.5.tgz#07079b892efe0a2a7e8add703ad7cacfa3cc4e88" + integrity sha512-A9MkhWCPvSp1vl0Ox7IjJ/qpugDC5YAb40btGGIPPXHQtkal107Sf8dbay4fqw4Hekee5gdS0WUMfe1BaSur7w== dependencies: webpack-bundle-analyzer "4.3.0" -"@next/env@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.4.tgz#5af629b43075281ecd7f87938802b7cf5b67e94b" - integrity sha512-7gQwotJDKnfMxxXd8xJ2vsX5AzyDxO3zou0+QOXX8/unypA6icw5+wf6A62yKZ6qQ4UZHHxS68pb6UV+wNneXg== - -"@next/swc-android-arm-eabi@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.4.tgz#c3dae178b7c15ad627d2e9b8dfb38caecb5c4ac7" - integrity sha512-FJg/6a3s2YrUaqZ+/DJZzeZqfxbbWrynQMT1C5wlIEq9aDLXCFpPM/PiOyJh0ahxc0XPmi6uo38Poq+GJTuKWw== - -"@next/swc-android-arm64@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.4.tgz#f320d60639e19ecffa1f9034829f2d95502a9a51" - integrity sha512-LXraazvQQFBgxIg3Htny6G5V5he9EK7oS4jWtMdTGIikmD/OGByOv8ZjLuVLZLtVm3UIvaAiGtlQSLecxJoJDw== - -"@next/swc-darwin-arm64@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.4.tgz#fd578278312613eddcf3aee26910100509941b63" - integrity sha512-SSST/dBymecllZxcqTCcSTCu5o1NKk9I+xcvhn/O9nH6GWjgvGgGkNqLbCarCa0jJ1ukvlBA138FagyrmZ/4rQ== - -"@next/swc-darwin-x64@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.4.tgz#ace5f80d8c8348efe194f6d7074c6213c52b3944" - integrity sha512-p1lwdX0TVjaoDXQVuAkjtxVBbCL/urgxiMCBwuPDO7TikpXtSRivi+mIzBj5q7ypgICFmIAOW3TyupXeoPRAnA== - -"@next/swc-linux-arm-gnueabihf@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.4.tgz#2bf2c83863635f19c71c226a2df936e001cce29c" - integrity sha512-67PZlgkCn3TDxacdVft0xqDCL7Io1/C4xbAs0+oSQ0xzp6OzN2RNpuKjHJrJgKd0DsE1XZ9sCP27Qv0591yfyg== - -"@next/swc-linux-arm64-gnu@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.4.tgz#d577190f641c9b4b463719dd6b8953b6ba9be8d9" - integrity sha512-OnOWixhhw7aU22TQdQLYrgpgFq0oA1wGgnjAiHJ+St7MLj82KTDyM9UcymAMbGYy6nG/TFOOHdTmRMtCRNOw0g== - -"@next/swc-linux-arm64-musl@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.4.tgz#e70ffe70393d8f9242deecdb282ce5a8fd588b14" - integrity sha512-UoRMzPZnsAavdWtVylYxH8DNC7Uy0i6RrvNwT4PyQVdfANBn2omsUkcH5lgS2O7oaz0nAYLk1vqyZDO7+tJotA== - -"@next/swc-linux-x64-gnu@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.4.tgz#91498a130387fb1961902f2bee55863f8e910cff" - integrity sha512-nM+MA/frxlTLUKLJKorctdI20/ugfHRjVEEkcLp/58LGG7slNaP1E5d5dRA1yX6ISjPcQAkywas5VlGCg+uTvA== - -"@next/swc-linux-x64-musl@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.4.tgz#78057b03c148c121553d41521ad38f6c732762ff" - integrity sha512-GoRHxkuW4u4yKw734B9SzxJwVdyEJosaZ62P7ifOwcujTxhgBt3y76V2nNUrsSuopcKI2ZTDjaa+2wd5zyeXbA== - -"@next/swc-win32-arm64-msvc@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.4.tgz#05bbaabacac23b8edf6caa99eb86b17550a09051" - integrity sha512-6TQkQze0ievXwHJcVUrIULwCYVe3ccX6T0JgZ1SiMeXpHxISN7VJF/O8uSCw1JvXZYZ6ud0CJ7nfC5HXivgfPg== - -"@next/swc-win32-ia32-msvc@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.4.tgz#8fd2fb48f04a2802e51fc320878bf6b411c1c866" - integrity sha512-CsbX/IXuZ5VSmWCpSetG2HD6VO5FTsO39WNp2IR2Ut/uom9XtLDJAZqjQEnbUTLGHuwDKFjrIO3LkhtROXLE/g== - -"@next/swc-win32-x64-msvc@12.1.4": - version "12.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.4.tgz#a72ed44c9b1f850986a30fe36c59e01f8a79b5f3" - integrity sha512-JtYuWzKXKLDMgE/xTcFtCm1MiCIRaAc5XYZfYX3n/ZWSI1SJS/GMm+Su0SAHJgRFavJh6U/p998YwO/iGTIgqQ== +"@next/env@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.5.tgz#a21ba6708022d630402ca2b340316e69a0296dfc" + integrity sha512-+34yUJslfJi7Lyx6ELuN8nWcOzi27izfYnZIC1Dqv7kmmfiBVxgzR3BXhlvEMTKC2IRJhXVs2FkMY+buQe3k7Q== + +"@next/swc-android-arm-eabi@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.5.tgz#36729ab3dfd7743e82cfe536b43254dcb146620c" + integrity sha512-SKnGTdYcoN04Y2DvE0/Y7/MjkA+ltsmbuH/y/hR7Ob7tsj+8ZdOYuk+YvW1B8dY20nDPHP58XgDTSm2nA8BzzA== + +"@next/swc-android-arm64@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.5.tgz#52578f552305c92d0b9b81d603c9643fb71e0835" + integrity sha512-YXiqgQ/9Rxg1dXp6brXbeQM1JDx9SwUY/36JiE+36FXqYEmDYbxld9qkX6GEzkc5rbwJ+RCitargnzEtwGW0mw== + +"@next/swc-darwin-arm64@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.5.tgz#3d5b53211484c72074f4975ba0ec2b1107db300e" + integrity sha512-y8mhldb/WFZ6lFeowkGfi0cO/lBdiBqDk4T4LZLvCpoQp4Or/NzUN6P5NzBQZ5/b4oUHM/wQICEM+1wKA4qIVw== + +"@next/swc-darwin-x64@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.5.tgz#adcabb732d226453777c0d37d58eaff9328b66fd" + integrity sha512-wqJ3X7WQdTwSGi0kIDEmzw34QHISRIQ5uvC+VXmsIlCPFcMA+zM5723uh8NfuKGquDMiEMS31a83QgkuHMYbwQ== + +"@next/swc-linux-arm-gnueabihf@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.5.tgz#82a7cde67482b756bc65fbebf1dfa8a782074e93" + integrity sha512-WnhdM5duONMvt2CncAl+9pim0wBxDS2lHoo7ub/o/i1bRbs11UTzosKzEXVaTDCUkCX2c32lIDi1WcN2ZPkcdw== + +"@next/swc-linux-arm64-gnu@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.5.tgz#f82ca014504950aab751e81f467492e9be0bad5d" + integrity sha512-Jq2H68yQ4bLUhR/XQnbw3LDW0GMQn355qx6rU36BthDLeGue7YV7MqNPa8GKvrpPocEMW77nWx/1yI6w6J07gw== + +"@next/swc-linux-arm64-musl@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.5.tgz#f811ec9f4b12a978426c284c95ab2f515ddf7f9e" + integrity sha512-KgPjwdbhDqXI7ghNN8V/WAiLquc9Ebe8KBrNNEL0NQr+yd9CyKJ6KqjayVkmX+hbHzbyvbui/5wh/p3CZQ9xcQ== + +"@next/swc-linux-x64-gnu@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.5.tgz#d44857257e6d20dc841998951d584ab1f25772c3" + integrity sha512-O2ErUTvCJ6DkNTSr9pbu1n3tcqykqE/ebty1rwClzIYdOgpB3T2MfEPP+K7GhUR87wmN/hlihO9ch7qpVFDGKw== + +"@next/swc-linux-x64-musl@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.5.tgz#3cc523abadc9a2a6de680593aff06e71cc29ecef" + integrity sha512-1eIlZmlO/VRjxxzUBcVosf54AFU3ltAzHi+BJA+9U/lPxCYIsT+R4uO3QksRzRjKWhVQMRjEnlXyyq5SKJm7BA== + +"@next/swc-win32-arm64-msvc@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.5.tgz#c62232d869f1f9b22e8f24e4e7f05307c20f30ca" + integrity sha512-oromsfokbEuVb0CBLLE7R9qX3KGXucZpsojLpzUh1QJjuy1QkrPJncwr8xmWQnwgtQ6ecMWXgXPB+qtvizT9Tw== + +"@next/swc-win32-ia32-msvc@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.5.tgz#2bd9b28a9ba730d12a493e7d9d18e150fe89d496" + integrity sha512-a/51L5KzBpeZSW9LbekMo3I3Cwul+V+QKwbEIMA+Qwb2qrlcn1L9h3lt8cHqNTFt2y72ce6aTwDTw1lyi5oIRA== + +"@next/swc-win32-x64-msvc@12.1.5": + version "12.1.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.5.tgz#02f377e4d41eaaacf265e34bab9bacd8efc4a351" + integrity sha512-/SoXW1Ntpmpw3AXAzfDRaQidnd8kbZ2oSni8u5z0yw6t4RwJvmdZy1eOaAADRThWKV+2oU90++LSnXJIwBRWYQ== "@nfteyez/sol-rayz@^0.10.2": version "0.10.2" - resolved "https://registry.yarnpkg.com/@nfteyez/sol-rayz/-/sol-rayz-0.10.2.tgz#a059b8e8b9cb0956ea0c5a4ca51f5dc12819a3b2" + resolved "https://registry.npmjs.org/@nfteyez/sol-rayz/-/sol-rayz-0.10.2.tgz" integrity sha512-4lj4WEVZHPHIkyfazcUQIBbjw/jl3SknSseccTmJSFh9IMsy7SoFa5jPYH1OallwZBbGmcJSnslwMv2hgZml6A== dependencies: "@solana/spl-name-service" "^0.1.3" @@ -1243,9 +1264,99 @@ lodash.chunk "^4.2.0" lodash.orderby "^4.6.0" +"@nivo/annotations@0.79.1": + version "0.79.1" + resolved "https://registry.yarnpkg.com/@nivo/annotations/-/annotations-0.79.1.tgz#c1b93a1facf55e3f32e2af1b8fb0ba1bebc01910" + integrity sha512-lYso9Luu0maSDtIufwvyVt2+Wue7R9Fh3CIjuRDmNR72UjAgAVEcCar27Fy865UXGsj2hRJZ7KY/1s6kT3gu/w== + dependencies: + "@nivo/colors" "0.79.1" + "@react-spring/web" "9.3.1" + lodash "^4.17.21" + +"@nivo/axes@0.79.0": + version "0.79.0" + resolved "https://registry.yarnpkg.com/@nivo/axes/-/axes-0.79.0.tgz#6f009819b26f93a4126697152aeab5f979f1ab6c" + integrity sha512-EhSeCPxtWEuxqnifeyF/pIJEzL7pRM3rfygL+MpfT5ypu5NcXYRGQo/Bw0Vh+GF1ML+tNAE0rRvCu2jgLSdVNQ== + dependencies: + "@nivo/scales" "0.79.0" + "@react-spring/web" "9.3.1" + d3-format "^1.4.4" + d3-time-format "^3.0.0" + +"@nivo/bar@^0.79.1": + version "0.79.1" + resolved "https://registry.yarnpkg.com/@nivo/bar/-/bar-0.79.1.tgz#42d28169307e735cb84e57b4b6915195ef1c97fb" + integrity sha512-swJ2FtFeRPWJK9O6aZiqTDi2J6GrU2Z6kIHBBCXBlFmq6+vfd5AqOHytdXPTaN80JsKDBBdtY7tqRjpRPlDZwQ== + dependencies: + "@nivo/annotations" "0.79.1" + "@nivo/axes" "0.79.0" + "@nivo/colors" "0.79.1" + "@nivo/legends" "0.79.1" + "@nivo/scales" "0.79.0" + "@nivo/tooltip" "0.79.0" + "@react-spring/web" "9.3.1" + d3-scale "^3.2.3" + d3-shape "^1.2.2" + lodash "^4.17.21" + +"@nivo/colors@0.79.1": + version "0.79.1" + resolved "https://registry.yarnpkg.com/@nivo/colors/-/colors-0.79.1.tgz#0504c08b6a598bc5cb5a8b823d332a73fdc6ef43" + integrity sha512-45huBmz46OoQtfqzHrnqDJ9msebOBX84fTijyOBi8mn8iTDOK2xWgzT7cCYP3hKE58IclkibkzVyWCeJ+rUlqg== + dependencies: + d3-color "^2.0.0" + d3-scale "^3.2.3" + d3-scale-chromatic "^2.0.0" + lodash "^4.17.21" + +"@nivo/core@^0.79.0": + version "0.79.0" + resolved "https://registry.yarnpkg.com/@nivo/core/-/core-0.79.0.tgz#5755212c2058c20899990e7c8ec0e918ac00e5f5" + integrity sha512-e1iGodmGuXkF+QWAjhHVFc+lUnfBoUwaWqVcBXBfebzNc50tTJrTTMHyQczjgOIfTc8gEu23lAY4mVZCDKscig== + dependencies: + "@nivo/recompose" "0.79.0" + "@react-spring/web" "9.3.1" + d3-color "^2.0.0" + d3-format "^1.4.4" + d3-interpolate "^2.0.1" + d3-scale "^3.2.3" + d3-scale-chromatic "^2.0.0" + d3-shape "^1.3.5" + d3-time-format "^3.0.0" + lodash "^4.17.21" + +"@nivo/legends@0.79.1": + version "0.79.1" + resolved "https://registry.yarnpkg.com/@nivo/legends/-/legends-0.79.1.tgz#60b1806bba547f796e6e5b66943d65153de60c79" + integrity sha512-AoabiLherOAk3/HR/N791fONxNdwNk/gCTJC/6BKUo2nX+JngEYm3nVFmTC1R6RdjwJTeCb9Vtuc4MHA+mcgig== + +"@nivo/recompose@0.79.0": + version "0.79.0" + resolved "https://registry.yarnpkg.com/@nivo/recompose/-/recompose-0.79.0.tgz#c0c54ecabb2300ce672f3c3199f74629df33cc08" + integrity sha512-2GFnOHfA2jzTOA5mdKMwJ6myCRGoXQQbQvFFQ7B/+hnHfU/yrOVpiGt6TPAn3qReC4dyDYrzy1hr9UeQh677ig== + dependencies: + react-lifecycles-compat "^3.0.4" + +"@nivo/scales@0.79.0": + version "0.79.0" + resolved "https://registry.yarnpkg.com/@nivo/scales/-/scales-0.79.0.tgz#553b6910288080fbfbbe4d2aab1dd80e2d172e6e" + integrity sha512-5fAt5Wejp8yzAk6qmA3KU+celCxNYrrBhfvOi2ECDG8KQi+orbDnrO6qjVF6+ebfOn9az8ZVukcSeGA5HceiMg== + dependencies: + d3-scale "^3.2.3" + d3-time "^1.0.11" + d3-time-format "^3.0.0" + lodash "^4.17.21" + +"@nivo/tooltip@0.79.0": + version "0.79.0" + resolved "https://registry.yarnpkg.com/@nivo/tooltip/-/tooltip-0.79.0.tgz#3d46be8734e5d30e5387515db0c83bd1c795f442" + integrity sha512-hsJsvhDVR9P/QqIEDIttaA6aslR3tU9So1s/k2jMdppL7J9ZH/IrVx9TbIP7jDKmnU5AMIP5uSstXj9JiKLhQA== + dependencies: + "@react-spring/web" "9.3.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -1253,41 +1364,41 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@notifi-network/notifi-axios-adapter@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@notifi-network/notifi-axios-adapter/-/notifi-axios-adapter-0.11.0.tgz#59bbf06f26c45823b25f1acd36f07d3dafe90266" - integrity sha512-MtpyvuIkFeAkYxUhid8fjtsQt8kUqAyKCJSIwS8EMBAcTNqs+OyT7almqGE9BwQ5w+A6mQuoa+npXyCxPviqSQ== +"@notifi-network/notifi-axios-adapter@^0.12.1": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@notifi-network/notifi-axios-adapter/-/notifi-axios-adapter-0.12.1.tgz#aae412465230b7a3d7e86c93a7d43210568282c6" + integrity sha512-vRVPN1uJHXNrxMzZ1F4OsmwbkytXy2kYBCnq+riRHKIgPykun51LGi5Y2ljW545j1YedtafY4vpPJNmMOhTuFw== dependencies: - "@notifi-network/notifi-axios-utils" "^0.11.0" + "@notifi-network/notifi-axios-utils" "^0.12.0" -"@notifi-network/notifi-axios-utils@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@notifi-network/notifi-axios-utils/-/notifi-axios-utils-0.11.0.tgz#8ebbe1e9a02fafb4772a7d4e3ff787aba48b1979" - integrity sha512-LFTtrnjNXs8jB7vfE8U4RldzwQSvDjraqpwexPoQCG8cvi3PCp/nzFo1JiBgwREXniNm7kxAZrDlhkcp5vcNwg== +"@notifi-network/notifi-axios-utils@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@notifi-network/notifi-axios-utils/-/notifi-axios-utils-0.12.0.tgz#4eea3088cab39c9a2c1482e94c9d020296f42339" + integrity sha512-NVyS7x+z5wSLdNOSyxfB7XePZ1sSaSEKVPGEBnJuH5xpXkLBz1o+WlJTkA9/IcQFdSwLeLCdXGEb8jQPSjEWrA== -"@notifi-network/notifi-core@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@notifi-network/notifi-core/-/notifi-core-0.10.1.tgz#b3cf25b2bc816732311655f7fff94cd0aa700d7d" - integrity sha512-l+lQz3Q+YmoNI4n7jckx7MO75NS/1ZwgLgQOIVazZSI6XvlgnEFDxB855zk62YQfGuy56kK9H5NCD1YAg2NXyg== +"@notifi-network/notifi-core@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@notifi-network/notifi-core/-/notifi-core-0.12.0.tgz#871f16155952f8cdd2e4797ba58fb769b2730c30" + integrity sha512-O9rqcsZ7V6BDjO5nmL1t28QmS29MqTZrG9XAr/yxWD4QuMQyMrqTXyN4ue6GbtEPzzSkAsC9j69BbCrn7plXsQ== -"@notifi-network/notifi-react-hooks@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@notifi-network/notifi-react-hooks/-/notifi-react-hooks-0.11.0.tgz#778b8aeb3977f2b6b2c98afd3705bb58b12c443a" - integrity sha512-pUNyZB+038xU4W30OEeO9/Ln7WkQYA2Ko/z0uRWjhLGYDonZNmAFR7KdAv55QuCoP/P2JN1wZK/VC4ObZaDcoQ== +"@notifi-network/notifi-react-hooks@^0.12.1": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@notifi-network/notifi-react-hooks/-/notifi-react-hooks-0.12.1.tgz#e84dcb751a0f0bbd9ceb2e0378b46014a9570bc7" + integrity sha512-77bxZ/r19023x+yPjzW3LBMYxL4VyP7aR6owak51x76dEUqgi/oqzOh9+YSNXXeTvwr37jhtjYE+DHMVXD+y+g== dependencies: - "@notifi-network/notifi-axios-adapter" "^0.11.0" - "@notifi-network/notifi-axios-utils" "^0.11.0" + "@notifi-network/notifi-axios-adapter" "^0.12.1" + "@notifi-network/notifi-axios-utils" "^0.12.0" axios "^0.26.0" localforage "^1.10.0" typedoc-plugin-missing-exports "^0.22.6" @@ -1349,7 +1460,7 @@ "@npmcli/disparity-colors@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/disparity-colors/-/disparity-colors-1.0.1.tgz#b23c864c9658f9f0318d5aa6d17986619989535c" + resolved "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-1.0.1.tgz" integrity sha512-kQ1aCTTU45mPXN+pdAaRxlxr3OunkyztjbbxDY/aIcPS5CnCUrx+1+NvA6pTcYR7wmLZe37+Mi5v3nfbwPxq3A== dependencies: ansi-styles "^4.3.0" @@ -1364,7 +1475,7 @@ "@npmcli/git@^2.0.7", "@npmcli/git@^2.1.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz" integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== dependencies: "@npmcli/promise-spawn" "^1.3.2" @@ -1378,7 +1489,7 @@ "@npmcli/installed-package-contents@^1.0.6", "@npmcli/installed-package-contents@^1.0.7": version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz" integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== dependencies: npm-bundled "^1.1.1" @@ -1386,7 +1497,7 @@ "@npmcli/map-workspaces@^1.0.2", "@npmcli/map-workspaces@^1.0.4": version "1.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz#915708b55afa25e20bc2c14a766c124c2c5d4cab" + resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz" integrity sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q== dependencies: "@npmcli/name-from-folder" "^1.0.1" @@ -1396,7 +1507,7 @@ "@npmcli/metavuln-calculator@^1.1.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz#2f95ff3c6d88b366dd70de1c3f304267c631b458" + resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz" integrity sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ== dependencies: cacache "^15.0.5" @@ -1405,7 +1516,7 @@ "@npmcli/move-file@^1.0.1", "@npmcli/move-file@^1.1.0": version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" @@ -1413,7 +1524,7 @@ "@npmcli/name-from-folder@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a" + resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz" integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== "@npmcli/node-gyp@^1.0.1", "@npmcli/node-gyp@^1.0.2": @@ -1423,21 +1534,21 @@ "@npmcli/package-json@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-1.0.1.tgz#1ed42f00febe5293c3502fd0ef785647355f6e89" + resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz" integrity sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg== dependencies: json-parse-even-better-errors "^2.3.1" "@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": version "1.3.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz" integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== dependencies: infer-owner "^1.0.4" "@npmcli/run-script@^1.8.2", "@npmcli/run-script@^1.8.3", "@npmcli/run-script@^1.8.4", "@npmcli/run-script@^1.8.6": version "1.8.6" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz" integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== dependencies: "@npmcli/node-gyp" "^1.0.2" @@ -1447,7 +1558,7 @@ "@oclif/command@^1.8.16": version "1.8.16" - resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.16.tgz#bea46f81b2061b47e1cda318a0b923e62ca4cc0c" + resolved "https://registry.npmjs.org/@oclif/command/-/command-1.8.16.tgz" integrity sha512-rmVKYEsKzurfRU0xJz+iHelbi1LGlihIWZ7Qvmb/CBz1EkhL7nOkW4SVXmG2dA5Ce0si2gr88i6q4eBOMRNJ1w== dependencies: "@oclif/config" "^1.18.2" @@ -1459,7 +1570,7 @@ "@oclif/config@1.18.2": version "1.18.2" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.2.tgz#5bfe74a9ba6a8ca3dceb314a81bd9ce2e15ebbfe" + resolved "https://registry.npmjs.org/@oclif/config/-/config-1.18.2.tgz" integrity sha512-cE3qfHWv8hGRCP31j7fIS7BfCflm/BNZ2HNqHexH+fDrdF2f1D5S8VmXWLC77ffv3oDvWyvE9AZeR0RfmHCCaA== dependencies: "@oclif/errors" "^1.3.3" @@ -1471,7 +1582,7 @@ "@oclif/config@^1.18.2": version "1.18.3" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.3.tgz#ddfc144fdab66b1658c2f1b3478fa7fbfd317e79" + resolved "https://registry.npmjs.org/@oclif/config/-/config-1.18.3.tgz" integrity sha512-sBpko86IrTscc39EvHUhL+c++81BVTsIZ3ETu/vG+cCdi0N6vb2DoahR67A9FI2CGnxRRHjnTfa3m6LulwNATA== dependencies: "@oclif/errors" "^1.3.5" @@ -1483,7 +1594,7 @@ "@oclif/errors@1.3.5", "@oclif/errors@^1.3.3", "@oclif/errors@^1.3.5": version "1.3.5" - resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.3.5.tgz#a1e9694dbeccab10fe2fe15acb7113991bed636c" + resolved "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.5.tgz" integrity sha512-OivucXPH/eLLlOT7FkCMoZXiaVYf8I/w1eTAM1+gKzfhALwWTusxEx7wBmW0uzvkSg/9ovWLycPaBgJbM3LOCQ== dependencies: clean-stack "^3.0.0" @@ -1494,7 +1605,7 @@ "@oclif/help@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.1.tgz#fd96a3dd9fb2314479e6c8584c91b63754a7dff5" + resolved "https://registry.npmjs.org/@oclif/help/-/help-1.0.1.tgz" integrity sha512-8rsl4RHL5+vBUAKBL6PFI3mj58hjPCp2VYyXD4TAa7IMStikFfOH2gtWmqLzIlxAED2EpD0dfYwo9JJxYsH7Aw== dependencies: "@oclif/config" "1.18.2" @@ -1509,12 +1620,12 @@ "@oclif/linewrap@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" + resolved "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz" integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== "@oclif/parser@^3.8.0", "@oclif/parser@^3.8.6": version "3.8.7" - resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.7.tgz#236d48db05d0b00157d3b42d31f9dac7550d2a7c" + resolved "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.7.tgz" integrity sha512-b11xBmIUK+LuuwVGJpFs4LwQN2xj2cBWj2c4z1FtiXGrJ85h9xV6q+k136Hw0tGg1jQoRXuvuBnqQ7es7vO9/Q== dependencies: "@oclif/errors" "^1.3.5" @@ -1524,7 +1635,7 @@ "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== "@popperjs/core@^2.8.3": @@ -1534,12 +1645,12 @@ "@project-serum/anchor-cli@^0.18.2": version "0.18.2" - resolved "https://registry.yarnpkg.com/@project-serum/anchor-cli/-/anchor-cli-0.18.2.tgz#748ce259fa693fb3589a96aa9f82bd373c078948" + resolved "https://registry.npmjs.org/@project-serum/anchor-cli/-/anchor-cli-0.18.2.tgz" integrity sha512-zZvLSa0DvsjsKSK8cU7ENqPB1tQ8WCT6dTY2IaJjWdG0UvXUTri8phnYyF5+Zti+frTdKyggOtI+i1QApOWhRQ== "@project-serum/anchor@0.20.1", "@project-serum/anchor@^0.20.1": version "0.20.1" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.20.1.tgz#0937807e807e8332aa708cfef4bcb6cbb88b4129" + resolved "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.20.1.tgz" integrity sha512-2TuBmGUn9qeYz6sJINJlElrBuPsaUAtYyUsJ3XplEBf1pczrANAgs5ceJUFzdiqGEWLn+84ObSdBeChT/AXYFA== dependencies: "@project-serum/borsh" "^0.2.2" @@ -1559,7 +1670,7 @@ "@project-serum/anchor@^0.11.1": version "0.11.1" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.11.1.tgz#155bff2c70652eafdcfd5559c81a83bb19cec9ff" + resolved "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz" integrity sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA== dependencies: "@project-serum/borsh" "^0.2.2" @@ -1579,7 +1690,7 @@ "@project-serum/anchor@^0.16.2": version "0.16.2" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.16.2.tgz#b8b4ec4c749d59a224108f8d82ab68217ef752ae" + resolved "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.16.2.tgz" integrity sha512-wOJwObd4wOZ5tRRMCKYjeMNsEmf7vuC71KQRnw6wthhErL8c/818n4gYIZCf/1ZPl/8WPruIlmtQHDSEyy2+0Q== dependencies: "@project-serum/borsh" "^0.2.2" @@ -1599,7 +1710,7 @@ "@project-serum/anchor@^0.18.0", "@project-serum/anchor@^0.18.2": version "0.18.2" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.18.2.tgz#0f13b5c2046446b7c24cf28763eec90febb28485" + resolved "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.18.2.tgz" integrity sha512-uyjiN/3Ipp+4hrZRm/hG18HzGLZyvP790LXrCsGO3IWxSl28YRhiGEpKnZycfMW94R7nxdUoE3wY67V+ZHSQBQ== dependencies: "@project-serum/borsh" "^0.2.2" @@ -1619,7 +1730,7 @@ "@project-serum/anchor@^0.21.0": version "0.21.0" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.21.0.tgz#ad5fb33744991ec1900cdb2fd22707c908b12b5f" + resolved "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.21.0.tgz" integrity sha512-flRuW/F+iC8mitNokx82LOXyND7Dyk6n5UUPJpQv/+NfySFrNFlzuQZaBZJ4CG5g9s8HS/uaaIz1nVkDR8V/QA== dependencies: "@project-serum/borsh" "^0.2.4" @@ -1638,6 +1749,27 @@ snake-case "^3.0.4" toml "^3.0.0" +"@project-serum/anchor@^0.22.1": + version "0.22.1" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.22.1.tgz#698a9620f94691de0a12bbc650a5c8380e2f0e8a" + integrity sha512-5pHeyvQhzLahIQ8aZymmDMZJAJFklN0joZdI+YIqFkK2uU/mlKr6rBLQjxysf/j1mLLiNG00tdyLfUtTAdQz7w== + dependencies: + "@project-serum/borsh" "^0.2.5" + "@solana/web3.js" "^1.17.0" + base64-js "^1.5.1" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^5.3.1" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + find "^0.3.0" + js-sha256 "^0.9.0" + pako "^2.0.3" + snake-case "^3.0.4" + toml "^3.0.0" + "@project-serum/anchor@^0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.23.0.tgz#2b2eb6b51601b073e8db26663aa2d6c2f2841771" @@ -1659,10 +1791,10 @@ snake-case "^3.0.4" toml "^3.0.0" -"@project-serum/anchor@^0.24.1": - version "0.24.1" - resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.24.1.tgz#521c3d610d3db7e24f143736e9c945b54fb8ef85" - integrity sha512-Oab6rPKsoBKf7/m/AyZcx3ahzcRiOFbqYRoDX6Gnxiqeu2zLKS+LyV6v/2XEVnwhIhOtwETtsgSZAwbqjM5Ywg== +"@project-serum/anchor@^0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.24.2.tgz#a3c52a99605c80735f446ca9b3a4885034731004" + integrity sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA== dependencies: "@project-serum/borsh" "^0.2.5" "@solana/web3.js" "^1.36.0" @@ -1681,7 +1813,7 @@ "@project-serum/borsh@^0.2.2", "@project-serum/borsh@^0.2.3", "@project-serum/borsh@^0.2.4", "@project-serum/borsh@^0.2.5": version "0.2.5" - resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.5.tgz#6059287aa624ecebbfc0edd35e4c28ff987d8663" + resolved "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz" integrity sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q== dependencies: bn.js "^5.1.2" @@ -1735,27 +1867,27 @@ "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= "@protobufjs/base64@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== "@protobufjs/codegen@^2.0.4": version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== "@protobufjs/eventemitter@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= "@protobufjs/fetch@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= dependencies: "@protobufjs/aspromise" "^1.1.1" @@ -1763,32 +1895,32 @@ "@protobufjs/float@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= "@protobufjs/inquire@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= "@protobufjs/path@^1.1.2": version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= "@protobufjs/pool@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= "@protobufjs/utf8@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= "@pythnetwork/client@^2.5.1": version "2.5.3" - resolved "https://registry.yarnpkg.com/@pythnetwork/client/-/client-2.5.3.tgz#86c9f92d01d8f282fdd8b5b11039da654e263988" + resolved "https://registry.npmjs.org/@pythnetwork/client/-/client-2.5.3.tgz" integrity sha512-NBLxPnA6A3tZb/DYUooD4SO63UJ70s9DzzFPGXcQNBR9itcycp7aaV+UA5oUPloD/4UHL9soo2fRuDVur0gmhA== dependencies: "@solana/web3.js" "^1.30.2" @@ -1797,7 +1929,7 @@ "@reach/dialog@^0.16.2": version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/dialog/-/dialog-0.16.2.tgz#567e6f59d0a6dabe84b2ba4c456404efa6cb7d03" + resolved "https://registry.npmjs.org/@reach/dialog/-/dialog-0.16.2.tgz" integrity sha512-qq8oX0cROgTb8LjOKWzzNm4SqaN9b89lJHr7UyVo2aQ6WbeNzZBxqXhGywFP7dkR+hNqOJnrA59PXFWhfttA9A== dependencies: "@reach/portal" "0.16.2" @@ -1809,7 +1941,7 @@ "@reach/portal@0.16.2": version "0.16.2" - resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.16.2.tgz#ca83696215ee03acc2bb25a5ae5d8793eaaf2f64" + resolved "https://registry.npmjs.org/@reach/portal/-/portal-0.16.2.tgz" integrity sha512-9ur/yxNkuVYTIjAcfi46LdKUvH0uYZPfEp4usWcpt6PIp+WDF57F/5deMe/uGi/B/nfDweQu8VVwuMVrCb97JQ== dependencies: "@reach/utils" "0.16.0" @@ -1818,23 +1950,40 @@ "@reach/utils@0.16.0": version "0.16.0" - resolved "https://registry.yarnpkg.com/@reach/utils/-/utils-0.16.0.tgz#5b0777cf16a7cab1ddd4728d5d02762df0ba84ce" + resolved "https://registry.npmjs.org/@reach/utils/-/utils-0.16.0.tgz" integrity sha512-PCggBet3qaQmwFNcmQ/GqHSefadAFyNCUekq9RrWoaU9hh/S4iaFgf2MBMdM47eQj5i/Bk0Mm07cP/XPFlkN+Q== dependencies: tiny-warning "^1.0.3" tslib "^2.3.0" +"@react-spring/animated@~9.3.0": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.3.2.tgz#bda85e92e9e9b6861c259f2dacb54270a37b0f39" + integrity sha512-pBvKydRHbTzuyaeHtxGIOvnskZxGo/S5/YK1rtYm88b9NQZuZa95Rgd3O0muFL+99nvBMBL8cvQGD0UJmsqQsg== + dependencies: + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + "@react-spring/animated@~9.4.0": version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.4.2.tgz#1dc107233ce4a44b023abac829f3b2ea8327a128" + resolved "https://registry.npmjs.org/@react-spring/animated/-/animated-9.4.2.tgz" integrity sha512-Dzum5Ho8e+LIAegAqRyoQFakD2IVH3ZQ2nsFXJorAFq3Xjv6IVPz/+TNxb/wSvnsMludfoF+ZIf319FSFmgD5w== dependencies: "@react-spring/shared" "~9.4.0" "@react-spring/types" "~9.4.0" +"@react-spring/core@~9.3.0": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.3.2.tgz#d1dc5810666ac18550db89c58567f28fbe04fb07" + integrity sha512-kMRjkgdQ6LJ0lmb/wQlONpghaMT83UxglXHJC6m9kZS/GKVmN//TYMEK85xN1rC5Gg+BmjG61DtLCSkkLDTfNw== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + "@react-spring/core@~9.4.0": version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.4.2.tgz#c20249535b3acaead015d17e1c4ce839ec3d4c9f" + resolved "https://registry.npmjs.org/@react-spring/core/-/core-9.4.2.tgz" integrity sha512-Ej/ULwdx8rQtMAWEpLgwbKcQEx6vPfjyG3cxLP05zAInpCoWkYpl+sXOp9tn3r99mTNQPTTt7BgQsSnmQA8+rQ== dependencies: "@react-spring/animated" "~9.4.0" @@ -1842,27 +1991,55 @@ "@react-spring/shared" "~9.4.0" "@react-spring/types" "~9.4.0" +"@react-spring/rafz@~9.3.0": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.3.2.tgz#0cbd296cd17bbf1e7e49d3b3616884e026d5fb67" + integrity sha512-YtqNnAYp5bl6NdnDOD5TcYS40VJmB+Civ4LPtcWuRPKDAOa/XAf3nep48r0wPTmkK936mpX8aIm7h+luW59u5A== + "@react-spring/rafz@~9.4.0": version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.4.2.tgz#40a663d407cd116d436f662c6849f8e5b56234b6" + resolved "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.4.2.tgz" integrity sha512-rSm+G8E/XEEpnCGtT/xYN6o8VvEXlU8wN/hyKp4Q44XAZzGSMHLIFP7pY94/MmWsxCxjkw1AxUWhiFYxWrnI5Q== +"@react-spring/shared@~9.3.0": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.3.2.tgz#967ce1d8a16d820a99e6eeb2a8f7ca9311d9dfa0" + integrity sha512-ypGQQ8w7mWnrELLon4h6mBCBxdd8j1pgLzmHXLpTC/f4ya2wdP+0WIKBWXJymIf+5NiTsXgSJra5SnHP5FBY+A== + dependencies: + "@react-spring/rafz" "~9.3.0" + "@react-spring/types" "~9.3.0" + "@react-spring/shared@~9.4.0": version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.4.2.tgz#45e103eee04f5e857ab2c575c2a84d3a883f0bfa" + resolved "https://registry.npmjs.org/@react-spring/shared/-/shared-9.4.2.tgz" integrity sha512-mZtbQLpMm6Vy5+O1MSlY9KuAcMO8rdUQvtdnC7Or7y7xiZlnzj8oAILyO6Y2rD2ZC1PmgVS0gMev/8T+MykW+Q== dependencies: "@react-spring/rafz" "~9.4.0" "@react-spring/types" "~9.4.0" +"@react-spring/types@~9.3.0": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.3.2.tgz#0277d436e50d7a824897dd7bb880f4842fbcd0fe" + integrity sha512-u+IK9z9Re4hjNkBYKebZr7xVDYTai2RNBsI4UPL/k0B6lCNSwuqWIXfKZUDVlMOeZHtDqayJn4xz6HcSkTj3FQ== + "@react-spring/types@~9.4.0": version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.4.2.tgz#f0518f6d23a0b0f699a71976483323ac84bc4ace" + resolved "https://registry.npmjs.org/@react-spring/types/-/types-9.4.2.tgz" integrity sha512-GGiIscTM+CEUNV52anj3g5FqAZKL2+eRKtvBOAlC99qGBbvJ3qTLImrUR/I3lXY7PRuLgzI6kh34quA1oUxWYQ== +"@react-spring/web@9.3.1": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.3.1.tgz#5b377ba7ad52e746c2b59e2738c021de3f219d0b" + integrity sha512-sisZIgFGva/Z+xKWPSfXpukF0AP3kR9ALTxlHL87fVotMUCJX5vtH/YlVcywToEFwTHKt3MpI5Wy2M+vgVEeaw== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/core" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + "@react-spring/web@^9.4.2": version "9.4.2" - resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.4.2.tgz#ea8bb224c236d10097da463ea9e950f0939b7a5f" + resolved "https://registry.npmjs.org/@react-spring/web/-/web-9.4.2.tgz" integrity sha512-sWfA9NkVuvVOpjSlMkD2zcF6X3i8NSHTeH/uHCGKsN3mYqgkhvAF+E8GASO/H4KKGNhbRvgCZiwJXOtOGyUg6A== dependencies: "@react-spring/animated" "~9.4.0" @@ -1872,7 +2049,7 @@ "@saberhq/anchor-contrib@^1.11.3", "@saberhq/anchor-contrib@^1.12.48": version "1.12.48" - resolved "https://registry.yarnpkg.com/@saberhq/anchor-contrib/-/anchor-contrib-1.12.48.tgz#76f577df2fd3405086c80f2b9d7b30ca91e2ace0" + resolved "https://registry.npmjs.org/@saberhq/anchor-contrib/-/anchor-contrib-1.12.48.tgz" integrity sha512-UPITsnMazZXfCv4rI3Zx5aAxXZc2wPX09j2Bf5M6zVT1wYTbTEGp0yNLY4f926LBda+EngMkc19SrOYu94ODfw== dependencies: "@saberhq/solana-contrib" "^1.12.48" @@ -1883,7 +2060,7 @@ "@saberhq/chai-solana@^1.11.3": version "1.12.48" - resolved "https://registry.yarnpkg.com/@saberhq/chai-solana/-/chai-solana-1.12.48.tgz#329bc5b2c3a093c0b3731591c500ae5ce011d163" + resolved "https://registry.npmjs.org/@saberhq/chai-solana/-/chai-solana-1.12.48.tgz" integrity sha512-hqJXzMjYoRTc4eTwwb28181dNVJn1IYIkDn6oHOtl1VCZPVe0A0t4smT4OPW5hRZpIaWJDf2UPNwF7Tcyu2TXg== dependencies: "@saberhq/anchor-contrib" "^1.12.48" @@ -1912,7 +2089,7 @@ "@saberhq/token-utils@^1.11.3", "@saberhq/token-utils@^1.12.48": version "1.12.48" - resolved "https://registry.yarnpkg.com/@saberhq/token-utils/-/token-utils-1.12.48.tgz#2949ed44119583553990fde28aa62b21afc61a15" + resolved "https://registry.npmjs.org/@saberhq/token-utils/-/token-utils-1.12.48.tgz" integrity sha512-l99NNmuw+JUHLb+51DmyKZo1caH07Nir3QNj44CWzYU08F22zDPlD7kUXDjmHSYH+BzzGB5/EDR/5IIL9Rh9Zg== dependencies: "@saberhq/solana-contrib" "^1.12.48" @@ -1924,7 +2101,7 @@ "@saberhq/use-solana@^1.12.26": version "1.12.35" - resolved "https://registry.yarnpkg.com/@saberhq/use-solana/-/use-solana-1.12.35.tgz#444c56302ce5e8fc81e546b37f71d7bd2300e2bb" + resolved "https://registry.npmjs.org/@saberhq/use-solana/-/use-solana-1.12.35.tgz" integrity sha512-kUUljPOb1fXuynzqVuhe2PrmaUl3lMtfIgljhVJnsO42KshO6QnU+8bv/eqyZ67kxzIzwe6sXH6GAyzuGqK6GA== dependencies: "@ledgerhq/hw-transport" "^6.20.0" @@ -1961,24 +2138,24 @@ "@solana/buffer-layout@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" + resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz" integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== dependencies: buffer "~6.0.3" "@solana/buffer-layout@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz#75b1b11adc487234821c81dfae3119b73a5fd734" + resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz" integrity sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ== dependencies: buffer "~6.0.3" -"@solana/governance-program-library@^0.15.0": - version "0.15.0" - resolved "https://registry.yarnpkg.com/@solana/governance-program-library/-/governance-program-library-0.15.0.tgz#ece347ea315196a836018c4f8d10274c889648c1" - integrity sha512-u2uM2BU1VMalJtjAksJB3xOQ/FlkIfRKyp44UPDxiF3njxRtHhVReKqWwL+w3dUvFXkVXCQe3jHOkm97egU2Hw== +"@solana/governance-program-library@^0.15.2": + version "0.15.2" + resolved "https://registry.yarnpkg.com/@solana/governance-program-library/-/governance-program-library-0.15.2.tgz#283b71a879710cefded401177bf6951a01cfb1ef" + integrity sha512-dxrefhnHHj+8g7bzieABjYDPkKLot7ZYM9wQfU/PPcjUfPIa8cQJEWW2t7yLeKuAiz+VTxAeV2Y73yx/TO8Lkw== dependencies: - "@project-serum/anchor" "^0.18.0" + "@project-serum/anchor" "^0.24.2" "@project-serum/serum" "^0.13.61" "@solana/spl-governance@^0.0.34": @@ -2012,16 +2189,16 @@ tweetnacl "^1.0.3" webpack-dev-server "^3.11.2" -"@solana/spl-token-registry@^0.2.3300": - version "0.2.3300" - resolved "https://registry.yarnpkg.com/@solana/spl-token-registry/-/spl-token-registry-0.2.3300.tgz#bd6a338d7e63f98e9ef29f1fb16b217ee6183dde" - integrity sha512-ac1XUOTLYzjC99hYoNhLw416WarBtzvCHO/dVmSiWgeaWwfWgBNV8n1LJ3MS/bkwWjWIN4SfPs8/YY5osbhbxA== +"@solana/spl-token-registry@^0.2.3470": + version "0.2.3636" + resolved "https://registry.yarnpkg.com/@solana/spl-token-registry/-/spl-token-registry-0.2.3636.tgz#cb5b8eb4317735f71df301e198be821ddcb982b7" + integrity sha512-uMhW/A9HKCsDXATXq+CJ0UVYzfbls/TXz9cYJosCzNJL8rl1yFTKXdpqLx09WyGn07VYDInvu+svRb/KyTvaqw== dependencies: cross-fetch "3.0.6" "@solana/spl-token@0.1.6": version "0.1.6" - resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.6.tgz" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.6.tgz#fa136b0a3db84f07a99bc0e54cf4e91f2d6da2e8" integrity sha512-fYj+a3w1bqWN6Ibf85XF3h2JkuxevI3Spvqi+mjsNqVUEo2AgxxTZmujNLn/jIzQDNdWkBfF/wYzH5ikcGHmfw== dependencies: "@babel/runtime" "^7.10.5" @@ -2031,7 +2208,7 @@ buffer-layout "^1.2.0" dotenv "10.0.0" -"@solana/spl-token@^0.1.3", "@solana/spl-token@^0.1.6", "@solana/spl-token@^0.1.8": +"@solana/spl-token@0.1.8", "@solana/spl-token@^0.1.6", "@solana/spl-token@^0.1.8": version "0.1.8" resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.1.8.tgz#f06e746341ef8d04165e21fc7f555492a2a0faa6" integrity sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ== @@ -2045,7 +2222,7 @@ "@solana/wallet-adapter-base@^0.9.1", "@solana/wallet-adapter-base@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.2.tgz#917584e701a7764afd59a54865ba60ef1ad62926" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.2.tgz" integrity sha512-lHMHE506oKIJM8Tm/yBUpwR2tOdBADQqKhES/U64oAoACprulLBSGx0A+v7NP3rlcTmBMSh7qSQnf5Iic6jexQ== dependencies: "@solana/web3.js" "^1.20.0" @@ -2061,7 +2238,7 @@ "@solana/wallet-adapter-clover@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-clover/-/wallet-adapter-clover-0.4.2.tgz#9e803d615d125cbb684cd7cdbdbcb9c5245313dd" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-clover/-/wallet-adapter-clover-0.4.2.tgz" integrity sha512-HXK6xxst1Fc3+E3ZaqYHiJFCzdoeQ08CWBTb6LCagJsb2m+GEuomz7Tr59nPpME0UN7evKwgztJIhQmZhnzACg== dependencies: "@solana/wallet-adapter-base" "^0.9.1" @@ -2069,7 +2246,7 @@ "@solana/wallet-adapter-coin98@^0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-coin98/-/wallet-adapter-coin98-0.5.2.tgz#7c709b39d6b5076a0e7cfc0806fc69e9bb818a55" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-coin98/-/wallet-adapter-coin98-0.5.2.tgz" integrity sha512-WjosOpOoFf+Nm4Z0Oli4N2u/bgbZoOXS/anFcimHE+NFI3PoD02u67WLuRWz95X7ID9HzopCGH0YOtpzK5Wt8g== dependencies: "@solana/wallet-adapter-base" "^0.9.1" @@ -2079,7 +2256,7 @@ "@solana/wallet-adapter-mathwallet@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-mathwallet/-/wallet-adapter-mathwallet-0.9.2.tgz#25aa8cc5391ef632decce2926841d36ce1423b51" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-mathwallet/-/wallet-adapter-mathwallet-0.9.2.tgz" integrity sha512-seCpyllK7sx38NBIevTILFKNkLxU9Ij4Ss1EO1OHbr9QOoCMQN7xnsRRvS3OemrKe/ZKhP5Shy2e81bo9xJBaw== dependencies: "@solana/wallet-adapter-base" "^0.9.1" @@ -2087,7 +2264,7 @@ "@solana/wallet-adapter-phantom@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-phantom/-/wallet-adapter-phantom-0.9.2.tgz#0a1640544e70bd10b271c4cd76fedfd499119f36" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-phantom/-/wallet-adapter-phantom-0.9.2.tgz" integrity sha512-ooYz+EnwjNqAnNt5OwfRJykL/GbASDCuZ0V+TBeUki8NC0d1lPJsiPR0Bgs3e192eTxzE2SnD6cGePOiSP3MEw== dependencies: "@solana/wallet-adapter-base" "^0.9.1" @@ -2103,7 +2280,7 @@ "@solana/wallet-adapter-slope@^0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-slope/-/wallet-adapter-slope-0.5.2.tgz#8eadb3649be446c6efba4c74590f24c2f0e41251" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-slope/-/wallet-adapter-slope-0.5.2.tgz" integrity sha512-maeZBvbQmohkwG1/7T31GoZIP9qdykrEOLF+ApA+OMbaCMyi25a1zx1CRoVm66QO488pywG+8u+GAZj9BK0bEA== dependencies: "@solana/wallet-adapter-base" "^0.9.1" @@ -2113,7 +2290,7 @@ "@solana/wallet-adapter-solflare@^0.6.2": version "0.6.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-solflare/-/wallet-adapter-solflare-0.6.2.tgz#b5e2048a9a10eab3a063bad3b101d96a877dc653" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-solflare/-/wallet-adapter-solflare-0.6.2.tgz" integrity sha512-w/Gpe07d/S2tSbmsT7DrhovoUYx0o6Rk2ZKyMY5JEBCjIYOs3O75KO72B7qS22s5Eiv8NRzqmNaKAOGIDIDyOQ== dependencies: "@solana/wallet-adapter-base" "^0.9.1" @@ -2121,7 +2298,7 @@ "@solana/wallet-adapter-solflare@^0.6.6": version "0.6.6" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-solflare/-/wallet-adapter-solflare-0.6.6.tgz#70ffd87db78e65bd7f53910996f8c50c032a0b54" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-solflare/-/wallet-adapter-solflare-0.6.6.tgz" integrity sha512-4H4FbRpvUeCGQ9HevLpCc9hCtwjRL4pf7kk/4QoGdu+jLbXo1doKTiT8sY1svksNS8JWrcr0kn7SpePmiy7xhg== dependencies: "@solana/wallet-adapter-base" "^0.9.4" @@ -2130,7 +2307,7 @@ "@solana/wallet-adapter-sollet@^0.10.3": version "0.10.3" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-sollet/-/wallet-adapter-sollet-0.10.3.tgz#4321253a1942c9d4a84e62494b8d232f83520998" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-sollet/-/wallet-adapter-sollet-0.10.3.tgz" integrity sha512-2CXFWhRu+/00LV0xcuhGFQ9zinPqQ9eRKV19v8+yJEUE9MDCI8qCS92O+t44FNTbImL5cgh/2ettreDM/GkzSQ== dependencies: "@project-serum/sol-wallet-adapter" "^0.2.6" @@ -2148,16 +2325,36 @@ "@solana/wallet-adapter-solong@^0.9.2": version "0.9.2" - resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-solong/-/wallet-adapter-solong-0.9.2.tgz#6bf78cd5480e8631562c989f0767c1eda24ddcd4" + resolved "https://registry.npmjs.org/@solana/wallet-adapter-solong/-/wallet-adapter-solong-0.9.2.tgz" integrity sha512-PKTfQmmCwl7w8cRVHQmrLTEO2Vz/LN8YcrDDJhUnXF45cJ27fHriXjY6BtqoteDbOZQs4QKEccDcG5WLsY4U8w== dependencies: "@solana/wallet-adapter-base" "^0.9.1" "@solana/web3.js" "^1.20.0" +"@solana/web3.js@1.31.0": + version "1.31.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.31.0.tgz#7a313d4c1a90b77f27ddbfe845a10d6883e06452" + integrity sha512-7nHHx1JNFnrt15e9y8m38I/EJCbaB+bFC3KZVM1+QhybCikFxGMtGA5r7PDC3GEL1R2RZA8yKoLkDKo3vzzqnw== + dependencies: + "@babel/runtime" "^7.12.5" + "@ethersproject/sha2" "^5.5.0" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + cross-fetch "^3.1.4" + jayson "^3.4.4" + js-sha3 "^0.8.0" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + "@solana/web3.js@^1.12.0", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.20.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.29.2", "@solana/web3.js@^1.30.2", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.37.1": - version "1.37.1" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.37.1.tgz#5a4d30a4cf79c4598e0a437e841c7942e31be74c" - integrity sha512-1zm1blRU6ANb8bOfONibKkNKoMyzE1e0Z88MagyRLF1AmfHc+18lFvqxSQKUdazLMHcioZ28h+GfyAaeCT63iA== + version "1.41.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.41.0.tgz#f83af98d4ead2b45aa064036d8bdb006a83d1bae" + integrity sha512-m8NDOorYficxn/SbPTCJH1Rwnv/bBIkSr1HABzdSSshRjf92ndrilMCNp61egNGMyd+hAjKfNJkHM5bKvPu5iA== dependencies: "@babel/runtime" "^7.12.5" "@ethersproject/sha2" "^5.5.0" @@ -2192,7 +2389,7 @@ "@solflare-wallet/sdk@^1.0.11": version "1.0.11" - resolved "https://registry.yarnpkg.com/@solflare-wallet/sdk/-/sdk-1.0.11.tgz#2eaf3d5935f96dc4286ae356c4c83f6866947ff2" + resolved "https://registry.npmjs.org/@solflare-wallet/sdk/-/sdk-1.0.11.tgz" integrity sha512-zm+snfxpxfEvPytz0CdPn+LSMLrtYIl8qDjC2jhey4hWTkkZmumgKMKfNb9w6cpHtGgWiQkxSP2KI48xuKmuxw== dependencies: "@project-serum/sol-wallet-adapter" "0.2.0" @@ -2202,7 +2399,7 @@ "@switchboard-xyz/switchboard-api@^0.2.150", "@switchboard-xyz/switchboard-api@^0.2.61": version "0.2.179" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/switchboard-api/-/switchboard-api-0.2.179.tgz#7a55c1814ab2014662480334b7922d746814900c" + resolved "https://registry.npmjs.org/@switchboard-xyz/switchboard-api/-/switchboard-api-0.2.179.tgz" integrity sha512-8YW+9+qaNlEwdTPwu03nNR9XnmO9ODrg9HG6JeDdmu2f/89IIXd4vte2MI29Ij+8C1GZ+4QARP3O3qIdbGk39w== dependencies: "@solana/web3.js" "^1.17.0" @@ -2215,7 +2412,7 @@ "@switchboard-xyz/switchboard-v2@^0.0.34": version "0.0.34" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/switchboard-v2/-/switchboard-v2-0.0.34.tgz#5e10d4c061536a544d2c24b3d1c1796fe2489865" + resolved "https://registry.npmjs.org/@switchboard-xyz/switchboard-v2/-/switchboard-v2-0.0.34.tgz" integrity sha512-7yFWF2A/S4EwP3SEDQGS3HXptDlLLVctCDmDtxDpWL4mlU6RuK/4kntGyGs+s65uIaKpqvJtA1IUow1nX7yE6A== dependencies: "@project-serum/anchor" "^0.18.0" @@ -2297,22 +2494,22 @@ "@tsconfig/node10@^1.0.7": version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz" integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== "@tsconfig/node12@^1.0.7": version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz" integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== "@tsconfig/node14@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz" integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== "@tsconfig/node16@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== "@types/aria-query@^4.2.0": @@ -2361,7 +2558,7 @@ "@types/bn.js@^4.11.5": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" @@ -2375,19 +2572,19 @@ "@types/chai-as-promised@^7.1.5": version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz" integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" "@types/chai@*", "@types/chai@^4.3.0": version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz" integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== "@types/connect@^3.4.33": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" @@ -2401,7 +2598,7 @@ "@types/express-serve-static-core@^4.17.9": version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz" integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== dependencies: "@types/node" "*" @@ -2465,7 +2662,7 @@ "@types/lodash@^4.14.159": version "4.14.178" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz" integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== "@types/lodash@^4.14.175": @@ -2475,7 +2672,7 @@ "@types/long@^4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + resolved "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz" integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== "@types/mdast@^3.0.0": @@ -2500,10 +2697,9 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*": - version "17.0.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.12.tgz#f7aa331b27f08244888c47b7df126184bc2339c5" - integrity sha512-4YpbAsnJXWYK/fpTVFlMIcUIho2AYCi4wg5aNPrG1ng7fn/1/RZfCIpRCiBX+12RVa34RluilnvCqD+g3KiSiA== +"@types/node@*", "@types/node@^14.14.25": + version "14.14.41" + resolved "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz" "@types/node@10.12.18": version "10.12.18" @@ -2512,26 +2708,22 @@ "@types/node@>=13.7.0": version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz" integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== "@types/node@^12.12.54": version "12.20.42" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.42.tgz#2f021733232c2130c26f9eabbdd3bfd881774733" + resolved "https://registry.npmjs.org/@types/node/-/node-12.20.42.tgz" integrity sha512-aI3/oo5DzyiI5R/xAhxxRzfZlWlsbbqdgxfTPkqu/Zt+23GXiJvMCyPJT4+xKSXOnLqoL8jJYMLTwvK2M3a5hw== "@types/node@^14.0.1": version "14.18.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.12.tgz#0d4557fd3b94497d793efd4e7d92df2f83b4ef24" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz" integrity sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A== -"@types/node@^14.14.25": - version "14.14.41" - resolved "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz" - "@types/object-hash@^1.3.0": version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-1.3.4.tgz#079ba142be65833293673254831b5e3e847fe58b" + resolved "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz" integrity sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA== "@types/parse-json@^4.0.0": @@ -2546,7 +2738,7 @@ "@types/promise-retry@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@types/promise-retry/-/promise-retry-1.1.3.tgz#baab427419da9088a1d2f21bf56249c21b3dd43c" + resolved "https://registry.npmjs.org/@types/promise-retry/-/promise-retry-1.1.3.tgz" integrity sha512-LxIlEpEX6frE3co3vCO2EUJfHIta1IOmhDlcAsR4GMMv9hev1iTI9VwberVGkePJAuLZs5rMucrV8CziCfuJMw== dependencies: "@types/retry" "*" @@ -2557,12 +2749,12 @@ "@types/qs@*": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react@^17.0.44": @@ -2576,7 +2768,7 @@ "@types/retry@*", "@types/retry@^0.12.1": version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz" integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== "@types/scheduler@*": @@ -2601,7 +2793,7 @@ "@types/ws@^7.4.4": version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== dependencies: "@types/node" "*" @@ -2623,14 +2815,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz#9608a4b6d0427104bccf132f058cba629a6553c0" - integrity sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg== +"@typescript-eslint/eslint-plugin@^5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz#bfc22e0191e6404ab1192973b3b4ea0461c1e878" + integrity sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg== dependencies: - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/type-utils" "5.19.0" - "@typescript-eslint/utils" "5.19.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/type-utils" "5.21.0" + "@typescript-eslint/utils" "5.21.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -2656,20 +2848,20 @@ "@typescript-eslint/types" "5.18.0" "@typescript-eslint/visitor-keys" "5.18.0" -"@typescript-eslint/scope-manager@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz#97e59b0bcbcb54dbcdfba96fc103b9020bbe9cb4" - integrity sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g== +"@typescript-eslint/scope-manager@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz#a4b7ed1618f09f95e3d17d1c0ff7a341dac7862e" + integrity sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ== dependencies: - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/visitor-keys" "5.19.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/visitor-keys" "5.21.0" -"@typescript-eslint/type-utils@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz#80f2125b0dfe82494bbae1ea99f1c0186d420282" - integrity sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q== +"@typescript-eslint/type-utils@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz#ff89668786ad596d904c21b215e5285da1b6262e" + integrity sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw== dependencies: - "@typescript-eslint/utils" "5.19.0" + "@typescript-eslint/utils" "5.21.0" debug "^4.3.2" tsutils "^3.21.0" @@ -2678,10 +2870,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.18.0.tgz#4f0425d85fdb863071680983853c59a62ce9566e" integrity sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw== -"@typescript-eslint/types@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.19.0.tgz#12d3d600d754259da771806ee8b2c842d3be8d12" - integrity sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w== +"@typescript-eslint/types@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.21.0.tgz#8cdb9253c0dfce3f2ab655b9d36c03f72e684017" + integrity sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA== "@typescript-eslint/typescript-estree@5.18.0": version "5.18.0" @@ -2696,28 +2888,28 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz#fc987b8f62883f9ea6a5b488bdbcd20d33c0025f" - integrity sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw== +"@typescript-eslint/typescript-estree@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz#9f0c233e28be2540eaed3df050f0d54fb5aa52de" + integrity sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg== dependencies: - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/visitor-keys" "5.19.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/visitor-keys" "5.21.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.19.0.tgz#fe87f1e3003d9973ec361ed10d36b4342f1ded1e" - integrity sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ== +"@typescript-eslint/utils@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.21.0.tgz#51d7886a6f0575e23706e5548c7e87bce42d7c18" + integrity sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/typescript-estree" "5.19.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/typescript-estree" "5.21.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" @@ -2729,17 +2921,17 @@ "@typescript-eslint/types" "5.18.0" eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz#c84ebc7f6c744707a361ca5ec7f7f64cd85b8af6" - integrity sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ== +"@typescript-eslint/visitor-keys@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz#453fb3662409abaf2f8b1f65d515699c888dd8ae" + integrity sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA== dependencies: - "@typescript-eslint/types" "5.19.0" + "@typescript-eslint/types" "5.21.0" eslint-visitor-keys "^3.0.0" "@ubeswap/token-math@^4.4.4": version "4.4.4" - resolved "https://registry.yarnpkg.com/@ubeswap/token-math/-/token-math-4.4.4.tgz#98ff131a4371a6229245d8aa79bf198a35682b9c" + resolved "https://registry.npmjs.org/@ubeswap/token-math/-/token-math-4.4.4.tgz" integrity sha512-AbcyDhKVPaFQOuzak1UPyBPNbo6IHCKY4C2xq5DOcW6qmlI+4EaxI9mU2jpG/joYAtqPYrx2BbLizU+TfB6bmg== dependencies: big.js "^6.1.1" @@ -2750,7 +2942,7 @@ JSONStream@^1.3.5: version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" @@ -2762,7 +2954,7 @@ abab@^2.0.3, abab@^2.0.5: abbrev@1, abbrev@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: @@ -2786,7 +2978,7 @@ acorn-jsx@^5.3.1: acorn-node@^1.6.1: version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== dependencies: acorn "^7.0.0" @@ -2848,7 +3040,7 @@ ajv-keywords@^3.1.0: ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2883,7 +3075,7 @@ ansi-regex@^2.0.0: ansi-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.1.0: @@ -2898,7 +3090,7 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" @@ -2911,7 +3103,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansicolors@~0.3.2: @@ -2931,7 +3123,7 @@ any-promise@^1.0.0: anymatch@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" @@ -2939,30 +3131,29 @@ anymatch@^2.0.0: anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" aproba@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== "aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== archy@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= are-we-there-yet@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== dependencies: delegates "^1.0.0" @@ -2978,12 +3169,12 @@ are-we-there-yet@~1.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== arg@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== argparse@^1.0.7: @@ -3078,7 +3269,7 @@ array.prototype.flatmap@^1.2.5: asap@^2.0.0: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1@~0.2.3: @@ -3090,7 +3281,7 @@ asn1@~0.2.3: assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^2.0.0: @@ -3105,7 +3296,7 @@ assert@^2.0.0: assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== assign-symbols@^1.0.0: @@ -3128,9 +3319,9 @@ async-limiter@~1.0.0: integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== async@^2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" @@ -3178,12 +3369,12 @@ available-typed-arrays@^1.0.5: aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== axios@^0.24.0: @@ -3195,7 +3386,7 @@ axios@^0.24.0: axios@^0.25.0: version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: follow-redirects "^1.14.7" @@ -3281,19 +3472,19 @@ bail@^2.0.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2, base-x@^3.0.6: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== base@^0.11.1: @@ -3316,14 +3507,14 @@ batch@0.6.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" big.js@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.1.1.tgz#63b35b19dc9775c94991ee5db7694880655d5537" + resolved "https://registry.npmjs.org/big.js/-/big.js-6.1.1.tgz" integrity sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg== bignumber.js@^9.0.1, bignumber.js@^9.0.2: @@ -3350,7 +3541,7 @@ binary-extensions@^1.0.0: binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.3.0, bindings@^1.5.0: @@ -3375,7 +3566,7 @@ bip32@^2.0.6: 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" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: @@ -3413,7 +3604,7 @@ bonjour@^3.5.0: borsh@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.3.1.tgz#c31c3a149610e37913deada80e89073fb15cf55b" + resolved "https://registry.npmjs.org/borsh/-/borsh-0.3.1.tgz" integrity sha512-gJoSTnhwLxN/i2+15Y7uprU8h3CKI+Co4YKZKvrGYUy0FwHWM20x5Sx7eU8Xv4HQqV+7rb4r3P7K1cBIQe3q8A== dependencies: "@types/bn.js" "^4.11.5" @@ -3423,7 +3614,7 @@ borsh@^0.3.1: borsh@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" + resolved "https://registry.npmjs.org/borsh/-/borsh-0.4.0.tgz" integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== dependencies: "@types/bn.js" "^4.11.5" @@ -3459,7 +3650,7 @@ brace-expansion@^1.1.7: braces@^2.3.1, braces@^2.3.2: version "2.3.2" - resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -3475,14 +3666,14 @@ braces@^2.3.1, braces@^2.3.2: braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-process-hrtime@^1.0.0: @@ -3512,7 +3703,7 @@ browserslist@^4.17.5: bs58@4.0.1, bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" @@ -3548,7 +3739,7 @@ buffer-layout@^1.2.0, buffer-layout@^1.2.1, buffer-layout@^1.2.2: buffer@6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz" integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== dependencies: base64-js "^1.3.1" @@ -3556,7 +3747,7 @@ buffer@6.0.1: buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -3564,14 +3755,14 @@ buffer@6.0.3, buffer@^6.0.1, buffer@^6.0.3, buffer@~6.0.3: bufferutil@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz" integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== dependencies: node-gyp-build "^4.3.0" builtins@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@3.0.0: @@ -3586,12 +3777,12 @@ bytes@3.1.1: bytes@^3.0.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0: version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: "@npmcli/fs" "^1.0.0" @@ -3643,12 +3834,12 @@ callsites@^3.0.0: camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: @@ -3662,29 +3853,29 @@ caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.300011 caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chai-as-promised@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz" integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== dependencies: check-error "^1.0.2" chai-bn@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.3.1.tgz#677cd3c0b58bae83ffe51604a811d0b3c6f41544" + resolved "https://registry.npmjs.org/chai-bn/-/chai-bn-0.3.1.tgz" integrity sha512-vuzEy0Cb+k8zqi2SHOmvZdRSbKcSOJfS1Nv8+6YDJIyCzfxkTCHLNRyjRIoRJ3WJtYb/c7OHjrvLoGeyO4A/gA== chai@=4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz" integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== dependencies: assertion-error "^1.1.0" @@ -3694,7 +3885,7 @@ chai@=4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3705,15 +3896,22 @@ chalk@^2.0.0, chalk@^2.4.2: chalk@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -3721,12 +3919,12 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: chalk@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.0.tgz#bd96c6bb8e02b96e08c0c3ee2a9d90e050c7b832" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.0.tgz" integrity sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ== chan@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/chan/-/chan-0.6.1.tgz#ec0ad132e5bc62c27ef10ccbfc4d8dcd8ca00640" + resolved "https://registry.npmjs.org/chan/-/chan-0.6.1.tgz" integrity sha1-7ArRMuW8YsJ+8QzL/E2NzYygBkA= char-regex@^1.0.2: @@ -3750,12 +3948,12 @@ character-reference-invalid@^2.0.0: check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= chokidar@^2.1.8: version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" @@ -3789,7 +3987,7 @@ chokidar@^3.5.2, chokidar@^3.5.3: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^3.2.0: @@ -3799,7 +3997,7 @@ ci-info@^3.2.0: cidr-regex@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" + resolved "https://registry.npmjs.org/cidr-regex/-/cidr-regex-3.1.1.tgz" integrity sha512-RBqYd32aDwbCMFJRL6wHOlDNYJsPNTt8vC82ErHF5vKt8QQzxm1FrkW8s/R5pVrXMf17sba09Uoy91PKiddAsw== dependencies: ip-regex "^4.1.0" @@ -3814,7 +4012,7 @@ cipher-base@^1.0.1, cipher-base@^1.0.3: circular-json@^0.5.9: version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz" integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== cjs-module-lexer@^1.0.0: @@ -3846,14 +4044,14 @@ clean-stack@^2.0.0: clean-stack@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz" integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== dependencies: escape-string-regexp "4.0.0" cli-columns@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-3.1.2.tgz#6732d972979efc2ae444a1f08e08fa139c96a18e" + resolved "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz" integrity sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4= dependencies: string-width "^2.0.0" @@ -3866,13 +4064,13 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-table3@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" - integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + version "0.6.2" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== dependencies: string-width "^4.2.0" optionalDependencies: - colors "1.4.0" + "@colors/colors" "1.5.0" cli-truncate@^2.1.0: version "2.1.0" @@ -3901,12 +4099,12 @@ cliui@^7.0.2: clone@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= cmd-shim@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" + resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz" integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== dependencies: mkdirp-infer-owner "^2.0.0" @@ -3917,7 +4115,7 @@ co@^4.6.0: code-point-at@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collect-v8-coverage@^1.0.0: @@ -3934,14 +4132,14 @@ collection-visit@^1.0.0: color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" @@ -3958,7 +4156,7 @@ color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: color-string@^1.6.0, color-string@^1.9.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz" integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== dependencies: color-name "^1.0.0" @@ -3966,12 +4164,12 @@ color-string@^1.6.0, color-string@^1.9.0: color-support@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== color@^3.1.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: color-convert "^1.9.3" @@ -3987,17 +4185,17 @@ color@^4.0.1: colorette@^1.2.1, colorette@^1.2.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colors@1.4.0, colors@^1.4.0: +colors@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== columnify@~1.5.4: version "1.5.4" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + resolved "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz" integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs= dependencies: strip-ansi "^3.0.0" @@ -4005,7 +4203,7 @@ columnify@~1.5.4: combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -4017,7 +4215,7 @@ comma-separated-tokens@^2.0.0: commander@^2.20.3: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^6.2.0: @@ -4026,12 +4224,12 @@ commander@^6.2.0: commander@^8.0.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== common-ancestor-path@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" + resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== component-emitter@^1.2.1: @@ -4071,7 +4269,7 @@ connect-history-api-fallback@^1.6.0: console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= content-disposition@0.5.4: @@ -4113,7 +4311,7 @@ core-js-pure@^3.0.0: core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= core-util-is@^1.0.2, core-util-is@~1.0.0: @@ -4143,7 +4341,7 @@ cosmiconfig@^7.0.0: cosmiconfig@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" @@ -4177,19 +4375,19 @@ create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@3.0.6: version "3.0.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz" integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== dependencies: node-fetch "2.6.1" cross-fetch@^3.1.4, cross-fetch@^3.1.5: version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" @@ -4220,7 +4418,7 @@ crypto-hash@^1.3.0: crypto-js@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== crypto-ts@^1.0.2: @@ -4243,7 +4441,7 @@ css-blank-pseudo@^0.1.4: css-color-names@^0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + resolved "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= css-has-pseudo@^0.10.0: @@ -4261,7 +4459,7 @@ css-prefers-color-scheme@^3.1.1: css-unit-converter@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz" integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== css.escape@^1.5.1: @@ -4288,7 +4486,7 @@ cssesc@^2.0.0: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssom@^0.4.4: @@ -4311,9 +4509,88 @@ csstype@^3.0.2: csv-parse@^5.0.4: version "5.0.4" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.0.4.tgz#97e5e654413bcf95f2714ce09bcb2be6de0eb8e3" + resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-5.0.4.tgz" integrity sha512-5AIdl8l6n3iYQYxan5djB5eKDa+vBnhfWZtRpJTcrETWfVLYN0WSj3L9RwvgYt+psoO77juUr8TG8qpfGZifVQ== +d3-array@2, d3-array@^2.3.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-color@1 - 2", d3-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" + integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== + +"d3-format@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" + integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== + +d3-format@^1.4.4: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +"d3-interpolate@1 - 2", "d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" + integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== + dependencies: + d3-color "1 - 2" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-scale-chromatic@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz#c13f3af86685ff91323dc2f0ebd2dabbd72d8bab" + integrity sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA== + dependencies: + d3-color "1 - 2" + d3-interpolate "1 - 2" + +d3-scale@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== + dependencies: + d3-array "^2.3.0" + d3-format "1 - 2" + d3-interpolate "1.2.0 - 2" + d3-time "^2.1.1" + d3-time-format "2 - 3" + +d3-shape@^1.2.2, d3-shape@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +"d3-time-format@2 - 3", d3-time-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" + integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== + dependencies: + d3-time "1 - 2" + +"d3-time@1 - 2", d3-time@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== + dependencies: + d3-array "2" + +d3-time@^1.0.11: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4331,12 +4608,12 @@ data-urls@^2.0.0: dataloader@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" + resolved "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== dayjs@^1.10.7: version "1.10.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz" integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== debug@2.6.9, debug@^2.2.0, debug@^2.3.3: @@ -4345,7 +4622,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: version "4.3.3" resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -4359,9 +4636,22 @@ debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" +debug@^4.2.0: + version "4.3.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" + dependencies: + ms "2.1.2" + +debug@^4.3.3: + 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" + debuglog@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= decamelize@^1.2.0: @@ -4371,17 +4661,17 @@ decamelize@^1.2.0: decimal.js-light@^2.5.1: version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== decimal.js@^10.2.1, decimal.js@^10.3.1: version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== decode-named-character-reference@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz#57b2bd9112659cacbc449d3577d7dadb8e1f3d1b" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.1.tgz" integrity sha512-YV/0HQHreRwKb7uBopyIkLG17jG6Sv2qUchk9qSoVJ2f+flwRsPNBO0hAnjt6mTNYUT+vw9Gy2ihXg4sUWPi2w== dependencies: character-entities "^2.0.0" @@ -4397,7 +4687,7 @@ dedent@^0.7.0: deep-eql@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== dependencies: type-detect "^4.0.0" @@ -4432,7 +4722,7 @@ default-gateway@^4.2.0: defaults@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= dependencies: clone "^1.0.2" @@ -4468,7 +4758,7 @@ define-property@^2.0.2: defined@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= del@^4.1.1: @@ -4486,7 +4776,7 @@ del@^4.1.1: delay@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== delayed-stream@~1.0.0: @@ -4495,17 +4785,17 @@ delayed-stream@~1.0.0: delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@^1.1.2, depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dequal@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz" integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== destroy@~1.0.4: @@ -4519,7 +4809,7 @@ detect-newline@^3.0.0: detect-node-es@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== detect-node@^2.0.4: @@ -4529,7 +4819,7 @@ detect-node@^2.0.4: detective@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + resolved "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== dependencies: acorn-node "^1.6.1" @@ -4538,7 +4828,7 @@ detective@^5.2.0: dezalgo@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= dependencies: asap "^2.0.0" @@ -4556,12 +4846,12 @@ diff-sequences@^27.5.1: diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== dir-glob@^3.0.1: @@ -4573,7 +4863,7 @@ dir-glob@^3.0.1: dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== dns-equal@^1.0.0: @@ -4625,7 +4915,7 @@ domexception@^2.0.1: dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -4633,7 +4923,7 @@ dot-case@^3.0.4: dotenv-expand@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-6.0.1.tgz#233328515e4b71091a6513e2ffe7e9a24b49bb0c" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-6.0.1.tgz" integrity sha512-GNHcCOyRKLCXWnH3L/+sJ04PQxxgTOZDCPuQQnqkqPMGIilyoxHZ2JUNmh2VWKCfzVKH/AZsqcbuSYlDDVb/xw== dotenv@10.0.0, dotenv@^10.0.0: @@ -4652,12 +4942,12 @@ dset@^2.0.1: duplexer@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" @@ -4679,7 +4969,7 @@ electron-to-chromium@^1.4.17: elliptic@^6.4.0, elliptic@^6.5.4: version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" @@ -4712,7 +5002,7 @@ encodeurl@~1.0.2: encoding@^0.1.12: version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: iconv-lite "^0.6.2" @@ -4724,9 +5014,9 @@ end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^5.7.0: - version "5.8.3" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4749,7 +5039,7 @@ err-code@^2.0.2: errno@^0.1.3: version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" @@ -4803,12 +5093,12 @@ es6-object-assign@^1.1.0: es6-promise@^4.0.3: version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promisify@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: es6-promise "^4.0.3" @@ -4829,7 +5119,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^2.0.0: @@ -4838,7 +5128,7 @@ escape-string-regexp@^2.0.0: escape-string-regexp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== escodegen@^2.0.0: @@ -4852,10 +5142,10 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== eslint-plugin-react-hooks@^4.3.0: version "4.3.0" @@ -4914,10 +5204,10 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7" - integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ== +eslint@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e" + integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q== dependencies: "@eslint/eslintrc" "^1.2.1" "@humanwhocodes/config-array" "^0.9.2" @@ -5047,7 +5337,7 @@ execa@^4.1.0: execa@^5.0.0: version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -5079,7 +5369,7 @@ expand-brackets@^2.1.4: expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: homedir-polyfill "^1.0.1" @@ -5149,7 +5439,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: extend@^3.0.0, extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extglob@^2.0.4: @@ -5166,24 +5456,19 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - eyes@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= fast-csv@^4.3.6: version "4.3.6" - resolved "https://registry.yarnpkg.com/fast-csv/-/fast-csv-4.3.6.tgz#70349bdd8fe4d66b1130d8c91820b64a21bc4a63" + resolved "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz" integrity sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw== dependencies: "@fast-csv/format" "4.3.5" @@ -5225,12 +5510,12 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: fastest-levenshtein@^1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz" integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== fastq@^1.6.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -5277,7 +5562,7 @@ fill-range@^4.0.0: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" @@ -5315,7 +5600,7 @@ find-up@^4.0.0, find-up@^4.1.0: find@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" + resolved "https://registry.npmjs.org/find/-/find-0.3.0.tgz" integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== dependencies: traverse-chain "~0.1.0" @@ -5328,17 +5613,19 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== flatten@^1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== focus-lock@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.10.1.tgz#5f46fa74fefb87144479c2f8e276f0eedd8081b2" - integrity sha512-b9yUklCi4fTu2GXn7dnaVf4hiLVVBp7xTiZarAHMODV2To6Bitf6F/UI67RmKbdgJQeVwI1UO0d9HYNbXt3GkA== + version "0.10.2" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.10.2.tgz#561c62bae8387ecba1dd8e58a6df5ec29835c644" + integrity sha512-DSaI/UHZ/02sg1P616aIWgToQcrKKBmcCvomDZ1PZvcJFj350PnWhSJxJ76T3e5/GbtQEARIACtbrdlrF9C5kA== dependencies: tslib "^2.0.3" @@ -5359,7 +5646,7 @@ foreach@^2.0.5: forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@^3.0.0: @@ -5382,7 +5669,7 @@ form-data@^4.0.0: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -5395,12 +5682,13 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.0.13: - version "4.0.13" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz" + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== fragment-cache@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" @@ -5411,9 +5699,9 @@ fresh@0.5.2: integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-extra@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + version "10.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5421,7 +5709,7 @@ fs-extra@^10.0.0: fs-extra@^8.1: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -5440,7 +5728,7 @@ fs-extra@^9.1.0: fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" @@ -5452,12 +5740,12 @@ fs.realpath@^1.0.0: fs@0.0.1-security, fs@^0.0.1-security: version "0.0.1-security" - resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= fsevents@^1.2.7: version "1.2.13" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" @@ -5470,7 +5758,7 @@ fsevents@^2.3.2, fsevents@~2.3.2: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: @@ -5495,7 +5783,7 @@ gauge@^3.0.0: gauge@~2.7.3: version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" @@ -5517,7 +5805,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: @@ -5530,7 +5818,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: get-nonce@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== get-own-enumerable-property-symbols@^3.0.0: @@ -5574,7 +5862,7 @@ get-value@^2.0.3, get-value@^2.0.6: getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" @@ -5601,7 +5889,7 @@ glob-parent@^6.0.1, glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -5613,7 +5901,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@^7.1.7, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.4: +glob@^7.1.1, glob@^7.1.3: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" dependencies: @@ -5648,7 +5936,13 @@ globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" -globals@^13.6.0, globals@^13.9.0: +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz" + dependencies: + type-fest "^0.20.2" + +globals@^13.9.0: version "13.12.0" resolved "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz" integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== @@ -5657,7 +5951,7 @@ globals@^13.6.0, globals@^13.9.0: globby@^11.0.1: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -5695,14 +5989,19 @@ graceful-fs@^4.1.11, graceful-fs@^4.2.4: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.8: +graceful-fs@^4.1.2, graceful-fs@^4.2.3, graceful-fs@^4.2.8: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== gzip-size@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: duplexer "^0.1.2" @@ -5726,12 +6025,12 @@ handlebars@^4.7.7: har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -5744,12 +6043,12 @@ has-bigints@^1.0.1: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.1, has-symbols@^1.0.2: @@ -5766,7 +6065,7 @@ has-tostringtag@^1.0.0: has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: @@ -5802,7 +6101,7 @@ has-values@^1.0.0: has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" @@ -5818,7 +6117,7 @@ hash-base@^3.0.0: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -5826,12 +6125,12 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: hex-color-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + resolved "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" @@ -5846,7 +6145,7 @@ hoist-non-react-statics@^3.3.1: homedir-polyfill@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== dependencies: parse-passwd "^1.0.0" @@ -5870,12 +6169,12 @@ hpack.js@^2.1.6: hsl-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + resolved "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz" integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= hsla-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + resolved "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= html-encoding-sniffer@^2.0.1: @@ -5895,12 +6194,12 @@ html-escaper@^2.0.0: html-tags@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== http-cache-semantics@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== http-deceiver@^1.2.7: @@ -5964,7 +6263,7 @@ http-proxy@^1.17.0: http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" @@ -5990,7 +6289,7 @@ human-signals@^2.1.0: humanize-ms@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= dependencies: ms "^2.0.0" @@ -6001,7 +6300,7 @@ husky@^6.0.0: i@^0.3.7: version "0.3.7" - resolved "https://registry.yarnpkg.com/i/-/i-0.3.7.tgz#2a7437a923d59c14b17243dc63a549af24d85799" + resolved "https://registry.npmjs.org/i/-/i-0.3.7.tgz" integrity sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q== iconv-lite@0.4.24: @@ -6013,19 +6312,19 @@ iconv-lite@0.4.24: iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore-walk@^3.0.3: version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz" integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== dependencies: minimatch "^3.0.4" @@ -6081,12 +6380,12 @@ indexes-of@^1.0.1: infer-owner@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" @@ -6094,7 +6393,7 @@ inflight@^1.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.3: @@ -6104,17 +6403,17 @@ inherits@2.0.3: ini@^1.3.4: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ini@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== init-package-json@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-2.0.5.tgz#78b85f3c36014db42d8f32117252504f68022646" + resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz" integrity sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA== dependencies: npm-package-arg "^8.1.5" @@ -6146,6 +6445,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -6153,7 +6457,7 @@ interpret@^1.0.0: invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" @@ -6165,7 +6469,7 @@ ip-regex@^2.1.0: ip-regex@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== ip@^1.1.0, ip@^1.1.5: @@ -6225,7 +6529,7 @@ is-arrayish@^0.2.1: is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: @@ -6244,7 +6548,7 @@ is-binary-path@^1.0.0: is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" @@ -6274,14 +6578,14 @@ is-callable@^1.1.4, is-callable@^1.2.4: is-cidr@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" + resolved "https://registry.npmjs.org/is-cidr/-/is-cidr-4.0.2.tgz" integrity sha512-z4a1ENUajDbEl/Q6/pVBpTR1nBjjEE1X7qb7bmWYanNnPoKAvUCPFKeXV6Fe4mgTkWKBqiHIcwsI3SndiO5FeA== dependencies: cidr-regex "^3.1.1" is-color-stop@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + resolved "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz" integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= dependencies: css-color-names "^0.0.4" @@ -6291,13 +6595,20 @@ is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.2.0, is-core-module@^2.8.1: version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" +is-core-module@^2.5.0: + 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== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" @@ -6335,7 +6646,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" @@ -6361,33 +6672,34 @@ is-extendable@^1.0.1: is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.7: version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + 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" @@ -6401,7 +6713,7 @@ is-glob@^3.1.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" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -6413,7 +6725,7 @@ is-hexadecimal@^2.0.0: is-lambda@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= is-nan@^1.2.1: @@ -6445,7 +6757,7 @@ is-number@^3.0.0: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: @@ -6556,7 +6868,7 @@ is-weakref@^1.0.1: is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: @@ -6566,7 +6878,7 @@ is-wsl@^1.1.0: is-wsl@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== dependencies: is-docker "^2.0.0" @@ -6594,7 +6906,7 @@ isobject@^3.0.0, isobject@^3.0.1: isomorphic-fetch@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz" integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== dependencies: node-fetch "^2.6.1" @@ -6602,12 +6914,12 @@ isomorphic-fetch@^3.0.0: isomorphic-ws@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^3.0.0: @@ -6648,7 +6960,7 @@ istanbul-reports@^3.0.2: jayson@^3.4.4: version "3.6.6" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" + resolved "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz" integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== dependencies: "@types/connect" "^3.4.33" @@ -7084,12 +7396,12 @@ jest@^27.4.5: js-sha256@^0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: @@ -7113,12 +7425,12 @@ js-yaml@^4.1.0: jsbi@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-4.1.0.tgz#f0c25ed8881bc09891334b03a3952efaa7add337" + resolved "https://registry.npmjs.org/jsbi/-/jsbi-4.1.0.tgz" integrity sha512-384Z4keIsJtYpnVggsxaB255MZctILbxv+ihtwoWPF7KNOlYHn1LFpRnUw5qsAspUAA2+I7qzjVJxVYtHVjxNw== jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.6.0: @@ -7178,12 +7490,12 @@ json-stable-stringify-without-jsonify@^1.0.1: json-stringify-nice@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" + resolved "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.3: @@ -7211,14 +7523,14 @@ jsonc-parser@^3.0.0: jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -7227,7 +7539,7 @@ jsonfile@^6.0.1: jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= jsprim@^1.2.2: @@ -7254,7 +7566,7 @@ just-diff-apply@^3.0.0: just-diff@^3.0.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647" + resolved "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz" integrity sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ== killable@^1.0.1: @@ -7291,7 +7603,7 @@ kleur@^3.0.3: kleur@^4.0.3: version "4.1.4" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz" integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== leven@^3.1.0: @@ -7314,7 +7626,7 @@ levn@~0.3.0: libnpmaccess@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec" + resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz" integrity sha512-sPeTSNImksm8O2b6/pf3ikv4N567ERYEpeKRPSmqlNt1dTZbvgpJIzg5vAhXHpw2ISBsELFRelk0jEahj1c6nQ== dependencies: aproba "^2.0.0" @@ -7324,7 +7636,7 @@ libnpmaccess@^4.0.2: libnpmdiff@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-2.0.4.tgz#bb1687992b1a97a8ea4a32f58ad7c7f92de53b74" + resolved "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-2.0.4.tgz" integrity sha512-q3zWePOJLHwsLEUjZw3Kyu/MJMYfl4tWCg78Vl6QGSfm4aXBUSVzMzjJ6jGiyarsT4d+1NH4B1gxfs62/+y9iQ== dependencies: "@npmcli/disparity-colors" "^1.0.1" @@ -7338,7 +7650,7 @@ libnpmdiff@^2.0.4: libnpmexec@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-2.0.1.tgz#729ae3e15a3ba225964ccf248117a75d311eeb73" + resolved "https://registry.npmjs.org/libnpmexec/-/libnpmexec-2.0.1.tgz" integrity sha512-4SqBB7eJvJWmUKNF42Q5qTOn20DRjEE4TgvEh2yneKlAiRlwlhuS9MNR45juWwmoURJlf2K43bozlVt7OZiIOw== dependencies: "@npmcli/arborist" "^2.3.0" @@ -7355,14 +7667,14 @@ libnpmexec@^2.0.1: libnpmfund@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-1.1.0.tgz#ee91313905b3194b900530efa339bc3f9fc4e5c4" + resolved "https://registry.npmjs.org/libnpmfund/-/libnpmfund-1.1.0.tgz" integrity sha512-Kfmh3pLS5/RGKG5WXEig8mjahPVOxkik6lsbH4iX0si1xxNi6eeUh/+nF1MD+2cgalsQif3O5qyr6mNz2ryJrQ== dependencies: "@npmcli/arborist" "^2.5.0" libnpmhook@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-6.0.3.tgz#1d7f0d7e6a7932fbf7ce0881fdb0ed8bf8748a30" + resolved "https://registry.npmjs.org/libnpmhook/-/libnpmhook-6.0.3.tgz" integrity sha512-3fmkZJibIybzmAvxJ65PeV3NzRc0m4xmYt6scui5msocThbEp4sKFT80FhgrCERYDjlUuFahU6zFNbJDHbQ++g== dependencies: aproba "^2.0.0" @@ -7370,7 +7682,7 @@ libnpmhook@^6.0.2: libnpmorg@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-2.0.3.tgz#4e605d4113dfa16792d75343824a0625c76703bc" + resolved "https://registry.npmjs.org/libnpmorg/-/libnpmorg-2.0.3.tgz" integrity sha512-JSGl3HFeiRFUZOUlGdiNcUZOsUqkSYrg6KMzvPZ1WVZ478i47OnKSS0vkPmX45Pai5mTKuwIqBMcGWG7O8HfdA== dependencies: aproba "^2.0.0" @@ -7378,7 +7690,7 @@ libnpmorg@^2.0.2: libnpmpack@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-2.0.1.tgz#d3eac25cc8612f4e7cdeed4730eee339ba51c643" + resolved "https://registry.npmjs.org/libnpmpack/-/libnpmpack-2.0.1.tgz" integrity sha512-He4/jxOwlaQ7YG7sIC1+yNeXeUDQt8RLBvpI68R3RzPMZPa4/VpxhlDo8GtBOBDYoU8eq6v1wKL38sq58u4ibQ== dependencies: "@npmcli/run-script" "^1.8.3" @@ -7387,7 +7699,7 @@ libnpmpack@^2.0.1: libnpmpublish@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-4.0.2.tgz#be77e8bf5956131bcb45e3caa6b96a842dec0794" + resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-4.0.2.tgz" integrity sha512-+AD7A2zbVeGRCFI2aO//oUmapCwy7GHqPXFJh3qpToSRNU+tXKJ2YFUgjt04LPPAf2dlEH95s6EhIHM1J7bmOw== dependencies: normalize-package-data "^3.0.2" @@ -7398,14 +7710,14 @@ libnpmpublish@^4.0.1: libnpmsearch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-3.1.2.tgz#aee81b9e4768750d842b627a3051abc89fdc15f3" + resolved "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-3.1.2.tgz" integrity sha512-BaQHBjMNnsPYk3Bl6AiOeVuFgp72jviShNBw5aHaHNKWqZxNi38iVNoXbo6bG/Ccc/m1To8s0GtMdtn6xZ1HAw== dependencies: npm-registry-fetch "^11.0.0" libnpmteam@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-2.0.4.tgz#9dbe2e18ae3cb97551ec07d2a2daf9944f3edc4c" + resolved "https://registry.npmjs.org/libnpmteam/-/libnpmteam-2.0.4.tgz" integrity sha512-FPrVJWv820FZFXaflAEVTLRWZrerCvfe7ZHSMzJ/62EBlho2KFlYKjyNEsPW3JiV7TLSXi3vo8u0gMwIkXSMTw== dependencies: aproba "^2.0.0" @@ -7413,7 +7725,7 @@ libnpmteam@^2.0.3: libnpmversion@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-1.2.1.tgz#689aa7fe0159939b3cbbf323741d34976f4289e9" + resolved "https://registry.npmjs.org/libnpmversion/-/libnpmversion-1.2.1.tgz" integrity sha512-AA7x5CFgBFN+L4/JWobnY5t4OAHjQuPbAwUYJ7/NtHuyLut5meb+ne/aj0n7PWNiTGCJcRw/W6Zd2LoLT7EZuQ== dependencies: "@npmcli/git" "^2.0.7" @@ -7502,7 +7814,7 @@ lodash-es@^4.17.21: lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= lodash.chunk@^4.2.0: @@ -7512,7 +7824,7 @@ lodash.chunk@^4.2.0: lodash.escaperegexp@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz" integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= lodash.flatmap@^4.5.0: @@ -7525,37 +7837,37 @@ lodash.get@^4.4.2: lodash.groupby@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" + resolved "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz" integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= lodash.isboolean@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= lodash.isfunction@^3.0.9: version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== lodash.isnil@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz#49e28cd559013458c814c5479d3c663a21bfaa6c" + resolved "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz" integrity sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw= lodash.isundefined@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" + resolved "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz" integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= lodash.mapvalues@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + resolved "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz" integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= lodash.merge@^4.6.2: @@ -7569,17 +7881,17 @@ lodash.orderby@^4.6.0: lodash.topath@^4.5.2: version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + resolved "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz" integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak= lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.0.0: @@ -7605,12 +7917,12 @@ loglevel@^1.6.8: long@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== longest-streak@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz" integrity sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: @@ -7621,7 +7933,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" @@ -7650,12 +7962,12 @@ make-dir@^3.0.0: make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== dependencies: agentkeepalive "^4.1.3" @@ -7695,7 +8007,7 @@ map-visit@^1.0.0: markdown-table@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.2.tgz#9b59eb2c1b22fe71954a65ff512887065a7bb57c" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.2.tgz" integrity sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA== marked@~2.0.3: @@ -7723,7 +8035,7 @@ mdast-util-definitions@^5.0.0: mdast-util-find-and-replace@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.1.0.tgz#69728acd250749f8aac6e150e07d1fd15619e829" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.1.0.tgz" integrity sha512-1w1jbqAd13oU78QPBf5223+xB+37ecNtQ1JElq2feWols5oEYAl+SgNDnOZipe7NfLemoEt362yUS15/wip4mw== dependencies: escape-string-regexp "^5.0.0" @@ -7748,7 +8060,7 @@ mdast-util-from-markdown@^1.0.0: mdast-util-gfm-autolink-literal@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz#4032dcbaddaef7d4f2f3768ed830475bb22d3970" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz" integrity sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg== dependencies: "@types/mdast" "^3.0.0" @@ -7758,7 +8070,7 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-gfm-footnote@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz#11d2d40a1a673a399c459e467fa85e00223191fe" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz" integrity sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw== dependencies: "@types/mdast" "^3.0.0" @@ -7767,7 +8079,7 @@ mdast-util-gfm-footnote@^1.0.0: mdast-util-gfm-strikethrough@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.1.tgz#a4a74c36864ec6a6e3bbd31e1977f29beb475789" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.1.tgz" integrity sha512-zKJbEPe+JP6EUv0mZ0tQUyLQOC+FADt0bARldONot/nefuISkaZFlmVK4tU6JgfyZGrky02m/I6PmehgAgZgqg== dependencies: "@types/mdast" "^3.0.0" @@ -7775,7 +8087,7 @@ mdast-util-gfm-strikethrough@^1.0.0: mdast-util-gfm-table@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.4.tgz#0dbb25f04fd9c0877dc63b76203ecbdf5d945755" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.4.tgz" integrity sha512-aEuoPwZyP4iIMkf2cLWXxx3EQ6Bmh2yKy9MVCg4i6Sd3cX80dcLEfXO/V4ul3pGH9czBK4kp+FAl+ZHmSUt9/w== dependencies: markdown-table "^3.0.0" @@ -7784,7 +8096,7 @@ mdast-util-gfm-table@^1.0.0: mdast-util-gfm-task-list-item@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz#6f35f09c6e2bcbe88af62fdea02ac199cc802c5c" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz" integrity sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA== dependencies: "@types/mdast" "^3.0.0" @@ -7792,7 +8104,7 @@ mdast-util-gfm-task-list-item@^1.0.0: mdast-util-gfm@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz#16fcf70110ae689a06d77e8f4e346223b64a0ea6" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz" integrity sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ== dependencies: mdast-util-from-markdown "^1.0.0" @@ -7820,7 +8132,7 @@ mdast-util-to-hast@^11.0.0: mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz#38b6cdc8dc417de642a469c4fc2abdf8c931bd1e" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz" integrity sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA== dependencies: "@types/mdast" "^3.0.0" @@ -7866,7 +8178,7 @@ merge-stream@^2.0.0: merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== methods@~1.1.2: @@ -7876,7 +8188,7 @@ methods@~1.1.2: micromark-core-commonmark@^1.0.0: version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz" integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== dependencies: decode-named-character-reference "^1.0.0" @@ -7919,7 +8231,7 @@ micromark-core-commonmark@^1.0.1: micromark-extension-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz" integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== dependencies: micromark-util-character "^1.0.0" @@ -7930,7 +8242,7 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-extension-gfm-footnote@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz" integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== dependencies: micromark-core-commonmark "^1.0.0" @@ -7944,7 +8256,7 @@ micromark-extension-gfm-footnote@^1.0.0: micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz" integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== dependencies: micromark-util-chunked "^1.0.0" @@ -7956,7 +8268,7 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-extension-gfm-table@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz" integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== dependencies: micromark-factory-space "^1.0.0" @@ -7967,14 +8279,14 @@ micromark-extension-gfm-table@^1.0.0: micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz" integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== dependencies: micromark-util-types "^1.0.0" micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz" integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== dependencies: micromark-factory-space "^1.0.0" @@ -7985,7 +8297,7 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-extension-gfm@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz" integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== dependencies: micromark-extension-gfm-autolink-literal "^1.0.0" @@ -8084,7 +8396,7 @@ micromark-util-decode-numeric-character-reference@^1.0.0: micromark-util-decode-string@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz" integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== dependencies: decode-named-character-reference "^1.0.0" @@ -8215,19 +8527,31 @@ mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + mime-types@^2.1.12: version "2.1.30" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz" dependencies: mime-db "1.47.0" -mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@~2.1.17, mime-types@~2.1.24: version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" +mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" @@ -8264,26 +8588,21 @@ minimatch@^3.0.0, minimatch@^3.0.4, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1: +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== -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - minipass-collect@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: minipass "^3.0.0" minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== dependencies: minipass "^3.1.0" @@ -8294,14 +8613,14 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" minipass-json-stream@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz" integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== dependencies: jsonparse "^1.3.1" @@ -8309,14 +8628,14 @@ minipass-json-stream@^1.0.1: minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass-sized@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: minipass "^3.0.0" @@ -8330,7 +8649,7 @@ minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: minizlib@^2.0.0, minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -8346,38 +8665,45 @@ mixin-deep@^1.2.0: mkdirp-infer-owner@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + resolved "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz" integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== dependencies: chownr "^2.0.0" infer-owner "^1.0.4" mkdirp "^1.0.3" -mkdirp@^0.5.1, mkdirp@^0.5.5: +mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== modern-normalize@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" + resolved "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz" integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== mrmime@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz" integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== ms@2.0.0: @@ -8392,7 +8718,7 @@ ms@2.1.2: ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns-service-types@^1.1.0: @@ -8410,7 +8736,7 @@ multicast-dns@^6.0.1: mute-stream@~0.0.4: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== mz@^2.7.0: @@ -8432,16 +8758,16 @@ nanoclone@^0.2.1: resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== -nanoid@^3.1.22: - version "3.3.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.0.tgz#5906f776fd886c66c24f3653e0c46fcb1d4ad6b0" - integrity sha512-JzxqqT5u/x+/KOFSd7JP15DOo9nOoHpx6DYatqIHUW2+flybkm+mdcraotSQR5WcnZr+qhGVh8Ted0KdfSMxlg== - -nanoid@^3.1.30, nanoid@^3.3.1: +nanoid@^3.1.30: version "3.3.2" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== +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== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" @@ -8461,11 +8787,12 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.2: version "0.6.2" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== negotiator@^0.6.2: @@ -8478,10 +8805,10 @@ neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-router-mock@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/next-router-mock/-/next-router-mock-0.6.3.tgz" - integrity sha512-CHMg8ci0Cg10t4nVClgYuWf7rc4Ipj9MvcgY36U+4RSb7CHsSZhn9XX4ZeQzACMQ4gTx5I9IwlX7iDb2/L5X2w== +next-router-mock@^0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/next-router-mock/-/next-router-mock-0.6.7.tgz#8883ed81f245074462e72199fe94002cd85db5e2" + integrity sha512-y3yFyTkplpmvCpy1TnOuMTUQDLt2wg9RwTwvg9WcCRko4lqkBYAQM+ph5sqtNpKQ1xngDwzjPjshVBQJvhb/hg== next-themes@^0.1.1: version "0.1.1" @@ -8496,28 +8823,28 @@ next-transpile-modules@^8.0.0: enhanced-resolve "^5.7.0" escalade "^3.1.1" -next@^12.1.4: - version "12.1.4" - resolved "https://registry.yarnpkg.com/next/-/next-12.1.4.tgz#597a9bdec7aec778b442c4f6d41afd2c64a54b23" - integrity sha512-DA4g97BM4Z0nKtDvCTm58RxdvoQyYzeg0AeVbh0N4Y/D8ELrNu47lQeEgRGF8hV4eQ+Sal90zxrJQQG/mPQ8CQ== +next@^12.1.5: + version "12.1.5" + resolved "https://registry.yarnpkg.com/next/-/next-12.1.5.tgz#7a07687579ddce61ee519493e1c178d83abac063" + integrity sha512-YGHDpyfgCfnT5GZObsKepmRnne7Kzp7nGrac07dikhutWQug7hHg85/+sPJ4ZW5Q2pDkb+n0FnmLkmd44htIJQ== dependencies: - "@next/env" "12.1.4" + "@next/env" "12.1.5" caniuse-lite "^1.0.30001283" postcss "8.4.5" styled-jsx "5.0.1" optionalDependencies: - "@next/swc-android-arm-eabi" "12.1.4" - "@next/swc-android-arm64" "12.1.4" - "@next/swc-darwin-arm64" "12.1.4" - "@next/swc-darwin-x64" "12.1.4" - "@next/swc-linux-arm-gnueabihf" "12.1.4" - "@next/swc-linux-arm64-gnu" "12.1.4" - "@next/swc-linux-arm64-musl" "12.1.4" - "@next/swc-linux-x64-gnu" "12.1.4" - "@next/swc-linux-x64-musl" "12.1.4" - "@next/swc-win32-arm64-msvc" "12.1.4" - "@next/swc-win32-ia32-msvc" "12.1.4" - "@next/swc-win32-x64-msvc" "12.1.4" + "@next/swc-android-arm-eabi" "12.1.5" + "@next/swc-android-arm64" "12.1.5" + "@next/swc-darwin-arm64" "12.1.5" + "@next/swc-darwin-x64" "12.1.5" + "@next/swc-linux-arm-gnueabihf" "12.1.5" + "@next/swc-linux-arm64-gnu" "12.1.5" + "@next/swc-linux-arm64-musl" "12.1.5" + "@next/swc-linux-x64-gnu" "12.1.5" + "@next/swc-linux-x64-musl" "12.1.5" + "@next/swc-win32-arm64-msvc" "12.1.5" + "@next/swc-win32-ia32-msvc" "12.1.5" + "@next/swc-win32-x64-msvc" "12.1.5" nice-try@^1.0.4: version "1.0.5" @@ -8526,7 +8853,7 @@ nice-try@^1.0.4: no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -8534,7 +8861,7 @@ no-case@^3.0.4: node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-emoji@^1.11.0: @@ -8551,7 +8878,7 @@ node-fetch@2.6.1, node-fetch@^2.6.1: node-fetch@2.6.7: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" @@ -8563,12 +8890,12 @@ node-forge@^0.10.0: node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== node-gyp@^7.1.0, node-gyp@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz" integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== dependencies: env-paths "^2.2.0" @@ -8601,14 +8928,14 @@ node-releases@^2.0.1: nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" normalize-package-data@^3.0.0, normalize-package-data@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" @@ -8625,7 +8952,7 @@ normalize-path@^2.1.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" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: @@ -8634,33 +8961,33 @@ normalize-range@^0.1.2: npm-audit-report@^2.1.5: version "2.1.5" - resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-2.1.5.tgz#a5b8850abe2e8452fce976c8960dd432981737b5" + resolved "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-2.1.5.tgz" integrity sha512-YB8qOoEmBhUH1UJgh1xFAv7Jg1d+xoNhsDYiFQlEFThEBui0W1vIz2ZK6FVg4WZjwEdl7uBQlm1jy3MUfyHeEw== dependencies: chalk "^4.0.0" npm-bundled@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" npm-install-checks@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz" integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== dependencies: semver "^7.1.1" npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-package-arg@^8.1.1, npm-package-arg@^8.1.2, npm-package-arg@^8.1.5: version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz" integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== dependencies: hosted-git-info "^4.0.1" @@ -8669,7 +8996,7 @@ npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.0, npm-pack npm-packlist@^2.1.4: version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz" integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== dependencies: glob "^7.1.6" @@ -8679,7 +9006,7 @@ npm-packlist@^2.1.4: npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz" integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== dependencies: npm-install-checks "^4.0.0" @@ -8689,14 +9016,14 @@ npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1: npm-profile@^5.0.3: version "5.0.4" - resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-5.0.4.tgz#73e5bd1d808edc2c382d7139049cc367ac43161b" + resolved "https://registry.npmjs.org/npm-profile/-/npm-profile-5.0.4.tgz" integrity sha512-OKtU7yoAEBOnc8zJ+/uo5E4ugPp09sopo+6y1njPp+W99P8DvQon3BJYmpvyK2Bf1+3YV5LN1bvgXRoZ1LUJBA== dependencies: npm-registry-fetch "^11.0.0" npm-registry-fetch@^11.0.0: version "11.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz" integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== dependencies: make-fetch-happen "^9.0.1" @@ -8722,12 +9049,12 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: npm-user-validate@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.1.tgz#31428fc5475fe8416023f178c0ab47935ad8c561" + resolved "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-1.0.1.tgz" integrity sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw== npm@^7.24.1: version "7.24.2" - resolved "https://registry.yarnpkg.com/npm/-/npm-7.24.2.tgz#861117af8241bea592289f22407230e5300e59ca" + resolved "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz" integrity sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ== dependencies: "@isaacs/string-locale-compare" "^1.1.0" @@ -8803,7 +9130,7 @@ npm@^7.24.1: npmlog@^4.1.2: version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" @@ -8813,7 +9140,7 @@ npmlog@^4.1.2: npmlog@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== dependencies: are-we-there-yet "^2.0.0" @@ -8827,7 +9154,7 @@ num2fraction@^1.2.2: number-is-nan@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwsapi@^2.2.0: @@ -8836,12 +9163,12 @@ nwsapi@^2.2.0: oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: @@ -8855,7 +9182,7 @@ object-copy@^0.1.0: object-hash@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== object-hash@^2.2.0: @@ -8959,7 +9286,7 @@ on-headers@~1.0.2: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" @@ -8973,7 +9300,7 @@ onetime@^5.1.0, onetime@^5.1.2: opener@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== opn@^5.5.0: @@ -9063,7 +9390,7 @@ p-try@^2.0.0: pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5: version "11.3.5" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2" + resolved "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz" integrity sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg== dependencies: "@npmcli/git" "^2.1.0" @@ -9088,7 +9415,7 @@ pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5: pako@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + resolved "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz" integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== parent-module@^1.0.0: @@ -9100,7 +9427,7 @@ parent-module@^1.0.0: parse-conflict-json@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz#54ec175bde0f2d70abf6be79e0e042290b86701b" + resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz" integrity sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw== dependencies: json-parse-even-better-errors "^2.3.0" @@ -9131,7 +9458,7 @@ parse-json@^5.0.0: parse-passwd@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= parse5@6.0.1: @@ -9165,7 +9492,7 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.2: @@ -9184,32 +9511,32 @@ path-key@^3.0.0, path-key@^3.1.0: path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picocolors@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0: @@ -9219,7 +9546,7 @@ picocolors@^1.0.0: picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.0.0: @@ -9271,7 +9598,7 @@ please-upgrade-node@^3.2.0: polished@^4.1.3: version "4.1.4" - resolved "https://registry.yarnpkg.com/polished/-/polished-4.1.4.tgz#640293ba834109614961a700fdacbb6599fb12d0" + resolved "https://registry.npmjs.org/polished/-/polished-4.1.4.tgz" integrity sha512-Nq5Mbza+Auo7N3sQb1QMFaQiDO+4UexWuSGR7Cjb4Sw11SZIJcrrFtiZ+L0jT9MBsUsxDboHVASbCLbE1rnECg== dependencies: "@babel/runtime" "^7.16.7" @@ -9414,7 +9741,7 @@ postcss-initial@^3.0.0: postcss-js@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz" integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== dependencies: camelcase-css "^2.0.1" @@ -9592,22 +9919,14 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: postcss@8.4.5: version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== dependencies: nanoid "^3.1.30" picocolors "^1.0.0" source-map-js "^1.0.1" -postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.35" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz" - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.32: +postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -9615,7 +9934,7 @@ postcss@^7.0.32: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.1.6, postcss@^8.3.5, postcss@^8.4.6: +postcss@^8.1.6, postcss@^8.1.8, postcss@^8.2.12, postcss@^8.3.5, postcss@^8.4.6: version "8.4.12" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== @@ -9624,23 +9943,6 @@ postcss@^8.1.6, postcss@^8.3.5, postcss@^8.4.6: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.1.8: - version "8.2.13" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.2.13.tgz" - dependencies: - colorette "^1.2.2" - nanoid "^3.1.22" - source-map "^0.6.1" - -postcss@^8.2.12: - version "8.4.4" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz" - integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -9649,10 +9951,14 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" -prettier@^2.5.1, prettier@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== +prettier@^2.0.2: + version "2.2.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz" + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== pretty-format@^26.6.2: version "26.6.2" @@ -9674,12 +9980,12 @@ pretty-format@^27.0.0, pretty-format@^27.4.2, pretty-format@^27.5.1: pretty-hrtime@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + resolved "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz" integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= proc-log@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-1.0.0.tgz#0d927307401f69ed79341e83a0b2c9a13395eb77" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz" integrity sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg== process-nextick-args@~2.0.0: @@ -9694,22 +10000,22 @@ progress@^2.0.3: promise-all-reject-late@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" + resolved "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz" integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== promise-call-limit@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.1.tgz#4bdee03aeb85674385ca934da7114e9bcd3c6e24" + resolved "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz" integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q== promise-inflight@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise-retry@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" @@ -9717,7 +10023,7 @@ promise-retry@^2.0.1: prompt-sync@^4.1.6: version "4.2.0" - resolved "https://registry.yarnpkg.com/prompt-sync/-/prompt-sync-4.2.0.tgz#0198f73c5b70e3b03e4b9033a50540a7c9a1d7f4" + resolved "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz" integrity sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw== dependencies: strip-ansi "^5.0.0" @@ -9731,7 +10037,7 @@ prompts@^2.0.1: promzard@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + resolved "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz" integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= dependencies: read "1" @@ -9757,7 +10063,7 @@ property-information@^6.0.0: protobufjs@^6.10.2, protobufjs@^6.8.8: version "6.11.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz" integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== dependencies: "@protobufjs/aspromise" "^1.1.2" @@ -9789,7 +10095,7 @@ prr@~1.0.1: psl@^1.1.28, psl@^1.1.33: version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pump@^3.0.0: @@ -9821,7 +10127,7 @@ purgecss@^4.0.3: qrcode-terminal@^0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" + resolved "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== qs@6.9.6: @@ -9846,12 +10152,12 @@ querystringify@^2.1.1: queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== range-parser@^1.2.1, range-parser@~1.2.1: @@ -9926,19 +10232,19 @@ rc-util@^5.16.1, rc-util@^5.2.1, rc-util@^5.3.0, rc-util@^5.5.0: react-clientside-effect@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz#e2c4dc3c9ee109f642fac4f5b6e9bf5bcd2219a3" + resolved "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz" integrity sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA== dependencies: "@babel/runtime" "^7.12.13" react-content-loader@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/react-content-loader/-/react-content-loader-6.1.0.tgz#6b06be3889d2480ae909be0374a6062a36a53dec" + resolved "https://registry.npmjs.org/react-content-loader/-/react-content-loader-6.1.0.tgz" integrity sha512-S4/+doQrNs0PGDgUYCGGfdFjGax8dMQzYkWcSSxfaUcUjFkbnikWARuX9lWkglocIVhxnn3lxNb6uEWFFUzNUw== react-device-detect@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-2.1.2.tgz#60abb6fa361ec4cc839469a0c4c3e9b8ea17d6b5" + resolved "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.1.2.tgz" integrity sha512-N42xttwez3ECgu4KpOL2ICesdfoz8NCBfmc1rH9FRYSjH7NmMyANPSrQ3EvAtJyj/6TzJNhrANSO38iXjCB2Ug== dependencies: ua-parser-js "^0.7.30" @@ -9953,7 +10259,7 @@ react-dom@^18.0.0: react-focus-lock@^2.5.2: version "2.7.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.7.1.tgz#a9fbb3fa4efaee32162406e5eb96ae658964193b" + resolved "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.7.1.tgz" integrity sha512-ImSeVmcrLKNMqzUsIdqOkXwTVltj79OPu43oT8tVun7eIckA4VdM7UmYUFo3H/UC2nRVgagMZGFnAOQEDiDYcA== dependencies: "@babel/runtime" "^7.0.0" @@ -9965,12 +10271,12 @@ react-focus-lock@^2.5.2: react-headless-pagination@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/react-headless-pagination/-/react-headless-pagination-0.1.0.tgz#5a8a7ff68c79466b411dd877b5f16724c472e678" + resolved "https://registry.npmjs.org/react-headless-pagination/-/react-headless-pagination-0.1.0.tgz" integrity sha512-B+t+9PafVL4M0SYoVwcPelmWvnGzvTijF1BI0iHcq44vXy1brwFi62d8a8GlipIxvvBIYoghmVqTLiFmlElG1A== react-icons@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz" integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: @@ -9981,6 +10287,11 @@ react-is@^17.0.0, react-is@^17.0.1: version "17.0.2" resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + react-markdown@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-7.0.0.tgz" @@ -10009,7 +10320,7 @@ react-portal@^4.2.2: react-remove-scroll-bar@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz#d4d545a7df024f75d67e151499a6ab5ac97c8cdd" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz" integrity sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg== dependencies: react-style-singleton "^2.1.0" @@ -10017,7 +10328,7 @@ react-remove-scroll-bar@^2.1.0: react-remove-scroll@^2.4.3: version "2.4.3" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.4.3.tgz#83d19b02503b04bd8141ed6e0b9e6691a2e935a6" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.3.tgz" integrity sha512-lGWYXfV6jykJwbFpsuPdexKKzp96f3RbvGapDSIdcyGvHb7/eqyn46C7/6h+rUzYar1j5mdU+XECITHXCKBk9Q== dependencies: react-remove-scroll-bar "^2.1.0" @@ -10028,7 +10339,7 @@ react-remove-scroll@^2.4.3: react-style-singleton@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.1.tgz#ce7f90b67618be2b6b94902a30aaea152ce52e66" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz" integrity sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA== dependencies: get-nonce "^1.0.0" @@ -10037,24 +10348,24 @@ react-style-singleton@^2.1.0: react-use-gesture@^9.1.3: version "9.1.3" - resolved "https://registry.yarnpkg.com/react-use-gesture/-/react-use-gesture-9.1.3.tgz#92bd143e4f58e69bd424514a5bfccba2a1d62ec0" + resolved "https://registry.npmjs.org/react-use-gesture/-/react-use-gesture-9.1.3.tgz" integrity sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg== -react@^18.0.0: - version "18.0.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" - integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A== +react@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== dependencies: loose-envify "^1.1.0" read-cmd-shim@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" + resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz" integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz" integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== dependencies: json-parse-even-better-errors "^2.3.0" @@ -10062,7 +10373,7 @@ read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2, read-package-json- read-package-json@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.1.tgz#153be72fce801578c1c86b8ef2b21188df1b9eea" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.1.tgz" integrity sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw== dependencies: glob "^7.1.1" @@ -10072,7 +10383,7 @@ read-package-json@^4.1.1: read@1, read@^1.0.7, read@~1.0.1, read@~1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" @@ -10101,7 +10412,7 @@ readable-stream@^3.0.6, readable-stream@^3.6.0: readdir-scoped-modules@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" + resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== dependencies: debuglog "^1.0.1" @@ -10120,14 +10431,14 @@ readdirp@^2.2.1: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" readline-sync@^1.4.10: version "1.4.10" - resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.10.tgz#41df7fbb4b6312d673011594145705bf56d8873b" + resolved "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz" integrity sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw== rechoir@^0.6.2: @@ -10147,7 +10458,7 @@ redent@^3.0.0: reduce-css-calc@^2.1.8: version "2.1.8" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz" integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== dependencies: css-unit-converter "^1.1.1" @@ -10155,7 +10466,7 @@ reduce-css-calc@^2.1.8: regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4: version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regex-not@^1.0.0, regex-not@^1.0.2: @@ -10180,7 +10491,7 @@ regexpp@^3.2.0: remark-gfm@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== dependencies: "@types/mdast" "^3.0.0" @@ -10224,7 +10535,7 @@ repeat-string@^1.6.1: request@^2.88.2: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -10282,7 +10593,7 @@ resolve-cwd@^3.0.0: resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: expand-tilde "^2.0.0" @@ -10347,22 +10658,22 @@ retry@^0.12.0: retry@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rgb-regex@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + resolved "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz" integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= rgba-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + resolved "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= rimraf@^2.6.3: @@ -10389,7 +10700,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rpc-websockets@^7.4.12: version "7.4.17" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.17.tgz#f38845dd96db0442bff9e15fba9df781beb44cc0" + resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.17.tgz" integrity sha512-eolVi/qlXS13viIUH9aqrde902wzSLAai0IjmOZSRefp5I3CSG/vCnD0c0fDSYCWuEyUoRL1BHQA8K1baEUyow== dependencies: "@babel/runtime" "^7.11.2" @@ -10403,7 +10714,7 @@ rpc-websockets@^7.4.12: rpc-websockets@^7.4.2: version "7.4.16" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.16.tgz#eb701cdef577d4357ba5f526d50e25f370396fac" + resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.16.tgz" integrity sha512-0b7OVhutzwRIaYAtJo5tqtaQTWKfwAsKnaThOSOy+VkhVdleNUgb8eZnWSdWITRZZEigV5uPEIDr5KZe4DBrdQ== dependencies: "@babel/runtime" "^7.11.2" @@ -10417,7 +10728,7 @@ rpc-websockets@^7.4.2: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" @@ -10430,7 +10741,7 @@ rxjs@6, rxjs@^6.6.7: sade@^1.7.3: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" @@ -10442,7 +10753,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, 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" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: @@ -10480,7 +10791,7 @@ schema-utils@^1.0.0: secp256k1@^4.0.2: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -10510,7 +10821,8 @@ semver@^5.5.0: semver@^6.0.0, semver@^6.3.0: version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" @@ -10568,7 +10880,7 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: set-interval-async@1.0.34: version "1.0.34" - resolved "https://registry.yarnpkg.com/set-interval-async/-/set-interval-async-1.0.34.tgz#3dcd299ce0067f11b73b23b69aa68872d46ce805" + resolved "https://registry.npmjs.org/set-interval-async/-/set-interval-async-1.0.34.tgz" integrity sha512-wwDVmeXwOaumkZ7FizY0ux8N0fk4KM1Bq7DfBGHxjD/NSSjcvSlj4D6HHIxzu415QngUr0YW97TXl/s1Ou/BHQ== dependencies: "@babel/runtime" "7.5.0" @@ -10664,14 +10976,14 @@ signal-exit@^3.0.2: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= dependencies: is-arrayish "^0.3.1" sirv@^1.0.7: version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== dependencies: "@polka/url" "^1.0.0-next.20" @@ -10710,7 +11022,7 @@ smart-buffer@^4.2.0: snake-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: dot-case "^3.0.4" @@ -10768,15 +11080,15 @@ sockjs@^0.3.21: websocket-driver "^0.7.4" socks-proxy-agent@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87" - integrity sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew== + version "6.2.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz#f6b5229cc0cbd6f2f202d9695f09d871e951c85e" + integrity sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ== dependencies: agent-base "^6.0.2" - debug "^4.3.1" - socks "^2.6.1" + debug "^4.3.3" + socks "^2.6.2" -socks@^2.6.1: +socks@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== @@ -10826,7 +11138,7 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@^0.7.3: @@ -10840,7 +11152,7 @@ space-separated-tokens@^2.0.0: spdx-correct@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" @@ -10848,12 +11160,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -10915,7 +11227,7 @@ sshpk@^1.7.0: ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" @@ -10957,7 +11269,7 @@ string-similarity@^4.0.3: string-width@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" @@ -10975,7 +11287,7 @@ string-width@^1.0.1: string-width@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" @@ -11044,7 +11356,7 @@ stringify-object@^3.3.0: stringify-package@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" + resolved "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz" integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== strip-ansi@^3.0.0, strip-ansi@^3.0.1: @@ -11056,7 +11368,7 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: strip-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -11077,7 +11389,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-bom@^4.0.0: @@ -11086,16 +11398,17 @@ strip-bom@^4.0.0: strip-eof@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" @@ -11106,7 +11419,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: style-to-object@^0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== dependencies: inline-style-parser "0.1.1" @@ -11118,7 +11431,7 @@ styled-jsx@5.0.1: stylis@4.0.13: version "4.0.13" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz" integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag== superstruct@0.8.3: @@ -11131,17 +11444,22 @@ superstruct@0.8.3: superstruct@^0.14.2: version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz" integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== -superstruct@^0.15.2, superstruct@^0.15.4: +superstruct@^0.15.2: + version "0.15.3" + resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.15.3.tgz" + integrity sha512-wilec1Rg3FtKuRjRyCt70g5W29YUEuaLnybdVQUI+VQ7m0bw8k7TzrRv5iYmo6IpjLVrwxP5t3RgjAVqhYh4Fg== + +superstruct@^0.15.4: version "0.15.4" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.4.tgz#e3381dd84ca07e704e19f69eda74eee1a5efb1f9" integrity sha512-eOoMeSbP9ZJChNOm/9RYjE+F36rYR966AAqeG3xhQB02j2sfAUXDp4EQ/7bAOqnlJnuFDB8yvOu50SocvKpUEw== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" @@ -11155,7 +11473,7 @@ supports-color@^6.1.0: supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -11181,7 +11499,8 @@ supports-preserve-symlinks-flag@^1.0.0: symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tailwindcss@^2.2.7: version "2.2.19" @@ -11250,12 +11569,12 @@ tailwindcss@^3.0.23: tapable@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2, tar@^6.1.0, tar@^6.1.11: version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" @@ -11282,24 +11601,24 @@ test-exclude@^6.0.0: text-encoding-utf-8@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" @@ -11311,7 +11630,7 @@ throat@^6.0.1: "through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= thunky@^1.0.2: @@ -11330,7 +11649,7 @@ tiny-invariant@^1.0.6, tiny-invariant@^1.2.0: tiny-relative-date@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" + resolved "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== tiny-secp256k1@^1.1.3: @@ -11346,7 +11665,7 @@ tiny-secp256k1@^1.1.3: tiny-warning@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== tippy.js@^6.3.1: @@ -11358,7 +11677,7 @@ tippy.js@^6.3.1: tmp@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== dependencies: rimraf "^3.0.0" @@ -11389,7 +11708,7 @@ to-regex-range@^2.1.0: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" @@ -11406,7 +11725,7 @@ to-regex@^3.0.1, to-regex@^3.0.2: toformat@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" + resolved "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz" integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== toidentifier@1.0.1: @@ -11416,7 +11735,7 @@ toidentifier@1.0.1: toml@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + resolved "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== toposort@^2.0.2: @@ -11426,7 +11745,7 @@ toposort@^2.0.2: totalist@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== tough-cookie@^4.0.0: @@ -11439,7 +11758,7 @@ tough-cookie@^4.0.0: tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -11453,17 +11772,17 @@ tr46@^2.0.2: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= traverse-chain@~0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" + resolved "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz" integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= treeverse@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-1.0.4.tgz#a6b0ebf98a1bca6846ddc7ecbc900df08cb9cd5f" + resolved "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz" integrity sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g== trough@^2.0.0: @@ -11492,7 +11811,7 @@ ts-node@^10.7.0: ts-poet@^4.5.0: version "4.10.0" - resolved "https://registry.yarnpkg.com/ts-poet/-/ts-poet-4.10.0.tgz#8732374655e87f8f833e5d110938e346713e8c66" + resolved "https://registry.npmjs.org/ts-poet/-/ts-poet-4.10.0.tgz" integrity sha512-V5xzt+LDMVtxWvK12WVwHhGHTA//CeoPdWOqka0mMjlRqq7RPKYSfWEnzJdMmhNbd34BwZuZpip4mm+nqEcbQA== dependencies: lodash "^4.17.15" @@ -11500,7 +11819,7 @@ ts-poet@^4.5.0: ts-proto-descriptors@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/ts-proto-descriptors/-/ts-proto-descriptors-1.6.0.tgz#ca6eafc882495a2e920da5b981d7b181b4e49c38" + resolved "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.6.0.tgz" integrity sha512-Vrhue2Ti99us/o76mGy28nF3W/Uanl1/8detyJw2yyRwiBC5yxy+hEZqQ/ZX2PbZ1vyCpJ51A9L4PnCCnkBMTQ== dependencies: long "^4.0.0" @@ -11508,7 +11827,7 @@ ts-proto-descriptors@1.6.0: ts-proto@^1.79.0: version "1.107.0" - resolved "https://registry.yarnpkg.com/ts-proto/-/ts-proto-1.107.0.tgz#35a97bddfad9fb247b1b1a5e31865578b5ebfee0" + resolved "https://registry.npmjs.org/ts-proto/-/ts-proto-1.107.0.tgz" integrity sha512-g9/x0Uh/gov5gG0w/0ulNV2W6RXmBYc12Z3pSLbMKMDvrmEOAvYCbPl8qxAiu9DCNh6gY7asO9aVrP6+2QNWCA== dependencies: "@types/object-hash" "^1.3.0" @@ -11518,14 +11837,14 @@ ts-proto@^1.79.0: ts-poet "^4.5.0" ts-proto-descriptors "1.6.0" -tsconfig-paths@^3.12.0: - version "3.12.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz" - integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: @@ -11535,7 +11854,7 @@ tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.21.0: @@ -11547,19 +11866,19 @@ tsutils@^3.21.0: tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= tweetnacl@^1.0.0, tweetnacl@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== twin.macro@^2.4.0, twin.macro@^2.8.2: @@ -11597,7 +11916,7 @@ type-check@~0.3.2: type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: @@ -11618,7 +11937,8 @@ type-is@~1.6.18: typedarray-to-buffer@^3.1.5: version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" @@ -11654,20 +11974,30 @@ typeforce@^1.11.5: resolved "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz" integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== -typescript@^4.1.2, typescript@^4.2.4, typescript@^4.5.4, typescript@^4.5.5, typescript@^4.6.3: +typescript@^4.1.2, typescript@^4.5.4: + version "4.5.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +typescript@^4.2.4: + version "4.6.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz" + integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== + +typescript@^4.5.5, typescript@^4.6.3: version "4.6.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== ua-parser-js@^0.7.30: version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz" integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== uglify-js@^3.1.4: - version "3.15.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.2.tgz#1ed2c976f448063b1f87adb68c741be79959f951" - integrity sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A== + version "3.15.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.4.tgz#fa95c257e88f85614915b906204b9623d4fa340d" + integrity sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA== unbox-primitive@^1.0.1: version "1.0.1" @@ -11708,14 +12038,14 @@ uniq@^1.0.1: unique-filename@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" @@ -11785,12 +12115,12 @@ unist-util-visit@^4.0.0: universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== unpipe@1.0.0, unpipe@~1.0.0: @@ -11808,7 +12138,7 @@ unset-value@^1.0.0: unstated-next@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/unstated-next/-/unstated-next-1.1.0.tgz#7bb4911a12fdf3cc8ad3eb11a0b315e4a8685ea8" + resolved "https://registry.npmjs.org/unstated-next/-/unstated-next-1.1.0.tgz" integrity sha512-AAn47ZncPvgBGOvMcn8tSRxsrqwf2VdAPxLASTuLJvZt4rhKfDvUkmYZLGfclImSfTVMv7tF4ynaVxin0JjDCA== upath@^1.1.1: @@ -11845,12 +12175,12 @@ url@^0.11.0: use-callback-ref@^1.2.3, use-callback-ref@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.5.tgz#6115ed242cfbaed5915499c0a9842ca2912f38a5" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz" integrity sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg== use-sidecar@^1.0.1, use-sidecar@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.5.tgz#ffff2a17c1df42e348624b699ba6e5c220527f2b" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.5.tgz" integrity sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA== dependencies: detect-node-es "^1.1.0" @@ -11863,14 +12193,14 @@ use@^3.1.0: utf-8-validate@^5.0.2: version "5.0.8" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.8.tgz#4a735a61661dbb1c59a0868c397d2fe263f14e58" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.8.tgz" integrity sha512-k4dW/Qja1BYDl2qD4tOMB9PFVha/UJtxTc1cXYOe3WwA/2m0Yn4qB7wLMpJyLJ/7DR0XnTut3HsCSzDT4ZvKgA== dependencies: node-gyp-build "^4.3.0" util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util@^0.12.0: @@ -11897,12 +12227,12 @@ uuid@^3.3.2: uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uvu@^0.5.0: version "0.5.3" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.3.tgz#3d83c5bc1230f153451877bfc7f4aea2392219ae" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz" integrity sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw== dependencies: dequal "^2.0.0" @@ -11912,7 +12242,7 @@ uvu@^0.5.0: v8-compile-cache-lib@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz" integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== v8-compile-cache@^2.0.3: @@ -11930,7 +12260,7 @@ v8-to-istanbul@^8.1.0: validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -11938,7 +12268,7 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz" integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" @@ -11950,7 +12280,7 @@ vary@~1.1.2: verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" @@ -11999,12 +12329,12 @@ w3c-xmlserializer@^2.0.0: wait-for-event@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/wait-for-event/-/wait-for-event-2.0.1.tgz#ded6375b2f868b06121a1506266d9d69836863d0" + resolved "https://registry.npmjs.org/wait-for-event/-/wait-for-event-2.0.1.tgz" integrity sha512-CuUBvs/TnLfmgJvCVTXDU8yl3DyTilEzMYUe7mlGWtiQU1gndKT/lvdaUatG4AVwq+3heXugYTILZDOm4etc2Q== walk-up-path@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" + resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz" integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== walker@^1.0.7: @@ -12022,14 +12352,14 @@ wbuf@^1.1.0, wbuf@^1.7.3: wcwidth@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= dependencies: defaults "^1.0.3" webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= webidl-conversions@^5.0.0: @@ -12042,7 +12372,7 @@ webidl-conversions@^6.1.0: webpack-bundle-analyzer@4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.3.0.tgz#2f3c0ca9041d5ee47fa418693cf56b4a518b578b" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.3.0.tgz" integrity sha512-J3TPm54bPARx6QG8z4cKBszahnUglcv70+N+8gUqv2I5KOFHJbzBiLx+pAp606so0X004fxM7hqRu10MLjJifA== dependencies: acorn "^8.0.4" @@ -12135,7 +12465,7 @@ whatwg-encoding@^1.0.5: whatwg-fetch@^3.4.1: version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== whatwg-mimetype@^2.3.0: @@ -12144,7 +12474,7 @@ whatwg-mimetype@^2.3.0: whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= dependencies: tr46 "~0.0.3" @@ -12188,14 +12518,14 @@ which-typed-array@^1.1.2: which@^1.2.14, which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" @@ -12209,7 +12539,7 @@ wide-align@^1.1.0, wide-align@^1.1.2: widest-line@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: string-width "^4.0.0" @@ -12258,12 +12588,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: imurmurhash "^0.1.4" @@ -12280,12 +12610,12 @@ ws@^6.2.1: ws@^7.3.1: version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== ws@^7.4.5, ws@^7.4.6: version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xml-name-validator@^3.0.0: @@ -12298,7 +12628,7 @@ xmlchars@^2.2.0: xtend@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: @@ -12335,7 +12665,7 @@ yargs-parser@^20.2.2: yargs-parser@^21.0.0: version "21.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== yargs@^13.3.2: @@ -12369,7 +12699,7 @@ yargs@^16.2.0: yargs@^17.0.1: version "17.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz" integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== dependencies: cliui "^7.0.2" @@ -12382,7 +12712,7 @@ yargs@^17.0.1: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yup@^0.32.11: @@ -12405,5 +12735,5 @@ zustand@^3.7.2: zwitch@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1" - integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA== + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz" + integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA== \ No newline at end of file