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
| Account | Signer | Writable | Owner |
|---|---|---|---|
| Admin | ✓ | ✓ | system |
| 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 */,
});