Pay anywhere.
Same safety.
Base, Solana, Stripe, Visa, x402, AWS AgentCore. One SDK call. One signed bundle. Every rail returns the same answer.
Three rails.
One bundle.
On chain rails check the bundle inside the transaction. Card and bank rails check it over HTTP. Runtimes embed it through the SDK.
Base
AuthoritativeThe authoritative chain, every registry, every anchor.
OrisAgentRegistry and OrisAnchorRegistry live on Base mainnet. Every other network mirrors state from here. The IComplianceVerifier reference implementation runs inline inside the settlement transaction.
function settle(bytes32 bundleId, bytes calldata sig) external { require( verifier.verifyAllow( bundleId, sig, IComplianceVerifier.Mode.Strict ), "oris: deny" ); // settlement proceeds _transfer(msg.sender, to, amt); }
Solana
NativeAnchor program verifies inside the settlement instruction.
The Anchor program mirrors the Solidity ABI shape. Bundle hash + recursive sig are submitted as an instruction-level account; verification fails the entire transaction if the proof is stale or revoked.
pub fn settle( ctx: Context<Settle>, bundle_id: [u8; 32], sig: [u8; 64], ) -> Result<()> { oris_verifier::verify_allow( &ctx.accounts.oris_root, bundle_id, sig, )?; // settlement proceeds token::transfer(...)?; Ok(()) }
Stripe MPP
AdapterHTTP verifier-as-a-service, queried before authorization capture.
Stripe's Merchant-of-record agent flow calls the Oris verifier service over mTLS HTTP. If the verifier returns DENY, the authorization is voided before the cardholder ever sees a decline.
const verdict = await oris.verify({ bundle: bundleHash, signature: recursiveSig, rail: "stripe.mpp", intent: { amount_usd_e6: 14_820000, counterparty: "acct_1Nfg...", }, }); if (verdict.decision !== "ALLOW") { throw new OrisDeny(verdict.reason); }
Visa Tap
Pilot · issuer-sideBundle hash bound to the 3DS frictionless flag.
Issuers in the Visa Tap-to-Agent pilot use the Oris attestation as the friction-flag signal: if the bundle verifies, the transaction is exempt from step-up authentication. If revoked, the issuer can decline upstream of the merchant.
// Issuer adds Oris pointer in DE 55 9F70 bundle_id_evm (32 bytes) 9F71 recursive_sig (64 bytes) 9F72 attest_expiry (4 bytes) // Issuer verifies inline before // returning 3DS frictionless approval. verifier.verify_allow(9F70, 9F71)
Coinbase Agent
AdapterRequired to exceed the daily spend ceiling.
Coinbase Agent wallets transact freely up to a daily ceiling. To exceed it, the agent must present an Oris bundle for each marginal transfer. Tier 1 revocations propagate into Coinbase's risk engine in real-time.
curl -X POST verify.useoris.xyz \ -H "x-api-key: $ORIS_KEY" \ -d '{ "rail": "coinbase.agent", "bundle": "0x4ec821...d01", "sig": "0xba27..." }' // → 200 { decision: "ALLOW", ms: 4 }
x402
NativeThe 402 challenge resolves only with a valid Oris bundle.
Servers issuing HTTP 402 advertise an x-oris-required: true challenge. The client must respond with the bundle hash + recursive signature. The server verifies inline; the response includes the next nonce.
// 402 challenge HTTP/1.1 402 Payment Required x-x402-cost-usd-e6: 148200 x-oris-required: true x-oris-nonce: 0xba27... // client response POST /resource x-oris-bundle: 0x4ec821...d01 x-oris-sig: 0xc0ffee...
AWS AgentCore
AdapterSDK middleware ships the bundle on every tool-call.
Drop-in middleware for the AgentCore Python and TypeScript SDKs. Every outbound HTTP call that hits a registered payment endpoint is automatically wrapped: bundle requested, attached, verified, logged.
from oris.agentcore import trust @trust(tenant="acme") def main(): agent = AgentCore.build(...) agent.run() # every payment tool-call is # intercepted, bundled, verified.
Three SDKs.
One call.
Python, TypeScript, Rust. Old bundles still parse. Upgrading the SDK never breaks an integration you already shipped.
oris-py
from oris import Client
c = Client(tenant="acme")
bundle = c.bundle(intent)
verdict = c.verify(bundle)
oris-sdk
import { Oris } from "oris-sdk/protocol";
const oris = new Oris({ tenant });
const bundle = await oris.bundle(...);
const verdict = await oris.verify(bundle);
oris-rs
use oris::Client;
let c = Client::new(&cfg);
let bundle = c.bundle(intent).await?;
let verdict = c.verify(&bundle).await?;
Add Oris in two weeks.
200 lines on EVM and Solana. One HTTP endpoint everywhere else. We pair with your team and ship the integration together.