executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
handling-transactionsToken transactions and wallet integration for XMTP agents. Use when sending USDC, creating transaction requests, or handling transaction confirmations. Triggers on USDC transfer, wallet calls, or transaction reference.
Independent GitHub snapshot · Automated classification · Original documentation governs
Send and receive token transactions using wallet_sendCalls (EIP-5792) specification.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Send | CRITICAL | send- |
| 2 | Receive | CRITICAL | receive- |
| 3 | Balance | HIGH | balance- |
send-usdc-transfer - Create USDC transfer requestssend-wallet-calls - Send wallet_sendCalls messagesreceive-transaction-reference - Handle transaction confirmationsbalance-check - Check USDC balance| Network | Chain ID | USDC Address |
|---|---|---|
| Base Sepolia | 84532 | 0x036CbD53842c5426634e7929541eC2318f3dCF7e |
| Base Mainnet | 8453 | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
import { validHex } from "@xmtp/agent-sdk";
// Check balance using viem
const balance = await getUSDCBalance("base-sepolia", validHex(address));
// Create USDC transfer calls (EIP-5792)
const calls = createUSDCTransferCalls(
"base-sepolia",
validHex(fromAddress),
validHex(toAddress),
1000000 // 1 USDC (6 decimals)
);
await ctx.conversation.sendWalletSendCalls(calls);
USDC token config:
const USDC_TOKENS: Record<string, { address: string; decimals: number }> = {
"base-sepolia": { address: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", decimals: 6 },
"base-mainnet": { address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", decimals: 6 },
};
Get USDC balance:
import { createPublicClient, formatUnits, http } from "viem";
import { baseSepolia, base } from "viem/chains";
const getUSDCBalance = async (networkId: string, address: HexString): Promise<string> => {
const token = USDC_TOKENS[networkId];
const client = createPublicClient({
chain: networkId === "base-mainnet" ? base : baseSepolia,
transport: http(),
});
const balance = await client.readContract({
address: token.address as HexString,
abi: [{ inputs: [{ name: "account", type: "address" }], name: "balanceOf", outputs: [{ type: "uint256" }], stateMutability: "view", type: "function" }],
functionName: "balanceOf",
args: [address],
});
return formatUnits(balance, token.decimals);
};
Create USDC transfer calls:
import { toHex } from "viem";
const createUSDCTransferCalls = (
networkId: string, from: HexString, to: string, amount: number
): WalletSendCalls => {
const token = USDC_TOKENS[networkId];
const data = `0xa9059cbb${to.slice(2).padStart(64, "0")}${BigInt(amount).toString(16).padStart(64, "0")}`;
return {
version: "1.0",
from,
chainId: toHex(networkId === "base-mainnet" ? 8453 : 84532),
calls: [{ to: token.address as HexString, data: validHex(data) }],
};
};
Read individual rule files for detailed explanations:
rules/send-usdc-transfer.md
rules/receive-transaction-reference.md
rules/balance-check.md