diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8a693ec9..73820d86 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,7 +4,6 @@ on: push: branches: [main] pull_request: - branches: [main] env: CACHE: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ff212394..6e01688b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,8 +16,8 @@ You will then have access to the following commands. - `pnpm programs:test` - Runs BPF tests for all programs (logs disabled). - `pnpm programs:debug` - Runs BPF tests for all programs. - `pnpm programs:clean` - Deletes all generated program binaries. -- `clients:rust:test` - Runs BPF tests for the Rust client SDK. -- `clients:js:test` - Runs the JavaScript tests (you must first start the local validator `pnpm validator`). +- `pnpm clients:rust:test` - Runs BPF tests for the Rust client SDK. +- `pnpm clients:js:test` - Runs the JavaScript tests (you must first start the local validator `pnpm validator`). - `pnpm generate` - Shortcut for `pnpm generate:idls && pnpm generate:clients`. - `pnpm generate:idls` - Generate IDLs for all programs, as configured in the `configs/shank.cjs` file. - `pnpm generate:clients` - Generate clients using Kinobi, as configured in the `configs/kinobi.cjs` file. diff --git a/clients/js-solita/package.json b/clients/js-solita/package.json index b63e5564..3e3a8671 100644 --- a/clients/js-solita/package.json +++ b/clients/js-solita/package.json @@ -17,7 +17,7 @@ "run-tests": "jest tests --detectOpenHandles", "test": "start-server-and-test start-validator http://localhost:8899/health run-tests", "api:gen": "DEBUG='(solita|rustbin):(info|error)' solita", - "lint": "eslint \"{src,test}/**/*.ts\" --format stylish", + "lint": "eslint \"{src,tests}/**/*.ts\" --format stylish", "fix:lint": "yarn lint --fix", "prettier": "prettier \"{src,test}/**/*.ts\" --check", "fix:prettier": "prettier --write src/", @@ -54,12 +54,13 @@ "@metaplex-foundation/amman": "0.12.1", "@metaplex-foundation/rustbin": "^0.3.5", "@metaplex-foundation/solita": "0.20.0", + "@metaplex-foundation/js": "^0.19.4", "@solana/spl-account-compression": "^0.1.4", + "@types/bn.js": "^5.1.1", "@types/chai": "^4.3.0", "@types/jest": "^29.1.1", "@types/mocha": "^9.0.0", "@types/tape": "^4.13.2", - "@types/bn.js": "^5.1.1", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "chai": "^4.3.4", diff --git a/clients/js-solita/src/generated/errors/index.ts b/clients/js-solita/src/generated/errors/index.ts index 2bd63848..ab136015 100644 --- a/clients/js-solita/src/generated/errors/index.ts +++ b/clients/js-solita/src/generated/errors/index.ts @@ -718,6 +718,135 @@ export class DecompressionDisabledError extends Error { createErrorFromCodeLookup.set(0x1791, () => new DecompressionDisabledError()); createErrorFromNameLookup.set('DecompressionDisabled', () => new DecompressionDisabledError()); +/** + * MissingCollectionMintAccount: 'Missing collection mint account' + * + * @category Errors + * @category generated + */ +export class MissingCollectionMintAccountError extends Error { + readonly code: number = 0x1792; + readonly name: string = 'MissingCollectionMintAccount'; + constructor() { + super('Missing collection mint account'); + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, MissingCollectionMintAccountError); + } + } +} + +createErrorFromCodeLookup.set(0x1792, () => new MissingCollectionMintAccountError()); +createErrorFromNameLookup.set( + 'MissingCollectionMintAccount', + () => new MissingCollectionMintAccountError(), +); + +/** + * MissingCollectionMetadataAccount: 'Missing collection metadata account' + * + * @category Errors + * @category generated + */ +export class MissingCollectionMetadataAccountError extends Error { + readonly code: number = 0x1793; + readonly name: string = 'MissingCollectionMetadataAccount'; + constructor() { + super('Missing collection metadata account'); + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, MissingCollectionMetadataAccountError); + } + } +} + +createErrorFromCodeLookup.set(0x1793, () => new MissingCollectionMetadataAccountError()); +createErrorFromNameLookup.set( + 'MissingCollectionMetadataAccount', + () => new MissingCollectionMetadataAccountError(), +); + +/** + * CollectionMismatch: 'Collection mismatch' + * + * @category Errors + * @category generated + */ +export class CollectionMismatchError extends Error { + readonly code: number = 0x1794; + readonly name: string = 'CollectionMismatch'; + constructor() { + super('Collection mismatch'); + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, CollectionMismatchError); + } + } +} + +createErrorFromCodeLookup.set(0x1794, () => new CollectionMismatchError()); +createErrorFromNameLookup.set('CollectionMismatch', () => new CollectionMismatchError()); + +/** + * MetadataImmutable: 'Metadata not mutable' + * + * @category Errors + * @category generated + */ +export class MetadataImmutableError extends Error { + readonly code: number = 0x1795; + readonly name: string = 'MetadataImmutable'; + constructor() { + super('Metadata not mutable'); + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, MetadataImmutableError); + } + } +} + +createErrorFromCodeLookup.set(0x1795, () => new MetadataImmutableError()); +createErrorFromNameLookup.set('MetadataImmutable', () => new MetadataImmutableError()); + +/** + * PrimarySaleCanOnlyBeFlippedToTrue: 'Can only update primary sale to true' + * + * @category Errors + * @category generated + */ +export class PrimarySaleCanOnlyBeFlippedToTrueError extends Error { + readonly code: number = 0x1796; + readonly name: string = 'PrimarySaleCanOnlyBeFlippedToTrue'; + constructor() { + super('Can only update primary sale to true'); + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, PrimarySaleCanOnlyBeFlippedToTrueError); + } + } +} + +createErrorFromCodeLookup.set(0x1796, () => new PrimarySaleCanOnlyBeFlippedToTrueError()); +createErrorFromNameLookup.set( + 'PrimarySaleCanOnlyBeFlippedToTrue', + () => new PrimarySaleCanOnlyBeFlippedToTrueError(), +); + +/** + * CreatorDidNotUnverify: 'Creator did not unverify the metadata' + * + * @category Errors + * @category generated + */ +export class CreatorDidNotUnverifyError extends Error { + readonly code: number = 0x1797; + readonly name: string = 'CreatorDidNotUnverify'; + constructor() { + super('Creator did not unverify the metadata'); + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, CreatorDidNotUnverifyError); + } + } +} + +createErrorFromCodeLookup.set(0x1797, () => new CreatorDidNotUnverifyError()); +createErrorFromNameLookup.set('CreatorDidNotUnverify', () => new CreatorDidNotUnverifyError()); + /** * Attempts to resolve a custom program error from the provided error code. * @category Errors diff --git a/clients/js-solita/src/generated/instructions/index.ts b/clients/js-solita/src/generated/instructions/index.ts index be72b10c..2e47aeab 100644 --- a/clients/js-solita/src/generated/instructions/index.ts +++ b/clients/js-solita/src/generated/instructions/index.ts @@ -13,5 +13,6 @@ export * from './setTreeDelegate'; export * from './transfer'; export * from './unverifyCollection'; export * from './unverifyCreator'; +export * from './updateMetadata'; export * from './verifyCollection'; export * from './verifyCreator'; diff --git a/clients/js-solita/src/generated/instructions/updateMetadata.ts b/clients/js-solita/src/generated/instructions/updateMetadata.ts new file mode 100644 index 00000000..88da46bb --- /dev/null +++ b/clients/js-solita/src/generated/instructions/updateMetadata.ts @@ -0,0 +1,185 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from '@metaplex-foundation/beet'; +import * as web3 from '@solana/web3.js'; +import { MetadataArgs, metadataArgsBeet } from '../types/MetadataArgs'; +import { UpdateArgs, updateArgsBeet } from '../types/UpdateArgs'; + +/** + * @category Instructions + * @category UpdateMetadata + * @category generated + */ +export type UpdateMetadataInstructionArgs = { + root: number[] /* size: 32 */; + nonce: beet.bignum; + index: number; + currentMetadata: MetadataArgs; + updateArgs: UpdateArgs; +}; +/** + * @category Instructions + * @category UpdateMetadata + * @category generated + */ +export const updateMetadataStruct = new beet.FixableBeetArgsStruct< + UpdateMetadataInstructionArgs & { + instructionDiscriminator: number[] /* size: 8 */; + } +>( + [ + ['instructionDiscriminator', beet.uniformFixedSizeArray(beet.u8, 8)], + ['root', beet.uniformFixedSizeArray(beet.u8, 32)], + ['nonce', beet.u64], + ['index', beet.u32], + ['currentMetadata', metadataArgsBeet], + ['updateArgs', updateArgsBeet], + ], + 'UpdateMetadataInstructionArgs', +); +/** + * Accounts required by the _updateMetadata_ instruction + * + * @property [] treeAuthority + * @property [**signer**] authority + * @property [] collectionMint (optional) + * @property [] collectionMetadata (optional) + * @property [] collectionAuthorityRecordPda (optional) + * @property [] leafOwner + * @property [] leafDelegate + * @property [**signer**] payer + * @property [_writable_] merkleTree + * @property [] logWrapper + * @property [] compressionProgram + * @property [] tokenMetadataProgram + * @category Instructions + * @category UpdateMetadata + * @category generated + */ +export type UpdateMetadataInstructionAccounts = { + treeAuthority: web3.PublicKey; + authority: web3.PublicKey; + collectionMint?: web3.PublicKey; + collectionMetadata?: web3.PublicKey; + collectionAuthorityRecordPda?: web3.PublicKey; + leafOwner: web3.PublicKey; + leafDelegate: web3.PublicKey; + payer: web3.PublicKey; + merkleTree: web3.PublicKey; + logWrapper: web3.PublicKey; + compressionProgram: web3.PublicKey; + tokenMetadataProgram: web3.PublicKey; + systemProgram?: web3.PublicKey; + anchorRemainingAccounts?: web3.AccountMeta[]; +}; + +export const updateMetadataInstructionDiscriminator = [170, 182, 43, 239, 97, 78, 225, 186]; + +/** + * Creates a _UpdateMetadata_ instruction. + * + * Optional accounts that are not provided default to the program ID since + * this was indicated in the IDL from which this instruction was generated. + * + * @param accounts that will be accessed while the instruction is processed + * @param args to provide as instruction data to the program + * + * @category Instructions + * @category UpdateMetadata + * @category generated + */ +export function createUpdateMetadataInstruction( + accounts: UpdateMetadataInstructionAccounts, + args: UpdateMetadataInstructionArgs, + programId = new web3.PublicKey('BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY'), +) { + const [data] = updateMetadataStruct.serialize({ + instructionDiscriminator: updateMetadataInstructionDiscriminator, + ...args, + }); + const keys: web3.AccountMeta[] = [ + { + pubkey: accounts.treeAuthority, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.authority, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.collectionMint ?? programId, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.collectionMetadata ?? programId, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.collectionAuthorityRecordPda ?? programId, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.leafOwner, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.leafDelegate, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.payer, + isWritable: false, + isSigner: true, + }, + { + pubkey: accounts.merkleTree, + isWritable: true, + isSigner: false, + }, + { + pubkey: accounts.logWrapper, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.compressionProgram, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.tokenMetadataProgram, + isWritable: false, + isSigner: false, + }, + { + pubkey: accounts.systemProgram ?? web3.SystemProgram.programId, + isWritable: false, + isSigner: false, + }, + ]; + + if (accounts.anchorRemainingAccounts != null) { + for (const acc of accounts.anchorRemainingAccounts) { + keys.push(acc); + } + } + + const ix = new web3.TransactionInstruction({ + programId, + keys, + data, + }); + return ix; +} diff --git a/clients/js-solita/src/generated/types/UpdateArgs.ts b/clients/js-solita/src/generated/types/UpdateArgs.ts new file mode 100644 index 00000000..66624959 --- /dev/null +++ b/clients/js-solita/src/generated/types/UpdateArgs.ts @@ -0,0 +1,35 @@ +/** + * This code was GENERATED using the solita package. + * Please DO NOT EDIT THIS FILE, instead rerun solita to update it or write a wrapper to add functionality. + * + * See: https://github.com/metaplex-foundation/solita + */ + +import * as beet from '@metaplex-foundation/beet'; +import { Creator, creatorBeet } from './Creator'; +export type UpdateArgs = { + name: beet.COption; + symbol: beet.COption; + uri: beet.COption; + creators: beet.COption; + sellerFeeBasisPoints: beet.COption; + primarySaleHappened: beet.COption; + isMutable: beet.COption; +}; + +/** + * @category userTypes + * @category generated + */ +export const updateArgsBeet = new beet.FixableBeetArgsStruct( + [ + ['name', beet.coption(beet.utf8String)], + ['symbol', beet.coption(beet.utf8String)], + ['uri', beet.coption(beet.utf8String)], + ['creators', beet.coption(beet.array(creatorBeet))], + ['sellerFeeBasisPoints', beet.coption(beet.u16)], + ['primarySaleHappened', beet.coption(beet.bool)], + ['isMutable', beet.coption(beet.bool)], + ], + 'UpdateArgs', +); diff --git a/clients/js-solita/src/generated/types/index.ts b/clients/js-solita/src/generated/types/index.ts index bc7fae93..e0ed4b00 100644 --- a/clients/js-solita/src/generated/types/index.ts +++ b/clients/js-solita/src/generated/types/index.ts @@ -6,6 +6,7 @@ export * from './LeafSchema'; export * from './MetadataArgs'; export * from './TokenProgramVersion'; export * from './TokenStandard'; +export * from './UpdateArgs'; export * from './UseMethod'; export * from './Uses'; export * from './Version'; diff --git a/clients/js-solita/src/mpl-bubblegum.ts b/clients/js-solita/src/mpl-bubblegum.ts index 503bf092..a420d988 100644 --- a/clients/js-solita/src/mpl-bubblegum.ts +++ b/clients/js-solita/src/mpl-bubblegum.ts @@ -30,7 +30,7 @@ export function computeCreatorHash(creators: Creator[]) { Buffer.from([creator.verified ? 1 : 0]), Buffer.from([creator.share]), ]); - }) + }), ); return Buffer.from(keccak_256.digest(bufferOfCreatorData)); } diff --git a/clients/js-solita/tests/main.test.ts b/clients/js-solita/tests/main.test.ts index 269f4ba7..a03d9b79 100644 --- a/clients/js-solita/tests/main.test.ts +++ b/clients/js-solita/tests/main.test.ts @@ -25,11 +25,14 @@ import { createBurnInstruction, createRedeemInstruction, createDecompressV1Instruction, + createUpdateMetadataInstruction, + createVerifyCreatorInstruction, MetadataArgs, PROGRAM_ID as BUBBLEGUM_PROGRAM_ID, TokenProgramVersion, TokenStandard, Creator, + createMintToCollectionV1Instruction, createSetDecompressibleStateInstruction, DecompressibleState, } from '../src/generated'; @@ -42,6 +45,8 @@ import { import { BN } from 'bn.js'; import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { assert } from 'chai'; +import { Metaplex, keypairIdentity, CreateCompressedNftOutput } from '@metaplex-foundation/js'; function keypairFromSeed(seed: string) { const expandedSeed = Uint8Array.from(Buffer.from(`${seed}`)); @@ -61,7 +66,53 @@ function makeCompressedNFT(name: string, symbol: string, creators: Creator[] = [ collection: null, primarySaleHappened: false, sellerFeeBasisPoints: 0, - isMutable: false, + isMutable: true, + }; +} + +async function setupCertifiedCollection( + connection: Connection, + name: string, + symbol: string, + uri: string, + updateAuthority: Keypair, +): Promise { + const metaplex = Metaplex.make(connection).use(keypairIdentity(updateAuthority)); + const collectionInfo = await metaplex.nfts().create({ + uri, + name, + sellerFeeBasisPoints: 500, + updateAuthority, + tokenOwner: updateAuthority.publicKey, + symbol, + creators: [{ address: updateAuthority.publicKey, share: 100, authority: updateAuthority }], + isMutable: true, + primarySaleHappened: false, + isCollection: true, + }); + return collectionInfo; +} + +function makeCompressedCollectionNFT( + name: string, + symbol: string, + uri: string, + collection: PublicKey, + creators: Creator[] = [], +): MetadataArgs { + return { + name: name, + symbol: symbol, + uri, + creators, + editionNonce: 0, + tokenProgramVersion: TokenProgramVersion.Original, + tokenStandard: TokenStandard.NonFungible, + uses: null, + collection: { key: collection, verified: false }, + primarySaleHappened: false, + sellerFeeBasisPoints: 0, + isMutable: true, }; } @@ -83,6 +134,7 @@ async function setupTreeWithCompressedNFT( const space = getConcurrentMerkleTreeAccountSize( depthSizePair.maxDepth, depthSizePair.maxBufferSize, + depthSizePair.maxDepth, ); const allocTreeIx = SystemProgram.createAccount({ fromPubkey: payer, @@ -155,13 +207,51 @@ async function setupTreeWithCompressedNFT( }; } +async function verifyLeaf( + connection: Connection, + payerKeypair: Keypair, + owner: PublicKey, + delegate: PublicKey, + index: number, + merkleTree: PublicKey, + metadata: MetadataArgs, +): Promise<{ success: boolean }> { + const accountInfo = await connection.getAccountInfo(merkleTree, { commitment: 'confirmed' }); + const account = ConcurrentMerkleTreeAccount.fromBuffer(accountInfo!.data!); + + // Verify leaf exists. + const leafIndex = new BN.BN(index); + const assetId = await getLeafAssetId(merkleTree, leafIndex); + const verifyLeafIx = createVerifyLeafIx(merkleTree, { + root: account.getCurrentRoot(), + leaf: computeCompressedNFTHash(assetId, owner, delegate, leafIndex, metadata), + leafIndex: index, + proof: [], + }); + const tx = new Transaction().add(verifyLeafIx); + const txId = await sendAndConfirmTransaction(connection, tx, [payerKeypair], { + commitment: 'confirmed', + skipPreflight: true, + }); + console.log('Verified NFT existence:', txId); + return { + success: true, + }; +} + describe('Bubblegum tests', () => { - const connection = new Connection('http://localhost:8899'); + const connection = new Connection('http://127.0.0.1:8899'); const payerKeypair = keypairFromSeed('metaplex-test09870987098709870987009709870987098709870987'); const payer = payerKeypair.publicKey; beforeEach(async () => { - await connection.requestAirdrop(payer, LAMPORTS_PER_SOL); + const airdropSig = await connection.requestAirdrop(payer, 10 * LAMPORTS_PER_SOL); + const latestBlockhash = await connection.getLatestBlockhash(); + await connection.confirmTransaction({ + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + signature: airdropSig, + }); }); it('Can create a Bubblegum tree and mint to it', async () => { const compressedNFT: MetadataArgs = { @@ -185,53 +275,804 @@ describe('Bubblegum tests', () => { }); describe('Unit test compressed NFT instructions', () => { - let merkleTree: PublicKey; - let creators: Creator[] = [ + const MAX_DEPTH = 14; + const secondCreator = new Keypair(); + const creators: Creator[] = [ { address: payer, share: 55, verified: false, }, { - address: new Keypair().publicKey, + address: secondCreator.publicKey, share: 45, verified: false, }, ]; + let merkleTree: PublicKey; const originalCompressedNFT = makeCompressedNFT('test', 'TST', creators); beforeEach(async () => { - await connection.requestAirdrop(payer, LAMPORTS_PER_SOL); const result = await setupTreeWithCompressedNFT( connection, payerKeypair, originalCompressedNFT, { - maxDepth: 14, + maxDepth: MAX_DEPTH, maxBufferSize: 64, }, ); merkleTree = result.merkleTree; }); - it('Can verify existence a compressed NFT', async () => { - // Todo(@ngundotra): expose commitment level in ConcurrentMerkleTreeAccount.fromAddress - const accountInfo = await connection.getAccountInfo(merkleTree, { commitment: 'confirmed' }); - const account = ConcurrentMerkleTreeAccount.fromBuffer(accountInfo!.data!); + it('Can verify existence of a compressed NFT', async () => { + const result = await verifyLeaf( + connection, + payerKeypair, + payerKeypair.publicKey, + payerKeypair.publicKey, + 0, + merkleTree, + originalCompressedNFT, + ); + assert(result.success, 'Failed to verify leaf'); + }); - // Verify leaf exists. - const leafIndex = new BN.BN(0); - const assetId = await getLeafAssetId(merkleTree, leafIndex); - const verifyLeafIx = createVerifyLeafIx(merkleTree, { - root: account.getCurrentRoot(), - leaf: computeCompressedNFTHash(assetId, payer, payer, leafIndex, originalCompressedNFT), - leafIndex: 0, - proof: [], + describe('Update metadata', () => { + let treeAuthority: PublicKey; + beforeEach(async () => { + [treeAuthority] = PublicKey.findProgramAddressSync( + [merkleTree.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); }); - const tx = new Transaction().add(verifyLeafIx); - const txId = await sendAndConfirmTransaction(connection, tx, [payerKeypair], { - commitment: 'confirmed', - skipPreflight: true, + describe('Not linked to collection', () => { + let merkleAccount: ConcurrentMerkleTreeAccount; + beforeEach(async () => { + const merkleAccountInfo = await connection.getAccountInfo(merkleTree, { + commitment: 'confirmed', + }); + merkleAccount = ConcurrentMerkleTreeAccount.fromBuffer(merkleAccountInfo!.data!); + }); + it('Simple update', async () => { + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: null, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + treeAuthority, + authority: payer, + leafOwner: payer, + leafDelegate: payer, + payer, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 0, + index: 0, + currentMetadata: originalCompressedNFT, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + const updateMetadataTxId = await sendAndConfirmTransaction( + connection, + updateMetadataTx, + [payerKeypair], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('Update metadata tx success:', updateMetadataTxId); + + const newMetadataArgs: MetadataArgs = { + ...originalCompressedNFT, + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + }; + + // We should now be able to verify the new leaf with the metadata replaced + await verifyLeaf( + connection, + payerKeypair, + payerKeypair.publicKey, + payerKeypair.publicKey, + 0, + merkleTree, + newMetadataArgs, + ); + }); + + it('Cannot use collection_authority', async () => { + const collectionAuthority = new Keypair(); + const airdropSig = await connection.requestAirdrop(collectionAuthority.publicKey, LAMPORTS_PER_SOL); + const latestBlockhash = await connection.getLatestBlockhash(); + await connection.confirmTransaction({ + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + signature: airdropSig, + }); + const collection = await setupCertifiedCollection( + connection, + 'ColName', + 'ColSymbol', + 'https://mycollection.com', + collectionAuthority, + ); + + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: null, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + authority: collectionAuthority.publicKey, + collectionMint: collection.mintAddress, + collectionMetadata: collection.metadataAddress, + collectionAuthorityRecordPda: BUBBLEGUM_PROGRAM_ID, + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + payer: collectionAuthority.publicKey, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 0, + index: 0, + currentMetadata: originalCompressedNFT, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + try { + await sendAndConfirmTransaction(connection, updateMetadataTx, [collectionAuthority], { + commitment: 'confirmed', + skipPreflight: true, + }); + assert.fail( + 'Metadata update using collection_authority should fail for item not in collection', + ); + } catch (err) { + assert( + err.message.includes('"Custom":6016'), + 'Did not fail for correct reason! ' + err.message, + ); + } + }); + + it('Cannot verify currently unverified creator if not signer', async () => { + // Attempt to verify second creator, should not work. + const updatedCreators: Creator[] = [ + { + address: payer, + share: 55, + verified: false, + }, + { + address: secondCreator.publicKey, + share: 45, + verified: true, + }, + ]; + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: updatedCreators, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + treeAuthority, + authority: payer, + leafOwner: payer, + leafDelegate: payer, + payer, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 0, + index: 0, + currentMetadata: originalCompressedNFT, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + try { + await sendAndConfirmTransaction(connection, updateMetadataTx, [payerKeypair], { + commitment: 'confirmed', + skipPreflight: true, + }); + assert.fail( + 'Metadata update verifiying currently unverified creator if not signer should fail', + ); + } catch (err) { + assert( + err.message.includes('"Custom":6006'), + 'Did not fail for correct reason! ' + err.message, + ); + } + }); + + it('Can verify currently unverified creator if signer', async () => { + // Attempt to verify payer, should work. + const updatedCreators: Creator[] = [ + { + address: payer, + share: 55, + verified: true, + }, + { + address: secondCreator.publicKey, + share: 45, + verified: false, + }, + ]; + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: updatedCreators, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + treeAuthority, + authority: payer, + leafOwner: payer, + leafDelegate: payer, + payer, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 0, + index: 0, + currentMetadata: originalCompressedNFT, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + const updateMetadataTxId = await sendAndConfirmTransaction( + connection, + updateMetadataTx, + [payerKeypair], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('Update metadata success, payer verified:', updateMetadataTxId); + }); + + it('Cannot unverify currently verified creator if not signer', async () => { + // Verify second creator. + const airdropSig = await connection.requestAirdrop(secondCreator.publicKey, LAMPORTS_PER_SOL); + const latestBlockhash = await connection.getLatestBlockhash(); + await connection.confirmTransaction({ + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + signature: airdropSig, + }); + const verifyCreatorIx = createVerifyCreatorInstruction( + { + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + merkleTree, + payer: secondCreator.publicKey, + creator: secondCreator.publicKey, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + dataHash: Array.from(computeDataHash(originalCompressedNFT)), + creatorHash: Array.from(computeCreatorHash(originalCompressedNFT.creators)), + nonce: 0, + index: 0, + message: originalCompressedNFT, + }, + ); + + const verifyCreatorTx = new Transaction().add(verifyCreatorIx); + verifyCreatorTx.feePayer = secondCreator.publicKey; + const verifyCreatorTxId = await sendAndConfirmTransaction( + connection, + verifyCreatorTx, + [secondCreator], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('NFT verify second creator Tx:', verifyCreatorTxId); + + // This is the state after previous creator verification. + const currentCreators: Creator[] = [ + { + address: payer, + share: 55, + verified: false, + }, + { + address: secondCreator.publicKey, + share: 45, + verified: true, + }, + ]; + const currentMetadata = makeCompressedNFT('test', 'TST', currentCreators); + + // Attempt to unverify second creator, should not work. + const updatedCreators: Creator[] = [ + { + address: payer, + share: 55, + verified: false, + }, + { + address: secondCreator.publicKey, + share: 45, + verified: false, + }, + ]; + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: updatedCreators, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + treeAuthority, + authority: payer, + leafOwner: payer, + leafDelegate: payer, + payer, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 0, + index: 0, + currentMetadata, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + try { + await sendAndConfirmTransaction(connection, updateMetadataTx, [payerKeypair], { + commitment: 'confirmed', + skipPreflight: true, + }); + assert.fail( + 'Metadata update unverifying currently verified creator if not signer should fail', + ); + } catch (err) { + assert( + err.message.includes('"Custom":6039'), + 'Did not fail for correct reason! ' + err.message, + ); + } + }); + + it('Can unverify currently verified creator if signer', async () => { + // Verify payer. + const verifyCreatorIx = createVerifyCreatorInstruction( + { + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + merkleTree, + payer, + creator: payer, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + dataHash: Array.from(computeDataHash(originalCompressedNFT)), + creatorHash: Array.from(computeCreatorHash(originalCompressedNFT.creators)), + nonce: 0, + index: 0, + message: originalCompressedNFT, + }, + ); + + const verifyCreatorTx = new Transaction().add(verifyCreatorIx); + verifyCreatorTx.feePayer = payer; + const verifyCreatorTxId = await sendAndConfirmTransaction( + connection, + verifyCreatorTx, + [payerKeypair], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('NFT verify first creator Tx:', verifyCreatorTxId); + + // This is the state after previous creator verification. + const currentCreators: Creator[] = [ + { + address: payer, + share: 55, + verified: true, + }, + { + address: secondCreator.publicKey, + share: 45, + verified: false, + }, + ]; + const currentMetadata = makeCompressedNFT('test', 'TST', currentCreators); + + // Attempt to unverify payer, should work. + const updatedCreators: Creator[] = [ + { + address: payer, + share: 55, + verified: false, + }, + { + address: secondCreator.publicKey, + share: 45, + verified: false, + }, + ]; + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: updatedCreators, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + treeAuthority, + authority: payer, + leafOwner: payer, + leafDelegate: payer, + payer, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 0, + index: 0, + currentMetadata, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + const updateMetadataTxId = await sendAndConfirmTransaction( + connection, + updateMetadataTx, + [payerKeypair], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('Update metadata success, payer unverified:', updateMetadataTxId); + }); + }); + describe('Linked to collection', () => { + let merkleAccount: ConcurrentMerkleTreeAccount; + beforeEach(async () => { + const merkleAccountInfo = await connection.getAccountInfo(merkleTree, { + commitment: 'confirmed', + }); + merkleAccount = ConcurrentMerkleTreeAccount.fromBuffer(merkleAccountInfo!.data!); + }); + it('Linked to verified collection update', async () => { + const collectionAuthority = new Keypair(); + const airdropSig = await connection.requestAirdrop(collectionAuthority.publicKey, LAMPORTS_PER_SOL); + const latestBlockhash = await connection.getLatestBlockhash(); + await connection.confirmTransaction({ + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + signature: airdropSig, + }); + const collection = await setupCertifiedCollection( + connection, + 'ColName', + 'ColSymbol', + 'https://mycollection.com', + collectionAuthority, + ); + const [bubblegumSigner] = PublicKey.findProgramAddressSync( + [Buffer.from('collection_cpi')], + BUBBLEGUM_PROGRAM_ID, + ); + const metadataArgs = makeCompressedCollectionNFT( + 'cname', + 'csymbol', + 'https://myuri.com', + collection.mintAddress, + ); + + // Mint a New NFT to a Collection + const mintToCollectionIx = createMintToCollectionV1Instruction( + { + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + merkleTree, + payer, + treeDelegate: payer, + collectionAuthority: collectionAuthority.publicKey, + collectionAuthorityRecordPda: BUBBLEGUM_PROGRAM_ID, + collectionMint: collection.mintAddress, + collectionMetadata: collection.metadataAddress, + editionAccount: collection.masterEditionAddress, + bubblegumSigner, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + metadataArgs: metadataArgs, + }, + ); + + const mintToCollectionTxId = await sendAndConfirmTransaction( + connection, + new Transaction().add(mintToCollectionIx), + [payerKeypair, collectionAuthority], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('Mint to Collection Success:', mintToCollectionTxId); + + // MintToCollectionV1 will update verified to true in MetadataArgs before minting to the tree + // Thus we must alter the MetadataArgs object we expect to exist in the leaf before the update to match + const currentMetadataArgs = { + ...metadataArgs, + collection: { key: metadataArgs.collection!.key, verified: true }, + }; + + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: null, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + const updateMetadataIx = createUpdateMetadataInstruction( + { + authority: collectionAuthority.publicKey, + collectionMint: collection.mintAddress, + collectionMetadata: collection.metadataAddress, + collectionAuthorityRecordPda: BUBBLEGUM_PROGRAM_ID, + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + payer: collectionAuthority.publicKey, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 1, + index: 1, + currentMetadata: currentMetadataArgs, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + const updateMetadataTxId = await sendAndConfirmTransaction( + connection, + updateMetadataTx, + [collectionAuthority], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('Update metadata tx success:', updateMetadataTxId); + + const newMetadataArgs: MetadataArgs = { + ...currentMetadataArgs, + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + }; + + // We should now be able to verify the new leaf with the metadata replaced + await verifyLeaf( + connection, + payerKeypair, + payerKeypair.publicKey, + payerKeypair.publicKey, + 1, + merkleTree, + newMetadataArgs, + ); + }); + + it('Cannot use tree_owner when item in collection', async () => { + const collectionAuthority = new Keypair(); + const airdropSig = await connection.requestAirdrop(collectionAuthority.publicKey, LAMPORTS_PER_SOL); + const latestBlockhash = await connection.getLatestBlockhash(); + await connection.confirmTransaction({ + blockhash: latestBlockhash.blockhash, + lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, + signature: airdropSig, + }); + const collection = await setupCertifiedCollection( + connection, + 'ColName', + 'ColSymbol', + 'https://mycollection.com', + collectionAuthority, + ); + const [bubblegumSigner] = PublicKey.findProgramAddressSync( + [Buffer.from('collection_cpi')], + BUBBLEGUM_PROGRAM_ID, + ); + const metadataArgs = makeCompressedCollectionNFT( + 'cname', + 'csymbol', + 'https://myuri.com', + collection.mintAddress, + ); + + // Mint a New NFT to a Collection + const mintToCollectionIx = createMintToCollectionV1Instruction( + { + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + merkleTree, + payer, + treeDelegate: payer, + collectionAuthority: collectionAuthority.publicKey, + collectionAuthorityRecordPda: BUBBLEGUM_PROGRAM_ID, + collectionMint: collection.mintAddress, + collectionMetadata: collection.metadataAddress, + editionAccount: collection.masterEditionAddress, + bubblegumSigner, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + metadataArgs: metadataArgs, + }, + ); + + const mintToCollectionTxId = await sendAndConfirmTransaction( + connection, + new Transaction().add(mintToCollectionIx), + [payerKeypair, collectionAuthority], + { + commitment: 'confirmed', + skipPreflight: true, + }, + ); + + console.log('Mint to Collection Success:', mintToCollectionTxId); + + // MintToCollectionV1 will update verified to true in MetadataArgs before minting to the tree + // Thus we must alter the MetadataArgs object we expect to exist in the leaf before the update to match + const currentMetadataArgs = { + ...metadataArgs, + collection: { key: metadataArgs.collection!.key, verified: true }, + }; + + const updateArgs = { + name: 'NewName', + symbol: 'NewSymbol', + uri: 'https://foobar.com', + creators: null, + sellerFeeBasisPoints: null, + primarySaleHappened: null, + isMutable: null, + }; + + const updateMetadataIx = createUpdateMetadataInstruction( + { + authority: payer, + collectionMint: collection.mintAddress, + collectionMetadata: collection.metadataAddress, + collectionAuthorityRecordPda: BUBBLEGUM_PROGRAM_ID, + treeAuthority, + leafOwner: payer, + leafDelegate: payer, + payer, + merkleTree, + logWrapper: SPL_NOOP_PROGRAM_ID, + compressionProgram: SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }, + { + root: Array.from(merkleAccount.getCurrentRoot()), + nonce: 1, + index: 1, + currentMetadata: currentMetadataArgs, + updateArgs: updateArgs, + }, + ); + + const updateMetadataTx = new Transaction().add(updateMetadataIx); + try { + await sendAndConfirmTransaction(connection, updateMetadataTx, [payerKeypair], { + commitment: 'confirmed', + skipPreflight: true, + }); + assert.fail( + 'Metadata update using tree owner should fail for item in collection', + ); + } catch (err) { + assert( + err.message.includes('"Custom":6028'), + 'Did not fail for correct reason! ' + err.message, + ); + } + }); }); - console.log('Verified NFT existence:', txId); }); it('Can transfer and burn a compressed NFT', async () => { @@ -417,7 +1258,5 @@ describe('Bubblegum tests', () => { console.log('NFT decompress tx:', decompressTxId); }); - - // TODO(@metaplex): add collection tests here }); }); diff --git a/clients/js-solita/yarn.lock b/clients/js-solita/yarn.lock index 835d2253..2ca153ce 100644 --- a/clients/js-solita/yarn.lock +++ b/clients/js-solita/yarn.lock @@ -311,6 +311,31 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@bundlr-network/client@^0.8.8": + version "0.8.9" + resolved "https://registry.yarnpkg.com/@bundlr-network/client/-/client-0.8.9.tgz#58e969a5d80f8d25d212d46bb7a060730a3c1736" + integrity sha512-SJ7BAt/KhONeFQ0+nbqrw2DUWrsev6y6cmlXt+3x7fPCkw7OJwudtxV/h2nBteZd65NXjqw8yzkmLiLfZ7CCRA== + dependencies: + "@solana/wallet-adapter-base" "^0.9.2" + "@solana/web3.js" "^1.36.0" + "@supercharge/promise-pool" "^2.1.0" + algosdk "^1.13.1" + arbundles "^0.6.21" + arweave "^1.11.4" + async-retry "^1.3.3" + axios "^0.25.0" + base64url "^3.0.1" + bignumber.js "^9.0.1" + bs58 "^4.0.1" + commander "^8.2.0" + csv "^6.0.5" + ethers "^5.5.1" + inquirer "^8.2.0" + js-sha256 "^0.9.0" + mime-types "^2.1.34" + near-api-js "^0.44.2" + near-seed-phrase "^0.2.0" + "@eslint/eslintrc@^1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" @@ -326,6 +351,348 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -664,7 +1031,7 @@ bs58 "^5.0.0" debug "^4.3.4" -"@metaplex-foundation/beet-solana@^0.3.1": +"@metaplex-foundation/beet-solana@^0.3.0", "@metaplex-foundation/beet-solana@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet-solana/-/beet-solana-0.3.1.tgz#4b37cda5c7f32ffd2bdd8b3164edc05c6463ab35" integrity sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g== @@ -683,11 +1050,132 @@ bn.js "^5.2.0" debug "^4.3.3" +"@metaplex-foundation/beet@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.4.0.tgz#eb2a0a6eb084bb25d67dd9bed2f7387ee7e63a55" + integrity sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + +"@metaplex-foundation/beet@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/beet/-/beet-0.6.1.tgz#6331bdde0648bf2cae6f9e482f8e3552db05d69f" + integrity sha512-OYgnijLFzw0cdUlRKH5POp0unQECPOW9muJ2X3QIVyak5G6I6l/rKo72sICgPLIFKdmsi2jmnkuLY7wp14iXdw== + dependencies: + ansicolors "^0.3.2" + bn.js "^5.2.0" + debug "^4.3.3" + "@metaplex-foundation/cusper@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@metaplex-foundation/cusper/-/cusper-0.0.2.tgz#dc2032a452d6c269e25f016aa4dd63600e2af975" integrity sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA== +"@metaplex-foundation/js@^0.19.4": + version "0.19.4" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/js/-/js-0.19.4.tgz#992fe6b48e8dd0374d99028a07f75547cb6381d7" + integrity sha512-fiAaMl4p7v1tcU7ZoEr1lCzE6JR2gEWGeHOBarLTpiCjMe8ni3E+cukJQC6p0Ik+Z6IIFtEVNNy5OnMS3LLS4A== + dependencies: + "@bundlr-network/client" "^0.8.8" + "@metaplex-foundation/beet" "0.7.1" + "@metaplex-foundation/mpl-auction-house" "^2.3.0" + "@metaplex-foundation/mpl-bubblegum" "^0.6.2" + "@metaplex-foundation/mpl-candy-guard" "^0.3.0" + "@metaplex-foundation/mpl-candy-machine" "^5.0.0" + "@metaplex-foundation/mpl-candy-machine-core" "^0.1.2" + "@metaplex-foundation/mpl-token-metadata" "^2.11.0" + "@noble/ed25519" "^1.7.1" + "@noble/hashes" "^1.1.3" + "@solana/spl-account-compression" "^0.1.8" + "@solana/spl-token" "^0.3.5" + "@solana/web3.js" "^1.63.1" + bignumber.js "^9.0.2" + bn.js "^5.2.1" + bs58 "^5.0.0" + buffer "^6.0.3" + debug "^4.3.4" + eventemitter3 "^4.0.7" + lodash.clonedeep "^4.5.0" + lodash.isequal "^4.5.0" + merkletreejs "^0.2.32" + mime "^3.0.0" + node-fetch "^2.6.7" + +"@metaplex-foundation/mpl-auction-house@^2.3.0": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-auction-house/-/mpl-auction-house-2.5.1.tgz#ea0e21e594b0db5e73f88688eb2e7c9b748b378b" + integrity sha512-O+IAdYVaoOvgACB8pm+1lF5BNEjl0COkqny2Ho8KQZwka6aC/vHbZ239yRwAMtJhf5992BPFdT4oifjyE0O+Mw== + dependencies: + "@metaplex-foundation/beet" "^0.6.1" + "@metaplex-foundation/beet-solana" "^0.3.1" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.5" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-bubblegum@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-bubblegum/-/mpl-bubblegum-0.6.2.tgz#e1b098ccef10899b0d759a03e3d4b1ae7bdc9f0c" + integrity sha512-4tF7/FFSNtpozuIGD7gMKcqK2D49eVXZ144xiowC5H1iBeu009/oj2m8Tj6n4DpYFKWJ2JQhhhk0a2q7x0Begw== + dependencies: + "@metaplex-foundation/beet" "0.7.1" + "@metaplex-foundation/beet-solana" "0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@metaplex-foundation/mpl-token-metadata" "^2.5.2" + "@solana/spl-account-compression" "^0.1.4" + "@solana/spl-token" "^0.1.8" + "@solana/web3.js" "^1.50.1" + bn.js "^5.2.0" + js-sha3 "^0.8.0" + +"@metaplex-foundation/mpl-candy-guard@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-guard/-/mpl-candy-guard-0.3.2.tgz#426e89793676b42e9bbb5e523303fba36ccd5281" + integrity sha512-QWXzPDz+6OR3957LtfW6/rcGvFWS/0AeHJa/BUO2VEVQxN769dupsKGtrsS8o5RzXCeap3wrCtDSNxN3dnWu4Q== + dependencies: + "@metaplex-foundation/beet" "^0.4.0" + "@metaplex-foundation/beet-solana" "^0.3.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/web3.js" "^1.66.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-machine-core@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-machine-core/-/mpl-candy-machine-core-0.1.2.tgz#07e19558d0ef120fac1d8612ae4de90d52cd4d1f" + integrity sha512-jjDkRvMR+iykt7guQ7qVnOHTZedql0lq3xqWDMaenAUCH3Xrf2zKATThhJppIVNX1/YtgBOO3lGqhaFbaI4pCw== + dependencies: + "@metaplex-foundation/beet" "^0.4.0" + "@metaplex-foundation/beet-solana" "^0.3.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/web3.js" "^1.56.2" + bn.js "^5.2.0" + +"@metaplex-foundation/mpl-candy-machine@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-candy-machine/-/mpl-candy-machine-5.1.0.tgz#9469914b312ac36b7cf608123508f3f3f5080010" + integrity sha512-pjHpUpWVOCDxK3l6dXxfmJKNQmbjBqnm5ElOl1mJAygnzO8NIPQvrP89y6xSNyo8qZsJyt4ZMYUyD0TdbtKZXQ== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.6" + "@solana/web3.js" "^1.66.2" + +"@metaplex-foundation/mpl-token-metadata@^2.11.0": + version "2.12.0" + resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-2.12.0.tgz#9817b2d133c5af46c28ab284316b6985ef62b331" + integrity sha512-DetC2F5MwMRt4TmLXwj8PJ8nClRYGMecSQ4pr9iKKa+rWertHgKoJHl2XhheRa084GtL7i0ssOKbX2gfYFosuQ== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + "@metaplex-foundation/cusper" "^0.0.2" + "@solana/spl-token" "^0.3.6" + "@solana/web3.js" "^1.66.2" + bn.js "^5.2.0" + debug "^4.3.4" + "@metaplex-foundation/mpl-token-metadata@^2.5.2": version "2.5.2" resolved "https://registry.yarnpkg.com/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-2.5.2.tgz#ec84464e2bf65bf491abdc71c3882e5973dd9978" @@ -745,12 +1233,17 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/ed25519@^1.6.1", "@noble/ed25519@^1.7.1": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + "@noble/ed25519@^1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.1.tgz#6899660f6fbb97798a6fbd227227c4589a454724" integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== -"@noble/hashes@1.3.2", "@noble/hashes@^1.3.1": +"@noble/hashes@1.3.2", "@noble/hashes@^1.1.3", "@noble/hashes@^1.3.1": version "1.3.2" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== @@ -786,6 +1279,18 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@randlabs/communication-bridge@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3" + integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg== + +"@randlabs/myalgo-connect@^1.1.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05" + integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA== + dependencies: + "@randlabs/communication-bridge" "1.0.1" + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -854,6 +1359,18 @@ bn.js "^5.2.1" borsh "^0.7.0" +"@solana/spl-account-compression@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@solana/spl-account-compression/-/spl-account-compression-0.1.8.tgz#0c1fd052befddd90c2e8704b0b685761799d4bae" + integrity sha512-vsvsx358pVFPtyNd8zIZy0lezR0NuvOykQ29Zq+8oto+kHfTXMGXXQ1tKHUYke6XkINIWLFVg/jDi+1D9RYaqQ== + dependencies: + "@metaplex-foundation/beet" "^0.7.1" + "@metaplex-foundation/beet-solana" "^0.4.0" + bn.js "^5.2.1" + borsh "^0.7.0" + js-sha3 "^0.8.0" + typescript-collections "^1.3.3" + "@solana/spl-token-registry@^0.2.2405": version "0.2.4574" resolved "https://registry.yarnpkg.com/@solana/spl-token-registry/-/spl-token-registry-0.2.4574.tgz#13f4636b7bec90d2bb43bbbb83512cd90d2ce257" @@ -883,6 +1400,15 @@ "@solana/web3.js" "^1.32.0" start-server-and-test "^1.14.0" +"@solana/spl-token@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.3.8.tgz#8e9515ea876e40a4cc1040af865f61fc51d27edf" + integrity sha512-ogwGDcunP9Lkj+9CODOWMiVJEdRtqHAtX2rWF62KxnnSWtMZtV9rDhTrZFshiyJmxDnRL/1nKE1yJHg4jjs3gg== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + buffer "^6.0.3" + "@solana/spl-token@^0.3.6": version "0.3.6" resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.3.6.tgz#35473ad2ed71fe91e5754a2ac72901e1b8b26a42" @@ -892,6 +1418,24 @@ "@solana/buffer-layout-utils" "^0.2.0" buffer "^6.0.3" +"@solana/wallet-adapter-base@^0.9.2": + version "0.9.23" + resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.23.tgz#3b17c28afd44e173f44f658bf9700fd637e12a11" + integrity sha512-apqMuYwFp1jFi55NxDfvXUX2x1T0Zh07MxhZ/nCCTGys5raSfYUh82zen2BLv8BSDj/JxZ2P/s7jrQZGrX8uAw== + dependencies: + "@solana/wallet-standard-features" "^1.1.0" + "@wallet-standard/base" "^1.0.1" + "@wallet-standard/features" "^1.0.3" + eventemitter3 "^4.0.7" + +"@solana/wallet-standard-features@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@solana/wallet-standard-features/-/wallet-standard-features-1.1.0.tgz#516d78626dd0802d299db49298e4ebbec3433940" + integrity sha512-oVyygxfYkkF5INYL0GuD8GFmNO/wd45zNesIqGCFE6X66BYxmI6HmyzQJCcZTZ0BNsezlVg4t+3MCL5AhfFoGA== + dependencies: + "@wallet-standard/base" "^1.0.1" + "@wallet-standard/features" "^1.0.3" + "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.50.1", "@solana/web3.js@^1.56.2", "@solana/web3.js@^1.66.2": version "1.69.0" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.69.0.tgz#1756b1a26087172291c0b5163d3b44d24eef8aa7" @@ -913,6 +1457,27 @@ rpc-websockets "^7.5.0" superstruct "^0.14.2" +"@solana/web3.js@^1.36.0": + version "1.78.5" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.78.5.tgz#591cd47423cdb0b5e5cb7e8dc4dc70b2abe02f80" + integrity sha512-2ZHsDNqkKdglJQrIvJ3p2DmgS3cGnary3VJyqt9C1SPrpAtLYzcElr3xyXJOznyQTU/8AMw+GoF11lFoKbicKg== + dependencies: + "@babel/runtime" "^7.22.6" + "@noble/curves" "^1.0.0" + "@noble/hashes" "^1.3.1" + "@solana/buffer-layout" "^4.0.0" + agentkeepalive "^4.3.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.6.12" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + "@solana/web3.js@^1.63.1": version "1.78.4" resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.78.4.tgz#e8ca9abe4ec2af5fc540c1d272efee24aaffedb3" @@ -934,6 +1499,11 @@ rpc-websockets "^7.5.1" superstruct "^0.14.2" +"@supercharge/promise-pool@^2.1.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-2.4.0.tgz#6050eea8c2d7f92ddd4ddc582ee328b15c034ad3" + integrity sha512-O9CMipBlq5OObdt1uKJGIzm9cdjpPWfj+a+Zw9EgWKxaMNHKC7EU7X9taj3H0EGQNLOSq2jAcOa3EzxlfHsD6w== + "@types/babel__core@^7.1.14": version "7.1.20" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" @@ -967,7 +1537,7 @@ dependencies: "@babel/types" "^7.3.0" -"@types/bn.js@^5.1.1": +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== @@ -1052,16 +1622,35 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc" integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/node@^12.12.54": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + "@types/prettier@^2.1.5": version "2.7.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + "@types/semver@^7.3.12": version "7.3.13" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" @@ -1193,6 +1782,18 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@wallet-standard/base@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@wallet-standard/base/-/base-1.0.1.tgz#860dd94d47c9e3c5c43b79d91c6afdbd7a36264e" + integrity sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w== + +"@wallet-standard/features@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@wallet-standard/features/-/features-1.0.3.tgz#c992876c5e4f7a0672f8869c4146c87e0dfe48c8" + integrity sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA== + dependencies: + "@wallet-standard/base" "^1.0.1" + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -1219,6 +1820,11 @@ acorn@^8.8.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + agentkeepalive@^4.3.0: version "4.5.0" resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" @@ -1236,6 +1842,27 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +algo-msgpack-with-bigint@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6" + integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ== + +algosdk@^1.13.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/algosdk/-/algosdk-1.24.1.tgz#afc4102457ae0c38a32de6b84f4d713aedfc9e89" + integrity sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww== + dependencies: + algo-msgpack-with-bigint "^2.1.1" + buffer "^6.0.2" + cross-fetch "^3.1.5" + hi-base32 "^0.5.1" + js-sha256 "^0.9.0" + js-sha3 "^0.8.0" + js-sha512 "^0.8.0" + json-bigint "^1.0.0" + tweetnacl "^1.0.3" + vlq "^2.0.4" + ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -1290,6 +1917,35 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arbundles@^0.6.21: + version "0.6.22" + resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.6.22.tgz#0fd58ec76514f1d6c2db7c5870a6232314f52de6" + integrity sha512-QlSavBHk59mNqgQ6ScxlqaBJlDbSmSrK/uTcF3HojLAZ/4aufTkVTBjl1hSfZ/ZN45oIPgJC05R8SmVARF+8VA== + dependencies: + "@noble/ed25519" "^1.6.1" + "@randlabs/myalgo-connect" "^1.1.2" + "@solana/wallet-adapter-base" "^0.9.2" + algosdk "^1.13.1" + arweave "^1.11.4" + arweave-stream-tx "^1.1.0" + avsc "https://github.com/Bundlr-Network/avsc#csp-fixes" + axios "^0.21.3" + base64url "^3.0.1" + bs58 "^4.0.1" + ethers "^5.5.1" + keccak "^3.0.2" + multistream "^4.1.0" + process "^0.11.10" + secp256k1 "^4.0.2" + tmp-promise "^3.0.2" + +arconnect@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.4.2.tgz#83de7638fb46183e82d7ec7efb5594c5f7cdc806" + integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw== + dependencies: + arweave "^1.10.13" + arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -1327,17 +1983,55 @@ arrify@^1.0.0: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== +arweave-stream-tx@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f" + integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ== + dependencies: + exponential-backoff "^3.1.0" + +arweave@^1.10.13, arweave@^1.11.4: + version "1.14.0" + resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.14.0.tgz#a4424455a4137b7708cdc627b5bda1881d6881b5" + integrity sha512-P2g9FjbJZQfk0Q3a5R2aCyPP3jen3ZN6Oxh6p6BlwEGHn5M5O0KvZSaiNV4X/PENgnZA4+afOf9MR3ySGcR3JQ== + dependencies: + arconnect "^0.4.2" + asn1.js "^5.4.1" + base64-js "^1.5.1" + bignumber.js "^9.0.2" + +asn1.js@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axios@^0.21.1: +"avsc@https://github.com/Bundlr-Network/avsc#csp-fixes": + version "5.4.7" + resolved "https://github.com/Bundlr-Network/avsc#a730cc8018b79e114b6a3381bbb57760a24c6cef" + +axios@^0.21.1, axios@^0.21.3: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== @@ -1428,7 +2122,7 @@ base-x@^4.0.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== -base64-js@^1.3.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" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -1438,6 +2132,16 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== +base64url@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + bigint-buffer@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" @@ -1445,7 +2149,7 @@ bigint-buffer@^1.1.5: dependencies: bindings "^1.3.0" -bignumber.js@^9.0.1: +bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== @@ -1462,16 +2166,72 @@ bindings@^1.3.0: dependencies: file-uri-to-path "1.0.0" +bip39-light@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/bip39-light/-/bip39-light-1.0.7.tgz#06a72f251b89389a136d3f177f29b03342adc5ba" + integrity sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + +bip39@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.2.tgz#2baf42ff3071fc9ddd5103de92e8f80d9257ee32" + integrity sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + bluebird@3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +bn.js@^4.0.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +borsh@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.6.0.tgz#a7c9eeca6a31ca9e0607cb49f329cb659eb791e1" + integrity sha512-sl5k89ViqsThXQpYa9XDtz1sBl3l1lI313cFUY1HKr+wvMILnb+58xpkqTNrYbelh99dY7K8usxoCusQmqix9Q== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + borsh@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" @@ -1503,11 +2263,28 @@ braces@^3.0.2, braces@~3.0.2: 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" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + browserslist@^4.21.3: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" @@ -1539,6 +2316,15 @@ bs58@^5.0.0: dependencies: base-x "^4.0.0" +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1561,6 +2347,16 @@ buffer-layout@^1.2.0: resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== +buffer-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + buffer@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" @@ -1569,7 +2365,7 @@ buffer@6.0.1: base64-js "^1.3.1" ieee754 "^1.2.1" -buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: +buffer@6.0.3, buffer@^6.0.2, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -1577,6 +2373,14 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bufferutil@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" @@ -1612,6 +2416,11 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== +capability@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/capability/-/capability-0.2.5.tgz#51ad87353f1936ffd77f2f21c74633a4dea88801" + integrity sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg== + chai@^4.3.4: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -1634,7 +2443,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1647,6 +2456,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -1677,11 +2491,36 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1700,6 +2539,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1739,6 +2583,11 @@ commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1767,6 +2616,29 @@ cors@~2.8.5: object-assign "^4" vary "^1" +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@1.1.7, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-fetch@3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" @@ -1774,6 +2646,13 @@ cross-fetch@3.0.6: dependencies: node-fetch "2.6.1" +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1783,6 +2662,36 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@^3.1.9-1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +csv-generate@^4.2.6: + version "4.2.6" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-4.2.6.tgz#7146b41313d7c91d19d99891ef400d7f0931e908" + integrity sha512-VtnYqhWLcsUocA346ewFOk+rrqcoT663j11vXzD2uelXq9WguQ3QzDeVD8ISso7hhVtkDSHcWl9psdemeiEHDA== + +csv-parse@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.4.0.tgz#6793210a4a49a9a74b3fde3f9d00f3f52044fd89" + integrity sha512-JiQosUWiOFgp4hQn0an+SBoV9IKdqzhROM0iiN4LB7UpfJBlsSJlWl9nq4zGgxgMAzHJ6V4t29VAVD+3+2NJAg== + +csv-stringify@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-6.4.0.tgz#6d006dca9194700e44f9fbc541bee8bbbd4f459c" + integrity sha512-HQsw0QXiN5fdlO+R8/JzCZnR3Fqp8E87YVnhHlaPtNGJjt6ffbV0LpOkieIb1x6V1+xt878IYq77SpXHWAqKkA== + +csv@^6.0.5: + version "6.3.1" + resolved "https://registry.yarnpkg.com/csv/-/csv-6.3.1.tgz#52fb5d676ea084b2659dacd2b324e420bdd68989" + integrity sha512-ZTcWLvr0Ux0IQDz/QzhCToBVIZtF5GDrStMt9I8mRSk0jPnfF9OeYKz0EZTspaAEOK6hf515ag97nKmwoyU8ZA== + dependencies: + csv-generate "^4.2.6" + csv-parse "^5.4.0" + csv-stringify "^6.4.0" + stream-transform "^3.2.6" + date-fns@^2.28.0: version "2.29.3" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" @@ -1862,6 +2771,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -1880,6 +2796,16 @@ delay@^5.0.0: resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -1949,6 +2875,19 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +elliptic@6.5.4, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" @@ -1998,6 +2937,15 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error-polyfill@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/error-polyfill/-/error-polyfill-0.1.3.tgz#df848b61ad8834f7a5db69a70b9913df86721d15" + integrity sha512-XHJk60ufE+TG/ydwp4lilOog549iiQF2OAPhkk9DdiYWMrltz5yhDz/xnKuenNwP7gy3dsibssO5QpVhkrSzzg== + dependencies: + capability "^0.2.5" + o3 "^1.0.3" + u3 "^0.1.1" + es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.20.4" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" @@ -2216,6 +3164,89 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-util@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^5.5.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + event-stream@=3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -2234,6 +3265,14 @@ eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2265,6 +3304,20 @@ expect@^29.0.0, expect@^29.3.1: jest-message-util "^29.3.1" jest-util "^29.3.1" +exponential-backoff@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -2320,6 +3373,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2595,16 +3655,58 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hi-base32@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" + integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +http-errors@^1.7.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -2617,7 +3719,14 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -ieee754@^1.2.1: +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -2656,11 +3765,32 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inquirer@^8.2.0: + version "8.2.5" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -2746,6 +3876,16 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -3416,11 +4556,16 @@ js-sha256@^0.9.0: resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== -js-sha3@^0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-sha512@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4" + integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3446,6 +4591,13 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3488,6 +4640,15 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -3530,6 +4691,16 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -3545,7 +4716,7 @@ lodash@^4.17.20, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0: +log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -3608,6 +4779,15 @@ marked@^4.0.19: resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3618,6 +4798,17 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merkletreejs@^0.2.32: + version "0.2.32" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" + integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^3.1.9-1" + treeify "^1.1.0" + web3-utils "^1.3.4" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3631,18 +4822,33 @@ mime-db@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.34: +mime-types@^2.1.34, mime-types@~2.1.34: 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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" @@ -3716,6 +4922,24 @@ ms@2.1.3, ms@^2.0.0: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multistream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" + integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw== + dependencies: + once "^1.4.0" + readable-stream "^3.6.0" + +mustache@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + nanoid@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" @@ -3731,6 +4955,42 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +near-api-js@^0.44.2: + version "0.44.2" + resolved "https://registry.yarnpkg.com/near-api-js/-/near-api-js-0.44.2.tgz#e451f68f2c56bd885c7b918db5818a3e6e9423d0" + integrity sha512-eMnc4V+geggapEUa3nU2p8HSHn/njtloI4P2mceHQWO8vDE1NGpnAw8FuTBrLmXSgIv9m6oocgFc9t3VNf5zwg== + dependencies: + bn.js "5.2.0" + borsh "^0.6.0" + bs58 "^4.0.0" + depd "^2.0.0" + error-polyfill "^0.1.3" + http-errors "^1.7.2" + js-sha256 "^0.9.0" + mustache "^4.0.0" + node-fetch "^2.6.1" + text-encoding-utf-8 "^1.0.2" + tweetnacl "^1.0.1" + +near-hd-key@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/near-hd-key/-/near-hd-key-1.2.1.tgz#f508ff15436cf8a439b543220f3cc72188a46756" + integrity sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg== + dependencies: + bip39 "3.0.2" + create-hmac "1.1.7" + tweetnacl "1.0.3" + +near-seed-phrase@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/near-seed-phrase/-/near-seed-phrase-0.2.0.tgz#fb7cf89682112b1160ab68abb50dc821f49be18a" + integrity sha512-NpmrnejpY1AdlRpDZ0schJQJtfBaoUheRfiYtQpcq9TkwPgqKZCRULV5L3hHmLc0ep7KRtikbPQ9R2ztN/3cyQ== + dependencies: + bip39-light "^1.0.7" + bs58 "^4.0.1" + near-hd-key "^1.2.1" + tweetnacl "^1.0.2" + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -3749,6 +5009,11 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +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" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + node-fetch@2: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -3761,13 +5026,18 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.6.12: +node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" +node-gyp-build@^4.2.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== + node-gyp-build@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" @@ -3795,11 +5065,26 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + numeral@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== +o3@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/o3/-/o3-1.0.3.tgz#192ce877a882dfa6751f0412a865fafb2da1dac0" + integrity sha512-f+4n+vC6s4ysy7YO7O2gslWZBUu8Qj2i2OUJOvjRxQva7jVjYjB29jrr9NCjmxZQR0gzrOcv1RnqoYOeMs5VRQ== + dependencies: + capability "^0.2.5" + object-assign@^4: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3833,14 +5118,14 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.2: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -3859,6 +5144,26 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -3946,6 +5251,17 @@ pause-stream@0.0.11: dependencies: through "~2.3" +pbkdf2@^3.0.17, pbkdf2@^3.0.9: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4011,6 +5327,11 @@ pretty-format@^29.0.0, pretty-format@^29.3.1: ansi-styles "^5.0.0" react-is "^18.0.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -4036,7 +5357,7 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randombytes@^2.1.0: +randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -4053,6 +5374,15 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4129,6 +5459,14 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + resumer@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" @@ -4136,18 +5474,38 @@ resumer@^0.0.0: dependencies: through "~2.3.4" +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + rpc-websockets@^7.5.0: version "7.5.0" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.0.tgz#bbeb87572e66703ff151e50af1658f98098e2748" @@ -4174,6 +5532,11 @@ rpc-websockets@^7.5.1: bufferutil "^4.0.1" utf-8-validate "^5.0.2" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4188,7 +5551,14 @@ rxjs@^7.1.0, rxjs@^7.5.4: dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0: +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.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" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4202,6 +5572,25 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1, secp256k1@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + selective-whitespace@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/selective-whitespace/-/selective-whitespace-1.0.4.tgz#02d428b46b2c770398be9a538eb442b1e842fc5c" @@ -4228,6 +5617,24 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4258,7 +5665,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4377,6 +5784,11 @@ start-server-and-test@^1.14.0: ps-tree "1.2.0" wait-on "6.0.0" +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -4384,6 +5796,11 @@ stream-combiner@~0.0.4: dependencies: duplexer "~0.1.1" +stream-transform@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-3.2.6.tgz#7caeaaf68d2bf94fc412a520f2deb3c49b3bc0ab" + integrity sha512-/pyOvaCQFqYTmrFhmMbnAEVo3SsTx1H39eUVPOtYeAgbEUc+rDo7GoP8LbHJgU83mKtzJe/7Nq/ipaAnUOHgJQ== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -4428,6 +5845,13 @@ string.prototype.trimstart@^1.0.5: define-properties "^1.1.4" es-abstract "^1.20.4" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4450,6 +5874,13 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -4532,7 +5963,7 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through@2, "through@>=2.2.7 <3", through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -4542,6 +5973,27 @@ timeago.js@^4.0.2: resolved "https://registry.yarnpkg.com/timeago.js/-/timeago.js-4.0.2.tgz#724e8c8833e3490676c7bb0a75f5daf20e558028" integrity sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w== +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -4559,6 +6011,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + tokenize-whitespace@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tokenize-whitespace/-/tokenize-whitespace-0.0.1.tgz#3c207ab58948113225246285200563e3b4b5c6ff" @@ -4574,6 +6031,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + ts-essentials@^9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-9.3.0.tgz#7e639c1a76b1805c3c60d6e1b5178da2e70aea02" @@ -4650,7 +6112,7 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tweetnacl@^1.0.3: +tweetnacl@1.0.3, tweetnacl@^1.0.1, tweetnacl@^1.0.2, tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -4697,6 +6159,11 @@ typescript@^4.3.5: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +u3@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/u3/-/u3-0.1.1.tgz#5f52044f42ee76cd8de33148829e14528494b73b" + integrity sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -4729,6 +6196,16 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "^4.3.0" +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -4748,6 +6225,11 @@ vary@^1: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vlq@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041" + integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA== + vscode-oniguruma@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" @@ -4787,6 +6269,26 @@ walker@^1.0.7, walker@^1.0.8: dependencies: makeerror "1.0.12" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -4872,6 +6374,11 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@^7.4.5: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" diff --git a/clients/js/src/generated/errors/mplBubblegum.ts b/clients/js/src/generated/errors/mplBubblegum.ts index 60c6ea5e..56691df0 100644 --- a/clients/js/src/generated/errors/mplBubblegum.ts +++ b/clients/js/src/generated/errors/mplBubblegum.ts @@ -491,6 +491,93 @@ export class DecompressionDisabledError extends ProgramError { codeToErrorMap.set(0x1791, DecompressionDisabledError); nameToErrorMap.set('DecompressionDisabled', DecompressionDisabledError); +/** MissingCollectionMintAccount: Missing collection mint account */ +export class MissingCollectionMintAccountError extends ProgramError { + readonly name: string = 'MissingCollectionMintAccount'; + + readonly code: number = 0x1792; // 6034 + + constructor(program: Program, cause?: Error) { + super('Missing collection mint account', program, cause); + } +} +codeToErrorMap.set(0x1792, MissingCollectionMintAccountError); +nameToErrorMap.set( + 'MissingCollectionMintAccount', + MissingCollectionMintAccountError +); + +/** MissingCollectionMetadataAccount: Missing collection metadata account */ +export class MissingCollectionMetadataAccountError extends ProgramError { + readonly name: string = 'MissingCollectionMetadataAccount'; + + readonly code: number = 0x1793; // 6035 + + constructor(program: Program, cause?: Error) { + super('Missing collection metadata account', program, cause); + } +} +codeToErrorMap.set(0x1793, MissingCollectionMetadataAccountError); +nameToErrorMap.set( + 'MissingCollectionMetadataAccount', + MissingCollectionMetadataAccountError +); + +/** CollectionMismatch: Collection mismatch */ +export class CollectionMismatchError extends ProgramError { + readonly name: string = 'CollectionMismatch'; + + readonly code: number = 0x1794; // 6036 + + constructor(program: Program, cause?: Error) { + super('Collection mismatch', program, cause); + } +} +codeToErrorMap.set(0x1794, CollectionMismatchError); +nameToErrorMap.set('CollectionMismatch', CollectionMismatchError); + +/** MetadataImmutable: Metadata not mutable */ +export class MetadataImmutableError extends ProgramError { + readonly name: string = 'MetadataImmutable'; + + readonly code: number = 0x1795; // 6037 + + constructor(program: Program, cause?: Error) { + super('Metadata not mutable', program, cause); + } +} +codeToErrorMap.set(0x1795, MetadataImmutableError); +nameToErrorMap.set('MetadataImmutable', MetadataImmutableError); + +/** PrimarySaleCanOnlyBeFlippedToTrue: Can only update primary sale to true */ +export class PrimarySaleCanOnlyBeFlippedToTrueError extends ProgramError { + readonly name: string = 'PrimarySaleCanOnlyBeFlippedToTrue'; + + readonly code: number = 0x1796; // 6038 + + constructor(program: Program, cause?: Error) { + super('Can only update primary sale to true', program, cause); + } +} +codeToErrorMap.set(0x1796, PrimarySaleCanOnlyBeFlippedToTrueError); +nameToErrorMap.set( + 'PrimarySaleCanOnlyBeFlippedToTrue', + PrimarySaleCanOnlyBeFlippedToTrueError +); + +/** CreatorDidNotUnverify: Creator did not unverify the metadata */ +export class CreatorDidNotUnverifyError extends ProgramError { + readonly name: string = 'CreatorDidNotUnverify'; + + readonly code: number = 0x1797; // 6039 + + constructor(program: Program, cause?: Error) { + super('Creator did not unverify the metadata', program, cause); + } +} +codeToErrorMap.set(0x1797, CreatorDidNotUnverifyError); +nameToErrorMap.set('CreatorDidNotUnverify', CreatorDidNotUnverifyError); + /** * Attempts to resolve a custom program error from the provided error code. * @category Errors diff --git a/clients/js/src/generated/instructions/index.ts b/clients/js/src/generated/instructions/index.ts index 58083c6e..9f12dae8 100644 --- a/clients/js/src/generated/instructions/index.ts +++ b/clients/js/src/generated/instructions/index.ts @@ -20,6 +20,7 @@ export * from './setTreeDelegate'; export * from './transfer'; export * from './unverifyCollection'; export * from './unverifyCreator'; +export * from './updateMetadata'; export * from './verifyCollection'; export * from './verifyCreator'; export * from './verifyLeaf'; diff --git a/clients/js/src/generated/instructions/updateMetadata.ts b/clients/js/src/generated/instructions/updateMetadata.ts new file mode 100644 index 00000000..a8b6a346 --- /dev/null +++ b/clients/js/src/generated/instructions/updateMetadata.ts @@ -0,0 +1,255 @@ +/** + * This code was AUTOGENERATED using the kinobi library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun kinobi to update it. + * + * @see https://github.com/metaplex-foundation/kinobi + */ + +import { + Context, + Pda, + PublicKey, + Signer, + TransactionBuilder, + transactionBuilder, +} from '@metaplex-foundation/umi'; +import { + Serializer, + array, + bytes, + mapSerializer, + struct, + u32, + u64, + u8, +} from '@metaplex-foundation/umi/serializers'; +import { findTreeConfigPda } from '../accounts'; +import { + ResolvedAccount, + ResolvedAccountsWithIndices, + expectPublicKey, + expectSome, + getAccountMetasAndSigners, +} from '../shared'; +import { + MetadataArgs, + MetadataArgsArgs, + UpdateArgs, + UpdateArgsArgs, + getMetadataArgsSerializer, + getUpdateArgsSerializer, +} from '../types'; + +// Accounts. +export type UpdateMetadataInstructionAccounts = { + treeConfig?: PublicKey | Pda; + /** + * Either collection authority or tree owner/delegate, depending + * on whether the item is in a verified collection + */ + + authority?: Signer; + /** Used when item is in a verified collection */ + collectionMint?: PublicKey | Pda; + /** Used when item is in a verified collection */ + collectionMetadata?: PublicKey | Pda; + collectionAuthorityRecordPda?: PublicKey | Pda; + leafOwner: PublicKey | Pda; + leafDelegate?: PublicKey | Pda; + payer?: Signer; + merkleTree: PublicKey | Pda; + logWrapper?: PublicKey | Pda; + compressionProgram?: PublicKey | Pda; + tokenMetadataProgram?: PublicKey | Pda; + systemProgram?: PublicKey | Pda; +}; + +// Data. +export type UpdateMetadataInstructionData = { + discriminator: Array; + root: Uint8Array; + nonce: bigint; + index: number; + currentMetadata: MetadataArgs; + updateArgs: UpdateArgs; +}; + +export type UpdateMetadataInstructionDataArgs = { + root: Uint8Array; + nonce: number | bigint; + index: number; + currentMetadata: MetadataArgsArgs; + updateArgs: UpdateArgsArgs; +}; + +export function getUpdateMetadataInstructionDataSerializer(): Serializer< + UpdateMetadataInstructionDataArgs, + UpdateMetadataInstructionData +> { + return mapSerializer< + UpdateMetadataInstructionDataArgs, + any, + UpdateMetadataInstructionData + >( + struct( + [ + ['discriminator', array(u8(), { size: 8 })], + ['root', bytes({ size: 32 })], + ['nonce', u64()], + ['index', u32()], + ['currentMetadata', getMetadataArgsSerializer()], + ['updateArgs', getUpdateArgsSerializer()], + ], + { description: 'UpdateMetadataInstructionData' } + ), + (value) => ({ + ...value, + discriminator: [170, 182, 43, 239, 97, 78, 225, 186], + }) + ) as Serializer< + UpdateMetadataInstructionDataArgs, + UpdateMetadataInstructionData + >; +} + +// Args. +export type UpdateMetadataInstructionArgs = UpdateMetadataInstructionDataArgs; + +// Instruction. +export function updateMetadata( + context: Pick, + input: UpdateMetadataInstructionAccounts & UpdateMetadataInstructionArgs +): TransactionBuilder { + // Program ID. + const programId = context.programs.getPublicKey( + 'mplBubblegum', + 'BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY' + ); + + // Accounts. + const resolvedAccounts: ResolvedAccountsWithIndices = { + treeConfig: { + index: 0, + isWritable: false, + value: input.treeConfig ?? null, + }, + authority: { index: 1, isWritable: false, value: input.authority ?? null }, + collectionMint: { + index: 2, + isWritable: false, + value: input.collectionMint ?? null, + }, + collectionMetadata: { + index: 3, + isWritable: false, + value: input.collectionMetadata ?? null, + }, + collectionAuthorityRecordPda: { + index: 4, + isWritable: false, + value: input.collectionAuthorityRecordPda ?? null, + }, + leafOwner: { index: 5, isWritable: false, value: input.leafOwner ?? null }, + leafDelegate: { + index: 6, + isWritable: false, + value: input.leafDelegate ?? null, + }, + payer: { index: 7, isWritable: false, value: input.payer ?? null }, + merkleTree: { index: 8, isWritable: true, value: input.merkleTree ?? null }, + logWrapper: { + index: 9, + isWritable: false, + value: input.logWrapper ?? null, + }, + compressionProgram: { + index: 10, + isWritable: false, + value: input.compressionProgram ?? null, + }, + tokenMetadataProgram: { + index: 11, + isWritable: false, + value: input.tokenMetadataProgram ?? null, + }, + systemProgram: { + index: 12, + isWritable: false, + value: input.systemProgram ?? null, + }, + }; + + // Arguments. + const resolvedArgs: UpdateMetadataInstructionArgs = { ...input }; + + // Default values. + if (!resolvedAccounts.treeConfig.value) { + resolvedAccounts.treeConfig.value = findTreeConfigPda(context, { + merkleTree: expectPublicKey(resolvedAccounts.merkleTree.value), + }); + } + if (!resolvedAccounts.authority.value) { + resolvedAccounts.authority.value = context.identity; + } + if (!resolvedAccounts.leafDelegate.value) { + resolvedAccounts.leafDelegate.value = expectSome( + resolvedAccounts.leafOwner.value + ); + } + if (!resolvedAccounts.payer.value) { + resolvedAccounts.payer.value = context.payer; + } + if (!resolvedAccounts.logWrapper.value) { + resolvedAccounts.logWrapper.value = context.programs.getPublicKey( + 'splNoop', + 'noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV' + ); + resolvedAccounts.logWrapper.isWritable = false; + } + if (!resolvedAccounts.compressionProgram.value) { + resolvedAccounts.compressionProgram.value = context.programs.getPublicKey( + 'splAccountCompression', + 'cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK' + ); + resolvedAccounts.compressionProgram.isWritable = false; + } + if (!resolvedAccounts.tokenMetadataProgram.value) { + resolvedAccounts.tokenMetadataProgram.value = context.programs.getPublicKey( + 'mplTokenMetadata', + 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s' + ); + resolvedAccounts.tokenMetadataProgram.isWritable = false; + } + if (!resolvedAccounts.systemProgram.value) { + resolvedAccounts.systemProgram.value = context.programs.getPublicKey( + 'splSystem', + '11111111111111111111111111111111' + ); + resolvedAccounts.systemProgram.isWritable = false; + } + + // Accounts in order. + const orderedAccounts: ResolvedAccount[] = Object.values( + resolvedAccounts + ).sort((a, b) => a.index - b.index); + + // Keys and Signers. + const [keys, signers] = getAccountMetasAndSigners( + orderedAccounts, + 'programId', + programId + ); + + // Data. + const data = getUpdateMetadataInstructionDataSerializer().serialize( + resolvedArgs as UpdateMetadataInstructionDataArgs + ); + + // Bytes Created On Chain. + const bytesCreatedOnChain = 0; + + return transactionBuilder([ + { instruction: { keys, programId, data }, signers, bytesCreatedOnChain }, + ]); +} diff --git a/clients/js/src/generated/types/index.ts b/clients/js/src/generated/types/index.ts index cfd6944c..57c34848 100644 --- a/clients/js/src/generated/types/index.ts +++ b/clients/js/src/generated/types/index.ts @@ -17,6 +17,7 @@ export * from './leafSchema'; export * from './metadataArgs'; export * from './tokenProgramVersion'; export * from './tokenStandard'; +export * from './updateArgs'; export * from './useMethod'; export * from './uses'; export * from './version'; diff --git a/clients/js/src/generated/types/updateArgs.ts b/clients/js/src/generated/types/updateArgs.ts new file mode 100644 index 00000000..886a4bd0 --- /dev/null +++ b/clients/js/src/generated/types/updateArgs.ts @@ -0,0 +1,70 @@ +/** + * This code was AUTOGENERATED using the kinobi library. + * Please DO NOT EDIT THIS FILE, instead use visitors + * to add features, then rerun kinobi to update it. + * + * @see https://github.com/metaplex-foundation/kinobi + */ + +import { Option, OptionOrNullable, none } from '@metaplex-foundation/umi'; +import { + Serializer, + array, + bool, + mapSerializer, + option, + string, + struct, + u16, +} from '@metaplex-foundation/umi/serializers'; +import { Creator, CreatorArgs, getCreatorSerializer } from '.'; + +export type UpdateArgs = { + name: Option; + symbol: Option; + uri: Option; + creators: Option>; + sellerFeeBasisPoints: Option; + primarySaleHappened: Option; + isMutable: Option; +}; + +export type UpdateArgsArgs = { + name?: OptionOrNullable; + symbol?: OptionOrNullable; + uri?: OptionOrNullable; + creators?: OptionOrNullable>; + sellerFeeBasisPoints?: OptionOrNullable; + primarySaleHappened?: OptionOrNullable; + isMutable?: OptionOrNullable; +}; + +export function getUpdateArgsSerializer(): Serializer< + UpdateArgsArgs, + UpdateArgs +> { + return mapSerializer( + struct( + [ + ['name', option(string())], + ['symbol', option(string())], + ['uri', option(string())], + ['creators', option(array(getCreatorSerializer()))], + ['sellerFeeBasisPoints', option(u16())], + ['primarySaleHappened', option(bool())], + ['isMutable', option(bool())], + ], + { description: 'UpdateArgs' } + ), + (value) => ({ + ...value, + name: value.name ?? none(), + symbol: value.symbol ?? none(), + uri: value.uri ?? none(), + creators: value.creators ?? none(), + sellerFeeBasisPoints: value.sellerFeeBasisPoints ?? none(), + primarySaleHappened: value.primarySaleHappened ?? none(), + isMutable: value.isMutable ?? none(), + }) + ) as Serializer; +} diff --git a/clients/rust/Cargo.lock b/clients/rust/Cargo.lock index 3360bead..8f90b16c 100644 --- a/clients/rust/Cargo.lock +++ b/clients/rust/Cargo.lock @@ -69,7 +69,7 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", "once_cell", "version_check", ] @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", - "getrandom 0.2.11", + "getrandom 0.2.12", "once_cell", "version_check", "zerocopy", @@ -125,7 +125,7 @@ checksum = "faa5be5b72abea167f87c868379ba3c2be356bfca9e6f474fd055fa0f7eeb4f2" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "regex", "syn 1.0.109", @@ -140,7 +140,7 @@ dependencies = [ "anchor-syn", "anyhow", "bs58 0.5.0", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "rustversion", "syn 1.0.109", @@ -153,7 +153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59948e7f9ef8144c2aefb3f32a40c5fce2798baeec765ba038389e82301017ef" dependencies = [ "anchor-syn", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "syn 1.0.109", ] @@ -164,7 +164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc753c9d1c7981cb8948cf7e162fb0f64558999c0413058e2d43df1df5448086" dependencies = [ "anchor-syn", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -177,7 +177,7 @@ checksum = "f38b4e172ba1b52078f53fdc9f11e3dc0668ad27997838a0aad2d148afac8c97" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -190,7 +190,7 @@ checksum = "4eebd21543606ab61e2d83d9da37d24d3886a49f390f9c43a1964735e8c0f0d5" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -203,7 +203,7 @@ checksum = "ec4720d899b3686396cced9508f23dab420f1308344456ec78ef76f98fda42af" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -214,7 +214,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f495e85480bd96ddeb77b71d499247c7d4e8b501e75ecb234e9ef7ae7bd6552a" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -238,7 +238,7 @@ dependencies = [ "bincode", "borsh 0.10.3", "bytemuck", - "getrandom 0.2.11", + "getrandom 0.2.12", "solana-program", "thiserror", ] @@ -252,7 +252,7 @@ dependencies = [ "anyhow", "bs58 0.5.0", "heck 0.3.3", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "serde", "serde_json", @@ -357,7 +357,7 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.4", "num-traits", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -393,7 +393,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -454,7 +454,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", "synstructure", @@ -466,7 +466,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -517,9 +517,9 @@ version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -568,9 +568,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -676,7 +676,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "syn 1.0.109", ] @@ -689,7 +689,7 @@ dependencies = [ "borsh-derive-internal 0.10.3", "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "syn 1.0.109", ] @@ -699,7 +699,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -710,7 +710,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -721,7 +721,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -732,7 +732,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -804,9 +804,9 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -965,15 +965,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] @@ -1026,9 +1026,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -1044,44 +1044,37 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -1150,10 +1143,10 @@ checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "strsim 0.10.0", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1164,7 +1157,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1229,7 +1222,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -1281,9 +1274,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1357,7 +1350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -1398,9 +1391,9 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1411,9 +1404,9 @@ checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint 0.4.4", "num-traits", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1554,9 +1547,9 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1625,9 +1618,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1655,9 +1648,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "b553656127a00601c8ae5590fcfdc118e4083a7924b6cf4ffc1ea4b99dc429d7" dependencies = [ "bytes", "fnv", @@ -2025,9 +2018,9 @@ dependencies = [ [[package]] name = "kaigan" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ade400c53c86236d5b03b681e6c4e3d1d8da674e78a3916480886614674f017" +checksum = "e623cca1f0e2a0919032c1bdabbf81dd9aa34658d5066aca7bb90d608317ab91" dependencies = [ "borsh 0.10.3", "serde", @@ -2050,9 +2043,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "libsecp256k1" @@ -2246,7 +2239,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -2350,7 +2343,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -2361,9 +2354,9 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -2429,11 +2422,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ - "num_enum_derive 0.7.1", + "num_enum_derive 0.7.2", ] [[package]] @@ -2443,21 +2436,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "num_enum_derive" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ - "proc-macro-crate 2.0.1", - "proc-macro2 1.0.74", + "proc-macro-crate 3.0.0", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -2545,7 +2538,7 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -2636,9 +2629,9 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -2727,12 +2720,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +checksum = "6b2685dd208a3771337d8d386a89840f0f43cd68be8dae90a5f8c2384effc9cd" dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.21.0", ] [[package]] @@ -2742,7 +2734,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", "version_check", @@ -2754,7 +2746,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "version_check", ] @@ -2770,9 +2762,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.74" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] @@ -2851,7 +2843,7 @@ version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", ] [[package]] @@ -2913,7 +2905,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.11", + "getrandom 0.2.12", ] [[package]] @@ -3011,7 +3003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" dependencies = [ "async-compression", - "base64 0.21.5", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -3068,7 +3060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.11", + "getrandom 0.2.12", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -3181,7 +3173,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", ] [[package]] @@ -3245,9 +3237,9 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -3291,9 +3283,9 @@ checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.194" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] @@ -3309,20 +3301,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.194" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.110" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", @@ -3357,7 +3349,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", @@ -3375,9 +3367,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ "darling", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -3387,9 +3379,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" dependencies = [ "darling", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -3526,12 +3518,12 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1061ae0eecf24b58e57abce2fad5b962092887c6afcfd14ce8cc24818dac7ae4" +checksum = "b5763ba7519b166b152ca2c6f8defa22cd07d3aea42a3a86b74519857fc3d464" dependencies = [ "Inflector", - "base64 0.21.5", + "base64 0.21.7", "bincode", "bs58 0.4.0", "bv", @@ -3551,9 +3543,9 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a8cfddfed87fae43af3a539171267f8d47fd9a1f9a8e3fd2b7508b52ebb593" +checksum = "18a216474b9d25153d629aa7f4fb2246bc875ebe90e1155380e0436c209e62d5" dependencies = [ "bincode", "bytemuck", @@ -3572,9 +3564,9 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fa99fb3c089a5ecc455c1b6eff7aed6833782ccffe8c2c35bc75138efe55c7" +checksum = "dd7f5b9262637ec61f0755d0a657332c61d8d7b6a1fa63c64664391b469a6282" dependencies = [ "borsh 0.10.3", "futures", @@ -3589,9 +3581,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6855f9fb2bbcaa5db359701bad0f4fa39647a21b2899db54d8843d64c26c5359" +checksum = "0610d7fee589a2ab66c0f7d08866fa8be7c3851b8e3361948134cd6116b1d077" dependencies = [ "serde", "solana-sdk", @@ -3600,9 +3592,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b013dd7bc7b6a46b04c7ba2180c0814709b6a7dfe1365827d8c6b759bf538b73" +checksum = "e2209441a76b00a9b8368df8af84fbba695ef08c70fc66e885c5cb533ee4a85b" dependencies = [ "bincode", "crossbeam-channel", @@ -3619,9 +3611,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98a1e2ca4df9b8d33eaa97576f0e8041b6f9c907772fe35b170c1eead5382e2" +checksum = "1c23c74148a75c1e5f8bb26113306198be1f030e75f3e23f8335470d9e014227" dependencies = [ "bincode", "byteorder", @@ -3638,9 +3630,9 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a6f74d4215c0425c732ade3371639bda4c16a723b5ac33a91cb634f0acc376" +checksum = "4dae145ef8145f850fc3fb832802ebed13dd91a51fff457d5f06f5c31a62efee" dependencies = [ "bv", "log", @@ -3655,9 +3647,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8460c35e48160995b9e6c377f8fd08ce478cae833decb1d54214253e76321f0" +checksum = "2bef7e2234cf1179b8ceadfae922d38d79f82932a762ff62b0051e0b3205984f" dependencies = [ "chrono", "clap 2.34.0", @@ -3673,9 +3665,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffe77e35669aeda1c640153e8c7bc15b9b725e8957fd5911022980952e1dddb" +checksum = "2644f5a0c91f8c44db175d35d52bf772799597dbedf6a5d9f138d61e2b52b826" dependencies = [ "async-trait", "bincode", @@ -3706,9 +3698,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed90e87a7381cc4a93cd63c52fff8f60796144c797f7d2548efa0856e3cc35a" +checksum = "61fe4b2d4e756c32139444cc3f8ee32fdc9b9aceb02e82216694fd36141dd126" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -3716,9 +3708,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103c05b62d8b321cf3a3531a2b96ebb105df4eac2f80f26a7205d6bd7b9882ce" +checksum = "3bb9b6d2c575e1eecd85380cb6442525a0d2639afa627552264eaa7050f47fb3" dependencies = [ "bincode", "chrono", @@ -3730,9 +3722,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006c3df783562f7bca6d35c9d5dd17db3a1e7f22d54144d4180f1db5ccb3fdf0" +checksum = "dcd27f413c3702ee20bbf1152e928f9adff0a37fef0f36b956d4eb34aae2be71" dependencies = [ "async-trait", "bincode", @@ -3751,9 +3743,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d229588852b514378c88ea74ef6fb93c5575758d2aa3a6a300872ccf5be51772" +checksum = "a7077f6495ccc313dff49c3e3f3ed03e49058258bae7fee77ac29ba0a474ba82" dependencies = [ "ahash 0.8.6", "blake3", @@ -3784,21 +3776,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad75a8290906967a9737c76bb5cc9769cee2097a6a6fbda08017562454ead020" +checksum = "f516f992211a2ab70de5c367190575c97e02d156f9f1d8b76886d673f30e88a2" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "rustc_version", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "solana-loader-v4-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0956aca0aa3a990a9bb341e13b541f1f18284db252f06185dbb7d040cb564c0" +checksum = "fb13799b6df3e8ebd19862dabbb51781774d300405cbab244b35c482edc700ca" dependencies = [ "log", "rand 0.7.3", @@ -3810,9 +3802,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4896bca227a92b31c7be15f524850aba3255d94dcb837a4097daba723a84757" +checksum = "7b64def674bfaa4a3f8be7ba19c03c9caec4ec028ba62b9a427ec1bf608a2486" dependencies = [ "env_logger", "lazy_static", @@ -3821,9 +3813,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b0389a4a6f956173904d7ad0eb5058723c25d68d7c75bdc434637e8a4e08a3" +checksum = "932db6604bcf8ba3bba68e80564d7eaa0dd7b9667407e15c3557caa83203aee7" dependencies = [ "log", "solana-sdk", @@ -3831,9 +3823,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7a9cbc8b9d706398e7653123c526aba0ffbf4bf4184e0190cdba386c8b600c" +checksum = "5d81931f224798c0e52062b0683a07eebe1c1904954c8765773c9802a28fbd0c" dependencies = [ "crossbeam-channel", "gethostname", @@ -3845,9 +3837,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f987bdd6a27eb48320f409b020f9d2646a2ec0ca8d9361de53be759bdd209e65" +checksum = "7ea3420fa9da3789548f31b3c68e6a090bfd1320c735289851b711546d38e3b0" dependencies = [ "bincode", "clap 3.2.25", @@ -3867,9 +3859,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897cee370814792aff81ae93578ead9e5bd35b2f7e45a956aa2b12536f6d81e3" +checksum = "5859de708bd12fb189f3c161cda03fdd341ffcf6be4fe787c7d730a30d589ac6" dependencies = [ "ahash 0.8.6", "bincode", @@ -3894,16 +3886,16 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de52673b07eda66299b6ff858c54f3d08bdf4addc5c56969f0a94a09bb63f853" +checksum = "3e92350aa5b42564681655331e7e0b9d5c99a442de317ceeb4741efbbe9a6c05" dependencies = [ "ark-bn254", "ark-ec", "ark-ff", "ark-serialize", "array-bytes", - "base64 0.21.5", + "base64 0.21.7", "bincode", "bitflags 1.3.2", "blake3", @@ -3916,7 +3908,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.11", + "getrandom 0.2.12", "itertools", "js-sys", "lazy_static", @@ -3949,11 +3941,11 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1046f13174ed22f56fa8658265dc952372407772c7bb3d8f60505afa1b30c1" +checksum = "3da0e9dd63326ded2055b42e54aa37baa6aeb8adaea658a0059c234af6d05c02" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bincode", "eager", "enum-iterator", @@ -3977,13 +3969,13 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b21eb50e63a6904a4b3dc0a265e61f10b83e0c9076d0e2a57b8279c928b712e" +checksum = "d72aaaabfc85bb6750c14ff6b69df500ed07749dbc2b775d4499f6b1eb5ceef7" dependencies = [ "assert_matches", "async-trait", - "base64 0.21.5", + "base64 0.21.7", "bincode", "chrono-humanize", "crossbeam-channel", @@ -4004,9 +3996,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a09f7e643a075001dc7362955b829181e027ff23b12049f576277e2ffb1d0a0c" +checksum = "b9d1ad6fa8f0e154b91e67969fdf5478e74b75a87d5e3dce14ab83f4cb2f60f1" dependencies = [ "crossbeam-channel", "futures-util", @@ -4029,9 +4021,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2c1955a009913174433ba086590b9baf785d7023248abf11b42534b1ac70e53" +checksum = "de9426ee9c0f98522242d6656db18175a022959af0b8ed3f170729e29933cf08" dependencies = [ "async-mutex", "async-trait", @@ -4057,9 +4049,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "856ff9020c43ae49ed341572454e8b33d400c787f9f2a9f48783f3607c7e399a" +checksum = "c3e6c7a43e34d7db0ad158690b331df15b92f6996e3b9b03629591a54fc3e97f" dependencies = [ "lazy_static", "num_cpus", @@ -4067,9 +4059,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56a5a567539d6585acc0a0038da5f1350cfca6574272fef545988a469e87286b" +checksum = "ed87a28ede1536be71352e13965b1fe7a2cf205e3e4fae2eef8a3407219ba1cd" dependencies = [ "console", "dialoguer", @@ -4086,12 +4078,12 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54fda1c759f8aa828052659ff1553d0383e721676110842b69e5e0ae997d6441" +checksum = "f273acbce4493bc1de8174b94cfaee112b72263ae1684a6e13890f5004be53fb" dependencies = [ "async-trait", - "base64 0.21.5", + "base64 0.21.7", "bincode", "bs58 0.4.0", "indicatif", @@ -4112,11 +4104,11 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29959e74308d074a88339712cf407a091bc9382a67298b8a83f02d0279aca1e" +checksum = "4462198830687b83870985db945c5d49c720d83abf516c8206fefba12cca689d" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bs58 0.4.0", "jsonrpc-core", "reqwest", @@ -4134,9 +4126,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b14d3733afbe844ec9a6210982e7ea7bda23b5bce4af637e08a7a92f78b4b4" +checksum = "91b3abad7b1ffd4b29d33b7525ebbc2ec8d0ca5928e4d8f28e364928d68a8dd9" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4147,12 +4139,12 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c251f2b7656e22f31f4feb389e269015dde50fda994eea115ce0df8c4d27280" +checksum = "3c014aff6ce20b28f1e5057a3f78081821d4b62eccd9dc3b6a7e756be85f8bc4" dependencies = [ "arrayref", - "base64 0.21.5", + "base64 0.21.7", "bincode", "blake3", "bv", @@ -4219,12 +4211,12 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d5e51b30ff694f1353755b0e1672bc01a6b72ad12353fac4e53957a2a1f783" +checksum = "2087e15c92d4d6b3f085dc12fbe9614141c811f90a54cc418240ac30b608133f" dependencies = [ "assert_matches", - "base64 0.21.5", + "base64 0.21.7", "bincode", "bitflags 1.3.2", "borsh 0.10.3", @@ -4272,22 +4264,22 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5c5ae1f2b5e7dec7dcab0199a642e1900b981c156547942156c5c4fbcc3eafa" +checksum = "2e0e0e7ee984b0f9179a1d4f4e9e67ce675de2324b5a98b61d2bdb61be3c19bb" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "rustversion", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "solana-send-transaction-service" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5360bf4af2b98b8cfea90cd497490c3741e4f822c4fa75a4b4aba4f58414c0c2" +checksum = "c1afb10d881ba8eecf2edbfffe7d51b7f27b953f1ab2148cb3ba0157e4bf6c75" dependencies = [ "crossbeam-channel", "log", @@ -4301,9 +4293,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e3abec79a2978cbd92567edbaf71bf7be16b0275123c1a67b5bb3902ea26b3e" +checksum = "a543a3de0eb703e856dca5b92b4fe461bac5aa12080bd8486105acf265cbb68d" dependencies = [ "bincode", "log", @@ -4316,9 +4308,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e552da2c1b63fed220858d4cf6dd585d8a5175a1e0a5fafbc56dda21630d57" +checksum = "a868a782cab696677cd12deacda1862dbeeba903a4a8d8404a4d6bf45e8a556c" dependencies = [ "async-channel", "bytes", @@ -4349,9 +4341,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00ed773979d7a5ccef68083f526f58c1196d8942f9f7e8f5f8dee744a1053fda" +checksum = "cf47ccfe21b717fa4a3d6c26d8d77a039648c456d3fc37ebf3e0c8ea95c5f37b" dependencies = [ "bincode", "log", @@ -4363,9 +4355,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5c7d72a9ea3ac06bdcee2511c99fc14470edf0bda3d629cc50758438c2580b4" +checksum = "222f5539a4b01a5374c919e78aca5d4472fa5af6e551bf9f4ddd97ca59374f6d" dependencies = [ "bincode", "log", @@ -4378,9 +4370,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3cb713f3fd335ce1b3699314027605ca80231e9347ad1d09e1b7e1c58bf31d3" +checksum = "8c0f954b48dda0a907dbdb54387459c8eb7e9c702f278bf70a2caf3ebc417c88" dependencies = [ "async-trait", "bincode", @@ -4403,12 +4395,12 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e13704102abe15f421d6a59e65db6d8aa0c1a61540ab1c744c5ce58a086bc1c" +checksum = "7992d9605a65967b5e40e6ef8e285a953888e4789f0f5e3fb7339bf018cbb677" dependencies = [ "Inflector", - "base64 0.21.5", + "base64 0.21.7", "bincode", "borsh 0.10.3", "bs58 0.4.0", @@ -4429,9 +4421,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96136ce9b671d9a0dc3c1231236fa2fa8aa5b7379c53449eb9bcb2214b6e8455" +checksum = "4329dfe364cb276c7137b459e3737a27d6ae180f60d0aa2274d8be86cac3472c" dependencies = [ "async-trait", "solana-connection-cache", @@ -4444,9 +4436,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32dc5d88030e9930b5e306e3562e7c81347165b42dc3ad6586d4ce91c9bba70a" +checksum = "1931390daf0938c072c167611a263a8b95c13476d7fff7c8eb12789a981685b3" dependencies = [ "log", "rustc_version", @@ -4460,9 +4452,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520cb33e0d3bf61075ca7919a5ec30ad34e95e1f467ecc1bea55d5a1f887cc88" +checksum = "25669860e2c5e821a8caa5372589289fbb6ac3084096133fdd1c6af6546536a2" dependencies = [ "bincode", "log", @@ -4482,9 +4474,9 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96da20016bf0e9d59cc2d262871d810f396fdda31fee7175c934d6f92cc3be8b" +checksum = "c1a6a21efae8933fbdafef2f913a1a5791b061fa3e902c145173d444d09fe31e" dependencies = [ "bytemuck", "getrandom 0.1.16", @@ -4497,12 +4489,12 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.16.24" +version = "1.16.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66b682b70d18374f8619a1e61ec461d481d5ee7dc2057d53d7370176f41027c" +checksum = "1457c85ab70a518438b9ac2b0c56037b9f6693060dfb617bbb93c7116e4f0c22" dependencies = [ "aes-gcm-siv", - "base64 0.21.5", + "base64 0.21.7", "bincode", "bytemuck", "byteorder", @@ -4623,7 +4615,7 @@ checksum = "fadbefec4f3c678215ca72bd71862697bb06b41fd77c0088902dd3203354387b" dependencies = [ "quote 1.0.35", "spl-discriminator-syn", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -4632,10 +4624,10 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e5f2044ca42c8938d54d1255ce599c79a1ffd86b677dfab695caa20f9ffc3f2" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "sha2 0.10.8", - "syn 2.0.46", + "syn 2.0.48", "thiserror", ] @@ -4708,10 +4700,10 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5269c8e868da17b6552ef35a51355a017bd8e0eae269c201fef830d35fa52c" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "sha2 0.10.8", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -4753,7 +4745,7 @@ dependencies = [ "bytemuck", "num-derive 0.4.1", "num-traits", - "num_enum 0.7.1", + "num_enum 0.7.2", "solana-program", "solana-zk-token-sdk", "spl-memo", @@ -4842,7 +4834,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "rustversion", "syn 1.0.109", @@ -4877,18 +4869,18 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.46" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "unicode-ident", ] @@ -4899,7 +4891,7 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", "unicode-xid 0.2.4", @@ -4967,7 +4959,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", "syn 1.0.109", ] @@ -4987,9 +4979,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -5024,9 +5016,9 @@ version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -5127,9 +5119,9 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -5236,9 +5228,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" @@ -5253,9 +5245,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ "indexmap 2.1.0", "toml_datetime", @@ -5286,9 +5278,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -5536,9 +5528,9 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", "wasm-bindgen-shared", ] @@ -5570,9 +5562,9 @@ version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5673,15 +5665,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -5700,21 +5683,6 @@ dependencies = [ "windows-targets 0.52.0", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -5873,9 +5841,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.31" +version = "0.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c" +checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" dependencies = [ "memchr", ] @@ -5943,9 +5911,9 @@ version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -5963,9 +5931,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.74", + "proc-macro2 1.0.76", "quote 1.0.35", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] diff --git a/clients/rust/Cargo.toml b/clients/rust/Cargo.toml index 4fc7aa41..269419ab 100644 --- a/clients/rust/Cargo.toml +++ b/clients/rust/Cargo.toml @@ -16,7 +16,7 @@ test-sbf = [] serde = ["dep:serde", "dep:serde_with", "kaigan/serde"] [dependencies] -borsh = ">= 0.9, < 0.11" +borsh = ">= 0.9, < 1.0" kaigan = ">= 0.1" num-derive = "^0.3" num-traits = "^0.2" diff --git a/clients/rust/src/generated/errors/mpl_bubblegum.rs b/clients/rust/src/generated/errors/mpl_bubblegum.rs index f16ec5f8..2be5943b 100644 --- a/clients/rust/src/generated/errors/mpl_bubblegum.rs +++ b/clients/rust/src/generated/errors/mpl_bubblegum.rs @@ -112,6 +112,24 @@ pub enum MplBubblegumError { /// 6033 (0x1791) - Decompression is disabled for this tree. #[error("Decompression is disabled for this tree.")] DecompressionDisabled, + /// 6034 (0x1792) - Missing collection mint account + #[error("Missing collection mint account")] + MissingCollectionMintAccount, + /// 6035 (0x1793) - Missing collection metadata account + #[error("Missing collection metadata account")] + MissingCollectionMetadataAccount, + /// 6036 (0x1794) - Collection mismatch + #[error("Collection mismatch")] + CollectionMismatch, + /// 6037 (0x1795) - Metadata not mutable + #[error("Metadata not mutable")] + MetadataImmutable, + /// 6038 (0x1796) - Can only update primary sale to true + #[error("Can only update primary sale to true")] + PrimarySaleCanOnlyBeFlippedToTrue, + /// 6039 (0x1797) - Creator did not unverify the metadata + #[error("Creator did not unverify the metadata")] + CreatorDidNotUnverify, } impl solana_program::program_error::PrintProgramError for MplBubblegumError { diff --git a/clients/rust/src/generated/instructions/mod.rs b/clients/rust/src/generated/instructions/mod.rs index 015d145a..88e88c00 100644 --- a/clients/rust/src/generated/instructions/mod.rs +++ b/clients/rust/src/generated/instructions/mod.rs @@ -19,6 +19,7 @@ pub(crate) mod set_tree_delegate; pub(crate) mod transfer; pub(crate) mod unverify_collection; pub(crate) mod unverify_creator; +pub(crate) mod update_metadata; pub(crate) mod verify_collection; pub(crate) mod verify_creator; pub(crate) mod verify_leaf; @@ -37,6 +38,7 @@ pub use self::set_tree_delegate::*; pub use self::transfer::*; pub use self::unverify_collection::*; pub use self::unverify_creator::*; +pub use self::update_metadata::*; pub use self::verify_collection::*; pub use self::verify_creator::*; pub use self::verify_leaf::*; diff --git a/clients/rust/src/generated/instructions/update_metadata.rs b/clients/rust/src/generated/instructions/update_metadata.rs new file mode 100644 index 00000000..3b841df6 --- /dev/null +++ b/clients/rust/src/generated/instructions/update_metadata.rs @@ -0,0 +1,917 @@ +//! This code was AUTOGENERATED using the kinobi library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun kinobi to update it. +//! +//! [https://github.com/metaplex-foundation/kinobi] +//! + +use crate::generated::types::MetadataArgs; +use crate::generated::types::UpdateArgs; +use borsh::BorshDeserialize; +use borsh::BorshSerialize; + +/// Accounts. +pub struct UpdateMetadata { + pub tree_config: solana_program::pubkey::Pubkey, + /// Either collection authority or tree owner/delegate, depending + /// on whether the item is in a verified collection + pub authority: solana_program::pubkey::Pubkey, + /// Used when item is in a verified collection + pub collection_mint: Option, + /// Used when item is in a verified collection + pub collection_metadata: Option, + + pub collection_authority_record_pda: Option, + + pub leaf_owner: solana_program::pubkey::Pubkey, + + pub leaf_delegate: solana_program::pubkey::Pubkey, + + pub payer: solana_program::pubkey::Pubkey, + + pub merkle_tree: solana_program::pubkey::Pubkey, + + pub log_wrapper: solana_program::pubkey::Pubkey, + + pub compression_program: solana_program::pubkey::Pubkey, + + pub token_metadata_program: solana_program::pubkey::Pubkey, + + pub system_program: solana_program::pubkey::Pubkey, +} + +impl UpdateMetadata { + pub fn instruction( + &self, + args: UpdateMetadataInstructionArgs, + ) -> solana_program::instruction::Instruction { + self.instruction_with_remaining_accounts(args, &[]) + } + #[allow(clippy::vec_init_then_push)] + pub fn instruction_with_remaining_accounts( + &self, + args: UpdateMetadataInstructionArgs, + remaining_accounts: &[solana_program::instruction::AccountMeta], + ) -> solana_program::instruction::Instruction { + let mut accounts = Vec::with_capacity(13 + remaining_accounts.len()); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.tree_config, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.authority, + true, + )); + if let Some(collection_mint) = self.collection_mint { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + collection_mint, + false, + )); + } else { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + crate::MPL_BUBBLEGUM_ID, + false, + )); + } + if let Some(collection_metadata) = self.collection_metadata { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + collection_metadata, + false, + )); + } else { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + crate::MPL_BUBBLEGUM_ID, + false, + )); + } + if let Some(collection_authority_record_pda) = self.collection_authority_record_pda { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + collection_authority_record_pda, + false, + )); + } else { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + crate::MPL_BUBBLEGUM_ID, + false, + )); + } + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.leaf_owner, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.leaf_delegate, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.payer, true, + )); + accounts.push(solana_program::instruction::AccountMeta::new( + self.merkle_tree, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.log_wrapper, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.compression_program, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.token_metadata_program, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + self.system_program, + false, + )); + accounts.extend_from_slice(remaining_accounts); + let mut data = UpdateMetadataInstructionData::new().try_to_vec().unwrap(); + let mut args = args.try_to_vec().unwrap(); + data.append(&mut args); + + solana_program::instruction::Instruction { + program_id: crate::MPL_BUBBLEGUM_ID, + accounts, + data, + } + } +} + +#[derive(BorshDeserialize, BorshSerialize)] +struct UpdateMetadataInstructionData { + discriminator: [u8; 8], +} + +impl UpdateMetadataInstructionData { + fn new() -> Self { + Self { + discriminator: [170, 182, 43, 239, 97, 78, 225, 186], + } + } +} + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct UpdateMetadataInstructionArgs { + pub root: [u8; 32], + pub nonce: u64, + pub index: u32, + pub current_metadata: MetadataArgs, + pub update_args: UpdateArgs, +} + +/// Instruction builder. +#[derive(Default)] +pub struct UpdateMetadataBuilder { + tree_config: Option, + authority: Option, + collection_mint: Option, + collection_metadata: Option, + collection_authority_record_pda: Option, + leaf_owner: Option, + leaf_delegate: Option, + payer: Option, + merkle_tree: Option, + log_wrapper: Option, + compression_program: Option, + token_metadata_program: Option, + system_program: Option, + root: Option<[u8; 32]>, + nonce: Option, + index: Option, + current_metadata: Option, + update_args: Option, + __remaining_accounts: Vec, +} + +impl UpdateMetadataBuilder { + pub fn new() -> Self { + Self::default() + } + #[inline(always)] + pub fn tree_config(&mut self, tree_config: solana_program::pubkey::Pubkey) -> &mut Self { + self.tree_config = Some(tree_config); + self + } + /// Either collection authority or tree owner/delegate, depending + /// on whether the item is in a verified collection + #[inline(always)] + pub fn authority(&mut self, authority: solana_program::pubkey::Pubkey) -> &mut Self { + self.authority = Some(authority); + self + } + /// `[optional account]` + /// Used when item is in a verified collection + #[inline(always)] + pub fn collection_mint( + &mut self, + collection_mint: Option, + ) -> &mut Self { + self.collection_mint = collection_mint; + self + } + /// `[optional account]` + /// Used when item is in a verified collection + #[inline(always)] + pub fn collection_metadata( + &mut self, + collection_metadata: Option, + ) -> &mut Self { + self.collection_metadata = collection_metadata; + self + } + /// `[optional account]` + #[inline(always)] + pub fn collection_authority_record_pda( + &mut self, + collection_authority_record_pda: Option, + ) -> &mut Self { + self.collection_authority_record_pda = collection_authority_record_pda; + self + } + #[inline(always)] + pub fn leaf_owner(&mut self, leaf_owner: solana_program::pubkey::Pubkey) -> &mut Self { + self.leaf_owner = Some(leaf_owner); + self + } + #[inline(always)] + pub fn leaf_delegate(&mut self, leaf_delegate: solana_program::pubkey::Pubkey) -> &mut Self { + self.leaf_delegate = Some(leaf_delegate); + self + } + #[inline(always)] + pub fn payer(&mut self, payer: solana_program::pubkey::Pubkey) -> &mut Self { + self.payer = Some(payer); + self + } + #[inline(always)] + pub fn merkle_tree(&mut self, merkle_tree: solana_program::pubkey::Pubkey) -> &mut Self { + self.merkle_tree = Some(merkle_tree); + self + } + /// `[optional account, default to 'noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV']` + #[inline(always)] + pub fn log_wrapper(&mut self, log_wrapper: solana_program::pubkey::Pubkey) -> &mut Self { + self.log_wrapper = Some(log_wrapper); + self + } + /// `[optional account, default to 'cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK']` + #[inline(always)] + pub fn compression_program( + &mut self, + compression_program: solana_program::pubkey::Pubkey, + ) -> &mut Self { + self.compression_program = Some(compression_program); + self + } + /// `[optional account, default to 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s']` + #[inline(always)] + pub fn token_metadata_program( + &mut self, + token_metadata_program: solana_program::pubkey::Pubkey, + ) -> &mut Self { + self.token_metadata_program = Some(token_metadata_program); + self + } + /// `[optional account, default to '11111111111111111111111111111111']` + #[inline(always)] + pub fn system_program(&mut self, system_program: solana_program::pubkey::Pubkey) -> &mut Self { + self.system_program = Some(system_program); + self + } + #[inline(always)] + pub fn root(&mut self, root: [u8; 32]) -> &mut Self { + self.root = Some(root); + self + } + #[inline(always)] + pub fn nonce(&mut self, nonce: u64) -> &mut Self { + self.nonce = Some(nonce); + self + } + #[inline(always)] + pub fn index(&mut self, index: u32) -> &mut Self { + self.index = Some(index); + self + } + #[inline(always)] + pub fn current_metadata(&mut self, current_metadata: MetadataArgs) -> &mut Self { + self.current_metadata = Some(current_metadata); + self + } + #[inline(always)] + pub fn update_args(&mut self, update_args: UpdateArgs) -> &mut Self { + self.update_args = Some(update_args); + self + } + /// Add an aditional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: solana_program::instruction::AccountMeta, + ) -> &mut Self { + self.__remaining_accounts.push(account); + self + } + /// Add additional accounts to the instruction. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[solana_program::instruction::AccountMeta], + ) -> &mut Self { + self.__remaining_accounts.extend_from_slice(accounts); + self + } + #[allow(clippy::clone_on_copy)] + pub fn instruction(&self) -> solana_program::instruction::Instruction { + let accounts = + UpdateMetadata { + tree_config: self.tree_config.expect("tree_config is not set"), + authority: self.authority.expect("authority is not set"), + collection_mint: self.collection_mint, + collection_metadata: self.collection_metadata, + collection_authority_record_pda: self.collection_authority_record_pda, + leaf_owner: self.leaf_owner.expect("leaf_owner is not set"), + leaf_delegate: self.leaf_delegate.expect("leaf_delegate is not set"), + payer: self.payer.expect("payer is not set"), + merkle_tree: self.merkle_tree.expect("merkle_tree is not set"), + log_wrapper: self.log_wrapper.unwrap_or(solana_program::pubkey!( + "noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV" + )), + compression_program: self.compression_program.unwrap_or(solana_program::pubkey!( + "cmtDvXumGCrqC1Age74AVPhSRVXJMd8PJS91L8KbNCK" + )), + token_metadata_program: self.token_metadata_program.unwrap_or( + solana_program::pubkey!("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"), + ), + system_program: self + .system_program + .unwrap_or(solana_program::pubkey!("11111111111111111111111111111111")), + }; + let args = UpdateMetadataInstructionArgs { + root: self.root.clone().expect("root is not set"), + nonce: self.nonce.clone().expect("nonce is not set"), + index: self.index.clone().expect("index is not set"), + current_metadata: self + .current_metadata + .clone() + .expect("current_metadata is not set"), + update_args: self.update_args.clone().expect("update_args is not set"), + }; + + accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts) + } +} + +/// `update_metadata` CPI accounts. +pub struct UpdateMetadataCpiAccounts<'a, 'b> { + pub tree_config: &'b solana_program::account_info::AccountInfo<'a>, + /// Either collection authority or tree owner/delegate, depending + /// on whether the item is in a verified collection + pub authority: &'b solana_program::account_info::AccountInfo<'a>, + /// Used when item is in a verified collection + pub collection_mint: Option<&'b solana_program::account_info::AccountInfo<'a>>, + /// Used when item is in a verified collection + pub collection_metadata: Option<&'b solana_program::account_info::AccountInfo<'a>>, + + pub collection_authority_record_pda: Option<&'b solana_program::account_info::AccountInfo<'a>>, + + pub leaf_owner: &'b solana_program::account_info::AccountInfo<'a>, + + pub leaf_delegate: &'b solana_program::account_info::AccountInfo<'a>, + + pub payer: &'b solana_program::account_info::AccountInfo<'a>, + + pub merkle_tree: &'b solana_program::account_info::AccountInfo<'a>, + + pub log_wrapper: &'b solana_program::account_info::AccountInfo<'a>, + + pub compression_program: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_metadata_program: &'b solana_program::account_info::AccountInfo<'a>, + + pub system_program: &'b solana_program::account_info::AccountInfo<'a>, +} + +/// `update_metadata` CPI instruction. +pub struct UpdateMetadataCpi<'a, 'b> { + /// The program to invoke. + pub __program: &'b solana_program::account_info::AccountInfo<'a>, + + pub tree_config: &'b solana_program::account_info::AccountInfo<'a>, + /// Either collection authority or tree owner/delegate, depending + /// on whether the item is in a verified collection + pub authority: &'b solana_program::account_info::AccountInfo<'a>, + /// Used when item is in a verified collection + pub collection_mint: Option<&'b solana_program::account_info::AccountInfo<'a>>, + /// Used when item is in a verified collection + pub collection_metadata: Option<&'b solana_program::account_info::AccountInfo<'a>>, + + pub collection_authority_record_pda: Option<&'b solana_program::account_info::AccountInfo<'a>>, + + pub leaf_owner: &'b solana_program::account_info::AccountInfo<'a>, + + pub leaf_delegate: &'b solana_program::account_info::AccountInfo<'a>, + + pub payer: &'b solana_program::account_info::AccountInfo<'a>, + + pub merkle_tree: &'b solana_program::account_info::AccountInfo<'a>, + + pub log_wrapper: &'b solana_program::account_info::AccountInfo<'a>, + + pub compression_program: &'b solana_program::account_info::AccountInfo<'a>, + + pub token_metadata_program: &'b solana_program::account_info::AccountInfo<'a>, + + pub system_program: &'b solana_program::account_info::AccountInfo<'a>, + /// The arguments for the instruction. + pub __args: UpdateMetadataInstructionArgs, +} + +impl<'a, 'b> UpdateMetadataCpi<'a, 'b> { + pub fn new( + program: &'b solana_program::account_info::AccountInfo<'a>, + accounts: UpdateMetadataCpiAccounts<'a, 'b>, + args: UpdateMetadataInstructionArgs, + ) -> Self { + Self { + __program: program, + tree_config: accounts.tree_config, + authority: accounts.authority, + collection_mint: accounts.collection_mint, + collection_metadata: accounts.collection_metadata, + collection_authority_record_pda: accounts.collection_authority_record_pda, + leaf_owner: accounts.leaf_owner, + leaf_delegate: accounts.leaf_delegate, + payer: accounts.payer, + merkle_tree: accounts.merkle_tree, + log_wrapper: accounts.log_wrapper, + compression_program: accounts.compression_program, + token_metadata_program: accounts.token_metadata_program, + system_program: accounts.system_program, + __args: args, + } + } + #[inline(always)] + pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], &[]) + } + #[inline(always)] + pub fn invoke_with_remaining_accounts( + &self, + remaining_accounts: &[( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )], + ) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed_with_remaining_accounts(&[], remaining_accounts) + } + #[inline(always)] + pub fn invoke_signed( + &self, + signers_seeds: &[&[&[u8]]], + ) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed_with_remaining_accounts(signers_seeds, &[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed_with_remaining_accounts( + &self, + signers_seeds: &[&[&[u8]]], + remaining_accounts: &[( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )], + ) -> solana_program::entrypoint::ProgramResult { + let mut accounts = Vec::with_capacity(13 + remaining_accounts.len()); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.tree_config.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.authority.key, + true, + )); + if let Some(collection_mint) = self.collection_mint { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *collection_mint.key, + false, + )); + } else { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + crate::MPL_BUBBLEGUM_ID, + false, + )); + } + if let Some(collection_metadata) = self.collection_metadata { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *collection_metadata.key, + false, + )); + } else { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + crate::MPL_BUBBLEGUM_ID, + false, + )); + } + if let Some(collection_authority_record_pda) = self.collection_authority_record_pda { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *collection_authority_record_pda.key, + false, + )); + } else { + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + crate::MPL_BUBBLEGUM_ID, + false, + )); + } + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.leaf_owner.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.leaf_delegate.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.payer.key, + true, + )); + accounts.push(solana_program::instruction::AccountMeta::new( + *self.merkle_tree.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.log_wrapper.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.compression_program.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.token_metadata_program.key, + false, + )); + accounts.push(solana_program::instruction::AccountMeta::new_readonly( + *self.system_program.key, + false, + )); + remaining_accounts.iter().for_each(|remaining_account| { + accounts.push(solana_program::instruction::AccountMeta { + pubkey: *remaining_account.0.key, + is_signer: remaining_account.1, + is_writable: remaining_account.2, + }) + }); + let mut data = UpdateMetadataInstructionData::new().try_to_vec().unwrap(); + let mut args = self.__args.try_to_vec().unwrap(); + data.append(&mut args); + + let instruction = solana_program::instruction::Instruction { + program_id: crate::MPL_BUBBLEGUM_ID, + accounts, + data, + }; + let mut account_infos = Vec::with_capacity(13 + 1 + remaining_accounts.len()); + account_infos.push(self.__program.clone()); + account_infos.push(self.tree_config.clone()); + account_infos.push(self.authority.clone()); + if let Some(collection_mint) = self.collection_mint { + account_infos.push(collection_mint.clone()); + } + if let Some(collection_metadata) = self.collection_metadata { + account_infos.push(collection_metadata.clone()); + } + if let Some(collection_authority_record_pda) = self.collection_authority_record_pda { + account_infos.push(collection_authority_record_pda.clone()); + } + account_infos.push(self.leaf_owner.clone()); + account_infos.push(self.leaf_delegate.clone()); + account_infos.push(self.payer.clone()); + account_infos.push(self.merkle_tree.clone()); + account_infos.push(self.log_wrapper.clone()); + account_infos.push(self.compression_program.clone()); + account_infos.push(self.token_metadata_program.clone()); + account_infos.push(self.system_program.clone()); + remaining_accounts + .iter() + .for_each(|remaining_account| account_infos.push(remaining_account.0.clone())); + + if signers_seeds.is_empty() { + solana_program::program::invoke(&instruction, &account_infos) + } else { + solana_program::program::invoke_signed(&instruction, &account_infos, signers_seeds) + } + } +} + +/// `update_metadata` CPI instruction builder. +pub struct UpdateMetadataCpiBuilder<'a, 'b> { + instruction: Box>, +} + +impl<'a, 'b> UpdateMetadataCpiBuilder<'a, 'b> { + pub fn new(program: &'b solana_program::account_info::AccountInfo<'a>) -> Self { + let instruction = Box::new(UpdateMetadataCpiBuilderInstruction { + __program: program, + tree_config: None, + authority: None, + collection_mint: None, + collection_metadata: None, + collection_authority_record_pda: None, + leaf_owner: None, + leaf_delegate: None, + payer: None, + merkle_tree: None, + log_wrapper: None, + compression_program: None, + token_metadata_program: None, + system_program: None, + root: None, + nonce: None, + index: None, + current_metadata: None, + update_args: None, + __remaining_accounts: Vec::new(), + }); + Self { instruction } + } + #[inline(always)] + pub fn tree_config( + &mut self, + tree_config: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.tree_config = Some(tree_config); + self + } + /// Either collection authority or tree owner/delegate, depending + /// on whether the item is in a verified collection + #[inline(always)] + pub fn authority( + &mut self, + authority: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.authority = Some(authority); + self + } + /// `[optional account]` + /// Used when item is in a verified collection + #[inline(always)] + pub fn collection_mint( + &mut self, + collection_mint: Option<&'b solana_program::account_info::AccountInfo<'a>>, + ) -> &mut Self { + self.instruction.collection_mint = collection_mint; + self + } + /// `[optional account]` + /// Used when item is in a verified collection + #[inline(always)] + pub fn collection_metadata( + &mut self, + collection_metadata: Option<&'b solana_program::account_info::AccountInfo<'a>>, + ) -> &mut Self { + self.instruction.collection_metadata = collection_metadata; + self + } + /// `[optional account]` + #[inline(always)] + pub fn collection_authority_record_pda( + &mut self, + collection_authority_record_pda: Option<&'b solana_program::account_info::AccountInfo<'a>>, + ) -> &mut Self { + self.instruction.collection_authority_record_pda = collection_authority_record_pda; + self + } + #[inline(always)] + pub fn leaf_owner( + &mut self, + leaf_owner: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.leaf_owner = Some(leaf_owner); + self + } + #[inline(always)] + pub fn leaf_delegate( + &mut self, + leaf_delegate: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.leaf_delegate = Some(leaf_delegate); + self + } + #[inline(always)] + pub fn payer(&mut self, payer: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self { + self.instruction.payer = Some(payer); + self + } + #[inline(always)] + pub fn merkle_tree( + &mut self, + merkle_tree: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.merkle_tree = Some(merkle_tree); + self + } + #[inline(always)] + pub fn log_wrapper( + &mut self, + log_wrapper: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.log_wrapper = Some(log_wrapper); + self + } + #[inline(always)] + pub fn compression_program( + &mut self, + compression_program: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.compression_program = Some(compression_program); + self + } + #[inline(always)] + pub fn token_metadata_program( + &mut self, + token_metadata_program: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.token_metadata_program = Some(token_metadata_program); + self + } + #[inline(always)] + pub fn system_program( + &mut self, + system_program: &'b solana_program::account_info::AccountInfo<'a>, + ) -> &mut Self { + self.instruction.system_program = Some(system_program); + self + } + #[inline(always)] + pub fn root(&mut self, root: [u8; 32]) -> &mut Self { + self.instruction.root = Some(root); + self + } + #[inline(always)] + pub fn nonce(&mut self, nonce: u64) -> &mut Self { + self.instruction.nonce = Some(nonce); + self + } + #[inline(always)] + pub fn index(&mut self, index: u32) -> &mut Self { + self.instruction.index = Some(index); + self + } + #[inline(always)] + pub fn current_metadata(&mut self, current_metadata: MetadataArgs) -> &mut Self { + self.instruction.current_metadata = Some(current_metadata); + self + } + #[inline(always)] + pub fn update_args(&mut self, update_args: UpdateArgs) -> &mut Self { + self.instruction.update_args = Some(update_args); + self + } + /// Add an additional account to the instruction. + #[inline(always)] + pub fn add_remaining_account( + &mut self, + account: &'b solana_program::account_info::AccountInfo<'a>, + is_writable: bool, + is_signer: bool, + ) -> &mut Self { + self.instruction + .__remaining_accounts + .push((account, is_writable, is_signer)); + self + } + /// Add additional accounts to the instruction. + /// + /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not, + /// and a `bool` indicating whether the account is a signer or not. + #[inline(always)] + pub fn add_remaining_accounts( + &mut self, + accounts: &[( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )], + ) -> &mut Self { + self.instruction + .__remaining_accounts + .extend_from_slice(accounts); + self + } + #[inline(always)] + pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult { + self.invoke_signed(&[]) + } + #[allow(clippy::clone_on_copy)] + #[allow(clippy::vec_init_then_push)] + pub fn invoke_signed( + &self, + signers_seeds: &[&[&[u8]]], + ) -> solana_program::entrypoint::ProgramResult { + let args = UpdateMetadataInstructionArgs { + root: self.instruction.root.clone().expect("root is not set"), + nonce: self.instruction.nonce.clone().expect("nonce is not set"), + index: self.instruction.index.clone().expect("index is not set"), + current_metadata: self + .instruction + .current_metadata + .clone() + .expect("current_metadata is not set"), + update_args: self + .instruction + .update_args + .clone() + .expect("update_args is not set"), + }; + let instruction = UpdateMetadataCpi { + __program: self.instruction.__program, + + tree_config: self + .instruction + .tree_config + .expect("tree_config is not set"), + + authority: self.instruction.authority.expect("authority is not set"), + + collection_mint: self.instruction.collection_mint, + + collection_metadata: self.instruction.collection_metadata, + + collection_authority_record_pda: self.instruction.collection_authority_record_pda, + + leaf_owner: self.instruction.leaf_owner.expect("leaf_owner is not set"), + + leaf_delegate: self + .instruction + .leaf_delegate + .expect("leaf_delegate is not set"), + + payer: self.instruction.payer.expect("payer is not set"), + + merkle_tree: self + .instruction + .merkle_tree + .expect("merkle_tree is not set"), + + log_wrapper: self + .instruction + .log_wrapper + .expect("log_wrapper is not set"), + + compression_program: self + .instruction + .compression_program + .expect("compression_program is not set"), + + token_metadata_program: self + .instruction + .token_metadata_program + .expect("token_metadata_program is not set"), + + system_program: self + .instruction + .system_program + .expect("system_program is not set"), + __args: args, + }; + instruction.invoke_signed_with_remaining_accounts( + signers_seeds, + &self.instruction.__remaining_accounts, + ) + } +} + +struct UpdateMetadataCpiBuilderInstruction<'a, 'b> { + __program: &'b solana_program::account_info::AccountInfo<'a>, + tree_config: Option<&'b solana_program::account_info::AccountInfo<'a>>, + authority: Option<&'b solana_program::account_info::AccountInfo<'a>>, + collection_mint: Option<&'b solana_program::account_info::AccountInfo<'a>>, + collection_metadata: Option<&'b solana_program::account_info::AccountInfo<'a>>, + collection_authority_record_pda: Option<&'b solana_program::account_info::AccountInfo<'a>>, + leaf_owner: Option<&'b solana_program::account_info::AccountInfo<'a>>, + leaf_delegate: Option<&'b solana_program::account_info::AccountInfo<'a>>, + payer: Option<&'b solana_program::account_info::AccountInfo<'a>>, + merkle_tree: Option<&'b solana_program::account_info::AccountInfo<'a>>, + log_wrapper: Option<&'b solana_program::account_info::AccountInfo<'a>>, + compression_program: Option<&'b solana_program::account_info::AccountInfo<'a>>, + token_metadata_program: Option<&'b solana_program::account_info::AccountInfo<'a>>, + system_program: Option<&'b solana_program::account_info::AccountInfo<'a>>, + root: Option<[u8; 32]>, + nonce: Option, + index: Option, + current_metadata: Option, + update_args: Option, + /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`. + __remaining_accounts: Vec<( + &'b solana_program::account_info::AccountInfo<'a>, + bool, + bool, + )>, +} diff --git a/clients/rust/src/generated/types/mod.rs b/clients/rust/src/generated/types/mod.rs index f12d568b..c6ccd7c5 100644 --- a/clients/rust/src/generated/types/mod.rs +++ b/clients/rust/src/generated/types/mod.rs @@ -16,6 +16,7 @@ pub(crate) mod leaf_schema; pub(crate) mod metadata_args; pub(crate) mod token_program_version; pub(crate) mod token_standard; +pub(crate) mod update_args; pub(crate) mod use_method; pub(crate) mod uses; pub(crate) mod version; @@ -31,6 +32,7 @@ pub use self::leaf_schema::*; pub use self::metadata_args::*; pub use self::token_program_version::*; pub use self::token_standard::*; +pub use self::update_args::*; pub use self::use_method::*; pub use self::uses::*; pub use self::version::*; diff --git a/clients/rust/src/generated/types/update_args.rs b/clients/rust/src/generated/types/update_args.rs new file mode 100644 index 00000000..64270714 --- /dev/null +++ b/clients/rust/src/generated/types/update_args.rs @@ -0,0 +1,22 @@ +//! This code was AUTOGENERATED using the kinobi library. +//! Please DO NOT EDIT THIS FILE, instead use visitors +//! to add features, then rerun kinobi to update it. +//! +//! [https://github.com/metaplex-foundation/kinobi] +//! + +use crate::generated::types::Creator; +use borsh::BorshDeserialize; +use borsh::BorshSerialize; + +#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub struct UpdateArgs { + pub name: Option, + pub symbol: Option, + pub uri: Option, + pub creators: Option>, + pub seller_fee_basis_points: Option, + pub primary_sale_happened: Option, + pub is_mutable: Option, +} diff --git a/clients/rust/src/lib.rs b/clients/rust/src/lib.rs index d2deb547..08cf8ece 100644 --- a/clients/rust/src/lib.rs +++ b/clients/rust/src/lib.rs @@ -1,3 +1,6 @@ +use borsh::{BorshDeserialize, BorshSerialize}; +use types::{BubblegumEventType, LeafSchema, Version}; + mod generated; pub mod hash; mod traits; @@ -24,6 +27,7 @@ pub enum InstructionName { SetAndVerifyCollection, MintToCollectionV1, SetDecompressibleState, + UpdateMetadata, } pub fn get_instruction_type(full_bytes: &[u8]) -> InstructionName { @@ -51,7 +55,26 @@ pub fn get_instruction_type(full_bytes: &[u8]) -> InstructionName { [82, 104, 152, 6, 149, 111, 100, 13] => InstructionName::SetDecompressibleState, // `SetDecompressableState` instruction mapped to `SetDecompressibleState` instruction [18, 135, 238, 168, 246, 195, 61, 115] => InstructionName::SetDecompressibleState, - + [170, 182, 43, 239, 97, 78, 225, 186] => InstructionName::UpdateMetadata, _ => InstructionName::Unknown, } } + +#[derive(BorshSerialize, BorshDeserialize, PartialEq, Eq, Debug, Clone)] +pub struct LeafSchemaEvent { + pub event_type: BubblegumEventType, + pub version: Version, + pub schema: LeafSchema, + pub leaf_hash: [u8; 32], +} + +impl LeafSchemaEvent { + pub fn new(version: Version, schema: LeafSchema, leaf_hash: [u8; 32]) -> Self { + Self { + event_type: BubblegumEventType::LeafSchemaEvent, + version, + schema, + leaf_hash, + } + } +} diff --git a/clients/rust/src/traits.rs b/clients/rust/src/traits.rs index e55d12a7..7ed2803e 100644 --- a/clients/rust/src/traits.rs +++ b/clients/rust/src/traits.rs @@ -1,6 +1,7 @@ -use solana_program::keccak; +#![allow(clippy::derivable_impls)] +use solana_program::{keccak, pubkey::Pubkey}; -use crate::types::{LeafSchema, Version}; +use crate::types::{LeafSchema, UpdateArgs, Version}; // LeafSchema @@ -32,6 +33,42 @@ impl LeafSchema { LeafSchema::V1 { .. } => Version::V1, } } + + pub fn id(&self) -> Pubkey { + match self { + LeafSchema::V1 { id, .. } => *id, + } + } + + pub fn owner(&self) -> Pubkey { + match self { + LeafSchema::V1 { owner, .. } => *owner, + } + } + + pub fn delegate(&self) -> Pubkey { + match self { + LeafSchema::V1 { delegate, .. } => *delegate, + } + } + + pub fn nonce(&self) -> u64 { + match self { + LeafSchema::V1 { nonce, .. } => *nonce, + } + } + + pub fn data_hash(&self) -> [u8; 32] { + match self { + LeafSchema::V1 { data_hash, .. } => *data_hash, + } + } + + pub fn creator_hash(&self) -> [u8; 32] { + match self { + LeafSchema::V1 { creator_hash, .. } => *creator_hash, + } + } } impl Default for LeafSchema { @@ -63,3 +100,19 @@ impl Default for Version { Version::V1 } } + +// UpdateArgs + +impl Default for UpdateArgs { + fn default() -> Self { + Self { + creators: None, + is_mutable: None, + name: None, + primary_sale_happened: None, + seller_fee_basis_points: None, + symbol: None, + uri: None, + } + } +} diff --git a/configs/kinobi.cjs b/configs/kinobi.cjs index 33c209c2..710c8c90 100755 --- a/configs/kinobi.cjs +++ b/configs/kinobi.cjs @@ -5,12 +5,15 @@ const k = require("@metaplex-foundation/kinobi"); const clientDir = path.join(__dirname, "..", "clients"); const idlDir = path.join(__dirname, "..", "idls"); -// Instanciate Kinobi. -const kinobi = k.createFromIdls([ - path.join(idlDir, "bubblegum.json"), - path.join(idlDir, "spl_account_compression.json"), - path.join(idlDir, "spl_noop.json"), -]); +// Instanciate Kinobi withtout DefaultVisitor. +const kinobi = k.createFromIdls( + [ + path.join(idlDir, "bubblegum.json"), + path.join(idlDir, "spl_account_compression.json"), + path.join(idlDir, "spl_noop.json"), + ], + false +); // Update programs. kinobi.update( @@ -19,6 +22,45 @@ kinobi.update( }) ); +// Add wrapper defined type with a link to UpdateArgs. This is to avoid the +// type being inlined in the instruction. +kinobi.update( + new k.TransformNodesVisitor([ + { + selector: { kind: "programNode", name: "mplBubblegum" }, + transformer: (node) => { + k.assertProgramNode(node); + return k.programNode({ + ...node, + definedTypes: [ + ...node.definedTypes, + // wrapper type + k.definedTypeNode({ + name: "UpdateArgsWrapper", + data: k.structTypeNode([ + k.structFieldTypeNode({ + name: "wrapped", + child: k.linkTypeNode("UpdateArgs"), + }), + ]), + }), + ], + }); + }, + }, + ]) +); + +// Apply the DefaultVisitor. +kinobi.update(new k.DefaultVisitor()); + +// Delete the unnecessary UpdateArgsWrapper type. +kinobi.update( + new k.UpdateDefinedTypesVisitor({ + UpdateArgsWrapper: { delete: true }, + }) +); + // Update accounts. kinobi.update( new k.UpdateAccountsVisitor({ @@ -311,6 +353,15 @@ kinobi.update( uses: k.vNone(), tokenProgramVersion: k.vEnum("TokenProgramVersion", "Original"), }, + updateArgs: { + name: k.vNone(), + symbol: k.vNone(), + uri: k.vNone(), + creators: k.vNone(), + sellerFeeBasisPoints: k.vNone(), + primarySaleHappened: k.vNone(), + isMutable: k.vNone(), + }, }) ); diff --git a/idls/bubblegum.json b/idls/bubblegum.json index 493d0fe6..3b5943a7 100644 --- a/idls/bubblegum.json +++ b/idls/bubblegum.json @@ -1474,6 +1474,123 @@ } } ] + }, + { + "name": "updateMetadata", + "docs": [ + "Updates metadata for a leaf node that is not part of a verified collection." + ], + "accounts": [ + { + "name": "treeAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "authority", + "isMut": false, + "isSigner": true, + "docs": [ + "Either collection authority or tree owner/delegate, depending", + "on whether the item is in a verified collection" + ] + }, + { + "name": "collectionMint", + "isMut": false, + "isSigner": false, + "isOptional": true, + "docs": [ + "Used when item is in a verified collection" + ] + }, + { + "name": "collectionMetadata", + "isMut": false, + "isSigner": false, + "isOptional": true, + "docs": [ + "Used when item is in a verified collection" + ] + }, + { + "name": "collectionAuthorityRecordPda", + "isMut": false, + "isSigner": false, + "isOptional": true + }, + { + "name": "leafOwner", + "isMut": false, + "isSigner": false + }, + { + "name": "leafDelegate", + "isMut": false, + "isSigner": false + }, + { + "name": "payer", + "isMut": false, + "isSigner": true + }, + { + "name": "merkleTree", + "isMut": true, + "isSigner": false + }, + { + "name": "logWrapper", + "isMut": false, + "isSigner": false + }, + { + "name": "compressionProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "tokenMetadataProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "root", + "type": { + "array": [ + "u8", + 32 + ] + } + }, + { + "name": "nonce", + "type": "u64" + }, + { + "name": "index", + "type": "u32" + }, + { + "name": "currentMetadata", + "type": { + "defined": "MetadataArgs" + } + }, + { + "name": "updateArgs", + "type": { + "defined": "UpdateArgs" + } + } + ] } ], "accounts": [ @@ -1698,6 +1815,60 @@ ] } }, + { + "name": "UpdateArgs", + "type": { + "kind": "struct", + "fields": [ + { + "name": "name", + "type": { + "option": "string" + } + }, + { + "name": "symbol", + "type": { + "option": "string" + } + }, + { + "name": "uri", + "type": { + "option": "string" + } + }, + { + "name": "creators", + "type": { + "option": { + "vec": { + "defined": "Creator" + } + } + } + }, + { + "name": "sellerFeeBasisPoints", + "type": { + "option": "u16" + } + }, + { + "name": "primarySaleHappened", + "type": { + "option": "bool" + } + }, + { + "name": "isMutable", + "type": { + "option": "bool" + } + } + ] + } + }, { "name": "Version", "type": { @@ -1890,6 +2061,9 @@ }, { "name": "SetDecompressibleState" + }, + { + "name": "UpdateMetadata" } ] } @@ -2065,6 +2239,36 @@ "code": 6033, "name": "DecompressionDisabled", "msg": "Decompression is disabled for this tree." + }, + { + "code": 6034, + "name": "MissingCollectionMintAccount", + "msg": "Missing collection mint account" + }, + { + "code": 6035, + "name": "MissingCollectionMetadataAccount", + "msg": "Missing collection metadata account" + }, + { + "code": 6036, + "name": "CollectionMismatch", + "msg": "Collection mismatch" + }, + { + "code": 6037, + "name": "MetadataImmutable", + "msg": "Metadata not mutable" + }, + { + "code": 6038, + "name": "PrimarySaleCanOnlyBeFlippedToTrue", + "msg": "Can only update primary sale to true" + }, + { + "code": 6039, + "name": "CreatorDidNotUnverify", + "msg": "Creator did not unverify the metadata" } ], "metadata": { diff --git a/package.json b/package.json index 99eb939c..3fce0772 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "programs:debug": "./configs/scripts/program/test.sh", "programs:clean": "./configs/scripts/program/clean.sh", "clients:rust:test": "./configs/scripts/client/test-rust.sh", - "clients:js:test": "./configs/sripts/client/test-js.sh", + "clients:js:test": "./configs/scripts/client/test-js.sh", "generate": "pnpm generate:idls && pnpm generate:clients", "generate:idls": "node ./configs/shank.cjs", "generate:clients": "node ./configs/kinobi.cjs", diff --git a/programs/bubblegum/README.md b/programs/bubblegum/README.md index ac201b98..9e6239d9 100644 --- a/programs/bubblegum/README.md +++ b/programs/bubblegum/README.md @@ -20,18 +20,18 @@ See [README.md](https://github.com/metaplex-foundation/mpl-bubblegum/blob/main/c ## Overview -`Bubblegum` is the Metaplex Protocol program for creating and interacting with compressed Metaplex NFTs. Compressed NFTs are secured on-chain using Merkle trees. +`Bubblegum` is the Metaplex Protocol program for creating and interacting with Metaplex compressed NFTs (cNFTs). Compressed NFTs are secured on-chain using Merkle trees. With Bubblegum you can: * Create a tree * Delegate authority for a tree. -* Mint a compressed NFT to a tree. +* Mint a cNFT to a tree. * Verify/unverify creators -* Verify/unverify membership of an NFT to a Metaplex Verified Collection. -* Transfer ownership of an NFT. -* Delegate authority for an NFT. -* Burn an NFT. -* Redeem an NFT and decompress it into an uncompressed Metaplex NFT. +* Verify/unverify membership of a cNFT to a Metaplex Verified Collection. +* Transfer ownership of a cNFT. +* Delegate authority for a cNFT. +* Burn a cNFT. +* Redeem a cNFT and decompress it into an uncompressed Token Metadata NFT. ## Background @@ -51,7 +51,7 @@ Anyone can create a tree using `create_tree` and then they are the tree owner. ### Merkle proofs -After an NFT is minted, for any operations that modify the NFT, Merkle proofs must be provided with the instruction to validate the Merkle tree changes. Bubblegum is an Anchor program and makes use of the remaining accounts feature for this purpose. Merkle proofs are added as remaining account `Pubkey`s that are 32-byte Keccak256 hash values that represent the nodes from the Merkle tree that are required to calculate a new Merkle root. +After a cNFT is minted, for any operations that modify the cNFT, Merkle proofs must be provided with the instruction to validate the Merkle tree changes. Bubblegum is an Anchor program and makes use of the remaining accounts feature for this purpose. Merkle proofs are added as remaining account `Pubkey`s that are 32-byte Keccak256 hash values that represent the nodes from the Merkle tree that are required to calculate a new Merkle root. ### Creator verification @@ -64,20 +64,20 @@ Beyond verifying creators at the time of mint, there are `verify_creator` and `u Note that there is no such thing as compressed Verified Collections. Collections are still NFTs created in the realm of Metadata and Master Edition `token-metadata` accounts. There are instructions to `verify_collection` and `unverify_collection`, as well as a `set_and_verify_collection` instruction for the case where the collection was set during the mint. `mint_to_collection_v1` is an instruction can be used to mint and verify a collection at the same time. Currently `decompress_v1` will fail for verified collection compressed assets, and will only be successful for unverified / no collection compressed assets. The complete flow for decompressing a verified asset would be to unverify its collection, decompress, and reverify collection through traditional means. All of these require either the true Collection Authority to be a a signer, or a delegated Collection Authority to be a signer along with providing a Collection Authority Record PDA. See the Metaplex documentation on [`Certified Collections`](https://docs.metaplex.com/programs/token-metadata/certified-collections) for more information on verifying collections. -### Transfer ownership, delegate authority, and burn an NFT. +### Transfer ownership, delegate authority, and burn a cNFT -Compressed NFTs support transferring ownership, delegating authority, and burning the NFT. See the [Instructions](##Instructions) section below for details. +Compressed NFTs support transferring ownership, delegating authority, and burning the cNFT. See the [Instructions](##Instructions) section below for details. -### Redeem an NFT and decompress it into an uncompressed Metaplex NFT +### Redeem a cNFT and decompress it into an uncompressed Token Metadata NFT -Redeeming an NFT removes the leaf from the Merkle tree and creates a voucher PDA account. The voucher account can be sent to the `decompress_v1` instruction to decompress the NFT into an uncompressed Metaplex NFT. As mentioned above this will cost rent for the Metadata and Master Edition `token-metadata` accounts that are created during the decompression process. Note that after a compressed NFT is redeemed but before it is decompressed, the process can be reversed using `cancel_redeem`. This puts the compressed NFT back into the Merkle tree. +Redeeming a cNFT removes the leaf from the Merkle tree and creates a voucher PDA account. The voucher account can be sent to the `decompress_v1` instruction to decompress the cNFT into a Token Metadata NFT. As mentioned above this will cost rent for the Metadata and Master Edition `token-metadata` accounts that are created during the decompression process. Note that after a cNFT is redeemed but before it is decompressed, the process can be reversed using `cancel_redeem`. This puts the cNFT back into the Merkle tree. ## Accounts ### 📄 `tree_authority` The `tree_authority` PDA account data stores information about a Merkle tree. It is initialized by `create_tree` and is updated by all other Bubblegum instructions except for decompression. -The account data is represented by the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) struct. +The account data is represented by the [`TreeConfig`](program/src/state/mod.rs#L17) struct. | Field | Offset | Size | Description | ---------------------------------- | ------ | ---- | -- @@ -88,7 +88,7 @@ The account data is represented by the [`TreeConfig`](https://github.com/metaple ### 📄 `voucher` -The `voucher` PDA account is used when a compressed NFT is redeemed and decompressed. It is initialized by `redeem` and represented by the [`Voucher`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L36) struct, which includes a reference to the [`LeafSchema`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/leaf_schema.rs#L45) struct. +The `voucher` PDA account is used when a cNFT is redeemed and decompressed. It is initialized by `redeem` and represented by the [`Voucher`](program/src/state/mod.rs#L39) struct, which includes a reference to the [`LeafSchema`](program/src/state/leaf_schema.rs#L40) struct. | Field | Offset | Size | Description | --------------------------------- | ------ | ---- | -- @@ -106,15 +106,15 @@ This instruction creates a Merkle Tree.
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | :------: | :----: | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account that is initialized by this instruction. -| `merkle_tree` | ✅ | | The account that will contain the Merkle tree. -| `payer` | | ✅ | Payer of the transaction. -| `tree_creator` | | ✅ | The creator/owner of the Merkle tree. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| `system_program` | | | The Solana System Program ID. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account that is initialized by this instruction. +| `merkle_tree` | ✅ | | | The account that will contain the Merkle tree. +| `payer` | | ✅ | | Payer. +| `tree_creator` | | ✅ | | The creator/owner of the Merkle tree. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID.
@@ -135,12 +135,13 @@ This instruction delegates authority for a previously created Merkle tree.
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | :------: | :----: | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `tree_creator` | | ✅ | The creator/owner of the Merkle tree. -| `new_tree_delegate` | | | The wallet to which to delegate tree authority. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `tree_creator` | | ✅ | | The creator/owner of the Merkle tree. +| `new_tree_delegate` | | | | The wallet to which to delegate tree authority. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `system_program` | | | | The Solana System Program ID.
@@ -153,21 +154,22 @@ None. ### 📄 `mint_v1` -This instruction mints a compressed NFT. Note that Merkle proofs are *not* required for minting. +This instruction mints a cNFT. Note that Merkle proofs are *not* required for minting.
Accounts -| Name | Writable | Signer | Description -| ----------------------------- | :------: | :----: | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | | The wallet that will be the NFT owner. -| `leaf_delegate` | | | The wallet that will be the NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `payer` | | ✅ | Payer of the transaction. -| `tree_delegate` | | ✅ | The owner or delegate authority of the Merkle tree. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. +| Name | Writable | Signer | Optional | Description +| ----------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | | | The wallet that will be the cNFT owner. +| `leaf_delegate` | | | | The wallet that will be the cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `payer` | | ✅ | | Payer. +| `tree_delegate` | | ✅ | | The owner or delegate authority of the Merkle tree. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID.
@@ -176,33 +178,35 @@ This instruction mints a compressed NFT. Note that Merkle proofs are *not* requ | Argument | Offset | Size | Description | --------------------------------- | ------ | ---- | -- -| `data` | 0 | ~ | [`MetadataArgs`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/metaplex_adapter.rs#L81) object. +| `message` | 0 | ~ | [`MetadataArgs`](program/src/state/metaplex_adapter.rs#L83) struct. ### 📄 `mint_to_collection_v1` -This instruction mints a compressed NFT. Note that Merkle proofs are *not* required for minting. +This instruction mints a cNFT as a verified member of a collection. Note that Merkle proofs are *not* required for minting.
Accounts -| Name | Writable | Signer | Description -| ----------------------------- | :------: | :----: | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | | The wallet that will be the NFT owner. -| `leaf_delegate` | | | The wallet that will be the NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `payer` | | ✅ | Payer of the transaction. -| `tree_delegate` | | ✅ | The owner or delegate authority of the Merkle tree. -| `collection_authority` | | ✅ | Either the true collection authority a delegated collection authority (if delegated then a Collection Authority Record PDA must be provided). -| `collection_authority_record_pda` | | | In the case of a delegated collection authority, this is the collection authority record PDA. See the Metaplex documentation on [`Certified Collections`](https://docs.metaplex.com/programs/token-metadata/certified-collections) for more information on verifying collections. If there is no collecton authority record PDA then this must be the Bubblegum program address. -| `collection_mint` | | | Mint account of the collection. -| `collection_metadata` | ❓✅ | | Metadata account of the collection. Modified in the case of a sized collection. -| `edition_account` | | | Master Edition account of the collection. -| `bubblegum_signer` | | | Signing PDA used when doing a CPI into token-metadata to update the collection information. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. +| Name | Writable | Signer | Optional | Description +| ----------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | | | The wallet that will be the cNFT owner. +| `leaf_delegate` | | | | The wallet that will be the cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `payer` | | ✅ | | Payer. +| `tree_delegate` | | ✅ | | The owner or delegate authority of the Merkle tree. +| `collection_authority` | | ✅ | | Either the collection update authority or a delegate. +| `collection_authority_record_pda` | | | ✅ | Either a metadata delegate record PDA for a collection delegate, or a legacy collection authority record PDA. +| `collection_mint` | | | | Mint account of the collection. +| `collection_metadata` | ❓✅ | | | Metadata account of the collection. Modified in the case of a sized collection. +| `edition_account` | | | | Master Edition account of the collection. +| `bubblegum_signer` | | | | Signing PDA used when doing a CPI into token-metadata to update the collection information. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `token_metadata_program` | | | | Metaplex `TokenMetadata` program ID. +| `system_program` | | | | The Solana System Program ID.
@@ -211,29 +215,70 @@ This instruction mints a compressed NFT. Note that Merkle proofs are *not* requ | Argument | Offset | Size | Description | --------------------------------- | ------ | ---- | -- -| `data` | 0 | ~ | [`MetadataArgs`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/metaplex_adapter.rs#L81) object. +| `metadata_args` | 0 | ~ | [`MetadataArgs`](program/src/state/metaplex_adapter.rs#L83) struct. + + + +### 📄 `update_metadata` + +This instruction updates the metadata for a cNFT. + +
+ Accounts + +| Name | Writable | Signer | Optional | Description +| ----------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `authority` | | ✅ | | Either a collection authority or tree owner/delegate. If the item is in a verified collection, a valid collection authority must sign (collection update authority or a dey or a delegate). Otherwise a tree/owner delegate must sign. +| `collection_mint` | | | ✅ | Mint account of the collection. +| `collection_metadata` | ❓✅ | | ✅ | Metadata account of the collection. +| `collection_authority_record_pda` | | | ✅ | Either a metadata delegate record PDA for a collection delegate, or a legacy collection authority record PDA. +| `leaf_owner` | | | | The cNFT owner. +| `leaf_delegate` | | | | The cNFT delegate. +| `payer` | | ✅ | | Payer. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `token_metadata_program` | | | | Metaplex `TokenMetadata` program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof. + +
+ +
+ Arguments + +| Argument | Offset | Size | Description +| --------------------------------- | ------ | ---- | -- +| `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. +| `nonce` | 32 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `index` | 40 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. +| `current_metadata_args` | 44 | ~ | [`MetadataArgs`](program/src/state/metaplex_adapter.rs#L83) struct. +| `update_args` | ~ | ~ | [`UpdateArgs`](program/src/state/metaplex_adapter.rs#L109) object. +
### 📄 `verify_creator` and `unverify_creator` -Verify or unverify a creator that exists in the NFT's creators array. +Verify or unverify a creator that exists in the cNFT's creators array.
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | :------: | :----: | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | | The NFT owner. -| `leaf_delegate` | | | The NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `payer` | | ✅ | Payer of the transaction. -| `creator` | | ✅ | The NFT creator that is signing so that the creator is set to `verified` for the NFT. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | |The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | | | The cNFT owner. +| `leaf_delegate` | | | | The cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `payer` | | ✅ | | Payer. +| `creator` | | ✅ | | The cNFT creator that is signing so that the creator is set to `verified` for the cNFT. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -246,37 +291,38 @@ Verify or unverify a creator that exists in the NFT's creators array. | `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. | `data_hash` | 32 | 32 | The Keccak256 hash of the NFTs existing metadata (**without** the `verified` flag for the creator changed). The metadata is retrieved from off-chain data store. | `creator_hash` | 64 | 32 | The Keccak256 hash of the NFTs existing creators array (**without** the `verified` flag for the creator changed). The creators array is retrieved from off-chain data store. -| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) account at the time the NFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. | `index` | 104 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. -| `data` | 108 | ~ | [`MetadataArgs`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/metaplex_adapter.rs#L81) object (**without** the `verified` flag for the creator changed). Can be retrieved from off-chain data store. +| `data` | 108 | ~ | Existing [`MetadataArgs`](program/src/state/metaplex_adapter.rs#L83) struct (**without** the `verified` flag for the creator changed). Can be retrieved from off-chain data store. ### 📄 `verify_collection`, `unverify_collection`, and `set_and_verify_collection` -Verify or unverify an NFT as a member of a Metaplex [`Certified Collection`](https://docs.metaplex.com/programs/token-metadata/certified-collections) when the collection is already set in the Metadata. Or set a new collection in the metadata and verify the NFT as a member of the new collection. +Verify or unverify a cNFT as a member of a Metaplex [`Certified Collection`](https://docs.metaplex.com/programs/token-metadata/certified-collections) when the collection is already set in the Metadata. Or set a new collection in the metadata and verify the cNFT as a member of the new collection.
Accounts -| Name | Writable | Signer | Description -| ----------------------------------| :------: | :----: | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | | The NFT owner. -| `leaf_delegate` | | | The NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `payer` | | ✅ | Payer of the transaction. -| `tree_delegate` | | ❓✅ | The owner or delegate authority of the Merkle tree. This account is checked to be a signer in the case of `set_and_verify_collection` where we are actually changing the NFT metadata. -| `collection_authority` | | ✅ | Either the true collection authority a delegated collection authority (if delegated then a Collection Authority Record PDA must be provided). -| `collection_authority_record_pda` | | | In the case of a delegated collection authority, this is the collection authority record PDA. See the Metaplex documentation on [`Certified Collections`](https://docs.metaplex.com/programs/token-metadata/certified-collections) for more information on verifying collections. If there is no collecton authority record PDA then this must be the Bubblegum program address. -| `collection_mint` | | | Mint account of the collection. -| `collection_metadata` | ❓✅ | | Metadata account of the collection. Modified in the case of a sized collection. -| `edition_account` | | | Master Edition account of the collection. -| `bubblegum_signer` | | | Signing PDA used when doing a CPI into token-metadata to update the collection information. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| `token_metadata_program` | | | Metaplex `TokenMetadata` program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| ----------------------------------| :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | | | The cNFT owner. +| `leaf_delegate` | | | | The cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `payer` | | ✅ | | Payer. +| `tree_delegate` | | ❓✅ | | The owner or delegate authority of the Merkle tree. This account is checked to be a signer in the case of `set_and_verify_collection` where we are actually changily changing the cNFT metadata. +| `collection_authority` | | ✅ | | Either the collection update authority or a delegate. +| `collection_authority_record_pda` | | | ✅ | Either a metadata delegate record PDA for a collection delegate, or a legacy collection authority record PDA. +| `collection_mint` | | | | Mint account of the collection. +| `collection_metadata` | ❓✅ | | | Metadata account of the collection. Modified in the case of a sized collection. +| `edition_account` | | | | Master Edition account of the collection. +| `bubblegum_signer` | | | | Signing PDA used when doing a CPI into token-metadata to update the collection information. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `token_metadata_program` | | | | Metaplex `TokenMetadata` program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -288,30 +334,31 @@ Verify or unverify an NFT as a member of a Metaplex [`Certified Collection`](htt | `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. | `data_hash` | 32 | 32 | The Keccak256 hash of the NFTs existing metadata (**without** the `verified` flag for the creator changed). The metadata is retrieved from off-chain data store. | `creator_hash` | 64 | 32 | The Keccak256 hash of the NFTs existing creators array (**without** the `verified` flag for the creator changed). The creators array is retrieved from off-chain data store. -| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) account at the time the NFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. | `index` | 104 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. -| `data` | 108 | ~ | [`MetadataArgs`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/metaplex_adapter.rs#L81) object (**without** the `verified` flag for the collection changed). Can be retrieved from off-chain data store. -| _collection_ | ~ | 32 | Mint address of a new Collection NFT. **Note this is only an argument for `set_and_verify_collection`** +| `data` | 108 | ~ | Existing [`MetadataArgs`](program/src/state/metaplex_adapter.rs#L83) struct (**without** the `verified` flag for the collection changed). Can be retrieved from off-chain data store. +| _collection_ | ~ | 32 | Mint address of a new Collection cNFT. **Note this is only an argument for `set_and_verify_collection`** ### 📄 `transfer` -Transfer an NFT to a different owner. When NFTs are transferred there is no longer a delegate authority. +Transfer a cNFT to a different owner. When NFTs are transferred there is no longer a delegate authority.
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | -------- | ------ | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | ❓✅ | The NFT owner. Transfers must be signed by either the NFT owner or NFT delegate. -| `leaf_delegate` | | ❓✅ | The NFT delegate. Transfers must be signed by either the NFT owner or NFT delegate. -| `new_leaf_owner` | | | The wallet that will be the new NFT owner. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | ❓✅ | | The cNFT owner. Transfers must be signed by either the cNFT owner or cNFT delegate. +| `leaf_delegate` | | ❓✅ | | The cNFT delegate. Transfers must be signed by either the cNFT owner or cNFT delegate. +| `new_leaf_owner` | | | | The wallet that will be the new cNFT owner. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -323,28 +370,29 @@ Transfer an NFT to a different owner. When NFTs are transferred there is no lon | `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. | `data_hash` | 32 | 32 | The Keccak256 hash of the NFTs existing metadata (**without** the `verified` flag for the creator changed). The metadata is retrieved from off-chain data store. | `creator_hash` | 64 | 32 | The Keccak256 hash of the NFTs existing creators array (**without** the `verified` flag for the creator changed). The creators array is retrieved from off-chain data store. -| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) account at the time the NFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. | `index` | 104 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. ### 📄 `delegate` -Delegate authority of an NFT to a different wallet. +Delegate authority of a cNFT to a different wallet.
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | -------- | ------ | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | ✅ | The NFT owner. -| `previous_leaf_delegate` | | | The previous NFT delegate. -| `new_leaf_delegate` | | | The wallet that will be the new NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | ✅ | | The cNFT owner. +| `previous_leaf_delegate` | | | | The previous cNFT delegate. +| `new_leaf_delegate` | | | | The wallet that will be the new cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -356,27 +404,28 @@ Delegate authority of an NFT to a different wallet. | `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. | `data_hash` | 32 | 32 | The Keccak256 hash of the NFTs existing metadata (**without** the `verified` flag for the creator changed). The metadata is retrieved from off-chain data store. | `creator_hash` | 64 | 32 | The Keccak256 hash of the NFTs existing creators array (**without** the `verified` flag for the creator changed). The creators array is retrieved from off-chain data store. -| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) account at the time the NFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. | `index` | 104 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. ### 📄 `burn` -Burn an NFT. +Burn a cNFT.
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | -------- | ------ | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | ❓✅ | The NFT owner. Burn must be signed by either the NFT owner or NFT delegate. -| `leaf_delegate` | | ❓✅ | The NFT delegate. Burn must be signed by either the NFT owner or NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | ❓✅ | | The cNFT owner. Burn must be signed by either the cNFT owner or cNFT delegate. +| `leaf_delegate` | | ❓✅ | | The cNFT delegate. Burn must be signed by either the cNFT owner or cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -388,29 +437,29 @@ Burn an NFT. | `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. | `data_hash` | 32 | 32 | The Keccak256 hash of the NFTs existing metadata (**without** the `verified` flag for the creator changed). The metadata is retrieved from off-chain data store. | `creator_hash` | 64 | 32 | The Keccak256 hash of the NFTs existing creators array (**without** the `verified` flag for the creator changed). The creators array is retrieved from off-chain data store. -| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) account at the time the NFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. | `index` | 104 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. ### 📄 `redeem` -Redeem an NFT (remove from tree and store in a voucher PDA). +Redeem a cNFT (remove from tree and store in a voucher PDA).
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | -------- | ------ | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | ✅ | The NFT owner. -| `leaf_delegate` | | | The NFT delegate. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `voucher` | ✅ | | [`Voucher`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L36) PDA account that is initialized by this instruction. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| `system_program` | | | The Solana System Program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | ✅ | | The cNFT owner. +| `leaf_delegate` | | | | The cNFT delegate. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `voucher` | ✅ | | | [`Voucher`](program/src/state/mod.rs#L39) PDA account that is initialized by this instruction. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -422,27 +471,28 @@ Redeem an NFT (remove from tree and store in a voucher PDA). | `root` | 0 | 32 | The Merkle root for the tree. Can be retrieved from off-chain data store. | `data_hash` | 32 | 32 | The Keccak256 hash of the NFTs existing metadata (**without** the `verified` flag for the creator changed). The metadata is retrieved from off-chain data store. | `creator_hash` | 64 | 32 | The Keccak256 hash of the NFTs existing creators array (**without** the `verified` flag for the creator changed). The creators array is retrieved from off-chain data store. -| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) account at the time the NFT was minted. The unique value for each asset can be retrieved from off-chain data store. +| `nonce` | 96 | 8 | A nonce ("number used once") value used to make the Merkle tree leaves unique. This is the value of `num_minted` for the tree stored in the [`TreeConfig`](program/src/state/mod.rs#L17) account at the time the cNFT was minted. The unique value for each asset can be retrieved from off-chain data store. | `index` | 104 | 4 | The index of the leaf node in the Merkle tree. Can be retrieved from off-chain data store. ### 📄 `cancel_redeem` -Cancel the redemption of an NFT (Put the NFT back into the Merkle tree). +Cancel the redemption of a cNFT (Put the cNFT back into the Merkle tree).
Accounts -| Name | Writable | Signer | Description -| --------------------------------- | -------- | ------ | -- -| `tree_authority` | ✅ | | The [`TreeConfig`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. -| `leaf_owner` | | ✅ | The NFT owner. -| `merkle_tree` | ✅ | | The account that contains the Merkle tree, initialized by `create_tree`. -| `voucher` | ✅ | | [`Voucher`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L36) PDA account previously initialized by `redeem`. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. -| `compression_program` | | | The Solana Program Library spl-account-compression program ID. -| _remaining accounts_ | | | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this NFT's Merkle proof. +| Name | Writable | Signer | Optional | Description +| --------------------------------- | :------: | :----: | :------: | -- +| `tree_authority` | ✅ | | | The [`TreeConfig`](program/src/state/mod.rs#L17) PDA account previously initialized by `create_tree`. +| `leaf_owner` | | ✅ | | The cNFT owner. +| `merkle_tree` | ✅ | | | The account that contains the Merkle tree, initialized by `create_tree`. +| `voucher` | ✅ | | | [`Voucher`](program/src/state/mod.rs#L39) PDA account previously initialized by `redeem`. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID. +| `compression_program` | | | | The Solana Program Library spl-account-compression program ID. +| `system_program` | | | | The Solana System Program ID. +| _remaining accounts_ | | | ✅ | `Pubkeys`(s) that are 32-byte Keccak256 hash values that represent the nodes for this cNFT's Merkle proof.
@@ -457,26 +507,26 @@ Cancel the redemption of an NFT (Put the NFT back into the Merkle tree). ### 📄 `decompress_v1` -Decompress an NFT into an uncompressed Metaplex NFT. This will cost rent for the token-metadata Metadata and Master Edition accounts that are created. Note that Merkle proofs are *not* required for decompression because the leaf (NFT) was already removed from the tree. +Decompress a cNFT into an uncompressed Token Metadata NFT. This will cost rent for the token-metadata Metadata and Master Edition accounts that are created. Note that Merkle proofs are *not* required for decompression because the leaf (cNFT) was already removed from the tree.
Accounts -| Name | Writable | Signer | Description -| ----------------------------------| :------: | :----: | -- -| `voucher` | ✅ | | [`Voucher`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/mod.rs#L36) PDA account previously initialized by `redeem`. -| `leaf_owner` | | ✅ | The NFT owner. -| `token_account` | ✅ | | Token account for the NFT. This is created if it doesn't exist. -| `mint` | ✅ | | Mint PDA account for the NFT. This is created if it doesn't exist. -| `mint_authority` | | | PDA account for mint authority. -| `metadata` | ✅ | | New token-metadata Metadata account for the NFT. Initialized in Token Metadata Program. -| `master_edition` | ✅ | | New Master Edition account for the NFT. Initialized in Token Metadata Program -| `system_program` | | | The Solana System Program ID. -| `sysvar_rent` | | | `Rent` account. -| `token_metadata_program` | | | Metaplex `TokenMetadata` program ID. -| `token_program` | | | Solana Program Library spl-token program ID. -| `associated_token_program` | | | Solana Program Library spl-associated-token-account program ID. -| `log_wrapper` | | | The Solana Program Library Wrapper (spl-noop) program ID. +| Name | Writable | Signer | Optional | Description +| ----------------------------------| :------: | :----: | :------: | -- +| `voucher` | ✅ | | | [`Voucher`](program/src/state/mod.rs#L39) PDA account previously initialized by `redeem`. +| `leaf_owner` | | ✅ | | The cNFT owner. +| `token_account` | ✅ | | | Token account for the cNFT. This is created if it doesn't exist. +| `mint` | ✅ | | | Mint PDA account for the cNFT. This is created if it doesn't exist. +| `mint_authority` | | | | PDA account for mint authority. +| `metadata` | ✅ | | | New token-metadata Metadata account for the cNFT. Initialized in Token Metadata Program. +| `master_edition` | ✅ | | | New Master Edition account for the cNFT. Initialized in Token Metadata Program +| `system_program` | | | | The Solana System Program ID. +| `sysvar_rent` | | | | `Rent` account. +| `token_metadata_program` | | | | Metaplex `TokenMetadata` program ID. +| `token_program` | | | | Solana Program Library spl-token program ID. +| `associated_token_program` | | | | Solana Program Library spl-associated-token-account program ID. +| `log_wrapper` | | | | The Solana Program Library Wrapper (spl-noop) program ID.
@@ -485,7 +535,6 @@ Decompress an NFT into an uncompressed Metaplex NFT. This will cost rent for th | Argument | Offset | Size | Description | --------------------------------- | ------ | ---- | -- -| `data` | 0 | ~ | [`MetadataArgs`](https://github.com/metaplex-foundation/metaplex-program-library/blob/master/bubblegum/program/src/state/metaplex_adapter.rs#L81) object. +| `data` | 0 | ~ | [`MetadataArgs`](program/src/state/metaplex_adapter.rs#L83) struct. - diff --git a/programs/bubblegum/program/src/error.rs b/programs/bubblegum/program/src/error.rs index 39bac159..634fb060 100644 --- a/programs/bubblegum/program/src/error.rs +++ b/programs/bubblegum/program/src/error.rs @@ -72,6 +72,18 @@ pub enum BubblegumError { UnknownExternalError, #[msg("Decompression is disabled for this tree.")] DecompressionDisabled, + #[msg("Missing collection mint account")] + MissingCollectionMintAccount, + #[msg("Missing collection metadata account")] + MissingCollectionMetadataAccount, + #[msg("Collection mismatch")] + CollectionMismatch, + #[msg("Metadata not mutable")] + MetadataImmutable, + #[msg("Can only update primary sale to true")] + PrimarySaleCanOnlyBeFlippedToTrue, + #[msg("Creator did not unverify the metadata")] + CreatorDidNotUnverify, } // Converts certain Token Metadata errors into Bubblegum equivalents diff --git a/programs/bubblegum/program/src/lib.rs b/programs/bubblegum/program/src/lib.rs index 03bc3690..f0d468c0 100644 --- a/programs/bubblegum/program/src/lib.rs +++ b/programs/bubblegum/program/src/lib.rs @@ -10,7 +10,10 @@ pub mod state; pub mod utils; use processor::*; -use state::{metaplex_adapter::MetadataArgs, DecompressibleState}; +use state::{ + metaplex_adapter::{MetadataArgs, UpdateArgs}, + DecompressibleState, +}; declare_id!("BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY"); @@ -32,6 +35,7 @@ pub enum InstructionName { SetAndVerifyCollection, MintToCollectionV1, SetDecompressibleState, + UpdateMetadata, } pub fn get_instruction_type(full_bytes: &[u8]) -> InstructionName { @@ -59,7 +63,7 @@ pub fn get_instruction_type(full_bytes: &[u8]) -> InstructionName { [82, 104, 152, 6, 149, 111, 100, 13] => InstructionName::SetDecompressibleState, // `SetDecompressableState` instruction mapped to `SetDecompressibleState` instruction [18, 135, 238, 168, 246, 195, 61, 115] => InstructionName::SetDecompressibleState, - + [170, 182, 43, 239, 97, 78, 225, 186] => InstructionName::UpdateMetadata, _ => InstructionName::Unknown, } } @@ -260,4 +264,16 @@ pub mod bubblegum { ) -> Result<()> { processor::verify_creator(ctx, root, data_hash, creator_hash, nonce, index, message) } + + /// Updates metadata for a leaf node that is not part of a verified collection. + pub fn update_metadata<'info>( + ctx: Context<'_, '_, '_, 'info, UpdateMetadata<'info>>, + root: [u8; 32], + nonce: u64, + index: u32, + current_metadata: MetadataArgs, + update_args: UpdateArgs, + ) -> Result<()> { + processor::update_metadata(ctx, root, nonce, index, current_metadata, update_args) + } } diff --git a/programs/bubblegum/program/src/processor/mod.rs b/programs/bubblegum/program/src/processor/mod.rs index 99b6ec68..62b72a26 100644 --- a/programs/bubblegum/program/src/processor/mod.rs +++ b/programs/bubblegum/program/src/processor/mod.rs @@ -33,6 +33,7 @@ mod set_tree_delegate; mod transfer; mod unverify_collection; mod unverify_creator; +mod update_metadata; mod verify_collection; mod verify_creator; @@ -51,6 +52,7 @@ pub(crate) use set_tree_delegate::*; pub(crate) use transfer::*; pub(crate) use unverify_collection::*; pub(crate) use unverify_creator::*; +pub(crate) use update_metadata::*; pub(crate) use verify_collection::*; pub(crate) use verify_creator::*; diff --git a/programs/bubblegum/program/src/processor/update_metadata.rs b/programs/bubblegum/program/src/processor/update_metadata.rs new file mode 100644 index 00000000..6c1f127c --- /dev/null +++ b/programs/bubblegum/program/src/processor/update_metadata.rs @@ -0,0 +1,280 @@ +use anchor_lang::prelude::*; +use spl_account_compression::{program::SplAccountCompression, wrap_application_data_v1, Noop}; + +use crate::{ + asserts::{assert_has_collection_authority, assert_metadata_is_mpl_compatible}, + error::BubblegumError, + state::{ + leaf_schema::LeafSchema, + metaplex_adapter::{Collection, Creator, MetadataArgs, UpdateArgs}, + metaplex_anchor::{MplTokenMetadata, TokenMetadata}, + TreeConfig, + }, + utils::{get_asset_id, hash_creators, hash_metadata, replace_leaf}, +}; + +#[derive(Accounts)] +pub struct UpdateMetadata<'info> { + #[account( + seeds = [merkle_tree.key().as_ref()], + bump, + )] + /// CHECK: This account is neither written to nor read from. + pub tree_authority: Account<'info, TreeConfig>, + /// Either collection authority or tree owner/delegate, depending + /// on whether the item is in a verified collection + pub authority: Signer<'info>, + /// CHECK: This account is checked in the instruction + /// Used when item is in a verified collection + pub collection_mint: Option>, + /// Used when item is in a verified collection + pub collection_metadata: Option>>, + /// CHECK: This account is checked in the instruction + pub collection_authority_record_pda: Option>, + /// CHECK: This account is checked in the instruction + pub leaf_owner: UncheckedAccount<'info>, + /// CHECK: This account is checked in the instruction + pub leaf_delegate: UncheckedAccount<'info>, + pub payer: Signer<'info>, + #[account(mut)] + /// CHECK: This account is modified in the downstream program + pub merkle_tree: UncheckedAccount<'info>, + pub log_wrapper: Program<'info, Noop>, + pub compression_program: Program<'info, SplAccountCompression>, + pub token_metadata_program: Program<'info, MplTokenMetadata>, + pub system_program: Program<'info, System>, +} + +fn assert_authority_matches_collection<'info>( + collection: &Collection, + collection_authority: &AccountInfo<'info>, + collection_authority_record_pda: &Option>, + collection_mint: &AccountInfo<'info>, + collection_metadata_account_info: &AccountInfo, + collection_metadata: &TokenMetadata, + token_metadata_program: &Program<'info, MplTokenMetadata>, +) -> Result<()> { + // Mint account must match Collection mint + require!( + collection_mint.key() == collection.key, + BubblegumError::CollectionMismatch + ); + // Metadata mint must match Collection mint + require!( + collection_metadata.mint == collection.key, + BubblegumError::CollectionMismatch + ); + // Verify correct account ownerships. + require!( + *collection_metadata_account_info.owner == token_metadata_program.key(), + BubblegumError::IncorrectOwner + ); + // Collection mint must be owned by SPL token + require!( + *collection_mint.owner == spl_token::id(), + BubblegumError::IncorrectOwner + ); + + let collection_authority_record = collection_authority_record_pda + .as_ref() + .map(|authority_record_pda| authority_record_pda.to_account_info()); + + // Assert that the correct Collection Authority was provided using token-metadata + assert_has_collection_authority( + collection_metadata, + collection_mint.key, + collection_authority.key, + collection_authority_record.as_ref(), + )?; + + Ok(()) +} + +fn all_verified_creators_in_a_are_in_b(a: &[Creator], b: &[Creator], exception: Pubkey) -> bool { + a.iter() + .filter(|creator_a| creator_a.verified) + .all(|creator_a| { + creator_a.address == exception + || b.iter() + .any(|creator_b| creator_a.address == creator_b.address && creator_b.verified) + }) +} + +fn process_update_metadata<'info>( + merkle_tree: &AccountInfo<'info>, + authority: &AccountInfo<'info>, + owner: &AccountInfo<'info>, + delegate: &AccountInfo<'info>, + compression_program: &AccountInfo<'info>, + tree_authority: &AccountInfo<'info>, + tree_authority_bump: u8, + log_wrapper: &Program<'info, Noop>, + remaining_accounts: &[AccountInfo<'info>], + root: [u8; 32], + current_metadata: MetadataArgs, + update_args: UpdateArgs, + nonce: u64, + index: u32, +) -> Result<()> { + // Old metadata must be mutable to allow metadata update + require!( + current_metadata.is_mutable, + BubblegumError::MetadataImmutable + ); + + let current_data_hash = hash_metadata(¤t_metadata)?; + let current_creator_hash = hash_creators(¤t_metadata.creators)?; + + // Update metadata + let mut updated_metadata = current_metadata; + if let Some(name) = update_args.name { + updated_metadata.name = name; + }; + if let Some(symbol) = update_args.symbol { + updated_metadata.symbol = symbol; + }; + if let Some(uri) = update_args.uri { + updated_metadata.uri = uri; + }; + if let Some(updated_creators) = update_args.creators { + let current_creators = updated_metadata.creators; + + // Make sure no new creator is verified (unless it is the tree delegate). + let no_new_creators_verified = all_verified_creators_in_a_are_in_b( + &updated_creators, + ¤t_creators, + authority.key(), + ); + require!( + no_new_creators_verified, + BubblegumError::CreatorDidNotVerify + ); + + // Make sure no current verified creator is unverified or removed (unless it is the tree + // delegate). + let no_current_creators_unverified = all_verified_creators_in_a_are_in_b( + ¤t_creators, + &updated_creators, + authority.key(), + ); + require!( + no_current_creators_unverified, + BubblegumError::CreatorDidNotUnverify + ); + + updated_metadata.creators = updated_creators; + } + if let Some(seller_fee_basis_points) = update_args.seller_fee_basis_points { + updated_metadata.seller_fee_basis_points = seller_fee_basis_points + }; + if let Some(primary_sale_happened) = update_args.primary_sale_happened { + // a new value of primary_sale_happened should only be specified if primary_sale_happened was false in the original metadata + require!( + !updated_metadata.primary_sale_happened, + BubblegumError::PrimarySaleCanOnlyBeFlippedToTrue + ); + updated_metadata.primary_sale_happened = primary_sale_happened; + }; + if let Some(is_mutable) = update_args.is_mutable { + updated_metadata.is_mutable = is_mutable; + }; + + assert_metadata_is_mpl_compatible(&updated_metadata)?; + let updated_data_hash = hash_metadata(&updated_metadata)?; + let updated_creator_hash = hash_creators(&updated_metadata.creators)?; + + let asset_id = get_asset_id(&merkle_tree.key(), nonce); + let previous_leaf = LeafSchema::new_v0( + asset_id, + owner.key(), + delegate.key(), + nonce, + current_data_hash, + current_creator_hash, + ); + let new_leaf = LeafSchema::new_v0( + asset_id, + owner.key(), + delegate.key(), + nonce, + updated_data_hash, + updated_creator_hash, + ); + + wrap_application_data_v1(new_leaf.to_event().try_to_vec()?, log_wrapper)?; + + replace_leaf( + &merkle_tree.key(), + tree_authority_bump, + compression_program, + tree_authority, + merkle_tree, + &log_wrapper.to_account_info(), + remaining_accounts, + root, + previous_leaf.to_node(), + new_leaf.to_node(), + index, + ) +} + +pub fn update_metadata<'info>( + ctx: Context<'_, '_, '_, 'info, UpdateMetadata<'info>>, + root: [u8; 32], + nonce: u64, + index: u32, + current_metadata: MetadataArgs, + update_args: UpdateArgs, +) -> Result<()> { + match ¤t_metadata.collection { + // Verified collection case. + Some(collection) if collection.verified => { + let collection_mint = ctx + .accounts + .collection_mint + .as_ref() + .ok_or(BubblegumError::MissingCollectionMintAccount)?; + + let collection_metadata = ctx + .accounts + .collection_metadata + .as_ref() + .ok_or(BubblegumError::MissingCollectionMetadataAccount)?; + + assert_authority_matches_collection( + collection, + &ctx.accounts.authority.to_account_info(), + &ctx.accounts.collection_authority_record_pda, + collection_mint, + &collection_metadata.to_account_info(), + collection_metadata, + &ctx.accounts.token_metadata_program, + )?; + } + // No collection or unverified collection case. + _ => { + require!( + ctx.accounts.authority.key() == ctx.accounts.tree_authority.tree_creator + || ctx.accounts.authority.key() == ctx.accounts.tree_authority.tree_delegate, + BubblegumError::TreeAuthorityIncorrect, + ); + } + } + + process_update_metadata( + &ctx.accounts.merkle_tree.to_account_info(), + &ctx.accounts.authority, + &ctx.accounts.leaf_owner, + &ctx.accounts.leaf_delegate, + &ctx.accounts.compression_program.to_account_info(), + &ctx.accounts.tree_authority.to_account_info(), + *ctx.bumps.get("tree_authority").unwrap(), + &ctx.accounts.log_wrapper, + ctx.remaining_accounts, + root, + current_metadata, + update_args, + nonce, + index, + ) +} diff --git a/programs/bubblegum/program/src/state/leaf_schema.rs b/programs/bubblegum/program/src/state/leaf_schema.rs index 26a5563f..6709efd3 100644 --- a/programs/bubblegum/program/src/state/leaf_schema.rs +++ b/programs/bubblegum/program/src/state/leaf_schema.rs @@ -92,6 +92,18 @@ impl LeafSchema { } } + pub fn owner(&self) -> Pubkey { + match self { + LeafSchema::V1 { owner, .. } => *owner, + } + } + + pub fn delegate(&self) -> Pubkey { + match self { + LeafSchema::V1 { delegate, .. } => *delegate, + } + } + pub fn nonce(&self) -> u64 { match self { LeafSchema::V1 { nonce, .. } => *nonce, diff --git a/programs/bubblegum/program/src/state/metaplex_adapter.rs b/programs/bubblegum/program/src/state/metaplex_adapter.rs index 5c0b1d78..6aef4b43 100644 --- a/programs/bubblegum/program/src/state/metaplex_adapter.rs +++ b/programs/bubblegum/program/src/state/metaplex_adapter.rs @@ -104,3 +104,14 @@ pub struct MetadataArgs { pub token_program_version: TokenProgramVersion, pub creators: Vec, } + +#[derive(AnchorSerialize, AnchorDeserialize, PartialEq, Eq, Debug, Clone, Default)] +pub struct UpdateArgs { + pub name: Option, + pub symbol: Option, + pub uri: Option, + pub creators: Option>, + pub seller_fee_basis_points: Option, + pub primary_sale_happened: Option, + pub is_mutable: Option, +}