From 33ee4ca02b69096d3b84dc07b6e91393a2489817 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Thu, 15 Sep 2022 22:27:47 -0700 Subject: [PATCH 1/7] WIP solana dashboard integration --- packages/solana/src/classes/registry.ts | 57 ++++++++----------- .../solana/src/contracts/nft-collection.ts | 12 ++-- packages/solana/src/contracts/nft-drop.ts | 8 +-- packages/solana/src/contracts/token.ts | 14 ++--- packages/solana/test/registry.test.ts | 2 + 5 files changed, 44 insertions(+), 49 deletions(-) diff --git a/packages/solana/src/classes/registry.ts b/packages/solana/src/classes/registry.ts index 1a0fde2f8b3..fcd30d19bda 100644 --- a/packages/solana/src/classes/registry.ts +++ b/packages/solana/src/classes/registry.ts @@ -17,52 +17,52 @@ export class Registry { public async getAccountType(address: string) { try { - const metadata = await this.metaplex - .nfts() - .findByMint({ mintAddress: new PublicKey(address) }) + const candyMachine = await this.metaplex + .candyMachines() + .findByAddress({ address: new PublicKey(address) }) .run(); - if (metadata) { - if (metadata.collectionDetails) { - return "nft-collection"; - } else { - if (metadata.tokenStandard === TokenStandard.Fungible) { - return "token"; - } - } + if (candyMachine) { + return "nft-drop"; } - } catch (e) { - try { - const candyMachine = await this.metaplex - .candyMachines() - .findByAddress({ address: new PublicKey(address) }) - .run(); - if (candyMachine) { - return "nft-drop"; + } catch (err) { + // ignore and try next + } + const metadata = await this.metaplex + .nfts() + .findByMint({ mintAddress: new PublicKey(address) }) + .run(); + if (metadata) { + if (metadata.collectionDetails) { + return "nft-collection"; + } else { + if (metadata.tokenStandard === TokenStandard.Fungible) { + return "token"; } - } catch (err) { - return undefined; } } - return undefined; + throw new Error("Unknown account type"); } public async getAccountsForWallet( walletAddress: string, ): Promise { - const pubKeys = await this.getMetadataAddressesForWallet(walletAddress); const metadatas = await this.metaplex .nfts() - .findAllByMintList({ mints: pubKeys }) + .findAllByOwner({ owner: new PublicKey(walletAddress) }) .run(); + console.log({ metadatas }); + const candyMachines = await this.metaplex .candyMachines() .findAllBy({ - type: "wallet", + type: "authority", publicKey: new PublicKey(walletAddress), }) .run(); + console.log({ candyMachines }); + return metadatas .map((mintMetadata) => { const meta = mintMetadata as Metadata; @@ -105,11 +105,4 @@ export class Registry { meta.mintAddress.toBase58(), ); } - - public async getMetadataAddressesForWallet(walletAddress: string) { - return await TokenMetadataProgram.metadataV1Accounts(this.metaplex) - .selectMint() - .whereCreator(1, new PublicKey(walletAddress)) - .getDataAsPublicKeys(); - } } diff --git a/packages/solana/src/contracts/nft-collection.ts b/packages/solana/src/contracts/nft-collection.ts index bbee6429ba1..9555404d6f6 100644 --- a/packages/solana/src/contracts/nft-collection.ts +++ b/packages/solana/src/contracts/nft-collection.ts @@ -22,7 +22,7 @@ export class NFTCollection { private metaplex: Metaplex; private storage: IStorage; private nft: NFTHelper; - collectionMintAddress: PublicKey; + public publicKey: PublicKey; constructor( collectionMintAddress: string, @@ -32,13 +32,13 @@ export class NFTCollection { this.storage = storage; this.metaplex = metaplex; this.nft = new NFTHelper(metaplex); - this.collectionMintAddress = new PublicKey(collectionMintAddress); + this.publicKey = new PublicKey(collectionMintAddress); } async getMetadata(): Promise { const metadata = await this.metaplex .nfts() - .findByMint({ mintAddress: this.collectionMintAddress }) + .findByMint({ mintAddress: this.publicKey }) .run(); return this.nft.toNFTMetadata(metadata); @@ -52,7 +52,7 @@ export class NFTCollection { const allSignatures: ConfirmedSignatureInfo[] = []; // This returns the first 1000, so we need to loop through until we run out of signatures to get. let signatures = await this.metaplex.connection.getSignaturesForAddress( - this.collectionMintAddress, + this.publicKey, ); allSignatures.push(...signatures); @@ -61,7 +61,7 @@ export class NFTCollection { before: signatures[signatures.length - 1]?.signature, }; signatures = await this.metaplex.connection.getSignaturesForAddress( - this.collectionMintAddress, + this.publicKey, options, ); allSignatures.push(...signatures); @@ -213,7 +213,7 @@ export class NFTCollection { name: metadata.name || "", uri, sellerFeeBasisPoints: 0, - collection: this.collectionMintAddress, + collection: this.publicKey, collectionAuthority: this.metaplex.identity(), tokenOwner: new PublicKey(to), // Always sets max supply to unlimited so editions can be minted diff --git a/packages/solana/src/contracts/nft-drop.ts b/packages/solana/src/contracts/nft-drop.ts index 1895cd1aa8f..866aff2fd94 100644 --- a/packages/solana/src/contracts/nft-drop.ts +++ b/packages/solana/src/contracts/nft-drop.ts @@ -16,14 +16,14 @@ export class NFTDrop { private metaplex: Metaplex; private storage: IStorage; private nft: NFTHelper; - public dropMintAddress: PublicKey; + public publicKey: PublicKey; public claimConditions: ClaimConditions; constructor(dropMintAddress: string, metaplex: Metaplex, storage: IStorage) { this.storage = storage; this.metaplex = metaplex; this.nft = new NFTHelper(metaplex); - this.dropMintAddress = new PublicKey(dropMintAddress); + this.publicKey = new PublicKey(dropMintAddress); this.claimConditions = new ClaimConditions(dropMintAddress, metaplex); } @@ -57,7 +57,7 @@ export class NFTDrop { async getAllClaimed(): Promise { const nfts = await this.metaplex .candyMachines() - .findMintedNfts({ candyMachine: this.dropMintAddress }) + .findMintedNfts({ candyMachine: this.publicKey }) .run(); const metadatas = nfts.map((nft) => this.nft.toNFTMetadata(nft)); @@ -128,7 +128,7 @@ export class NFTDrop { private async getCandyMachine() { return this.metaplex .candyMachines() - .findByAddress({ address: this.dropMintAddress }) + .findByAddress({ address: this.publicKey }) .run(); } } diff --git a/packages/solana/src/contracts/token.ts b/packages/solana/src/contracts/token.ts index b6781306770..1de26a32777 100644 --- a/packages/solana/src/contracts/token.ts +++ b/packages/solana/src/contracts/token.ts @@ -22,25 +22,25 @@ export class Token { private connection: Connection; private metaplex: Metaplex; private storage: IStorage; - tokenMintAddress: PublicKey; + public publicKey: PublicKey; constructor(tokenMintAddress: string, metaplex: Metaplex, storage: IStorage) { this.storage = storage; this.metaplex = metaplex; this.connection = metaplex.connection; - this.tokenMintAddress = new PublicKey(tokenMintAddress); + this.publicKey = new PublicKey(tokenMintAddress); } async getMint() { return await this.metaplex .tokens() - .findMintByAddress({ address: this.tokenMintAddress }) + .findMintByAddress({ address: this.publicKey }) .run(); // TODO abstract types away } async getMetadata(): Promise { const mint = await this.getMint(); - const addr = findMetadataPda(this.tokenMintAddress); + const addr = findMetadataPda(this.publicKey); const account = await this.metaplex.rpc().getAccount(addr); const meta = toMetadata(toMetadataAccount(account)); return { @@ -66,7 +66,7 @@ export class Token { .tokens() .mint({ amount: token(amountParsed, info.decimals), - mintAddress: this.tokenMintAddress, + mintAddress: this.publicKey, }) .run(); return { @@ -82,7 +82,7 @@ export class Token { const result = await this.metaplex .tokens() .send({ - mintAddress: this.tokenMintAddress, + mintAddress: this.publicKey, amount: token(amount, info.decimals), toOwner: new PublicKey(receiverAddress), }) @@ -99,7 +99,7 @@ export class Token { async balanceOf(walletAddress: string): Promise { const mint = await this.getMint(); const addr = await getAssociatedTokenAddress( - this.tokenMintAddress, + this.publicKey, new PublicKey(walletAddress), ); try { diff --git a/packages/solana/test/registry.test.ts b/packages/solana/test/registry.test.ts index 0ffa4c23f02..1c147164a15 100644 --- a/packages/solana/test/registry.test.ts +++ b/packages/solana/test/registry.test.ts @@ -1,4 +1,5 @@ import { ThirdwebSDK } from "../src/index"; +import { createThirdwebSDK } from "../src/server/index"; import { createTestSDK } from "./before-setup"; import { expect } from "chai"; @@ -28,6 +29,7 @@ describe("Registry", async () => { const t = await freshSDK.registry.getAccountsForWallet( freshSDK.wallet.getAddress() || "", ); + expect(t.length).to.eq(3); t.forEach((account) => { switch (account.type) { case "nft-collection": From 57684fe4c253520ec68980cf1d56cf70c729b2e3 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 16 Sep 2022 10:52:17 -0700 Subject: [PATCH 2/7] make drop deploy a single tx, fix registry --- packages/solana/src/classes/deployer.ts | 41 ++++++++++++++++++++----- packages/solana/src/classes/registry.ts | 17 ++++++---- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/solana/src/classes/deployer.ts b/packages/solana/src/classes/deployer.ts index 63ea6c91425..4e29aa8e4b8 100644 --- a/packages/solana/src/classes/deployer.ts +++ b/packages/solana/src/classes/deployer.ts @@ -95,22 +95,49 @@ export class Deployer { async createNftDrop(metadata: NFTDropMetadataInput): Promise { const parsed = NFTDropContractSchema.parse(metadata); + const uri = await this.storage.uploadMetadata( + NFTCollectionMetadataInputSchema.parse(metadata), + ); - // TODO make it a single tx - const collection = await this.createNftCollection(metadata); + const collectionMint = Keypair.generate(); + const collectionTx = await this.metaplex + .nfts() + .builders() + .create({ + useNewMint: collectionMint, + name: parsed.name, + symbol: parsed.symbol, + sellerFeeBasisPoints: 0, + uri, + isCollection: true, + creators: enforceCreator( + parsed.creators, + this.metaplex.identity().publicKey, + ), + }); - const { candyMachine: nftDrop } = await this.metaplex + const candyMachineKeypair = Keypair.generate(); + const candyMachineTx = await this.metaplex .candyMachines() + .builders() .create({ ...parsed, - collection: new PublicKey(collection), + candyMachine: candyMachineKeypair, + collection: collectionMint.publicKey, creators: enforceCreator( parsed.creators, this.metaplex.identity().publicKey, ), - }) - .run(); + }); + + const result = await collectionTx + .add(candyMachineTx) + .sendAndConfirm(this.metaplex); + + if (!result.response.signature) { + throw new Error("Transaction failed"); + } - return nftDrop.address.toBase58(); + return candyMachineKeypair.publicKey.toBase58(); } } diff --git a/packages/solana/src/classes/registry.ts b/packages/solana/src/classes/registry.ts index fcd30d19bda..3f39599171b 100644 --- a/packages/solana/src/classes/registry.ts +++ b/packages/solana/src/classes/registry.ts @@ -3,7 +3,7 @@ import { CandyMachine, Metadata, Metaplex, - TokenMetadataProgram, + TokenProgram, } from "@metaplex-foundation/js"; import { TokenStandard } from "@metaplex-foundation/mpl-token-metadata"; import { PublicKey } from "@solana/web3.js"; @@ -31,6 +31,7 @@ export class Registry { .nfts() .findByMint({ mintAddress: new PublicKey(address) }) .run(); + if (metadata) { if (metadata.collectionDetails) { return "nft-collection"; @@ -46,13 +47,12 @@ export class Registry { public async getAccountsForWallet( walletAddress: string, ): Promise { + const mints = await this.getOwnedTokenAccountsForWallet(walletAddress); const metadatas = await this.metaplex .nfts() - .findAllByOwner({ owner: new PublicKey(walletAddress) }) + .findAllByMintList({ mints }) .run(); - console.log({ metadatas }); - const candyMachines = await this.metaplex .candyMachines() .findAllBy({ @@ -61,8 +61,6 @@ export class Registry { }) .run(); - console.log({ candyMachines }); - return metadatas .map((mintMetadata) => { const meta = mintMetadata as Metadata; @@ -105,4 +103,11 @@ export class Registry { meta.mintAddress.toBase58(), ); } + + private async getOwnedTokenAccountsForWallet(walletAddress: string) { + return await TokenProgram.tokenAccounts(this.metaplex) + .selectMint() + .whereOwner(new PublicKey(walletAddress)) + .getDataAsPublicKeys(); + } } From 0f8a69a66e57f0213be8d1523cd2918dff9a4f24 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 16 Sep 2022 12:03:53 -0700 Subject: [PATCH 3/7] cleanup --- .../solana/src/classes/claim-conditions.ts | 17 ++++--- packages/solana/src/classes/deployer.ts | 21 ++++---- packages/solana/src/index.ts | 2 +- .../solana/src/types/contracts/nft-drop.ts | 48 ++++++------------- 4 files changed, 33 insertions(+), 55 deletions(-) diff --git a/packages/solana/src/classes/claim-conditions.ts b/packages/solana/src/classes/claim-conditions.ts index 51609e6806b..d1048e34aa0 100644 --- a/packages/solana/src/classes/claim-conditions.ts +++ b/packages/solana/src/classes/claim-conditions.ts @@ -1,8 +1,7 @@ import { TransactionResult } from "../types/common"; import { - NFTDropClaimInput, - NFTDropClaimSchema, - NFTDropClaimOutput, + NFTDropConditionsOutputSchema, + NFTDropMetadataInput, } from "../types/contracts/nft-drop"; import { Metaplex } from "@metaplex-foundation/js"; import { PublicKey } from "@solana/web3.js"; @@ -16,21 +15,21 @@ export class ClaimConditions { this.metaplex = metaplex; } - async get(): Promise { + async get(): Promise { const candyMachine = await this.getCandyMachine(); return { - price: BigInt(candyMachine.price.basisPoints.toNumber()), - sellerFeeBasisPoints: BigInt(candyMachine.sellerFeeBasisPoints), - itemsAvailable: BigInt(candyMachine.itemsAvailable.toNumber()), + price: candyMachine.price.basisPoints.toNumber(), + sellerFeeBasisPoints: candyMachine.sellerFeeBasisPoints, + itemsAvailable: candyMachine.itemsAvailable.toNumber(), goLiveDate: candyMachine.goLiveDate ? new Date(candyMachine.goLiveDate.toNumber() * 1000) : undefined, }; } - async set(metadata: NFTDropClaimInput): Promise { - const parsed = NFTDropClaimSchema.parse(metadata); + async set(metadata: NFTDropMetadataInput): Promise { + const parsed = NFTDropConditionsOutputSchema.parse(metadata); const result = await this.metaplex .candyMachines() diff --git a/packages/solana/src/classes/deployer.ts b/packages/solana/src/classes/deployer.ts index 4e29aa8e4b8..a6dcfb1de07 100644 --- a/packages/solana/src/classes/deployer.ts +++ b/packages/solana/src/classes/deployer.ts @@ -5,7 +5,7 @@ import { TokenMetadataInputSchema, } from "../types/contracts"; import { - NFTDropContractSchema, + NFTDropConditionsOutputSchema, NFTDropMetadataInput, } from "../types/contracts/nft-drop"; import { enforceCreator } from "./helpers/creators-helper"; @@ -14,7 +14,7 @@ import { createCreateMetadataAccountV2Instruction, DataV2, } from "@metaplex-foundation/mpl-token-metadata"; -import { Keypair, PublicKey } from "@solana/web3.js"; +import { Keypair } from "@solana/web3.js"; import { IStorage } from "@thirdweb-dev/storage"; export class Deployer { @@ -94,10 +94,9 @@ export class Deployer { } async createNftDrop(metadata: NFTDropMetadataInput): Promise { - const parsed = NFTDropContractSchema.parse(metadata); - const uri = await this.storage.uploadMetadata( - NFTCollectionMetadataInputSchema.parse(metadata), - ); + const collectionInfo = NFTCollectionMetadataInputSchema.parse(metadata); + const candyMachineInfo = NFTDropConditionsOutputSchema.parse(metadata); + const uri = await this.storage.uploadMetadata(collectionInfo); const collectionMint = Keypair.generate(); const collectionTx = await this.metaplex @@ -105,13 +104,13 @@ export class Deployer { .builders() .create({ useNewMint: collectionMint, - name: parsed.name, - symbol: parsed.symbol, + name: collectionInfo.name, + symbol: collectionInfo.symbol, sellerFeeBasisPoints: 0, uri, isCollection: true, creators: enforceCreator( - parsed.creators, + collectionInfo.creators, this.metaplex.identity().publicKey, ), }); @@ -121,11 +120,11 @@ export class Deployer { .candyMachines() .builders() .create({ - ...parsed, + ...candyMachineInfo, candyMachine: candyMachineKeypair, collection: collectionMint.publicKey, creators: enforceCreator( - parsed.creators, + collectionInfo.creators, this.metaplex.identity().publicKey, ), }); diff --git a/packages/solana/src/index.ts b/packages/solana/src/index.ts index 3fcb7c3d1ce..83ddc9faa71 100644 --- a/packages/solana/src/index.ts +++ b/packages/solana/src/index.ts @@ -12,4 +12,4 @@ export { TokenMetadataInputSchema, NFTCollectionMetadataInputSchema, } from "./types/contracts"; -export { NFTDropContractSchema } from "./types/contracts/nft-drop"; +export { NFTDropContractInputSchema } from "./types/contracts/nft-drop"; diff --git a/packages/solana/src/types/contracts/nft-drop.ts b/packages/solana/src/types/contracts/nft-drop.ts index 1024be71fea..ee662a070ae 100644 --- a/packages/solana/src/types/contracts/nft-drop.ts +++ b/packages/solana/src/types/contracts/nft-drop.ts @@ -7,7 +7,17 @@ import { z } from "zod"; * @internal */ // TODO: Handle allow lists and end times -export const NFTDropConditionsSchema = z.object({ +export const NFTDropConditionsInputSchema = z.object({ + price: z.number().default(0), + sellerFeeBasisPoints: z.number().default(0), + itemsAvailable: z.number().default(0), + goLiveDate: z.date().optional(), + splToken: z.string().optional(), + solTreasuryAccount: z.string().optional(), + splTokenAccount: z.string().optional(), +}); + +export const NFTDropConditionsOutputSchema = z.object({ price: z .number() .default(0) @@ -35,37 +45,7 @@ export const NFTDropConditionsSchema = z.object({ .optional(), }); -export const NFTDropContractSchema = NFTCollectionMetadataInputSchema.merge( - NFTDropConditionsSchema, -); - -export type NFTDropMetadataInput = z.input; - -/** - * @internal - */ -export const NFTDropClaimSchema = NFTDropConditionsSchema.extend({ - price: z - .number() - .transform((p) => sol(p)) - .optional(), - sellerFeeBasisPoints: z.number().optional(), - itemsAvailable: z - .number() - .transform((bn) => toBigNumber(bn)) - .optional(), -}); - -/** - * @internal - */ -export const NFTDropClaimOutputSchema = z.object({ - price: z.bigint(), - sellerFeeBasisPoints: z.bigint(), - itemsAvailable: z.bigint(), - goLiveDate: z.date().optional(), -}); - -export type NFTDropClaimInput = z.input; +export const NFTDropContractInputSchema = + NFTCollectionMetadataInputSchema.merge(NFTDropConditionsInputSchema); -export type NFTDropClaimOutput = z.output; +export type NFTDropMetadataInput = z.input; From 2447882e95b87d7744ab32c85ceb8c7211e402e0 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 16 Sep 2022 12:05:06 -0700 Subject: [PATCH 4/7] add changeset --- .changeset/tiny-apes-trade.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tiny-apes-trade.md diff --git a/.changeset/tiny-apes-trade.md b/.changeset/tiny-apes-trade.md new file mode 100644 index 00000000000..0699ec1c519 --- /dev/null +++ b/.changeset/tiny-apes-trade.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/solana": patch +--- + +Optimize Drop creation flow, cleanup types From 6ab679ff76431d2637d63487a148e2cce7c9bb09 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 16 Sep 2022 12:11:31 -0700 Subject: [PATCH 5/7] add account type --- packages/solana/src/contracts/nft-collection.ts | 1 + packages/solana/src/contracts/nft-drop.ts | 1 + packages/solana/src/contracts/token.ts | 1 + 3 files changed, 3 insertions(+) diff --git a/packages/solana/src/contracts/nft-collection.ts b/packages/solana/src/contracts/nft-collection.ts index 9555404d6f6..b91e1cd3ec6 100644 --- a/packages/solana/src/contracts/nft-collection.ts +++ b/packages/solana/src/contracts/nft-collection.ts @@ -23,6 +23,7 @@ export class NFTCollection { private storage: IStorage; private nft: NFTHelper; public publicKey: PublicKey; + public accountType = "nft-collection" as const; constructor( collectionMintAddress: string, diff --git a/packages/solana/src/contracts/nft-drop.ts b/packages/solana/src/contracts/nft-drop.ts index 866aff2fd94..a9a1114e5d4 100644 --- a/packages/solana/src/contracts/nft-drop.ts +++ b/packages/solana/src/contracts/nft-drop.ts @@ -16,6 +16,7 @@ export class NFTDrop { private metaplex: Metaplex; private storage: IStorage; private nft: NFTHelper; + public accountType = "nft-drop" as const; public publicKey: PublicKey; public claimConditions: ClaimConditions; diff --git a/packages/solana/src/contracts/token.ts b/packages/solana/src/contracts/token.ts index 1de26a32777..98368044ca7 100644 --- a/packages/solana/src/contracts/token.ts +++ b/packages/solana/src/contracts/token.ts @@ -22,6 +22,7 @@ export class Token { private connection: Connection; private metaplex: Metaplex; private storage: IStorage; + public accountType = "token" as const; public publicKey: PublicKey; constructor(tokenMintAddress: string, metaplex: Metaplex, storage: IStorage) { From 47a3547f7f8703625d3315886de4cf06d1ea526d Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 16 Sep 2022 12:25:54 -0700 Subject: [PATCH 6/7] fix test --- packages/solana/src/types/contracts/nft-drop.ts | 10 +++++----- packages/solana/test/nft-drop.test.ts | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/solana/src/types/contracts/nft-drop.ts b/packages/solana/src/types/contracts/nft-drop.ts index ee662a070ae..70111fbbea9 100644 --- a/packages/solana/src/types/contracts/nft-drop.ts +++ b/packages/solana/src/types/contracts/nft-drop.ts @@ -20,13 +20,13 @@ export const NFTDropConditionsInputSchema = z.object({ export const NFTDropConditionsOutputSchema = z.object({ price: z .number() - .default(0) - .transform((p) => sol(p)), - sellerFeeBasisPoints: z.number().default(0), + .transform((p) => sol(p)) + .optional(), + sellerFeeBasisPoints: z.number().optional(), itemsAvailable: z .number() - .default(0) - .transform((bn) => toBigNumber(bn)), + .transform((bn) => toBigNumber(bn)) + .optional(), goLiveDate: z .date() .transform((d) => toDateTime(d)) diff --git a/packages/solana/test/nft-drop.test.ts b/packages/solana/test/nft-drop.test.ts index 1ccd2504cec..96642a411a8 100644 --- a/packages/solana/test/nft-drop.test.ts +++ b/packages/solana/test/nft-drop.test.ts @@ -61,13 +61,13 @@ describe("NFTDrop", async () => { it("should update claim condition", async () => { let condition = await drop.claimConditions.get(); - expect(condition.price).to.equal(0n); + expect(condition.price).to.equal(0); await drop.claimConditions.set({ price: 2, }); condition = await drop.claimConditions.get(); - expect(condition.price).to.equal(BigInt(sol(2).basisPoints.toNumber())); + expect(condition.price).to.equal(sol(2).basisPoints.toNumber()); }); }); From 34cf9fb53958cc98aa2f63282383c79a47d2964d Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 16 Sep 2022 12:37:08 -0700 Subject: [PATCH 7/7] fix build --- packages/solana/src/classes/deployer.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/solana/src/classes/deployer.ts b/packages/solana/src/classes/deployer.ts index a6dcfb1de07..9f175bc7d8a 100644 --- a/packages/solana/src/classes/deployer.ts +++ b/packages/solana/src/classes/deployer.ts @@ -9,13 +9,20 @@ import { NFTDropMetadataInput, } from "../types/contracts/nft-drop"; import { enforceCreator } from "./helpers/creators-helper"; -import { findMetadataPda, Metaplex, token } from "@metaplex-foundation/js"; +import { + findMetadataPda, + Metaplex, + sol, + toBigNumber, + token, +} from "@metaplex-foundation/js"; import { createCreateMetadataAccountV2Instruction, DataV2, } from "@metaplex-foundation/mpl-token-metadata"; import { Keypair } from "@solana/web3.js"; import { IStorage } from "@thirdweb-dev/storage"; +import BN from "bn.js"; export class Deployer { private metaplex: Metaplex; @@ -121,6 +128,9 @@ export class Deployer { .builders() .create({ ...candyMachineInfo, + price: candyMachineInfo.price || sol(0), + sellerFeeBasisPoints: candyMachineInfo.sellerFeeBasisPoints || 0, + itemsAvailable: candyMachineInfo.itemsAvailable || toBigNumber(0), candyMachine: candyMachineKeypair, collection: collectionMint.publicKey, creators: enforceCreator(