Crates.io | token-metadata-descriptor |
lib.rs | token-metadata-descriptor |
version | 0.0.1 |
source | src |
created_at | 2023-01-20 13:49:09.450676 |
updated_at | 2023-01-20 13:49:09.450676 |
description | On-chain token metadata extension |
homepage | |
repository | |
max_upload_size | |
id | 763389 |
size | 35,779 |
🚧 This is an experimental contract and has not been formally audited. Please use/modify at your own risk.
Please see this document for more info: https://broken-bellflower-f99.notion.site/Token-Metadata-Descriptor-6227a069bd1049e78fddc3ce1cbf36f1
Reading the tests in /sdk/test
can also provide insight into how the program instructions work.
// imports
use token_metadata_descriptor::{
cpi::accounts::InitializeWithData,
state::Encoding,
};
// context
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(mut)]
pub payer: Signer<'info>,
// assumption: authority is an end-user here, but could be a pda
pub update_authority: Signer<'info>,
#[account(mut)]
pub descriptor: AccountInfo<'info>,
// assumption: nft already exists
pub mint: Account<'info, Mint>,
pub metadata: AccountInfo<'info>,
#[account(address = mpl_token_metadata::id())]
pub token_metadata_program: UncheckedAccount<'info>,
#[account(address = token_metadata_descriptor::id())]
pub token_metadata_descriptor: UncheckedAccount<'info>,
pub system_program: Program<'info, System>,
}
...
other code
...
// logic using `Initialize` in context
let cpi_program = ctx.accounts.token_metadata_descriptor.to_account_info();
let cpi_accounts = InitializeWithData {
payer: ctx.accounts.payer.to_account_info(),
mint: ctx.accounts.mint.to_account_info(),
token_metadata: ctx.accounts.metadata.to_account_info(),
authority: ctx.accounts.update_authority.to_account_info(),
descriptor: ctx.accounts.descriptor.to_account_info(),
token_metadata_program: ctx.accounts.token_metadata_program.to_account_info(),
system_program: ctx.accounts.system_program.to_account_info(),
};
let data = "hello world".try_to_vec().unwrap();
token_metadata_descriptor::cpi::initialize_with_data(
CpiContext::new(cpi_program, cpi_accounts)
Encoding::Utf8,
bump,
data
)?;
// imports
use token_metadata_descriptor::{
cpi::accounts::InitializeWithBuffer,
state::Encoding,
};
// context
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(mut)]
pub payer: Signer<'info>,
// assumption: authority is an end-user here, but could be a pda
pub update_authority: Signer<'info>,
#[account(mut)]
pub descriptor: AccountInfo<'info>,
#[account(mut)]
pub buffer: AccountInfo<'info>,
// assumption: nft already exists
pub mint: Account<'info, Mint>,
pub metadata: AccountInfo<'info>,
#[account(address = mpl_token_metadata::id())]
pub token_metadata_program: UncheckedAccount<'info>,
#[account(address = token_metadata_descriptor::id())]
pub token_metadata_descriptor: UncheckedAccount<'info>,
pub system_program: Program<'info, System>,
}
...
other code, like initialize and fill buffer
...
// logic using `Initialize` in context
let cpi_program = ctx.accounts.token_metadata_descriptor.to_account_info();
let cpi_accounts = InitializeWithBuffer {
payer: ctx.accounts.payer.to_account_info(),
mint: ctx.accounts.mint.to_account_info(),
token_metadata: ctx.accounts.metadata.to_account_info(),
authority: ctx.accounts.update_authority.to_account_info(),
descriptor: ctx.accounts.descriptor.to_account_info(),
buffer: ctx.accounts.buffer.to_account_info(),
token_metadata_program: ctx.accounts.token_metadata_program.to_account_info(),
system_program: ctx.accounts.system_program.to_account_info(),
};
token_metadata_descriptor::cpi::initialize_with_buffer(
CpiContext::new(cpi_program, cpi_accounts)
None, // copy entire buffer
Encoding::Base64,
desc_bump,
)?;