x402-trust-layer 5.1.0
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/CHANGELOG.md +55 -0
- package/DEPLOY.md +53 -0
- package/Dockerfile +30 -0
- package/LICENSE +21 -0
- package/README.md +294 -0
- package/dist/agents/a2a-payment.d.ts +37 -0
- package/dist/agents/a2a-payment.js +105 -0
- package/dist/agents/agent-escrow.d.ts +30 -0
- package/dist/agents/agent-escrow.js +23 -0
- package/dist/agents/agent-verify.d.ts +15 -0
- package/dist/agents/agent-verify.js +112 -0
- package/dist/agents/api-router.d.ts +32 -0
- package/dist/agents/api-router.js +228 -0
- package/dist/agents/attestation-registry.d.ts +35 -0
- package/dist/agents/attestation-registry.js +76 -0
- package/dist/agents/audition-coach.d.ts +45 -0
- package/dist/agents/audition-coach.js +257 -0
- package/dist/agents/bedrock-bridge.d.ts +3 -0
- package/dist/agents/bedrock-bridge.js +60 -0
- package/dist/agents/budget-allocator.d.ts +24 -0
- package/dist/agents/budget-allocator.js +31 -0
- package/dist/agents/compliance-ledger.d.ts +66 -0
- package/dist/agents/compliance-ledger.js +80 -0
- package/dist/agents/dispute-resolver.d.ts +62 -0
- package/dist/agents/dispute-resolver.js +124 -0
- package/dist/agents/evidence-locker.d.ts +30 -0
- package/dist/agents/evidence-locker.js +47 -0
- package/dist/agents/facilitator-failover.d.ts +15 -0
- package/dist/agents/facilitator-failover.js +18 -0
- package/dist/agents/identity-gate.d.ts +20 -0
- package/dist/agents/identity-gate.js +79 -0
- package/dist/agents/mandate-compiler.d.ts +51 -0
- package/dist/agents/mandate-compiler.js +73 -0
- package/dist/agents/mandate-diff.d.ts +41 -0
- package/dist/agents/mandate-diff.js +170 -0
- package/dist/agents/market-buy-advisor.d.ts +65 -0
- package/dist/agents/market-buy-advisor.js +234 -0
- package/dist/agents/merchant-trust.d.ts +38 -0
- package/dist/agents/merchant-trust.js +171 -0
- package/dist/agents/mpp-session-broker.d.ts +27 -0
- package/dist/agents/mpp-session-broker.js +29 -0
- package/dist/agents/mpp-session-v2.d.ts +76 -0
- package/dist/agents/mpp-session-v2.js +269 -0
- package/dist/agents/payment-intent-compiler.d.ts +21 -0
- package/dist/agents/payment-intent-compiler.js +45 -0
- package/dist/agents/pipeline-execute.d.ts +40 -0
- package/dist/agents/pipeline-execute.js +100 -0
- package/dist/agents/pipeline-trust-v2.d.ts +31 -0
- package/dist/agents/pipeline-trust-v2.js +111 -0
- package/dist/agents/pre-x402-guard.d.ts +35 -0
- package/dist/agents/pre-x402-guard.js +84 -0
- package/dist/agents/quality-escrow-semantic.d.ts +88 -0
- package/dist/agents/quality-escrow-semantic.js +137 -0
- package/dist/agents/quality-escrow.d.ts +65 -0
- package/dist/agents/quality-escrow.js +104 -0
- package/dist/agents/quality-monitor.d.ts +32 -0
- package/dist/agents/quality-monitor.js +77 -0
- package/dist/agents/rail-optimizer.d.ts +33 -0
- package/dist/agents/rail-optimizer.js +133 -0
- package/dist/agents/receipt-auditor.d.ts +14 -0
- package/dist/agents/receipt-auditor.js +145 -0
- package/dist/agents/refund-arbiter.d.ts +24 -0
- package/dist/agents/refund-arbiter.js +70 -0
- package/dist/agents/research-brief.d.ts +14 -0
- package/dist/agents/research-brief.js +66 -0
- package/dist/agents/risk-gate.d.ts +11 -0
- package/dist/agents/risk-gate.js +78 -0
- package/dist/agents/settlement-graph.d.ts +16 -0
- package/dist/agents/settlement-graph.js +38 -0
- package/dist/agents/spend-governor.d.ts +2 -0
- package/dist/agents/spend-governor.js +70 -0
- package/dist/agents/trust-network.d.ts +138 -0
- package/dist/agents/trust-network.js +244 -0
- package/dist/agents/x402-proxy.d.ts +32 -0
- package/dist/agents/x402-proxy.js +90 -0
- package/dist/client/demo-alchemy-live.d.ts +1 -0
- package/dist/client/demo-alchemy-live.js +226 -0
- package/dist/client/demo-tail.d.ts +1 -0
- package/dist/client/demo-tail.js +100 -0
- package/dist/client/demo.d.ts +1 -0
- package/dist/client/demo.js +293 -0
- package/dist/config.d.ts +94 -0
- package/dist/config.js +223 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +389 -0
- package/dist/lib/agent-response.d.ts +14 -0
- package/dist/lib/agent-response.js +13 -0
- package/dist/lib/agentic-gateways.d.ts +5 -0
- package/dist/lib/agentic-gateways.js +15 -0
- package/dist/lib/agentic-probes.d.ts +10 -0
- package/dist/lib/agentic-probes.js +49 -0
- package/dist/lib/alchemy-x402-fetch.d.ts +16 -0
- package/dist/lib/alchemy-x402-fetch.js +95 -0
- package/dist/lib/apply-verifier-body.d.ts +7 -0
- package/dist/lib/apply-verifier-body.js +179 -0
- package/dist/lib/attestation.d.ts +30 -0
- package/dist/lib/attestation.js +107 -0
- package/dist/lib/bazaar-extension.d.ts +15 -0
- package/dist/lib/bazaar-extension.js +265 -0
- package/dist/lib/bazaar.d.ts +100 -0
- package/dist/lib/bazaar.js +341 -0
- package/dist/lib/certified-sellers.d.ts +41 -0
- package/dist/lib/certified-sellers.js +129 -0
- package/dist/lib/chains.d.ts +20 -0
- package/dist/lib/chains.js +78 -0
- package/dist/lib/db-persistence.d.ts +7 -0
- package/dist/lib/db-persistence.js +65 -0
- package/dist/lib/db.d.ts +5 -0
- package/dist/lib/db.js +113 -0
- package/dist/lib/discovery-page.d.ts +2 -0
- package/dist/lib/discovery-page.js +71 -0
- package/dist/lib/ecosystem-telemetry.d.ts +20 -0
- package/dist/lib/ecosystem-telemetry.js +80 -0
- package/dist/lib/erc8004/agent-card.d.ts +34 -0
- package/dist/lib/erc8004/agent-card.js +151 -0
- package/dist/lib/erc8004/cache.d.ts +3 -0
- package/dist/lib/erc8004/cache.js +17 -0
- package/dist/lib/erc8004/constants.d.ts +22 -0
- package/dist/lib/erc8004/constants.js +35 -0
- package/dist/lib/erc8004/registry.d.ts +19 -0
- package/dist/lib/erc8004/registry.js +171 -0
- package/dist/lib/erc8004/resolve-agent.d.ts +7 -0
- package/dist/lib/erc8004/resolve-agent.js +70 -0
- package/dist/lib/erc8004/trust-score.d.ts +33 -0
- package/dist/lib/erc8004/trust-score.js +136 -0
- package/dist/lib/escrow-ledger.d.ts +14 -0
- package/dist/lib/escrow-ledger.js +54 -0
- package/dist/lib/escrow-unified.d.ts +15 -0
- package/dist/lib/escrow-unified.js +28 -0
- package/dist/lib/facilitator-extra.d.ts +13 -0
- package/dist/lib/facilitator-extra.js +52 -0
- package/dist/lib/facilitators.d.ts +20 -0
- package/dist/lib/facilitators.js +89 -0
- package/dist/lib/host-policy.d.ts +4 -0
- package/dist/lib/host-policy.js +20 -0
- package/dist/lib/idempotency.d.ts +4 -0
- package/dist/lib/idempotency.js +120 -0
- package/dist/lib/ledger.d.ts +2 -0
- package/dist/lib/ledger.js +17 -0
- package/dist/lib/logger.d.ts +6 -0
- package/dist/lib/logger.js +24 -0
- package/dist/lib/mandate-vc.d.ts +20 -0
- package/dist/lib/mandate-vc.js +25 -0
- package/dist/lib/mandate.d.ts +44 -0
- package/dist/lib/mandate.js +190 -0
- package/dist/lib/marketplace.d.ts +7 -0
- package/dist/lib/marketplace.js +127 -0
- package/dist/lib/migrations.d.ts +2 -0
- package/dist/lib/migrations.js +130 -0
- package/dist/lib/nonce-store.d.ts +6 -0
- package/dist/lib/nonce-store.js +109 -0
- package/dist/lib/openapi-agentcash.d.ts +5 -0
- package/dist/lib/openapi-agentcash.js +288 -0
- package/dist/lib/openapi-meta.d.ts +5 -0
- package/dist/lib/openapi-meta.js +235 -0
- package/dist/lib/otel.d.ts +2 -0
- package/dist/lib/otel.js +25 -0
- package/dist/lib/paid-resource-url.d.ts +6 -0
- package/dist/lib/paid-resource-url.js +47 -0
- package/dist/lib/parse-with-verifier-fallback.d.ts +3 -0
- package/dist/lib/parse-with-verifier-fallback.js +13 -0
- package/dist/lib/payment-request-context.d.ts +10 -0
- package/dist/lib/payment-request-context.js +5 -0
- package/dist/lib/payment-response.d.ts +13 -0
- package/dist/lib/payment-response.js +39 -0
- package/dist/lib/payto-guard.d.ts +10 -0
- package/dist/lib/payto-guard.js +20 -0
- package/dist/lib/probe.d.ts +29 -0
- package/dist/lib/probe.js +157 -0
- package/dist/lib/problem-detail.d.ts +10 -0
- package/dist/lib/problem-detail.js +14 -0
- package/dist/lib/rate-limit.d.ts +12 -0
- package/dist/lib/rate-limit.js +126 -0
- package/dist/lib/replay-middleware.d.ts +3 -0
- package/dist/lib/replay-middleware.js +27 -0
- package/dist/lib/response-guard.d.ts +5 -0
- package/dist/lib/response-guard.js +40 -0
- package/dist/lib/safe-fetch.d.ts +5 -0
- package/dist/lib/safe-fetch.js +19 -0
- package/dist/lib/security.d.ts +13 -0
- package/dist/lib/security.js +61 -0
- package/dist/lib/semantic-judge.d.ts +14 -0
- package/dist/lib/semantic-judge.js +107 -0
- package/dist/lib/semantic-judge.test.d.ts +1 -0
- package/dist/lib/semantic-judge.test.js +11 -0
- package/dist/lib/ssrf.d.ts +10 -0
- package/dist/lib/ssrf.js +130 -0
- package/dist/lib/ssrf.test.d.ts +1 -0
- package/dist/lib/ssrf.test.js +16 -0
- package/dist/lib/suite-catalog.d.ts +83 -0
- package/dist/lib/suite-catalog.js +131 -0
- package/dist/lib/telemetry.d.ts +5 -0
- package/dist/lib/telemetry.js +37 -0
- package/dist/lib/verifier-fast-path.d.ts +10 -0
- package/dist/lib/verifier-fast-path.js +44 -0
- package/dist/lib/verifier-probe-protocol.d.ts +7 -0
- package/dist/lib/verifier-probe-protocol.js +115 -0
- package/dist/lib/verify-examples.d.ts +2 -0
- package/dist/lib/verify-examples.js +438 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.js +2 -0
- package/dist/lib/webhook-auth.d.ts +3 -0
- package/dist/lib/webhook-auth.js +34 -0
- package/dist/lib/webhook-routes.d.ts +2 -0
- package/dist/lib/webhook-routes.js +112 -0
- package/dist/lib/webhooks.d.ts +23 -0
- package/dist/lib/webhooks.js +123 -0
- package/dist/lib/webhooks.test.d.ts +1 -0
- package/dist/lib/webhooks.test.js +16 -0
- package/dist/lib/x402-client-options.d.ts +28 -0
- package/dist/lib/x402-client-options.js +138 -0
- package/dist/lib/x402-headers.d.ts +10 -0
- package/dist/lib/x402-headers.js +27 -0
- package/dist/lib/x402-paid.d.ts +5 -0
- package/dist/lib/x402-paid.js +252 -0
- package/dist/lib/x402-payment-replay.d.ts +22 -0
- package/dist/lib/x402-payment-replay.js +57 -0
- package/dist/lib/x402gle-host-verify.d.ts +3 -0
- package/dist/lib/x402gle-host-verify.js +27 -0
- package/dist/protocol/agent-passport.d.ts +34 -0
- package/dist/protocol/agent-passport.js +44 -0
- package/dist/protocol/compliance-v2.d.ts +21 -0
- package/dist/protocol/compliance-v2.js +19 -0
- package/dist/protocol/credit-bureau.d.ts +18 -0
- package/dist/protocol/credit-bureau.js +44 -0
- package/dist/protocol/crypto.d.ts +6 -0
- package/dist/protocol/crypto.js +41 -0
- package/dist/protocol/escrow-fsm.d.ts +33 -0
- package/dist/protocol/escrow-fsm.js +99 -0
- package/dist/protocol/fraud-engine.d.ts +28 -0
- package/dist/protocol/fraud-engine.js +77 -0
- package/dist/protocol/observability.d.ts +14 -0
- package/dist/protocol/observability.js +21 -0
- package/dist/protocol/pipeline-full-trust.d.ts +40 -0
- package/dist/protocol/pipeline-full-trust.js +96 -0
- package/dist/protocol/proof-of-execution.d.ts +36 -0
- package/dist/protocol/proof-of-execution.js +48 -0
- package/dist/protocol/reasoning-audit.d.ts +27 -0
- package/dist/protocol/reasoning-audit.js +51 -0
- package/dist/protocol/replay-guard.d.ts +28 -0
- package/dist/protocol/replay-guard.js +76 -0
- package/dist/protocol/replay-guard.test.d.ts +1 -0
- package/dist/protocol/replay-guard.test.js +10 -0
- package/dist/protocol/security-audit.d.ts +18 -0
- package/dist/protocol/security-audit.js +45 -0
- package/dist/protocol/store.d.ts +5 -0
- package/dist/protocol/store.js +59 -0
- package/dist/protocol/threat-catalog.d.ts +13 -0
- package/dist/protocol/threat-catalog.js +75 -0
- package/dist/protocol/trust-oracle.d.ts +23 -0
- package/dist/protocol/trust-oracle.js +30 -0
- package/dist/protocol/trust-score-v2.d.ts +33 -0
- package/dist/protocol/trust-score-v2.js +78 -0
- package/dist/protocol/zk-proofs.d.ts +24 -0
- package/dist/protocol/zk-proofs.js +32 -0
- package/dist/routes/a2a-agent-card.d.ts +3 -0
- package/dist/routes/a2a-agent-card.js +28 -0
- package/dist/routes/catalog.d.ts +5 -0
- package/dist/routes/catalog.js +47 -0
- package/dist/routes/register-all.d.ts +3 -0
- package/dist/routes/register-all.js +1240 -0
- package/dist/routes/schemas.d.ts +83 -0
- package/dist/routes/schemas.js +38 -0
- package/dist/routes/shared.d.ts +16 -0
- package/dist/routes/shared.js +27 -0
- package/dist/routes-protocol.d.ts +10 -0
- package/dist/routes-protocol.js +322 -0
- package/dist/routes.d.ts +2 -0
- package/dist/routes.js +2 -0
- package/dist/types.d.ts +66 -0
- package/dist/types.js +1 -0
- package/openapi.json +7940 -0
- package/package.json +124 -0
- package/public/.well-known/ai-plugin.json +12 -0
- package/public/assets/aegis-logo-blue.png +0 -0
- package/public/assets/aegis-logo-gold.png +0 -0
- package/public/assets/aegis-logo-green.png +0 -0
- package/public/assets/aegis-logo-purple.png +0 -0
- package/public/assets/aegis-logo-red.png +0 -0
- package/public/assets/aegis-logo-white.png +0 -0
- package/public/assets/aegis-logo.png +0 -0
- package/public/assets/x402-trustlayer-logo.png +0 -0
- package/public/assets/x402-trustlayer-logo.svg +5 -0
- package/public/data/agents.json +1528 -0
- package/public/index.html +198 -0
- package/public/landing.css +342 -0
- package/public/landing.js +405 -0
- package/public/llms-full.txt +582 -0
- package/public/llms.txt +132 -0
- package/public/skill.md +135 -0
- package/railway.toml +9 -0
- package/scripts/docker-entrypoint.sh +7 -0
- package/scripts/patch-facilitator-timeout.mjs +61 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live Alchemy x402 + Trust Layer demo.
|
|
3
|
+
*
|
|
4
|
+
* Prerequisites:
|
|
5
|
+
* EVM_PRIVATE_KEY — Base wallet with ~$3 USDC (not your PAY_TO_EVM receive wallet)
|
|
6
|
+
* Optional: ALCHEMY_DEMO_ENTERPRISE=1 for mandate + compliance ledger steps
|
|
7
|
+
*
|
|
8
|
+
* Run: npm run demo:alchemy
|
|
9
|
+
*/
|
|
10
|
+
import dotenv from "dotenv";
|
|
11
|
+
import { getWalletAddress } from "@alchemy/x402";
|
|
12
|
+
import { wrapFetch } from "@dexterai/x402/client";
|
|
13
|
+
import { CHAIN_IDS } from "../lib/chains.js";
|
|
14
|
+
import { alchemyX402Pay } from "../lib/alchemy-x402-fetch.js";
|
|
15
|
+
import { assertDemoPayerNotReceiveWallet, assertPayerKeys, buildWrapFetchOptions, } from "../lib/x402-client-options.js";
|
|
16
|
+
dotenv.config();
|
|
17
|
+
const TRUST_BASE = (process.env.TRUST_LAYER_BASE ?? "https://x402trustlayer.xyz").replace(/\/$/, "");
|
|
18
|
+
const ALCHEMY_GATEWAY = "https://x402.alchemy.com/base-mainnet/v2";
|
|
19
|
+
const ALCHEMY_HOST = "x402.alchemy.com";
|
|
20
|
+
const AGENT_ID = process.env.ALCHEMY_DEMO_AGENT_ID ?? "alchemy-live-demo-1";
|
|
21
|
+
const ENTERPRISE = process.env.ALCHEMY_DEMO_ENTERPRISE === "1" || process.argv.includes("--enterprise");
|
|
22
|
+
const ESTIMATED_ALCHEMY_USDC = Number(process.env.ALCHEMY_DEMO_CREDIT_USDC ?? "1");
|
|
23
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
24
|
+
const costs = [];
|
|
25
|
+
function logStep(n, title) {
|
|
26
|
+
console.log(`\n${"=".repeat(60)}`);
|
|
27
|
+
console.log(`STEP ${n}: ${title}`);
|
|
28
|
+
console.log("=".repeat(60));
|
|
29
|
+
}
|
|
30
|
+
function trackCost(step, usdc, note) {
|
|
31
|
+
costs.push({ step, usdc, note });
|
|
32
|
+
console.log(` 💰 ~$${usdc.toFixed(2)} USDC — ${note}`);
|
|
33
|
+
}
|
|
34
|
+
async function main() {
|
|
35
|
+
console.log("Alchemy x402 + Trust Layer — LIVE demo");
|
|
36
|
+
console.log(`Trust Layer: ${TRUST_BASE}`);
|
|
37
|
+
console.log(`Alchemy gateway: ${ALCHEMY_GATEWAY}`);
|
|
38
|
+
console.log(`Enterprise mode: ${ENTERPRISE ? "ON (mandate + ledger)" : "OFF"}`);
|
|
39
|
+
console.log("");
|
|
40
|
+
if (!process.env.EVM_PRIVATE_KEY?.trim()) {
|
|
41
|
+
throw new Error("EVM_PRIVATE_KEY is required for Alchemy SIWE + Base USDC payments");
|
|
42
|
+
}
|
|
43
|
+
assertPayerKeys();
|
|
44
|
+
await assertDemoPayerNotReceiveWallet();
|
|
45
|
+
const evmKey = process.env.EVM_PRIVATE_KEY.trim();
|
|
46
|
+
const walletAddress = getWalletAddress(evmKey);
|
|
47
|
+
console.log(`Payer wallet: ${walletAddress}`);
|
|
48
|
+
const trustFetch = wrapFetch(fetch, {
|
|
49
|
+
...buildWrapFetchOptions({ verbose: process.env.X402_VERBOSE === "1" }),
|
|
50
|
+
preferredNetwork: CHAIN_IDS.base,
|
|
51
|
+
});
|
|
52
|
+
async function trustPost(path, body, priceUsdc, label) {
|
|
53
|
+
const res = await trustFetch(`${TRUST_BASE}${path}`, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: { "content-type": "application/json" },
|
|
56
|
+
body: JSON.stringify(body),
|
|
57
|
+
});
|
|
58
|
+
const text = await res.text();
|
|
59
|
+
let json;
|
|
60
|
+
try {
|
|
61
|
+
json = text ? JSON.parse(text) : null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
json = { raw: text.slice(0, 500) };
|
|
65
|
+
}
|
|
66
|
+
if (!res.ok) {
|
|
67
|
+
throw new Error(`${path} HTTP ${res.status}: ${text.slice(0, 400)}`);
|
|
68
|
+
}
|
|
69
|
+
trackCost(label, priceUsdc, path);
|
|
70
|
+
return json;
|
|
71
|
+
}
|
|
72
|
+
let mandateId;
|
|
73
|
+
if (ENTERPRISE) {
|
|
74
|
+
logStep(1, "Mandate compile (human intent → signed scope)");
|
|
75
|
+
const mandate = await trustPost("/api/mandate/compile", {
|
|
76
|
+
principal: "demo:cfo",
|
|
77
|
+
agentId: AGENT_ID,
|
|
78
|
+
intent: "Query Alchemy blockchain data via x402 gateway for agent demo",
|
|
79
|
+
maxPerTxUsdc: 2,
|
|
80
|
+
dailyCapUsdc: 20,
|
|
81
|
+
allowedMerchants: [ALCHEMY_HOST],
|
|
82
|
+
allowedCategories: ["blockchain-data"],
|
|
83
|
+
allowedRails: ["base-x402"],
|
|
84
|
+
ttlMinutes: 1440,
|
|
85
|
+
}, 0.08, "mandate compile");
|
|
86
|
+
const mandateRecord = mandate.mandate && typeof mandate.mandate === "object"
|
|
87
|
+
? mandate.mandate
|
|
88
|
+
: null;
|
|
89
|
+
mandateId =
|
|
90
|
+
(typeof mandateRecord?.mandateId === "string" && mandateRecord.mandateId) ||
|
|
91
|
+
(typeof mandate.mandateId === "string" ? mandate.mandateId : undefined);
|
|
92
|
+
if (!mandateId) {
|
|
93
|
+
throw new Error("Mandate compile did not return mandateId — check /api/mandate/compile response");
|
|
94
|
+
}
|
|
95
|
+
console.log(JSON.stringify({ mandateId, verifyUrl: mandate.verifyUrl }, null, 2));
|
|
96
|
+
logStep(2, "Mandate verify (proposed payment in scope?)");
|
|
97
|
+
const verify = await trustPost("/api/mandate/verify", {
|
|
98
|
+
mandateId,
|
|
99
|
+
proposed: {
|
|
100
|
+
amountUsdc: ESTIMATED_ALCHEMY_USDC,
|
|
101
|
+
merchant: ALCHEMY_HOST,
|
|
102
|
+
category: "blockchain-data",
|
|
103
|
+
rail: "base-x402",
|
|
104
|
+
},
|
|
105
|
+
}, 0.02, "mandate verify");
|
|
106
|
+
console.log(JSON.stringify({ withinScope: verify.withinScope, reason: verify.reason, violations: verify.violations }, null, 2));
|
|
107
|
+
if (verify.withinScope === false) {
|
|
108
|
+
throw new Error(`Mandate verify failed: ${String(verify.reason)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const guardStep = ENTERPRISE ? 3 : 1;
|
|
112
|
+
logStep(guardStep, "Trust Layer guard — allowed to pay Alchemy?");
|
|
113
|
+
const guard = await trustPost("/api/guard/pre-x402", {
|
|
114
|
+
agentId: AGENT_ID,
|
|
115
|
+
walletAddress,
|
|
116
|
+
targetUrl: ALCHEMY_GATEWAY,
|
|
117
|
+
estimatedCostUsdc: ESTIMATED_ALCHEMY_USDC,
|
|
118
|
+
network: CHAIN_IDS.base,
|
|
119
|
+
policy: {
|
|
120
|
+
dailyCapUsdc: 20,
|
|
121
|
+
perCallCapUsdc: 2,
|
|
122
|
+
allowedHosts: [ALCHEMY_HOST],
|
|
123
|
+
},
|
|
124
|
+
}, 0.05, "guard pre-x402");
|
|
125
|
+
console.log(JSON.stringify({
|
|
126
|
+
allowed: guard.allowed,
|
|
127
|
+
securityGrade: guard.securityGrade,
|
|
128
|
+
summary: guard.summary,
|
|
129
|
+
confidence: guard.confidence,
|
|
130
|
+
}, null, 2));
|
|
131
|
+
if (guard.allowed !== true) {
|
|
132
|
+
throw new Error(`Guard blocked: ${String(guard.summary)}`);
|
|
133
|
+
}
|
|
134
|
+
const alchemyStep = guardStep + 1;
|
|
135
|
+
logStep(alchemyStep, "Alchemy x402 call — SIWE auth + USDC payment");
|
|
136
|
+
console.log(" Calling eth_blockNumber via x402.alchemy.com …");
|
|
137
|
+
const alchemyBody = JSON.stringify({
|
|
138
|
+
jsonrpc: "2.0",
|
|
139
|
+
method: "eth_blockNumber",
|
|
140
|
+
params: [],
|
|
141
|
+
id: 1,
|
|
142
|
+
});
|
|
143
|
+
const alchemyResult = await alchemyX402Pay(ALCHEMY_GATEWAY, alchemyBody, evmKey);
|
|
144
|
+
if (!alchemyResult.ok) {
|
|
145
|
+
throw new Error(`Alchemy payment failed HTTP ${alchemyResult.status}: ${alchemyResult.body.slice(0, 400)}`);
|
|
146
|
+
}
|
|
147
|
+
trackCost("Alchemy gateway credit", ESTIMATED_ALCHEMY_USDC, "x402.alchemy.com (~$1 credit purchase)");
|
|
148
|
+
let alchemyJson;
|
|
149
|
+
try {
|
|
150
|
+
alchemyJson = alchemyResult.body ? JSON.parse(alchemyResult.body) : null;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
alchemyJson = {
|
|
154
|
+
raw: alchemyResult.body.slice(0, 300),
|
|
155
|
+
note: "USDC payment settled; full RPC may need SIWE auth on follow-up calls",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const payment = alchemyResult.payment;
|
|
159
|
+
console.log(JSON.stringify({ alchemyResult: alchemyJson, payment }, null, 2));
|
|
160
|
+
const txHash = payment?.transaction ?? payment?.txHash;
|
|
161
|
+
if (!txHash) {
|
|
162
|
+
console.warn(" ⚠ No PAYMENT-RESPONSE tx hash — receipt verify may use synthetic probe values");
|
|
163
|
+
}
|
|
164
|
+
const receiptStep = alchemyStep + 1;
|
|
165
|
+
logStep(receiptStep, "Receipt verify — on-chain settlement proof");
|
|
166
|
+
const receipt = await trustPost("/api/receipt-auditor/verify", {
|
|
167
|
+
network: CHAIN_IDS.base,
|
|
168
|
+
expectedAmountUsdc: payment?.amountUsdc ?? ESTIMATED_ALCHEMY_USDC,
|
|
169
|
+
transactionHash: txHash ?? "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
170
|
+
settlement: {
|
|
171
|
+
transaction: txHash ?? "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
172
|
+
amountUsdc: payment?.amountUsdc ?? ESTIMATED_ALCHEMY_USDC,
|
|
173
|
+
network: CHAIN_IDS.base,
|
|
174
|
+
payer: payment?.payer ?? walletAddress,
|
|
175
|
+
},
|
|
176
|
+
}, 0.05, "receipt verify");
|
|
177
|
+
console.log(JSON.stringify({ valid: receipt.valid, onChainMatch: receipt.onChainMatch }, null, 2));
|
|
178
|
+
if (ENTERPRISE) {
|
|
179
|
+
logStep(receiptStep + 1, "Compliance ledger — CFO audit export");
|
|
180
|
+
const period = new Date().toISOString().slice(0, 7);
|
|
181
|
+
const ledger = await trustPost("/api/compliance/ledger", {
|
|
182
|
+
organizationId: "alchemy-demo-org",
|
|
183
|
+
period,
|
|
184
|
+
records: [
|
|
185
|
+
{
|
|
186
|
+
merchant: ALCHEMY_HOST,
|
|
187
|
+
endpoint: "eth_blockNumber",
|
|
188
|
+
amountUsdc: payment?.amountUsdc ?? ESTIMATED_ALCHEMY_USDC,
|
|
189
|
+
rail: "base-x402",
|
|
190
|
+
network: CHAIN_IDS.base,
|
|
191
|
+
category: "blockchain-data",
|
|
192
|
+
agentId: AGENT_ID,
|
|
193
|
+
transactionHash: txHash,
|
|
194
|
+
mandateId,
|
|
195
|
+
timestamp: new Date().toISOString(),
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
}, 0.12, "compliance ledger");
|
|
199
|
+
console.log(JSON.stringify({
|
|
200
|
+
ledgerHash: ledger.ledgerHash,
|
|
201
|
+
totalSpendUsdc: ledger.totalSpendUsdc,
|
|
202
|
+
policyViolations: ledger.policyViolations,
|
|
203
|
+
}, null, 2));
|
|
204
|
+
}
|
|
205
|
+
console.log(`\n${"=".repeat(60)}`);
|
|
206
|
+
console.log("COST SUMMARY (approximate USDC spent from your wallet)");
|
|
207
|
+
console.log("=".repeat(60));
|
|
208
|
+
let total = 0;
|
|
209
|
+
for (const c of costs) {
|
|
210
|
+
total += c.usdc;
|
|
211
|
+
console.log(` ${c.step.padEnd(28)} $${c.usdc.toFixed(2).padStart(6)} ${c.note}`);
|
|
212
|
+
}
|
|
213
|
+
console.log(` ${"TOTAL".padEnd(28)} $${total.toFixed(2).padStart(6)}`);
|
|
214
|
+
console.log("\n✅ Live demo complete.");
|
|
215
|
+
if (txHash && txHash !== "0x0000000000000000000000000000000000000000000000000000000000000001") {
|
|
216
|
+
console.log(` Basescan: https://basescan.org/tx/${txHash}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
main().catch((err) => {
|
|
220
|
+
console.error("\n❌ Demo failed:", err instanceof Error ? err.message : err);
|
|
221
|
+
console.error("\nFix checklist:");
|
|
222
|
+
console.error(" 1. EVM_PRIVATE_KEY set (NOT same as PAY_TO_EVM)");
|
|
223
|
+
console.error(" 2. Wallet has USDC on Base (~$3 for full demo)");
|
|
224
|
+
console.error(" 3. npm install (includes @alchemy/x402)");
|
|
225
|
+
process.exit(1);
|
|
226
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-run only the orchestration routes that often fail after a long `npm run demo` burst.
|
|
3
|
+
* Usage: npm run demo:tail
|
|
4
|
+
*/
|
|
5
|
+
import dotenv from "dotenv";
|
|
6
|
+
import { CHAIN_IDS } from "../lib/chains.js";
|
|
7
|
+
import { assertDemoPayerNotReceiveWallet, assertPayerKeys, buildWrapFetchOptions, buildX402Fetch, } from "../lib/x402-client-options.js";
|
|
8
|
+
dotenv.config();
|
|
9
|
+
const BASE = CHAIN_IDS.base;
|
|
10
|
+
const base = process.env.PUBLIC_BASE_URL ?? "https://x402trustlayer.xyz";
|
|
11
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
12
|
+
assertPayerKeys();
|
|
13
|
+
await assertDemoPayerNotReceiveWallet();
|
|
14
|
+
const x402Fetch = await buildX402Fetch(fetch, buildWrapFetchOptions({ verbose: process.env.X402_VERBOSE === "1" }));
|
|
15
|
+
console.log(`Demo tail target: ${base}\nPreferred network: ${CHAIN_IDS.base}\n`);
|
|
16
|
+
const PAYMENT_RETRY_MATCH = /settlement failed|payment was rejected|insufficient balance|verification failed|facilitator/i;
|
|
17
|
+
async function post(path, body) {
|
|
18
|
+
const maxAttempts = Number(process.env.DEMO_PAYMENT_MAX_ATTEMPTS ?? 3);
|
|
19
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
20
|
+
try {
|
|
21
|
+
const res = await x402Fetch(`${base}${path}`, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: { "content-type": "application/json" },
|
|
24
|
+
body: JSON.stringify(body),
|
|
25
|
+
});
|
|
26
|
+
const text = await res.text();
|
|
27
|
+
console.log(`--- ${path} (${res.status}) ---`);
|
|
28
|
+
console.log(text.slice(0, 900) + (text.length > 900 ? "..." : ""));
|
|
29
|
+
console.log();
|
|
30
|
+
return res.ok;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
34
|
+
if (PAYMENT_RETRY_MATCH.test(msg) && attempt < maxAttempts) {
|
|
35
|
+
const wait = Number(process.env.DEMO_PAYMENT_RETRY_MS ?? 6_000) * attempt;
|
|
36
|
+
console.warn(`retry ${attempt}/${maxAttempts - 1} in ${wait}ms:`, msg);
|
|
37
|
+
await sleep(wait);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
console.error(`FAILED ${path}:`, msg, "\n");
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const stepDelay = () => sleep(Number(process.env.DEMO_STEP_DELAY_MS ?? 4_000));
|
|
47
|
+
let ok = 0;
|
|
48
|
+
const routes = [
|
|
49
|
+
[
|
|
50
|
+
"/api/facilitator/failover",
|
|
51
|
+
{
|
|
52
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
53
|
+
preferNetwork: BASE,
|
|
54
|
+
fastProbe: true,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"/api/router/route",
|
|
59
|
+
{
|
|
60
|
+
query: "ETH USD spot price oracle",
|
|
61
|
+
maxPriceUsdc: 0.1,
|
|
62
|
+
preferNetwork: BASE,
|
|
63
|
+
skipProbes: true,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
["/api/mpp/session-plan", { action: "estimate", expectedCalls: 50, avgPricePerCallUsdc: 0.03 }],
|
|
67
|
+
[
|
|
68
|
+
"/api/receipt-auditor/verify",
|
|
69
|
+
{
|
|
70
|
+
network: BASE,
|
|
71
|
+
expectedAmountUsdc: 0.05,
|
|
72
|
+
transactionHash: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
73
|
+
settlement: {
|
|
74
|
+
transaction: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
75
|
+
amountUsdc: 0.05,
|
|
76
|
+
network: BASE,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
["/api/settlement-graph/next", { lastEndpointPath: "/api/spend-governor/check", lastTopic: "budget policy" }],
|
|
81
|
+
["/api/refund-arbiter/evaluate", { verificationScore: 82, endpointReachable: true }],
|
|
82
|
+
[
|
|
83
|
+
"/api/budget-allocator/run",
|
|
84
|
+
{
|
|
85
|
+
fleetId: "fleet-alpha",
|
|
86
|
+
poolRemainingUsdc: 2,
|
|
87
|
+
agents: [
|
|
88
|
+
{ agentId: "a1", priority: 10, requestedUsdc: 0.5, dailyRemainingUsdc: 5 },
|
|
89
|
+
{ agentId: "a2", priority: 5, requestedUsdc: 1, dailyRemainingUsdc: 3 },
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
];
|
|
94
|
+
for (const [path, body] of routes) {
|
|
95
|
+
if (await post(path, body))
|
|
96
|
+
ok++;
|
|
97
|
+
await stepDelay();
|
|
98
|
+
}
|
|
99
|
+
console.log(`Tail demo: ${ok}/${routes.length} paid OK`);
|
|
100
|
+
process.exit(ok === routes.length ? 0 : 1);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full pipeline demo — pays for each x402 endpoint on your deployed suite.
|
|
3
|
+
*/
|
|
4
|
+
import dotenv from "dotenv";
|
|
5
|
+
import { CHAIN_IDS } from "../lib/chains.js";
|
|
6
|
+
const BASE = CHAIN_IDS.base;
|
|
7
|
+
import { assertDemoPayerNotReceiveWallet, assertPayerKeys, buildWrapFetchOptions, buildX402Fetch, } from "../lib/x402-client-options.js";
|
|
8
|
+
dotenv.config();
|
|
9
|
+
const base = process.env.PUBLIC_BASE_URL ?? "http://127.0.0.1:3402";
|
|
10
|
+
try {
|
|
11
|
+
assertPayerKeys();
|
|
12
|
+
await assertDemoPayerNotReceiveWallet();
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
console.error(err instanceof Error ? err.message : err);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
19
|
+
async function assertServerUp() {
|
|
20
|
+
const res = await fetch(`${base}/health`);
|
|
21
|
+
if (!res.ok)
|
|
22
|
+
throw new Error(`health ${res.status}`);
|
|
23
|
+
const body = (await res.json());
|
|
24
|
+
console.log(`Health OK — ${body.endpointCount ?? "?"} endpoints`);
|
|
25
|
+
console.log(`Demo target: ${base}\n`);
|
|
26
|
+
}
|
|
27
|
+
await assertServerUp();
|
|
28
|
+
const wrapOpts = buildWrapFetchOptions({ verbose: process.env.X402_VERBOSE === "1" });
|
|
29
|
+
const x402Fetch = await buildX402Fetch(fetch, wrapOpts);
|
|
30
|
+
const solRpc = wrapOpts.rpcUrls?.[CHAIN_IDS.solana];
|
|
31
|
+
if (solRpc) {
|
|
32
|
+
console.log(`Solana RPC: ${solRpc} (avoids Dexter proxy StructError on USDC mint)\n`);
|
|
33
|
+
}
|
|
34
|
+
if (wrapOpts.preferredNetwork) {
|
|
35
|
+
console.log(`Preferred payment network: ${wrapOpts.preferredNetwork}\n`);
|
|
36
|
+
}
|
|
37
|
+
const PAYMENT_RETRY_MATCH = /settlement failed|payment was rejected|insufficient balance|verification failed|facilitator/i;
|
|
38
|
+
const PAYMENT_MAX_ATTEMPTS = Number(process.env.DEMO_PAYMENT_MAX_ATTEMPTS ?? 3);
|
|
39
|
+
const PAYMENT_RETRY_BASE_MS = Number(process.env.DEMO_PAYMENT_RETRY_MS ?? 6_000);
|
|
40
|
+
const stepDelay = (ms = Number(process.env.DEMO_STEP_DELAY_MS ?? 3_500)) => sleep(ms);
|
|
41
|
+
async function paidFetch(path, init, label = path) {
|
|
42
|
+
for (let attempt = 1; attempt <= PAYMENT_MAX_ATTEMPTS; attempt++) {
|
|
43
|
+
try {
|
|
44
|
+
return await x402Fetch(`${base}${path}`, init);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
48
|
+
const retryable = PAYMENT_RETRY_MATCH.test(msg);
|
|
49
|
+
if (retryable && attempt < PAYMENT_MAX_ATTEMPTS) {
|
|
50
|
+
const wait = PAYMENT_RETRY_BASE_MS * attempt;
|
|
51
|
+
console.warn(`--- ${label} payment retry ${attempt}/${PAYMENT_MAX_ATTEMPTS - 1} in ${wait}ms ---`, msg);
|
|
52
|
+
await sleep(wait);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
console.error(`--- ${label} FAILED ---`, msg);
|
|
56
|
+
if (retryable) {
|
|
57
|
+
console.error(" Hint: long demo runs can hit transient Dexter facilitator limits. Retry one route:");
|
|
58
|
+
console.error(` npm run demo:tail (or wait 30s and re-run)\n`);
|
|
59
|
+
console.error(" Check Base wallet: USDC for payments + small ETH for Permit2 gas. X402_VERBOSE=1 for payment trace.\n");
|
|
60
|
+
}
|
|
61
|
+
else if (msg.includes("verification failed")) {
|
|
62
|
+
console.error(" Hint: transient facilitator glitch — retry usually succeeds (X402_VERBOSE=1 on server/client).\n");
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error();
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
async function post(path, body) {
|
|
73
|
+
const res = await paidFetch(path, {
|
|
74
|
+
method: "POST",
|
|
75
|
+
headers: { "content-type": "application/json" },
|
|
76
|
+
body: JSON.stringify(body),
|
|
77
|
+
}, path);
|
|
78
|
+
if (!res)
|
|
79
|
+
return null;
|
|
80
|
+
const text = await res.text();
|
|
81
|
+
let parsed = null;
|
|
82
|
+
try {
|
|
83
|
+
parsed = text ? JSON.parse(text) : null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
parsed = null;
|
|
87
|
+
}
|
|
88
|
+
console.log(`--- ${path} (${res.status}) ---`);
|
|
89
|
+
if (path === "/api/seller/audition-coach" && parsed && typeof parsed === "object") {
|
|
90
|
+
const coach = parsed;
|
|
91
|
+
console.log(JSON.stringify({
|
|
92
|
+
coached: coach.coached,
|
|
93
|
+
allowed: coach.allowed,
|
|
94
|
+
hostScoreEstimate: coach.hostScoreEstimate,
|
|
95
|
+
routeAuditCount: Array.isArray(coach.routeAudits) ? coach.routeAudits.length : 0,
|
|
96
|
+
confidence: coach.confidence,
|
|
97
|
+
summary: coach.summary,
|
|
98
|
+
}, null, 2));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.log(text.slice(0, 1200) + (text.length > 1200 ? "..." : ""));
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
return parsed;
|
|
105
|
+
}
|
|
106
|
+
console.log("=== marketplace killers ===\n");
|
|
107
|
+
await post("/api/market/buy-advisor", {
|
|
108
|
+
intent: "ETH USD spot price oracle",
|
|
109
|
+
agentId: "demo-fleet-1",
|
|
110
|
+
walletAddress: "9c7tE587KpGYBjiNQrjw3nGvxQHhSYKU4Ba6WRgQsHkt",
|
|
111
|
+
policy: { dailyCapUsdc: 10, perCallCapUsdc: 1 },
|
|
112
|
+
maxPriceUsdc: 0.15,
|
|
113
|
+
expectedCalls: 10,
|
|
114
|
+
});
|
|
115
|
+
await sleep(2000);
|
|
116
|
+
await post("/api/seller/audition-coach", {
|
|
117
|
+
origin: base,
|
|
118
|
+
maxRoutes: 24,
|
|
119
|
+
});
|
|
120
|
+
await sleep(2000);
|
|
121
|
+
console.log("=== v3 primary entrypoints ===\n");
|
|
122
|
+
await post("/api/x402/proxy", {
|
|
123
|
+
agentId: "demo-fleet-1",
|
|
124
|
+
walletAddress: "9c7tE587KpGYBjiNQrjw3nGvxQHhSYKU4Ba6WRgQsHkt",
|
|
125
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
126
|
+
estimatedCostUsdc: 0.05,
|
|
127
|
+
policy: { dailyCapUsdc: 10, perCallCapUsdc: 1 },
|
|
128
|
+
issueAttestation: true,
|
|
129
|
+
});
|
|
130
|
+
await sleep(2000);
|
|
131
|
+
await post("/api/mpp/session", {
|
|
132
|
+
action: "open",
|
|
133
|
+
expectedCalls: 30,
|
|
134
|
+
avgPricePerCallUsdc: 0.03,
|
|
135
|
+
chain: "solana",
|
|
136
|
+
agentId: "demo-fleet-1",
|
|
137
|
+
});
|
|
138
|
+
await sleep(2000);
|
|
139
|
+
const attestationIssue = await post("/api/attestation/issue", {
|
|
140
|
+
agentId: "demo-fleet-1",
|
|
141
|
+
walletAddress: "9c7tE587KpGYBjiNQrjw3nGvxQHhSYKU4Ba6WRgQsHkt",
|
|
142
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
143
|
+
estimatedCostUsdc: 0.03,
|
|
144
|
+
policy: { dailyCapUsdc: 10, perCallCapUsdc: 1 },
|
|
145
|
+
});
|
|
146
|
+
await sleep(2000);
|
|
147
|
+
const issuedAttestationId = attestationIssue &&
|
|
148
|
+
typeof attestationIssue === "object" &&
|
|
149
|
+
"attestation" in attestationIssue &&
|
|
150
|
+
attestationIssue.attestation &&
|
|
151
|
+
typeof attestationIssue.attestation === "object" &&
|
|
152
|
+
"attestationId" in attestationIssue.attestation &&
|
|
153
|
+
typeof attestationIssue.attestation.attestationId === "string"
|
|
154
|
+
? attestationIssue.attestation.attestationId
|
|
155
|
+
: null;
|
|
156
|
+
if (!issuedAttestationId) {
|
|
157
|
+
console.warn("Attestation issue did not return attestationId — verify step may fail.\n");
|
|
158
|
+
}
|
|
159
|
+
await post("/api/attestation/verify", {
|
|
160
|
+
attestationId: issuedAttestationId ?? "att_verifier_probe_example",
|
|
161
|
+
});
|
|
162
|
+
await sleep(3500);
|
|
163
|
+
const regRes = await paidFetch("/api/attestation/registry", { method: "GET" });
|
|
164
|
+
if (regRes) {
|
|
165
|
+
console.log("--- /api/attestation/registry GET ---", regRes.status, (await regRes.text()).slice(0, 800), "\n");
|
|
166
|
+
}
|
|
167
|
+
await sleep(2000);
|
|
168
|
+
await post("/api/guard/pre-x402", {
|
|
169
|
+
agentId: "demo-fleet-1",
|
|
170
|
+
walletAddress: "9c7tE587KpGYBjiNQrjw3nGvxQHhSYKU4Ba6WRgQsHkt",
|
|
171
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
172
|
+
estimatedCostUsdc: 0.05,
|
|
173
|
+
network: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
174
|
+
policy: { dailyCapUsdc: 10, perCallCapUsdc: 1, allowedHosts: ["myceliasignal.com"] },
|
|
175
|
+
});
|
|
176
|
+
await sleep(2000);
|
|
177
|
+
await post("/api/pipeline/execute", {
|
|
178
|
+
agentId: "demo-fleet-1",
|
|
179
|
+
walletAddress: "9c7tE587KpGYBjiNQrjw3nGvxQHhSYKU4Ba6WRgQsHkt",
|
|
180
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
181
|
+
estimatedCostUsdc: 0.05,
|
|
182
|
+
policy: { dailyCapUsdc: 10, perCallCapUsdc: 1 },
|
|
183
|
+
task: "ETH oracle with guard and routing under one dollar",
|
|
184
|
+
maxBudgetUsdc: 1,
|
|
185
|
+
marketplaceQuery: "ETH USD spot price oracle",
|
|
186
|
+
preferNetwork: "solana",
|
|
187
|
+
});
|
|
188
|
+
await sleep(2000);
|
|
189
|
+
await post("/api/payment-intent/compile", {
|
|
190
|
+
task: "ETH price check with risk scan and audit trail, max budget $1",
|
|
191
|
+
maxBudgetUsdc: 1,
|
|
192
|
+
agentId: "demo-fleet-1",
|
|
193
|
+
externalCallEstimateUsdc: 0.05,
|
|
194
|
+
});
|
|
195
|
+
await stepDelay(5_000);
|
|
196
|
+
await post("/api/spend-governor/check", {
|
|
197
|
+
agentId: "demo-fleet-1",
|
|
198
|
+
estimatedCostUsdc: 0.5,
|
|
199
|
+
policy: { dailyCapUsdc: 10, perCallCapUsdc: 1 },
|
|
200
|
+
});
|
|
201
|
+
await stepDelay();
|
|
202
|
+
await post("/api/identity-gate/check", {
|
|
203
|
+
walletAddress: "9c7tE587KpGYBjiNQrjw3nGvxQHhSYKU4Ba6WRgQsHkt",
|
|
204
|
+
});
|
|
205
|
+
await stepDelay();
|
|
206
|
+
await post("/api/risk-gate/scan", {
|
|
207
|
+
targetUrl: "https://x402trustlayer.xyz/health",
|
|
208
|
+
});
|
|
209
|
+
await stepDelay(8_000);
|
|
210
|
+
await post("/api/facilitator/failover", {
|
|
211
|
+
targetUrl: "https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
212
|
+
preferNetwork: BASE,
|
|
213
|
+
fastProbe: true,
|
|
214
|
+
});
|
|
215
|
+
await stepDelay();
|
|
216
|
+
await post("/api/router/route", {
|
|
217
|
+
query: "ETH USD spot price oracle",
|
|
218
|
+
maxPriceUsdc: 0.1,
|
|
219
|
+
preferNetwork: BASE,
|
|
220
|
+
skipProbes: true,
|
|
221
|
+
});
|
|
222
|
+
await stepDelay();
|
|
223
|
+
await post("/api/mpp/session-plan", {
|
|
224
|
+
action: "estimate",
|
|
225
|
+
expectedCalls: 50,
|
|
226
|
+
avgPricePerCallUsdc: 0.03,
|
|
227
|
+
});
|
|
228
|
+
await stepDelay();
|
|
229
|
+
await post("/api/receipt-auditor/verify", {
|
|
230
|
+
network: BASE,
|
|
231
|
+
expectedAmountUsdc: 0.05,
|
|
232
|
+
transactionHash: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
233
|
+
settlement: {
|
|
234
|
+
transaction: "0x0000000000000000000000000000000000000000000000000000000000000001",
|
|
235
|
+
amountUsdc: 0.05,
|
|
236
|
+
network: BASE,
|
|
237
|
+
payer: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
await stepDelay();
|
|
241
|
+
await post("/api/settlement-graph/next", {
|
|
242
|
+
lastEndpointPath: "/api/spend-governor/check",
|
|
243
|
+
lastTopic: "budget policy",
|
|
244
|
+
});
|
|
245
|
+
await stepDelay();
|
|
246
|
+
await post("/api/refund-arbiter/evaluate", {
|
|
247
|
+
verificationScore: 82,
|
|
248
|
+
endpointReachable: true,
|
|
249
|
+
});
|
|
250
|
+
await stepDelay();
|
|
251
|
+
await post("/api/budget-allocator/run", {
|
|
252
|
+
fleetId: "fleet-alpha",
|
|
253
|
+
poolRemainingUsdc: 2,
|
|
254
|
+
agents: [
|
|
255
|
+
{ agentId: "a1", priority: 10, requestedUsdc: 0.5, dailyRemainingUsdc: 5 },
|
|
256
|
+
{ agentId: "a2", priority: 5, requestedUsdc: 1, dailyRemainingUsdc: 3 },
|
|
257
|
+
],
|
|
258
|
+
});
|
|
259
|
+
await sleep(1500);
|
|
260
|
+
await post("/api/quality-monitor/probe", {
|
|
261
|
+
urls: [
|
|
262
|
+
"https://x402trustlayer.xyz/health",
|
|
263
|
+
"https://api.myceliasignal.com/oracle/price/eth/usd",
|
|
264
|
+
],
|
|
265
|
+
});
|
|
266
|
+
await sleep(1500);
|
|
267
|
+
await post("/api/evidence-locker/export", {
|
|
268
|
+
organizationId: "demo-org",
|
|
269
|
+
records: [
|
|
270
|
+
{
|
|
271
|
+
endpoint: "/api/spend-governor/check",
|
|
272
|
+
amountUsdc: 0.03,
|
|
273
|
+
network: "solana",
|
|
274
|
+
timestamp: new Date().toISOString(),
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
});
|
|
278
|
+
await sleep(1500);
|
|
279
|
+
const escrowRes = await paidFetch("/api/agent-escrow", {
|
|
280
|
+
method: "POST",
|
|
281
|
+
headers: { "content-type": "application/json" },
|
|
282
|
+
body: JSON.stringify({
|
|
283
|
+
action: "create",
|
|
284
|
+
payerAgentId: "agent-a",
|
|
285
|
+
payeeAgentId: "agent-b",
|
|
286
|
+
amountUsdc: 0.1,
|
|
287
|
+
releaseCondition: "receipt-auditor valid:true",
|
|
288
|
+
}),
|
|
289
|
+
}, "/api/agent-escrow create");
|
|
290
|
+
if (escrowRes) {
|
|
291
|
+
console.log("--- /api/agent-escrow create ---", escrowRes.status, await escrowRes.text(), "\n");
|
|
292
|
+
}
|
|
293
|
+
console.log("Full pipeline demo complete.");
|