Reading certificates
Read-only calls on BoundClient — no keypair, no signature, no fee.
Reads are simulated against the chain. They cost nothing, change nothing, and need no credentials, which is what makes "check before you transact" realistic to actually do on every request.
verifyCertificate
import { bound, toCertView } from "@bound/sdk";
const raw = await bound.verifyCertificate(agentAddress);
const cert = toCertView(agentAddress, raw);verifyCertificate returns the raw VerifyResult with bigint amounts.
toCertView projects it into a JSON-safe shape for HTTP and UI boundaries:
| Field | Meaning |
|---|---|
valid | true only when status is Verified and the certificate has not expired |
status | Pending, Verified or Invalid |
boundUsd | The maximum loss the certificate claims to cover |
reserveUsd | The reserve the certificate claims is locked |
auditorStakeUsd | The auditor's stake at the time of the read |
auditor | Who vouched |
expiresAt | Unix seconds |
Claimed vs actual
reserveUsd is what the certificate claims. The vault's real balance is
reserveBalance(). A certificate where the claim exceeds the balance is exactly what
a challenge proves — comparing the two yourself is one extra read.
The other reads
| Method | Returns |
|---|---|
certIdForAgent(agent) | The certificate id for an agent, if one exists |
usdcBalance(address) | USDC balance of any account |
reserveBalance() | The vault's actual locked balance — the on-chain truth |
auditorStake(auditor) | An auditor's current live stake |
auditorRegistered(auditor) | Whether their stake meets the minimum |
auditorMinStake() | The registration threshold |
Checking the claim against reality
import { bound, toCertView } from "@bound/sdk";
const cert = toCertView(agent, await bound.verifyCertificate(agent));
const actual = await bound.reserveBalance();
const shortfall = BigInt(Math.round(Number(cert.reserveUsd) * 1e7)) - actual;
if (shortfall > 0n) {
// The certificate overstates its reserve. This is provable on-chain,
// permissionlessly, and pays 20% of the auditor's stake to whoever proves it.
// See /docs/sdk/writing#challenging-a-certificate
}Beyond BoundClient
The raw generated contract clients are re-exported from @bound/sdk for calls the
client does not wrap. Reach for them when you need a contract method directly;
BoundClient is a convenience layer, not a wall.