RADIX WikiRADIX Wiki

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

InstructionPurpose
CALL_METHODCall a method on a component (e.g., withdraw, deposit, swap)
CALL_FUNCTIONCall a function on a blueprint (e.g., instantiate)
TAKE_FROM_WORKTOPTake a specific amount from worktop into a bucket
TAKE_ALL_FROM_WORKTOPTake all of a resource from worktop into a bucket
ASSERT_WORKTOP_CONTAINSAssert minimum amount on worktop (slippage protection)
CREATE_PROOF_FROM_BUCKET_OF_AMOUNTCreate an authorization proof from a bucket

Value Types

  • Address("resource_rdx...") — entity addresses
  • Decimal("10.5") — numeric amounts
  • Bucket("name") — named bucket references
  • Proof("name") — named proof references
  • Expression("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: