<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>AsterPay</title>
        <link>https://paragraph.com/@asterpay</link>
        <description>undefined</description>
        <lastBuildDate>Sat, 07 Nov 2026 05:43:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[First IACPHook with Third-Party Attestation: AsterPay KYA + InsumerAPI]]></title>
            <link>https://paragraph.com/@asterpay/first-iacphook-with-third-party-attestation-asterpay-kya-insumerapi</link>
            <guid>5mdvCBnxhPajgvUeQZfR</guid>
            <pubDate>Tue, 10 Mar 2026 12:05:45 GMT</pubDate>
            <description><![CDATA[The Problem: AI Agents Can't Prove Who They AreAgentic commerce is growing fast. AI agents are buying API access, reserving compute, paying for data — all autonomously. ERC-8183 gives these agents a standard way to discover, negotiate, and settle jobs on-chain through the Agentic Commerce Protocol (ACP). But there's a gap. When an agent shows up to work a job, how does the client know:Is this wallet sanctioned?Does the operator have real-world identity verification?Does the agent actually hol...]]></description>
            <content:encoded><![CDATA[<h2 id="h-the-problem-ai-agents-cant-prove-who-they-are" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Problem: AI Agents Can't Prove Who They Are</h2><p>Agentic commerce is growing fast. AI agents are buying API access, reserving compute, paying for data — all autonomously. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-8183">ERC-8183</a> gives these agents a standard way to discover, negotiate, and settle jobs on-chain through the Agentic Commerce Protocol (ACP).</p><p>But there's a gap. When an agent shows up to work a job, how does the client know:</p><ul><li><p>Is this wallet sanctioned?</p></li><li><p>Does the operator have real-world identity verification?</p></li><li><p>Does the agent actually hold the funds it claims?</p></li><li><p>Is there any reputation signal beyond on-chain history?</p></li></ul><p>Without answers, every interaction is a trust-fall. A client either accepts anyone (risky) or builds custom verification for every provider (expensive).</p><h2 id="h-the-solution-iacphook-third-party-attestations" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Solution: IACPHook + Third-Party Attestations</h2><p>ERC-8183 includes a powerful extension point: <code>IACPHook</code>. Hooks run <code>beforeAction</code> and <code>afterAction</code> callbacks on every job lifecycle event — <code>setProvider</code>, <code>fund</code>, <code>complete</code>, <code>dispute</code>. They're the enforcement layer.</p><p>AsterPay's KYA Hook is the first <code>IACPHook</code> implementation that consumes a third-party attestation API as part of its trust scoring.</p><h2 id="h-how-insumerapi-attestations-work" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How InsumerAPI Attestations Work</h2><p>You send conditions in, you get cryptographically signed results out. What matters for integrators is the output format and the guarantees it provides.</p><p><strong>What the JWT contains</strong></p><p>Every <code>POST /v1/attest</code> call with <code>format: "jwt"</code> returns an ES256-signed JWT. The payload contains:</p><ul><li><p><code>pass</code> (boolean) — true only when ALL conditions are met</p></li><li><p><code>results</code> (array) — one entry per condition, each with:</p><ul><li><p><code>met</code> (boolean) — whether this specific condition passed</p></li><li><p><code>evaluatedCondition</code> — the fully resolved condition that was checked</p></li><li><p><code>conditionHash</code> — SHA-256 of the canonical (sorted-key) JSON of <code>evaluatedCondition</code></p></li><li><p><code>blockNumber</code> and <code>blockTimestamp</code> — the chain state at evaluation time</p></li></ul></li><li><p>Standard JWT claims: <code>iss</code>, <code>sub</code> (wallet address), <code>jti</code>, <code>iat</code>, <code>exp</code> (+1800s)</p></li></ul><p><strong>What "tamper-evident" means</strong></p><p>The <code>conditionHash</code> is a SHA-256 hash of the exact condition logic that was evaluated, with keys sorted alphabetically before hashing. A verifier can recompute this hash from the <code>evaluatedCondition</code> object. If anyone modifies a condition result after signing, the recomputed hash won't match and verification fails.</p><p>The ECDSA signature covers the entire payload, so modifying any field invalidates the signature.</p><p><strong>The 4 verification checks</strong></p><p><code>insumer-verify</code> (zero dependencies) runs 4 checks:</p><ol><li><p>ES256 signature verified against JWKS</p></li><li><p>Condition hash integrity — each conditionHash matches its evaluatedCondition</p></li><li><p>Block freshness — blockTimestamp within maxAge seconds of now</p></li><li><p>JWT expiry — exp claim has not elapsed</p></li></ol><h2 id="h-jwks-jwt-architecture" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">JWKS / JWT Architecture</h2><p>InsumerAPI signs all attestations with a single ECDSA P-256 key:</p><ul><li><p>Algorithm: ES256 (ECDSA with P-256 and SHA-256)</p></li><li><p>Key ID: <code>insumer-attest-v1</code></p></li><li><p>JWKS (API): <code>https://api.insumermodel.com/v1/jwks</code> (24h cache headers)</p></li><li><p>JWKS (static): <code>https://insumermodel.com/.well-known/jwks.json</code></p></li></ul><p>The JWT is a standard ES256 JWT. Any library or gateway that supports ES256 + JWKS can verify it. <code>insumer-verify</code> adds condition hash integrity and block freshness checks on top.</p><h2 id="h-how-insumerapi-fits-the-trust-score" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How InsumerAPI Fits the Trust Score</h2><p>The AsterPay Trust Score has 7 components, each weighted:</p><table style="min-width: 75px"><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Component</p></th><th colspan="1" rowspan="1"><p>Max Points</p></th><th colspan="1" rowspan="1"><p>Source</p></th></tr><tr><td colspan="1" rowspan="1"><p>Wallet age</p></td><td colspan="1" rowspan="1"><p>15</p></td><td colspan="1" rowspan="1"><p>RPC — block history</p></td></tr><tr><td colspan="1" rowspan="1"><p>Wallet activity</p></td><td colspan="1" rowspan="1"><p>15</p></td><td colspan="1" rowspan="1"><p>RPC — transaction count</p></td></tr><tr><td colspan="1" rowspan="1"><p>Sanctions clean</p></td><td colspan="1" rowspan="1"><p>20</p></td><td colspan="1" rowspan="1"><p>Chainalysis Oracle</p></td></tr><tr><td colspan="1" rowspan="1"><p>ERC-8004 identity</p></td><td colspan="1" rowspan="1"><p>20</p></td><td colspan="1" rowspan="1"><p>On-chain registry + <strong>InsumerAPI country</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Operator KYB</p></td><td colspan="1" rowspan="1"><p>20</p></td><td colspan="1" rowspan="1"><p>Manual whitelist / <strong>InsumerAPI Coinbase KYC</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Transaction history</p></td><td colspan="1" rowspan="1"><p>5</p></td><td colspan="1" rowspan="1"><p>AsterPay DB + <strong>InsumerAPI Gitcoin Passport</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Trust bond</p></td><td colspan="1" rowspan="1"><p>5</p></td><td colspan="1" rowspan="1"><p><strong>InsumerAPI USDC balance</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Total</strong></p></td><td colspan="1" rowspan="1"><p><strong>100</strong></p></td><td colspan="1" rowspan="1"><br></td></tr></tbody></table><p>InsumerAPI provides signal for 4 of the 7 components — without requiring the agent operator to go through a manual KYB process.</p><h3 id="h-the-attestation-call" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">The Attestation Call</h3><p>One API call, 4 conditions, 1 credit:</p><pre data-type="codeBlock" text="const response = await fetch('https://api.insumermodel.com/v1/attest', {
  method: 'POST',
  headers: {
    'X-API-Key': apiKey,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    wallet: agentAddress,
    conditions: [
      { type: 'token_balance', contractAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', chainId: 8453, threshold: 100, decimals: 6, label: 'USDC on Base &gt;= 100' },
      { type: 'eas_attestation', template: 'coinbase_verified_account', label: 'Coinbase KYC verified' },
      { type: 'eas_attestation', template: 'coinbase_verified_country', label: 'Coinbase country verified' },
      { type: 'eas_attestation', template: 'gitcoin_passport_score', label: 'Gitcoin Passport score' },
    ],
    format: 'jwt',
  }),
});"><code><span class="hljs-keyword">const</span> <span class="hljs-variable constant_">response</span> = await <span class="hljs-title function_ invoke__">fetch</span>(<span class="hljs-string">'https://api.insumermodel.com/v1/attest'</span>, {
  <span class="hljs-attr">method</span>: <span class="hljs-string">'POST'</span>,
  <span class="hljs-attr">headers</span>: {
    <span class="hljs-string">'X-API-Key'</span>: apiKey,
    <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>,
  },
  <span class="hljs-attr">body</span>: JSON.<span class="hljs-title function_ invoke__">stringify</span>({
    <span class="hljs-attr">wallet</span>: agentAddress,
    <span class="hljs-attr">conditions</span>: [
      { <span class="hljs-attr">type</span>: <span class="hljs-string">'token_balance'</span>, <span class="hljs-attr">contractAddress</span>: <span class="hljs-string">'0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'</span>, <span class="hljs-attr">chainId</span>: <span class="hljs-number">8453</span>, <span class="hljs-attr">threshold</span>: <span class="hljs-number">100</span>, <span class="hljs-attr">decimals</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">'USDC on Base &gt;= 100'</span> },
      { <span class="hljs-attr">type</span>: <span class="hljs-string">'eas_attestation'</span>, <span class="hljs-attr">template</span>: <span class="hljs-string">'coinbase_verified_account'</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">'Coinbase KYC verified'</span> },
      { <span class="hljs-attr">type</span>: <span class="hljs-string">'eas_attestation'</span>, <span class="hljs-attr">template</span>: <span class="hljs-string">'coinbase_verified_country'</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">'Coinbase country verified'</span> },
      { <span class="hljs-attr">type</span>: <span class="hljs-string">'eas_attestation'</span>, <span class="hljs-attr">template</span>: <span class="hljs-string">'gitcoin_passport_score'</span>, <span class="hljs-attr">label</span>: <span class="hljs-string">'Gitcoin Passport score'</span> },
    ],
    <span class="hljs-attr">format</span>: <span class="hljs-string">'jwt'</span>,
  }),
});</code></pre><h3 id="h-mapping-conditions-to-score-components" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Mapping Conditions to Score Components</strong></h3><p><strong>Coinbase KYC → Operator KYB (up to 15 points)</strong></p><p>The hardest signal to get without manual review. If the operator wallet has a Coinbase verified account attestation on-chain (via EAS on Base), we know a real person passed identity verification. Combined with ERC-8004 registration, this yields 15/20 KYB points.</p><p><strong>Country Verification → Identity (up to 20 points)</strong></p><p>Country attestation stacks with ERC-8004 registration. An agent with both on-chain identity and verified jurisdiction gets full identity points.</p><p><strong>Gitcoin Passport → Reputation (up to 4 points)</strong></p><p>For agents without AsterPay transaction history, Gitcoin Passport provides a cross-platform reputation signal.</p><p><strong>USDC Balance → Trust Bond (5 points)</strong></p><p>Cryptographically attested token balance — the agent provably holds USDC on Base. No RPC call needed from our side; InsumerAPI handles the on-chain lookup and signs the result.</p><h2 id="h-live-example" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Live Example</strong></h2><p>The integration is live in production:</p><p>{</p><p>"trustScore": 34,</p><p>"tier": "verified",</p><p>"breakdown": {</p><p>"walletAge": 8,</p><p>"walletActivity": 6,</p><p>"sanctionsClean": 20,</p><p>"erc8004Identity": 0,</p><p>"operatorKyb": 0,</p><p>"transactionHistory": 0,</p><p>"trustBond": 0,</p><p>"total": 34</p><p>},</p><p>"insumerAttestation": {</p><p>"available": true,</p><p>"tokenBalance": { "pass": false, "label": "USDC on Base &gt;= 100" },</p><p>"coinbaseKyc": { "pass": false, "label": "Coinbase KYC verified" },</p><p>"coinbaseCountry": { "pass": false, "label": "Coinbase country verified" },</p><p>"gitcoinPassport": { "pass": false, "label": "Gitcoin Passport score" },</p><p>"signatureValid": true,</p><p>"checkedAt": "2026-03-10T09:35:46.004Z"</p><p>}</p><p>}</p><p>Even when all InsumerAPI conditions return <code>false</code>, the JWT signature is verified (<code>signatureValid: true</code>), and the agent still scores from on-chain signals. An agent with Coinbase KYC + ERC-8004 + USDC balance + Gitcoin Passport could score up to <strong>85/100</strong> (Enterprise tier) — purely from automated, cryptographically verified signals.</p><h2 id="h-how-to-integrate-insumerapi-into-your-own-iacphook" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>How to Integrate InsumerAPI into Your Own IACPHook</strong></h2><p><strong>Step 1: Get an API Key</strong> — Free tier: 100 daily reads + 10 attestation credits.</p><p><strong>Step 2: Define Your Conditions</strong> — Use templates for EAS attestations (<code>coinbase_verified_account</code>, <code>coinbase_verified_country</code>, <code>gitcoin_passport_score</code>). Up to 10 conditions per request, 1 credit.</p><p><strong>Step 3: Call the Attestation API</strong> — <code>POST /v1/attest</code> with your conditions and <code>format: "jwt"</code>.</p><p><strong>Step 4: Verify the JWT</strong> — <code>npm install insumer-verify</code> or use any ES256 JWT library with the JWKS endpoint.</p><p><strong>Step 5: Map Results</strong> — Each condition result has <code>met: true/false</code>. Cache the JWT (30-minute TTL).</p><h2 id="h-whats-next" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>What's Next</strong></h2><ul><li><p><strong>NFT ownership + Farcaster ID</strong> — additional trust score components</p></li><li><p><strong>On-chain oracle publishing</strong> — trust score consumable by any smart contract on Base</p></li><li><p><strong>Configurable thresholds</strong> — per-client minimum scores per condition</p></li></ul><h2 id="h-source-code" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Source Code</strong></h2><ul><li><p><strong>KYA Hook contracts</strong>: <a target="_blank" rel="noopener noreferrer" class="dont-break-out" href="https://github.com/AsterPay/erc8183-kya-hook">github.com/AsterPay/erc8183-kya-hook</a></p></li><li><p><strong>InsumerAPI docs</strong>: <a target="_blank" rel="noopener noreferrer" class="dont-break-out" href="https://insumermodel.com/developers">insumermodel.com/developers</a></p></li><li><p><strong>insumer-verify</strong>: <a target="_blank" rel="noopener noreferrer" class="dont-break-out" href="https://www.npmjs.com/package/insumer-verify">npmjs.com/package/insumer-verify</a></p></li><li><p><strong>ERC-8183 spec</strong>: <a target="_blank" rel="noopener noreferrer" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-8183">eips.ethereum.org/EIPS/eip-8183</a></p></li></ul><hr><p><em>AsterPay is the Trust Layer for AI Agent Payments — 5 shields, one API. InsumerAPI provides privacy-preserving on-chain verification across 32 blockchains.</em></p>]]></content:encoded>
            <author>asterpay@newsletter.paragraph.com (AsterPay)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f6527451b051c8e4effdf51f26c28a6e25f4e50c220f54819153395fcb249087.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>