lez-programs/artifacts/token-idl.json
bristinWild 40ea847044
feat(token): add mint authority model to token program
Add an optional mint authority to fungible tokens for controlled supply:
create with a designated minter, mint additional supply, rotate the
authority to a new key, or permanently revoke it to fix the supply.

The authority is stored inline on `TokenDefinition::Fungible` as
`authority: Option<AccountId>` (`Some(id)` = mintable by `id`, `None` =
fixed supply). Keeping it a plain `Option<AccountId>` rather than a custom
wrapper type leaves account state decodable by `spel inspect`; the
require/rotate/revoke guard logic lives inline in the handlers.

LEZ rejects a transaction that lists the same account id twice, so one
instruction cannot statically express both "the definition account is the
authority and signs" (self/PDA authority) and "a distinct rotated account
signs" (external authority) — they need opposite signer markers. Each
privileged operation is therefore split into a self and an external
variant:

- `Mint` / `SetAuthority` — the definition account is the signer.
- `MintWithAuthority` / `SetAuthorityWithAuthority` — a distinct authority
  account is the signer; the definition account does not sign.

Creation via `NewFungibleDefinition { mint_authority, .. }`; an all-zero
authority id is rejected. The AMM's LP token uses self/PDA authority — its
stored authority is the LP definition PDA, minted only by the pool via
chained calls.

Covered by token unit tests and zkVM integration tests: creation with and
without an authority, self- and external-authority mint, rotation, and
external rotate/revoke. IDLs regenerated.
2026-07-02 18:59:51 +02:00

399 lines
8.0 KiB
JSON

{
"version": "0.1.0",
"name": "token",
"instructions": [
{
"name": "transfer",
"accounts": [
{
"name": "sender",
"writable": true,
"signer": true,
"init": false
},
{
"name": "recipient",
"writable": true,
"signer": false,
"init": false
}
],
"args": [
{
"name": "amount_to_transfer",
"type": "u128"
}
]
},
{
"name": "new_fungible_definition",
"accounts": [
{
"name": "definition_target_account",
"writable": true,
"signer": true,
"init": true
},
{
"name": "holding_target_account",
"writable": true,
"signer": true,
"init": true
}
],
"args": [
{
"name": "name",
"type": "string"
},
{
"name": "total_supply",
"type": "u128"
},
{
"name": "mint_authority",
"type": {
"option": "account_id"
}
}
]
},
{
"name": "new_definition_with_metadata",
"accounts": [
{
"name": "definition_target_account",
"writable": true,
"signer": true,
"init": true
},
{
"name": "holding_target_account",
"writable": true,
"signer": true,
"init": true
},
{
"name": "metadata_target_account",
"writable": true,
"signer": true,
"init": true
}
],
"args": [
{
"name": "new_definition",
"type": {
"defined": "NewTokenDefinition"
}
},
{
"name": "metadata",
"type": {
"defined": "Box"
}
}
]
},
{
"name": "initialize_account",
"accounts": [
{
"name": "definition_account",
"writable": false,
"signer": false,
"init": false
},
{
"name": "account_to_initialize",
"writable": true,
"signer": true,
"init": true
}
],
"args": []
},
{
"name": "burn",
"accounts": [
{
"name": "definition_account",
"writable": true,
"signer": false,
"init": false
},
{
"name": "user_holding_account",
"writable": true,
"signer": true,
"init": false
}
],
"args": [
{
"name": "amount_to_burn",
"type": "u128"
}
]
},
{
"name": "mint",
"accounts": [
{
"name": "definition_account",
"writable": true,
"signer": true,
"init": false
},
{
"name": "user_holding_account",
"writable": true,
"signer": false,
"init": false
}
],
"args": [
{
"name": "amount_to_mint",
"type": "u128"
}
]
},
{
"name": "mint_with_authority",
"accounts": [
{
"name": "definition_account",
"writable": true,
"signer": false,
"init": false
},
{
"name": "user_holding_account",
"writable": true,
"signer": false,
"init": false
},
{
"name": "authority_account",
"writable": false,
"signer": true,
"init": false
}
],
"args": [
{
"name": "amount_to_mint",
"type": "u128"
}
]
},
{
"name": "set_authority",
"accounts": [
{
"name": "definition_account",
"writable": true,
"signer": true,
"init": false
}
],
"args": [
{
"name": "new_authority",
"type": {
"option": "account_id"
}
}
]
},
{
"name": "set_authority_with_authority",
"accounts": [
{
"name": "definition_account",
"writable": true,
"signer": false,
"init": false
},
{
"name": "authority_account",
"writable": false,
"signer": true,
"init": false
}
],
"args": [
{
"name": "new_authority",
"type": {
"option": "account_id"
}
}
]
},
{
"name": "print_nft",
"accounts": [
{
"name": "master_account",
"writable": true,
"signer": true,
"init": false
},
{
"name": "printed_account",
"writable": true,
"signer": true,
"init": true
}
],
"args": []
}
],
"accounts": [
{
"name": "TokenDefinition",
"type": {
"kind": "enum",
"variants": [
{
"name": "Fungible",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "total_supply",
"type": "u128"
},
{
"name": "metadata_id",
"type": {
"option": "account_id"
}
},
{
"name": "authority",
"type": {
"option": "account_id"
}
}
]
},
{
"name": "NonFungible",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "printable_supply",
"type": "u128"
},
{
"name": "metadata_id",
"type": "account_id"
}
]
}
]
}
},
{
"name": "TokenHolding",
"type": {
"kind": "enum",
"variants": [
{
"name": "Fungible",
"fields": [
{
"name": "definition_id",
"type": "account_id"
},
{
"name": "balance",
"type": "u128"
}
]
},
{
"name": "NftMaster",
"fields": [
{
"name": "definition_id",
"type": "account_id"
},
{
"name": "print_balance",
"type": "u128"
}
]
},
{
"name": "NftPrintedCopy",
"fields": [
{
"name": "definition_id",
"type": "account_id"
},
{
"name": "owned",
"type": "bool"
}
]
}
]
}
},
{
"name": "TokenMetadata",
"type": {
"kind": "struct",
"fields": [
{
"name": "definition_id",
"type": "account_id"
},
{
"name": "standard",
"type": {
"defined": "MetadataStandard"
}
},
{
"name": "uri",
"type": "string"
},
{
"name": "creators",
"type": "string"
},
{
"name": "primary_sale_date",
"type": "u64"
}
]
}
}
],
"types": [
{
"name": "MetadataStandard",
"kind": "enum",
"variants": [
{
"name": "Simple"
},
{
"name": "Expanded"
}
]
}
],
"instruction_type": "token_core::Instruction"
}