@paybond/kit 0.11.11 → 0.12.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/completion-presets/catalog.json +10 -5
- package/completion-presets/catalog.sha256 +1 -1
- package/dist/agent/evidence.d.ts +10 -0
- package/dist/agent/evidence.js +16 -0
- package/dist/agent/index.d.ts +3 -2
- package/dist/agent/index.js +2 -1
- package/dist/agent/interceptor.d.ts +9 -0
- package/dist/agent/interceptor.js +181 -1
- package/dist/agent/receipt-client.d.ts +64 -0
- package/dist/agent/receipt-client.js +45 -0
- package/dist/agent/registry.js +1 -0
- package/dist/agent/run.d.ts +5 -0
- package/dist/agent/run.js +52 -0
- package/dist/agent/types.d.ts +70 -0
- package/dist/agent-mandate.d.ts +103 -0
- package/dist/agent-mandate.js +423 -0
- package/dist/agent-receipt-external-attestations.d.ts +56 -0
- package/dist/agent-receipt-external-attestations.js +185 -0
- package/dist/agent-receipt-pdf-export.d.ts +43 -0
- package/dist/agent-receipt-pdf-export.js +109 -0
- package/dist/agent-receipt-prevalidate.d.ts +7 -0
- package/dist/agent-receipt-prevalidate.js +63 -0
- package/dist/agent-receipt.d.ts +154 -0
- package/dist/agent-receipt.js +639 -0
- package/dist/audit/exports.d.ts +15 -1
- package/dist/audit/exports.js +55 -8
- package/dist/audit/index.d.ts +2 -2
- package/dist/audit/wire.d.ts +12 -0
- package/dist/audit/wire.js +13 -1
- package/dist/cli/command-spec.js +54 -3
- package/dist/cli/commands/dev.js +10 -3
- package/dist/cli/commands/discovery.js +17 -6
- package/dist/cli/commands/setup.js +19 -1
- package/dist/cli/commands/shopify.d.ts +53 -0
- package/dist/cli/commands/shopify.js +808 -0
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +15 -5
- package/dist/cli/router.js +15 -1
- package/dist/commerce-binding.d.ts +59 -0
- package/dist/commerce-binding.js +129 -0
- package/dist/completion-catalog-digest.d.ts +1 -1
- package/dist/completion-catalog-digest.js +1 -1
- package/dist/doctor-completion.d.ts +16 -0
- package/dist/doctor-completion.js +157 -1
- package/dist/index.d.ts +108 -7
- package/dist/index.js +221 -18
- package/dist/mcp-receipt-resource.d.ts +10 -0
- package/dist/mcp-receipt-resource.js +32 -0
- package/dist/mcp-server.d.ts +7 -0
- package/dist/mcp-server.js +81 -1
- package/dist/mpp-commercial.d.ts +19 -0
- package/dist/mpp-commercial.js +34 -0
- package/dist/mpp-funding.d.ts +71 -0
- package/dist/mpp-funding.js +192 -0
- package/dist/payment-transport.d.ts +30 -0
- package/dist/payment-transport.js +56 -0
- package/dist/policy/intent-spec.js +2 -0
- package/dist/policy/presets.d.ts +1 -1
- package/dist/policy/presets.js +1 -0
- package/dist/principal-intent.d.ts +1 -1
- package/dist/principal-intent.js +4 -1
- package/dist/project-init.d.ts +1 -1
- package/dist/project-init.js +1 -0
- package/dist/protocol-receipt.d.ts +129 -0
- package/dist/protocol-receipt.js +620 -0
- package/dist/shopify/checkout.d.ts +29 -0
- package/dist/shopify/checkout.js +79 -0
- package/dist/shopify/evidence.d.ts +13 -0
- package/dist/shopify/evidence.js +85 -0
- package/dist/shopify/index.d.ts +8 -0
- package/dist/shopify/index.js +6 -0
- package/dist/shopify/instrument.d.ts +61 -0
- package/dist/shopify/instrument.js +52 -0
- package/dist/shopify/order.d.ts +8 -0
- package/dist/shopify/order.js +110 -0
- package/dist/shopify/types.d.ts +82 -0
- package/dist/shopify/types.js +4 -0
- package/dist/solutions/catalog.d.ts +1 -1
- package/dist/solutions/catalog.js +1 -1
- package/dist/stripe-commerce/evidence.d.ts +13 -0
- package/dist/stripe-commerce/evidence.js +164 -0
- package/dist/stripe-commerce/index.d.ts +3 -0
- package/dist/stripe-commerce/index.js +2 -0
- package/dist/stripe-commerce/metadata.d.ts +11 -0
- package/dist/stripe-commerce/metadata.js +34 -0
- package/dist/stripe-commerce/types.d.ts +38 -0
- package/dist/stripe-commerce/types.js +1 -0
- package/dist/template-init.d.ts +1 -1
- package/dist/template-init.js +6 -1
- package/package.json +1 -1
- package/policy/presets/stripe-commerce.yaml +19 -0
- package/solutions/stripe-commerce.json +19 -0
- package/templates/manifest.json +82 -10
- package/templates/openai-shopping-agent/package-lock.json +13 -13
- package/templates/openai-shopping-agent/src/paybond.config.ts +1 -1
- package/templates/paybond-aws-operator/package-lock.json +7 -7
- package/templates/paybond-aws-operator/src/paybond.config.ts +1 -1
- package/templates/paybond-claude-agents-demo/package-lock.json +10 -10
- package/templates/paybond-claude-agents-demo/src/paybond.config.ts +1 -1
- package/templates/paybond-mastra-travel-agent/package-lock.json +33 -33
- package/templates/paybond-mastra-travel-agent/src/paybond.config.ts +1 -1
- package/templates/paybond-mcp-coding-agent/package-lock.json +7 -7
- package/templates/paybond-mcp-coding-agent/src/paybond.config.ts +1 -1
- package/templates/paybond-openai-agents-demo/package-lock.json +13 -13
- package/templates/paybond-openai-agents-demo/src/paybond.config.ts +1 -1
- package/templates/paybond-procurement-agent/package-lock.json +7 -7
- package/templates/paybond-procurement-agent/src/paybond.config.ts +1 -1
- package/templates/paybond-shopify-shopping-agent/.env.example +3 -0
- package/templates/paybond-shopify-shopping-agent/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-shopify-shopping-agent/LICENSE +201 -0
- package/templates/paybond-shopify-shopping-agent/README.md +29 -0
- package/templates/paybond-shopify-shopping-agent/package-lock.json +223 -0
- package/templates/paybond-shopify-shopping-agent/package.json +20 -0
- package/templates/paybond-shopify-shopping-agent/paybond.policy.yaml +22 -0
- package/templates/paybond-shopify-shopping-agent/src/index.ts +54 -0
- package/templates/paybond-shopify-shopping-agent/src/paybond.config.ts +51 -0
- package/templates/paybond-shopify-shopping-agent/tsconfig.json +13 -0
- package/templates/paybond-stripe-agent-demo/.env.example +9 -0
- package/templates/paybond-stripe-agent-demo/.github/workflows/smoke.yml +20 -0
- package/templates/paybond-stripe-agent-demo/LICENSE +201 -0
- package/templates/paybond-stripe-agent-demo/README.md +50 -0
- package/templates/paybond-stripe-agent-demo/package-lock.json +223 -0
- package/templates/paybond-stripe-agent-demo/package.json +20 -0
- package/templates/paybond-stripe-agent-demo/paybond.policy.yaml +22 -0
- package/templates/paybond-stripe-agent-demo/src/charge-customer.ts +237 -0
- package/templates/paybond-stripe-agent-demo/src/index.ts +78 -0
- package/templates/paybond-stripe-agent-demo/src/paybond.config.ts +51 -0
- package/templates/paybond-stripe-agent-demo/tsconfig.json +13 -0
- package/templates/paybond-travel-agent/package-lock.json +13 -13
- package/templates/paybond-travel-agent/src/paybond.config.ts +1 -1
- package/templates/paybond-vercel-shopping-agent/package-lock.json +7 -7
- package/templates/paybond-vercel-shopping-agent/src/paybond.config.ts +1 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MPP commercial denomination helpers for Paybond MVP.
|
|
3
|
+
*
|
|
4
|
+
* Paybond intent commercial fields remain USD-denominated (`amount_cents`, `currency`).
|
|
5
|
+
* Tempo session deposits use USDC base units (6 decimals): `amount_cents * 10_000`.
|
|
6
|
+
*/
|
|
7
|
+
/** USDC uses 6 decimal places; one USD cent maps to 10_000 base units. */
|
|
8
|
+
export const USDC_BASE_UNITS_PER_USD_CENT = 10_000;
|
|
9
|
+
/** Rails that require USD-denominated commercial intent fields for MVP. */
|
|
10
|
+
export const USD_DENOMINATED_SETTLEMENT_RAILS = new Set([
|
|
11
|
+
"x402_usdc_base",
|
|
12
|
+
"stripe_ach_debit",
|
|
13
|
+
"stripe_mpp",
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Rejects non-USD intents on rails that remain USD-denominated for MVP.
|
|
17
|
+
*/
|
|
18
|
+
export function validateUsdDenominatedSettlement(settlementRail, currency) {
|
|
19
|
+
if (!USD_DENOMINATED_SETTLEMENT_RAILS.has(settlementRail)) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (currency.trim().toLowerCase() !== "usd") {
|
|
23
|
+
throw new Error(`currency must be usd when settlementRail is ${settlementRail} until multi-currency policy is defined`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Converts Paybond USD cents to Tempo USDC base units.
|
|
28
|
+
*/
|
|
29
|
+
export function usdCentsToUsdcBaseUnits(amountCents) {
|
|
30
|
+
if (!Number.isInteger(amountCents) || amountCents < 0) {
|
|
31
|
+
throw new Error("amountCents must be a non-negative integer");
|
|
32
|
+
}
|
|
33
|
+
return BigInt(amountCents) * BigInt(USDC_BASE_UNITS_PER_USD_CENT);
|
|
34
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { AgentRecognitionProofV1, FundIntentResult } from "./index.js";
|
|
2
|
+
import { type FundRequestEnvelope, type X402FundPollOptions } from "./x402-funding.js";
|
|
3
|
+
/** Raw `WWW-Authenticate: Payment …` challenge value from Harbor or the gateway. */
|
|
4
|
+
export type PaymentAuthChallenge = string;
|
|
5
|
+
/** Parsed Payment Auth challenge parameters from a `WWW-Authenticate` header value. */
|
|
6
|
+
export type ParsedPaymentAuthChallenge = {
|
|
7
|
+
raw: string;
|
|
8
|
+
id?: string;
|
|
9
|
+
realm?: string;
|
|
10
|
+
method?: string;
|
|
11
|
+
intent?: string;
|
|
12
|
+
request?: string;
|
|
13
|
+
};
|
|
14
|
+
export type MppFundPollOptions = X402FundPollOptions;
|
|
15
|
+
/** Raised when MPP funding cannot complete (missing challenge, terminal rail status, unexpected HTTP). */
|
|
16
|
+
export declare class PaybondMppFundingFailedError extends Error {
|
|
17
|
+
readonly intentId: string;
|
|
18
|
+
readonly lastResult?: FundIntentResult;
|
|
19
|
+
constructor(message: string, init: {
|
|
20
|
+
intentId: string;
|
|
21
|
+
lastResult?: FundIntentResult;
|
|
22
|
+
cause?: unknown;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** Raised when polling exhausts `maxAttempts` before Harbor returns a funded capability token. */
|
|
26
|
+
export declare class PaybondMppFundingPendingError extends Error {
|
|
27
|
+
readonly intentId: string;
|
|
28
|
+
readonly lastResult: FundIntentResult;
|
|
29
|
+
readonly attempts: number;
|
|
30
|
+
constructor(message: string, init: {
|
|
31
|
+
intentId: string;
|
|
32
|
+
lastResult: FundIntentResult;
|
|
33
|
+
attempts: number;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parses a `WWW-Authenticate: Payment …` challenge into structured parameters.
|
|
38
|
+
*
|
|
39
|
+
* @throws Error when the value is empty or does not start with the Payment scheme.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parsePaymentAuthChallenge(raw: string): ParsedPaymentAuthChallenge;
|
|
42
|
+
/** Selects the Stripe MPP charge challenge from `WWW-Authenticate` values. */
|
|
43
|
+
export declare function selectMppChargeChallenge(wwwAuthenticate: string[] | undefined): PaymentAuthChallenge;
|
|
44
|
+
/** Selects the Tempo MPP session challenge from `WWW-Authenticate` values. */
|
|
45
|
+
export declare function selectMppSessionChallenge(wwwAuthenticate: string[] | undefined): PaymentAuthChallenge;
|
|
46
|
+
/** Canonical `/fund` request envelope for Gateway `POST /harbor/intents/{intentId}/fund`. */
|
|
47
|
+
export declare function buildMppFundRequestEnvelope(intentId: string): FundRequestEnvelope;
|
|
48
|
+
export type ExecuteFundWithMppParams = {
|
|
49
|
+
intentId: string;
|
|
50
|
+
recognitionProof: AgentRecognitionProofV1 | Record<string, unknown>;
|
|
51
|
+
/** App-owned callback that turns a Payment Auth challenge into a credential token or header value. */
|
|
52
|
+
createPaymentCredential: (challenge: PaymentAuthChallenge) => Promise<string>;
|
|
53
|
+
issueRecognitionProof: (envelope: FundRequestEnvelope) => Promise<AgentRecognitionProofV1 | Record<string, unknown>>;
|
|
54
|
+
pollOptions?: MppFundPollOptions;
|
|
55
|
+
selectChallenge: (wwwAuthenticate: string[] | undefined) => PaymentAuthChallenge;
|
|
56
|
+
fund: (args: {
|
|
57
|
+
recognitionProof: AgentRecognitionProofV1 | Record<string, unknown>;
|
|
58
|
+
paymentAuthorization?: string;
|
|
59
|
+
}) => Promise<FundIntentResult>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Orchestrate MPP `/fund`: handle 402 Payment Auth challenges, retry with credentials, poll until funded.
|
|
63
|
+
*
|
|
64
|
+
* Wallet and SPT secrets stay app-owned — pass injectable `createPaymentCredential` and
|
|
65
|
+
* `issueRecognitionProof` callbacks; Paybond never stores MPP signing material.
|
|
66
|
+
*/
|
|
67
|
+
export declare function executeFundWithMpp(params: ExecuteFundWithMppParams): Promise<FundIntentResult>;
|
|
68
|
+
/** One-shot Stripe MPP charge funding through Payment Auth semantics. */
|
|
69
|
+
export declare function executeFundWithMppCharge(params: Omit<ExecuteFundWithMppParams, "selectChallenge">): Promise<FundIntentResult>;
|
|
70
|
+
/** Tempo MPP session funding through Payment Auth semantics. */
|
|
71
|
+
export declare function executeFundWithMppSession(params: Omit<ExecuteFundWithMppParams, "selectChallenge">): Promise<FundIntentResult>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { buildX402FundRequestEnvelope, } from "./x402-funding.js";
|
|
2
|
+
const DEFAULT_MAX_ATTEMPTS = 30;
|
|
3
|
+
const DEFAULT_INTERVAL_MS = 2_000;
|
|
4
|
+
const TERMINAL_MPP_FUNDING_STATUSES = new Set([
|
|
5
|
+
"authorization_failed",
|
|
6
|
+
"capture_failed",
|
|
7
|
+
"void_failed",
|
|
8
|
+
"credential_rejected",
|
|
9
|
+
"payment_failed",
|
|
10
|
+
"charge_failed",
|
|
11
|
+
"session_open_failed",
|
|
12
|
+
]);
|
|
13
|
+
const MPP_CHARGE_EXPECTED = { intent: "charge", method: "stripe" };
|
|
14
|
+
const MPP_SESSION_EXPECTED = { intent: "session", method: "tempo" };
|
|
15
|
+
/** Raised when MPP funding cannot complete (missing challenge, terminal rail status, unexpected HTTP). */
|
|
16
|
+
export class PaybondMppFundingFailedError extends Error {
|
|
17
|
+
intentId;
|
|
18
|
+
lastResult;
|
|
19
|
+
constructor(message, init) {
|
|
20
|
+
super(message, { cause: init.cause });
|
|
21
|
+
this.name = "PaybondMppFundingFailedError";
|
|
22
|
+
this.intentId = init.intentId;
|
|
23
|
+
this.lastResult = init.lastResult;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Raised when polling exhausts `maxAttempts` before Harbor returns a funded capability token. */
|
|
27
|
+
export class PaybondMppFundingPendingError extends Error {
|
|
28
|
+
intentId;
|
|
29
|
+
lastResult;
|
|
30
|
+
attempts;
|
|
31
|
+
constructor(message, init) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "PaybondMppFundingPendingError";
|
|
34
|
+
this.intentId = init.intentId;
|
|
35
|
+
this.lastResult = init.lastResult;
|
|
36
|
+
this.attempts = init.attempts;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parses a `WWW-Authenticate: Payment …` challenge into structured parameters.
|
|
41
|
+
*
|
|
42
|
+
* @throws Error when the value is empty or does not start with the Payment scheme.
|
|
43
|
+
*/
|
|
44
|
+
export function parsePaymentAuthChallenge(raw) {
|
|
45
|
+
const trimmed = raw.trim();
|
|
46
|
+
if (!trimmed) {
|
|
47
|
+
throw new Error("Payment Auth challenge must be non-empty");
|
|
48
|
+
}
|
|
49
|
+
if (!/^payment\b/i.test(trimmed)) {
|
|
50
|
+
throw new Error("expected Payment Auth challenge");
|
|
51
|
+
}
|
|
52
|
+
const params = {};
|
|
53
|
+
const afterScheme = trimmed.replace(/^payment\s+/i, "");
|
|
54
|
+
const paramRe = /([a-zA-Z_][\w-]*)=(?:"([^"]*)"|([^,\s]+))/g;
|
|
55
|
+
let match;
|
|
56
|
+
while ((match = paramRe.exec(afterScheme)) !== null) {
|
|
57
|
+
params[match[1].toLowerCase()] = match[2] ?? match[3] ?? "";
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
raw: trimmed,
|
|
61
|
+
id: params.id,
|
|
62
|
+
realm: params.realm,
|
|
63
|
+
method: params.method,
|
|
64
|
+
intent: params.intent,
|
|
65
|
+
request: params.request,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function selectMppPaymentChallenge(wwwAuthenticate, expected) {
|
|
69
|
+
if (!wwwAuthenticate?.length) {
|
|
70
|
+
throw new Error("MPP fund challenge missing WWW-Authenticate Payment header");
|
|
71
|
+
}
|
|
72
|
+
for (const header of wwwAuthenticate) {
|
|
73
|
+
const parsed = parsePaymentAuthChallenge(header);
|
|
74
|
+
if (parsed.intent === expected.intent && parsed.method === expected.method) {
|
|
75
|
+
return parsed.raw;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (wwwAuthenticate.length === 1) {
|
|
79
|
+
const parsed = parsePaymentAuthChallenge(wwwAuthenticate[0]);
|
|
80
|
+
if (parsed.intent !== expected.intent || parsed.method !== expected.method) {
|
|
81
|
+
throw new Error(`MPP fund challenge intent/method mismatch: expected intent=${expected.intent} method=${expected.method}, got intent=${parsed.intent ?? "unknown"} method=${parsed.method ?? "unknown"}`);
|
|
82
|
+
}
|
|
83
|
+
return parsed.raw;
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`MPP fund challenge missing Payment Auth header for intent=${expected.intent} method=${expected.method}`);
|
|
86
|
+
}
|
|
87
|
+
/** Selects the Stripe MPP charge challenge from `WWW-Authenticate` values. */
|
|
88
|
+
export function selectMppChargeChallenge(wwwAuthenticate) {
|
|
89
|
+
return selectMppPaymentChallenge(wwwAuthenticate, MPP_CHARGE_EXPECTED);
|
|
90
|
+
}
|
|
91
|
+
/** Selects the Tempo MPP session challenge from `WWW-Authenticate` values. */
|
|
92
|
+
export function selectMppSessionChallenge(wwwAuthenticate) {
|
|
93
|
+
return selectMppPaymentChallenge(wwwAuthenticate, MPP_SESSION_EXPECTED);
|
|
94
|
+
}
|
|
95
|
+
/** Canonical `/fund` request envelope for Gateway `POST /harbor/intents/{intentId}/fund`. */
|
|
96
|
+
export function buildMppFundRequestEnvelope(intentId) {
|
|
97
|
+
return buildX402FundRequestEnvelope(intentId);
|
|
98
|
+
}
|
|
99
|
+
function isFundingComplete(result) {
|
|
100
|
+
if (result.capabilityToken?.trim()) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return result.statusCode === 200 && result.funded;
|
|
104
|
+
}
|
|
105
|
+
function isTerminalFundingFailure(result) {
|
|
106
|
+
const status = result.funding?.status?.trim();
|
|
107
|
+
return status !== undefined && TERMINAL_MPP_FUNDING_STATUSES.has(status);
|
|
108
|
+
}
|
|
109
|
+
function failureMessage(result) {
|
|
110
|
+
const status = result.funding?.status ?? result.state;
|
|
111
|
+
return `MPP funding failed for intent ${result.intentId} (status=${status})`;
|
|
112
|
+
}
|
|
113
|
+
async function sleep(ms) {
|
|
114
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Orchestrate MPP `/fund`: handle 402 Payment Auth challenges, retry with credentials, poll until funded.
|
|
118
|
+
*
|
|
119
|
+
* Wallet and SPT secrets stay app-owned — pass injectable `createPaymentCredential` and
|
|
120
|
+
* `issueRecognitionProof` callbacks; Paybond never stores MPP signing material.
|
|
121
|
+
*/
|
|
122
|
+
export async function executeFundWithMpp(params) {
|
|
123
|
+
const intentId = params.intentId.trim();
|
|
124
|
+
if (!intentId) {
|
|
125
|
+
throw new Error("fundWithMpp: intentId is required");
|
|
126
|
+
}
|
|
127
|
+
const maxAttempts = Math.max(1, params.pollOptions?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
|
|
128
|
+
const intervalMs = Math.max(0, params.pollOptions?.intervalMs ?? DEFAULT_INTERVAL_MS);
|
|
129
|
+
const envelope = buildMppFundRequestEnvelope(intentId);
|
|
130
|
+
let paymentAuthorization;
|
|
131
|
+
let result = await params.fund({ recognitionProof: params.recognitionProof });
|
|
132
|
+
if (result.statusCode === 402) {
|
|
133
|
+
const challenge = params.selectChallenge(result.wwwAuthenticate);
|
|
134
|
+
paymentAuthorization = (await params.createPaymentCredential(challenge)).trim();
|
|
135
|
+
if (!paymentAuthorization) {
|
|
136
|
+
throw new PaybondMppFundingFailedError("MPP createPaymentCredential returned an empty credential", {
|
|
137
|
+
intentId,
|
|
138
|
+
lastResult: result,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const retryProof = await params.issueRecognitionProof(envelope);
|
|
142
|
+
result = await params.fund({
|
|
143
|
+
recognitionProof: retryProof,
|
|
144
|
+
paymentAuthorization,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (isTerminalFundingFailure(result)) {
|
|
148
|
+
throw new PaybondMppFundingFailedError(failureMessage(result), { intentId, lastResult: result });
|
|
149
|
+
}
|
|
150
|
+
if (isFundingComplete(result)) {
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
let attempts = 0;
|
|
154
|
+
while (result.statusCode === 202 || (!isFundingComplete(result) && result.statusCode === 200)) {
|
|
155
|
+
attempts += 1;
|
|
156
|
+
if (attempts > maxAttempts) {
|
|
157
|
+
throw new PaybondMppFundingPendingError(`MPP funding still pending after ${maxAttempts} poll attempt(s) for intent ${intentId}`, { intentId, lastResult: result, attempts: maxAttempts });
|
|
158
|
+
}
|
|
159
|
+
if (intervalMs > 0) {
|
|
160
|
+
await sleep(intervalMs);
|
|
161
|
+
}
|
|
162
|
+
const pollProof = await params.issueRecognitionProof(envelope);
|
|
163
|
+
result = await params.fund({
|
|
164
|
+
recognitionProof: pollProof,
|
|
165
|
+
...(paymentAuthorization ? { paymentAuthorization } : {}),
|
|
166
|
+
});
|
|
167
|
+
if (isTerminalFundingFailure(result)) {
|
|
168
|
+
throw new PaybondMppFundingFailedError(failureMessage(result), { intentId, lastResult: result });
|
|
169
|
+
}
|
|
170
|
+
if (isFundingComplete(result)) {
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (isFundingComplete(result)) {
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
throw new PaybondMppFundingFailedError(`unexpected MPP fund response HTTP ${result.statusCode} for intent ${intentId}`, { intentId, lastResult: result });
|
|
178
|
+
}
|
|
179
|
+
/** One-shot Stripe MPP charge funding through Payment Auth semantics. */
|
|
180
|
+
export async function executeFundWithMppCharge(params) {
|
|
181
|
+
return executeFundWithMpp({
|
|
182
|
+
...params,
|
|
183
|
+
selectChallenge: selectMppChargeChallenge,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/** Tempo MPP session funding through Payment Auth semantics. */
|
|
187
|
+
export async function executeFundWithMppSession(params) {
|
|
188
|
+
return executeFundWithMpp({
|
|
189
|
+
...params,
|
|
190
|
+
selectChallenge: selectMppSessionChallenge,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment Auth transport headers for MPP funding through the Paybond Gateway.
|
|
3
|
+
*
|
|
4
|
+
* Kit callers send `x-paybond-payment-authorization: Payment <credential>` so
|
|
5
|
+
* `Authorization: Bearer` remains available for Paybond tenant authentication.
|
|
6
|
+
* The gateway translates this to `Authorization: Payment` when forwarding to Harbor.
|
|
7
|
+
*/
|
|
8
|
+
/** Gateway-facing Payment Auth credential header (avoids clashing with Bearer auth). */
|
|
9
|
+
export declare const PAYBOND_PAYMENT_AUTHORIZATION_HEADER = "x-paybond-payment-authorization";
|
|
10
|
+
/** Payment Auth response headers propagated by the gateway from Harbor. */
|
|
11
|
+
export declare const PAYMENT_TRANSPORT_RESPONSE_HEADERS: readonly ["www-authenticate", "payment-receipt", "cache-control"];
|
|
12
|
+
/**
|
|
13
|
+
* Normalizes a Payment Auth credential for HTTP headers.
|
|
14
|
+
*
|
|
15
|
+
* Accepts either a raw credential token or a value already prefixed with `Payment `.
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatPaymentAuthorizationValue(credential: string): string;
|
|
18
|
+
/** Header entry for gateway Harbor fund/verify retries. */
|
|
19
|
+
export declare function paymentAuthorizationGatewayHeader(credential: string): Record<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* Appends `Authorization: Payment …` for direct Harbor calls that already carry Bearer auth.
|
|
22
|
+
*/
|
|
23
|
+
export declare function appendDirectHarborPaymentAuthorization(headers: Headers, credential: string): void;
|
|
24
|
+
export type FundPaymentTransportHeaders = {
|
|
25
|
+
wwwAuthenticate?: string[];
|
|
26
|
+
paymentReceipt?: string;
|
|
27
|
+
cacheControl?: string;
|
|
28
|
+
};
|
|
29
|
+
/** Reads Payment Auth transport headers from a fund response. */
|
|
30
|
+
export declare function readFundPaymentTransportHeaders(headers: Headers): FundPaymentTransportHeaders;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment Auth transport headers for MPP funding through the Paybond Gateway.
|
|
3
|
+
*
|
|
4
|
+
* Kit callers send `x-paybond-payment-authorization: Payment <credential>` so
|
|
5
|
+
* `Authorization: Bearer` remains available for Paybond tenant authentication.
|
|
6
|
+
* The gateway translates this to `Authorization: Payment` when forwarding to Harbor.
|
|
7
|
+
*/
|
|
8
|
+
/** Gateway-facing Payment Auth credential header (avoids clashing with Bearer auth). */
|
|
9
|
+
export const PAYBOND_PAYMENT_AUTHORIZATION_HEADER = "x-paybond-payment-authorization";
|
|
10
|
+
/** Payment Auth response headers propagated by the gateway from Harbor. */
|
|
11
|
+
export const PAYMENT_TRANSPORT_RESPONSE_HEADERS = [
|
|
12
|
+
"www-authenticate",
|
|
13
|
+
"payment-receipt",
|
|
14
|
+
"cache-control",
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes a Payment Auth credential for HTTP headers.
|
|
18
|
+
*
|
|
19
|
+
* Accepts either a raw credential token or a value already prefixed with `Payment `.
|
|
20
|
+
*/
|
|
21
|
+
export function formatPaymentAuthorizationValue(credential) {
|
|
22
|
+
const trimmed = credential.trim();
|
|
23
|
+
if (!trimmed) {
|
|
24
|
+
throw new Error("payment authorization credential must be non-empty");
|
|
25
|
+
}
|
|
26
|
+
if (/^payment\s+/i.test(trimmed)) {
|
|
27
|
+
return trimmed;
|
|
28
|
+
}
|
|
29
|
+
return `Payment ${trimmed}`;
|
|
30
|
+
}
|
|
31
|
+
/** Header entry for gateway Harbor fund/verify retries. */
|
|
32
|
+
export function paymentAuthorizationGatewayHeader(credential) {
|
|
33
|
+
return {
|
|
34
|
+
[PAYBOND_PAYMENT_AUTHORIZATION_HEADER]: formatPaymentAuthorizationValue(credential),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Appends `Authorization: Payment …` for direct Harbor calls that already carry Bearer auth.
|
|
39
|
+
*/
|
|
40
|
+
export function appendDirectHarborPaymentAuthorization(headers, credential) {
|
|
41
|
+
headers.append("authorization", formatPaymentAuthorizationValue(credential));
|
|
42
|
+
}
|
|
43
|
+
/** Reads Payment Auth transport headers from a fund response. */
|
|
44
|
+
export function readFundPaymentTransportHeaders(headers) {
|
|
45
|
+
const wwwAuthenticate = [];
|
|
46
|
+
headers.forEach((value, key) => {
|
|
47
|
+
if (key.toLowerCase() === "www-authenticate") {
|
|
48
|
+
wwwAuthenticate.push(value);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
wwwAuthenticate: wwwAuthenticate.length > 0 ? wwwAuthenticate : undefined,
|
|
53
|
+
paymentReceipt: headers.get("payment-receipt") ?? undefined,
|
|
54
|
+
cacheControl: headers.get("cache-control") ?? undefined,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { PaybondToolRegistryValidationError } from "../agent/types.js";
|
|
2
2
|
import { resolveCompletionPreset, contractSnapshotForPreset } from "../completion-resolve.js";
|
|
3
|
+
import { validateUsdDenominatedSettlement } from "../mpp-commercial.js";
|
|
3
4
|
import { policyToToolRegistry } from "./registry.js";
|
|
4
5
|
/** Raised when policy intent fields cannot be aligned to a Harbor create payload. */
|
|
5
6
|
export class PaybondPolicyIntentSpecError extends Error {
|
|
@@ -142,6 +143,7 @@ export function policyToIntentCreateInput(document, overrides) {
|
|
|
142
143
|
const allowedTools = resolveAllowedHarborOperations(document, registry, overrides.allowedTools);
|
|
143
144
|
const policyBinding = resolvePolicyBindingRef(document, overrides.publishedPolicyHead, overrides.policyBinding);
|
|
144
145
|
const { budget, currency, amountCents } = resolveBudgetFields(document, overrides);
|
|
146
|
+
validateUsdDenominatedSettlement(overrides.settlementRail, currency);
|
|
145
147
|
const completionPresetId = overrides.completionPresetId ??
|
|
146
148
|
resolveEvidencePresetForOperations(registry, allowedTools);
|
|
147
149
|
const resolvedPreset = resolveCompletionPreset(completionPresetId);
|
package/dist/policy/presets.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { LayeredPolicyPresetId } from "./compose.js";
|
|
2
2
|
import { type PaybondPolicyDocumentV1 } from "./schema.js";
|
|
3
3
|
export type { LayeredPolicyPresetId };
|
|
4
|
-
declare const KNOWN_POLICY_PRESET_IDS: readonly ["travel", "shopping", "saas", "aws", "read-only", "strict"];
|
|
4
|
+
declare const KNOWN_POLICY_PRESET_IDS: readonly ["travel", "shopping", "saas", "aws", "stripe-commerce", "read-only", "strict"];
|
|
5
5
|
export type PolicyPresetId = (typeof KNOWN_POLICY_PRESET_IDS)[number];
|
|
6
6
|
/** True when `value` is a bundled vertical policy preset id (not a file path). */
|
|
7
7
|
export declare function isKnownPolicyPresetId(value: string): value is PolicyPresetId;
|
package/dist/policy/presets.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Matches `crates/harbor-intent-escrow/src/signing.rs` (`intent_creation_sign_bytes_raw`).
|
|
4
4
|
*/
|
|
5
5
|
/** Tenant-configured settlement rail names. Clients may request a rail, not a destination. */
|
|
6
|
-
export type SettlementRail = "stripe_connect" | "stripe_ach_debit" | "x402_usdc_base";
|
|
6
|
+
export type SettlementRail = "stripe_connect" | "stripe_ach_debit" | "stripe_mpp" | "x402_usdc_base";
|
|
7
7
|
export type CompletionContractSnapshot = {
|
|
8
8
|
completionPresetId: string;
|
|
9
9
|
vendorContractProvider?: string;
|
package/dist/principal-intent.js
CHANGED
|
@@ -6,7 +6,8 @@ import { sign, getPublicKey } from "@noble/ed25519";
|
|
|
6
6
|
import { ensureEd25519Sha512Sync } from "./ed25519-sync.js";
|
|
7
7
|
import { jsonValueDigest } from "./json-digest.js";
|
|
8
8
|
import { COMPLETION_CONTRACT_SIGN_VERSION, concatBytes, encodeBincodeString, encodeBincodeUuid, encodeFixed32, encodeU8, encodeVarintI64, encodeVarintU32, } from "./bincode-wire.js";
|
|
9
|
-
|
|
9
|
+
import { validateUsdDenominatedSettlement } from "./mpp-commercial.js";
|
|
10
|
+
const SETTLEMENT_RAIL_VALUES = new Set(["stripe_connect", "stripe_ach_debit", "stripe_mpp", "x402_usdc_base"]);
|
|
10
11
|
function validateSettlementRail(value) {
|
|
11
12
|
if (!SETTLEMENT_RAIL_VALUES.has(value)) {
|
|
12
13
|
throw new Error(`settlementRail must be one of ${[...SETTLEMENT_RAIL_VALUES].join(", ")}`);
|
|
@@ -171,6 +172,7 @@ export function buildSignedCreateIntentBodyWithPolicyBinding(params) {
|
|
|
171
172
|
throw new Error("allowedTools must be non-empty");
|
|
172
173
|
}
|
|
173
174
|
const settlementRail = validateSettlementRail(params.settlementRail);
|
|
175
|
+
validateUsdDenominatedSettlement(settlementRail, params.currency);
|
|
174
176
|
const predicateRef = params.predicateRef ?? "";
|
|
175
177
|
const head = params.publishedPolicyHead;
|
|
176
178
|
if (head.templateId !== params.policyBinding.templateId || head.versionSeq !== params.policyBinding.versionSeq) {
|
|
@@ -248,6 +250,7 @@ export function buildSignedCreateIntentBody(params) {
|
|
|
248
250
|
throw new Error("allowedTools must be non-empty");
|
|
249
251
|
}
|
|
250
252
|
const settlementRail = validateSettlementRail(params.settlementRail);
|
|
253
|
+
validateUsdDenominatedSettlement(settlementRail, params.currency);
|
|
251
254
|
const predicateRef = params.predicateRef ?? "";
|
|
252
255
|
ensureEd25519Sha512Sync();
|
|
253
256
|
const payeePub = getPublicKey(params.payeeSigningSeed);
|
package/dist/project-init.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PolicyPresetId } from "./policy/presets.js";
|
|
2
2
|
import { type SolutionId } from "./solutions/catalog.js";
|
|
3
3
|
export type ProjectInitSolution = SolutionId | "mcp-server";
|
|
4
|
-
export type ProjectInitFramework = "openai" | "langgraph" | "mcp" | "generic";
|
|
4
|
+
export type ProjectInitFramework = "openai" | "langgraph" | "mcp" | "generic" | "shopify";
|
|
5
5
|
export type ProjectInitLanguage = "typescript" | "python";
|
|
6
6
|
export type ProjectInitOptions = {
|
|
7
7
|
cwd: string;
|
package/dist/project-init.js
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local verification for protocol-v2 authorization and settlement receipts.
|
|
3
|
+
*
|
|
4
|
+
* Canonical JSON matches the Go gateway `protocolAuthorizationReceiptCanonicalV1` /
|
|
5
|
+
* `protocolSettlementReceiptCanonicalV1` marshalers (fixed struct field order, signing
|
|
6
|
+
* fields stripped, RFC3339Nano UTC timestamps, HTML-safe `\u` escapes), not Kit's generic
|
|
7
|
+
* JCS-style `normalizeJson`. Ported from `go/gateway/internal/protocolv2/receipt.go`.
|
|
8
|
+
*/
|
|
9
|
+
import { type AgentMandateAgentIdentity, type AgentMandateAuthorization, type AgentMandateConstraintReference, type AgentMandateSettlementRailPolicy, type AgentMandateSpendCeiling } from "./agent-mandate.js";
|
|
10
|
+
export declare const PROTOCOL_RECEIPT_SCHEMA_VERSION = 1;
|
|
11
|
+
export declare const PROTOCOL_RECEIPT_VERSION_V1 = "1";
|
|
12
|
+
export declare const PROTOCOL_RECEIPT_SIGNING_ALGORITHM_ED25519_SHA256 = "ed25519-sha256-json-v1";
|
|
13
|
+
export declare const PROTOCOL_AUTHORIZATION_RECEIPT_KIND_V1 = "paybond.protocol_authorization_receipt_v1";
|
|
14
|
+
export declare const PROTOCOL_SETTLEMENT_RECEIPT_KIND_V1 = "paybond.protocol_settlement_receipt_v1";
|
|
15
|
+
export declare const PROTOCOL_RECEIPT_STATUS_AUTHORIZED = "authorized";
|
|
16
|
+
/** Default protocol source (AP2-aligned) for imported mandates and exported receipts. */
|
|
17
|
+
export declare const PROTOCOL_SOURCE_AP2 = "ap2";
|
|
18
|
+
/** Stripe Agentic Commerce Protocol (ACP) source identifier for partner receipts. */
|
|
19
|
+
export declare const PROTOCOL_SOURCE_ACP = "acp";
|
|
20
|
+
/** Stripe Unified Commerce Protocol (UCP) source identifier for partner receipts. */
|
|
21
|
+
export declare const PROTOCOL_SOURCE_UCP = "ucp";
|
|
22
|
+
/** Partner transport metadata for imported mandates and exported receipts. */
|
|
23
|
+
export type ProtocolTransportBindingV1 = {
|
|
24
|
+
source_protocol: string;
|
|
25
|
+
partner_platform?: string;
|
|
26
|
+
external_authorization_id?: string;
|
|
27
|
+
request_id?: string;
|
|
28
|
+
};
|
|
29
|
+
/** Signed acknowledgement emitted after accepting a partner mandate binding. */
|
|
30
|
+
export type ProtocolAuthorizationReceiptV1 = {
|
|
31
|
+
schema_version: number;
|
|
32
|
+
kind: string;
|
|
33
|
+
receipt_version: string;
|
|
34
|
+
receipt_id: string;
|
|
35
|
+
issued_at: string;
|
|
36
|
+
status: string;
|
|
37
|
+
intent_id: string;
|
|
38
|
+
tenant_id: string;
|
|
39
|
+
verifier_id: string;
|
|
40
|
+
transport_binding: ProtocolTransportBindingV1;
|
|
41
|
+
mandate_digest_sha256_hex: string;
|
|
42
|
+
imported_mandate_signing_public_key_ed25519_hex: string;
|
|
43
|
+
authorization: AgentMandateAuthorization;
|
|
44
|
+
agent: AgentMandateAgentIdentity;
|
|
45
|
+
allowed_actions: string[];
|
|
46
|
+
allowed_tools: string[];
|
|
47
|
+
spend_ceiling: AgentMandateSpendCeiling;
|
|
48
|
+
settlement: AgentMandateSettlementRailPolicy;
|
|
49
|
+
constraint: AgentMandateConstraintReference;
|
|
50
|
+
expires_at: string;
|
|
51
|
+
nonce: string;
|
|
52
|
+
human_presence_mode: string;
|
|
53
|
+
signing_algorithm: string;
|
|
54
|
+
message_digest_sha256_hex: string;
|
|
55
|
+
signing_public_key_ed25519_hex: string;
|
|
56
|
+
ed25519_signature_hex: string;
|
|
57
|
+
};
|
|
58
|
+
/** Signed terminal outcome artifact for a Harbor intent bound to a partner mandate. */
|
|
59
|
+
export type ProtocolSettlementReceiptV1 = {
|
|
60
|
+
schema_version: number;
|
|
61
|
+
kind: string;
|
|
62
|
+
receipt_version: string;
|
|
63
|
+
receipt_id: string;
|
|
64
|
+
issued_at: string;
|
|
65
|
+
intent_id: string;
|
|
66
|
+
tenant_id: string;
|
|
67
|
+
verifier_id: string;
|
|
68
|
+
transport_binding: ProtocolTransportBindingV1;
|
|
69
|
+
authorization_receipt_id: string;
|
|
70
|
+
mandate_digest_sha256_hex: string;
|
|
71
|
+
harbor_state: string;
|
|
72
|
+
predicate_passed?: boolean;
|
|
73
|
+
settlement_rail: string;
|
|
74
|
+
settlement_mode: string;
|
|
75
|
+
principal_did: string;
|
|
76
|
+
payee_did: string;
|
|
77
|
+
currency: string;
|
|
78
|
+
amount_cents: number;
|
|
79
|
+
terminal_observed_at: string;
|
|
80
|
+
signing_algorithm: string;
|
|
81
|
+
message_digest_sha256_hex: string;
|
|
82
|
+
signing_public_key_ed25519_hex: string;
|
|
83
|
+
ed25519_signature_hex: string;
|
|
84
|
+
};
|
|
85
|
+
type ProtocolAuthorizationReceiptInput = ProtocolAuthorizationReceiptV1 | Record<string, unknown>;
|
|
86
|
+
type ProtocolSettlementReceiptInput = ProtocolSettlementReceiptV1 | Record<string, unknown>;
|
|
87
|
+
/**
|
|
88
|
+
* Validates and canonicalizes an authorization receipt for hashing and signing.
|
|
89
|
+
*
|
|
90
|
+
* Signing fields are lower/trim-normalized but not recomputed here.
|
|
91
|
+
*
|
|
92
|
+
* @throws When structure or field values are invalid.
|
|
93
|
+
*/
|
|
94
|
+
export declare function normalizeProtocolAuthorizationReceiptV1(input: ProtocolAuthorizationReceiptInput): ProtocolAuthorizationReceiptV1;
|
|
95
|
+
/**
|
|
96
|
+
* Validates and canonicalizes a settlement receipt for hashing and signing.
|
|
97
|
+
*
|
|
98
|
+
* @throws When structure or field values are invalid.
|
|
99
|
+
*/
|
|
100
|
+
export declare function normalizeProtocolSettlementReceiptV1(input: ProtocolSettlementReceiptInput): ProtocolSettlementReceiptV1;
|
|
101
|
+
/**
|
|
102
|
+
* Validates, canonicalizes, and signs an authorization receipt with
|
|
103
|
+
* Ed25519-over-SHA-256(canonical JSON).
|
|
104
|
+
*
|
|
105
|
+
* @param signingSeed - 32-byte Ed25519 seed (noble private key).
|
|
106
|
+
*/
|
|
107
|
+
export declare function signProtocolAuthorizationReceiptV1(signingSeed: Uint8Array, input: ProtocolAuthorizationReceiptInput): ProtocolAuthorizationReceiptV1;
|
|
108
|
+
/**
|
|
109
|
+
* Validates, canonicalizes, and signs a settlement receipt with
|
|
110
|
+
* Ed25519-over-SHA-256(canonical JSON).
|
|
111
|
+
*
|
|
112
|
+
* @param signingSeed - 32-byte Ed25519 seed (noble private key).
|
|
113
|
+
*/
|
|
114
|
+
export declare function signProtocolSettlementReceiptV1(signingSeed: Uint8Array, input: ProtocolSettlementReceiptInput): ProtocolSettlementReceiptV1;
|
|
115
|
+
/**
|
|
116
|
+
* Checks structure, canonical digest recompute, and detached Ed25519 signature.
|
|
117
|
+
*
|
|
118
|
+
* @returns The normalized authorization receipt on success.
|
|
119
|
+
* @throws When structure, digest, or signature verification fails.
|
|
120
|
+
*/
|
|
121
|
+
export declare function verifyProtocolAuthorizationReceiptV1(input: ProtocolAuthorizationReceiptInput): ProtocolAuthorizationReceiptV1;
|
|
122
|
+
/**
|
|
123
|
+
* Checks structure, canonical digest recompute, and detached Ed25519 signature.
|
|
124
|
+
*
|
|
125
|
+
* @returns The normalized settlement receipt on success.
|
|
126
|
+
* @throws When structure, digest, or signature verification fails.
|
|
127
|
+
*/
|
|
128
|
+
export declare function verifyProtocolSettlementReceiptV1(input: ProtocolSettlementReceiptInput): ProtocolSettlementReceiptV1;
|
|
129
|
+
export {};
|