Skip to content

Create, Sign and Share WachAI Mandates from your terminal over xmtp

License

Notifications You must be signed in to change notification settings

quillai-network/WachAI-Terminal

Repository files navigation

WachAI Terminal (wachai)

When agents move past simple conversations and start doing commerce, they need deterministic agreements they can both rely on:

  • what was offered,
  • what was accepted,
  • and cryptographic proof that both parties agreed.

WachAI mandates are those deterministic agreement objects.
WachAI Terminal is a command-line utility to create, sign, verify, and share mandates over XMTP.

Install

Global (when published)

npm install -g @quillai-network/wachai
wachai --help

From source (dev)

npm install
npm run build
node dist/cli.js --help

Keys (required)

Recommended: store a shared wallet.json (no env var needed)

Instead of exporting WACHAI_PRIVATE_KEY in every terminal, you can store it once in a local wallet.json (shared across terminal instances):

wachai wallet init
wachai wallet info

By default this writes to ~/.wachai/wallet.json (or under WACHAI_STORAGE_DIR). You can override with WACHAI_WALLET_PATH.

Legacy env var (deprecated)

WACHAI_PRIVATE_KEY is still supported for backwards compatibility, but deprecated. Prefer wallet.json.

If you already have a key, you can export it:

export WACHAI_PRIVATE_KEY=0xYOUR_PRIVATE_KEY

Keep it safe:

  • don’t commit it
  • don’t paste it into screenshots/logs
  • prefer a dedicated key for testing

Storage

Mandates are stored locally so you can reference them by mandateId:

  • default: ~/.wachai/mandates/<mandateId>.json
  • override: set WACHAI_STORAGE_DIR (recommended for testing)
export WACHAI_STORAGE_DIR="$(pwd)/.tmp/wachai"
mkdir -p "$WACHAI_STORAGE_DIR"

Core flow: create → sign → verify

Create mandate (server role)

The creator is the server role (signs first). A mandate is only approved once it has both signatures (server offer + client acceptance).

create-mandate has two modes:

  • --from-registry: resolves --kind via the public primitives registry and validates --body against that primitive’s JSON schema.
  • --custom: no registry lookup; --body must be valid JSON (object).

Registry-backed example (swap@1):

wachai create-mandate \
  --from-registry \
  --client 0xCLIENT_ADDRESS \
  --kind swap@1 \
  --intent "Swap 100 USDC for WBTC" \
  --body '{"chainId":1,"tokenIn":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","tokenOut":"0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599","amountIn":"100000000","minOut":"165000","recipient":"0xCLIENT_ADDRESS","deadline":"2030-01-01T00:00:00Z"}'

Custom example:

wachai create-mandate \
  --custom \
  --client 0xCLIENT_ADDRESS \
  --kind "content" \
  --intent "Demo custom mandate" \
  --body '{"message":"hello","priority":3}'

Sign mandate (client role)

The signer is the client role (signs second):

wachai sign <mandate-id>

Print/inspect a mandate

Before signing or verifying, you can print the raw stored mandate JSON:

wachai print <mandate-id>

To learn the mandate shape + what fields mean:

wachai print sample

Verify mandate

Verifies both signatures (exit code 0 only if both are valid):

wachai verify <mandate-id>

XMTP: share mandates between agents

You can exchange mandates over XMTP using EVM addresses.

Practical workflow when running two agents:

  • keep one terminal open running wachai xmtp receive (your “inbox”)
  • use another terminal to create/sign/send mandates

Agent B (receiver/client) — keep inbox open

export WACHAI_PRIVATE_KEY=0xCLIENT_PRIVATE_KEY
wachai xmtp receive --env production

Agent A (sender/server) — send a mandate by receiver address

You need:

  • the receiver’s public address (0x...)
  • a local mandateId you created via create-mandate
export WACHAI_PRIVATE_KEY=0xSERVER_PRIVATE_KEY
wachai xmtp send 0xCLIENT_ADDRESS <mandate-id> --env production

When the receiver gets it, it’s saved locally by mandateId. They can then:

export WACHAI_PRIVATE_KEY=0xCLIENT_PRIVATE_KEY
wachai sign <mandate-id>
wachai xmtp send 0xSERVER_ADDRESS <mandate-id> --action accept --env production

More details: see XMTPUsage.md.

Test (before publishing)

End-to-end smoke test (create → sign → verify):

npm run typecheck
npm run smoke

About

Create, Sign and Share WachAI Mandates from your terminal over xmtp

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published