Trust Center

Verify our
infrastructure.

Every contract address, custody role, security check, and evidence artifact is documented here. No sales call required.

On-chain verification

Deployed contracts

All contracts are deployed on Base Mainnet (Chain ID: 8453). Verify independently on Basescan.

USDC (USD Coin)
Base Mainnet
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

ERC-20 asset used for all settlements. Circle-issued. Audited.

P402 Treasury
Base Mainnet
0xFa772434DCe6ED78831EbC9eeAcbDF42E2A031a6

Receives USDC from settled payments. Platform fee destination.

P402Settlement
Base Mainnet
0xd03c7ab9a84d86dbc171367168317d6ebe408601

Marketplace settlement contract. Applies 1% platform fee on settlement.

SubscriptionFacilitator
Base Mainnet
0xc64747651e977464af5bce98895ca6018a3e26d7

Handles recurring subscription billing via EIP-2612 permit. Month 1 sets allowance; months 2+ draw without new signatures.

ERC-8004 Identity Registry
Base Mainnet
0x8004A169FB4a3325136EB29fA0ceB6D2e539a432

On-chain agent identity registration and DID resolution.

ERC-8004 Reputation Registry
Base Mainnet
0x8004BAa17C55a88189AE136b182e5fdA19dE9b63

On-chain agent reputation scoring. Read by routing engine for trust-weighted decisions.

EIP-712 domain — USDC on Base
{
  name: 'USD Coin',
  version: '2',
  chainId: 8453,
  verifyingContract: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
}

Used to produce the EIP-712 domain separator for TransferWithAuthorization signatures. Verify against the USDC contract on Basescan.

Custody model

Who controls what

P402 never holds user funds. The facilitator executes signed authorizations — it does not custody assets.

User / Payer

Signs EIP-3009 authorization. Controls validAfter, validBefore, nonce, and value. User never submits a transaction — the facilitator does.

Risk boundary

User sets authorization bounds. Once signed, the facilitator can execute within those bounds before validBefore.

P402 Facilitator

Hot wallet that executes transferWithAuthorization on USDC. Pays gas on behalf of the user. Does not hold user funds.

Risk boundary

If compromised, could execute valid but not-yet-settled authorizations. Mitigated by short validBefore windows and replay protection.

Treasury

Receives settled USDC. Read-only from protocol perspective — only receives, does not send.

Risk boundary

Separate from facilitator wallet. Compromise of facilitator does not affect treasury funds.

Resource Server

Defines paymentRequirements (amount, payTo, asset, resource URL). Calls verify then settle via P402 facilitator API.

Risk boundary

Must validate verify response before serving content. Failure to check valid: true results in serving without confirmed payment.

Security model

Checks before settlement

Every settlement attempt passes all six checks. Any failure returns an ApiError with a code and requestId — no partial state.

1
Replay protection

Every EIP-3009 nonce is recorded in PostgreSQL and Redis before settlement executes. Reuse of any nonce returns REPLAY_DETECTED immediately — no second settlement occurs.

2
Expiry enforcement

validBefore must be in the future at settlement time. Expired authorizations are rejected server-side before any chain interaction.

3
Amount matching

The value field in the authorization must equal maxAmountRequired from the payment requirements. Mismatches are rejected.

4
Gas price guard

Settlements are rejected if Base network gas exceeds a configured limit (default 50 gwei). This prevents facilitator drain during fee spikes.

5
Minimum floor

$0.01 USDC minimum per settlement. Sub-floor amounts are rejected before any signing occurs.

6
Stripe webhook integrity

Billing webhooks use await req.text() before JSON parsing to preserve the raw body required for Stripe signature verification. Signatures are validated via stripe.webhooks.constructEvent before any state changes.

Settlement flow

What happens on each call

01
Client signs

EIP-3009 TransferWithAuthorization. Gas-free for the user.

02
POST /verify

Checks amount, sig, nonce, expiry, gas price. Returns valid: true or error code.

03
POST /settle

Facilitator calls transferWithAuthorization on USDC. Nonce recorded.

04
Chain confirms

Base Mainnet confirms. Tx hash returned with payer metadata.

05
Receipt issued

Receipt ID tied to settled tx. Reusable for repeat access.

Evidence & audit

Evidence bundles

Every transaction produces a structured evidence bundle. Export it from the dashboard or via API for risk review, compliance, or dispute resolution.

requestId — unique per call
payer address + payTo address
asset contract + amount + chainId
txHash — on-chain reference
receiptId, mandateId, policyId
deny code (if rejected)
timestamps (initiated, settled, expired)
trace events summary
audit findings summary
Export endpoint
GET /api/v1/analytics/evidence-bundle
Authorization: Bearer $P402_API_KEY

# Query by request ID:
?requestId=req_01HX...

# Or by date range:
?from=2025-01-01&to=2025-01-31

# Response:
{
  "requestId": "req_01HX...",
  "payer": "0x...",
  "txHash": "0xabc...",
  "receiptId": "rcpt_...",
  "denyCode": null,
  "timestamps": { ... },
  "auditFindings": [ ... ]
}

Also available from the Transactions page and Audit page in the dashboard. Bulk export supported via date range.

Procurement FAQ

Common questions

Does P402 hold user funds at any point?+

No. The facilitator wallet executes transferWithAuthorization on the USDC contract. Funds move directly from the user's wallet to the treasury or resource server. The facilitator is never in the custody chain.

What happens if a settlement fails mid-flight?+

All billing events use INSERT ... ON CONFLICT to prevent duplicate charges. If the chain call fails after nonce recording, the nonce is consumed — the user must re-sign with a fresh nonce. No double charge can occur.

How are API keys stored?+

Raw API keys (p402_live_...) are returned exactly once at creation. Only the SHA-256 hash is stored. P402 cannot recover a lost key — the user must generate a new one.

Can we verify the contracts ourselves?+

Yes. All contract addresses are listed above with direct Basescan links. Source code is verifiable on-chain. Chain ID 8453 (Base Mainnet).

What is the platform fee?+

1% of each settled payment, taken at settlement time by the P402Settlement contract. See /pricing for plan-level fees and limits.

Where do I report a security issue?+

Email security@p402.io. Include reproduction steps, affected endpoint, and requestId if available. We acknowledge within 24 hours.