import * as anchor from "@project-serum/anchor"; import { getAssociatedTokenAddress } from "@solana/spl-token"; import { TOKEN_METADATA_PROGRAM_ID, STRIKR_COLLECTION_MINT, STRIKR_TREASURY, } from "../constants"; import { getStrikr } from "../utils"; import { requestComputeUnits } from "../actions/request-compute-units"; /** * Fill the put option request as a seller. * @param provider Anchor provider * @param assetNftMint Asset NFT which underlies the option * @returns Promise resolving to the transaction signature */ export const fillPutOption = async ( provider: anchor.AnchorProvider, assetNftMint: anchor.web3.PublicKey ) => { const strikr = getStrikr(provider); const transaction = new anchor.web3.Transaction(); // Request additional compute units and attach the instruction const computeUnitsIx = requestComputeUnits(provider, 400_000, 0); transaction.add(computeUnitsIx); const sellerPositionNftMintKeypair = new anchor.web3.Keypair(); const sellerPositionNftMint = sellerPositionNftMintKeypair.publicKey; // Signer's position NFT ATA let sellerPositionNftTokenAccount = await getAssociatedTokenAddress( sellerPositionNftMint, provider.wallet.publicKey, true ); transaction.add( await strikr.methods .fillPutOption() .accounts({ signer: provider.wallet.publicKey, assetNftMint, sellerPositionNftMint, sellerPositionNftTokenAccount, strikrCollectionMint: STRIKR_COLLECTION_MINT, strikrTreasury: STRIKR_TREASURY, tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, }) .instruction() ); return await provider.sendAndConfirm(transaction, [ sellerPositionNftMintKeypair, ]); };