feat: update save process

This commit is contained in:
bartosz-lipinski 2021-04-09 22:35:14 -05:00
parent 6bc32a4c6e
commit 026600d21f
2 changed files with 77 additions and 47 deletions

View File

@ -113,6 +113,11 @@ class UpdateMetadataArgs {
}
}
class TransferMetadataArgs {
instruction: number = 2;
constructor() {}
}
export const SCHEMA = new Map<any, any>([
[
CreateMetadataArgs,
@ -138,6 +143,13 @@ export const SCHEMA = new Map<any, any>([
],
},
],
[
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];
}

View File

@ -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: <a href={arweaveLink} target="_blank" >Arweave Link</a>,