{
  "schemaVersion": "agent-transaction-guard-verification-v3",
  "resource": "agent-transaction-guard",
  "method": "POST",
  "path": "/api/v1/base/usdc/guard",
  "input": {
    "schemaVersion": "base-usdc-transfer-intent-v3",
    "strictRootFields": ["transaction", "mandate"],
    "callerPolicyAccepted": false,
    "transaction": {
      "strictFields": [
        "type",
        "chainId",
        "from",
        "to",
        "data",
        "value",
        "nonce",
        "gasLimit",
        "maxFeePerGasWei",
        "maxPriorityFeePerGasWei",
        "accessList"
      ],
      "type": "0x2",
      "chainId": 8453,
      "officialToken": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "allowedOperation": "transfer(address,uint256)",
      "nativeValue": "0"
    },
    "mandate": {
      "strictFields": ["message", "signature"],
      "messageFields": [
        "issuer",
        "sender",
        "token",
        "recipient",
        "amountAtomic",
        "unsignedTxDigest",
        "maxTotalFeeWei",
        "notBefore",
        "validUntil",
        "nonce",
        "audience"
      ],
      "scheme": "EIP-712/secp256k1",
      "domain": {
        "name": "ProofOfUtilityAgentGuardMandate",
        "version": "1",
        "chainId": 8453,
        "salt": "keccak256(canonical public HTTPS origin + /api/v1/base/usdc/guard)",
        "verifyingContractFieldPresent": false
      },
      "ownerAuthorizationRequired": true,
      "maximumValiditySeconds": 300,
      "maximumNotBeforeFutureSkewSeconds": 30,
      "durableSingleUseNonce": true,
      "policyDerivation": "The server derives recipient, amount, validity, and total-fee policy only from a verified mandate. A caller-supplied policy is rejected."
    },
    "neverInclude": [
      "private key material",
      "seed phrase",
      "signed transaction",
      "x402 payment authorization",
      "session secret"
    ]
  },
  "authorization": {
    "issuerTrust": "out-of-band-pin-required",
    "audienceTrust": "out-of-band-pin-required",
    "issuerRule": "Signature recovery authenticates an address but does not make it trusted. The client must compare it with an independently pinned expected issuer.",
    "audienceResource": "https://tollary.p-e.kr/api/v1/base/usdc/guard",
    "audienceRule": "message.audience and the EIP-712 domain salt are keccak256 of the exact canonical HTTPS Guard resource.",
    "issuerPlacement": "The mandate issuer belongs in a user approval flow, deterministic control plane, HSM policy service, or other component separated from the transaction-building agent.",
    "nonceRule": "The paid endpoint durably reserves message.nonce before payment. Reuse or conflicting binding is rejected; the free lint endpoint does not reserve it."
  },
  "decision": {
    "successfulValues": ["ALLOW", "BLOCK"],
    "allowMeaning": "The exact unsigned transaction and owner mandate passed structural and paid state checks at the evidence time and only until signBy.",
    "blockMeaning": "A structural BLOCK is free. A BLOCK derived from RPC state is a completed paid result.",
    "identity": {
      "field": "guardId",
      "algorithm": "sha256",
      "purpose": ["content-identity", "deduplication", "receipt-binding"]
    },
    "reasonCodesRequired": true
  },
  "inspectionLayers": {
    "freeLint": {
      "path": "/api/v1/base/usdc/guard/lint",
      "checksSignedMandate": true,
      "usesRpc": false,
      "reservesMandateNonce": false,
      "canRequestPayment": false
    },
    "paidStateGate": {
      "path": "/api/v1/base/usdc/guard",
      "price": "$0.01 USDC",
      "structuralBlockCharged": false,
      "stateAllowOrBlockCharged": true
    }
  },
  "networkEvidence": {
    "schemaVersion": "base-usdc-guard-rpc-v3",
    "chainIdHex": "0x2105",
    "minimumIndependentRpcAgreement": 2,
    "canonicalSafe": {
      "purpose": "Stable audit evidence independently pinned by two RPC operators.",
      "includes": ["block", "timestamp", "age", "safe-head-lag", "provider-operator"]
    },
    "executionRecent": {
      "purpose": "Fresh state used for nonce, balance, token state, simulation, gas, and fee checks immediately before signing.",
      "includes": ["block", "timestamp", "age", "latest-head-lag", "provider-operator"]
    },
    "signBy": {
      "field": "verification.signBy",
      "maximumSecondsAfterVerification": 10,
      "rule": "The client must finish exact-byte signing and broadcast before signBy; expiry cannot be extended by recovery."
    },
    "finalityVocabulary": ["included", "safe", "finalized"]
  },
  "clientEnforcement": {
    "referenceSdk": "https://tollary.p-e.kr/sdk/guarded-viem-3.0.0.mjs",
    "referenceSdkManifest": "https://tollary.p-e.kr/sdk/guarded-viem.manifest.json",
    "x402PurchaseClient": "https://tollary.p-e.kr/sdk/guard-client-1.0.0.mjs",
    "x402PurchaseClientManifest": "https://tollary.p-e.kr/sdk/guard-client.manifest.json",
    "isolatedSignerRequired": true,
    "expectedIssuerRequired": true,
    "exactSignedTransactionRequired": true,
    "rule": "Compare every unsigned field and digest before signing, decode the returned signed bytes, recover the sender, and compare every guarded field again before broadcast. A raw signer path available to the agent defeats the guard."
  },
  "responseAttestation": {
    "algorithm": "Ed25519",
    "header": "agent-transaction-guard-attestation",
    "signedField": "guardId",
    "pinningRequired": true,
    "rule": "Pin the public descriptor through an independently authenticated channel. PAYMENT-RESPONSE remains separate x402 settlement evidence."
  },
  "paymentBoundary": {
    "listedPrice": "$0.01",
    "asset": "USDC",
    "proofDoesNotAttestX402Settlement": true,
    "requiredSettlementEvidence": "PAYMENT-RESPONSE",
    "unsignedInspectionCannotSettle": true,
    "receiptRecovery": "/api/v1/base/usdc/guard/receipts/{paymentIdentifier}",
    "settlementCycle": "/api/v1/base/usdc/guard/receipts/{paymentIdentifier}/settlement",
    "settlementAuthorization": "Authorization: Bearer {paymentIdentifier}",
    "bearerSecretRule": "Treat the payment identifier, receipt URL, and settlement Authorization value as secrets. Never publish or log them."
  },
  "activation": {
    "targetTransactionNetwork": "Base Mainnet",
    "paymentEnvironment": "Base Sepolia testnet",
    "testTokenHasRealValue": false,
    "testTokenCountsAsRevenue": false,
    "mainnetActivation": "disabled",
    "runtimeAuthority": "/api/product",
    "rule": "Static discovery never authorizes payment. Re-read runtime metadata and a current unsigned PAYMENT-REQUIRED challenge before any purchase."
  },
  "serviceBoundary": {
    "noKeyHandling": true,
    "noSigning": true,
    "noBroadcast": true,
    "noCustody": true,
    "noRecipientIdentityAttestation": true,
    "noInvestmentAdvice": true,
    "noSettlementGuarantee": true
  }
}
