Stabletrust enables AI agents to transact privately on EVM chains - shield tokens, transfer confidentially, withdraw silently. Balances are encrypted on-chain. No one can see what your agent holds or where it sends.
Built for the private agent economy.
No SDK. No setup. Just POST.
// Shield tokens into a confidential account
await fetch("https://stabletrust-api.fairblock.network/deposit", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e", // USDC
amount: "10000000", // 10 USDC
chainId: 84532, // Base Sepolia
}),
});That's it. Your agent now has a private balance no one can read.
EOA → [account/create] → Confidential Account → [deposit] → shielded balance
→ [transfer] → Recipient
Recipient → [apply] → spendable → [withdraw] → EOA
- Create account - provision a confidential account (idempotent). Required before an account can receive a transfer.
- Deposit - shield ERC-20 tokens. Balance becomes encrypted on-chain.
- Transfer - send privately to any address. Amount is invisible on-chain.
- Apply - a recipient applies received funds, moving them from
pendingtoavailableso they can be spent or withdrawn. - Withdraw - unshield back to public ERC-20 at any time.
- Balance - check any account's decrypted balance. Read-only - sends no transaction.
Provision your confidential account (idempotent). Required before an account can receive a transfer.
const res = await fetch("https://stabletrust-api.fairblock.network/account/create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
chainId: 84532,
}),
});
const { address, created } = await res.json();
// { success: true, address: '0x...', created: true } // created:false if it already existedconst res = await fetch("https://stabletrust-api.fairblock.network/deposit", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
amount: "10000000",
chainId: 84532,
}),
});
const { receipt } = await res.json();
// { hash: '0x...' }Read-only - decrypts and returns the balance without sending any transaction. Returns exists: false with zero balances if the account hasn't been created yet.
const res = await fetch("https://stabletrust-api.fairblock.network/balance", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
chainId: 84532,
}),
});
const { exists, balance } = await res.json();
// { exists: true, balance: { total: '10000000', available: '10000000', pending: '0' } }const res = await fetch("https://stabletrust-api.fairblock.network/transfer", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
recipientAddress: "0x...recipient",
tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
amount: "5000000", // 5 USDC
chainId: 84532,
}),
});
const { receipt } = await res.json();
// { hash: '0x...' }Apply received funds - moves a recipient's balance from pending to available so it can be spent or withdrawn.
const res = await fetch("https://stabletrust-api.fairblock.network/apply", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
chainId: 84532,
}),
});
const { tx } = await res.json();
// { success: true, message: 'Pending balance applied', tx: '0x...' }const res = await fetch("https://stabletrust-api.fairblock.network/withdraw", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
privateKey: process.env.AGENT_KEY,
tokenAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
amount: "5000000",
chainId: 84532,
}),
});
const { receipt } = await res.json();
// { hash: '0x...' }/deposit
| Field | Type | Required | Description |
|---|---|---|---|
privateKey |
string | yes | Agent wallet private key |
tokenAddress |
string | yes | ERC-20 token contract address |
amount |
string | yes | Amount in token base units |
chainId |
number | yes | Target network chain ID |
waitForFinalization |
boolean | no | Wait for tx finality (default: true) |
/balance
| Field | Type | Required | Description |
|---|---|---|---|
privateKey |
string | yes | Agent wallet private key (used for decryption) |
tokenAddress |
string | yes | ERC-20 token contract address |
chainId |
number | yes | Target network chain ID |
address |
string | no | Address to query - defaults to wallet from privateKey |
/transfer
| Field | Type | Required | Description |
|---|---|---|---|
privateKey |
string | yes | Agent wallet private key |
recipientAddress |
string | yes | Recipient Ethereum address |
tokenAddress |
string | yes | ERC-20 token contract address |
amount |
string | yes | Amount in token base units |
chainId |
number | yes | Target network chain ID |
useOffchainVerify |
boolean | no | Off-chain proof verification (default: false) |
waitForFinalization |
boolean | no | Wait for tx finality (default: true) |
/withdraw
| Field | Type | Required | Description |
|---|---|---|---|
privateKey |
string | yes | Agent wallet private key |
tokenAddress |
string | yes | ERC-20 token contract address |
amount |
string | yes | Amount in token base units |
chainId |
number | yes | Target network chain ID |
useOffchainVerify |
boolean | no | Off-chain proof verification (default: false) |
waitForFinalization |
boolean | no | Wait for tx finality (default: true) |
/account/create
| Field | Type | Required | Description |
|---|---|---|---|
privateKey |
string | yes | Agent wallet private key |
chainId |
number | yes | Target network chain ID |
waitForFinalization |
boolean | no | Wait for account finality (default: true) |
/apply
| Field | Type | Required | Description |
|---|---|---|---|
privateKey |
string | yes | Agent wallet private key |
chainId |
number | yes | Target network chain ID |
waitForFinalization |
boolean | no | Wait for tx finality (default: true) |
| Chain | ID |
|---|---|
| Base | 8453 |
| Base Sepolia | 84532 |
| Ethereum Sepolia | 11155111 |
| Arbitrum Sepolia | 421614 |
| Arc | 5042002 |
| Stable | 2201 |
| Tempo | 42431 |