@absol-labs/agent 0.11.0 → 0.12.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -50
- package/dist/capability/invocation-capability.d.ts +2 -2
- package/dist/capability/probe-capability.d.ts +225 -0
- package/dist/capability/probe-capability.d.ts.map +1 -0
- package/dist/capability/probe-capability.js +248 -0
- package/dist/capability/probe-capability.js.map +1 -0
- package/dist/cli/args.d.ts +11 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +23 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/claim.js +1 -1
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts.map +1 -1
- package/dist/cli/commands/close.js +35 -3
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/invoke.d.ts +2 -0
- package/dist/cli/commands/invoke.d.ts.map +1 -1
- package/dist/cli/commands/invoke.js +2 -2
- package/dist/cli/commands/invoke.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +15 -2
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/open.d.ts.map +1 -1
- package/dist/cli/commands/open.js +58 -4
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/pay.d.ts +19 -0
- package/dist/cli/commands/pay.d.ts.map +1 -0
- package/dist/cli/commands/pay.js +355 -0
- package/dist/cli/commands/pay.js.map +1 -0
- package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
- package/dist/cli/commands/reclaim-unverified.js +3 -2
- package/dist/cli/commands/reclaim-unverified.js.map +1 -1
- package/dist/cli/commands/reclaim.d.ts +23 -2
- package/dist/cli/commands/reclaim.d.ts.map +1 -1
- package/dist/cli/commands/reclaim.js +184 -16
- package/dist/cli/commands/reclaim.js.map +1 -1
- package/dist/cli/commands/refund.d.ts +13 -0
- package/dist/cli/commands/refund.d.ts.map +1 -0
- package/dist/cli/commands/refund.js +224 -0
- package/dist/cli/commands/refund.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +10 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/streams.js +8 -12
- package/dist/cli/commands/streams.js.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +2 -1
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/config.d.ts +44 -26
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +88 -38
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/deps.d.ts +33 -0
- package/dist/cli/deps.d.ts.map +1 -1
- package/dist/cli/deps.js +37 -1
- package/dist/cli/deps.js.map +1 -1
- package/dist/cli/errors.d.ts.map +1 -1
- package/dist/cli/errors.js +21 -1
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/escape-hatch.d.ts +6 -4
- package/dist/cli/escape-hatch.d.ts.map +1 -1
- package/dist/cli/escape-hatch.js +6 -2
- package/dist/cli/escape-hatch.js.map +1 -1
- package/dist/cli/listings.d.ts +18 -0
- package/dist/cli/listings.d.ts.map +1 -1
- package/dist/cli/listings.js +22 -12
- package/dist/cli/listings.js.map +1 -1
- package/dist/cli/preflight.d.ts +20 -14
- package/dist/cli/preflight.d.ts.map +1 -1
- package/dist/cli/preflight.js +34 -20
- package/dist/cli/preflight.js.map +1 -1
- package/dist/cli/privy.d.ts.map +1 -1
- package/dist/cli/privy.js +4 -2
- package/dist/cli/privy.js.map +1 -1
- package/dist/cli/reclaimability.d.ts +82 -0
- package/dist/cli/reclaimability.d.ts.map +1 -0
- package/dist/cli/reclaimability.js +80 -0
- package/dist/cli/reclaimability.js.map +1 -0
- package/dist/cli/run.d.ts +2 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +40 -11
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/scan-range.d.ts +2 -2
- package/dist/cli/scan-range.js +2 -2
- package/dist/cli/status.d.ts +3 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +15 -3
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/wallet.d.ts +1 -1
- package/dist/cli/wallet.js +2 -2
- package/dist/cli/wallet.js.map +1 -1
- package/dist/discovery/rate-band.d.ts +74 -0
- package/dist/discovery/rate-band.d.ts.map +1 -0
- package/dist/discovery/rate-band.js +114 -0
- package/dist/discovery/rate-band.js.map +1 -0
- package/dist/escrow-generation.d.ts +81 -0
- package/dist/escrow-generation.d.ts.map +1 -0
- package/dist/escrow-generation.js +76 -0
- package/dist/escrow-generation.js.map +1 -0
- package/dist/frameworks/agentkit.d.ts +8 -4
- package/dist/frameworks/agentkit.d.ts.map +1 -1
- package/dist/frameworks/agentkit.js +27 -10
- package/dist/frameworks/agentkit.js.map +1 -1
- package/dist/frameworks/eliza.d.ts +3 -3
- package/dist/frameworks/eliza.d.ts.map +1 -1
- package/dist/frameworks/eliza.js +15 -6
- package/dist/frameworks/eliza.js.map +1 -1
- package/dist/frameworks/langchain.d.ts.map +1 -1
- package/dist/frameworks/langchain.js +8 -0
- package/dist/frameworks/langchain.js.map +1 -1
- package/dist/gateway/caller-auth-gateway.d.ts +83 -31
- package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
- package/dist/gateway/caller-auth-gateway.js +180 -27
- package/dist/gateway/caller-auth-gateway.js.map +1 -1
- package/dist/gateway/http-server.d.ts +111 -44
- package/dist/gateway/http-server.d.ts.map +1 -1
- package/dist/gateway/http-server.js +439 -155
- package/dist/gateway/http-server.js.map +1 -1
- package/dist/gateway/probe-auth.d.ts +112 -0
- package/dist/gateway/probe-auth.d.ts.map +1 -0
- package/dist/gateway/probe-auth.js +127 -0
- package/dist/gateway/probe-auth.js.map +1 -0
- package/dist/gateway/signed-rate-bounds.d.ts +51 -0
- package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
- package/dist/gateway/signed-rate-bounds.js +94 -0
- package/dist/gateway/signed-rate-bounds.js.map +1 -0
- package/dist/gateway/x402-opener-mode.d.ts +215 -0
- package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
- package/dist/gateway/x402-opener-mode.js +639 -0
- package/dist/gateway/x402-opener-mode.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +52 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +228 -37
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/x402-tools.d.ts +104 -0
- package/dist/mcp/x402-tools.d.ts.map +1 -0
- package/dist/mcp/x402-tools.js +434 -0
- package/dist/mcp/x402-tools.js.map +1 -0
- package/dist/network.d.ts +119 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +199 -0
- package/dist/network.js.map +1 -0
- package/dist/sdk/invoke.d.ts +4 -0
- package/dist/sdk/invoke.d.ts.map +1 -1
- package/dist/sdk/invoke.js +2 -5
- package/dist/sdk/invoke.js.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
- package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.js +27 -23
- package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
- package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
- package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet-protocol.js +9 -2
- package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
- package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet.js +3 -2
- package/dist/wallet/autonomous-wallet.js.map +1 -1
- package/dist/wallet/broker-escrows.d.ts +222 -0
- package/dist/wallet/broker-escrows.d.ts.map +1 -0
- package/dist/wallet/broker-escrows.js +36 -0
- package/dist/wallet/broker-escrows.js.map +1 -0
- package/dist/wallet/lifecycle.d.ts +21 -5
- package/dist/wallet/lifecycle.d.ts.map +1 -1
- package/dist/wallet/lifecycle.js +32 -12
- package/dist/wallet/lifecycle.js.map +1 -1
- package/dist/wallet/privy-broker-server.d.ts.map +1 -1
- package/dist/wallet/privy-broker-server.js +31 -26
- package/dist/wallet/privy-broker-server.js.map +1 -1
- package/dist/wallet/privy-session-broker.d.ts +14 -5
- package/dist/wallet/privy-session-broker.d.ts.map +1 -1
- package/dist/wallet/privy-session-broker.js +29 -17
- package/dist/wallet/privy-session-broker.js.map +1 -1
- package/dist/wallet/privy-session-provider.d.ts +3 -1
- package/dist/wallet/privy-session-provider.d.ts.map +1 -1
- package/dist/wallet/privy-session-provider.js +5 -3
- package/dist/wallet/privy-session-provider.js.map +1 -1
- package/dist/wallet/provider.d.ts.map +1 -1
- package/dist/wallet/provider.js +15 -8
- package/dist/wallet/provider.js.map +1 -1
- package/dist/x402/facilitator.d.ts +3 -30
- package/dist/x402/facilitator.d.ts.map +1 -1
- package/dist/x402/facilitator.js +0 -27
- package/dist/x402/facilitator.js.map +1 -1
- package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
- package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
- package/dist/x402-buyer/guarded-fetch.js +147 -0
- package/dist/x402-buyer/guarded-fetch.js.map +1 -0
- package/dist/x402-buyer/index.d.ts +10 -0
- package/dist/x402-buyer/index.d.ts.map +1 -0
- package/dist/x402-buyer/index.js +10 -0
- package/dist/x402-buyer/index.js.map +1 -0
- package/dist/x402-buyer/pay.d.ts +135 -0
- package/dist/x402-buyer/pay.d.ts.map +1 -0
- package/dist/x402-buyer/pay.js +336 -0
- package/dist/x402-buyer/pay.js.map +1 -0
- package/dist/x402-opener/abi.d.ts +684 -0
- package/dist/x402-opener/abi.d.ts.map +1 -0
- package/dist/x402-opener/abi.js +880 -0
- package/dist/x402-opener/abi.js.map +1 -0
- package/dist/x402-opener/facilitator-entry.d.ts +3 -0
- package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
- package/dist/x402-opener/facilitator-entry.js +37 -0
- package/dist/x402-opener/facilitator-entry.js.map +1 -0
- package/dist/x402-opener/facilitator-server.d.ts +180 -0
- package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
- package/dist/x402-opener/facilitator-server.js +696 -0
- package/dist/x402-opener/facilitator-server.js.map +1 -0
- package/dist/x402-opener/index.d.ts +14 -0
- package/dist/x402-opener/index.d.ts.map +1 -0
- package/dist/x402-opener/index.js +14 -0
- package/dist/x402-opener/index.js.map +1 -0
- package/dist/x402-opener/listing-resolver.d.ts +55 -0
- package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
- package/dist/x402-opener/listing-resolver.js +125 -0
- package/dist/x402-opener/listing-resolver.js.map +1 -0
- package/dist/x402-opener/refund-relay.d.ts +240 -0
- package/dist/x402-opener/refund-relay.d.ts.map +1 -0
- package/dist/x402-opener/refund-relay.js +1240 -0
- package/dist/x402-opener/refund-relay.js.map +1 -0
- package/dist/x402-opener/relayer-queue.d.ts +14 -0
- package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
- package/dist/x402-opener/relayer-queue.js +18 -0
- package/dist/x402-opener/relayer-queue.js.map +1 -0
- package/dist/x402-opener/scheme.d.ts +217 -0
- package/dist/x402-opener/scheme.d.ts.map +1 -0
- package/dist/x402-opener/scheme.js +749 -0
- package/dist/x402-opener/scheme.js.map +1 -0
- package/dist/x402-opener/terms.d.ts +105 -0
- package/dist/x402-opener/terms.d.ts.map +1 -0
- package/dist/x402-opener/terms.js +212 -0
- package/dist/x402-opener/terms.js.map +1 -0
- package/dist/zktls/reclaim.d.ts +2 -2
- package/dist/zktls/t2-delivery-proof.d.ts +6 -6
- package/docs/agent-layer.md +3 -2
- package/docs/autonomous-privy-wallet.md +188 -0
- package/docs/cli.md +184 -31
- package/docs/langchain.md +5 -0
- package/docs/mcp-reference.md +75 -5
- package/docs/probe-capability.md +191 -0
- package/docs/quickstart.md +36 -1
- package/docs/threat-model.md +20 -0
- package/docs/x402.md +628 -595
- package/package.json +19 -17
- package/src/capability/probe-capability.ts +355 -0
- package/src/cli/args.ts +29 -0
- package/src/cli/commands/claim.ts +1 -1
- package/src/cli/commands/close.ts +36 -3
- package/src/cli/commands/invoke.ts +5 -2
- package/src/cli/commands/mcp.ts +18 -2
- package/src/cli/commands/open.ts +75 -4
- package/src/cli/commands/pay.ts +442 -0
- package/src/cli/commands/reclaim-unverified.ts +8 -2
- package/src/cli/commands/reclaim.ts +252 -14
- package/src/cli/commands/refund.ts +277 -0
- package/src/cli/commands/status.ts +17 -1
- package/src/cli/commands/streams.ts +10 -14
- package/src/cli/commands/watch.ts +7 -1
- package/src/cli/config.ts +139 -52
- package/src/cli/deps.ts +74 -1
- package/src/cli/errors.ts +24 -1
- package/src/cli/escape-hatch.ts +19 -5
- package/src/cli/listings.ts +43 -10
- package/src/cli/preflight.ts +36 -21
- package/src/cli/privy.ts +4 -2
- package/src/cli/reclaimability.ts +154 -0
- package/src/cli/run.ts +54 -11
- package/src/cli/scan-range.ts +2 -2
- package/src/cli/status.ts +14 -1
- package/src/cli/wallet.ts +2 -2
- package/src/discovery/rate-band.ts +172 -0
- package/src/escrow-generation.ts +135 -0
- package/src/frameworks/agentkit.ts +45 -11
- package/src/frameworks/eliza.ts +27 -5
- package/src/frameworks/langchain.ts +14 -0
- package/src/gateway/caller-auth-gateway.ts +320 -68
- package/src/gateway/http-server.ts +629 -220
- package/src/gateway/probe-auth.ts +191 -0
- package/src/gateway/signed-rate-bounds.ts +164 -0
- package/src/gateway/x402-opener-mode.ts +974 -0
- package/src/index.ts +82 -19
- package/src/mcp/server.ts +319 -42
- package/src/mcp/x402-tools.ts +621 -0
- package/src/network.ts +302 -0
- package/src/sdk/invoke.ts +6 -5
- package/src/wallet/autonomous-wallet-broker.ts +46 -20
- package/src/wallet/autonomous-wallet-protocol.ts +11 -2
- package/src/wallet/autonomous-wallet.ts +4 -2
- package/src/wallet/broker-escrows.ts +66 -0
- package/src/wallet/lifecycle.ts +53 -18
- package/src/wallet/privy-broker-server.ts +35 -25
- package/src/wallet/privy-session-broker.ts +58 -25
- package/src/wallet/privy-session-provider.ts +7 -3
- package/src/wallet/provider.ts +20 -15
- package/src/x402/facilitator.ts +3 -43
- package/src/x402-buyer/guarded-fetch.ts +213 -0
- package/src/x402-buyer/index.ts +9 -0
- package/src/x402-buyer/pay.ts +517 -0
- package/src/x402-opener/abi.ts +881 -0
- package/src/x402-opener/facilitator-entry.ts +45 -0
- package/src/x402-opener/facilitator-server.ts +1014 -0
- package/src/x402-opener/index.ts +13 -0
- package/src/x402-opener/listing-resolver.ts +202 -0
- package/src/x402-opener/refund-relay.ts +1743 -0
- package/src/x402-opener/relayer-queue.ts +18 -0
- package/src/x402-opener/scheme.ts +1133 -0
- package/src/x402-opener/terms.ts +300 -0
- package/dist/gateway/x402-mode.d.ts +0 -123
- package/dist/gateway/x402-mode.d.ts.map +0 -1
- package/dist/gateway/x402-mode.js +0 -212
- package/dist/gateway/x402-mode.js.map +0 -1
- package/dist/x402/delivery-oracle.d.ts +0 -108
- package/dist/x402/delivery-oracle.d.ts.map +0 -1
- package/dist/x402/delivery-oracle.js +0 -174
- package/dist/x402/delivery-oracle.js.map +0 -1
- package/dist/x402/facilitator-server-entry.d.ts +0 -3
- package/dist/x402/facilitator-server-entry.d.ts.map +0 -1
- package/dist/x402/facilitator-server-entry.js +0 -27
- package/dist/x402/facilitator-server-entry.js.map +0 -1
- package/dist/x402/facilitator-server.d.ts +0 -73
- package/dist/x402/facilitator-server.d.ts.map +0 -1
- package/dist/x402/facilitator-server.js +0 -305
- package/dist/x402/facilitator-server.js.map +0 -1
- package/dist/x402/payment-requirements.d.ts +0 -106
- package/dist/x402/payment-requirements.d.ts.map +0 -1
- package/dist/x402/payment-requirements.js +0 -138
- package/dist/x402/payment-requirements.js.map +0 -1
- package/dist/x402/relayer.d.ts +0 -41
- package/dist/x402/relayer.d.ts.map +0 -1
- package/dist/x402/relayer.js +0 -64
- package/dist/x402/relayer.js.map +0 -1
- package/dist/x402/resource-index.d.ts +0 -75
- package/dist/x402/resource-index.d.ts.map +0 -1
- package/dist/x402/resource-index.js +0 -126
- package/dist/x402/resource-index.js.map +0 -1
- package/dist/x402/verified-delivery-facilitator.d.ts +0 -285
- package/dist/x402/verified-delivery-facilitator.d.ts.map +0 -1
- package/dist/x402/verified-delivery-facilitator.js +0 -423
- package/dist/x402/verified-delivery-facilitator.js.map +0 -1
- package/src/gateway/x402-mode.ts +0 -350
- package/src/x402/delivery-oracle.ts +0 -285
- package/src/x402/facilitator-server-entry.ts +0 -35
- package/src/x402/facilitator-server.ts +0 -445
- package/src/x402/payment-requirements.ts +0 -231
- package/src/x402/relayer.ts +0 -122
- package/src/x402/resource-index.ts +0 -228
- package/src/x402/verified-delivery-facilitator.ts +0 -744
package/src/x402/relayer.ts
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createPublicClient,
|
|
3
|
-
createWalletClient,
|
|
4
|
-
http,
|
|
5
|
-
publicActions,
|
|
6
|
-
type Chain,
|
|
7
|
-
type Hex,
|
|
8
|
-
} from "viem";
|
|
9
|
-
import { privateKeyToAccount } from "viem/accounts";
|
|
10
|
-
import { base, baseSepolia } from "viem/chains";
|
|
11
|
-
import { settle as x402Settle, verify as x402Verify } from "x402/facilitator";
|
|
12
|
-
import type {
|
|
13
|
-
PaymentPayload,
|
|
14
|
-
PaymentRequirements,
|
|
15
|
-
SettleResponse,
|
|
16
|
-
VerifyResponse,
|
|
17
|
-
} from "x402/types";
|
|
18
|
-
|
|
19
|
-
import type {
|
|
20
|
-
PaymentSettler,
|
|
21
|
-
PaymentVerifier,
|
|
22
|
-
} from "./verified-delivery-facilitator.js";
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Chain wiring for the payment half of Metrik's x402 facilitator.
|
|
26
|
-
*
|
|
27
|
-
* Nothing here is Metrik-specific: verification and settlement are delegated
|
|
28
|
-
* VERBATIM to the real `x402/facilitator` implementation of the `exact` scheme.
|
|
29
|
-
* Metrik does not reimplement EIP-3009, and a change in the library's rules is
|
|
30
|
-
* inherited rather than drifted away from. The Metrik-specific part — the
|
|
31
|
-
* delivery gate — lives entirely in `./verified-delivery-facilitator.ts` and is
|
|
32
|
-
* layered ON TOP of whatever this returns.
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
export const X402_CHAINS: Readonly<Record<number, Chain>> = Object.freeze({
|
|
36
|
-
8453: base,
|
|
37
|
-
84532: baseSepolia,
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
export interface X402ChainOptions {
|
|
41
|
-
/** Default `84532` (Base Sepolia). */
|
|
42
|
-
readonly chainId?: number;
|
|
43
|
-
/** RPC endpoint. Required: the library's default public RPCs are not operable infrastructure. */
|
|
44
|
-
readonly rpcUrl: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function chainFor(chainId: number): Chain {
|
|
48
|
-
const chain = X402_CHAINS[chainId];
|
|
49
|
-
if (chain === undefined) {
|
|
50
|
-
throw new Error(`unsupported x402 settlement chain: ${chainId}`);
|
|
51
|
-
}
|
|
52
|
-
return chain;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Read-only verifier. Needs an RPC because the `exact` scheme checks the payer's
|
|
57
|
-
* on-chain balance; it holds no key and can broadcast nothing.
|
|
58
|
-
*/
|
|
59
|
-
export function createX402PaymentVerifier(
|
|
60
|
-
options: X402ChainOptions,
|
|
61
|
-
): PaymentVerifier {
|
|
62
|
-
const chain = chainFor(options.chainId ?? 84532);
|
|
63
|
-
const client = createPublicClient({
|
|
64
|
-
chain,
|
|
65
|
-
transport: http(options.rpcUrl),
|
|
66
|
-
});
|
|
67
|
-
return {
|
|
68
|
-
verify(
|
|
69
|
-
payload: PaymentPayload,
|
|
70
|
-
requirements: PaymentRequirements,
|
|
71
|
-
): Promise<VerifyResponse> {
|
|
72
|
-
return x402Verify(
|
|
73
|
-
client as Parameters<typeof x402Verify>[0],
|
|
74
|
-
payload,
|
|
75
|
-
requirements,
|
|
76
|
-
);
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export interface X402RelayerOptions extends X402ChainOptions {
|
|
82
|
-
/**
|
|
83
|
-
* The relayer's private key. This wallet BROADCASTS and pays gas; it never
|
|
84
|
-
* custodies payment funds (EIP-3009 moves value directly from payer to payee).
|
|
85
|
-
* Supplied by the operator through the environment, exactly like every other
|
|
86
|
-
* wallet in this package. Never committed, never defaulted.
|
|
87
|
-
*/
|
|
88
|
-
readonly privateKey: Hex;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* The settlement half. Constructing this is the ONLY place a key enters the
|
|
93
|
-
* facilitator, and there is no code path that broadcasts without one.
|
|
94
|
-
*/
|
|
95
|
-
export function createX402PaymentSettler(
|
|
96
|
-
options: X402RelayerOptions,
|
|
97
|
-
): PaymentSettler {
|
|
98
|
-
const chain = chainFor(options.chainId ?? 84532);
|
|
99
|
-
const account = privateKeyToAccount(options.privateKey);
|
|
100
|
-
const signer = createWalletClient({
|
|
101
|
-
account,
|
|
102
|
-
chain,
|
|
103
|
-
transport: http(options.rpcUrl),
|
|
104
|
-
}).extend(publicActions);
|
|
105
|
-
return {
|
|
106
|
-
settle(
|
|
107
|
-
payload: PaymentPayload,
|
|
108
|
-
requirements: PaymentRequirements,
|
|
109
|
-
): Promise<SettleResponse> {
|
|
110
|
-
return x402Settle(
|
|
111
|
-
signer as Parameters<typeof x402Settle>[0],
|
|
112
|
-
payload,
|
|
113
|
-
requirements,
|
|
114
|
-
);
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/** The relayer address, so an operator can check what they must fund with gas. */
|
|
120
|
-
export function relayerAddress(privateKey: Hex): `0x${string}` {
|
|
121
|
-
return privateKeyToAccount(privateKey).address;
|
|
122
|
-
}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
discoverServices,
|
|
3
|
-
type DiscoverServicesOptions,
|
|
4
|
-
type ServiceListing,
|
|
5
|
-
} from "../discovery/registry.js";
|
|
6
|
-
import type { SignedListingPayee } from "./payment-requirements.js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Maps an x402 `PaymentRequirements.resource` URL onto the Metrik listing that
|
|
10
|
-
* serves it — the step that decides whether Metrik has any business having an
|
|
11
|
-
* opinion about a payment at all.
|
|
12
|
-
*
|
|
13
|
-
* ## Derived, never supplied
|
|
14
|
-
*
|
|
15
|
-
* The only thing taken from the request is the `resource` URL itself, because
|
|
16
|
-
* the x402 wire format gives the facilitator nothing else to key on. Everything
|
|
17
|
-
* the verdict is actually computed from — which listing that URL belongs to, the
|
|
18
|
-
* operator address on it, and the delivery record for it — is resolved HERE,
|
|
19
|
-
* from Metrik's own verified view of the registry. In particular the
|
|
20
|
-
* `extra.metrikServiceRef` hint that `buildMetrikPaymentRequirements` publishes
|
|
21
|
-
* is deliberately ignored: it rides inside a caller-supplied body, and reading
|
|
22
|
-
* it would let a caller choose which service's delivery record gets checked.
|
|
23
|
-
*
|
|
24
|
-
* ## Origin matching, and why not path matching
|
|
25
|
-
*
|
|
26
|
-
* A listing owns an ORIGIN (scheme + host + port). Matching on origin means a
|
|
27
|
-
* seller does not have to re-register every route, and it cannot over-reach: two
|
|
28
|
-
* listings never share an origin, because the origin is what the oracle probes
|
|
29
|
-
* and what `serviceRef` is derived from. A resource whose origin matches no
|
|
30
|
-
* listing is simply not ours.
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
export interface ResolvedMetrikResource extends SignedListingPayee {
|
|
34
|
-
/** The listing, as verified by `discoverServices` (EIP-712 signer recovered). */
|
|
35
|
-
readonly listing: ServiceListing;
|
|
36
|
-
/** Which of the listing's signed origins the resource matched. */
|
|
37
|
-
readonly matchedOrigin: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export type ResourceIndexStatus =
|
|
41
|
-
| "resolved"
|
|
42
|
-
| "not-listed"
|
|
43
|
-
/**
|
|
44
|
-
* Two or more signed listings claim this origin, so there is no single right
|
|
45
|
-
* answer about whose delivery record applies.
|
|
46
|
-
*
|
|
47
|
-
* Picking one — which "first claimant wins" did — is the origin-squatting
|
|
48
|
-
* primitive: a second listing claiming a victim's origin could take over the
|
|
49
|
-
* victim's gate and permanently refuse their payments. Not exploitable while
|
|
50
|
-
* listing insertion requires an operator-held key, but "unresolvable" costs
|
|
51
|
-
* nothing and removes the primitive before registration ever opens.
|
|
52
|
-
*/
|
|
53
|
-
| "ambiguous"
|
|
54
|
-
| "registry-unavailable";
|
|
55
|
-
|
|
56
|
-
export interface ResourceLookup {
|
|
57
|
-
readonly status: ResourceIndexStatus;
|
|
58
|
-
readonly resource?: ResolvedMetrikResource;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface MetrikResourceIndex {
|
|
62
|
-
/** Never throws: an unreachable registry is a status, not an exception. */
|
|
63
|
-
lookup(resourceUrl: string): Promise<ResourceLookup>;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** How long a registry snapshot is reused before a refresh is attempted. */
|
|
67
|
-
export const DEFAULT_RESOURCE_INDEX_REFRESH_MS = 60_000;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* How long a stale snapshot keeps being served after refreshes start failing.
|
|
71
|
-
* Serving a stale listing is safe in a way that serving a stale DELIVERY verdict
|
|
72
|
-
* is not: listings change on a human timescale (a new signed descriptor), and
|
|
73
|
-
* the fields used from them — `operator`, `serviceRef` — are the stable ones. The
|
|
74
|
-
* live verdict is always fetched fresh by the delivery oracle.
|
|
75
|
-
*/
|
|
76
|
-
export const DEFAULT_RESOURCE_INDEX_MAX_STALE_MS = 15 * 60_000;
|
|
77
|
-
|
|
78
|
-
export interface RegistryResourceIndexOptions {
|
|
79
|
-
readonly discover?: () => Promise<readonly ServiceListing[]>;
|
|
80
|
-
readonly discoverOptions?: DiscoverServicesOptions;
|
|
81
|
-
readonly refreshMs?: number;
|
|
82
|
-
readonly maxStaleMs?: number;
|
|
83
|
-
readonly now?: () => number;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export function createRegistryResourceIndex(
|
|
87
|
-
options: RegistryResourceIndexOptions = {},
|
|
88
|
-
): MetrikResourceIndex {
|
|
89
|
-
const refreshMs = options.refreshMs ?? DEFAULT_RESOURCE_INDEX_REFRESH_MS;
|
|
90
|
-
const maxStaleMs = options.maxStaleMs ?? DEFAULT_RESOURCE_INDEX_MAX_STALE_MS;
|
|
91
|
-
const now = options.now ?? (() => Date.now());
|
|
92
|
-
const discover =
|
|
93
|
-
options.discover ??
|
|
94
|
-
(() =>
|
|
95
|
-
discoverServices(options.discoverOptions ?? {}) as Promise<
|
|
96
|
-
readonly ServiceListing[]
|
|
97
|
-
>);
|
|
98
|
-
|
|
99
|
-
interface Snapshot {
|
|
100
|
-
readonly loadedAtMs: number;
|
|
101
|
-
readonly byOrigin: ReadonlyMap<string, ResolvedMetrikResource>;
|
|
102
|
-
readonly ambiguous: ReadonlySet<string>;
|
|
103
|
-
}
|
|
104
|
-
let snapshot: Snapshot | undefined;
|
|
105
|
-
let inFlight: Promise<Snapshot | undefined> | undefined;
|
|
106
|
-
|
|
107
|
-
async function refresh(): Promise<Snapshot | undefined> {
|
|
108
|
-
try {
|
|
109
|
-
const listings = await discover();
|
|
110
|
-
const byOrigin = new Map<string, ResolvedMetrikResource>();
|
|
111
|
-
const ambiguous = new Set<string>();
|
|
112
|
-
for (const listing of listings) {
|
|
113
|
-
for (const origin of signedOriginsOf(listing)) {
|
|
114
|
-
const claimed = byOrigin.get(origin);
|
|
115
|
-
if (claimed === undefined) {
|
|
116
|
-
byOrigin.set(origin, {
|
|
117
|
-
serviceRef: listing.serviceRef,
|
|
118
|
-
operator: listing.operator,
|
|
119
|
-
listing,
|
|
120
|
-
matchedOrigin: origin,
|
|
121
|
-
});
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
// A DIFFERENT service claiming an origin another already claims makes
|
|
125
|
-
// the origin unresolvable, not first-come-first-served. See the
|
|
126
|
-
// `ambiguous` doc on `ResourceIndexStatus`. A listing re-claiming its
|
|
127
|
-
// OWN origin (e.g. publicUrl and baseUrl agreeing) is not a conflict.
|
|
128
|
-
if (
|
|
129
|
-
claimed.serviceRef.toLowerCase() !==
|
|
130
|
-
listing.serviceRef.toLowerCase()
|
|
131
|
-
) {
|
|
132
|
-
ambiguous.add(origin);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
for (const origin of ambiguous) {
|
|
137
|
-
byOrigin.delete(origin);
|
|
138
|
-
}
|
|
139
|
-
return { loadedAtMs: now(), byOrigin, ambiguous };
|
|
140
|
-
} catch {
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async function currentSnapshot(): Promise<Snapshot | undefined> {
|
|
146
|
-
const cached = snapshot;
|
|
147
|
-
if (cached !== undefined && now() - cached.loadedAtMs < refreshMs) {
|
|
148
|
-
return cached;
|
|
149
|
-
}
|
|
150
|
-
inFlight ??= refresh().finally(() => {
|
|
151
|
-
inFlight = undefined;
|
|
152
|
-
});
|
|
153
|
-
const loaded = await inFlight;
|
|
154
|
-
if (loaded !== undefined) {
|
|
155
|
-
snapshot = loaded;
|
|
156
|
-
return loaded;
|
|
157
|
-
}
|
|
158
|
-
if (cached !== undefined && now() - cached.loadedAtMs <= maxStaleMs) {
|
|
159
|
-
return cached;
|
|
160
|
-
}
|
|
161
|
-
return undefined;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
async lookup(resourceUrl) {
|
|
166
|
-
const origin = originOf(resourceUrl);
|
|
167
|
-
if (origin === undefined) {
|
|
168
|
-
return { status: "not-listed" };
|
|
169
|
-
}
|
|
170
|
-
const loaded = await currentSnapshot();
|
|
171
|
-
if (loaded === undefined) {
|
|
172
|
-
return { status: "registry-unavailable" };
|
|
173
|
-
}
|
|
174
|
-
if (loaded.ambiguous.has(origin)) {
|
|
175
|
-
return { status: "ambiguous" };
|
|
176
|
-
}
|
|
177
|
-
const resource = loaded.byOrigin.get(origin);
|
|
178
|
-
return resource === undefined
|
|
179
|
-
? { status: "not-listed" }
|
|
180
|
-
: { status: "resolved", resource };
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/** Every origin the SIGNED record claims for a listing. */
|
|
186
|
-
export function signedOriginsOf(listing: ServiceListing): readonly string[] {
|
|
187
|
-
const candidates: (string | undefined)[] = [
|
|
188
|
-
listing.publicUrl,
|
|
189
|
-
listing.accessUrl,
|
|
190
|
-
];
|
|
191
|
-
const descriptor = (
|
|
192
|
-
listing.signed as {
|
|
193
|
-
descriptor?: {
|
|
194
|
-
interface?: { baseUrl?: string };
|
|
195
|
-
callerAuth?: { accessUrl?: string };
|
|
196
|
-
publicUrl?: string;
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
).descriptor;
|
|
200
|
-
if (descriptor !== undefined) {
|
|
201
|
-
candidates.push(
|
|
202
|
-
descriptor.publicUrl,
|
|
203
|
-
descriptor.interface?.baseUrl,
|
|
204
|
-
descriptor.callerAuth?.accessUrl,
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
const origins = new Set<string>();
|
|
208
|
-
for (const candidate of candidates) {
|
|
209
|
-
const origin = candidate === undefined ? undefined : originOf(candidate);
|
|
210
|
-
if (origin !== undefined) {
|
|
211
|
-
origins.add(origin);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return [...origins];
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/** Normalized `scheme://host[:port]`, or `undefined` if not a usable URL. */
|
|
218
|
-
export function originOf(url: string): string | undefined {
|
|
219
|
-
try {
|
|
220
|
-
const parsed = new URL(url);
|
|
221
|
-
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
222
|
-
return undefined;
|
|
223
|
-
}
|
|
224
|
-
return `${parsed.protocol}//${parsed.host.toLowerCase()}`;
|
|
225
|
-
} catch {
|
|
226
|
-
return undefined;
|
|
227
|
-
}
|
|
228
|
-
}
|