Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Batch/bulk NFT minting #526

Open
akegaviar opened this issue Jul 8, 2024 · 0 comments
Open

Batch/bulk NFT minting #526

akegaviar opened this issue Jul 8, 2024 · 0 comments

Comments

@akegaviar
Copy link
Owner

Hey TON community,

I am building TON-based game that mints some NFTs. My code mostly uses the code from this tutorial and ton/ton-core/ton-crypto libs:

My NFT deploy code:

public async deploy(
    wallet: OpenedWallet,
    collectionAddress: Address,
    params: mintParams
  ): Promise {
    const seqno = await wallet.contract.getSeqno();
    await wallet.contract.sendTransfer({
      seqno,
      secretKey: wallet.keyPair.secretKey,
      messages: [
        internal({
          value: "0.05",
          to: collectionAddress,
          body: this.createMintBody(params),
        }),
      ],
      sendMode: SendMode.IGNORE_ERRORS + SendMode.PAY_GAS_SEPARATELY,
    });
    return seqno;
  }

And after I am waiting seqno:

export async function waitSeqno(seqno: number, wallet: OpenedWallet): Promise {
  for (let attempt = 0; attempt < 20; attempt++) {
    await sleep(2000);
    const seqnoAfter = await wallet.contract.getSeqno();
    if (seqnoAfter == seqno + 1) {
      return Promise.resolve(seqno)
    }
  }
  return Promise.reject(`Seqno ${seqno} timeout`)
}

export function sleep(ms: number): Promise {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

Then I get the confirmation with seqno I request NFT item address by NFT index:

static async getAddressByIndex(
    collectionAddress: Address,
    itemIndex: number,
    tonCenterApiKey: string
  ): Promise {
    const client = new TonClient({
      endpoint: "https://toncenter.com/api/v2/jsonRPC",
      apiKey: tonCenterApiKey,
    });
    const response = await client.runMethod(
      collectionAddress,
      "get_nft_address_by_index",
      [{ type: "int", value: BigInt(itemIndex) }]
    );
    return response.stack.readAddress();
  }

The whole process takes up to 30 seconds per 1 NFT. I am curiose is there a better option to mint for example 10 NFTs, or the best way is to mint one by one and wait it's confirmation? In that case I have some worries about number of NFTs I can achive within 1 hours. Right now I have to mint all items in sequence because minting command requires nft INDEX parameter and before minting next item I have to get the confirmation that the previous one is minted properly.

Answer

No answer found


Original

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant