@aifinpay/mcp 2.0.0-rc.5 → 2.2.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/LICENSE +21 -0
- package/README.md +161 -69
- package/bin/aifinpay-mcp.js +115 -67
- package/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +6 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +17 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +66 -11
- package/dist/config.js.map +1 -1
- package/dist/identity.d.ts +9 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +81 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -6
- package/dist/index.js.map +1 -1
- package/dist/payment-state.d.ts +35 -0
- package/dist/payment-state.d.ts.map +1 -0
- package/dist/payment-state.js +127 -0
- package/dist/payment-state.js.map +1 -0
- package/dist/safe-fetch.d.ts.map +1 -1
- package/dist/safe-fetch.js +73 -19
- package/dist/safe-fetch.js.map +1 -1
- package/dist/server.d.ts +5 -15
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +127 -38
- package/dist/server.js.map +1 -1
- package/dist/tools/agent-address.d.ts.map +1 -1
- package/dist/tools/agent-address.js +5 -4
- package/dist/tools/agent-address.js.map +1 -1
- package/dist/tools/agent-history.d.ts +58 -0
- package/dist/tools/agent-history.d.ts.map +1 -0
- package/dist/tools/agent-history.js +141 -0
- package/dist/tools/agent-history.js.map +1 -0
- package/dist/tools/agent-quota.d.ts.map +1 -1
- package/dist/tools/agent-quota.js +3 -1
- package/dist/tools/agent-quota.js.map +1 -1
- package/dist/tools/{agent-quote.d.ts → dev-payment-quote.d.ts} +10 -12
- package/dist/tools/dev-payment-quote.d.ts.map +1 -0
- package/dist/tools/dev-payment-quote.js +80 -0
- package/dist/tools/dev-payment-quote.js.map +1 -0
- package/dist/tools/payable-fetch.d.ts +3 -29
- package/dist/tools/payable-fetch.d.ts.map +1 -1
- package/dist/tools/payable-fetch.js +231 -109
- package/dist/tools/payable-fetch.js.map +1 -1
- package/dist/tools/production-control.d.ts +104 -0
- package/dist/tools/production-control.d.ts.map +1 -1
- package/dist/tools/production-control.js +177 -14
- package/dist/tools/production-control.js.map +1 -1
- package/dist/tools/supported-chains.d.ts +38 -0
- package/dist/tools/supported-chains.d.ts.map +1 -0
- package/dist/tools/supported-chains.js +132 -0
- package/dist/tools/supported-chains.js.map +1 -0
- package/package.json +30 -7
- package/skills/SKILL.md +332 -0
- package/smithery.yaml +137 -0
- package/dist/directory.d.ts +0 -55
- package/dist/directory.d.ts.map +0 -1
- package/dist/directory.js +0 -56
- package/dist/directory.js.map +0 -1
- package/dist/tools/agent-call.d.ts +0 -68
- package/dist/tools/agent-call.d.ts.map +0 -1
- package/dist/tools/agent-call.js +0 -129
- package/dist/tools/agent-call.js.map +0 -1
- package/dist/tools/agent-claim-self.d.ts +0 -66
- package/dist/tools/agent-claim-self.d.ts.map +0 -1
- package/dist/tools/agent-claim-self.js +0 -299
- package/dist/tools/agent-claim-self.js.map +0 -1
- package/dist/tools/agent-quote.d.ts.map +0 -1
- package/dist/tools/agent-quote.js +0 -81
- package/dist/tools/agent-quote.js.map +0 -1
- package/dist/tools/pay-with-split.d.ts +0 -93
- package/dist/tools/pay-with-split.d.ts.map +0 -1
- package/dist/tools/pay-with-split.js +0 -138
- package/dist/tools/pay-with-split.js.map +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export function devPaymentQuoteTool() {
|
|
2
|
+
return {
|
|
3
|
+
name: "dev_payment_quote",
|
|
4
|
+
description: "Inspect the dev paid-content challenge and quote a prepaid batch on Amoy. Checks the requested contract version against the deployed quote. Never signs or broadcasts; a version mismatch is an error, not permission to relabel a contract.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
additionalProperties: false,
|
|
8
|
+
properties: {
|
|
9
|
+
contract_version: { type: "string", enum: ["1.2", "1.4"] },
|
|
10
|
+
units: { type: "integer", minimum: 1, default: 1000 },
|
|
11
|
+
},
|
|
12
|
+
required: ["contract_version"],
|
|
13
|
+
},
|
|
14
|
+
annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export async function runDevPaymentQuote(ctx, args) {
|
|
18
|
+
const fail = (text) => ({ isError: true, content: [{ type: "text", text }] });
|
|
19
|
+
const version = args.contract_version, units = args.units ?? 1000;
|
|
20
|
+
if (version !== "1.2" && version !== "1.4")
|
|
21
|
+
return fail("Choose contract_version 1.2 or 1.4");
|
|
22
|
+
if (!Number.isSafeInteger(units) || Number(units) < 1)
|
|
23
|
+
return fail("units must be a positive integer");
|
|
24
|
+
if (!ctx.config.devMode || !ctx.config.baseUrl)
|
|
25
|
+
return fail("Configure AIFINPAY_MODE=dev and AIFINPAY_BASE_URL explicitly");
|
|
26
|
+
try {
|
|
27
|
+
const base = ctx.config.baseUrl.replace(/\/+$/, "");
|
|
28
|
+
if (["aifinpay.io", "api.aifinpay.io", "gateway.aifinpay.io"].includes(new URL(base).hostname)) {
|
|
29
|
+
return fail("Dev quotes require a separate dev backend URL");
|
|
30
|
+
}
|
|
31
|
+
const fetchImpl = ctx.agent.inner.fetchImpl;
|
|
32
|
+
const resource = "/v1/dev/paid/data";
|
|
33
|
+
const response = await fetchImpl(`${base}${resource}`);
|
|
34
|
+
if (response.status !== 402)
|
|
35
|
+
return fail(`Dev paid route must return 402; received HTTP ${response.status}`);
|
|
36
|
+
const challenge = (await response.json());
|
|
37
|
+
if (!challenge?.merchant_id || !challenge.accepted_chains?.includes("amoy"))
|
|
38
|
+
return fail("Dev route has no configured Amoy settlement");
|
|
39
|
+
const quoted = await fetchImpl(`${base}/v1/quote`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: { "content-type": "application/json" },
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
merchant_id: challenge.merchant_id,
|
|
44
|
+
resource,
|
|
45
|
+
scope: "exact",
|
|
46
|
+
tier: "standard",
|
|
47
|
+
units,
|
|
48
|
+
payer: ctx.agent.evmAddress,
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
if (!quoted.ok)
|
|
52
|
+
return fail(`Dev quote failed: HTTP ${quoted.status}`);
|
|
53
|
+
const quote = (await quoted.json());
|
|
54
|
+
if (quote.network_mode !== "test" ||
|
|
55
|
+
quote.merchant_id !== challenge.merchant_id ||
|
|
56
|
+
quote.resource !== resource ||
|
|
57
|
+
quote.accepted_chains?.length !== 1 ||
|
|
58
|
+
quote.accepted_chains[0] !== "amoy") {
|
|
59
|
+
return fail("Quote is not bound to this test merchant/resource on Amoy");
|
|
60
|
+
}
|
|
61
|
+
if (quote.settlement_call?.splitter_version !== version)
|
|
62
|
+
return fail(`Requested ${version}; backend advertises ${quote.settlement_call?.splitter_version ?? "no verified version"}. Configure the corresponding dev deployment first.`);
|
|
63
|
+
return {
|
|
64
|
+
content: [
|
|
65
|
+
{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: JSON.stringify({
|
|
68
|
+
quote,
|
|
69
|
+
signing_available: false,
|
|
70
|
+
next_step: "Use a separately verified Amoy executor for this exact deployment; current MCP does not broadcast payments. Keep the quote and transaction reference for receipt recovery.",
|
|
71
|
+
}, null, 2),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return fail("Dev backend unavailable or returned an invalid response");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=dev-payment-quote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-payment-quote.js","sourceRoot":"","sources":["../../src/tools/dev-payment-quote.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,49 +9,23 @@ export declare function payableFetchTool(): {
|
|
|
9
9
|
type: string;
|
|
10
10
|
description: string;
|
|
11
11
|
};
|
|
12
|
-
method: {
|
|
13
|
-
type: string;
|
|
14
|
-
enum: string[];
|
|
15
|
-
default: string;
|
|
16
|
-
};
|
|
17
|
-
body: {
|
|
18
|
-
type: string;
|
|
19
|
-
description: string;
|
|
20
|
-
};
|
|
21
|
-
headers: {
|
|
22
|
-
type: string;
|
|
23
|
-
additionalProperties: {
|
|
24
|
-
type: string;
|
|
25
|
-
};
|
|
26
|
-
description: string;
|
|
27
|
-
};
|
|
28
12
|
max_amount_usd: {
|
|
29
13
|
type: string;
|
|
30
|
-
|
|
31
|
-
};
|
|
32
|
-
facilitator: {
|
|
33
|
-
type: string;
|
|
14
|
+
exclusiveMinimum: number;
|
|
34
15
|
description: string;
|
|
35
16
|
};
|
|
36
17
|
};
|
|
37
18
|
required: string[];
|
|
19
|
+
additionalProperties: boolean;
|
|
38
20
|
};
|
|
39
21
|
annotations: {
|
|
40
22
|
readOnlyHint: boolean;
|
|
41
23
|
openWorldHint: boolean;
|
|
42
24
|
destructiveHint: boolean;
|
|
43
25
|
};
|
|
44
|
-
outputSchema: {
|
|
45
|
-
type: string;
|
|
46
|
-
};
|
|
47
26
|
};
|
|
27
|
+
/** Never expose bearer receipts, raw signed transactions, or exception response bodies. */
|
|
48
28
|
export declare function runPayableFetch(ctx: ToolContext, args: Record<string, unknown>): Promise<{
|
|
49
|
-
isError: boolean;
|
|
50
|
-
content: {
|
|
51
|
-
type: string;
|
|
52
|
-
text: string;
|
|
53
|
-
}[];
|
|
54
|
-
} | {
|
|
55
29
|
content: {
|
|
56
30
|
type: string;
|
|
57
31
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payable-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payable-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,wBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;EAoB/B;AAED,2FAA2F;AAC3F,wBAAsB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;GA+NpF"}
|
|
@@ -1,135 +1,257 @@
|
|
|
1
|
+
import { Aifp1SettlementUnsupportedError, parseGatewayUrl } from "@aifinpay/agent";
|
|
2
|
+
import { validatePaymentConfig } from "../config.js";
|
|
3
|
+
import { PaymentStateError } from "../payment-state.js";
|
|
1
4
|
export function payableFetchTool() {
|
|
2
5
|
return {
|
|
3
6
|
name: "payable_fetch",
|
|
4
|
-
description: "
|
|
5
|
-
"DO NOT use WebFetch for URLs that might be paid endpoints — WebFetch " +
|
|
6
|
-
"cannot sign x402 payment headers and will only see the 402 challenge " +
|
|
7
|
-
"without being able to settle it. " +
|
|
8
|
-
"Natural-language triggers: 'fetch <paid URL>', 'pay for <url>', " +
|
|
9
|
-
"'try this URL — it might be paid', 'pay the 402 and get the response'. " +
|
|
10
|
-
"The agent automatically detects the protocol — the AIFP-1 gateway " +
|
|
11
|
-
"(gateway.aifinpay.io) or an x402 facilitator (AiFinPay or Coinbase " +
|
|
12
|
-
"x402) — pays from the agent's wallet, retries, and returns the response " +
|
|
13
|
-
"status, headers, and body. For known " +
|
|
14
|
-
"AiFinPay-registered providers (exa, io-net, venice, ...), prefer " +
|
|
15
|
-
"`agent_call` instead — it's higher-level and resolves the bridge URL " +
|
|
16
|
-
"from the registry.",
|
|
7
|
+
description: "Fetch a GET resource from an owner-approved AiFinPay merchant. Buys a prepaid batch through verified native Polygon v1.4 within owner limits, then reuses its receipt. Pending payments are recovered without sending another transaction. Other payment protocols are unsupported.",
|
|
17
8
|
inputSchema: {
|
|
18
9
|
type: "object",
|
|
19
10
|
properties: {
|
|
20
|
-
url: { type: "string", description: "
|
|
21
|
-
method: {
|
|
22
|
-
type: "string",
|
|
23
|
-
enum: ["GET", "POST", "PUT", "PATCH", "DELETE"],
|
|
24
|
-
default: "GET",
|
|
25
|
-
},
|
|
26
|
-
body: {
|
|
27
|
-
type: "string",
|
|
28
|
-
description: "Request body (string). Set Content-Type via headers if non-JSON.",
|
|
29
|
-
},
|
|
30
|
-
headers: {
|
|
31
|
-
type: "object",
|
|
32
|
-
additionalProperties: { type: "string" },
|
|
33
|
-
description: "Extra request headers.",
|
|
34
|
-
},
|
|
11
|
+
url: { type: "string", description: "HTTPS resource on an owner-configured exact gateway origin." },
|
|
35
12
|
max_amount_usd: {
|
|
36
13
|
type: "number",
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
},
|
|
40
|
-
facilitator: {
|
|
41
|
-
type: "string",
|
|
42
|
-
description: "Force a facilitator: 'aifinpay' | 'coinbase-x402'. Default 'auto'.",
|
|
14
|
+
exclusiveMinimum: 0,
|
|
15
|
+
description: "Optional tighter per-payment USD limit; cannot increase the owner's cap.",
|
|
43
16
|
},
|
|
44
17
|
},
|
|
45
18
|
required: ["url"],
|
|
19
|
+
additionalProperties: false,
|
|
46
20
|
},
|
|
47
|
-
// Auto-pays a 402 challenge for an arbitrary URL → write + open-world + irreversible.
|
|
48
21
|
annotations: { readOnlyHint: false, openWorldHint: true, destructiveHint: true },
|
|
49
|
-
outputSchema: { type: "object" },
|
|
50
22
|
};
|
|
51
23
|
}
|
|
24
|
+
/** Never expose bearer receipts, raw signed transactions, or exception response bodies. */
|
|
52
25
|
export async function runPayableFetch(ctx, args) {
|
|
53
|
-
|
|
54
|
-
if (!url)
|
|
55
|
-
return errorResult("missing required arg: url");
|
|
56
|
-
const method = String(args.method ?? "GET").toUpperCase();
|
|
57
|
-
const body = args.body ? String(args.body) : undefined;
|
|
58
|
-
const headers = typeof args.headers === "object" && args.headers !== null
|
|
59
|
-
? args.headers
|
|
60
|
-
: undefined;
|
|
61
|
-
const maxAmountUsd = typeof args.max_amount_usd === "number"
|
|
62
|
-
? args.max_amount_usd
|
|
63
|
-
: ctx.config.maxAmountUsd;
|
|
64
|
-
const forcedFacilitator = typeof args.facilitator === "string" ? args.facilitator : undefined;
|
|
26
|
+
let state;
|
|
65
27
|
try {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
28
|
+
let maxGasWei;
|
|
29
|
+
try {
|
|
30
|
+
maxGasWei = validatePaymentConfig(ctx.config);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return errorResult(error.message);
|
|
34
|
+
}
|
|
35
|
+
const store = ctx.paymentState;
|
|
36
|
+
if (!store || store.address !== ctx.agent.evmAddress.toLowerCase())
|
|
37
|
+
return errorResult("A persistent matching wallet is required for payments.");
|
|
38
|
+
if (Object.keys(args).some((k) => !["url", "max_amount_usd"].includes(k)))
|
|
39
|
+
return errorResult("Only url and max_amount_usd are supported; no facilitator fallback.");
|
|
40
|
+
if (typeof args.url !== "string")
|
|
41
|
+
return errorResult("url must be an HTTPS resource URL.");
|
|
42
|
+
const url = new URL(args.url);
|
|
43
|
+
if (url.protocol !== "https:" ||
|
|
44
|
+
url.username ||
|
|
45
|
+
url.password ||
|
|
46
|
+
url.hash ||
|
|
47
|
+
!ctx.config.gatewayOrigins.includes(url.origin))
|
|
48
|
+
return errorResult("The URL must use an owner-approved exact HTTPS origin without credentials or fragment.");
|
|
49
|
+
if (args.max_amount_usd !== undefined &&
|
|
50
|
+
(typeof args.max_amount_usd !== "number" || !Number.isFinite(args.max_amount_usd) || args.max_amount_usd <= 0))
|
|
51
|
+
return errorResult("max_amount_usd must be a positive finite amount.");
|
|
52
|
+
const maximum = Math.min(ctx.config.maxAmountUsd, typeof args.max_amount_usd === "number" ? args.max_amount_usd : Infinity);
|
|
53
|
+
const parsed = parseGatewayUrl(url.href, ctx.config.gatewayOrigins, ctx.config.gatewayPathMode);
|
|
54
|
+
return await store.exclusive(async () => {
|
|
55
|
+
state = store.read();
|
|
56
|
+
for (const entry of ctx.agent.aifp1Receipts.list())
|
|
57
|
+
ctx.agent.aifp1Receipts.evict(entry);
|
|
58
|
+
for (const entry of state.receipts)
|
|
59
|
+
ctx.agent.aifp1Receipts.put(entry);
|
|
60
|
+
if (state.pending) {
|
|
61
|
+
const pending = state.pending;
|
|
62
|
+
// Always recover the existing operation first, even if the caller asks
|
|
63
|
+
// for another resource. This method cannot broadcast a transaction.
|
|
64
|
+
const configuredApi = (ctx.config.baseUrl ?? "https://api.aifinpay.io").replace(/\/+$/, "");
|
|
65
|
+
const call = pending.recovery.quote.settlement_call;
|
|
66
|
+
if (pending.recovery.apiBaseUrl.replace(/\/+$/, "") !== configuredApi ||
|
|
67
|
+
(pending.recovery.paymentIssuer ?? configuredApi).replace(/\/+$/, "") !== configuredApi ||
|
|
68
|
+
pending.recovery.quote.payer?.toLowerCase() !== ctx.agent.evmAddress.toLowerCase() ||
|
|
69
|
+
call?.chain !== "polygon" ||
|
|
70
|
+
call.splitter_version !== "1.4" ||
|
|
71
|
+
pending.recovery.asset !== "POL") {
|
|
72
|
+
throw new Error("Pending payment does not match configured wallet/API/native Polygon route");
|
|
73
|
+
}
|
|
74
|
+
const paid = await ctx.agent.recoverPaidPayment(pending.recovery, { paymentIssuer: configuredApi });
|
|
75
|
+
const receipt = {
|
|
76
|
+
site: pending.site,
|
|
77
|
+
merchantId: paid.merchant_id,
|
|
78
|
+
receiptId: paid.receipt_id,
|
|
79
|
+
jwt: paid.receipt,
|
|
80
|
+
scope: paid.scope,
|
|
81
|
+
resource: paid.resource,
|
|
82
|
+
unitQuota: paid.unit_quota,
|
|
83
|
+
remaining: paid.unit_quota,
|
|
84
|
+
expiresAt: Date.parse(paid.expires_at),
|
|
85
|
+
amountUsd: pending.amountUsd,
|
|
86
|
+
};
|
|
87
|
+
if (!Number.isFinite(receipt.expiresAt))
|
|
88
|
+
throw new Error("Invalid recovered receipt expiry");
|
|
89
|
+
ctx.agent.aifp1Receipts.put(receipt);
|
|
90
|
+
state.receipts = ctx.agent.aifp1Receipts.list();
|
|
91
|
+
delete state.pending;
|
|
92
|
+
store.save(state);
|
|
91
93
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
const spent = store.spent24h(state);
|
|
95
|
+
const priorReceiptIds = new Set(state.receipts.map((entry) => entry.receiptId));
|
|
96
|
+
let price;
|
|
97
|
+
try {
|
|
98
|
+
const response = await ctx.agent.fetchPaid(url.href, { method: "GET", redirect: "manual" }, {
|
|
99
|
+
apiBaseUrl: ctx.config.baseUrl,
|
|
100
|
+
paymentIssuer: ctx.config.baseUrl ?? "https://api.aifinpay.io",
|
|
101
|
+
gatewayOrigins: ctx.config.gatewayOrigins,
|
|
102
|
+
resourcePathMode: ctx.config.gatewayPathMode,
|
|
103
|
+
scope: "exact",
|
|
104
|
+
maxAmountUsd: Math.min(maximum, Math.max(0, ctx.config.dailyAmountUsd - spent)),
|
|
105
|
+
nativeUsdPrice: async () => {
|
|
106
|
+
// Independent public price origin, never the quote API's rate.
|
|
107
|
+
const response = await ctx.agent.inner.fetchImpl("https://api.coinbase.com/v2/prices/POL-USD/spot", {
|
|
108
|
+
signal: AbortSignal.timeout(10_000),
|
|
109
|
+
redirect: "manual",
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok)
|
|
112
|
+
throw new Error("Independent native price unavailable");
|
|
113
|
+
const priceBody = await boundedBody(response, 16 * 1024);
|
|
114
|
+
if (priceBody.truncated)
|
|
115
|
+
throw new Error("Independent price response exceeds limit");
|
|
116
|
+
const data = JSON.parse(priceBody.body);
|
|
117
|
+
const usd = Number(data.data?.amount);
|
|
118
|
+
if (data.data?.base !== "POL" || data.data?.currency !== "USD" || !Number.isFinite(usd) || usd <= 0)
|
|
119
|
+
throw new Error("Invalid independent native price");
|
|
120
|
+
price = { usd, observedAtMs: Date.now() };
|
|
121
|
+
return price;
|
|
122
|
+
},
|
|
123
|
+
v14: {
|
|
124
|
+
maxGasWei,
|
|
125
|
+
onPrepared: async (prepared) => {
|
|
126
|
+
if (state.pending)
|
|
127
|
+
throw new Error("A payment is already pending");
|
|
128
|
+
if (!price || Date.now() - price.observedAtMs > 60_000)
|
|
129
|
+
throw new Error("Independent price expired before preparation");
|
|
130
|
+
const native = prepared.quote.native_settlement;
|
|
131
|
+
const usd = Math.max(Number(prepared.quote.amount), (Number(BigInt(native.total_wei)) / 1e18) * price.usd);
|
|
132
|
+
if (!Number.isFinite(usd) ||
|
|
133
|
+
usd <= 0 ||
|
|
134
|
+
usd > maximum ||
|
|
135
|
+
store.spent24h(state) + usd > ctx.config.dailyAmountUsd)
|
|
136
|
+
throw new Error("Owner spending limit reached");
|
|
137
|
+
const site = ctx.config.gatewayPathMode === "direct"
|
|
138
|
+
? `direct:${JSON.stringify([url.origin, prepared.quote.merchant_id])}`
|
|
139
|
+
: parsed.site;
|
|
140
|
+
state.pending = {
|
|
141
|
+
recovery: {
|
|
142
|
+
apiBaseUrl: prepared.apiBaseUrl,
|
|
143
|
+
quote: prepared.quote,
|
|
144
|
+
txRef: prepared.txRef,
|
|
145
|
+
asset: prepared.asset,
|
|
146
|
+
paymentIssuer: prepared.paymentIssuer,
|
|
147
|
+
},
|
|
148
|
+
serializedTransaction: prepared.serializedTransaction,
|
|
149
|
+
site,
|
|
150
|
+
amountUsd: usd,
|
|
151
|
+
};
|
|
152
|
+
state.spend.push({ at: Date.now(), usd, tx: prepared.txRef });
|
|
153
|
+
// Atomic fsync completes BEFORE the SDK is allowed to broadcast.
|
|
154
|
+
store.save(state);
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
if (response === null)
|
|
159
|
+
return errorResult("Payment skipped: owner budget reached.");
|
|
160
|
+
const redact = (value) => {
|
|
161
|
+
for (const entry of ctx.agent.aifp1Receipts.list()) {
|
|
162
|
+
if (entry.jwt)
|
|
163
|
+
value = value.replaceAll(entry.jwt, "[redacted receipt]");
|
|
164
|
+
}
|
|
165
|
+
return value.replace(/\beyJ[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g, "[redacted token]");
|
|
166
|
+
};
|
|
167
|
+
const headers = {};
|
|
168
|
+
for (const name of ["content-type", "aifp-quota-remaining", "aifp-quota-total"]) {
|
|
169
|
+
const value = response.headers.get(name);
|
|
170
|
+
if (value !== null)
|
|
171
|
+
headers[name] = redact(value);
|
|
172
|
+
}
|
|
173
|
+
const bounded = await boundedBody(response);
|
|
174
|
+
const body = redact(bounded.body);
|
|
175
|
+
const truncated = bounded.truncated;
|
|
176
|
+
return {
|
|
177
|
+
content: [
|
|
178
|
+
{
|
|
179
|
+
type: "text",
|
|
180
|
+
text: JSON.stringify({
|
|
181
|
+
status: response.status,
|
|
182
|
+
ok: response.ok,
|
|
183
|
+
headers,
|
|
184
|
+
body,
|
|
185
|
+
truncated,
|
|
186
|
+
receipts: ctx.agent.getReceiptCacheSummary(),
|
|
187
|
+
}),
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
};
|
|
95
191
|
}
|
|
192
|
+
finally {
|
|
193
|
+
// Receipt caching precedes content retry in the SDK. Retain it even
|
|
194
|
+
// when that content request fails; never discard already bought access.
|
|
195
|
+
state.receipts = ctx.agent.aifp1Receipts.list();
|
|
196
|
+
if (state.pending &&
|
|
197
|
+
state.receipts.some((entry) => !priorReceiptIds.has(entry.receiptId) &&
|
|
198
|
+
entry.site === state.pending.site &&
|
|
199
|
+
entry.merchantId === state.pending.recovery.quote.merchant_id)) {
|
|
200
|
+
delete state.pending;
|
|
201
|
+
}
|
|
202
|
+
store.save(state);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (error instanceof PaymentStateError)
|
|
208
|
+
return errorResult(error.message);
|
|
209
|
+
if (!state?.pending && error instanceof Aifp1SettlementUnsupportedError) {
|
|
210
|
+
return errorResult("The merchant must offer a signed native Polygon v1.4 quote. Its current settlement route is unsupported; no legacy or alternate-protocol payment was attempted.");
|
|
96
211
|
}
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
212
|
+
if (!state?.pending && error instanceof Error && error.name === "V14SettlementError") {
|
|
213
|
+
const code = error.code;
|
|
214
|
+
const messages = {
|
|
215
|
+
V14_INSUFFICIENT_BALANCE: "The wallet needs enough POL for the quoted purchase plus the owner-capped gas fee.",
|
|
216
|
+
V14_GAS_BUDGET_EXCEEDED: "Estimated gas exceeds AIFINPAY_MAX_GAS_POL. The owner can review the limit; the agent cannot raise it.",
|
|
217
|
+
V14_PAUSED: "The approved payment deployment is paused. No payment was sent.",
|
|
218
|
+
V14_EXPIRED: "The signed quote expired before submission. Request a fresh quote.",
|
|
219
|
+
V14_EXPIRING: "The signed quote expires too soon to submit safely. Request a fresh quote.",
|
|
220
|
+
V14_STALE_NONCE: "The signed quote uses a stale wallet nonce. Request a fresh quote.",
|
|
221
|
+
};
|
|
222
|
+
return errorResult(messages[code ?? ""] ??
|
|
223
|
+
"Payment verification refused this deployment, signer or quote. The merchant must offer a verified native Polygon v1.4 route; no fallback was attempted.");
|
|
224
|
+
}
|
|
225
|
+
return errorResult(state?.pending
|
|
226
|
+
? `Payment pending (${state.pending.recovery.txRef}). Its private recovery journal is retained. Retry to recover the receipt; no replacement payment will be submitted. If submission never occurred or reverted, the owner must reconcile the journal.`
|
|
227
|
+
: "Payment request failed before completion. Check owner configuration, wallet, supported route, network and spending limits. No fallback payment was attempted.");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function boundedBody(response, limit = 64 * 1024) {
|
|
231
|
+
if (!response.body)
|
|
232
|
+
return { body: "", truncated: false };
|
|
233
|
+
const reader = response.body.getReader();
|
|
234
|
+
const chunks = [];
|
|
235
|
+
let size = 0;
|
|
236
|
+
try {
|
|
237
|
+
while (true) {
|
|
238
|
+
const { done, value } = await reader.read();
|
|
239
|
+
if (done)
|
|
240
|
+
return { body: Buffer.concat(chunks).toString("utf8"), truncated: false };
|
|
241
|
+
const room = limit - size;
|
|
242
|
+
chunks.push(value.subarray(0, room));
|
|
243
|
+
size += Math.min(room, value.length);
|
|
244
|
+
if (value.length > room || size === limit) {
|
|
245
|
+
await reader.cancel();
|
|
246
|
+
return { body: Buffer.concat(chunks).toString("utf8"), truncated: true };
|
|
247
|
+
}
|
|
104
248
|
}
|
|
105
|
-
const respHeaders = {};
|
|
106
|
-
resp.headers.forEach((v, k) => (respHeaders[k] = v));
|
|
107
|
-
const text = await resp.text();
|
|
108
|
-
return {
|
|
109
|
-
content: [
|
|
110
|
-
{
|
|
111
|
-
type: "text",
|
|
112
|
-
text: JSON.stringify({
|
|
113
|
-
status: resp.status,
|
|
114
|
-
ok: resp.ok,
|
|
115
|
-
headers: respHeaders,
|
|
116
|
-
body: text,
|
|
117
|
-
}, null, 2),
|
|
118
|
-
},
|
|
119
|
-
],
|
|
120
|
-
};
|
|
121
249
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
return errorResult(`${err.constructor.name}: ${err.message}`, `Tip: ensure agent ${ctx.agent.solanaAddress} has a funded Seat PDA, ` +
|
|
125
|
-
`or use the unified \`agent_call\` tool (Polygon settlement). ` +
|
|
126
|
-
`Docs: https://aifinpay.io/docs`);
|
|
250
|
+
finally {
|
|
251
|
+
reader.releaseLock();
|
|
127
252
|
}
|
|
128
253
|
}
|
|
129
|
-
function errorResult(
|
|
130
|
-
return {
|
|
131
|
-
isError: true,
|
|
132
|
-
content: lines.map((line) => ({ type: "text", text: line })),
|
|
133
|
-
};
|
|
254
|
+
function errorResult(message) {
|
|
255
|
+
return { isError: true, content: [{ type: "text", text: message }] };
|
|
134
256
|
}
|
|
135
257
|
//# sourceMappingURL=payable-fetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payable-fetch.js","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"payable-fetch.js","sourceRoot":"","sources":["../../src/tools/payable-fetch.ts"],"names":[],"mappings":"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"}
|