Transfer USDC between agent wallets on Base chain. Direct on-chain settlement for agent-to-agent payments without ZKP2P escrow. Use when the user wants to send USDC to another agent, transfer tokens, or settle agent-to-agent payments.
Transfer USDC between agent wallets on Base chain. Direct on-chain settlement for agent-to-agent payments without ZKP2P escrow. Use when the user wants to send USDC to another agent, transfer tokens, or settle agent-to-agent payments.
ZKP2P Transfer (Agent-to-Agent USDC)
Direct USDC transfer on Base for agent-to-agent payments. No ZKP2P escrow or proof generation needed -- this is a simple ERC-20 transfer for when both parties are on-chain.
Overview
When both the sender and recipient are on-chain (e.g., two agents with wallets), there is no need for ZKP2P's fiat-to-crypto bridge. A direct USDC transfer is simpler, cheaper, and instant.
Use this skill when:
Agent needs to pay another agent in USDC
Agent needs to move USDC between its own wallets
Agent needs to settle an agent-to-agent debt
Use zkp2p-onramp or zkp2p-offramp instead when:
One party needs fiat (e.g., paying a human freelancer)
Note: Batch transfers are sequential (one tx at a time). For truly atomic batch transfers, use a multicall contract or build a custom batch transfer contract.
When to Use ZKP2P Instead
Scenario
Use This Skill
Use ZKP2P
Agent pays another agent in USDC
Yes
No
Agent pays a human in fiat
No
Yes (zkp2p-offramp)
Agent converts fiat to USDC
No
Yes (zkp2p-onramp)
Agent moves USDC between own wallets
Yes
No
Agent pays a merchant (fiat invoice)
No
Yes (zkp2p-checkout)
Agent splits payment: part crypto, part fiat
Yes (crypto part)
Yes (fiat part)
Security
Pre-Transfer Checklist
Validate recipient address: Ensure it is a valid checksummed Ethereum address. Never send to address(0) or known burn addresses.
Use checksummed addresses: Always use getAddress() to normalize addresses.
Gas estimation: Base L2 gas is cheap (~$0.001-$0.01 per transfer), but ensure the agent has ETH for gas.
// Check ETH balance for gasconst ethBalance = await publicClient.getBalance({ address: account.address });
if (ethBalance < 100_000_000_000_000n) { // < 0.0001 ETHconsole.warn('Low ETH balance for gas. Top up before transfers.');
}
Private Key Management
Never hardcode private keys in source code
Use environment variables or a secrets manager
Consider using a hardware wallet or MPC wallet for production agents
Rotate keys periodically
Amount Validation
functionvalidateAmount(amountUsdc: number): bigint {
if (amountUsdc <= 0) thrownewError('Amount must be positive');
if (amountUsdc > 1_000_000) thrownewError('Amount exceeds safety limit (1M USDC)');
if (!Number.isFinite(amountUsdc)) thrownewError('Amount must be finite');
// Convert to raw units (6 decimals)returnBigInt(Math.round(amountUsdc * 1_000_000));
}
Chain Constants
Field
Value
Chain
Base Mainnet
Chain ID
8453
RPC URL
https://mainnet.base.org
Block Explorer
https://basescan.org
USDC Address
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
USDC Decimals
6
Native Token
ETH (for gas)
Avg Gas Cost
~$0.001-$0.01 per transfer
Verifying Transfers
After a transfer, verify on-chain:
// Get transaction receiptconst receipt = await publicClient.getTransactionReceipt({ hash: txHash });
console.log(`Status: ${receipt.status}`); // 'success' or 'reverted'console.log(`Block: ${receipt.blockNumber}`);
console.log(`Gas used: ${receipt.gasUsed}`);
// View on Basescanconsole.log(`Explorer: https://basescan.org/tx/${txHash}`);