diff --git a/packages/common/src/actions/metadata.ts b/packages/common/src/actions/metadata.ts index 04c24da..7ea46b8 100644 --- a/packages/common/src/actions/metadata.ts +++ b/packages/common/src/actions/metadata.ts @@ -113,6 +113,11 @@ class UpdateMetadataArgs { } } +class TransferMetadataArgs { + instruction: number = 2; + constructor() {} +} + export const SCHEMA = new Map([ [ CreateMetadataArgs, @@ -138,6 +143,13 @@ export const SCHEMA = new Map([ ], }, ], + [ + TransferMetadataArgs, + { + kind: 'struct', + fields: [['instruction', 'u8']], + }, + ], [ Metadata, { @@ -176,20 +188,26 @@ export async function transferMetadata( newUpdateAuthority: PublicKey, instructions: TransactionInstruction[], signers: Account[], + metadataAccount?: PublicKey, + metadataOwnerAccount?: PublicKey, ) { const metadataProgramId = programIds().metadata; - const metadataOwnerAccount = ( - await PublicKey.findProgramAddress( - [ - Buffer.from('metadata'), - metadataProgramId.toBuffer(), - Buffer.from(name), - Buffer.from(symbol), - ], - metadataProgramId, - ) - )[0]; + metadataOwnerAccount = + metadataOwnerAccount || + ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + metadataProgramId.toBuffer(), + Buffer.from(name), + Buffer.from(symbol), + ], + metadataProgramId, + ) + )[0]; + + const data = Buffer.from(serialize(SCHEMA, new TransferMetadataArgs())); const keys = [ { @@ -212,9 +230,11 @@ export async function transferMetadata( new TransactionInstruction({ keys, programId: metadataProgramId, - data: Buffer.from([]), + data: data, }), ); + + return [metadataAccount, metadataOwnerAccount]; } export async function updateMetadata( @@ -225,31 +245,37 @@ export async function updateMetadata( updateAuthority: PublicKey, instructions: TransactionInstruction[], signers: Account[], + metadataAccount?: PublicKey, + metadataOwnerAccount?: PublicKey, ) { const metadataProgramId = programIds().metadata; - const metadataAccount = ( - await PublicKey.findProgramAddress( - [ - Buffer.from('metadata'), - metadataProgramId.toBuffer(), - mintKey.toBuffer(), - ], - metadataProgramId, - ) - )[0]; + metadataAccount = + metadataAccount || + ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + metadataProgramId.toBuffer(), + mintKey.toBuffer(), + ], + metadataProgramId, + ) + )[0]; - const metadataOwnerAccount = ( - await PublicKey.findProgramAddress( - [ - Buffer.from('metadata'), - metadataProgramId.toBuffer(), - Buffer.from(name), - Buffer.from(symbol), - ], - metadataProgramId, - ) - )[0]; + metadataOwnerAccount = + metadataOwnerAccount || + ( + await PublicKey.findProgramAddress( + [ + Buffer.from('metadata'), + metadataProgramId.toBuffer(), + Buffer.from(name), + Buffer.from(symbol), + ], + metadataProgramId, + ) + )[0]; const value = new UpdateMetadataArgs({ uri }); const data = Buffer.from(serialize(SCHEMA, value)); @@ -278,6 +304,8 @@ export async function updateMetadata( data, }), ); + + return [metadataAccount, metadataOwnerAccount]; } export async function createMetadata( @@ -369,4 +397,6 @@ export async function createMetadata( data, }), ); + + return [metadataAccount, metadataOwnerAccount]; } diff --git a/packages/metavinci/src/models/nft.tsx b/packages/metavinci/src/models/nft.tsx index 4ac1eac..bef9ba5 100644 --- a/packages/metavinci/src/models/nft.tsx +++ b/packages/metavinci/src/models/nft.tsx @@ -106,13 +106,10 @@ export const mintNFT = async ( ), ); - const block = await connection.getRecentBlockhash('singleGossip'); - const rentExempt = await connection.getMinimumBalanceForRentExemption(1000); - - await createMetadata( + const [metadataAccount, metadataOwnerAccount] = await createMetadata( metadata.symbol, metadata.name, - `https://arweave.net/rfX69WKd7Bin_RTbcnH4wM3BuWWsR_ZhWSSqZBLYdMY`, + `https://-------.---/rfX69WKd7Bin_RTbcnH4wM3BuWWsR_ZhWSSqZBLYdMY`, false, payer.publicKey, mintKey, @@ -122,11 +119,12 @@ export const mintNFT = async ( signers, ); + const block = await connection.getRecentBlockhash('singleGossip'); instructions.push( SystemProgram.transfer({ fromPubkey: wallet.publicKey, toPubkey: payer.publicKey, - lamports: block.feeCalculator.lamportsPerSignature * 3, + lamports: block.feeCalculator.lamportsPerSignature * 2, })); const response = await sendTransaction( @@ -135,7 +133,7 @@ export const mintNFT = async ( instructions, signers, true, - 'max', + 'single', false, block); @@ -172,9 +170,10 @@ export const mintNFT = async ( const metadataFile = result.messages?.find( m => m.filename == RESERVED_TXN_MANIFEST, ); - if (metadataFile?.transactionId && wallet.publicKey) { + if (metadataFile?.transactionId && wallet.publicKey) + { const updateInstructions: TransactionInstruction[] = []; - const updateSigners: Account[] = [payer, owner]; + const updateSigners: Account[] = [payer]; // TODO: connect to testnet arweave const arweaveLink = `https://arweave.net/${metadataFile.transactionId}`; @@ -186,6 +185,8 @@ export const mintNFT = async ( payer.publicKey, updateInstructions, updateSigners, + metadataAccount, + metadataOwnerAccount, ); await transferMetadata( @@ -194,9 +195,10 @@ export const mintNFT = async ( payer.publicKey, wallet.publicKey, updateInstructions, - updateSigners); - - debugger; + updateSigners, + metadataAccount, + metadataOwnerAccount, + ); const txid = await sendTransaction( connection, @@ -208,8 +210,6 @@ export const mintNFT = async ( true ); - console.log("transaction id: ", txid); - notify({ message: 'Art created on Solana', description: Arweave Link,