Skip to main content
Transfers are the most common CAW operation. A runtime submits a transfer with an active pact or delegation, CAW evaluates it against the policy engine, and the result is either allowed, denied, or paused for owner approval.

Submit a transfer

caw tx transfer <PACT_ID> \
  --to 0xRecipient... \
  --token-id SETH_USDC \
  --amount 50 \
  --chain-id SETH \
  --request-id invoice-001

Response model

FieldDescription
statussubmitted, pending, or pending_approval
cobo_transaction_idTransaction identifier if the request reached execution
transaction_hashOn-chain hash after broadcast/confirmation
request_idYour idempotency key
pending_operation_idPresent only when the operation needs owner approval

Idempotency

Use a stable request_id tied to your business action. If the runtime retries the same transfer after a timeout or process restart, CAW returns the original operation instead of creating a duplicate.
result = await agent_client.transfer_tokens(
    wallet_uuid=WALLET_UUID,
    chain_id="SETH",
    dst_addr="0xRecipient...",
    token_id="SETH_USDC",
    amount="50",
    request_id="invoice-2026-001",
)

Pending approval

If the transfer is above an owner review threshold, CAW returns status="pending_approval" instead of failing. Your runtime should pause that task and resume after the owner acts in the Cobo Agentic Wallet app.
result = await agent_client.transfer_tokens(
    wallet_uuid=WALLET_UUID,
    chain_id="SETH",
    dst_addr="0xRecipient...",
    token_id="SETH_USDC",
    amount="800",
)

if result.get("status") == "pending_approval":
    pending_id = result["pending_operation_id"]
    print(f"Waiting for owner approval: {pending_id}")
If the operation is outside policy entirely, CAW returns a denial instead. See Handle Policy Denial.

Before you submit

For production flows, estimate fees first and keep tracking tied to request_id.