β½Eternal-Tokens
Soulbonds on Solana
// find minted nfts to send for (let k = 0; k < nftsToSend; k++) { if (nftsOwnedBySender.length === 0) { logger.debug("No more NFTs to send"); break; } const nftToSend = nftsOwnedBySender[k]; logger.debug("NFT to send:", nftToSend); const sendingMint = (nftToSend as any).mintAddress; logger.debug("Sending mint:", sendingMint.toBase58()); try { let sendingAta = await getAssociatedTokenAddress(sendingMint, sender.publicKey); logger.debug("Sending ATA:", sendingAta.toBase58()); let receivingAta = await getAssociatedTokenAddress(sendingMint, receivingOwner); logger.debug("Receiving ATA:", receivingAta.toBase58()); // generate tx to transfer NFT to ATA // create associated token account const tx = TransactionBuilder .create() .addIx([ createAssociatedTokenAccountInstruction( sender.publicKey, receivingAta, receivingOwner, sendingMint ), createTransferCheckedInstruction( sendingAta, sendingMint, receivingAta, sender.publicKey, 1, 0 ) ]) .build(); if (!skipSending) { // feed transaction into TransactionWrapper const wrapper = await TransactionWrapper .create({ connectionManager: cm, transaction: tx, signer: sender.publicKey, }) .addBlockhashAndFeePayer(sender.publicKey); // sign the transaction logger.debug(`Signing transaction ${i + 1}`); const signedTx = await wrapper.sign({ signer: sender as Signer }); // send and confirm the transaction logger.debug(`Sending transaction ${i + 1}`); const transferSig = await wrapper.sendAndConfirm({ serialisedTx: signedTx.serialize(), commitment }); logger.debug("Transaction sent:", transferSig.toString()); results.success.push({ sentTicketMint: sendingMint.toBase58(), ticketHeldMint: receivingOwner, }); await sleep(3_000); } } catch (e: any) { logger.error(e); results.failure.push({ sentTicketMint: sendingMint.toBase58(), ticketHeldMint: receivingOwner.toBase58() }); } }
Last updated