<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Douglas Borthwick</title>
    <description>The latest articles on DEV Community by Douglas Borthwick (@douglasborthwickcrypto).</description>
    <link>https://dev.to/douglasborthwickcrypto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3790350%2Faa27cd63-7a48-41a3-8d98-459bfecf44fa.png</url>
      <title>DEV Community: Douglas Borthwick</title>
      <link>https://dev.to/douglasborthwickcrypto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/douglasborthwickcrypto"/>
    <language>en</language>
    <item>
      <title>Your Agent Doesn't Need an API Key</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Wed, 20 May 2026 14:31:50 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/your-agent-doesnt-need-an-api-key-5ee4</link>
      <guid>https://dev.to/douglasborthwickcrypto/your-agent-doesnt-need-an-api-key-5ee4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Every AI agent today carries secret strings.&lt;/strong&gt; Open its &lt;code&gt;.env&lt;/code&gt; file and you will see them. &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;. &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;. &lt;code&gt;STRIPE_SECRET_KEY&lt;/code&gt;. Whoever holds those strings gets the access. That is the entire authentication model. After running our own agent for a few months, we got tired of it, so we shipped something else. It is on-chain. You can verify it on Basescan in two minutes.&lt;/p&gt;

&lt;p&gt;API keys authenticate &lt;em&gt;possession of a secret&lt;/em&gt;. Wallet signatures authenticate &lt;em&gt;control of a wallet&lt;/em&gt;. That distinction is the whole article.&lt;/p&gt;

&lt;p&gt;A secret is a thing that exists somewhere. It can be copied. It can be exfiltrated. It can be checked into a public repository by accident at 11pm on a Friday and sit there indexed by every crawler on the internet by Monday morning. The string itself is the authentication; whoever holds it is the legitimate user, as far as the API can tell.&lt;/p&gt;

&lt;p&gt;A signature is not a reusable secret. It is a proof, generated on the spot, that whoever wrote this specific message also holds the private key for this specific wallet. The signature can be safely transmitted in cleartext. There is nothing in it that lets the recipient impersonate the signer. The signing key never moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents are already good at signing
&lt;/h2&gt;

&lt;p&gt;Humans hate wallets. Humans forget passwords, lose hardware devices, paste seed phrases into the wrong channel, and get phished by emails that look exactly like the real ones. That aversion is the load-bearing reason wallet auth never replaced passwords for consumer login. Wallets are hard for humans, and it is a real reason.&lt;/p&gt;

&lt;p&gt;Agents are not humans. For an agent, signing a message is a function call. The signing library is already in the runtime because the agent already uses a wallet for payments. The marginal cost of using the same wallet to sign API requests is zero. The thing that made wallet auth a non-starter for humans is the thing that makes it natural for agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;We dogfooded it on our own API first, so we could speak from the experience of running it rather than describing what it might look like.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent's wallet sends 5 USDC to our platform wallet on Base. That buys 125 attestation credits, the unit one &lt;code&gt;/v1/attest&lt;/code&gt; call consumes.&lt;/li&gt;
&lt;li&gt;The agent POSTs the transaction hash to a single endpoint at &lt;code&gt;api.insumermodel.com&lt;/code&gt;. In one response, the API returns an API key string &lt;strong&gt;and&lt;/strong&gt; mints a non-transferable access pass to the same wallet on-chain.&lt;/li&gt;
&lt;li&gt;For every subsequent &lt;code&gt;/v1/attest&lt;/code&gt; call, the agent has two options. Present the API key in an &lt;code&gt;X-API-Key&lt;/code&gt; header, the way every API has worked since the early 2000s. Or sign a fresh message with its wallet's private key and put the signature in an &lt;code&gt;Authorization: Wallet&lt;/code&gt; header. No reusable secret crosses the wire. Other endpoints currently require &lt;code&gt;X-API-Key&lt;/code&gt;; we'll expand wallet auth to them in later stages as their billing and write paths are reviewed for wallet-identity callers.&lt;/li&gt;
&lt;li&gt;Our backend verifies the signature, confirms the wallet holds the access pass, debits one credit, and returns an ECDSA-signed attestation that anyone with the published key can verify offline.&lt;/li&gt;
&lt;li&gt;No bearer secret ever transmitted. The signing key stays in the agent's runtime. The wallet sits where it is. The pass does not move.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Authentication becomes signing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the whole pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  The token is not the payment
&lt;/h2&gt;

&lt;p&gt;The token is the proof the wallet belongs to a legitimate customer.&lt;/p&gt;

&lt;p&gt;This is where the design gets interesting, and where it would be easy to confuse two things that need to stay separate.&lt;/p&gt;

&lt;p&gt;The pass is a &lt;strong&gt;membership&lt;/strong&gt;. It proves that the wallet has paid for an InsumerAPI account at some point. It lives in the wallet permanently. It does not expire when credits run out. It does not have to be re-issued. If the agent stops using the account, the pass sits there. If it comes back a year later and tops up, the same pass is still there.&lt;/p&gt;

&lt;p&gt;Credits are &lt;strong&gt;consumption&lt;/strong&gt;. The agent buys a batch, uses them up on attestation calls, buys more. When they run out, the API returns a 402 with a clear path to top up. The wallet itself does not change. The pass is unaffected.&lt;/p&gt;

&lt;p&gt;That separation matters because it lets the token act as a portable trust signal without coupling the holder to anybody's billing system. A third party building an API can check whether a wallet holds the pass and treat that as a soft signal that this wallet is a real customer of a real verification service, without needing to talk to us about anything, without OAuth federation, without shared databases, without a live API coordination round-trip.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The token is not the payment. The token is the proof the wallet belongs to a legitimate customer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can see the collection on Basescan: &lt;a href="https://basescan.org/address/0x3E2a408cc6eceba04FF9d04A5B8B05aBa8DD50ce" rel="noopener noreferrer"&gt;&lt;code&gt;0x3E2a408cc6eceba04FF9d04A5B8B05aBa8DD50ce&lt;/code&gt;&lt;/a&gt;. The settler wallet that mints to customers is owned by us. Customers only ever receive passes.&lt;/p&gt;

&lt;p&gt;Issuers can deploy an access collection from any NFT factory, or write their own. We used &lt;a href="https://rnwy.com" rel="noopener noreferrer"&gt;RNWY&lt;/a&gt;'s on Base for ours: &lt;a href="https://basescan.org/address/0x7ee64394904968629F93039585c3Fc8562691F31" rel="noopener noreferrer"&gt;&lt;code&gt;0x7ee64394...&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The proof you can check yourself
&lt;/h2&gt;

&lt;p&gt;Last night, our test agent's wallet, starting with $6 of USDC and a few cents of Base ETH for gas, ran the loop end to end. The four transactions sitting on Base mainnet are the public record. Anyone with the right amount of USDC can repeat the exercise.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USDC payment&lt;/strong&gt;, test wallet to platform wallet: &lt;a href="https://basescan.org/tx/0xf873f5e6b5d9d00efb9ef163317f59f0f66fd8b8826e1230c78c87fe88d1d6f2" rel="noopener noreferrer"&gt;&lt;code&gt;0xf873f5e6...&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pass mint&lt;/strong&gt; to the same wallet: &lt;a href="https://basescan.org/tx/0x6cb43ea1374d16e9b76bc4f6ff82989b7b43e7870f7adb06a5a3bc991813368d" rel="noopener noreferrer"&gt;&lt;code&gt;0x6cb43ea1...&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holder address&lt;/strong&gt;: &lt;a href="https://basescan.org/address/0x259e32F4b53130003c8c364f49cE2EA9Cda5B671" rel="noopener noreferrer"&gt;&lt;code&gt;0x259e32F4...&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collection&lt;/strong&gt;: &lt;a href="https://basescan.org/address/0x3E2a408cc6eceba04FF9d04A5B8B05aBa8DD50ce" rel="noopener noreferrer"&gt;&lt;code&gt;0x3E2a408c...&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We then revoked the pass from the test wallet and tried to authenticate again. The API rejected the request with the exact message it should: &lt;em&gt;wallet does not hold an Insumer Access pass.&lt;/em&gt; The negative path works too. The whole cycle is repeatable.&lt;/p&gt;

&lt;p&gt;And the signed attestations themselves are not just checkable today. Every response is signed against a public key published at our JWKS endpoint. Anyone holding the response, today, tomorrow, or years from now, can verify the signature offline against that key, without calling our service at verification time. The bytes are tamper-evident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in the wallet's evolution
&lt;/h2&gt;

&lt;p&gt;Wallets started as places to hold crypto. Then they became login systems. &lt;a href="https://login.xyz/" rel="noopener noreferrer"&gt;Sign-in-with-Ethereum&lt;/a&gt; has been a standard since 2021. Now they are becoming machine authenticators.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The wallet is the natural credential.&lt;br&gt;
The signature is the natural authentication primitive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent is the natural user. There is no human in the loop to lose a hardware device or forget a passphrase. The runtime signs in milliseconds, every time, without complaint. That progression has been visible in the standards conversations for a while. Mastercard is &lt;a href="https://insumermodel.com/blog/mastercard-ai-agent-payment-standard-on-chain-verification.html" rel="noopener noreferrer"&gt;drafting an agent-payment standard&lt;/a&gt;. NIST is running &lt;a href="https://insumermodel.com/blog/nist-nccoe-ai-agent-identity-submission.html" rel="noopener noreferrer"&gt;workshops on agent identity&lt;/a&gt;. Coinbase is &lt;a href="https://insumermodel.com/blog/coinbase-agentic-market-agents-need-wallet-auth.html" rel="noopener noreferrer"&gt;opening agentic markets&lt;/a&gt; that assume agents will arrive with wallets attached. The shape is settling. We are one of several teams arguing that wallet-signed authentication will end up doing for agents what OAuth did for delegated human login.&lt;/p&gt;

&lt;h2&gt;
  
  
  We are not replacing API keys
&lt;/h2&gt;

&lt;p&gt;Humans will keep using API keys for a long time. For the typical developer, with a handful of services and a personal laptop, the API key model works. It is familiar. It is supported by every client library. The marginal benefit of switching is small.&lt;/p&gt;

&lt;p&gt;What we shipped is purely additive. The &lt;code&gt;X-API-Key&lt;/code&gt; header still works on every endpoint. Every existing customer sees zero behavioral change. We are not pushing anyone to switch. We are not killing the old path. We are not requiring wallets.&lt;/p&gt;

&lt;p&gt;But agents are different. Agents already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sign,&lt;/li&gt;
&lt;li&gt;transact,&lt;/li&gt;
&lt;li&gt;hold wallets,&lt;/li&gt;
&lt;li&gt;persist identity across sessions,&lt;/li&gt;
&lt;li&gt;and operate continuously, without human supervision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For software with those properties, wallet-based authentication is often the more natural primitive. The asymmetry between human pain and machine ease, the one that kept wallet auth out of consumer login, runs in the opposite direction when the user is autonomous code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The category, in our terms
&lt;/h2&gt;

&lt;p&gt;The primitive is &lt;strong&gt;wallet auth&lt;/strong&gt;: read wallet state, evaluate conditions, return a &lt;em&gt;signed boolean&lt;/em&gt;. The category is &lt;strong&gt;condition-based access&lt;/strong&gt;. A single signed call can stack up to 10 conditions across 37 chains, mixing ERC-20 balances, NFT ownership, EAS attestations, and Farcaster identity in any combination. Agent API auth is one stack among many. An SDK adopter who wants to gate on the access pass &lt;em&gt;and&lt;/em&gt; an EAS attestation &lt;em&gt;and&lt;/em&gt; a Pudgy Penguin can ask for that exact compound in one call.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can do this for your own API
&lt;/h2&gt;

&lt;p&gt;We built this for ourselves first because we wanted to feel the operational friction of running it before recommending it to anybody else. It went into production yesterday. The next step is letting other APIs do the same thing without having to write the middleware from scratch.&lt;/p&gt;

&lt;p&gt;Our sister company, &lt;a href="https://skyemeta.com" rel="noopener noreferrer"&gt;Skye Meta&lt;/a&gt;, ships a free, MIT-licensed npm package for exactly this, called &lt;a href="https://www.npmjs.com/package/@skyemeta/access" rel="noopener noreferrer"&gt;&lt;code&gt;@skyemeta/access&lt;/code&gt;&lt;/a&gt;. One line to install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @skyemeta/access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is either-or middleware. API-key requests pass through unchanged. Wallet-signed requests are verified through InsumerAPI's &lt;code&gt;/v1/attest&lt;/code&gt; endpoint under the hood. Your existing customers see zero change. Your agent customers get a path that does not require them to manage a secret string. Bring your own InsumerAPI key, pick the access collection of your choice, and wrap your existing route handlers with the supplied middleware.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://insumermodel.com/developers/quickstart/" rel="noopener noreferrer"&gt;developer quickstart&lt;/a&gt; walks through grabbing a free InsumerAPI key (10 attestation credits, 100 requests per day, no credit card) and the first &lt;code&gt;/v1/attest&lt;/code&gt; call. The package source is on GitHub at &lt;a href="https://github.com/douglasborthwick-crypto/skyemeta-access" rel="noopener noreferrer"&gt;douglasborthwick-crypto/skyemeta-access&lt;/a&gt;. If you would rather skip the middleware and call the underlying InsumerAPI primitive directly, the &lt;a href="https://insumermodel.com/developers/api-reference/" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; documents every endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ending
&lt;/h2&gt;

&lt;p&gt;The first generation of APIs authenticated software with shared secrets. The next generation may authenticate software with signatures instead.&lt;/p&gt;

&lt;p&gt;Last night, our own agent's wallet paid for access, received a pass, signed a request, and successfully authenticated, without ever transmitting a reusable secret. The transactions are public. The pattern works.&lt;/p&gt;

&lt;p&gt;We are not arguing that every API should switch tomorrow. We are arguing that, for the subset of API consumers that are autonomous software with wallets, the more natural primitive is now available and on-chain, and the cost of trying it is the price of one cup of coffee.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://insumermodel.com/blog/your-agent-doesnt-need-an-api-key.html" rel="noopener noreferrer"&gt;insumermodel.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Wallet Auth Now Reads Tron, Stellar, Sui, and XDC</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Thu, 14 May 2026 18:56:51 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/wallet-auth-now-reads-tron-stellar-sui-and-xdc-24in</link>
      <guid>https://dev.to/douglasborthwickcrypto/wallet-auth-now-reads-tron-stellar-sui-and-xdc-24in</guid>
      <description>&lt;p&gt;&lt;strong&gt;Stablecoin settlement runs through Tron. Tokenized money market funds issue on Stellar. Object-native value lives on Sui. Trade finance is collateralizing on XDC. Four chains. Four different storage models. Four different reasons to be there. Wallet auth reads all of them now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The chain count moved from 33 to 37 this week. That is not the headline. The headline is what the new four represent: four economic environments that look nothing like each other underneath, all answering to the same signed boolean on the way out.&lt;/p&gt;

&lt;p&gt;InsumerAPI's primitive is wallet auth. Read on-chain state, evaluate against caller-supplied conditions, return an ECDSA-signed attestation. Conditions in. Signed attestations out. The contract surface for a relying agent or service is one POST to &lt;code&gt;/v1/attest&lt;/code&gt; and one signature to check against the public JWKS. What changes when a new chain ships is not that surface. It is the set of things the surface can answer about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tron: where USDT actually moves
&lt;/h2&gt;

&lt;p&gt;USDT on Tron is the largest stablecoin venue on chain by transfer volume. The supply of USDT-TRC20 has, at various points across 2025 and into 2026, exceeded the supply of USDT on every other chain combined. Remittance corridors in Southeast Asia, Latin America, and parts of Africa default to it. Centralized exchanges treat it as the canonical deposit rail.&lt;/p&gt;

&lt;p&gt;If an agent's job is to evaluate whether a counterparty wallet can settle in dollars, ignoring Tron means ignoring the largest dollar venue on chain. The new &lt;code&gt;tronWallet&lt;/code&gt; parameter on &lt;code&gt;POST /v1/attest&lt;/code&gt; and &lt;code&gt;POST /v1/trust&lt;/code&gt; closes that gap. Pass a T-prefixed base58 address, set &lt;code&gt;chainId&lt;/code&gt; to &lt;code&gt;"tron"&lt;/code&gt;, and the attestation returns the same shape as every other chain. Native TRX uses &lt;code&gt;contractAddress: "native"&lt;/code&gt;. TRC-20 tokens use a T-prefixed contract address. USDT-TRC20 lives at &lt;code&gt;TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&lt;/code&gt;, six decimals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stellar: where tokenized US Treasuries issue
&lt;/h2&gt;

&lt;p&gt;Stellar hosts BENJI, Franklin Templeton's tokenized US Government Money Market Fund (the on-chain wrapper of FOBXX). BENJI is one of the largest tokenized money market funds in circulation. Holders receive the underlying fund's yield. Redemption is in-fund. The token tracks the share price. BENJI on Stellar is a classic trustline asset, not a smart-contract balance.&lt;/p&gt;

&lt;p&gt;Stellar also hosts Circle's classic-trustline USDC, distinct from any Soroban contract version. Wallet auth reads the classic trustline state, because that is the issuer-anchored deposit ledger that BENJI and USDC actually live on. Pass a G-prefixed StrKey wallet, set &lt;code&gt;chainId&lt;/code&gt; to &lt;code&gt;"stellar"&lt;/code&gt;, and add an &lt;code&gt;assetCode&lt;/code&gt; field for trustline tokens (&lt;code&gt;"USDC"&lt;/code&gt;, &lt;code&gt;"BENJI"&lt;/code&gt;). The signed attestation comes back with &lt;code&gt;ledgerIndex&lt;/code&gt; and &lt;code&gt;ledgerHash&lt;/code&gt; alongside the boolean. Soroban contract balances are out of scope for this release.&lt;/p&gt;

&lt;p&gt;The USDC issuer on Stellar is &lt;code&gt;GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN&lt;/code&gt;. The BENJI issuer is &lt;code&gt;GBJW74JRHIIIYC3X3J5VKLR2CR4UJHKO76V5J5SAYTUFAUE7PJBKCT5R&lt;/code&gt;. Pass either as the &lt;code&gt;contractAddress&lt;/code&gt;, pair with the matching &lt;code&gt;assetCode&lt;/code&gt;, and the trustline state is the read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sui: object-native USDC
&lt;/h2&gt;

&lt;p&gt;Sui runs on the Move language, and Move does not think about balances the way EVM does. There is no contract holding a mapping from address to amount. There are objects, owned by addresses, with types. USDC on Sui is a &lt;code&gt;Coin&amp;lt;USDC&amp;gt;&lt;/code&gt; object type. Reading how much USDC a wallet holds means summing the wallet's owned objects of that type.&lt;/p&gt;

&lt;p&gt;Circle deployed native USDC on Sui in 2024, and the deployment has expanded supply through 2025 and into 2026, with growing integration on Cetus, Navi, and Sui's institutional rails. The &lt;code&gt;contractAddress&lt;/code&gt; for a Sui token is the fully-qualified Move type string. For USDC on Sui, that is &lt;code&gt;0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC&lt;/code&gt;. Pass a 64-hex-character &lt;code&gt;suiWallet&lt;/code&gt;, set &lt;code&gt;chainId&lt;/code&gt; to &lt;code&gt;"sui"&lt;/code&gt;, and the attestation comes back with &lt;code&gt;checkpointSequence&lt;/code&gt; and &lt;code&gt;checkpointDigest&lt;/code&gt; binding the read to a specific Sui consensus checkpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  XDC: enterprise EVM where trade finance settles
&lt;/h2&gt;

&lt;p&gt;XDC (&lt;code&gt;chainId: 50&lt;/code&gt;) is the EVM chain banks actually point at. It is the only EVM ledger with native ISO 20022 message-format compatibility, which is the standard banks already use for cross-border wire and clearing instructions. That alignment is why the TradeFinex consortium runs there and why a growing pile of tokenized trade-finance assets, factoring receivables, and institutional RWAs issue on XDC rather than on consumer-DeFi EVM venues. The economic identity is different from a Base or an Arbitrum: it is the venue where regulated cash-flow instruments tokenize.&lt;/p&gt;

&lt;p&gt;Because XDC accepts standard EVM tooling, every condition type works without any chain-specific wrapper. Add &lt;code&gt;chainId: 50&lt;/code&gt; to a condition that already worked on another EVM chain and it evaluates the same way. No new wallet parameter. No new address shape. The same &lt;code&gt;wallet&lt;/code&gt; field handles it. Merkle proofs (EIP-1186 storage proofs) are available for &lt;code&gt;token_balance&lt;/code&gt; conditions on XDC, the same as on the other EVM chains whose RPC supports &lt;code&gt;eth_getProof&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trust profile got a new dimension
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;POST /v1/trust&lt;/code&gt; returns a multi-dimensional fact profile. The previous shape had four base dimensions: stablecoins (USDC and USDT across 21 EVM chains), governance, NFTs, and staking. Optional &lt;code&gt;solanaWallet&lt;/code&gt;, &lt;code&gt;xrplWallet&lt;/code&gt;, and &lt;code&gt;bitcoinWallet&lt;/code&gt; would tack on Solana, XRPL, and Bitcoin dimensions when those wallets were supplied.&lt;/p&gt;

&lt;p&gt;This release adds a fifth base dimension that runs on every call: &lt;code&gt;institutional_stablecoins&lt;/code&gt;. Eight checks spanning EVM, Solana, XRPL, Stellar, and Sui. The inventory covers Société Générale-FORGE's EURCV on Ethereum, Solana, and XRPL; FORGE's USDCV on Ethereum and Solana; Circle's classic-trustline USDC on Stellar; Franklin Templeton's BENJI on Stellar; and Circle's native USDC on Sui. The five EVM/Solana/XRPL checks resolve from the standard wallet fields. The three Stellar and Sui checks activate when &lt;code&gt;stellarWallet&lt;/code&gt; and &lt;code&gt;suiWallet&lt;/code&gt; are passed.&lt;/p&gt;

&lt;p&gt;Optional &lt;code&gt;tronWallet&lt;/code&gt; adds a separate &lt;code&gt;tron&lt;/code&gt; dimension covering USDT-TRC20. Up to 49 checks across 27 chains in a single signed profile. No score. No opinion. Just verifiable evidence organized by dimension.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did not change
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;/v1/attest&lt;/code&gt; envelope is byte-identical for existing callers. The signature scheme is unchanged: ECDSA P-256, &lt;code&gt;kid: "insumer-attest-v1"&lt;/code&gt;, JWKS at &lt;code&gt;/v1/jwks&lt;/code&gt;. The JWT format (set &lt;code&gt;format: "jwt"&lt;/code&gt; on the request body) returns an ES256 token verifiable by any standard JWT library. Existing integrations on EVM, Solana, XRPL, and Bitcoin keep working with zero code changes. The four new wallet fields and the new &lt;code&gt;chainId&lt;/code&gt; enum values are additive optionals.&lt;/p&gt;

&lt;p&gt;That non-event is the point. Wallet auth as a primitive is meant to abstract chain differences. If adding four chains had broken the envelope, the primitive would have failed its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Available today
&lt;/h2&gt;

&lt;p&gt;All four chains are live in production at &lt;a href="https://api.insumermodel.com" rel="noopener noreferrer"&gt;api.insumermodel.com&lt;/a&gt;. The SDK family shipped the same day: &lt;a href="https://www.npmjs.com/package/insumer-verify" rel="noopener noreferrer"&gt;&lt;code&gt;insumer-verify@1.4.4&lt;/code&gt;&lt;/a&gt; (npm), &lt;a href="https://www.npmjs.com/package/mcp-server-insumer" rel="noopener noreferrer"&gt;&lt;code&gt;mcp-server-insumer@1.10.0&lt;/code&gt;&lt;/a&gt; (npm), &lt;a href="https://www.npmjs.com/package/@insumermodel/plugin-eliza" rel="noopener noreferrer"&gt;&lt;code&gt;@insumermodel/plugin-eliza@2.1.0&lt;/code&gt;&lt;/a&gt; (npm), &lt;a href="https://pypi.org/project/langchain-insumer/" rel="noopener noreferrer"&gt;&lt;code&gt;langchain-insumer@0.11.0&lt;/code&gt;&lt;/a&gt; (PyPI), and &lt;a href="https://pypi.org/project/llama-index-tools-insumer/" rel="noopener noreferrer"&gt;&lt;code&gt;llama-index-tools-insumer@0.3.0&lt;/code&gt;&lt;/a&gt; (PyPI). The OpenAPI spec, ChatGPT Custom GPT action schema, and &lt;code&gt;llms.txt&lt;/code&gt; agent-discovery files all reflect the 37-chain surface.&lt;/p&gt;

&lt;p&gt;The free tier at &lt;a href="https://insumermodel.com/developers/" rel="noopener noreferrer"&gt;insumermodel.com/developers&lt;/a&gt; grants 10 verification credits, which is enough to run a multi-chain trust profile call against a wallet that touches Tron, Stellar, Sui, and EVM, then inspect the &lt;code&gt;institutional_stablecoins&lt;/code&gt; dimension end to end. Add &lt;code&gt;tronWallet&lt;/code&gt;, &lt;code&gt;stellarWallet&lt;/code&gt;, and &lt;code&gt;suiWallet&lt;/code&gt; to the same request body and the response composes everything in one signed envelope.&lt;/p&gt;

&lt;p&gt;The full chain list and per-chain condition shapes live in the &lt;a href="https://insumermodel.com/developers/api-reference/" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; and the &lt;a href="https://insumermodel.com/developers/trust/" rel="noopener noreferrer"&gt;trust profile docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>ai</category>
      <category>payments</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Condition-Based Access for Machine Payments Protocol: A Signed Yes-or-No Before the Charge</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Thu, 07 May 2026 13:35:59 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/condition-based-access-for-machine-payments-protocol-a-signed-yes-or-no-before-the-charge-3cpm</link>
      <guid>https://dev.to/douglasborthwickcrypto/condition-based-access-for-machine-payments-protocol-a-signed-yes-or-no-before-the-charge-3cpm</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is pre-transaction gating: a signed yes-or-no before any machine payment executes. MPP routes charge money. &lt;code&gt;@insumermodel/mppx-condition-gate&lt;/code&gt; puts that yes-or-no in front of any charge: wallets that meet your conditions get a free-access receipt referencing a per-call signed attestation, everyone else falls through to the normal paid path. First listed entry on Tempo's &lt;code&gt;/extensions&lt;/code&gt; page (PR #445, merged March 23). The primitive underneath is the same wallet auth that backs every other InsumerAPI surface: read → evaluate → sign.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/tempoxyz/mpp" rel="noopener noreferrer"&gt;Machine Payments Protocol&lt;/a&gt; (MPP) gives every payment method a typed shape. A &lt;code&gt;Method.Server&lt;/code&gt; returns a Promise that resolves to a payment receipt. &lt;a href="https://www.npmjs.com/package/@insumermodel/mppx-condition-gate" rel="noopener noreferrer"&gt;&lt;code&gt;@insumermodel/mppx-condition-gate&lt;/code&gt;&lt;/a&gt; sits in front of any &lt;code&gt;Method.Server&lt;/code&gt; and inserts one decision before the charge runs.&lt;/p&gt;

&lt;p&gt;If the requesting wallet meets the configured conditions, the gate returns a free-access receipt that references a per-call signed attestation. If it does not, control falls through to the original &lt;code&gt;Method.Server&lt;/code&gt;, and the charge proceeds normally.&lt;/p&gt;

&lt;p&gt;Tempo's MPP documentation lists &lt;code&gt;@insumermodel/mppx-condition-gate&lt;/code&gt; as the first entry on its &lt;a href="https://github.com/tempoxyz/mpp/pull/445" rel="noopener noreferrer"&gt;&lt;code&gt;/extensions&lt;/code&gt; page&lt;/a&gt;, merged March 23, 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap MPP leaves open
&lt;/h2&gt;

&lt;p&gt;MPP already carries the payer's wallet on every request. Each payment credential includes a &lt;code&gt;credential.source&lt;/code&gt; field shaped like &lt;code&gt;did:pkh:eip155:8453:0xABC...&lt;/code&gt;. The chain ID and address are part of the request envelope.&lt;/p&gt;

&lt;p&gt;What MPP does not provide is the layer that decides whether a particular wallet should be charged at all. There is no native pattern for "this wallet meets a configured condition, give it a free receipt." Without an adapter, every &lt;code&gt;Method.Server&lt;/code&gt; that wants this behavior has to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse the DID format&lt;/li&gt;
&lt;li&gt;Maintain RPC endpoints across however many chains it cares about&lt;/li&gt;
&lt;li&gt;Run its own ownership and attestation checks&lt;/li&gt;
&lt;li&gt;Cache the result&lt;/li&gt;
&lt;li&gt;Decide what to return when the check fails&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most projects skip the work. The ones that do build it end up reimplementing the same plumbing the next project will reimplement next month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four condition types
&lt;/h2&gt;

&lt;p&gt;The package exposes one function. Hand it any &lt;code&gt;Method.Server&lt;/code&gt; and a list of conditions. v2.0 supports four condition types. Mix any of them in a single call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Mppx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tempo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mppx/server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;conditionGate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@insumermodel/mppx-condition-gate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tempoCharge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tempo&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0xYourAddress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gatedCharge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;conditionGate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tempoCharge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INSUMER_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;matchMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;any&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// Token holders pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token_balance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;contractAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0xYourToken&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// NFT holders pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nft_ownership&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;contractAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0xYourNFT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8453&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Coinbase-verified wallets pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eas_attestation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;coinbase_verified_account&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8453&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Wallets with a Farcaster account pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;farcaster_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mppx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Mppx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;gatedCharge&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a request lands, &lt;code&gt;conditionGate&lt;/code&gt; extracts the wallet from &lt;code&gt;credential.source&lt;/code&gt;, calls &lt;a href="https://insumermodel.com/developers/verification/" rel="noopener noreferrer"&gt;&lt;code&gt;POST /v1/attest&lt;/code&gt;&lt;/a&gt; with that wallet and the conditions, and looks at the result.&lt;/p&gt;

&lt;p&gt;If any of the conditions are met (or all of them, when &lt;code&gt;matchMode: 'all'&lt;/code&gt;), the gate returns a receipt where the &lt;code&gt;reference&lt;/code&gt; field is &lt;code&gt;condition-gate:free:{attestationId}&lt;/code&gt;. The signed attestation is retrievable by ID, the receipt itself just points to it.&lt;/p&gt;

&lt;p&gt;If no conditions are met, or the API is unreachable, the gate calls the original &lt;code&gt;Method.Server&lt;/code&gt;'s &lt;code&gt;verify&lt;/code&gt; and lets the payment proceed normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the adapter does not do
&lt;/h2&gt;

&lt;p&gt;The adapter does not re-sign the attestation. The signature on the result is the one InsumerAPI produced, the adapter passes it through unchanged.&lt;/p&gt;

&lt;p&gt;The adapter does not wrap the attestation in a second envelope. The receipt's &lt;code&gt;reference&lt;/code&gt; field carries the attestation ID as a plain string, the attestation itself is retrievable byte-identical to what a direct &lt;code&gt;curl&lt;/code&gt; to &lt;code&gt;/v1/attest&lt;/code&gt; would produce.&lt;/p&gt;

&lt;p&gt;The adapter does not introduce a second signing key. There is no MPP-side or adapter-side root key that signs anything. The only signature in the chain is the one from InsumerAPI's per-call signing.&lt;/p&gt;

&lt;p&gt;The adapter does not call back to InsumerAPI for verification. Any downstream service can check the signature offline against the public &lt;a href="https://insumermodel.com/.well-known/jwks.json" rel="noopener noreferrer"&gt;JWKS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The signed primitive stays untouched. The adapter is plumbing. It translates between MPP's request shape and the wallet auth call. It is not an actor that produces its own claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this shape composes
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Method.Server&lt;/code&gt; is the right composition point. Every MPP payment method ships one. So the same &lt;code&gt;conditionGate&lt;/code&gt; adapter applies to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tempo charges&lt;/li&gt;
&lt;li&gt;Stripe charges&lt;/li&gt;
&lt;li&gt;Any other &lt;code&gt;Method.Server&lt;/code&gt; built on the MPP interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is also framework-agnostic. The adapter never touches request routing. It takes a &lt;code&gt;Method.Server&lt;/code&gt; in and returns a &lt;code&gt;Method.Server&lt;/code&gt; out. So the same package works under:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hono&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;li&gt;Elysia&lt;/li&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Any other framework that consumes an MPP server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it is non-destructive. The adapter sits before the original &lt;code&gt;verify&lt;/code&gt;, on miss it falls through to the original &lt;code&gt;Method.Server&lt;/code&gt;. Adding it to a paid route does not break the paid path, it only adds a free path for wallets that meet the configured conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying offline
&lt;/h2&gt;

&lt;p&gt;Every result that comes out of the attest call carries an ECDSA P-256 signature and a key ID (&lt;code&gt;kid&lt;/code&gt;). The signing key is published at &lt;a href="https://insumermodel.com/.well-known/jwks.json" rel="noopener noreferrer"&gt;insumermodel.com/.well-known/jwks.json&lt;/a&gt;. Any party that has the attestation can verify the signature against that JWKS using any standard JOSE library. No callback to InsumerAPI required.&lt;/p&gt;

&lt;p&gt;If you ask for &lt;code&gt;jwt: true&lt;/code&gt; in the options, the same result also comes back as a standard ES256 JWT with the signed attestation as JWT claims. That turns the output into a drop-in bearer token. Any service that already verifies JWTs can verify the gate result without learning anything new.&lt;/p&gt;

&lt;p&gt;Each result is a boolean per condition. Met or unmet. &lt;strong&gt;Boolean, not balance.&lt;/strong&gt; The gate tells you whether the wallet meets the configured condition, never how much it holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chains and pricing
&lt;/h2&gt;

&lt;p&gt;InsumerAPI covers &lt;strong&gt;33 chains&lt;/strong&gt; today: 30 EVM (Ethereum, Base, Polygon, Arbitrum, Optimism, BNB, Avalanche, and 23 more), plus Solana, XRPL, and Bitcoin. Token and NFT conditions evaluate on any of these. EAS conditions evaluate on EVM chains. Farcaster ID conditions always evaluate on Optimism.&lt;/p&gt;

&lt;p&gt;The wallet holder pays nothing at the gated route. The operator running the gate pays per attestation call out of the API key's credit balance.&lt;/p&gt;

&lt;p&gt;Two ways to provision a key. &lt;code&gt;POST /v1/keys/create&lt;/code&gt; takes an email and ships 10 free attestation credits, no credit card. &lt;code&gt;POST /v1/keys/buy&lt;/code&gt; takes a USDC, USDT, or BTC transfer and provisions a key in one call. The transaction sender wallet is the identity, the payment is the auth. No email, no human in the loop. The first path is the natural fit for human-managed deployments, the second for an autonomous agent inside the gate.&lt;/p&gt;

&lt;p&gt;Top up an existing key on-chain via &lt;code&gt;POST /v1/credits/buy&lt;/code&gt;: USDC or USDT on any major EVM chain, USDC on Solana, or BTC on Bitcoin. Same rails the &lt;code&gt;Method.Server&lt;/code&gt; underneath sits on, same self-serve loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits
&lt;/h2&gt;

&lt;p&gt;The wallet auth primitive does not change shape when it lands inside MPP. It still reads on-chain state, evaluates conditions, and returns a signed boolean. &lt;code&gt;@insumermodel/mppx-condition-gate&lt;/code&gt; is the thin adapter that lets MPP routes ask for that boolean across token, NFT, EAS, and Farcaster conditions before deciding whether to charge. Tempo's extensions page is the first listed surface. The shape extends to any payment-route platform that exposes a &lt;code&gt;Method.Server&lt;/code&gt;-style interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before a machine pays, it should qualify.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>blockchain</category>
      <category>payments</category>
      <category>ai</category>
    </item>
    <item>
      <title>How InsumerAPI Powers SkyeGate Lite</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Tue, 05 May 2026 13:21:56 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/how-insumerapi-powers-skyegate-lite-3327</link>
      <guid>https://dev.to/douglasborthwickcrypto/how-insumerapi-powers-skyegate-lite-3327</guid>
      <description>&lt;p&gt;&lt;a href="https://skyemeta.com/blog/skyegate-lite-now-on-wordpress/" rel="noopener noreferrer"&gt;SkyeGate Lite is now live on WordPress.org&lt;/a&gt;. It runs on InsumerAPI. The primitive is wallet auth: read, evaluate, sign. &lt;strong&gt;Boolean, not balance.&lt;/strong&gt; Verified yes or no. This is what InsumerAPI provides, and what a product like SkyeGate stands on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wallet auth, defined
&lt;/h2&gt;

&lt;p&gt;Wallet auth is to a wallet what OAuth is to an account. It is a primitive for proving access. The difference is what it proves. OAuth proves who the user is. Wallet auth proves what the wallet holds.&lt;/p&gt;

&lt;p&gt;A caller sends conditions. A token balance threshold. An NFT held. An EAS attestation present. A chain of these, combined into one boolean. InsumerAPI reads chain state, evaluates the conditions, and signs the verdict. The response is one boolean per condition.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Verified yes or no. Boolean, not balance.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the signed verdict carries
&lt;/h2&gt;

&lt;p&gt;Every verdict from InsumerAPI is an ES256 JWT. ECDSA over P-256, the same cryptographic shape used in modern web standards. The payload is short. Pass or fail per condition. A condition hash for tamper detection. An expiration. The issuer (&lt;code&gt;https://api.insumermodel.com&lt;/code&gt;). A signing key identifier (&lt;code&gt;insumer-attest-v1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The signing key is published at &lt;a href="https://api.insumermodel.com/.well-known/jwks.json" rel="noopener noreferrer"&gt;https://api.insumermodel.com/.well-known/jwks.json&lt;/a&gt;. Anyone can fetch it. Anyone can re-verify any verdict, end to end, without asking InsumerAPI again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three properties products inherit
&lt;/h2&gt;

&lt;p&gt;A product running on InsumerAPI inherits three things by virtue of using the primitive.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic.&lt;/strong&gt; Same wallet, same conditions, same chain state. Same verdict. No model drift. No scoring opinion. No judgment call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-end verifiable.&lt;/strong&gt; The signature is from InsumerAPI, not from the product. A product cannot forge a pass even if it wanted to, because anyone can re-verify the JWT against the public JWKS endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No consumer secrets in the loop.&lt;/strong&gt; The primitive does not accept and cannot use consumer credentials. There is nothing to phish, rotate, store, or leak.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A product like SkyeGate gets all three properties by design, not by discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  No secrets, no identity-first, no static credentials
&lt;/h2&gt;

&lt;p&gt;This is the narrative core. A visitor connects a wallet and supplies a public address. That is the entire input on the consumer side. There is no password. No email. No API key on the consumer side. No shared secret between the merchant and the customer. There is no identity claim at all. Only what the wallet holds.&lt;/p&gt;

&lt;p&gt;The merchant inherits this property automatically. A merchant running on InsumerAPI cannot accidentally introduce consumer-secret leakage, because the primitive does not accept consumer secrets to begin with. The failure mode wallet auth removes from the surface is the failure mode every credential-based gate suffers from. Storing consumer secrets that someone, somewhere, eventually leaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provable and private
&lt;/h2&gt;

&lt;p&gt;Both properties have to coexist or the primitive does not work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provable.&lt;/strong&gt; A merchant or end user can take any verdict and re-verify it against the public JWKS using only public information. The verdict cannot be forged. The condition cannot be silently changed, because the condition hash catches it. InsumerAPI itself cannot rewrite history, because the signature pins the verdict to the moment it was issued.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private.&lt;/strong&gt; The verdict is a boolean. It does not say how much is in the wallet, what else is held, who the user is, what other addresses they control, or what they have done. A merchant gating ETH at a 0.1 threshold learns yes or no. Not the balance. Not the wallet history. Not the identity. &lt;em&gt;Boolean, not balance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provable and private.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Condition-based access, one primitive, many surfaces
&lt;/h2&gt;

&lt;p&gt;SkyeGate is one product on top of the primitive. It runs on WordPress.&lt;/p&gt;

&lt;p&gt;The same primitive also slices. SkyeGate Lite, the free WordPress plugin, exposes one condition per gate. SkyeGate, the paid version, exposes up to ten conditions chained into one boolean. Both run on the same &lt;code&gt;/v1/attest&lt;/code&gt; call. The primitive does not change. The product chooses the slice.&lt;/p&gt;

&lt;p&gt;The same primitive runs other surfaces too. SkyeWoo gates WooCommerce. AgentTalk handles agent-to-agent calls. Same boolean, same JWKS, different transport. Any HTTP-speaking client can call &lt;code&gt;/v1/attest&lt;/code&gt;, get back a signed verdict, and gate whatever it gates.&lt;/p&gt;

&lt;p&gt;The primitive scales sideways. New surfaces do not require a new primitive. They require a new consumer of the same primitive. A signed boolean is portable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;SkyeGate Lite is free on WordPress.org. The &lt;a href="https://skyemeta.com/blog/skyegate-lite-now-on-wordpress/" rel="noopener noreferrer"&gt;SkyeMeta announcement&lt;/a&gt; walks through install and the first shortcode.&lt;/p&gt;

&lt;p&gt;Or build your own consumer. POST conditions to &lt;code&gt;/v1/attest&lt;/code&gt;, verify the returned JWT against the JWKS endpoint, and gate whatever your stack gates. The full reference is at &lt;a href="https://insumermodel.com/developers/api-reference/" rel="noopener noreferrer"&gt;/developers/api-reference/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>webdev</category>
      <category>security</category>
      <category>api</category>
    </item>
    <item>
      <title>Add Wallet Auth from Claude Code in One Command</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Tue, 28 Apr 2026 15:42:58 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/add-wallet-auth-from-claude-code-in-one-command-4b93</link>
      <guid>https://dev.to/douglasborthwickcrypto/add-wallet-auth-from-claude-code-in-one-command-4b93</guid>
      <description>&lt;p&gt;You are building something in Claude Code. A discount flow that requires holding a specific token. An AI agent that will not move money for unverified wallets. An NFT-gated dashboard. The wallet auth piece is fiddly. Chain RPCs, contract calls, signature verification, edge cases. One Smithery skill turns it into one command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install once, ask Claude
&lt;/h2&gt;

&lt;p&gt;The skill lives at &lt;a href="https://smithery.ai/skills/douglasborthwick/insumer-skill" rel="noopener noreferrer"&gt;smithery.ai/skills/douglasborthwick/insumer-skill&lt;/a&gt;. Add it to Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;smithery skill add douglasborthwick/insumer-skill &lt;span class="nt"&gt;--agent&lt;/span&gt; claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That registers the skill at the project level. &lt;code&gt;--global&lt;/code&gt; registers it across every project on the machine. The skill works the same way across the rest of the agent ecosystem: &lt;code&gt;--agent cursor&lt;/code&gt;, &lt;code&gt;--agent codex&lt;/code&gt;, &lt;code&gt;--agent windsurf&lt;/code&gt;, &lt;code&gt;--agent cline&lt;/code&gt;, and others.&lt;/p&gt;

&lt;p&gt;Once installed, ask Claude what you want. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Add a check that gates this endpoint on holders of at least 100 USDC on Base.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Verify this wallet owns the Pudgy Penguins NFT before letting them claim.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Before this agent moves money, pull a trust profile and require it to score above the warning threshold.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Add a delegated-authority check using delegate.xyz.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Verify an EAS attestation on the wallet before approving the transaction.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude reads the skill, picks the right endpoint, writes the call, parses the signed response, and adds JWKS verification so the result holds up offline. You review the diff and ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude knows after installing
&lt;/h2&gt;

&lt;p&gt;The skill is procedural knowledge, readable in full on Smithery before you install. It teaches Claude six things that are easy to get wrong otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pick the right endpoint.&lt;/strong&gt; &lt;code&gt;POST /v1/attest&lt;/code&gt; when the developer specifies the exact condition (token balance, NFT ownership, delegated authority, EAS attestation, USDC threshold). &lt;code&gt;POST /v1/trust&lt;/code&gt; when the developer wants a curated multi-dimension profile across 21 EVM chains plus Solana, XRPL, and Bitcoin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the signature.&lt;/strong&gt; Every response carries an ECDSA P-256 signature under &lt;code&gt;kid: insumer-attest-v1&lt;/code&gt;. The skill makes Claude verify against the published JWKS at &lt;code&gt;https://insumermodel.com/.well-known/jwks.json&lt;/code&gt;, never trust the raw JSON body.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boolean, not balance.&lt;/strong&gt; The skill stops Claude from leaking raw balances to the client. Standard mode returns a signed yes or no plus the condition hash. The actual chain read happens server-side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use stable kid pinning.&lt;/strong&gt; The skill pins &lt;code&gt;kid: insumer-attest-v1&lt;/code&gt; as the primary signing key and shows Claude how to resolve future kids through the JWKS endpoint without breaking offline verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never inline the API key.&lt;/strong&gt; The skill enforces &lt;code&gt;process.env.INSUMER_API_KEY&lt;/code&gt; server-side only. No browser fetches. No keys in source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the right primitives for the right layer.&lt;/strong&gt; Wallet auth is condition-based access. The skill stops Claude from confusing it with WalletConnect (UX layer), wagmi or viem (RPC layer), or SIWE / EIP-4361 (proof of ownership). Different primitives, different jobs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you get back from a call
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;/v1/attest&lt;/code&gt; response is a signed envelope. The shape Claude will write against:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"attestation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wallet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pass"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"erc20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"met"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"evaluatedCondition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"conditionHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blockNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19234567&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blockTimestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1745000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"issuedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1745000003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1745001803&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"insumer-attest-v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The verification is portable. Any service downstream of the agent can re-verify the signature against the public JWKS without calling the API back. The condition hash lets the caller confirm the verdict is for the exact condition they asked about, not a substituted one. The block number and timestamp pin the read to a specific point in chain history.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 33 chains buys you
&lt;/h2&gt;

&lt;p&gt;Coverage is the boring part of wallet auth that bites you in production. The skill knows the live surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;26 EVM chains&lt;/strong&gt; with optional Merkle storage proofs (Ethereum, Base, Arbitrum, Optimism, Polygon, BNB Chain, Avalanche, and others).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 more EVM chains&lt;/strong&gt; without proofs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana&lt;/strong&gt; for SPL token holdings and SOL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XRPL&lt;/strong&gt; for trust lines and stablecoin holdings (RLUSD, USD-issued lines).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bitcoin&lt;/strong&gt; for native BTC holdings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a developer asks Claude to verify a condition on a chain the API does not cover, the skill instructs Claude to surface that explicitly rather than fabricate an integration. The list of supported chains lives in the skill's reference data, not in Claude's training-time memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free key, no signup
&lt;/h2&gt;

&lt;p&gt;The first thing the skill tells Claude to do is mint a free key. The flow is one curl, no email confirmation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.insumermodel.com/v1/keys/create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"email":"you@example.com","appName":"my-project","tier":"free"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes a &lt;code&gt;key&lt;/code&gt; starting with &lt;code&gt;insr_live_&lt;/code&gt;. Drop it in &lt;code&gt;.env&lt;/code&gt; as &lt;code&gt;INSUMER_API_KEY&lt;/code&gt;. The free tier comes with 10 starter credits plus 100 &lt;code&gt;/v1/attest&lt;/code&gt; calls per day, enough to wire up an integration end-to-end and ship the first version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits with the rest of the agent stack
&lt;/h2&gt;

&lt;p&gt;The Smithery skill is one of several integration paths into InsumerAPI. Pick whichever matches the stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smithery skill&lt;/strong&gt; — the post you are reading. Best when the developer is in Claude Code, Cursor, Codex, Windsurf, or another Smithery-compatible agent and wants Claude to write the integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; — when the agent needs typed tools at runtime, not procedural guidance at code-write time. &lt;code&gt;npx -y mcp-server-insumer&lt;/code&gt;, 27 tools across 33 chains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LlamaIndex toolkit&lt;/strong&gt; — for Python agents on LlamaIndex or LangGraph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAPI Actions&lt;/strong&gt; — load openapi.yaml directly into a custom GPT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All four hit the same endpoints, return the same signed envelopes, and verify against the same JWKS.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The transport changes; the primitive does not.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is a good fit for Claude Code in particular
&lt;/h2&gt;

&lt;p&gt;Claude Code already writes most of the boilerplate. The hard part of wallet auth is not the boilerplate. It is the parts most LLMs get subtly wrong: confusing wallet auth with wallet connection, validating a JWT but not the underlying signature, picking the wrong endpoint, asking for a balance when a boolean is the right contract. The skill closes that gap. Claude reads the rules, writes correct integration code the first time, and the diff is small enough to review in a minute.&lt;/p&gt;

&lt;p&gt;If you are sitting in Claude Code right now, the install is one command. The next thing Claude writes will be the integration you actually wanted.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>agents</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Coinbase Agentic.Market Opens: Agents Need Wallet Auth, Not Just Tools</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Mon, 27 Apr 2026 00:04:44 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/coinbase-agenticmarket-opens-agents-need-wallet-auth-not-just-tools-5831</link>
      <guid>https://dev.to/douglasborthwickcrypto/coinbase-agenticmarket-opens-agents-need-wallet-auth-not-just-tools-5831</guid>
      <description>&lt;p&gt;Coinbase just launched &lt;a href="https://www.coinbase.com/developer-platform/discover/launches/agentic-market" rel="noopener noreferrer"&gt;Agentic.Market&lt;/a&gt;, a marketplace where AI agents discover tools, transact autonomously, and settle payments using the x402 protocol. Agents can browse services, negotiate terms, and execute payments without human intervention. The infrastructure is live. Agentic.Market proves agents can pay. It doesn't prove they should be trusted. Payment rails solve settlement. They don't solve counterparty risk. That's the gap wallet auth fills, and it's what POST /v1/trust was built for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Agentic.Market Actually Launched
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.coinbase.com/developer-platform/discover/launches/agentic-market" rel="noopener noreferrer"&gt;Agentic.Market&lt;/a&gt; is Coinbase's new marketplace for autonomous agent commerce. Agents discover services, evaluate pricing, and complete transactions server-to-server using x402, the open standard for agent payments. The protocol standardizes how agents pay for API calls, data feeds, and compute services using USDC or other stablecoins.&lt;/p&gt;

&lt;p&gt;The market is aimed at agent builders who need their agents to autonomously procure resources: language model inference, data retrieval, blockchain indexing, oracle feeds, compute cycles. Instead of developers pre-funding API accounts with credit cards, agents operate their own wallets and pay per request.&lt;/p&gt;

&lt;p&gt;This is a big unlock. Agents can now discover and purchase capabilities at runtime, not just use what their creator hard-coded. The vision is agent-to-agent commerce at scale. One agent sells compute. Another buys it. Settlement happens on-chain. No human approval loop.&lt;/p&gt;

&lt;p&gt;But autonomy creates a trust problem. When an agent shows up at your API endpoint with a wallet and a payment, how do you know it's safe to serve the request? You need more than proof of payment. You need context about what kind of wallet this is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Payment Rails Are Not Enough for Agent Commerce
&lt;/h2&gt;

&lt;p&gt;x402 solves the payment side: the agent proves it can pay, the service delivers, settlement happens atomically. That's the easy part. The hard part is deciding &lt;em&gt;whether&lt;/em&gt; to accept the transaction in the first place.&lt;/p&gt;

&lt;p&gt;Traditional commerce has credit scoring, fraud detection, KYC, transaction history, chargebacks, dispute resolution. Agent commerce has none of that. An agent wallet shows up. It has USDC. Should you serve the request? Charge premium pricing? Require escrow? Reject it outright?&lt;/p&gt;

&lt;p&gt;You can't ask for identity. Agents don't have passports or corporate registrations. You can't rely on reputation systems that don't exist yet. You can't call the agent's creator, because the whole point is autonomous operation.&lt;/p&gt;

&lt;p&gt;What you &lt;em&gt;can&lt;/em&gt; do is read the wallet's on-chain state and evaluate it against conditions. Does it hold governance tokens? Stablecoins across multiple chains? NFTs from known projects? Has it staked assets? This is wallet auth: condition-based access against on-chain state. It's verifiable in real time, and it doesn't require the agent to disclose balances.&lt;/p&gt;

&lt;p&gt;That's what &lt;a href="https://insumermodel.com/how-it-works/" rel="noopener noreferrer"&gt;POST /v1/trust&lt;/a&gt; returns: a signed wallet auth profile with up to 40 checks across up to 7 dimensions. The base profile covers stablecoins (26 checks: 16 USDC + 10 USDT), governance tokens, NFT ownership, and staking positions. Optional Solana, XRPL, and Bitcoin holdings extend the profile when those wallets are supplied. The API reads on-chain state, evaluates the conditions, and returns a cryptographically signed result. No balances exposed. No transaction history. Just a boolean summary.&lt;/p&gt;

&lt;p&gt;For attestations like Coinbase KYC, Coinbase Verified Country, or Gitcoin Passport, the right surface is &lt;a href="https://insumermodel.com/how-it-works/" rel="noopener noreferrer"&gt;POST /v1/attest&lt;/a&gt; with custom conditions. These EAS attestations (Ethereum Attestation Service, the on-chain registry where issuers publish signed claims) sit alongside token balance thresholds in the same signed result.&lt;/p&gt;

&lt;p&gt;This is the same pattern Web2 went through. Stripe solved payments; every merchant still needed fraud detection. Plaid solved bank-account linking; every fintech still needed KYC. Settlement and trust live at different layers, and trust is where the differentiation sits. Agent commerce is the same dynamic, just on-chain. Wallet auth is to agent commerce what fraud detection was to e-commerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Integrators Use Wallet Auth in x402 Agent Commerce
&lt;/h2&gt;

&lt;p&gt;Revettr is a counterparty risk scoring service for x402 payments. Their integration pattern uses POST /v1/trust as the wallet auth signal that feeds their scoring model. Revettr doesn't write its own multi-chain logic. It consumes Insumer's signed wallet auth profile and maps it to its own counterparty tiers.&lt;/p&gt;

&lt;p&gt;This is the pattern with x402 infrastructure: payments are commoditized, wallet auth is not. Stablecoin settlement is a solved problem. Knowing whether to accept the transaction is the hard part. As we covered in &lt;a href="https://insumermodel.com/blog/ai-agents-wallet-trust-profiles-verification.html" rel="noopener noreferrer"&gt;AI Agents Need Wallet Trust Profiles Before They Handle Money&lt;/a&gt;, agents need verifiable context about their counterparties before settlement, not just proof of funds.&lt;/p&gt;

&lt;p&gt;AsterPay's KYA Hook (ERC-8183 agentic commerce) is built on POST /v1/attest with custom conditions. Token balance thresholds combined with EAS attestations like Coinbase KYC and Coinbase Verified Country feed AsterPay's trust tiering, which determines the commercial terms an agent receives at checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Merchants on Agentic.Market Actually Need
&lt;/h2&gt;

&lt;p&gt;If you're a service provider listing on Agentic.Market, here's what you need to make agent commerce work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment verification.&lt;/strong&gt; x402 gives you this. The agent proves it can pay, you deliver the service, settlement happens atomically. This is the base layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wallet auth.&lt;/strong&gt; Before you accept the transaction, you need to evaluate the counterparty wallet against your conditions: Is this a wallet I should serve? Should I charge standard pricing or require premium? Should I ask for escrow or deliver immediately? POST /v1/trust gives you this. Up to 40 checks across up to 7 dimensions. Signed result. 3 credits per call. Single-call latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit trail.&lt;/strong&gt; When an agent transaction goes wrong, you need a signed record of what the wallet looked like at the time of transaction. Insumer responses are ECDSA P-256 signed with public keys published at /.well-known/jwks.json. You can verify the signature client-side using insumer-verify (npm, zero dependencies) or server-side using any JWKS library. The signature proves the data came from Insumer and hasn't been tampered with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-chain coverage.&lt;/strong&gt; Agents operate across chains. Your wallet auth layer needs to cover all of them. Insumer supports 33 chains: 30 EVM chains (Ethereum, Base, Polygon, Arbitrum, Optimism, BNB Chain, Avalanche, and 23 others), plus Solana, XRPL, and Bitcoin. One API call, one signed profile, all chains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy by default.&lt;/strong&gt; You don't need to see raw balances. You need boolean results: does this wallet meet the threshold or not? Insumer never returns balance amounts, transaction history, or portfolio data. Just evaluated conditions and a signed yes/no.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Integrate Wallet Auth into Your Agent Commerce Flow
&lt;/h2&gt;

&lt;p&gt;If you're building a service for Agentic.Market or any x402-enabled agent platform, here's the integration pattern:&lt;/p&gt;

&lt;p&gt;Agent initiates transaction. It sends a payment proof via x402. Before you accept, you call POST /v1/trust with the agent's wallet address. Insumer returns a signed wallet auth profile. You evaluate the profile against your own merchant tiers: standard pricing, premium access, escrow-required, or reject.&lt;/p&gt;

&lt;p&gt;You serve the request or reject it. If you serve, you log the signed wallet auth profile as your audit trail. If something goes wrong later, you have cryptographic proof of what the wallet looked like at transaction time.&lt;/p&gt;

&lt;p&gt;This is not a human-in-the-loop decision. It's a server-side API call that happens before settlement. The entire flow is autonomous: agent discovers service, requests access, proves payment ability, gets evaluated against your conditions, completes transaction. No email. No KYC form. No manual approval.&lt;/p&gt;

&lt;p&gt;For AI agent platforms, the MCP server integration makes this even simpler. mcp-server-insumer (npm, also published in the &lt;a href="https://registry.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP Official Registry&lt;/a&gt;) ships 27 tools spanning attestation, wallet auth profiles, compliance templates, merchant onboarding, and credit management. The agent can call wallet_trust directly and get back a parsed signed result without the developer writing integration code. Same for LangChain agents: langchain-insumer (PyPI) ships 26 tools covering the same surface.&lt;/p&gt;

&lt;p&gt;The agent doesn't need to understand blockchain RPCs, signature verification, or multi-chain state. It just asks: does this wallet meet the conditions? The API answers with a signed boolean. The agent uses that result to make autonomous decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Agent Commerce Infrastructure
&lt;/h2&gt;

&lt;p&gt;Agentic.Market is the first major marketplace for autonomous agent commerce, but it won't be the last. &lt;a href="https://decrypt.co/365153/google-spend-185-billion-this-year-power-agentic-era-ai-ceo" rel="noopener noreferrer"&gt;Google announced up to $185 billion in AI infrastructure spend for 2026&lt;/a&gt;, with CEO Sundar Pichai framing this as the "agentic era." Agents are moving from demos to production, and production agents need to transact autonomously.&lt;/p&gt;

&lt;p&gt;Payment rails are necessary but not sufficient. Every agent commerce platform will need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Settlement infrastructure (x402, USDC, stablecoin rails)&lt;/li&gt;
&lt;li&gt;Wallet auth infrastructure (condition-based access, signed boolean verdicts, multi-chain state evaluation)&lt;/li&gt;
&lt;li&gt;Audit infrastructure (signed records, cryptographic proof, dispute resolution)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Insumer is infrastructure for number 2. We're not an x402 tool. We're the wallet auth layer x402 tools build on. Revettr's pattern consumes signed wallet auth profiles from POST /v1/trust as the input to its counterparty scoring. AsterPay's KYA Hook (ERC-8183) is built on POST /v1/attest with custom conditions for agent trust tiering. SettlementWitness's pattern published POST /v1/attest as the pre-transaction wallet auth layer in its Settlement Attestation Record (SAR) flow. Wallet auth qualifies the counterparty before payment, and SAR verifies the deliverable after.&lt;/p&gt;

&lt;p&gt;Payment infrastructure commoditizes. Wallet auth differentiates. Stablecoin settlement is a solved problem; wallet auth is the hard part. And unlike Web2 fraud detection, on-chain wallet state is verifiable, composable, and privacy-preserving. You don't need to see transaction history. You just need a signed boolean: does this wallet meet the conditions or not?&lt;/p&gt;

&lt;p&gt;That's what Insumer returns. Boolean, not balance. Verified yes or no. Provable and private. Read, evaluate, sign. No secrets. No identity-first. No static credentials. Just condition-based access for autonomous agents operating at scale.&lt;/p&gt;

&lt;p&gt;Payment rails let agents transact. Wallet auth determines whether they should. In agent commerce, that distinction becomes infrastructure.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>payments</category>
      <category>agents</category>
    </item>
    <item>
      <title>AI Agents Need Wallet Trust Profiles Before They Handle Money</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Sun, 19 Apr 2026 17:21:56 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/ai-agents-need-wallet-trust-profiles-before-they-handle-money-amj</link>
      <guid>https://dev.to/douglasborthwickcrypto/ai-agents-need-wallet-trust-profiles-before-they-handle-money-amj</guid>
      <description>&lt;p&gt;AI agents can now write code, deploy contracts, and execute payments. They still can't answer one question: &lt;strong&gt;should this wallet be trusted with money?&lt;/strong&gt; Raw capability doesn't solve that. Neither does identity. What's missing is a verification layer that runs before settlement — one that reads wallet state, evaluates conditions, and returns a signed boolean, without private keys or human approval. &lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/04/claude-opus-4.7-amazon-bedrock/" rel="noopener noreferrer"&gt;Claude Opus 4.7&lt;/a&gt; just hit 87.6% on SWE-bench Verified. Impressive, but meaningless if the agent can't prove trustworthiness before touching real money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Missing Layer in Agent Commerce
&lt;/h2&gt;

&lt;p&gt;The AI agent payment narrative focuses on rails: x402 protocol, Chainlink CRE workflows, USDC settlement. Every demo shows an agent paying for an API call, executing a transaction, or buying compute. Great. But who verifies the agent's wallet before it gets access?&lt;/p&gt;

&lt;p&gt;This is the flaw that drains treasuries and exposes wallets. Without a verification layer in front of settlement, the question isn't whether an agent system gets exploited — it's when. If an agent requests access to a service, a payment gateway, or a privileged API endpoint, the receiving system needs to answer a binary question: &lt;strong&gt;is this wallet trusted enough for this action?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not an identity problem. It's not an auth problem. It's a &lt;em&gt;condition-based access&lt;/em&gt; problem. You don't need to know &lt;em&gt;who&lt;/em&gt; the agent is. You need to know &lt;em&gt;what kind of wallet it's operating with&lt;/em&gt;. Does it hold stablecoins across multiple chains? Does it participate in governance? Does it stake assets? Has it held NFTs long-term? Those signals indicate wallet maturity, not identity.&lt;/p&gt;

&lt;p&gt;The pattern is simple and keeps appearing: &lt;strong&gt;verification before settlement&lt;/strong&gt;. Read wallet state, evaluate conditions, return a signed boolean. Read-only. No signatures. No approvals. No private keys. No human in the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What POST /v1/trust Actually Returns (and Why It's Not a Balance Check)
&lt;/h2&gt;

&lt;p&gt;POST /v1/trust is the wallet trust profile endpoint. It runs a fixed, curated set of checks across stablecoins (USDC and USDT), governance tokens, NFTs, and staking — 36 base checks across 20 chains, extensible to Solana, XRPL, and Bitcoin when those wallet types are provided. Each check returns &lt;code&gt;met: true&lt;/code&gt; or &lt;code&gt;met: false&lt;/code&gt;. No raw amounts. No balance sheet. No exposure.&lt;/p&gt;

&lt;p&gt;The response is signed using ECDSA P-256. Public keys are available at &lt;code&gt;/.well-known/jwks.json&lt;/code&gt;. Any system receiving the profile can verify the signature client-side using the insumer-verify npm package — four independent checks: signature validity, condition hash integrity, block freshness, and expiry timestamp. Zero dependencies.&lt;/p&gt;

&lt;p&gt;This is fundamentally different from POST /v1/attest, which evaluates 1-10 &lt;em&gt;custom&lt;/em&gt; conditions you define in the request. /v1/trust answers one question: &lt;strong&gt;what kind of wallet is this?&lt;/strong&gt; It refuses to sign partial data. If any check fails to complete, the entire request fails. That prevents cherry-picking signals or gaming the profile.&lt;/p&gt;

&lt;p&gt;Payment rails solved &lt;em&gt;how&lt;/em&gt; agents move money. Verification layers will determine &lt;em&gt;which&lt;/em&gt; agents are allowed to. Every agent commerce stack will need to answer that question before settlement. Most don't today.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Agents Use MCP and LangChain to Verify Wallets Autonomously
&lt;/h2&gt;

&lt;p&gt;Agents reach the verification layer two ways: the MCP server (npm: mcp-server-insumer, 26 tools, listed in Anthropic's official registry) or the LangChain toolkit (PyPI: langchain-insumer, 26 tools, exposes &lt;code&gt;WalletTrustTool&lt;/code&gt; and &lt;code&gt;AttestConditionsTool&lt;/code&gt;). An agent negotiating a transaction calls WalletTrustTool to evaluate counterparty trustworthiness before proceeding — no human in the loop.&lt;/p&gt;

&lt;p&gt;The demand signal is already here. &lt;a href="https://www.businessupturn.com/brand-post/cryptact-launches-mcp-server-for-ai-assistants/" rel="noopener noreferrer"&gt;Cryptact&lt;/a&gt; (200,000+ users) just shipped its own MCP server for read-only portfolio queries. &lt;a href="https://blog.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP crossed 97 million monthly downloads&lt;/a&gt; in March 2026. &lt;a href="https://news.bitcoin.com/tron-network-deepens-role-in-agentic-ai-infrastructure-as-b-ai-launches/" rel="noopener noreferrer"&gt;TRON's B.AI launch&lt;/a&gt; integrates ERC-8004 for agent identity and x402 for agent payments — the same stack AsterPay and Coinbase are building on. Agent commerce is consolidating around read-only, signed, cross-chain primitives. Wallet verification is one of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The x402 Ecosystem Pattern: Verification Before Settlement
&lt;/h2&gt;

&lt;p&gt;The x402 payment protocol (Coinbase's standard for agent-initiated transactions) creates a new verification layer. Agents request payment authorization. Gateways need to evaluate trust before approving settlement. This is where condition-based access infrastructure fits.&lt;/p&gt;

&lt;p&gt;AsterPay's KYA implementation is the live proof. They use ERC-8183 (the agentic commerce standard) to structure requests. Before approving EUR settlement for an AI agent transaction, AsterPay's KYA Hook fires a single POST /v1/attest call with 4 conditions: Base USDC balance, &lt;code&gt;coinbase_verified_account&lt;/code&gt;, &lt;code&gt;coinbase_verified_country&lt;/code&gt;, and &lt;code&gt;gitcoin_passport_score&lt;/code&gt;. Those 4 conditions feed 4 of 7 trust score components, contributing up to 44 out of 100 points. Higher score = lower friction. Lower score = additional verification or rejection.&lt;/p&gt;

&lt;p&gt;The AsterPay KYA Hook is the first IACPHook with third-party attestation integration. The verification happens server-side. The agent never sees the API call. It just receives approval or denial based on the trust score.&lt;/p&gt;

&lt;p&gt;Revettr does the same for counterparty risk. Their API serves wallet analysis to other platforms evaluating transaction risk. When a Revettr customer queries a wallet's risk score, Revettr calls POST /v1/trust in the background. The signed profile feeds their scoring model.&lt;/p&gt;

&lt;p&gt;SettlementWitness takes it to pre/post transaction verification (the SAR pattern: Suspicious Activity Report workflows). They call POST /v1/attest as the pre-transaction verification layer before settlement clears. If conditions aren't met, the transaction doesn't proceed.&lt;/p&gt;

&lt;p&gt;This is the x402 pattern: &lt;strong&gt;verification before settlement&lt;/strong&gt;. Not auth. Not identity. Condition-based access. Does this wallet satisfy trust thresholds? Return a signed boolean. Let the gateway decide what to do with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Wallet Verification Needs to Be Read-Only (No Approvals, No Keys)
&lt;/h2&gt;

&lt;p&gt;The hidden flaw in most agent payment systems: they require wallet approvals, signature requests, or private key exposure to verify holdings. That's a security disaster. An agent operating autonomously can't stop mid-workflow to ask a human for approval. And giving an agent access to private keys means one compromised model = drained wallet.&lt;/p&gt;

&lt;p&gt;Read-only verification solves this. InsumerAPI never requests wallet signatures. Never asks for approvals. Never touches private keys. It reads public blockchain state (token balances, NFT ownership, staking positions, trust lines), evaluates conditions, and returns a cryptographically signed result.&lt;/p&gt;

&lt;p&gt;The signed result is the proof. The ECDSA P-256 signature binds the attestation to the API's public key. Any system can verify the signature using the JWKS public key at &lt;code&gt;/.well-known/jwks.json&lt;/code&gt;. The insumer-verify npm package does this client-side with zero dependencies.&lt;/p&gt;

&lt;p&gt;The privacy model matters for agents. InsumerAPI returns booleans, not balances. An agent checking whether a wallet holds stablecoins gets back &lt;code&gt;met: true&lt;/code&gt; or &lt;code&gt;met: false&lt;/code&gt; for each chain. It doesn't see &lt;em&gt;how much&lt;/em&gt; USDC the wallet holds. It doesn't see transaction history. It doesn't see wallet connections or interaction graphs. Just threshold results.&lt;/p&gt;

&lt;p&gt;Agents operating in the x402 ecosystem need the same guarantees. Trustless verification. No balance exposure. No pivot risk. Signed results that any counterparty can independently verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Missing Piece in Agent Commerce
&lt;/h2&gt;

&lt;p&gt;AI agents don't fail because they lack capability. They fail because no one verifies them before they act.&lt;/p&gt;

&lt;p&gt;Payment rails solved movement. This layer solves permission. &lt;strong&gt;This is the missing primitive in agent commerce.&lt;/strong&gt; Verification before settlement isn't an optimization — it's the difference between autonomous systems that scale and ones that can't be trusted with money.&lt;/p&gt;

&lt;p&gt;The primitive works today. 33 chains. 24 endpoints. 100,000+ tokens verifiable. Live in production with AsterPay, Revettr, and SettlementWitness. Free tier, no credit card: &lt;a href="https://insumermodel.com/for-businesses/" rel="noopener noreferrer"&gt;start at the developer docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Wallet Auth for LlamaIndex: Condition-Based Access for AI Agents</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Thu, 16 Apr 2026 22:19:20 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/wallet-auth-for-llamaindex-condition-based-access-for-ai-agents-4lhl</link>
      <guid>https://dev.to/douglasborthwickcrypto/wallet-auth-for-llamaindex-condition-based-access-for-ai-agents-4lhl</guid>
      <description>&lt;p&gt;&lt;strong&gt;LlamaIndex ships 68 community tool integrations out of the box. Today there is a 69th: &lt;code&gt;llama-index-tools-insumer&lt;/code&gt;. Four methods, 33 chains, ECDSA-signed boolean verdicts your agent can verify offline against a public JWKS. Boolean, not balance.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an agent needs wallet auth
&lt;/h2&gt;

&lt;p&gt;Autonomous agents increasingly hold wallets, decide what to buy, decide who to trust, and decide when to act. The question &lt;em&gt;"does this wallet meet this specific on-chain condition right now?"&lt;/em&gt; is one that agents ask constantly — before discounting, before routing a payment, before admitting a counterparty to a session. Today, most agents answer it by scraping a block explorer, parsing a JSON response, and guessing. That is neither portable nor verifiable.&lt;/p&gt;

&lt;p&gt;Wallet auth collapses that question into a single tool call. The agent receives back a cryptographic artifact: a signed yes or no, bound to the exact condition that was evaluated, with a block height and a condition hash. The agent can reason over the result, pass it to a downstream service, or log it for audit — all without ever seeing the raw wallet balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped today
&lt;/h2&gt;

&lt;p&gt;One pip install, one ToolSpec, four methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;llama-index-tools-insumer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The package exposes a single &lt;code&gt;InsumerToolSpec&lt;/code&gt; class. Following LlamaIndex convention, each of the four &lt;code&gt;spec_functions&lt;/code&gt; becomes a tool the agent can invoke by name:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;attest_wallet&lt;/code&gt;&lt;/strong&gt; — run a wallet attestation against one to ten conditions (token balance, NFT ownership, EAS attestation, Farcaster ID). Returns a signed verdict per condition. Maps to &lt;code&gt;POST /v1/attest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_trust_profile&lt;/code&gt;&lt;/strong&gt; — fetch a multi-dimensional wallet trust profile (stablecoins, governance, NFTs, staking, plus optional Solana, XRPL, and Bitcoin dimensions). Returns a signed summary. Maps to &lt;code&gt;POST /v1/trust&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;list_compliance_templates&lt;/code&gt;&lt;/strong&gt; — discover pre-configured EAS compliance templates (Coinbase Verified Account, Gitcoin Passport, and so on). No API key required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_jwks&lt;/code&gt;&lt;/strong&gt; — fetch the public JSON Web Key Set so your agent can verify any signed result offline against the &lt;code&gt;insumer-attest-v1&lt;/code&gt; key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Drop it into an agent loop
&lt;/h2&gt;

&lt;p&gt;Any LlamaIndex agent that accepts a tool list will accept this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;llama_index.tools.insumer&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InsumerToolSpec&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;llama_index.agent.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIAgent&lt;/span&gt;

&lt;span class="n"&gt;insumer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;InsumerToolSpec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;insr_live_...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAIAgent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_tools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;insumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_tool_list&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Does wallet 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hold at least 100 USDC on Base?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood the agent picks &lt;code&gt;attest_wallet&lt;/code&gt;, fills in the right arguments, receives back a signed boolean, and reasons over it the same way it reasons over anything else a tool returns. The agent never sees — and never needs to know — how the balance was read, from which chain, or whether the answer came from a cache or a live read. It just sees a yes or a no, with a signature attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the API actually returns
&lt;/h2&gt;

&lt;p&gt;A single live &lt;code&gt;attest_wallet&lt;/code&gt; call against vitalik.eth checking USDC on Base ≥ 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attestation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ATST-33DCD2AC57859853"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pass"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"met"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"conditionHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"blockNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"passCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"failCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"attestedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-16T21:xx:xx.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expiresAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-16T22:xx:xx.000Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"insumer-attest-v1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"creditsRemaining"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"creditsCharged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;pass&lt;/code&gt; field tells you the verdict. The &lt;code&gt;sig&lt;/code&gt; + &lt;code&gt;kid&lt;/code&gt; let any relying party verify the result offline. The &lt;code&gt;conditionHash&lt;/code&gt; binds the signature to the exact condition that was evaluated — tamper with the condition and the signature no longer checks. The raw balance is never in the response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boolean, not balance
&lt;/h2&gt;

&lt;p&gt;This is the core differentiator worth spelling out for anyone coming from a block-explorer mindset. Standard on-chain APIs return balances, transaction lists, NFT inventories — the underlying state. The consumer is expected to evaluate the predicate themselves and act on the raw numbers.&lt;/p&gt;

&lt;p&gt;Wallet auth inverts that. The caller sends the predicate in, the API evaluates it against the live chain state, and the response is a cryptographically signed yes or no. The balance never crosses the wire. That matters for three reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy by default.&lt;/strong&gt; An agent that needs to know whether a wallet is a "USDC holder" does not also need to see the exact holdings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit without exposure.&lt;/strong&gt; The signed verdict is verifiable by any party, forever, without re-reading the chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability.&lt;/strong&gt; The attestation is the receipt. It survives outside the agent, outside the session, outside the request context it was issued in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why LlamaIndex specifically
&lt;/h2&gt;

&lt;p&gt;LlamaIndex is the second-most-adopted agent framework in Python after LangChain, with 48K GitHub stars and a library of nearly 70 official tool integrations. The plug-in shape — one &lt;code&gt;ToolSpec&lt;/code&gt; class, multiple &lt;code&gt;spec_functions&lt;/code&gt;, published as a standalone pip package — is exactly the pattern a new integration should follow. Anything else looks out of place.&lt;/p&gt;

&lt;p&gt;There is also a &lt;code&gt;langchain-insumer&lt;/code&gt; package for LangChain developers, an MCP server for any MCP-aware client (Claude Desktop, Cursor, Cline), and an ElizaOS plugin. The LlamaIndex tool completes the four major agent-framework surfaces. Developers can pick the framework they already use and get the same primitive everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes this different from scraping
&lt;/h2&gt;

&lt;p&gt;A naive answer to "does wallet X hold Y?" is to hit a public RPC, call &lt;code&gt;balanceOf&lt;/code&gt;, compare to a threshold, return a boolean. That works once, inside one program, for one caller. The answer is not portable — another service has to trust your service blindly, or repeat the RPC call itself. And if you log the answer, the log is worthless to anyone else.&lt;/p&gt;

&lt;p&gt;A signed attestation is different. Any service that holds the verdict can verify it independently, offline, forever, against the published JWKS. The condition hash binds the signature to the exact predicate. The block number records when it was read. An audit log of signed attestations is an audit log &lt;em&gt;anyone&lt;/em&gt; can verify — including regulators, counterparties, and future instances of the agent itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free to start
&lt;/h2&gt;

&lt;p&gt;Every new API key ships with enough credits to run end-to-end before you spend anything. Attestations cost 1 credit, trust profiles cost 3 credits. Template discovery and JWKS lookups are free.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.insumermodel.com/v1/keys/create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"email": "you@example.com", "appName": "my-agent", "tier": "free"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a real agent deployment needs more, credits top up via on-chain payment — USDC or USDT on any major EVM chain, USDC on Solana, BTC on Bitcoin — through &lt;code&gt;POST /v1/credits/buy&lt;/code&gt;. No Stripe, no signup flow, no fiat rails. Same rails the agents themselves run on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three-step primitive
&lt;/h2&gt;

&lt;p&gt;If you take one thing away from this post: wallet auth is &lt;strong&gt;read → evaluate → sign&lt;/strong&gt;. The API reads wallet state from the chain, evaluates it against the caller-specified condition, and signs the verdict. No secrets. No identity-first. No static credentials. The condition is public, the signature binds it to the verdict, and the verdict is the truth — right up until &lt;code&gt;expiresAt&lt;/code&gt;, when the agent is free to re-read.&lt;/p&gt;

&lt;p&gt;LlamaIndex now gives agents that primitive as a first-class tool. &lt;code&gt;pip install&lt;/code&gt; is the whole ceremony.&lt;/p&gt;




&lt;p&gt;Canonical URL: &lt;a href="https://insumermodel.com/blog/llamaindex-tool-wallet-auth-condition-based-access.html" rel="noopener noreferrer"&gt;https://insumermodel.com/blog/llamaindex-tool-wallet-auth-condition-based-access.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Package: &lt;a href="https://pypi.org/project/llama-index-tools-insumer/" rel="noopener noreferrer"&gt;https://pypi.org/project/llama-index-tools-insumer/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/douglasborthwick-crypto/llama-index-tools-insumer" rel="noopener noreferrer"&gt;https://github.com/douglasborthwick-crypto/llama-index-tools-insumer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>llm</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Wallet Auth for Tether's WDK: Pre-Transaction Checks in 20 Lines</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Tue, 14 Apr 2026 20:43:08 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/wallet-auth-for-tethers-wdk-pre-transaction-checks-in-20-lines-2a4m</link>
      <guid>https://dev.to/douglasborthwickcrypto/wallet-auth-for-tethers-wdk-pre-transaction-checks-in-20-lines-2a4m</guid>
      <description>&lt;p&gt;&lt;strong&gt;Tether's Wallet Development Kit ships Swap, Bridge, Lending, and Fiat protocols. It does not ship a pre-transaction policy layer. Here is one, as a first-class WDK protocol module, installable from npm.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.wdk.tether.io/" rel="noopener noreferrer"&gt;Tether's Wallet Development Kit&lt;/a&gt; (WDK) is the open-source toolkit that powers &lt;a href="https://tether.wallet" rel="noopener noreferrer"&gt;tether.wallet&lt;/a&gt;, Rumble Wallet, and any other multi-chain self-custodial wallet built on its modular plug-in framework. It is explicitly designed for "humans, machines, and AI agents."&lt;/p&gt;

&lt;p&gt;Out of the box, WDK exposes four protocol categories alongside its wallet modules: &lt;strong&gt;Swap&lt;/strong&gt; (Velora), &lt;strong&gt;Bridge&lt;/strong&gt; (USDT0/LayerZero), &lt;strong&gt;Lending&lt;/strong&gt; (Aave), and &lt;strong&gt;Fiat&lt;/strong&gt; (MoonPay). Each is a typed interface that wallet apps compose into their UX.&lt;/p&gt;

&lt;p&gt;What is missing is the layer that runs &lt;em&gt;before&lt;/em&gt; any of those: a pre-transaction check. Given a wallet and a set of on-chain conditions, return a cryptographically signed yes or no. Before signing a transfer, before approving a contract call, before letting an autonomous agent broadcast anything at all. That primitive is what &lt;a href="https://insumermodel.com/blog/wallet-auth-gate-api-on-wallet-state.html" rel="noopener noreferrer"&gt;wallet auth&lt;/a&gt; already provides for backends — we just hadn't yet packaged it as a native WDK module.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fifth protocol
&lt;/h2&gt;

&lt;p&gt;We shipped &lt;a href="https://www.npmjs.com/package/@insumermodel/wdk-protocol-wallet-auth" rel="noopener noreferrer"&gt;&lt;code&gt;@insumermodel/wdk-protocol-wallet-auth&lt;/code&gt;&lt;/a&gt; — a WDK protocol module that exposes the wallet auth primitive (read → evaluate → sign) inside the WDK shape. Same protocol pattern as Swap, Bridge, Lending, and Fiat. Two methods, two jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;attest({ address, conditions })&lt;/code&gt;&lt;/strong&gt; — evaluate 1–10 on-chain conditions against a wallet, get back a signed pass/fail attestation. Maps to &lt;code&gt;POST /v1/attest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;trust({ address })&lt;/code&gt;&lt;/strong&gt; — get a multi-dimensional trust profile: 36+ signed checks across stablecoins, governance, NFTs, and staking. Maps to &lt;code&gt;POST /v1/trust&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install it like any other WDK protocol module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @insumermodel/wdk-protocol-wallet-auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And use it before any state-changing call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;WalletAuth&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@insumermodel/wdk-protocol-wallet-auth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;walletAuth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WalletAuth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INSUMER_API_KEY&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Before broadcasting a transfer, verify the counterparty:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;kid&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;walletAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attest&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;counterparty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token_balance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;contractAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;chainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USDC &amp;gt;= 1000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;counterparty failed wallet auth check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// sig + kid are the audit trail: verifiable offline against the JWKS.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the complete surface. Twenty lines is generous — the real surface is three: construct, call, check the boolean. Everything else the module does — bound account resolution, multi-chain address routing, error envelope unwrapping, optional JWT output, optional EIP-1186 Merkle proofs — is plumbing.&lt;/p&gt;

&lt;p&gt;The napkin version, collapsed into one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;walletAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attest&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;conditions&lt;/span&gt; &lt;span class="p"&gt;})).&lt;/span&gt;&lt;span class="nx"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;block&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same operation. &lt;em&gt;Block&lt;/em&gt; is whatever your app does when a check fails — throw, redirect, refund, tell the user to top up. The protocol itself doesn't prescribe the reject path. It just tells you, with a signature, what the right answer is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for WDK wallets
&lt;/h2&gt;

&lt;p&gt;There are three distinct buyers for a pre-transaction check inside a self-custodial wallet, and WDK touches all three:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Agent wallets.&lt;/strong&gt; WDK's own framing puts "machines and AI agents" alongside humans. When an autonomous agent holds keys, the operator wants programmable constraints the agent cannot argue its way around — and a cryptographic audit trail the operator can verify after the fact. "Only send to counterparties that pass trust check X" is a real constraint. The signed attestation is the receipt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Consumer apps on WDK rails.&lt;/strong&gt; A creator-payment tool like Rumble Wallet, a remittance app, a treasury product — any WDK-based app that serves end users and wants compliance cover needs something between "user clicks send" and "transaction broadcasts." Travel Rule. Sanctions. Counterparty risk. A drop-in module that returns a cryptographically verifiable attestation is cheaper than building it in-house and, crucially, &lt;em&gt;portable&lt;/em&gt; — the attestation survives outside the wallet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Receive-side trust display.&lt;/strong&gt; The most interesting call is not on your own send, it is on someone else's incoming payment. A creator wants to know the wallet sending them money is not freshly funded from a mixer. A merchant wants to know the incoming USDT is not about to be frozen. That is &lt;code&gt;trust()&lt;/code&gt; on the inbound address, surfaced in the UI before the user accepts the payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it fits WDK's shape
&lt;/h2&gt;

&lt;p&gt;WDK's protocol modules are not hooks or middleware. They are typed interfaces that wallet apps compose into their own flow. &lt;code&gt;Swap&lt;/code&gt; has &lt;code&gt;quoteSwap()&lt;/code&gt; and &lt;code&gt;swap()&lt;/code&gt;. &lt;code&gt;Lending&lt;/code&gt; has &lt;code&gt;supply()&lt;/code&gt;, &lt;code&gt;borrow()&lt;/code&gt;, &lt;code&gt;repay()&lt;/code&gt;. Each is a verb the app calls when it needs that capability.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;WalletAuthProtocol&lt;/code&gt; follows the same pattern. The app calls &lt;code&gt;attest()&lt;/code&gt; or &lt;code&gt;trust()&lt;/code&gt; before the action it wants to gate. The protocol itself never touches private keys, never signs transactions, never broadcasts. It runs &lt;em&gt;before&lt;/em&gt; the signing flow, not inside it. This matters: it means the module is additive and composable with every other WDK protocol, not a replacement or a wrapper.&lt;/p&gt;

&lt;p&gt;The abstract base class (&lt;code&gt;WalletAuthProtocol&lt;/code&gt;) is shape-compatible with WDK's existing &lt;code&gt;SwapProtocol&lt;/code&gt;, &lt;code&gt;BridgeProtocol&lt;/code&gt;, &lt;code&gt;LendingProtocol&lt;/code&gt;, and &lt;code&gt;FiatProtocol&lt;/code&gt; base classes in &lt;code&gt;@tetherto/wdk-wallet/protocols&lt;/code&gt;. It is intentionally structured so that it can be proposed upstream as a blessed fifth protocol module. The reference implementation (&lt;code&gt;InsumerWalletAuthProtocol&lt;/code&gt;) is a clean subclass that any WDK app can install from npm today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets signed
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;attest()&lt;/code&gt; result carries an ECDSA P-256 signature and a key ID. Every &lt;code&gt;trust()&lt;/code&gt; result does the same. Verification is offline — any JOSE or JWT library can check the signature against the public JWKS at &lt;a href="https://insumermodel.com/.well-known/jwks.json" rel="noopener noreferrer"&gt;insumermodel.com/.well-known/jwks.json&lt;/a&gt;. There is no server call, no account, no API key required to &lt;em&gt;verify&lt;/em&gt;. Only to &lt;em&gt;create&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If you ask for &lt;code&gt;jwt: true&lt;/code&gt;, the attestation also comes back as a standard ES256 JWT with the signed result as JWT claims. That turns the output into a drop-in bearer token: Kong, Nginx, Cloudflare Access, or AWS API Gateway can verify it the same way they verify any other JWT, without knowing anything about wallet auth at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported chains
&lt;/h2&gt;

&lt;p&gt;InsumerAPI covers &lt;strong&gt;33 chains&lt;/strong&gt; today: 30 EVM networks (Ethereum, Polygon, Arbitrum, Optimism, Base, Avalanche, BNB, and the rest of the major EVM set), plus Solana, XRPL, and Bitcoin. WDK's own chain coverage overlaps heavily with this — every EVM chain you hit via &lt;code&gt;wdk-wallet-evm&lt;/code&gt; is already attestable today, same with &lt;code&gt;wdk-wallet-solana&lt;/code&gt; and &lt;code&gt;wdk-wallet-btc&lt;/code&gt;, and the module also covers XRPL natively even though WDK doesn't yet ship an XRPL wallet module.&lt;/p&gt;

&lt;p&gt;Three WDK surfaces do not yet have InsumerAPI coverage: &lt;strong&gt;TRON, TON, and Lightning/Spark&lt;/strong&gt;. Apps on those runtimes can still use &lt;code&gt;attest()&lt;/code&gt; and &lt;code&gt;trust()&lt;/code&gt; against EVM, Solana, XRPL, or Bitcoin addresses the user holds — they just can't yet condition on, say, a TRC-20 balance. Those three chains are on our roadmap and the request shape will stay identical when they land.&lt;/p&gt;

&lt;p&gt;The request shape is already identical across everything that is covered. EVM, Solana, Bitcoin, and XRPL addresses ride in their own fields (&lt;code&gt;wallet&lt;/code&gt;, &lt;code&gt;solanaWallet&lt;/code&gt;, &lt;code&gt;bitcoinWallet&lt;/code&gt;, &lt;code&gt;xrplWallet&lt;/code&gt;) and the module routes them automatically based on each condition's &lt;code&gt;chainId&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paying for it
&lt;/h2&gt;

&lt;p&gt;The free tier ships 10 attestation credits to every new key so you can kick the tyres end-to-end before spending anything. When a wallet app needs more, credits are purchased on-chain — no Stripe, no fiat rails, no signup flow. The &lt;code&gt;POST /v1/credits/buy&lt;/code&gt; endpoint accepts transfers of &lt;strong&gt;USDC or USDT on any major EVM chain&lt;/strong&gt; (auto-detected from the transaction), &lt;strong&gt;USDC on Solana&lt;/strong&gt;, or &lt;strong&gt;BTC on Bitcoin&lt;/strong&gt;, and credits post as soon as the transaction confirms on-chain. Same rails the wallets themselves run on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where next
&lt;/h2&gt;

&lt;p&gt;The package is public on npm and GitHub, and the README has the full API reference. Three things on the roadmap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upstream proposal.&lt;/strong&gt; The &lt;code&gt;WalletAuthProtocol&lt;/code&gt; base class is intentionally a clean extension of the &lt;code&gt;@tetherto/wdk-wallet/protocols&lt;/code&gt; pattern. The next step is proposing it upstream as a blessed fifth protocol module on the WDK repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Native and Bare runtimes.&lt;/strong&gt; The module uses &lt;code&gt;globalThis.fetch&lt;/code&gt; by default and accepts a &lt;code&gt;fetch&lt;/code&gt; override, so it already works in WDK's React Native and Bare Kit environments. A first-party example in &lt;a href="https://github.com/tetherto/wdk-starter-react-native" rel="noopener noreferrer"&gt;wdk-starter-react-native&lt;/a&gt; is the natural next doc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receive-side widget.&lt;/strong&gt; The most visually obvious use case — a small trust badge surfaced in the wallet UI when a payment comes in — is a UI component, not a protocol. That will ship separately, layered on top of the protocol module.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are building a wallet on WDK and any of the three buyer profiles above apply, the module is one install away. And if you are on Tether's side of the fence and want to see Wallet Auth land in the official protocol base classes, open an issue on &lt;a href="https://github.com/douglasborthwick-crypto/wdk-protocol-wallet-auth" rel="noopener noreferrer"&gt;the repo&lt;/a&gt; and let us know.&lt;/p&gt;

&lt;p&gt;OAuth proves who you are. Wallet auth proves what you hold. WDK now has both sides of the flow.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>web3</category>
    </item>
    <item>
      <title>Would You Trust Your Agent? KYA Is Real.</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Fri, 10 Apr 2026 13:59:16 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/would-you-trust-your-agent-kya-is-real-1ppl</link>
      <guid>https://dev.to/douglasborthwickcrypto/would-you-trust-your-agent-kya-is-real-1ppl</guid>
      <description>&lt;p&gt;Everyone is deploying AI agents. Almost no one is verifying them. And those agents are already moving money. You wouldn't hand your wallet to a stranger. KYA, Know Your Agent, is real, and the speed at which the ecosystem is converging on it is the proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  The convergence is here
&lt;/h2&gt;

&lt;p&gt;The headlines landed in a pile this March. &lt;a href="https://www.fintechweekly.com/news/changpeng-zhao-ai-agents-crypto-payments-kimi-openclaw-march-2026" rel="noopener noreferrer"&gt;CZ declared AI agents will dominate crypto payments&lt;/a&gt;. &lt;a href="https://www.coindesk.com/tech/2026/03/15/visa-is-ready-for-ai-agents-so-is-coinbase-they-re-building-very-different-internets" rel="noopener noreferrer"&gt;Visa announced readiness for agent transactions, while Coinbase pitched a fundamentally different internet&lt;/a&gt;. &lt;a href="https://www.mastercard.com/us/en/news-and-trends/stories/2026/verifiable-intent.html" rel="noopener noreferrer"&gt;Mastercard introduced "Verifiable Intent" for autonomous commerce&lt;/a&gt;. &lt;a href="https://blockeden.xyz/blog/2026/03/16/crossmint-ai-agent-virtual-cards-autonomous-payments-kya-stripe-for-agents" rel="noopener noreferrer"&gt;Crossmint shipped agent virtual cards&lt;/a&gt;. &lt;a href="https://news.bitcoin.com/moonpay-launches-open-wallet-standard-to-unify-ai-agent-payments/" rel="noopener noreferrer"&gt;MoonPay launched an Open Wallet Standard&lt;/a&gt;. Coinbase's x402 protocol and Stripe MPP are &lt;a href="https://workos.com/blog/x402-vs-stripe-mpp-how-to-choose-payment-infrastructure-for-ai-agents-and-mcp-tools-in-2026" rel="noopener noreferrer"&gt;already being compared head-to-head&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every one of these is a payment rail. None of them check whether the agent should be trusted before money moves. That is the gap KYA fills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rails are here. The trust layer isn't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can authenticate an agent. You can resolve its DID. You can confirm the public key it signs with. None of that tells you whether the agent's wallet still holds the funds it claimed yesterday. None of it tells you whether the source code was compromised in last week's dependency update. None of it tells you whether the operator's delegation has expired, whether the counterparty has been added to a sanctions list, whether the agent has actually delivered on past commitments, or whether the reasoning chain that led to its current action is sound.&lt;/p&gt;

&lt;h2&gt;
  
  
  The nine dimensions of agent trust
&lt;/h2&gt;

&lt;p&gt;Each dimension is answered by an independent issuer in the open multi-attestation spec at &lt;a href="https://github.com/douglasborthwick-crypto/insumer-examples/issues/1" rel="noopener noreferrer"&gt;insumer-examples #1&lt;/a&gt;, with a JWKS endpoint anyone can verify offline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wallet state.&lt;/strong&gt; What does this agent's wallet hold right now? Token balances, NFTs, staking positions, DeFi activity, governance participation, across 33 blockchains. Provider: InsumerAPI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance risk.&lt;/strong&gt; Is the counterparty on a sanctions list? OFAC, EU, and UN screening, plus domain hygiene and IP reputation. Provider: Revettr.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity verification.&lt;/strong&gt; Who actually controls this agent? DID resolution, delegation chains, interaction patterns, completion ratios. Provider: AgentID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security posture.&lt;/strong&gt; Has the agent's source code been scanned for vulnerabilities, secrets, and unsafe patterns? Provider: AgentGraph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance.&lt;/strong&gt; Is the agent operating within an authorized delegation chain? Principal identity, policy compliance, spending limits, full chain of custody. Provider: APS (Agent Passport System).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job performance.&lt;/strong&gt; Has the agent actually delivered quality work in the past? Task completion rates, accuracy metrics, performance history. Provider: Maiat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settlement history.&lt;/strong&gt; Has the agent followed through on past commitments? Operation binding, delivery verification, settlement witness receipts. Provider: SAR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavioral trust.&lt;/strong&gt; Is the agent's wallet a coordinated bot or a real entity? Signal depth and risk intensity, sybil detection across 12 EVM chains and Solana. Provider: RNWY.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning integrity.&lt;/strong&gt; Is the agent's decision chain sound? Adversarial multi-model critique, logical consistency, temporal freshness. Provider: ThoughtProof.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nine dimensions, nine independent providers, nine signed attestations. No single provider sees all of them. No central authority makes the trust call. The consumer trusts no one and verifies everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity is one dimension. Trust is nine.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The momentum is the proof
&lt;/h2&gt;

&lt;p&gt;Building one trust dimension is hard. Building nine in coordination is harder. Getting nine independent companies to agree on a single envelope format and start populating it with real signed attestations is the kind of thing standards bodies usually take years to do.&lt;/p&gt;

&lt;p&gt;The open multi-attestation spec opened in March. Three weeks ago we wrote about &lt;a href="https://insumermodel.com/blog/multi-attestation-four-issuers-one-verification-pass.html" rel="noopener noreferrer"&gt;four issuers in one verification pass&lt;/a&gt;. Today the count is nine issuers in the envelope and five with shipped wallet binding. Each of the five accepts a wallet address as input and returns an attestation about that specific wallet, signed against their published JWKS. The remaining four cover their dimensions through different integration paths and are converging on wallet integration through bilateral interop work. All nine are live. All nine sign attestations. All nine are consumed by a single orchestrator behind one API call.&lt;/p&gt;

&lt;p&gt;That convergence speed is not coincidence. It is the demand signal. Nine independent companies do not build around the same wire format in 30 days unless the market is asking for it loudly. KYA is real because the people building it are racing to ship it.&lt;/p&gt;

&lt;p&gt;And the production reality is already ahead of the discussion. &lt;a href="https://insumermodel.com/blog/asterpay-kya-erc8183-attestation-integration.html" rel="noopener noreferrer"&gt;AsterPay's KYA Hook&lt;/a&gt; runs in production for ERC-8183 agentic commerce today, with InsumerAPI feeding 4 of 7 trust score dimensions through cryptographic attestations. Manual KYB replaced with signed signals, one API call, no human review when the wallet qualifies. KYA is not a thought experiment. It is a shipping product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each issuer stands today
&lt;/h2&gt;

&lt;p&gt;Five of the nine ship signed wallet binding directly: InsumerAPI, Revettr, AgentID, AgentGraph, and APS. Each accepts a wallet address as input and returns an attestation about that specific wallet. The other four serve their dimension through complementary paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Maiat&lt;/strong&gt; ships wallet acceptance via a long-standing &lt;code&gt;?address=&lt;/code&gt; parameter and falls back to a reference identity when the wallet has no Maiat job history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SAR&lt;/strong&gt; accepts the wallet via an envelope-level &lt;code&gt;counterparty&lt;/code&gt; field, surfaced in the response but not yet bound into the signed payload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RNWY's&lt;/strong&gt; behavioral trust model is keyed to canonical agent IDs from major registries (ERC-8004, Olas, Virtuals), with bilateral interop in progress with AgentGraph for cross-provider lookup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThoughtProof's&lt;/strong&gt; reasoning verification is wallet-agnostic by design. Its attestation surface is the reasoning chain for a specific tool call, which is a property of the action, not the actor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The runtime ratio for any individual agent depends on whether that specific agent is registered with each issuer. The spec coverage is solid: nine independent providers, all coordinating around a single open envelope, all signing JWKS-verifiable attestations today.&lt;/p&gt;

&lt;h2&gt;
  
  
  One API call
&lt;/h2&gt;

&lt;p&gt;Asking nine independent questions about an agent could mean nine integrations, nine API keys, nine retry policies. That is not how it works. The multi-attestation spec defines a single envelope format that lets all nine issuers respond in parallel. One call in. Nine signed attestations out. Every signature verifiable offline against each issuer's published JWKS, with no callback to the orchestrator at verification time.&lt;/p&gt;

&lt;p&gt;The orchestrator code is open source. Both files use only Node built-ins (&lt;code&gt;crypto&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt; from the standard library, no external imports):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/douglasborthwick-crypto/insumer-examples/blob/main/wallet-resolve.js" rel="noopener noreferrer"&gt;&lt;code&gt;wallet-resolve.js&lt;/code&gt;&lt;/a&gt; takes a wallet address and fans out to the nine issuers in parallel&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/douglasborthwick-crypto/insumer-examples/blob/main/multi-attest-verify.js" rel="noopener noreferrer"&gt;&lt;code&gt;multi-attest-verify.js&lt;/code&gt;&lt;/a&gt; verifies each signed payload against the right JWKS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the consumer side taught the spec
&lt;/h2&gt;

&lt;p&gt;Wiring nine issuers behind a single orchestrator surfaces a pattern that the current schema does not capture: &lt;strong&gt;whether an attestation actually evaluated the wallet you sent is consumer-relevant metadata&lt;/strong&gt;. From the consumer's perspective, all three states (wallet-bound, envelope-acknowledged, reference data) look identical at the signature layer. A valid JWS from a known issuer with a known kid resolving against a known JWKS endpoint. That is not enough to make a trust decision.&lt;/p&gt;

&lt;p&gt;The proposal we posted to &lt;a href="https://github.com/a2aproject/A2A/issues/1628" rel="noopener noreferrer"&gt;A2A #1628&lt;/a&gt; is a &lt;code&gt;subject_binding&lt;/code&gt; field on each signal entry, with three states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;wallet_bound&lt;/code&gt;: the issuer evaluated the wallet you sent and signed the result over it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;wallet_acknowledged&lt;/code&gt;: the wallet flowed through the response envelope but the signature does not bind it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reference&lt;/code&gt;: the issuer returned data not specific to the wallet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consumers can then weight wallet-bound dimensions highest, treat acknowledged ones as informational, and aggregate reference attestations as background context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on a wallet
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://skyemeta.com/skyeprofile/" rel="noopener noreferrer"&gt;SkyeProfile&lt;/a&gt; is the live consumer of the multi-attestation spec. (For the architectural deep-dive on how the orchestrator dispatches nine specialists in parallel, see &lt;a href="https://insumermodel.com/blog/what-is-skyeprofile-wallet-trust-orchestration.html" rel="noopener noreferrer"&gt;What Is SkyeProfile?&lt;/a&gt;.) Each dimension card on the page shows a binding badge so the consumer can weight signals correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Green ("Your Wallet").&lt;/strong&gt; The issuer signed an attestation about the specific wallet you submitted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amber ("Acknowledged").&lt;/strong&gt; The wallet flowed through the response envelope but the signature does not bind it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gray ("Spec Demo").&lt;/strong&gt; The issuer returned reference data, either because they have no entry for your wallet or because their integration uses a non-wallet identifier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The page renders Vitalik's wallet on load as the canonical reference. Vitalik is not registered with any of the agent issuers, so the visible ratio is two wallet-bound, one acknowledged, six spec demo. Below the reference, a user-input form takes any EVM or Solana wallet you paste and computes the live ratio for that specific address. If you have a wallet for an agent you actually want to evaluate, paste it. Each card with a registered binding flips from gray to green in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Most discussions of agent trust focus on identity. Who is the agent. What credentials does it have. What does its DID look like. Identity is necessary but it is not sufficient. An agent with a verified identity can still drain its wallet, fail its delegation check, get sanctioned, run compromised code, or under-deliver on what it was paid for. Identity tells you the agent's name. KYA tells you whether the agent should be trusted right now.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://insumermodel.com/blog/ai-agents-wallet-trust-profiles-drift-exploit.html" rel="noopener noreferrer"&gt;Drift Protocol exploit&lt;/a&gt; on March 31 is the cleanest recent illustration of what happens when the trust layer is missing entirely. Two hundred and eighty-six million dollars moved in twelve minutes because signers had no way to verify counterparty trust before approving transactions. KYA would not have auto-prevented Drift. KYA is a check primitive, not a tripwire. But the layer that would have given Drift's signers the data to make a different decision is the layer that did not exist. KYA is that layer.&lt;/p&gt;

&lt;p&gt;The composability primitive is no longer theoretical. It is running in production today, against real agent wallets, with the open multi-attestation spec converging in real time. Nine independent issuers, one envelope format, one API call, every signature verifiable offline.&lt;/p&gt;

&lt;p&gt;Payments are getting faster. Trust isn't. That is the gap. Before you trust an agent with anything that matters, run the full check.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Quantum Breaks Static Credentials. Wallet Auth Was Never Static.</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Thu, 09 Apr 2026 19:03:13 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/quantum-breaks-static-credentials-wallet-auth-was-never-static-4i8b</link>
      <guid>https://dev.to/douglasborthwickcrypto/quantum-breaks-static-credentials-wallet-auth-was-never-static-4i8b</guid>
      <description>&lt;p&gt;A Nobel Prize-winning physicist warned this week that Bitcoin could be among the earliest real-world targets of quantum computing. Google published research showing that fewer than 500,000 qubits could derive a private key from a public key in under nine minutes. The Bitcoin community is debating BIP 360, a hard fork to hide public keys behind Merkle roots. The Federal Reserve published a paper on "harvest now, decrypt later" attacks against blockchain networks. The quantum threat is no longer theoretical. But the vulnerability it exploits is not new. It is the oldest assumption in digital security: that a single, long-lived cryptographic secret can protect everything, forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What quantum actually threatens
&lt;/h2&gt;

&lt;p&gt;Every quantum attack vector against Bitcoin comes back to the same architectural assumption: one private key, held for years, protecting all funds associated with it.&lt;/p&gt;

&lt;p&gt;The specific attack works like this. When a Bitcoin transaction is broadcast, the sender's public key becomes visible in the mempool before the transaction is confirmed on-chain. A sufficiently powerful quantum computer running Shor's algorithm could derive the corresponding private key from that public key. Google's research suggests this could take roughly nine minutes. The average Bitcoin block takes ten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That is the window.&lt;/strong&gt; Nine minutes of exposed public key, and every satoshi behind it is at risk.&lt;/p&gt;

&lt;p&gt;But the problem runs deeper than the mempool. The Federal Reserve's research on "harvest now, decrypt later" points out that every historical Bitcoin transaction with an exposed public key is permanently recorded on-chain. An adversary could record those public keys today and wait for quantum hardware to mature. Even if Bitcoin migrates to post-quantum signatures tomorrow, the old transactions are already written. The chain is immutable. The exposure is permanent.&lt;/p&gt;

&lt;p&gt;BIP 360 addresses the forward-looking problem by introducing Pay-to-Merkle-Root (P2MR), a new output type that hides the public key inside a Merkle tree until the moment of spending. BTQ Technologies implemented it on testnet in March 2026. But deploying it requires a hard fork, coordination across every exchange, hardware wallet, and node operator on the network. Adam Back, the Hashcash inventor, says the migration clock is ticking even though he believes the threat itself is still decades away. The debate is not about whether to prepare. It is about whether Bitcoin's governance can move fast enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design assumption quantum breaks
&lt;/h2&gt;

&lt;p&gt;Zoom out from Bitcoin specifically. The quantum threat is not unique to one chain or one algorithm. It is a threat to a &lt;strong&gt;design pattern&lt;/strong&gt;: systems that depend on a single, long-lived cryptographic secret as the root of all trust.&lt;/p&gt;

&lt;p&gt;Private keys. API keys. Session tokens. Passwords hashed with algorithms that will eventually fall. Any system where one secret, if compromised, unlocks everything, and where that secret must persist for months or years to remain useful.&lt;/p&gt;

&lt;p&gt;This is what makes quantum different from classical attacks. A classical attacker who steals your password gets your password. A quantum attacker who factors your public key gets your private key, which is equivalent to getting every transaction you will ever make from that address. The permanence of the secret is the vulnerability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wallet auth inverts this
&lt;/h2&gt;

&lt;p&gt;Wallet auth does not protect secrets. It eliminates them. The primitive is: read on-chain state, evaluate it against conditions, return a signed result. The result is a boolean. Did this wallet meet the condition, or not.&lt;/p&gt;

&lt;p&gt;There are three properties of this architecture that make the quantum threat structurally irrelevant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First: the attestation is ephemeral.&lt;/strong&gt; Every signed result from InsumerAPI carries a 30-minute expiration. After that, it is worthless. There is nothing to harvest. An adversary recording attestations today gains a collection of expired booleans. Compare this to a Bitcoin public key, which protects funds indefinitely. The harvest-now-decrypt-later strategy assumes the encrypted data will still be valuable when the decryption becomes possible. A boolean that says "this wallet held 100 USDC at 2:47pm on April 9th" has no exploitable value at any future date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second: the signing algorithm is swappable.&lt;/strong&gt; InsumerAPI currently signs attestations with ES256, an ECDSA signature on the P-256 curve. The same algorithm family that quantum threatens in Bitcoin. But there is a critical difference in how it is deployed. Verifiers check the signature against a public key published at a JWKS endpoint. To migrate to a post-quantum algorithm like ML-DSA (the NIST-standardized version of CRYSTALS-Dilithium), the change is: update the signing key, publish the new public key to the JWKS endpoint, update the algorithm identifier. Every verifier that fetches the JWKS picks up the new key automatically. No hard fork. No coordination across thousands of independent node operators. No BIP proposal. One deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third: even a broken signature reveals nothing exploitable.&lt;/strong&gt; Suppose a quantum computer cracks the ES256 signature on an InsumerAPI attestation. What does the attacker learn? That a particular wallet met or did not meet a particular condition at a particular time. The attestation does not contain private keys. It does not contain balances. It does not contain any credential that grants access to funds. The boolean is the entire payload. Breaking the signature proves the boolean was not tampered with. It does not unlock anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static secrets break. Ephemeral proofs don't.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Continuous re-verification
&lt;/h2&gt;

&lt;p&gt;The ephemeral property becomes even more pronounced in session-based systems. Consider a multi-party agent session where every participant must prove their wallet meets on-chain conditions to enter. The session does not check once and grant permanent access. It re-verifies. Agents that no longer qualify are ejected. The session is never static.&lt;/p&gt;

&lt;p&gt;Even if an attacker cracked one attestation signature during the session window, the session has already moved on. The next re-verification produces a fresh attestation with a fresh signature. There is no single credential to target because the credential regenerates continuously from live on-chain state.&lt;/p&gt;

&lt;p&gt;This is the architectural difference. Bitcoin protects a static secret that must survive forever. Wallet auth evaluates a live condition that only needs to survive for its verification window.&lt;/p&gt;

&lt;h2&gt;
  
  
  The condition hash
&lt;/h2&gt;

&lt;p&gt;There is one more piece worth noting. Every InsumerAPI attestation includes a condition hash: a SHA-256 digest of the exact condition that was evaluated, with keys sorted canonically. This hash is embedded in the signed payload.&lt;/p&gt;

&lt;p&gt;Even if the signature algorithm were compromised, the condition hash serves as an independent tamper-detection mechanism. A verifier can reconstruct the expected condition, hash it, and compare. If the condition was altered, the hash will not match, regardless of whether the signature is valid. This is defense in depth that does not depend on any single cryptographic primitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters now
&lt;/h2&gt;

&lt;p&gt;The quantum timeline is debated. Estimates range from five years to twenty. Bernstein says three to five years to transition. Google is setting a 2029 internal deadline for post-quantum migration across its authentication services. NIST has finalized the post-quantum standards. Naoris Protocol launched the first Layer 1 built entirely on ML-DSA. U.S. federal agencies face an April 2026 deadline to submit their transition plans.&lt;/p&gt;

&lt;p&gt;The migration is happening. The question is how painful it will be for each system.&lt;/p&gt;

&lt;p&gt;For Bitcoin, it is a hard fork, a years-long coordination effort, and a permanent legacy of exposed historical public keys that no migration can fix.&lt;/p&gt;

&lt;p&gt;For wallet auth, it is an algorithm swap behind a JWKS endpoint. The primitive does not change. You send conditions in, you get a cryptographically verifiable result out. The verification is the same whether the signature is ECDSA or Dilithium. Read, evaluate, sign. The operation is the same. Only the signature changes.&lt;/p&gt;

&lt;p&gt;That is not quantum-resistant by accident. It is quantum-resistant by architecture. When the cryptographic ground shifts, systems built on permanent secrets have to rebuild from the foundation. Systems built on ephemeral proofs just swap the signature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quantum breaks systems built on secrets. Wallet auth was built without them.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>quantum</category>
      <category>bitcoin</category>
      <category>security</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>What Is SkyeProfile? Eight Experts, One Call, Complete Wallet Trust</title>
      <dc:creator>Douglas Borthwick</dc:creator>
      <pubDate>Wed, 08 Apr 2026 22:52:41 +0000</pubDate>
      <link>https://dev.to/douglasborthwickcrypto/what-is-skyeprofile-eight-experts-one-call-complete-wallet-trust-11k6</link>
      <guid>https://dev.to/douglasborthwickcrypto/what-is-skyeprofile-eight-experts-one-call-complete-wallet-trust-11k6</guid>
      <description>&lt;p&gt;A balance check is not due diligence. Knowing a wallet holds tokens tells you almost nothing about whether it should be trusted. SkyeProfile changes the question from &lt;em&gt;what does this wallet hold?&lt;/em&gt; to &lt;em&gt;what kind of wallet is this?&lt;/em&gt; One API call dispatches eight independent specialists, each evaluating a different dimension of wallet trust, each signing their own attestation with their own cryptographic key. The result is not a score. It is a complete, verifiable, multi-dimensional trust profile. Think of it as hiring a team of experts with a single phone call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The General Contractor Model
&lt;/h2&gt;

&lt;p&gt;When you build a house, you do not hire one person to do everything. You hire a general contractor. The contractor coordinates the electrician, the plumber, the structural engineer, the roofer, the HVAC specialist, and the inspector. Each one brings deep expertise in their domain. Each one signs off on their own work. The contractor does not pretend to be all of them. The contractor orchestrates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SkyeProfile is the general contractor for wallet trust.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When your system needs to decide whether to trust a wallet, SkyeProfile dispatches eight specialized providers in parallel. Each provider evaluates the wallet from their dimension of expertise. Each provider returns an independently signed attestation. SkyeProfile assembles the results into a single response. It does not generate the trust signals. It orchestrates them.&lt;/p&gt;

&lt;p&gt;The foundation underneath all of it is InsumerAPI. It provides the wallet state attestation: what the wallet holds across thirty-three blockchains, evaluated against over forty checks, returned as a cryptographically signed result. The primitive is simple: read blockchain state, evaluate conditions, sign the result. That is &lt;a href="https://insumermodel.com/blog/there-is-no-secret-condition-based-access.html" rel="noopener noreferrer"&gt;wallet auth&lt;/a&gt;. Every other dimension branches off from that foundation. The plumber needs to know the house has walls before running pipe. The identity provider needs to know the wallet exists on-chain before evaluating who controls it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Crime Scene Analogy
&lt;/h2&gt;

&lt;p&gt;Consider how investigators process a crime scene. The first officer secures the perimeter. Then the specialists arrive. A forensics team handles physical evidence. A ballistics expert examines projectiles. A medical examiner determines cause of death. A digital forensics analyst pulls data from devices. A toxicologist screens for chemicals. Each expert writes an independent report. Each expert signs their findings. No single expert sees the full picture, but the lead investigator assembles all reports into a comprehensive case file.&lt;/p&gt;

&lt;p&gt;This is exactly how SkyeProfile works. The wallet address is the scene. Each provider is a specialist. Their signed attestations are independent expert reports. SkyeProfile is the lead investigator assembling the case file. And just like a real investigation, you can verify each expert's credentials and methodology independently. You do not have to trust the lead investigator's summary. You can check the signatures yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eight experts. One call. Verifiable results.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight Dimensions, Eight Specialists
&lt;/h2&gt;

&lt;p&gt;Each dimension of SkyeProfile is handled by a provider that does nothing but that one thing, all day, every day. Here is the team:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wallet State&lt;/strong&gt; is the foundation. Powered by &lt;a href="https://insumermodel.com/developers/trust/" rel="noopener noreferrer"&gt;InsumerAPI&lt;/a&gt;, it evaluates what the wallet holds across thirty-three blockchains. Stablecoins, governance tokens, NFTs, staking positions, DeFi activity. Over forty checks. ES256-signed. This is the bedrock the other dimensions build on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behavioral Trust&lt;/strong&gt; asks whether the wallet behaves like a real participant or a sybil. &lt;a href="https://rnwy.com" rel="noopener noreferrer"&gt;RNWY&lt;/a&gt; maintains a dual-score model across over one hundred fifty thousand agents spanning twelve EVM chains and Solana. Signal depth measures behavioral observability. Risk intensity measures fraud probability. A well-funded wallet with no behavioral history is not an error. It is a signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity Verification&lt;/strong&gt; determines who controls the wallet. &lt;a href="https://getagentid.dev" rel="noopener noreferrer"&gt;AgentID&lt;/a&gt; resolves DID chains, delegation patterns, interaction histories, and completion ratios. The attestation links a wallet to a verifiable identity without exposing personal data. EdDSA-signed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Posture&lt;/strong&gt; scans for vulnerabilities. &lt;a href="https://agentgraph.co" rel="noopener noreferrer"&gt;AgentGraph&lt;/a&gt; performs source code scanning on agent wallets, categorizing findings by severity. A wallet controlled by an agent with known vulnerabilities is a different risk profile than one with a clean security audit. EdDSA-signed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Governance&lt;/strong&gt; verifies the wallet operates within a sanctioned authority chain. The &lt;a href="https://aeoess.com" rel="noopener noreferrer"&gt;Agent Passport System&lt;/a&gt; traces delegation lineage from human principal to agent action. Who authorized this wallet? What are its spending limits? Is its policy chain intact? EdDSA-signed with a full PolicyReceipt chain and Merkle commitment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning Integrity&lt;/strong&gt; is the most forward-looking dimension. &lt;a href="https://thoughtproof.ai" rel="noopener noreferrer"&gt;ThoughtProof&lt;/a&gt; runs adversarial multi-model critique to determine whether the agent behind a wallet is making sound decisions. An agent can execute correctly but reason incorrectly. This catches the difference. EdDSA-signed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Job Performance&lt;/strong&gt; asks whether the agent delivers quality work. &lt;a href="https://maiat.io" rel="noopener noreferrer"&gt;Maiat&lt;/a&gt; tracks task completion rates, accuracy metrics, and performance scores from real job execution through an ERC-8183 escrow system. Past performance is the best predictor of future performance. ES256-signed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Settlement History&lt;/strong&gt; answers the ultimate question: did this wallet deliver what it was paid for? &lt;a href="https://defaultverifier.com" rel="noopener noreferrer"&gt;SAR&lt;/a&gt; maintains a receipt chain of operation bindings, delivery verifications, and &lt;a href="https://insumermodel.com/blog/settlementwitness-insumer-api-pre-post-agent-commerce.html" rel="noopener noreferrer"&gt;settlement witness&lt;/a&gt; receipts. EdDSA-signed with verdict scoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why One Source Is Not Enough
&lt;/h2&gt;

&lt;p&gt;The current market for wallet trust is fragmented. You can check a wallet's balance. You can look up its transaction history on a block explorer. You can run it through a sanctions list. Each of these is a single dimension. Each one, alone, is incomplete.&lt;/p&gt;

&lt;p&gt;A wallet can be well-funded and malicious. A wallet can have clean transaction history and be controlled by a compromised agent. A wallet can pass sanctions screening and still be a sybil. A wallet can hold governance tokens and have no delegation authority.&lt;/p&gt;

&lt;p&gt;This is the problem with single-source trust. It is like hiring only the electrician to inspect the house. The wiring might be perfect. The foundation might be crumbling.&lt;/p&gt;

&lt;p&gt;SkyeProfile solves this by querying across dimensions simultaneously. You do not get a single number. You get eight independent assessments from eight specialized providers. &lt;strong&gt;You decide which dimensions matter for your use case.&lt;/strong&gt; A DeFi protocol might weight wallet state and settlement history heavily. An agent marketplace might prioritize reasoning integrity and job performance. A compliance system might focus on identity verification and governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A wallet is not a balance. It is a history.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Actually Works
&lt;/h2&gt;

&lt;p&gt;One API call. One wallet address. SkyeProfile calls all eight providers in parallel. Each provider evaluates the wallet independently. Each provider signs their attestation with their own cryptographic key (ES256 or EdDSA). Each provider publishes their public key at a JWKS URI. The response arrives as a unified payload with eight independently verifiable attestations, formatted as a &lt;a href="https://insumermodel.com/blog/multi-attestation-four-issuers-one-verification-pass.html" rel="noopener noreferrer"&gt;multi-attestation envelope&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The critical design choice: &lt;strong&gt;you do not have to trust SkyeProfile.&lt;/strong&gt; Each attestation includes the provider's JWKS URI and key ID. Fetch the public key. Verify the signature. You can do this offline, with no callback to SkyeProfile or any provider. The signatures are the proof.&lt;/p&gt;

&lt;p&gt;If a provider is temporarily unavailable, that dimension returns as unavailable while the remaining seven still return valid, signed attestations. Graceful degradation. A house inspection does not fail because the roofer is stuck in traffic. The other six specialists still do their work.&lt;/p&gt;

&lt;p&gt;Wallet state attestations from InsumerAPI are valid for thirty minutes. Behavioral scoring from RNWY can hold for up to twenty-four hours. JWKS keys are cacheable per standard HTTP cache headers. Once you have fetched the public keys, verification is fully offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Than What Exists Today
&lt;/h2&gt;

&lt;p&gt;The alternatives fall into two categories: too narrow or too opaque.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too narrow&lt;/strong&gt; means single-dimension tools. Balance checkers tell you what a wallet holds but nothing about how it behaves. Sanctions screening tools tell you whether an address is flagged but nothing about its operational history. Sybil detectors tell you whether an address is real but nothing about its governance authority. Each tool requires a separate integration, a separate vendor relationship, and a separate trust assumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too opaque&lt;/strong&gt; means credit-score-style systems that return a single number from a black box. You get a 742. What does that mean? Which inputs drove it? Can you verify the methodology? Can you weight dimensions differently for your use case? With a single score, you cannot. You either trust the provider's model or you do not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything else forces you to choose between incomplete or unverifiable. SkyeProfile removes that tradeoff.&lt;/strong&gt; Eight dimensions, eight independent providers, eight verifiable signatures. You see exactly which providers assessed the wallet, what each one concluded, and you can verify every signature independently. No black box. No single score. No trust required. You send a wallet address in. You get cryptographically verifiable results out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built to Grow
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/douglasborthwick-crypto/insumer-examples/issues/1" rel="noopener noreferrer"&gt;specification is open&lt;/a&gt;. Any provider that implements JWKS-published keys and signed attestations (ES256 or EdDSA) can submit their dimension for verification and inclusion. The architecture does not cap at eight. It caps at however many meaningful dimensions of wallet trust exist. Working code examples are in the &lt;a href="https://github.com/douglasborthwick-crypto/insumer-examples" rel="noopener noreferrer"&gt;insumer-examples&lt;/a&gt; repository.&lt;/p&gt;

&lt;p&gt;Two additional dimensions are already in development: &lt;strong&gt;transaction history&lt;/strong&gt; (counterparty graph analysis) and &lt;strong&gt;compliance screening&lt;/strong&gt; (OFAC and sanctions). When they ship, existing integrations automatically receive those dimensions in their responses. No code changes. No version bumps. Two more specialists, two more signed attestations, a more complete picture.&lt;/p&gt;

&lt;p&gt;This extensibility is the difference between a product and a specification. A product locks you into one vendor's view of trust. A specification lets the ecosystem define trust dimensions as they emerge. Six months ago, reasoning integrity was not a dimension anyone was evaluating. ThoughtProof built it, proved it, and plugged into SkyeProfile. The next dimension no one is thinking about yet will follow the same path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Foundation: InsumerAPI
&lt;/h2&gt;

&lt;p&gt;InsumerAPI is not just one of the eight dimensions. It is the layer that makes the other seven meaningful. Without a verified view of wallet state, behavioral trust has no context. A sybil score means nothing if you do not know what the wallet holds. Identity verification has no anchor. Who controls this wallet matters only if the wallet controls real value. Governance has nothing to attach to. A delegation chain is academic if there are no assets at the end of it. Security posture, reasoning integrity, job performance, settlement history: each one is stronger, more actionable, and more trustworthy because InsumerAPI establishes ground truth first. Cryptographically signed. Cross-chain. Independently verifiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without InsumerAPI, you can compose signals. With it, you can trust them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;InsumerAPI reads blockchain state across thirty-three chains, evaluates conditions, and signs the result. This primitive, the signed boolean, is the irreducible building block. SkyeProfile composes that building block with seven other signed attestations into something greater than the sum of its parts. But the composition only works because the base layer is cryptographically verified. Remove it, and the other seven dimensions are opinions. Keep it, and they are evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-Transaction Trust
&lt;/h2&gt;

&lt;p&gt;You are about to send $10,000 to an agent wallet. &lt;a href="https://insumermodel.com/blog/before-an-agent-pays-wallet-auth-agentic-commerce.html" rel="noopener noreferrer"&gt;Run SkyeProfile&lt;/a&gt;. Settlement history says it has delivered on twelve of twelve previous jobs. Behavioral trust confirms it is not a sybil. Security posture comes back clean. Reasoning integrity passes. You proceed. That entire check took one API call and returned eight signed attestations you can verify offline. Without it, you are trusting a wallet address.&lt;/p&gt;

&lt;p&gt;Every transaction should start with a trust check. Before an agent pays another agent. Before a protocol grants API access. Before a marketplace accepts a new seller. Before a governance system weights a vote. The question is always the same: &lt;em&gt;should this wallet be trusted for this action?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;SkyeProfile is that check. Eight experts, one call, complete wallet trust. Not a score. Not a label. Not a black box. Eight independently signed, cryptographically verifiable attestations from eight specialized providers who do nothing but evaluate their dimension of trust. This is condition-based access at its fullest: the wallet either meets the conditions or it does not, and every answer is signed.&lt;/p&gt;

&lt;p&gt;The general contractor model works because no single expert knows everything, but together they cover every dimension that matters. SkyeProfile works the same way. And like any well-built house, it is designed so you can add rooms as the needs grow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>security</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
