Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

A pool is initialized

Source: crates/amm-frood-test/tests/initialize.rs L77

  • Given: an admin with two SPL mints
  • When: initialize is called with seed=0, fee_bps=30

Result: ✓ success — 84918 CU

sequenceDiagram
    participant p0 as Admin
    participant p1 as Amm
    participant p2 as system
    participant p3 as token
    participant p4 as splAssociatedTokenAccount
    p0->>p1: Initialize
    activate p1
    p1->>p2: createAccount
    activate p2
    p2-->>p1: ✓
    deactivate p2
    p1->>p3: initializeMint2
    activate p3
    p3-->>p1: ✓ 201cu
    deactivate p3
    p1->>p4: create
    activate p4
    p4->>p3: getAccountDataSize
    activate p3
    p3-->>p4: ✓ 183cu
    deactivate p3
    p4->>p2: createAccount
    activate p2
    p2-->>p4: ✓
    deactivate p2
    p4->>p3: initializeImmutableOwner
    activate p3
    p3-->>p4: ✓ 38cu
    deactivate p3
    p4->>p3: initializeAccount3
    activate p3
    p3-->>p4: ✓ 235cu
    deactivate p3
    p4-->>p1: ✓ 13517cu
    deactivate p4
    p1->>p4: create
    activate p4
    p4->>p3: getAccountDataSize
    activate p3
    p3-->>p4: ✓ 183cu
    deactivate p3
    p4->>p2: createAccount
    activate p2
    p2-->>p4: ✓
    deactivate p2
    p4->>p3: initializeImmutableOwner
    activate p3
    p3-->>p4: ✓ 38cu
    deactivate p3
    p4->>p3: initializeAccount3
    activate p3
    p3-->>p4: ✓ 235cu
    deactivate p3
    p4-->>p1: ✓ 15017cu
    deactivate p4
    p1->>p4: create
    activate p4
    p4->>p3: getAccountDataSize
    activate p3
    p3-->>p4: ✓ 183cu
    deactivate p3
    p4->>p2: createAccount
    activate p2
    p2-->>p4: ✓
    deactivate p2
    p4->>p3: initializeImmutableOwner
    activate p3
    p3-->>p4: ✓ 38cu
    deactivate p3
    p4->>p3: initializeAccount3
    activate p3
    p3-->>p4: ✓ 235cu
    deactivate p3
    p4-->>p1: ✓ 16517cu
    deactivate p4
    p1->>p2: createAccount
    activate p2
    p2-->>p1: ✓
    deactivate p2
    p1-->>p0: ✓ 84918cu
    deactivate p1

Authority

flowchart LR
    Amm["Amm"]:::program
    Admin(["Admin"]):::signer
    MintLP(["MintLP"]):::signer
    vaultXPoolConfigMint(["vaultX(Pool/Config, Mint)"]):::signer
    vaultYPoolConfigMint2(["vaultY(Pool/Config, Mint 2)"]):::signer
    lpVaultPoolConfigMintLP(["lpVault(Pool/Config, MintLP)"]):::signer
    PoolConfig(["Pool/Config"]):::signer
    system["system"]:::program
    token["token"]:::program
    splAssociatedTokenAccount["splAssociatedTokenAccount"]:::program
    Admin -->|signs| Amm
    Amm -->|writes| MintLP
    Amm -->|writes| vaultXPoolConfigMint
    Amm -->|writes| vaultYPoolConfigMint2
    Amm -->|writes| lpVaultPoolConfigMintLP
    Amm -->|writes| PoolConfig
    Admin -->|signs| system
    MintLP -->|signs| system
    token -->|writes| MintLP
    Admin -->|signs| splAssociatedTokenAccount
    splAssociatedTokenAccount -->|writes| vaultXPoolConfigMint
    vaultXPoolConfigMint -->|signs| system
    token -->|writes| vaultXPoolConfigMint
    splAssociatedTokenAccount -->|writes| vaultYPoolConfigMint2
    vaultYPoolConfigMint2 -->|signs| system
    token -->|writes| vaultYPoolConfigMint2
    splAssociatedTokenAccount -->|writes| lpVaultPoolConfigMintLP
    lpVaultPoolConfigMintLP -->|signs| system
    token -->|writes| lpVaultPoolConfigMintLP
    PoolConfig -->|signs| system
    classDef program fill:#dae8fc,stroke:#6c8ebf;
    classDef signer fill:#d5e8d4,stroke:#82b366;
    classDef state fill:#ffe6cc,stroke:#d79b00;

Ownership

flowchart LR
    system["system"]:::program
    Admin[("Admin")]:::state
    token["token"]:::program
    MintLP[("MintLP")]:::state
    vaultXPoolConfigMint[("vaultX(Pool/Config, Mint)")]:::state
    vaultYPoolConfigMint2[("vaultY(Pool/Config, Mint 2)")]:::state
    lpVaultPoolConfigMintLP[("lpVault(Pool/Config, MintLP)")]:::state
    Amm["Amm"]:::program
    PoolConfig[("Pool/Config")]:::state
    system -->|owns| Admin
    token -->|owns| MintLP
    token -->|owns| vaultXPoolConfigMint
    token -->|owns| vaultYPoolConfigMint2
    token -->|owns| lpVaultPoolConfigMintLP
    Amm -->|owns| PoolConfig
    classDef program fill:#dae8fc,stroke:#6c8ebf;
    classDef signer fill:#d5e8d4,stroke:#82b366;
    classDef state fill:#ffe6cc,stroke:#d79b00;

Accounts

AccountSignerWritableOwner
Adminsystem
Mint··token
Mint 2··token
MintLP·token
vaultX(Pool/Config, Mint)·token
vaultY(Pool/Config, Mint 2)·token
lpVault(Pool/Config, MintLP)·token
Pool/Config·Amm
token··BPFL…
splAssociatedTokenAccount··BPFL…
system··Nati…
Call tree and logs
A pool is initialized
Admin (84918cu)
└─ Amm::Initialize ✓ 84918cu
   ├─ system::createAccount ✓
   ├─ token::initializeMint2 ✓ 201cu
   ├─ splAssociatedTokenAccount::create ✓ 13517cu
   │  ├─ token::getAccountDataSize ✓ 183cu
   │  ├─ system::createAccount ✓
   │  ├─ token::initializeImmutableOwner ✓ 38cu
   │  └─ token::initializeAccount3 ✓ 235cu
   ├─ splAssociatedTokenAccount::create ✓ 15017cu
   │  ├─ token::getAccountDataSize ✓ 183cu
   │  ├─ system::createAccount ✓
   │  ├─ token::initializeImmutableOwner ✓ 38cu
   │  └─ token::initializeAccount3 ✓ 235cu
   ├─ splAssociatedTokenAccount::create ✓ 16517cu
   │  ├─ token::getAccountDataSize ✓ 183cu
   │  ├─ system::createAccount ✓
   │  ├─ token::initializeImmutableOwner ✓ 38cu
   │  └─ token::initializeAccount3 ✓ 235cu
   └─ system::createAccount ✓
Program 5aDxxnPDGeVEuLXerisV4GF5f8tcwTjbMK7Bn1dYUXSi invoke [1]
Program log: Instruction: Initialize
Program 11111111111111111111111111111111 invoke [2]
Program 11111111111111111111111111111111 success
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 201 of 185657 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [2]
Program log: Create
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 183 of 175582 compute units
Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program 11111111111111111111111111111111 invoke [3]
Program 11111111111111111111111111111111 success
Program log: Initialize the associated token account
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 38 of 170489 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 235 of 168025 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 13517 of 181003 compute units
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [2]
Program log: Create
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 183 of 154448 compute units
Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program 11111111111111111111111111111111 invoke [3]
Program 11111111111111111111111111111111 success
Program log: Initialize the associated token account
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 38 of 149355 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 235 of 146891 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 15017 of 161369 compute units
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [2]
Program log: Create
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 183 of 130315 compute units
Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program 11111111111111111111111111111111 invoke [3]
Program 11111111111111111111111111111111 success
Program log: Initialize the associated token account
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 38 of 125222 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [3]
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 235 of 122758 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 16517 of 138736 compute units
Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success
Program 11111111111111111111111111111111 invoke [2]
Program 11111111111111111111111111111111 success
Program 5aDxxnPDGeVEuLXerisV4GF5f8tcwTjbMK7Bn1dYUXSi consumed 84918 of 200000 compute units
Program 5aDxxnPDGeVEuLXerisV4GF5f8tcwTjbMK7Bn1dYUXSi success

Integration

What an integrator writes: the derivations and the instruction, byte-identical to the transaction this page witnessed. Addresses are this scenario’s; supply your own.

#![allow(unused)]
fn main() {
use solana_instruction::{AccountMeta, Instruction};
use solana_pubkey::{pubkey, Pubkey};

// --- initialize ---
let program_id: Pubkey = pubkey!("5aDxxnPDGeVEuLXerisV4GF5f8tcwTjbMK7Bn1dYUXSi");
let initializer: Pubkey = pubkey!("DshwoGUvqCMdFBQFeztvkygtu1arr4NjojM4EEJFmRN7"); // Admin: this scenario's value; supply your own
let mint_x: Pubkey = pubkey!("14s1WJtcVpTaZu3msFwBCqiXN4vXsnUmgPbYQmVihg9k"); // Mint: this scenario's value; supply your own
let mint_y: Pubkey = pubkey!("3u6JCVjEDMjoVNS91QDBDpzAsZzffy1e3vaJm6rg7baa"); // Mint 2: this scenario's value; supply your own
let token_program: Pubkey = pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); // the token program
let associated_token_program: Pubkey = pubkey!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); // the splAssociatedTokenAccount program
let system_program: Pubkey = pubkey!("11111111111111111111111111111111"); // the system program
let config = Pubkey::find_program_address(&[b"config", &0u64.to_le_bytes()], &program_id).0;
let mint_lp = Pubkey::find_program_address(&[b"lp", config.as_ref()], &program_id).0;
let vault_x: Pubkey = pubkey!("Huqnh3ixPRjEVaMhA4vJKzsS2fL5DS8cPz2dQrKEbAtJ"); // derivation elided (a seed's encoding is beyond this snippet); address from the run
let vault_y: Pubkey = pubkey!("BYCoofMdGc5jQL9TzNbVaWHCp4n2TWBip1dkrw2LWHys"); // derivation elided (a seed's encoding is beyond this snippet); address from the run
let lp_vault: Pubkey = pubkey!("2z79VArZvbErd7GmPasiLyTxnFJcbNZNEnWGVzojik7t"); // derivation elided (a seed's encoding is beyond this snippet); address from the run
let ix = Instruction {
    program_id,
    accounts: vec![
        AccountMeta::new(initializer, true), // initializer
        AccountMeta::new_readonly(mint_x, false), // mintX
        AccountMeta::new_readonly(mint_y, false), // mintY
        AccountMeta::new(mint_lp, false), // mintLp
        AccountMeta::new(vault_x, false), // vaultX
        AccountMeta::new(vault_y, false), // vaultY
        AccountMeta::new(lp_vault, false), // lpVault
        AccountMeta::new(config, false), // config
        AccountMeta::new_readonly(token_program, false), // tokenProgram
        AccountMeta::new_readonly(associated_token_program, false), // associatedTokenProgram
        AccountMeta::new_readonly(system_program, false), // systemProgram
    ],
    // discriminator ++ borsh(seed: 0, feeBps: 30, authority: …)
    data: vec![0xaf, 0xaf, 0x6d, 0x1f, 0x0d, 0x98, 0x9b, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x01, 0xbf, 0x49, 0x94, 0x7a, 0x2f, 0x68, 0xb3, 0x90, 0xbd, 0x75, 0xa5, 0x28, 0xc0, 0xf6, 0xce, 0x7f, 0xde, 0x25, 0xba, 0x0d, 0xf3, 0x91, 0x6c, 0xca, 0x77, 0xfb, 0x53, 0x8d, 0x96, 0x03, 0x62, 0x48],
};
}

The same call through the Codama-generated TypeScript client (the async builder derives every PDA the resolver derived here, so only the free inputs appear):

import { address } from "@solana/kit";
import { getInitializeInstructionAsync } from "your-generated-client";

const ix = await getInitializeInstructionAsync({
  initializer: initializerSigner, // Admin (a TransactionSigner)
  mintX: address("14s1WJtcVpTaZu3msFwBCqiXN4vXsnUmgPbYQmVihg9k"), // Mint
  mintY: address("3u6JCVjEDMjoVNS91QDBDpzAsZzffy1e3vaJm6rg7baa"), // Mint 2
  // tokenProgram defaults to the token program
  // associatedTokenProgram defaults to the splAssociatedTokenAccount program
  // systemProgram defaults to the system program
  seed: 0n,
  feeBps: 30,
  authority: address("DshwoGUvqCMdFBQFeztvkygtu1arr4NjojM4EEJFmRN7") /* Admin */,
});