Skip to content
LogoLogo

Commands

jaw rpc call

Execute any EIP-1193 RPC method through the browser bridge or local session key.

jaw rpc call <method> [params]

Arguments

ArgumentRequiredDescription
methodYesRPC method name (e.g., wallet_connect, wallet_sendCalls)
paramsNoJSON string with method parameters

Flags

FlagShortDefaultDescription
--output-ohumanOutput format: json or human
--chain-cconfigChain ID (e.g., 8453 for Base)
--api-keyconfigJAW API key
--timeout-t120Request timeout in seconds
--yes-yfalseSkip confirmations
--quiet-qfalseSuppress non-essential output
--session-sfalseUse local session key (Auto Mode)

Examples

Connect wallet:

jaw rpc call wallet_connect

Get accounts:

jaw rpc call eth_accounts

Send ETH (0.01 ETH on Base):

jaw rpc call wallet_sendCalls '{"calls":[{"to":"0xRecipient","value":"0x2386F26FC10000"}]}' -c 8453

Send ERC-20 tokens:

jaw rpc call wallet_sendCalls '{"calls":[{"to":"0xTokenAddress","data":"0xa9059cbb000000000000000000000000RECIPIENT0000000000000000000000000000000000000000000000000000000000000000000000000000000DE0B6B3A7640000"}]}' -c 8453

Sign a message:

jaw rpc call personal_sign '["0x48656c6c6f","0xYourAddress"]'

Grant permissions:

jaw rpc call wallet_grantPermissions '{"permissions":[{"type":"call","data":{"to":"0xContractAddress"}},{"type":"spend","data":{"token":"0xUSDCAddress","limit":"1000000","period":"daily"}}],"expiry":1735689600}'

Check transaction status:

jaw rpc call wallet_getCallsStatus '["0xBundleId"]'

JSON output (for scripts and AI agents):

jaw rpc call eth_accounts -o json -y

jaw config set

Set one or more configuration values.

jaw config set [key=value ...]

Valid keys: apiKey, defaultChain, keysUrl, ens, relayUrl, sessionExpiry

Examples

# Set API key and chain
jaw config set apiKey=YOUR_KEY defaultChain=8453
 
# Enable ENS resolution
jaw config set ens=myapp.eth
 
# Set session expiry
jaw config set sessionExpiry=14
 
# Use a self-hosted relay
jaw config set relayUrl=wss://relay.mycompany.com

jaw config write

Write a full config from inline JSON or a file path.

jaw config write <json-or-filepath>

If the input starts with {, it's parsed as inline JSON. Otherwise, it's read as a file path.

Examples

# Inline JSON
jaw config write '{"apiKey":"...","defaultChain":84532,"paymasters":{...}}'
 
# From file
jaw config write ./my-config.json

jaw config show

Display current configuration. The API key is redacted in output.

jaw config show
jaw config show -o json

jaw session setup

Generate a session key and grant scoped on-chain permissions. Opens the browser once for passkey approval. See Auto Mode for details.

jaw session setup [--chain <id>] [--permissions <json|file>] [--expiry <days>]

Flags

FlagDescription
--permissionsOverride config.permissions (inline JSON or file path)
--expiryOverride config.sessionExpiry (days, default: 7)
--yes / -ySkip overwrite confirmation

Example

jaw session setup --chain 84532
jaw session setup --chain 84532 --expiry 14 --yes

jaw session status

Show current session status.

jaw session status
jaw session status -o json

jaw session add

Add permissions to the current session, keeping the ones it already has.

jaw session add --x402
jaw session add --x402 --limit 10/day
jaw session add --permissions '{"calls":[...]}'

jaw session setup replaces a session. An agent working under a scoped session that then discovers it needs to pay could only re-run setup, which revokes the grant it is working under, so it loses its other capabilities in the middle of the task. This grants the union instead.

The session still holds one permission afterwards: the union is granted as a new permission and the old one is revoked, which is why the browser asks twice. Two live grants would be two independent budgets on chain, so two of 5 a day are 10 a day with nothing representing the total. The session key is kept, so the agent's address, its balance and its delegation all survive.

A limit is replaced by one that meters the same token over the same period, and only by that: caps the request does not mention are kept. The contract charges every spend limit matching a token rather than stopping at the first, so limits on one token are ANDed and the tightest binds. Adding 10 a day to a session that also holds 1 a week leaves the week limit in place, and the summary says so, because that is the one payments will run into.

It needs a session that carries the permission it was granted. Sessions created before the CLI stored that cannot be merged against, since a permission id says nothing about what it allows; re-run jaw session setup once and adding works from then on.


jaw session revoke

Revoke the on-chain permission and delete local session files. Opens browser for passkey approval (skipped if session is expired).

jaw session revoke

It revokes the permissions earlier sessions left live on the account as well as the one this session names. jaw session setup replaces a session rather than adding to it, and it does not always revoke what it replaces: declining the prompt keeps the old permission, and --yes never revokes. Those are recorded on the new session and revoked here, on their own chain if setup moved chains since. Expired ones are skipped, since they authorise nothing.

Each one is attempted on its own, so one that fails does not stop the rest. What could not be revoked is listed and the local session is kept so the command can be run again. One case never succeeds on a retry: a permission already revoked from another device, which the wallet reads from the relay and the relay no longer has. Pass --force to delete the local session anyway, and note the ids it prints, because deleting the session is what loses them.


jaw disconnect

Close the relay session and browser tab. Cleans up the session stored in ~/.jaw/relay.json.

jaw disconnect

jaw x402 pay

Fetch a URL, paying an x402 402 challenge with the session key. Dry run by default: pass --pay to actually spend. See Paying for APIs for funding and limits.

jaw x402 pay <url>

Flags

FlagDescription
--payActually sign and send the payment
--max-amountCeiling in base units for this call, on top of the policy
--methodHTTP method (default GET)
--bodyRequest body

Examples

jaw x402 pay https://api.example.com/resource
jaw x402 pay https://api.example.com/resource --pay
jaw x402 pay https://api.example.com/resource --pay --max-amount 50000

jaw x402 status

Show x402 payment readiness: which account holds the funds, the resolved caps, and what has been spent. Reads only, never pays.

jaw x402 status
jaw x402 status --output json

jaw x402 log

Show the local x402 payment ledger: every attempt, paid, failed or refused, with amounts and transactions.

jaw x402 log

Flags

FlagDescription
--limitShow only the most recent N entries
--statusFilter by paid, failed or refused

Examples

jaw x402 log --limit 20
jaw x402 log --status failed

jaw mcp

Start the MCP server on stdio for AI agent integration. See the MCP Server page for setup details.

jaw mcp

jaw version

Display the CLI version.

jaw version
jaw -v