What is a Transaction Manifest?
A transaction manifest is a human-readable script that describes exactly what a transaction does — which assets move where, which components are called, and in what order. Unlike EVM bytecode, manifests are transparent: the Radix Wallet summarizes them in plain language so users never "blind sign."
Manifests use a bash-like syntax where each instruction is a command followed by typed arguments and a semicolon. Instructions execute sequentially — if any fails, the entire transaction rolls back atomically.
The Worktop
Every transaction has a worktop — a temporary holding area for resources in transit. When you withdraw tokens from an account, they land on the worktop. You then take them into named buckets and pass them to methods or deposit them.
# Withdraw 10 XRD — tokens land on worktop
CALL_METHOD Address("account_rdx...") "withdraw"
Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxakj8n3")
Decimal("10")
;
# Take from worktop into a named bucket
TAKE_FROM_WORKTOP
Address("resource_rdx1tknxxxxxxxxxradxrdxxxxxxxxx009923554798xxxxxxxxxakj8n3")
Decimal("10")
Bucket("xrd_bucket")
;Core Instructions
| Instruction | Purpose |
|---|---|
CALL_METHOD | Call a method on a component (e.g., withdraw, deposit, swap) |
CALL_FUNCTION | Call a function on a blueprint (e.g., instantiate) |
TAKE_FROM_WORKTOP | Take a specific amount from worktop into a bucket |
TAKE_ALL_FROM_WORKTOP | Take all of a resource from worktop into a bucket |
ASSERT_WORKTOP_CONTAINS | Assert minimum amount on worktop (slippage protection) |
CREATE_PROOF_FROM_BUCKET_OF_AMOUNT | Create an authorization proof from a bucket |
Value Types
Address("resource_rdx...")— entity addressesDecimal("10.5")— numeric amountsBucket("name")— named bucket referencesProof("name")— named proof referencesExpression("ENTIRE_WORKTOP")— deposit everything remaining
Common Patterns
Simple Token Transfer
CALL_METHOD Address("account_rdx_sender...") "lock_fee" Decimal("5");
CALL_METHOD Address("account_rdx_sender...") "withdraw"
Address("resource_rdx1tk...xrd...")
Decimal("100")
;
TAKE_ALL_FROM_WORKTOP Address("resource_rdx1tk...xrd...") Bucket("tokens");
CALL_METHOD Address("account_rdx_recipient...") "try_deposit_or_abort"
Bucket("tokens") Enum<0u8>()
;DEX Swap with Slippage Protection
CALL_METHOD Address("account_rdx...") "withdraw"
Address("token_a_addr") Decimal("100")
;
TAKE_ALL_FROM_WORKTOP Address("token_a_addr") Bucket("input");
CALL_METHOD Address("dex_component_addr") "swap"
Bucket("input")
;
# Ensure minimum output — reverts if not met
ASSERT_WORKTOP_CONTAINS Address("token_b_addr") Decimal("95");
CALL_METHOD Address("account_rdx...") "deposit_batch"
Expression("ENTIRE_WORKTOP")
;Atomic composability
You can chain calls to multiple components in one manifest. If a DEX swap feeds into a lending protocol deposit, both succeed or both fail — no partial state.
Building Manifests Programmatically
While you can write manifests by hand, most dApps build them in code:
- TypeScript — the Radix dApp Toolkit sends manifests via
sendTransaction - Rust — the ManifestBuilder provides a fluent API
- Console — the Developer Console has a raw transaction editor
