Copy with Context Test
Copy with Context Feature Test
This page demonstrates the new "Copy with Context" feature that allows users to copy either just the code snippet or the full runnable code with imports and setup.
How It Works
Look for the copy controls in the top-right of each code block:
- Snippet - Copies just the main code (the part you see)
- With imports - Copies full runnable code including:
- Import statements
- Setup/initialization code
- Main code
- Output/logging code
Try both modes and paste the result to see the difference!
Example 1: Create an Asset
1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4
5// Initialize UMI
6const umi = createUmi('https://api.devnet.solana.com')
7 .use(mplCore())
8
9// Create a new NFT asset
10const asset = await create(umi, {
11 name: 'My NFT',
12 uri: 'https://example.com/metadata.json'
13}).sendAndConfirm(umi)
14
15console.log('Asset created:', asset.publicKey)
1use mpl_core::instructions::CreateV1;
2use solana_sdk::signer::Signer;
3
4// Create a new NFT asset
5let create_ix = CreateV1 {
6 name: "My NFT".to_string(),
7 uri: "https://example.com/metadata.json".to_string(),
8 ..Default::default()
9};
10
11let instruction = create_ix.instruction();
12
13println!("Asset instruction created");
1use anchor_lang::prelude::*;
2
3declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
4
5#[program]
6pub mod create_asset {
7 use super::*;
8
9 // Create a new NFT asset
10 pub fn create(
11 ctx: Context<CreateAsset>,
12 name: String,
13 uri: String
14 ) -> Result<()> {
15 let asset = &mut ctx.accounts.asset;
16 asset.name = name;
17 asset.uri = uri;
18 asset.owner = ctx.accounts.owner.key();
19
20 msg!("Asset created: {}", asset.key());
21 Ok(())
22 }
23}
24
25#[derive(Accounts)]
26pub struct CreateAsset<'info> {
27 #[account(init, payer = owner, space = 8 + 200)]
28 pub asset: Account<'info, Asset>,
29 #[account(mut)]
30 pub owner: Signer<'info>,
31 pub system_program: Program<'info, System>,
32}
33
34#[account]
35pub struct Asset {
36 pub name: String,
37 pub uri: String,
38 pub owner: Pubkey,
39}
What you get when copying:
Snippet mode (just the main code):
// Create a new NFT asset
const asset = await create(umi, {
name: 'My NFT',
uri: 'https://example.com/metadata.json'
}).sendAndConfirm(umi)
With imports mode (full runnable code):
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
import { create } from '@metaplex-foundation/mpl-core'
import { mplCore } from '@metaplex-foundation/mpl-core'
// Initialize UMI
const umi = createUmi('https://api.devnet.solana.com')
.use(mplCore())
// Create a new NFT asset
const asset = await create(umi, {
name: 'My NFT',
uri: 'https://example.com/metadata.json'
}).sendAndConfirm(umi)
console.log('Asset created:', asset.publicKey)
Example 2: Transfer an Asset
1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { transfer } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4import { publicKey } from '@metaplex-foundation/umi'
5
6// Initialize UMI
7const umi = createUmi('https://api.devnet.solana.com')
8 .use(mplCore())
9
10// Transfer an existing NFT asset to a new owner
11const result = await transfer(umi, {
12 asset: publicKey('AssetAddressHere...'),
13 newOwner: publicKey('RecipientAddressHere...'),
14}).sendAndConfirm(umi)
15
16console.log('Asset transferred:', result.signature)
1use mpl_core::instructions::TransferV1;
2use solana_sdk::{pubkey::Pubkey, signer::Signer};
3
4// Asset and recipient addresses
5let asset = Pubkey::from_str("AssetAddressHere...").unwrap();
6let new_owner = Pubkey::from_str("RecipientAddressHere...").unwrap();
7
8// Transfer an existing NFT asset to a new owner
9let transfer_ix = TransferV1 {
10 asset,
11 new_owner,
12 ..Default::default()
13};
14
15let instruction = transfer_ix.instruction();
16
17println!("Transfer instruction created");
1use anchor_lang::prelude::*;
2
3declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
4
5#[program]
6pub mod transfer_asset {
7 use super::*;
8
9 // Transfer an existing NFT asset to a new owner
10 pub fn transfer(
11 ctx: Context<TransferAsset>
12 ) -> Result<()> {
13 let asset = &mut ctx.accounts.asset;
14
15 // Verify current owner
16 require!(
17 asset.owner == ctx.accounts.current_owner.key(),
18 ErrorCode::Unauthorized
19 );
20
21 // Transfer ownership
22 asset.owner = ctx.accounts.new_owner.key();
23
24 msg!("Asset transferred to: {}", asset.owner);
25 Ok(())
26 }
27}
28
29#[derive(Accounts)]
30pub struct TransferAsset<'info> {
31 #[account(mut)]
32 pub asset: Account<'info, Asset>,
33 pub current_owner: Signer<'info>,
34 /// CHECK: New owner can be any account
35 pub new_owner: AccountInfo<'info>,
36}
37
38#[account]
39pub struct Asset {
40 pub name: String,
41 pub uri: String,
42 pub owner: Pubkey,
43}
44
45#[error_code]
46pub enum ErrorCode {
47 #[msg("Unauthorized: You are not the owner of this asset")]
48 Unauthorized,
49}
Only JavaScript Frameworks
1import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
2import { create } from '@metaplex-foundation/mpl-core'
3import { mplCore } from '@metaplex-foundation/mpl-core'
4
5// Initialize UMI
6const umi = createUmi('https://api.devnet.solana.com')
7 .use(mplCore())
8
9// Create a new NFT asset
10const asset = await create(umi, {
11 name: 'My NFT',
12 uri: 'https://example.com/metadata.json'
13}).sendAndConfirm(umi)
14
15console.log('Asset created:', asset.publicKey)
Only Rust Frameworks
1use mpl_core::instructions::TransferV1;
2use solana_sdk::{pubkey::Pubkey, signer::Signer};
3
4// Asset and recipient addresses
5let asset = Pubkey::from_str("AssetAddressHere...").unwrap();
6let new_owner = Pubkey::from_str("RecipientAddressHere...").unwrap();
7
8// Transfer an existing NFT asset to a new owner
9let transfer_ix = TransferV1 {
10 asset,
11 new_owner,
12 ..Default::default()
13};
14
15let instruction = transfer_ix.instruction();
16
17println!("Transfer instruction created");
1use anchor_lang::prelude::*;
2
3declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
4
5#[program]
6pub mod transfer_asset {
7 use super::*;
8
9 // Transfer an existing NFT asset to a new owner
10 pub fn transfer(
11 ctx: Context<TransferAsset>
12 ) -> Result<()> {
13 let asset = &mut ctx.accounts.asset;
14
15 // Verify current owner
16 require!(
17 asset.owner == ctx.accounts.current_owner.key(),
18 ErrorCode::Unauthorized
19 );
20
21 // Transfer ownership
22 asset.owner = ctx.accounts.new_owner.key();
23
24 msg!("Asset transferred to: {}", asset.owner);
25 Ok(())
26 }
27}
28
29#[derive(Accounts)]
30pub struct TransferAsset<'info> {
31 #[account(mut)]
32 pub asset: Account<'info, Asset>,
33 pub current_owner: Signer<'info>,
34 /// CHECK: New owner can be any account
35 pub new_owner: AccountInfo<'info>,
36}
37
38#[account]
39pub struct Asset {
40 pub name: String,
41 pub uri: String,
42 pub owner: Pubkey,
43}
44
45#[error_code]
46pub enum ErrorCode {
47 #[msg("Unauthorized: You are not the owner of this asset")]
48 Unauthorized,
49}
Benefits
✅ Beginner-friendly - Full context makes copy-paste work immediately ✅ Flexible - Advanced users can still copy just the snippet ✅ Time-saving - No need to hunt for imports and setup ✅ Learning aid - Seeing full context helps understanding
User Story
Before: Copy code snippet → Paste → Error: umi is not defined → Hunt through docs for imports → Hunt for setup → Finally works
After: Toggle "With imports" → Copy → Paste → Works immediately! ✨
