mirror of https://github.com/certusone/oyster.git
feat: update save process
This commit is contained in:
parent
6bc32a4c6e
commit
026600d21f
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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>,
|
||||
|
|
Loading…
Reference in New Issue