@aifinpay/agent 1.8.2 → 2.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -9
- package/dist/agentPassport.d.ts +35 -0
- package/dist/agentPassport.d.ts.map +1 -0
- package/dist/agentPassport.js +87 -0
- package/dist/agentPassport.js.map +1 -0
- package/dist/aifp1.d.ts +20 -9
- package/dist/aifp1.d.ts.map +1 -1
- package/dist/aifp1.js +51 -2
- package/dist/aifp1.js.map +1 -1
- package/dist/chains.d.ts +4 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +24 -0
- package/dist/chains.js.map +1 -0
- package/dist/facilitators/detect.d.ts +3 -3
- package/dist/facilitators/detect.d.ts.map +1 -1
- package/dist/facilitators/detect.js +3 -22
- package/dist/facilitators/detect.js.map +1 -1
- package/dist/facilitators/standard-x402.d.ts +4 -8
- package/dist/facilitators/standard-x402.d.ts.map +1 -1
- package/dist/facilitators/standard-x402.js +202 -92
- package/dist/facilitators/standard-x402.js.map +1 -1
- package/dist/index.d.ts +14 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -30
- package/dist/index.js.map +1 -1
- package/dist/settlement.d.ts +172 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +355 -0
- package/dist/settlement.js.map +1 -0
- package/dist/settlementV14.d.ts +135 -0
- package/dist/settlementV14.d.ts.map +1 -0
- package/dist/settlementV14.js +203 -0
- package/dist/settlementV14.js.map +1 -0
- package/dist/splitterRoutes.d.ts +116 -0
- package/dist/splitterRoutes.d.ts.map +1 -0
- package/dist/splitterRoutes.generated.d.ts +22 -0
- package/dist/splitterRoutes.generated.d.ts.map +1 -0
- package/dist/splitterRoutes.generated.js +399 -0
- package/dist/splitterRoutes.generated.js.map +1 -0
- package/dist/splitterRoutes.js +70 -0
- package/dist/splitterRoutes.js.map +1 -0
- package/dist/unifiedAgent.d.ts +77 -5
- package/dist/unifiedAgent.d.ts.map +1 -1
- package/dist/unifiedAgent.js +51 -81
- package/dist/unifiedAgent.js.map +1 -1
- package/dist/wallet.d.ts +28 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +97 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +41 -9
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { type Address, type Hex, type PublicClient, type WalletClient } from "viem";
|
|
2
|
+
export type SettlementRouteClass = "AIFP-1" | "AIFP-2";
|
|
3
|
+
export type SettlementEvmNetwork = "polygon" | "avalanche" | "arbitrum" | "bnb" | "base" | "unichain" | "optimism" | "botchain" | "xrplevm";
|
|
4
|
+
export interface SettlementRoute {
|
|
5
|
+
route_class: SettlementRouteClass;
|
|
6
|
+
profile: {
|
|
7
|
+
route_class: SettlementRouteClass;
|
|
8
|
+
settlement_semantics: "gross-inclusive";
|
|
9
|
+
treasury_bps: number;
|
|
10
|
+
creator_bps: number;
|
|
11
|
+
fee_on_top: false;
|
|
12
|
+
required_splitter_version: "1.3";
|
|
13
|
+
};
|
|
14
|
+
network: SettlementEvmNetwork;
|
|
15
|
+
chain_id: number;
|
|
16
|
+
name: string;
|
|
17
|
+
native_asset: string;
|
|
18
|
+
stable_assets: Record<string, {
|
|
19
|
+
address: Address;
|
|
20
|
+
decimals: number;
|
|
21
|
+
issuer: string;
|
|
22
|
+
}>;
|
|
23
|
+
explorer: string;
|
|
24
|
+
live: boolean;
|
|
25
|
+
splitter?: Address;
|
|
26
|
+
splitter_version?: "1.3";
|
|
27
|
+
runtime_code_hash?: Hex;
|
|
28
|
+
disabled_reason?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Independent release trust anchor. This value must come from a reviewed SDK
|
|
32
|
+
* release/config artifact, not from the same backend response as the invoice.
|
|
33
|
+
*/
|
|
34
|
+
export interface TrustedSettlementRoutePin {
|
|
35
|
+
route_class: SettlementRouteClass;
|
|
36
|
+
chain: SettlementEvmNetwork;
|
|
37
|
+
chain_id: number;
|
|
38
|
+
splitter_version: "1.3";
|
|
39
|
+
splitter: Address;
|
|
40
|
+
runtime_code_hash: Hex;
|
|
41
|
+
}
|
|
42
|
+
export type TrustedSettlementRouteRegistry = Partial<Record<SettlementRouteClass, Partial<Record<SettlementEvmNetwork, TrustedSettlementRoutePin>>>>;
|
|
43
|
+
export interface SettlementInvoiceInput {
|
|
44
|
+
route_class: SettlementRouteClass;
|
|
45
|
+
chain: SettlementEvmNetwork;
|
|
46
|
+
asset: string;
|
|
47
|
+
gross_amount: string | bigint;
|
|
48
|
+
merchant_wallet?: Address;
|
|
49
|
+
provider_wallet?: Address;
|
|
50
|
+
order_id: string;
|
|
51
|
+
valid_until?: number;
|
|
52
|
+
}
|
|
53
|
+
interface SettlementBreakdown {
|
|
54
|
+
gross_amount: string;
|
|
55
|
+
merchant_amount: string;
|
|
56
|
+
protocol_fee_amount: string;
|
|
57
|
+
creator_amount: string;
|
|
58
|
+
protocol_fee_bps: number;
|
|
59
|
+
creator_bps: number;
|
|
60
|
+
}
|
|
61
|
+
interface SettlementInvoiceBase {
|
|
62
|
+
route_class: SettlementRouteClass;
|
|
63
|
+
chain: SettlementEvmNetwork;
|
|
64
|
+
chain_id: number;
|
|
65
|
+
splitter_version: "1.3";
|
|
66
|
+
splitter: Address;
|
|
67
|
+
runtime_code_hash: Hex;
|
|
68
|
+
settlement_semantics: "gross-inclusive";
|
|
69
|
+
fee_on_top: false;
|
|
70
|
+
asset: string;
|
|
71
|
+
payment_id: Hex;
|
|
72
|
+
order_id: string;
|
|
73
|
+
valid_until: number;
|
|
74
|
+
merchant_wallet: Address;
|
|
75
|
+
breakdown: SettlementBreakdown;
|
|
76
|
+
authorization: string;
|
|
77
|
+
}
|
|
78
|
+
export interface NativeSettlementInvoice extends SettlementInvoiceBase {
|
|
79
|
+
transaction: {
|
|
80
|
+
kind: "evm_contract_call";
|
|
81
|
+
function: "payNative(bytes32,address,uint256,address,uint256,string)";
|
|
82
|
+
args: {
|
|
83
|
+
paymentId: Hex;
|
|
84
|
+
merchant: Address;
|
|
85
|
+
grossAmount: string;
|
|
86
|
+
ipCreator: Address;
|
|
87
|
+
validUntil: number;
|
|
88
|
+
orderId: string;
|
|
89
|
+
};
|
|
90
|
+
value: string;
|
|
91
|
+
};
|
|
92
|
+
token?: never;
|
|
93
|
+
}
|
|
94
|
+
export interface StableSettlementInvoice extends SettlementInvoiceBase {
|
|
95
|
+
token: {
|
|
96
|
+
address: Address;
|
|
97
|
+
decimals: number;
|
|
98
|
+
issuer: string;
|
|
99
|
+
};
|
|
100
|
+
transaction: {
|
|
101
|
+
kind: "evm_erc20_then_contract_call";
|
|
102
|
+
approve: {
|
|
103
|
+
token: Address;
|
|
104
|
+
function: "approve(address,uint256)";
|
|
105
|
+
spender: Address;
|
|
106
|
+
amount: string;
|
|
107
|
+
};
|
|
108
|
+
settle: {
|
|
109
|
+
function: "payStable(bytes32,address,uint256,address,address,uint256,string)";
|
|
110
|
+
args: {
|
|
111
|
+
paymentId: Hex;
|
|
112
|
+
token: Address;
|
|
113
|
+
grossAmount: string;
|
|
114
|
+
merchant: Address;
|
|
115
|
+
ipCreator: Address;
|
|
116
|
+
validUntil: number;
|
|
117
|
+
orderId: string;
|
|
118
|
+
};
|
|
119
|
+
value: "0";
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export type SettlementInvoice = NativeSettlementInvoice | StableSettlementInvoice;
|
|
124
|
+
export interface SettlementExecution {
|
|
125
|
+
route_class: SettlementRouteClass;
|
|
126
|
+
chain: SettlementEvmNetwork;
|
|
127
|
+
payment_id: Hex;
|
|
128
|
+
approval_txs: Hex[];
|
|
129
|
+
settlement_tx: Hex;
|
|
130
|
+
block_number: bigint;
|
|
131
|
+
}
|
|
132
|
+
export declare class SettlementProtocolError extends Error {
|
|
133
|
+
readonly code: string;
|
|
134
|
+
constructor(message: string, code?: string);
|
|
135
|
+
}
|
|
136
|
+
/** Strictly validate an invoice before any wallet signs. */
|
|
137
|
+
export declare function validateSettlementInvoice(invoice: SettlementInvoice): void;
|
|
138
|
+
/** Verify that a backend invoice matches an independently trusted release pin. */
|
|
139
|
+
export declare function validateTrustedSettlementRoutePin(invoice: SettlementInvoice, pin: TrustedSettlementRoutePin): void;
|
|
140
|
+
export declare class SettlementClient {
|
|
141
|
+
readonly baseUrl: string;
|
|
142
|
+
constructor(baseUrl?: string);
|
|
143
|
+
routes(routeClass?: SettlementRouteClass): Promise<SettlementRoute[]>;
|
|
144
|
+
invoice(input: SettlementInvoiceInput): Promise<SettlementInvoice>;
|
|
145
|
+
}
|
|
146
|
+
/** Verify trusted deployment evidence against chain immediately before signing. */
|
|
147
|
+
export declare function verifySettlementRouteOnChain(invoice: SettlementInvoice, publicClient: PublicClient, trustedPin: TrustedSettlementRoutePin): Promise<void>;
|
|
148
|
+
/** Execute a v1.3 invoice only after matching an independent trusted route pin. */
|
|
149
|
+
export declare function executeSettlementInvoice(invoice: SettlementInvoice, walletClient: WalletClient, publicClient: PublicClient, trustedPin: TrustedSettlementRoutePin): Promise<SettlementExecution>;
|
|
150
|
+
export declare const SETTLEMENT_CHAIN_IDS: Readonly<{
|
|
151
|
+
polygon: number;
|
|
152
|
+
base: number;
|
|
153
|
+
arbitrum: number;
|
|
154
|
+
optimism: number;
|
|
155
|
+
avalanche: number;
|
|
156
|
+
unichain: number;
|
|
157
|
+
botchain: number;
|
|
158
|
+
xrplevm: number;
|
|
159
|
+
bnb: number;
|
|
160
|
+
}>;
|
|
161
|
+
export declare const SETTLEMENT_EXPECTED_BPS: Readonly<{
|
|
162
|
+
"AIFP-1": {
|
|
163
|
+
treasury: number;
|
|
164
|
+
creator: number;
|
|
165
|
+
};
|
|
166
|
+
"AIFP-2": {
|
|
167
|
+
treasury: number;
|
|
168
|
+
creator: number;
|
|
169
|
+
};
|
|
170
|
+
}>;
|
|
171
|
+
export {};
|
|
172
|
+
//# sourceMappingURL=settlement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settlement.d.ts","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { keccak256, } from "viem";
|
|
2
|
+
export class SettlementProtocolError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(message, code = "settlement_protocol_error") {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "SettlementProtocolError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const CHAIN_IDS = {
|
|
11
|
+
polygon: 137,
|
|
12
|
+
avalanche: 43114,
|
|
13
|
+
arbitrum: 42161,
|
|
14
|
+
bnb: 56,
|
|
15
|
+
base: 8453,
|
|
16
|
+
unichain: 130,
|
|
17
|
+
optimism: 10,
|
|
18
|
+
botchain: 677,
|
|
19
|
+
xrplevm: 1440000,
|
|
20
|
+
};
|
|
21
|
+
const EXPECTED_BPS = {
|
|
22
|
+
"AIFP-1": { treasury: 100, creator: 0 },
|
|
23
|
+
"AIFP-2": { treasury: 0, creator: 0 },
|
|
24
|
+
};
|
|
25
|
+
const ZERO = "0x0000000000000000000000000000000000000000";
|
|
26
|
+
const ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
|
|
27
|
+
const HASH_RE = /^0x[0-9a-fA-F]{64}$/;
|
|
28
|
+
const lc = (value) => value.toLowerCase();
|
|
29
|
+
const PROFILE_ABI = [
|
|
30
|
+
{ type: "function", name: "treasuryBps", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
|
|
31
|
+
{ type: "function", name: "ipCreatorBps", stateMutability: "view", inputs: [], outputs: [{ type: "uint256" }] },
|
|
32
|
+
];
|
|
33
|
+
const V13_ABI = [
|
|
34
|
+
{
|
|
35
|
+
type: "function", name: "payNative", stateMutability: "payable",
|
|
36
|
+
inputs: [
|
|
37
|
+
{ type: "bytes32", name: "paymentId" },
|
|
38
|
+
{ type: "address", name: "merchant" },
|
|
39
|
+
{ type: "uint256", name: "grossAmount" },
|
|
40
|
+
{ type: "address", name: "ipCreator" },
|
|
41
|
+
{ type: "uint256", name: "validUntil" },
|
|
42
|
+
{ type: "string", name: "orderId" },
|
|
43
|
+
], outputs: [],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "function", name: "payStable", stateMutability: "nonpayable",
|
|
47
|
+
inputs: [
|
|
48
|
+
{ type: "bytes32", name: "paymentId" },
|
|
49
|
+
{ type: "address", name: "token" },
|
|
50
|
+
{ type: "uint256", name: "grossAmount" },
|
|
51
|
+
{ type: "address", name: "merchant" },
|
|
52
|
+
{ type: "address", name: "ipCreator" },
|
|
53
|
+
{ type: "uint256", name: "validUntil" },
|
|
54
|
+
{ type: "string", name: "orderId" },
|
|
55
|
+
], outputs: [],
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
const ERC20_ABI = [
|
|
59
|
+
{ type: "function", name: "allowance", stateMutability: "view", inputs: [{ type: "address", name: "owner" }, { type: "address", name: "spender" }], outputs: [{ type: "uint256" }] },
|
|
60
|
+
{ type: "function", name: "approve", stateMutability: "nonpayable", inputs: [{ type: "address", name: "spender" }, { type: "uint256", name: "amount" }], outputs: [{ type: "bool" }] },
|
|
61
|
+
];
|
|
62
|
+
function asJsonRecord(value) {
|
|
63
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
64
|
+
throw new SettlementProtocolError("settlement API returned a non-object JSON document");
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
async function responseJson(response) {
|
|
69
|
+
let json;
|
|
70
|
+
try {
|
|
71
|
+
json = await response.json();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new SettlementProtocolError(`settlement API ${response.status}: non-JSON response`);
|
|
75
|
+
}
|
|
76
|
+
const rec = asJsonRecord(json);
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
const detail = typeof rec.detail === "string" ? rec.detail
|
|
79
|
+
: typeof rec.reason === "string" ? rec.reason
|
|
80
|
+
: typeof rec.error === "string" ? rec.error
|
|
81
|
+
: `HTTP ${response.status}`;
|
|
82
|
+
throw new SettlementProtocolError(detail, typeof rec.error === "string" ? rec.error : "settlement_http_error");
|
|
83
|
+
}
|
|
84
|
+
return rec;
|
|
85
|
+
}
|
|
86
|
+
function expectedBreakdown(route, gross) {
|
|
87
|
+
const bps = EXPECTED_BPS[route];
|
|
88
|
+
const treasury = gross * BigInt(bps.treasury) / 10000n;
|
|
89
|
+
const creator = gross * BigInt(bps.creator) / 10000n;
|
|
90
|
+
if (bps.treasury > 0 && treasury === 0n) {
|
|
91
|
+
throw new SettlementProtocolError("AIFP-1 gross amount is too small for the 1% protocol fee", "amount_too_small");
|
|
92
|
+
}
|
|
93
|
+
const merchant = gross - treasury - creator;
|
|
94
|
+
if (merchant <= 0n) {
|
|
95
|
+
throw new SettlementProtocolError("settlement leaves no merchant amount", "amount_too_small");
|
|
96
|
+
}
|
|
97
|
+
return { gross, merchant, treasury, creator };
|
|
98
|
+
}
|
|
99
|
+
function isStableInvoice(invoice) {
|
|
100
|
+
return invoice.transaction.kind === "evm_erc20_then_contract_call"
|
|
101
|
+
&& "token" in invoice
|
|
102
|
+
&& invoice.token !== undefined;
|
|
103
|
+
}
|
|
104
|
+
function assertCommonCallBinding(invoice, args) {
|
|
105
|
+
if (lc(args.paymentId) !== lc(invoice.payment_id)) {
|
|
106
|
+
throw new SettlementProtocolError("transaction paymentId does not match invoice", "calldata_mismatch");
|
|
107
|
+
}
|
|
108
|
+
if (lc(args.merchant) !== lc(invoice.merchant_wallet)) {
|
|
109
|
+
throw new SettlementProtocolError("transaction merchant does not match invoice", "calldata_mismatch");
|
|
110
|
+
}
|
|
111
|
+
if (lc(args.ipCreator) !== ZERO) {
|
|
112
|
+
throw new SettlementProtocolError("production creator address must be zero", "calldata_mismatch");
|
|
113
|
+
}
|
|
114
|
+
if (args.validUntil !== invoice.valid_until) {
|
|
115
|
+
throw new SettlementProtocolError("transaction validUntil does not match invoice", "calldata_mismatch");
|
|
116
|
+
}
|
|
117
|
+
if (args.orderId !== invoice.order_id) {
|
|
118
|
+
throw new SettlementProtocolError("transaction orderId does not match invoice", "calldata_mismatch");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Strictly validate an invoice before any wallet signs. */
|
|
122
|
+
export function validateSettlementInvoice(invoice) {
|
|
123
|
+
if (!(invoice.route_class in EXPECTED_BPS))
|
|
124
|
+
throw new SettlementProtocolError("unknown route_class");
|
|
125
|
+
if (!(invoice.chain in CHAIN_IDS))
|
|
126
|
+
throw new SettlementProtocolError("unknown EVM settlement chain");
|
|
127
|
+
if (invoice.chain_id !== CHAIN_IDS[invoice.chain])
|
|
128
|
+
throw new SettlementProtocolError("chain_id does not match chain");
|
|
129
|
+
if (invoice.splitter_version !== "1.3")
|
|
130
|
+
throw new SettlementProtocolError("only B2BSplitter v1.3 is signable");
|
|
131
|
+
if (!ADDRESS_RE.test(invoice.splitter) || lc(invoice.splitter) === ZERO)
|
|
132
|
+
throw new SettlementProtocolError("invalid splitter address");
|
|
133
|
+
if (!HASH_RE.test(invoice.runtime_code_hash))
|
|
134
|
+
throw new SettlementProtocolError("invalid runtime_code_hash");
|
|
135
|
+
if (!ADDRESS_RE.test(invoice.merchant_wallet) || lc(invoice.merchant_wallet) === ZERO)
|
|
136
|
+
throw new SettlementProtocolError("invalid merchant_wallet");
|
|
137
|
+
if (!HASH_RE.test(invoice.payment_id))
|
|
138
|
+
throw new SettlementProtocolError("invalid payment_id");
|
|
139
|
+
if (invoice.fee_on_top !== false || invoice.settlement_semantics !== "gross-inclusive") {
|
|
140
|
+
throw new SettlementProtocolError("fee-on-top or non-gross settlement is not supported");
|
|
141
|
+
}
|
|
142
|
+
const now = Math.floor(Date.now() / 1000);
|
|
143
|
+
if (!Number.isInteger(invoice.valid_until) || invoice.valid_until <= now) {
|
|
144
|
+
throw new SettlementProtocolError("invoice is expired or has invalid valid_until", "invoice_expired");
|
|
145
|
+
}
|
|
146
|
+
if (invoice.valid_until > now + 20 * 60 + 5) {
|
|
147
|
+
throw new SettlementProtocolError("invoice lifetime exceeds the 20-minute safety bound");
|
|
148
|
+
}
|
|
149
|
+
const gross = BigInt(invoice.breakdown.gross_amount);
|
|
150
|
+
const expected = expectedBreakdown(invoice.route_class, gross);
|
|
151
|
+
const bps = EXPECTED_BPS[invoice.route_class];
|
|
152
|
+
if (invoice.breakdown.protocol_fee_bps !== bps.treasury || invoice.breakdown.creator_bps !== bps.creator) {
|
|
153
|
+
throw new SettlementProtocolError("invoice bps do not match the canonical route profile");
|
|
154
|
+
}
|
|
155
|
+
if (BigInt(invoice.breakdown.merchant_amount) !== expected.merchant
|
|
156
|
+
|| BigInt(invoice.breakdown.protocol_fee_amount) !== expected.treasury
|
|
157
|
+
|| BigInt(invoice.breakdown.creator_amount) !== expected.creator) {
|
|
158
|
+
throw new SettlementProtocolError("invoice breakdown does not match canonical gross split");
|
|
159
|
+
}
|
|
160
|
+
if (isStableInvoice(invoice)) {
|
|
161
|
+
if (!ADDRESS_RE.test(invoice.token.address) || lc(invoice.token.address) === ZERO) {
|
|
162
|
+
throw new SettlementProtocolError("invalid stable token address");
|
|
163
|
+
}
|
|
164
|
+
if (lc(invoice.transaction.approve.token) !== lc(invoice.token.address)
|
|
165
|
+
|| lc(invoice.transaction.approve.spender) !== lc(invoice.splitter)
|
|
166
|
+
|| BigInt(invoice.transaction.approve.amount) !== gross) {
|
|
167
|
+
throw new SettlementProtocolError("stable approval does not match invoice");
|
|
168
|
+
}
|
|
169
|
+
if (invoice.transaction.settle.function !== "payStable(bytes32,address,uint256,address,address,uint256,string)") {
|
|
170
|
+
throw new SettlementProtocolError("unexpected stable v1.3 function signature");
|
|
171
|
+
}
|
|
172
|
+
if (lc(invoice.transaction.settle.args.token) !== lc(invoice.token.address)
|
|
173
|
+
|| BigInt(invoice.transaction.settle.args.grossAmount) !== gross
|
|
174
|
+
|| invoice.transaction.settle.value !== "0") {
|
|
175
|
+
throw new SettlementProtocolError("stable settlement token/gross/value mismatch");
|
|
176
|
+
}
|
|
177
|
+
assertCommonCallBinding(invoice, invoice.transaction.settle.args);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (invoice.transaction.function !== "payNative(bytes32,address,uint256,address,uint256,string)") {
|
|
181
|
+
throw new SettlementProtocolError("unexpected native v1.3 function signature");
|
|
182
|
+
}
|
|
183
|
+
if (BigInt(invoice.transaction.value) !== gross || BigInt(invoice.transaction.args.grossAmount) !== gross) {
|
|
184
|
+
throw new SettlementProtocolError("native tx value/gross amount mismatch");
|
|
185
|
+
}
|
|
186
|
+
assertCommonCallBinding(invoice, invoice.transaction.args);
|
|
187
|
+
}
|
|
188
|
+
/** Verify that a backend invoice matches an independently trusted release pin. */
|
|
189
|
+
export function validateTrustedSettlementRoutePin(invoice, pin) {
|
|
190
|
+
validateSettlementInvoice(invoice);
|
|
191
|
+
if (!(pin.chain in CHAIN_IDS) || pin.chain_id !== CHAIN_IDS[pin.chain]) {
|
|
192
|
+
throw new SettlementProtocolError("trusted route pin has an invalid chain binding", "trusted_pin_invalid");
|
|
193
|
+
}
|
|
194
|
+
if (pin.splitter_version !== "1.3") {
|
|
195
|
+
throw new SettlementProtocolError("trusted route pin is not v1.3", "trusted_pin_invalid");
|
|
196
|
+
}
|
|
197
|
+
if (!ADDRESS_RE.test(pin.splitter) || lc(pin.splitter) === ZERO || !HASH_RE.test(pin.runtime_code_hash)) {
|
|
198
|
+
throw new SettlementProtocolError("trusted route pin has invalid address/hash", "trusted_pin_invalid");
|
|
199
|
+
}
|
|
200
|
+
if (pin.route_class !== invoice.route_class
|
|
201
|
+
|| pin.chain !== invoice.chain
|
|
202
|
+
|| pin.chain_id !== invoice.chain_id
|
|
203
|
+
|| pin.splitter_version !== invoice.splitter_version
|
|
204
|
+
|| lc(pin.splitter) !== lc(invoice.splitter)
|
|
205
|
+
|| lc(pin.runtime_code_hash) !== lc(invoice.runtime_code_hash)) {
|
|
206
|
+
throw new SettlementProtocolError("backend invoice route does not match the independently trusted deployment pin", "trusted_pin_mismatch");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export class SettlementClient {
|
|
210
|
+
baseUrl;
|
|
211
|
+
constructor(baseUrl = "https://aifinpay.io") {
|
|
212
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
213
|
+
}
|
|
214
|
+
async routes(routeClass) {
|
|
215
|
+
const q = routeClass ? `?route_class=${encodeURIComponent(routeClass)}` : "";
|
|
216
|
+
const rec = await responseJson(await fetch(`${this.baseUrl}/v1/settlement/routes${q}`));
|
|
217
|
+
if (!Array.isArray(rec.routes)) {
|
|
218
|
+
throw new SettlementProtocolError("routes response has no routes array");
|
|
219
|
+
}
|
|
220
|
+
return rec.routes;
|
|
221
|
+
}
|
|
222
|
+
async invoice(input) {
|
|
223
|
+
const rec = await responseJson(await fetch(`${this.baseUrl}/v1/settlement/invoice`, {
|
|
224
|
+
method: "POST",
|
|
225
|
+
headers: { "content-type": "application/json" },
|
|
226
|
+
body: JSON.stringify({ ...input, gross_amount: String(input.gross_amount) }),
|
|
227
|
+
}));
|
|
228
|
+
const invoice = rec;
|
|
229
|
+
validateSettlementInvoice(invoice);
|
|
230
|
+
return invoice;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Verify trusted deployment evidence against chain immediately before signing. */
|
|
234
|
+
export async function verifySettlementRouteOnChain(invoice, publicClient, trustedPin) {
|
|
235
|
+
validateTrustedSettlementRoutePin(invoice, trustedPin);
|
|
236
|
+
const actualChainId = await publicClient.getChainId();
|
|
237
|
+
if (actualChainId !== trustedPin.chain_id) {
|
|
238
|
+
throw new SettlementProtocolError(`connected RPC chainId ${actualChainId} != trusted pin ${trustedPin.chain_id}`, "wrong_chain");
|
|
239
|
+
}
|
|
240
|
+
const code = await publicClient.getBytecode({ address: trustedPin.splitter });
|
|
241
|
+
if (!code || code === "0x") {
|
|
242
|
+
throw new SettlementProtocolError("trusted splitter has no runtime bytecode", "route_not_deployed");
|
|
243
|
+
}
|
|
244
|
+
if (lc(keccak256(code)) !== lc(trustedPin.runtime_code_hash)) {
|
|
245
|
+
throw new SettlementProtocolError("trusted splitter runtime bytecode hash mismatch", "runtime_hash_mismatch");
|
|
246
|
+
}
|
|
247
|
+
const [treasuryBps, creatorBps] = await Promise.all([
|
|
248
|
+
publicClient.readContract({ address: trustedPin.splitter, abi: PROFILE_ABI, functionName: "treasuryBps" }),
|
|
249
|
+
publicClient.readContract({ address: trustedPin.splitter, abi: PROFILE_ABI, functionName: "ipCreatorBps" }),
|
|
250
|
+
]);
|
|
251
|
+
const expected = EXPECTED_BPS[trustedPin.route_class];
|
|
252
|
+
if (Number(treasuryBps) !== expected.treasury || Number(creatorBps) !== expected.creator) {
|
|
253
|
+
throw new SettlementProtocolError("on-chain route economics do not match trusted route class", "profile_mismatch");
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function waitSuccess(publicClient, hash) {
|
|
257
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
258
|
+
if (receipt.status !== "success") {
|
|
259
|
+
throw new SettlementProtocolError(`transaction ${hash} reverted`, "transaction_reverted");
|
|
260
|
+
}
|
|
261
|
+
return receipt.blockNumber;
|
|
262
|
+
}
|
|
263
|
+
/** Execute a v1.3 invoice only after matching an independent trusted route pin. */
|
|
264
|
+
export async function executeSettlementInvoice(invoice, walletClient, publicClient, trustedPin) {
|
|
265
|
+
await verifySettlementRouteOnChain(invoice, publicClient, trustedPin);
|
|
266
|
+
const account = walletClient.account;
|
|
267
|
+
if (!account) {
|
|
268
|
+
throw new SettlementProtocolError("walletClient has no signing account", "signer_missing");
|
|
269
|
+
}
|
|
270
|
+
const walletChainId = walletClient.chain?.id;
|
|
271
|
+
if (walletChainId != null && walletChainId !== trustedPin.chain_id) {
|
|
272
|
+
throw new SettlementProtocolError(`wallet chainId ${walletChainId} != trusted pin ${trustedPin.chain_id}`, "wrong_chain");
|
|
273
|
+
}
|
|
274
|
+
const approvalTxs = [];
|
|
275
|
+
let settlementTx;
|
|
276
|
+
if (isStableInvoice(invoice)) {
|
|
277
|
+
const gross = BigInt(invoice.transaction.approve.amount);
|
|
278
|
+
const allowance = await publicClient.readContract({
|
|
279
|
+
address: invoice.token.address,
|
|
280
|
+
abi: ERC20_ABI,
|
|
281
|
+
functionName: "allowance",
|
|
282
|
+
args: [account.address, trustedPin.splitter],
|
|
283
|
+
});
|
|
284
|
+
if (allowance < gross) {
|
|
285
|
+
if (allowance > 0n) {
|
|
286
|
+
const reset = await walletClient.writeContract({
|
|
287
|
+
address: invoice.token.address,
|
|
288
|
+
abi: ERC20_ABI,
|
|
289
|
+
functionName: "approve",
|
|
290
|
+
args: [trustedPin.splitter, 0n],
|
|
291
|
+
account,
|
|
292
|
+
chain: walletClient.chain,
|
|
293
|
+
});
|
|
294
|
+
approvalTxs.push(reset);
|
|
295
|
+
await waitSuccess(publicClient, reset);
|
|
296
|
+
}
|
|
297
|
+
const approve = await walletClient.writeContract({
|
|
298
|
+
address: invoice.token.address,
|
|
299
|
+
abi: ERC20_ABI,
|
|
300
|
+
functionName: "approve",
|
|
301
|
+
args: [trustedPin.splitter, gross],
|
|
302
|
+
account,
|
|
303
|
+
chain: walletClient.chain,
|
|
304
|
+
});
|
|
305
|
+
approvalTxs.push(approve);
|
|
306
|
+
await waitSuccess(publicClient, approve);
|
|
307
|
+
}
|
|
308
|
+
settlementTx = await walletClient.writeContract({
|
|
309
|
+
address: trustedPin.splitter,
|
|
310
|
+
abi: V13_ABI,
|
|
311
|
+
functionName: "payStable",
|
|
312
|
+
args: [
|
|
313
|
+
invoice.transaction.settle.args.paymentId,
|
|
314
|
+
invoice.transaction.settle.args.token,
|
|
315
|
+
BigInt(invoice.transaction.settle.args.grossAmount),
|
|
316
|
+
invoice.transaction.settle.args.merchant,
|
|
317
|
+
invoice.transaction.settle.args.ipCreator,
|
|
318
|
+
BigInt(invoice.transaction.settle.args.validUntil),
|
|
319
|
+
invoice.transaction.settle.args.orderId,
|
|
320
|
+
],
|
|
321
|
+
account,
|
|
322
|
+
chain: walletClient.chain,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
settlementTx = await walletClient.writeContract({
|
|
327
|
+
address: trustedPin.splitter,
|
|
328
|
+
abi: V13_ABI,
|
|
329
|
+
functionName: "payNative",
|
|
330
|
+
args: [
|
|
331
|
+
invoice.transaction.args.paymentId,
|
|
332
|
+
invoice.transaction.args.merchant,
|
|
333
|
+
BigInt(invoice.transaction.args.grossAmount),
|
|
334
|
+
invoice.transaction.args.ipCreator,
|
|
335
|
+
BigInt(invoice.transaction.args.validUntil),
|
|
336
|
+
invoice.transaction.args.orderId,
|
|
337
|
+
],
|
|
338
|
+
value: BigInt(invoice.transaction.value),
|
|
339
|
+
account,
|
|
340
|
+
chain: walletClient.chain,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
const blockNumber = await waitSuccess(publicClient, settlementTx);
|
|
344
|
+
return {
|
|
345
|
+
route_class: invoice.route_class,
|
|
346
|
+
chain: invoice.chain,
|
|
347
|
+
payment_id: invoice.payment_id,
|
|
348
|
+
approval_txs: approvalTxs,
|
|
349
|
+
settlement_tx: settlementTx,
|
|
350
|
+
block_number: blockNumber,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
export const SETTLEMENT_CHAIN_IDS = Object.freeze({ ...CHAIN_IDS });
|
|
354
|
+
export const SETTLEMENT_EXPECTED_BPS = Object.freeze({ ...EXPECTED_BPS });
|
|
355
|
+
//# sourceMappingURL=settlement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settlement.js","sourceRoot":"","sources":["../src/settlement.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAKV,MAAM,MAAM,CAAC;AAyId,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACH;IAA7C,YAAY,OAAe,EAAkB,OAAO,2BAA2B;QAC7E,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAA8B;QAE7E,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,SAAS,GAAyC;IACtD,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,MAAM,YAAY,GAAwE;IACxF,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE;IACvC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;CACtC,CAAC;AAEF,MAAM,IAAI,GAAG,4CAAuD,CAAC;AACrE,MAAM,UAAU,GAAG,qBAAqB,CAAC;AACzC,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAElD,MAAM,WAAW,GAAG;IAClB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;IAC9G,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;CACvG,CAAC;AAEX,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS;QAC/D,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;YACrC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;YACxC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;YACvC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC,EAAE,OAAO,EAAE,EAAE;KACf;IACD;QACE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY;QAClE,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;YAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;YACxC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;YACrC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;YACtC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE;YACvC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC,EAAE,OAAO,EAAE,EAAE;KACf;CACO,CAAC;AAEX,MAAM,SAAS,GAAG;IAChB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;IACpL,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;CAC9K,CAAC;AAEX,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,uBAAuB,CAAC,oDAAoD,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAkB;IAC5C,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,uBAAuB,CAAC,kBAAkB,QAAQ,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;YACxD,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;gBAC7C,CAAC,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK;oBAC3C,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,uBAAuB,CAC/B,MAAM,EACN,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA2B,EAAE,KAAa;IACnE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,MAAO,CAAC;IACxD,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,MAAO,CAAC;IACtD,IAAI,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,uBAAuB,CAC/B,0DAA0D,EAC1D,kBAAkB,CACnB,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5C,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,uBAAuB,CAAC,sCAAsC,EAAE,kBAAkB,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CAAC,OAA0B;IACjD,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,8BAA8B;WAC7D,OAAO,IAAI,OAAO;WAClB,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAA0B,EAC1B,IAAoG;IAEpG,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,uBAAuB,CAAC,8CAA8C,EAAE,mBAAmB,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,uBAAuB,CAAC,6CAA6C,EAAE,mBAAmB,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,uBAAuB,CAAC,yCAAyC,EAAE,mBAAmB,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,IAAI,uBAAuB,CAAC,+CAA+C,EAAE,mBAAmB,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,uBAAuB,CAAC,4CAA4C,EAAE,mBAAmB,CAAC,CAAC;IACvG,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,yBAAyB,CAAC,OAA0B;IAClE,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;IACrG,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,8BAA8B,CAAC,CAAC;IACrG,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,+BAA+B,CAAC,CAAC;IACtH,IAAI,OAAO,CAAC,gBAAgB,KAAK,KAAK;QAAE,MAAM,IAAI,uBAAuB,CAAC,mCAAmC,CAAC,CAAC;IAC/G,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,uBAAuB,CAAC,0BAA0B,CAAC,CAAC;IACvI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,2BAA2B,CAAC,CAAC;IAC7G,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,uBAAuB,CAAC,yBAAyB,CAAC,CAAC;IACpJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IAC/F,IAAI,OAAO,CAAC,UAAU,KAAK,KAAK,IAAI,OAAO,CAAC,oBAAoB,KAAK,iBAAiB,EAAE,CAAC;QACvF,MAAM,IAAI,uBAAuB,CAAC,qDAAqD,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;QACzE,MAAM,IAAI,uBAAuB,CAAC,+CAA+C,EAAE,iBAAiB,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,uBAAuB,CAAC,qDAAqD,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,SAAS,CAAC,gBAAgB,KAAK,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,WAAW,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;QACzG,MAAM,IAAI,uBAAuB,CAAC,sDAAsD,CAAC,CAAC;IAC5F,CAAC;IACD,IACE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,QAAQ;WAC5D,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,KAAK,QAAQ,CAAC,QAAQ;WACnE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,OAAO,EAChE,CAAC;QACD,MAAM,IAAI,uBAAuB,CAAC,wDAAwD,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAClF,MAAM,IAAI,uBAAuB,CAAC,8BAA8B,CAAC,CAAC;QACpE,CAAC;QACD,IACE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;eAChE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;eAChE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,EACvD,CAAC;YACD,MAAM,IAAI,uBAAuB,CAAC,wCAAwC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,KAAK,mEAAmE,EAAE,CAAC;YAChH,MAAM,IAAI,uBAAuB,CAAC,2CAA2C,CAAC,CAAC;QACjF,CAAC;QACD,IACE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;eACpE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK;eAC7D,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,EAC3C,CAAC;YACD,MAAM,IAAI,uBAAuB,CAAC,8CAA8C,CAAC,CAAC;QACpF,CAAC;QACD,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,QAAQ,KAAK,2DAA2D,EAAE,CAAC;QACjG,MAAM,IAAI,uBAAuB,CAAC,2CAA2C,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC;QAC1G,MAAM,IAAI,uBAAuB,CAAC,uCAAuC,CAAC,CAAC;IAC7E,CAAC;IACD,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iCAAiC,CAC/C,OAA0B,EAC1B,GAA8B;IAE9B,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,uBAAuB,CAAC,gDAAgD,EAAE,qBAAqB,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,GAAG,CAAC,gBAAgB,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,IAAI,uBAAuB,CAAC,+BAA+B,EAAE,qBAAqB,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACxG,MAAM,IAAI,uBAAuB,CAAC,4CAA4C,EAAE,qBAAqB,CAAC,CAAC;IACzG,CAAC;IACD,IACE,GAAG,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW;WACpC,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;WAC3B,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;WACjC,GAAG,CAAC,gBAAgB,KAAK,OAAO,CAAC,gBAAgB;WACjD,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;WACzC,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAC9D,CAAC;QACD,MAAM,IAAI,uBAAuB,CAC/B,+EAA+E,EAC/E,sBAAsB,CACvB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,gBAAgB;IAClB,OAAO,CAAS;IAEzB,YAAY,OAAO,GAAG,qBAAqB;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAiC;QAC5C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,uBAAuB,CAAC,qCAAqC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,GAAG,CAAC,MAAsC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAA6B;QACzC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,wBAAwB,EAAE;YAClF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;SAC7E,CAAC,CAAC,CAAC;QACJ,MAAM,OAAO,GAAG,GAAmC,CAAC;QACpD,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAA0B,EAC1B,YAA0B,EAC1B,UAAqC;IAErC,iCAAiC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;IACtD,IAAI,aAAa,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,uBAAuB,CAC/B,yBAAyB,aAAa,mBAAmB,UAAU,CAAC,QAAQ,EAAE,EAC9E,aAAa,CACd,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,uBAAuB,CAAC,0CAA0C,EAAE,oBAAoB,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,uBAAuB,CAAC,iDAAiD,EAAE,uBAAuB,CAAC,CAAC;IAChH,CAAC;IACD,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,YAAY,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QAC1G,YAAY,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;KAC5G,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzF,MAAM,IAAI,uBAAuB,CAAC,2DAA2D,EAAE,kBAAkB,CAAC,CAAC;IACrH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,YAA0B,EAAE,IAAS;IAC9D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,uBAAuB,CAAC,eAAe,IAAI,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAA0B,EAC1B,YAA0B,EAC1B,YAA0B,EAC1B,UAAqC;IAErC,MAAM,4BAA4B,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,uBAAuB,CAAC,qCAAqC,EAAE,gBAAgB,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7C,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;QACnE,MAAM,IAAI,uBAAuB,CAC/B,kBAAkB,aAAa,mBAAmB,UAAU,CAAC,QAAQ,EAAE,EACvE,aAAa,CACd,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAU,EAAE,CAAC;IAC9B,IAAI,YAAiB,CAAC;IAEtB,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;YAChD,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;YAC9B,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;YACtB,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC;oBAC7C,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;oBAC9B,GAAG,EAAE,SAAS;oBACd,YAAY,EAAE,SAAS;oBACvB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;oBAC/B,OAAO;oBACP,KAAK,EAAE,YAAY,CAAC,KAAK;iBAC1B,CAAC,CAAC;gBACH,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,MAAM,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC;gBAC/C,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO;gBAC9B,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,SAAS;gBACvB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAClC,OAAO;gBACP,KAAK,EAAE,YAAY,CAAC,KAAK;aAC1B,CAAC,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,MAAM,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,YAAY,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC;YAC9C,OAAO,EAAE,UAAU,CAAC,QAAQ;YAC5B,GAAG,EAAE,OAAO;YACZ,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE;gBACJ,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;gBACzC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;gBACrC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBACnD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ;gBACxC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;gBACzC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;gBAClD,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;aACxC;YACD,OAAO;YACP,KAAK,EAAE,YAAY,CAAC,KAAK;SAC1B,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC;YAC9C,OAAO,EAAE,UAAU,CAAC,QAAQ;YAC5B,GAAG,EAAE,OAAO;YACZ,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE;gBACJ,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS;gBAClC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ;gBACjC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC5C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS;gBAClC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC3C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO;aACjC;YACD,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;YACxC,OAAO;YACP,KAAK,EAAE,YAAY,CAAC,KAAK;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAClE,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC"}
|