add pinocchio create-token example#599
Conversation
6e08f7a to
e995793
Compare
Greptile SummaryThis PR adds a complete Pinocchio implementation of the
Confidence Score: 5/5The change is safe to merge; it adds a self-contained new example directory and two minor root-level edits. The V3 CPI is correctly constructed with the right account layout and wire format. The Borsh parser handles all bounds-check failures safely. Both test paths are exercised against the mainnet-dumped Metaplex fixture. No files require special attention. Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant Client as Test Client
participant Prog as Pinocchio Program
participant Sys as System Program
participant Tok as Token Program
participant Mpl as Metaplex Metadata
Client->>Prog: CreateToken(name, symbol, uri, decimals)
Note over Prog: parse Borsh args (CreateTokenArgs)
Prog->>Sys: CreateAccount(payer to mint, 82 bytes, rent-exempt)
Sys-->>Prog: ok
Prog->>Tok: InitializeMint2(decimals, mint_authority, freeze_authority)
Tok-->>Prog: ok
Note over Prog: build_metadata_data() builds discriminator + DataV2 + is_mutable + collection_details
Prog->>Mpl: CreateMetadataAccountV3(metadata, mint, mint_authority, payer, update_authority, system_program)
Mpl-->>Prog: ok
Prog-->>Client: Ok(())
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant Client as Test Client
participant Prog as Pinocchio Program
participant Sys as System Program
participant Tok as Token Program
participant Mpl as Metaplex Metadata
Client->>Prog: CreateToken(name, symbol, uri, decimals)
Note over Prog: parse Borsh args (CreateTokenArgs)
Prog->>Sys: CreateAccount(payer to mint, 82 bytes, rent-exempt)
Sys-->>Prog: ok
Prog->>Tok: InitializeMint2(decimals, mint_authority, freeze_authority)
Tok-->>Prog: ok
Note over Prog: build_metadata_data() builds discriminator + DataV2 + is_mutable + collection_details
Prog->>Mpl: CreateMetadataAccountV3(metadata, mint, mint_authority, payer, update_authority, system_program)
Mpl-->>Prog: ok
Prog-->>Client: Ok(())
Reviews (2): Last reviewed commit: "add pinocchio create-token example" | Re-trigger Greptile |
e995793 to
ac589b7
Compare
|
@Perelyn-sama @dev-jodee — rebased onto latest main (picks up the ASM sbpf/Solana pin from #625), CI is now fully green. Ready for review whenever you have a chance 🙏 |
dev-jodee
left a comment
There was a problem hiding this comment.
thanks for the work, couple of comments !
| try { | ||
| mkdirSync(outputDir, { recursive: true }); | ||
| // Point the Solana CLI at mainnet, where the canonical program lives. | ||
| execSync("solana config set -um", { stdio: "inherit" }); |
There was a problem hiding this comment.
don't think we should change the config of the user's cli, program dump can take the url as a parameter, better do it then
|
|
||
| /// Reads a Borsh `string` (a 4-byte little-endian length prefix followed by that | ||
| /// many UTF-8 bytes) starting at `*offset`, advancing `offset` past it. | ||
| fn read_borsh_string<'a>(data: &'a [u8], offset: &mut usize) -> Result<&'a [u8], ProgramError> { |
There was a problem hiding this comment.
this shoudl probably be in a util file instead of the mod.rs, would be cleaner
| } | ||
|
|
||
| impl<'a> CreateTokenArgs<'a> { | ||
| /// Parses the instruction data: three Borsh strings followed by a `u8`. |
There was a problem hiding this comment.
think this should be in create_token.rs file as well since its related to that specific ix
| pub use create_token::*; | ||
|
|
||
| /// Size (in bytes) of an SPL Token mint account. | ||
| pub const MINT_SIZE: usize = 82; |
There was a problem hiding this comment.
Does pinocchio have that as a const already? might be able to reuse
| )[0]; | ||
| } | ||
|
|
||
| describe("Create Token (Pinocchio)", async () => { |
There was a problem hiding this comment.
I think this runs 0 test, since describe is async, it doesn't wait for anything ? All the setup (async) should be in before()
Adds a Pinocchio implementation of
tokens/create-token, continuing the Pinocchio token-examples lane aftertransfer-tokens(#596) andescrow(#598).What it does
Creates an SPL Token mint and attaches an on-chain Metaplex metadata account (name, symbol, URI) — the same flow as the existing
anchorandnativeoptions.Notes
CreateMetadataAccountV3CPI is built by hand (rawInstructionView/cpi::invoke), matching the on-chain wire format.[name, symbol, uri, decimals], identical to thenativeexample's wire format.token_metadata.sofixture via apostinstallscript, the same approach as theanchorexample.nativeexample.Files
tokens/create-token/pinocchio/(program + bankrun test)Cargo.toml(workspace member),README.md(pinocchio link),Cargo.lock