@t402/wdk 2.4.0 → 2.6.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.
Files changed (61) hide show
  1. package/dist/cjs/adapters/index.d.ts +198 -1
  2. package/dist/cjs/adapters/index.js +255 -0
  3. package/dist/cjs/adapters/index.js.map +1 -1
  4. package/dist/cjs/adapters/svm-adapter.d.ts +146 -2
  5. package/dist/cjs/adapters/svm-adapter.js +255 -2
  6. package/dist/cjs/adapters/svm-adapter.js.map +1 -1
  7. package/dist/cjs/adapters/ton-adapter.d.ts +57 -2
  8. package/dist/cjs/adapters/ton-adapter.js +75 -2
  9. package/dist/cjs/adapters/ton-adapter.js.map +1 -1
  10. package/dist/cjs/adapters/tron-adapter.d.ts +57 -2
  11. package/dist/cjs/adapters/tron-adapter.js +101 -0
  12. package/dist/cjs/adapters/tron-adapter.js.map +1 -1
  13. package/dist/cjs/index-DnEI5M6d.d.ts +1798 -0
  14. package/dist/cjs/index.d.ts +702 -1118
  15. package/dist/cjs/index.js +3905 -246
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/integrations/index.d.ts +9 -0
  18. package/dist/cjs/integrations/index.js +249 -0
  19. package/dist/cjs/integrations/index.js.map +1 -0
  20. package/dist/cjs/testing/index.d.ts +62 -0
  21. package/dist/cjs/testing/index.js +129 -0
  22. package/dist/cjs/testing/index.js.map +1 -0
  23. package/dist/cjs/types-BwK8Xgvg.d.ts +967 -0
  24. package/dist/esm/adapters/index.d.mts +198 -1
  25. package/dist/esm/adapters/index.mjs +14 -3
  26. package/dist/esm/adapters/svm-adapter.d.mts +146 -2
  27. package/dist/esm/adapters/svm-adapter.mjs +18 -3
  28. package/dist/esm/adapters/ton-adapter.d.mts +57 -2
  29. package/dist/esm/adapters/ton-adapter.mjs +8 -3
  30. package/dist/esm/adapters/tron-adapter.d.mts +57 -2
  31. package/dist/esm/adapters/tron-adapter.mjs +2 -1
  32. package/dist/esm/chunk-2KWVW77U.mjs +353 -0
  33. package/dist/esm/chunk-2KWVW77U.mjs.map +1 -0
  34. package/dist/esm/chunk-7CG77QAN.mjs +153 -0
  35. package/dist/esm/chunk-7CG77QAN.mjs.map +1 -0
  36. package/dist/esm/chunk-BJTO5JO5.mjs +11 -0
  37. package/dist/esm/chunk-BJTO5JO5.mjs.map +1 -0
  38. package/dist/esm/{chunk-YWBJJV5M.mjs → chunk-KWX6CJIH.mjs} +72 -1
  39. package/dist/esm/chunk-KWX6CJIH.mjs.map +1 -0
  40. package/dist/esm/{chunk-HB2DGKQ3.mjs → chunk-QZKUU2O6.mjs} +102 -1
  41. package/dist/esm/chunk-QZKUU2O6.mjs.map +1 -0
  42. package/dist/esm/chunk-TVSNUSFZ.mjs +219 -0
  43. package/dist/esm/chunk-TVSNUSFZ.mjs.map +1 -0
  44. package/dist/esm/index-D5kvtDfm.d.mts +1798 -0
  45. package/dist/esm/index.d.mts +702 -1118
  46. package/dist/esm/index.mjs +2934 -70
  47. package/dist/esm/index.mjs.map +1 -1
  48. package/dist/esm/integrations/index.d.mts +9 -0
  49. package/dist/esm/integrations/index.mjs +16 -0
  50. package/dist/esm/integrations/index.mjs.map +1 -0
  51. package/dist/esm/testing/index.d.mts +62 -0
  52. package/dist/esm/testing/index.mjs +101 -0
  53. package/dist/esm/testing/index.mjs.map +1 -0
  54. package/dist/esm/types-BwK8Xgvg.d.mts +967 -0
  55. package/package.json +69 -20
  56. package/dist/cjs/types-V7c-qhn6.d.ts +0 -489
  57. package/dist/esm/chunk-HB2DGKQ3.mjs.map +0 -1
  58. package/dist/esm/chunk-MCFHZSF7.mjs +0 -107
  59. package/dist/esm/chunk-MCFHZSF7.mjs.map +0 -1
  60. package/dist/esm/chunk-YWBJJV5M.mjs.map +0 -1
  61. package/dist/esm/types-V7c-qhn6.d.mts +0 -489
@@ -0,0 +1,9 @@
1
+ export { A as A2APaymentPayload, a as A2APaymentRequired, F as FacilitatorWdkSigner, h as FacilitatorWdkSignerOptions, S as SIWxSigner, r as WdkA2AOptions, s as WdkA2APaymentClient, v as createFacilitatorSigners, w as createSIWxSigners, y as createWdkA2APaymentClient, Z as toFacilitatorWdkSigner, _ as toSIWxSigner } from '../index-DnEI5M6d.js';
2
+ import 'viem';
3
+ import '../types-BwK8Xgvg.js';
4
+ import '../adapters/ton-adapter.js';
5
+ import '../adapters/svm-adapter.js';
6
+ import '../adapters/tron-adapter.js';
7
+ import '../adapters/index.js';
8
+ import '@t402/evm';
9
+ import '@t402/core/types';
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/integrations/index.ts
21
+ var integrations_exports = {};
22
+ __export(integrations_exports, {
23
+ createFacilitatorSigners: () => createFacilitatorSigners,
24
+ createSIWxSigners: () => createSIWxSigners,
25
+ createWdkA2APaymentClient: () => createWdkA2APaymentClient,
26
+ toFacilitatorWdkSigner: () => toFacilitatorWdkSigner,
27
+ toSIWxSigner: () => toSIWxSigner
28
+ });
29
+ module.exports = __toCommonJS(integrations_exports);
30
+
31
+ // src/integrations/a2a-adapter.ts
32
+ function findBestOption(accepts, signers, preferredScheme) {
33
+ const signerNetworks = new Set(signers.map((s) => s.network));
34
+ const exactMatch = accepts.find(
35
+ (a) => a.scheme === preferredScheme && signerNetworks.has(a.network)
36
+ );
37
+ if (exactMatch) return exactMatch;
38
+ const networkMatch = accepts.find((a) => signerNetworks.has(a.network));
39
+ if (networkMatch) return networkMatch;
40
+ const schemeMatch = accepts.find((a) => a.scheme === preferredScheme);
41
+ if (schemeMatch) return schemeMatch;
42
+ return accepts[0];
43
+ }
44
+ async function createWdkA2APaymentClient(wdk, options) {
45
+ const preferredScheme = options?.preferredScheme ?? "exact";
46
+ const signers = await wdk.getAllSigners({ schemes: [preferredScheme] });
47
+ const paymentHandler = async (req) => {
48
+ if (!req.accepts || req.accepts.length === 0) {
49
+ throw new Error("No payment options in requirements");
50
+ }
51
+ const selected = findBestOption(req.accepts, signers, preferredScheme);
52
+ if (!selected) {
53
+ throw new Error("No compatible payment option found for available signers");
54
+ }
55
+ if (options?.spendingLimit !== void 0) {
56
+ const amount = BigInt(selected.amount);
57
+ if (amount > options.spendingLimit) {
58
+ throw new Error(`Payment amount ${amount} exceeds spending limit ${options.spendingLimit}`);
59
+ }
60
+ }
61
+ if (options?.onApprovalRequired) {
62
+ const approved = await options.onApprovalRequired({
63
+ amount: BigInt(selected.amount),
64
+ network: selected.network
65
+ });
66
+ if (!approved) {
67
+ throw new Error("Payment rejected by approval callback");
68
+ }
69
+ }
70
+ const signerEntry = signers.find((s) => s.network === selected.network && s.scheme === selected.scheme) ?? signers.find((s) => s.network === selected.network);
71
+ if (!signerEntry) {
72
+ throw new Error(`No signer available for network ${selected.network}`);
73
+ }
74
+ if (options?.autoBalance) {
75
+ const chainName = getChainNameFromNetwork(wdk, selected.network);
76
+ if (chainName) {
77
+ const balance = await wdk.getUsdt0Balance(chainName);
78
+ const requiredAmount = BigInt(selected.amount);
79
+ if (balance < requiredAmount && options.autoBridge) {
80
+ const best = await wdk.findBestChainForPayment(requiredAmount);
81
+ if (best && best.chain !== chainName) {
82
+ await wdk.bridgeUsdt0({
83
+ fromChain: best.chain,
84
+ toChain: chainName,
85
+ amount: requiredAmount
86
+ });
87
+ }
88
+ }
89
+ }
90
+ }
91
+ const signer = signerEntry.signer;
92
+ const now = Math.floor(Date.now() / 1e3);
93
+ const deadline = now + selected.maxTimeoutSeconds;
94
+ const nonce = "0x" + Array.from(globalThis.crypto.getRandomValues(new Uint8Array(32))).map((b) => b.toString(16).padStart(2, "0")).join("");
95
+ const chainId = parseInt(selected.network.split(":")[1] || "0");
96
+ const signature = await signer.signTypedData({
97
+ domain: {
98
+ name: "USD\u20AE0",
99
+ version: "1",
100
+ chainId,
101
+ verifyingContract: selected.asset
102
+ },
103
+ types: {
104
+ TransferWithAuthorization: [
105
+ { name: "from", type: "address" },
106
+ { name: "to", type: "address" },
107
+ { name: "value", type: "uint256" },
108
+ { name: "validAfter", type: "uint256" },
109
+ { name: "validBefore", type: "uint256" },
110
+ { name: "nonce", type: "bytes32" }
111
+ ]
112
+ },
113
+ primaryType: "TransferWithAuthorization",
114
+ message: {
115
+ from: signer.address,
116
+ to: selected.payTo,
117
+ value: BigInt(selected.amount),
118
+ validAfter: 0n,
119
+ validBefore: BigInt(deadline),
120
+ nonce
121
+ }
122
+ });
123
+ return {
124
+ t402Version: req.t402Version,
125
+ resource: req.resource,
126
+ accepted: selected,
127
+ payload: {
128
+ signature,
129
+ from: signer.address,
130
+ validAfter: "0",
131
+ validBefore: deadline.toString(),
132
+ nonce
133
+ }
134
+ };
135
+ };
136
+ return { signers, paymentHandler };
137
+ }
138
+ function getChainNameFromNetwork(wdk, network) {
139
+ for (const chain of wdk.getConfiguredChains()) {
140
+ const config = wdk.getChainConfig(chain);
141
+ if (config && config.network === network) {
142
+ return chain;
143
+ }
144
+ }
145
+ return void 0;
146
+ }
147
+
148
+ // src/integrations/facilitator-adapter.ts
149
+ async function toFacilitatorWdkSigner(wdk, chain, options) {
150
+ const wdkSigner = await wdk.getSigner(chain);
151
+ const address = wdkSigner.address;
152
+ return {
153
+ address,
154
+ async signTransaction(tx) {
155
+ if (tx && typeof tx === "object" && "domain" in tx) {
156
+ const typedData = tx;
157
+ return wdkSigner.signTypedData(typedData);
158
+ }
159
+ if (typeof tx === "string") {
160
+ return wdkSigner.signMessage(tx);
161
+ }
162
+ throw new Error("Unsupported transaction format for WDK facilitator signer");
163
+ },
164
+ async signTypedData(data) {
165
+ return wdkSigner.signTypedData(data);
166
+ },
167
+ async sendTransaction(params) {
168
+ const result = await wdkSigner.sendTransaction({
169
+ to: params.to,
170
+ value: params.value,
171
+ data: params.data
172
+ });
173
+ if (options?.bridgeToMainChain && options.bridgeToMainChain !== chain) {
174
+ const balance = await wdk.getUsdt0Balance(chain);
175
+ if (balance > 0n) {
176
+ try {
177
+ await wdk.bridgeUsdt0({
178
+ fromChain: chain,
179
+ toChain: options.bridgeToMainChain,
180
+ amount: balance
181
+ });
182
+ } catch {
183
+ }
184
+ }
185
+ }
186
+ return result.hash;
187
+ }
188
+ };
189
+ }
190
+ async function createFacilitatorSigners(wdk, options) {
191
+ const chains = wdk.getConfiguredChains();
192
+ const signers = /* @__PURE__ */ new Map();
193
+ const results = await Promise.allSettled(
194
+ chains.map(async (chain) => {
195
+ const signer = await toFacilitatorWdkSigner(wdk, chain, options);
196
+ return { chain, signer };
197
+ })
198
+ );
199
+ for (const result of results) {
200
+ if (result.status === "fulfilled") {
201
+ signers.set(result.value.chain, result.value.signer);
202
+ }
203
+ }
204
+ return signers;
205
+ }
206
+
207
+ // src/integrations/siwx-adapter.ts
208
+ async function toSIWxSigner(wdk, chain) {
209
+ const wdkSigner = await wdk.getSigner(chain);
210
+ return {
211
+ address: wdkSigner.address,
212
+ async signMessage(message) {
213
+ return wdkSigner.signMessage(message);
214
+ },
215
+ async signTypedData(data) {
216
+ return wdkSigner.signTypedData({
217
+ domain: data.domain,
218
+ types: data.types,
219
+ primaryType: data.primaryType,
220
+ message: data.message
221
+ });
222
+ }
223
+ };
224
+ }
225
+ async function createSIWxSigners(wdk) {
226
+ const chains = wdk.getConfiguredChains();
227
+ const signers = /* @__PURE__ */ new Map();
228
+ const results = await Promise.allSettled(
229
+ chains.map(async (chain) => {
230
+ const signer = await toSIWxSigner(wdk, chain);
231
+ return { chain, signer };
232
+ })
233
+ );
234
+ for (const result of results) {
235
+ if (result.status === "fulfilled") {
236
+ signers.set(result.value.chain, result.value.signer);
237
+ }
238
+ }
239
+ return signers;
240
+ }
241
+ // Annotate the CommonJS export names for ESM import in node:
242
+ 0 && (module.exports = {
243
+ createFacilitatorSigners,
244
+ createSIWxSigners,
245
+ createWdkA2APaymentClient,
246
+ toFacilitatorWdkSigner,
247
+ toSIWxSigner
248
+ });
249
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/integrations/index.ts","../../../src/integrations/a2a-adapter.ts","../../../src/integrations/facilitator-adapter.ts","../../../src/integrations/siwx-adapter.ts"],"sourcesContent":["/**\n * WDK Integration Adapters\n *\n * Adapters for integrating T402WDK with other T402 protocol components:\n * - A2A (Agent-to-Agent) transport\n * - Facilitator settlement\n * - SIWx (Sign-In-With-X) authentication\n */\n\nexport {\n createWdkA2APaymentClient,\n type WdkA2AOptions,\n type WdkA2APaymentClient,\n type A2APaymentRequired,\n type A2APaymentPayload,\n} from './a2a-adapter.js'\n\nexport {\n toFacilitatorWdkSigner,\n createFacilitatorSigners,\n type FacilitatorWdkSignerOptions,\n type FacilitatorWdkSigner,\n} from './facilitator-adapter.js'\n\nexport { toSIWxSigner, createSIWxSigners, type SIWxSigner } from './siwx-adapter.js'\n","/**\n * A2A + WDK Adapter\n *\n * Bridges T402WDK wallets with the A2A (Agent-to-Agent) payment transport,\n * enabling AI agents to make payments using WDK-managed wallets.\n */\n\nimport type { T402WDK } from '../t402wdk.js'\nimport type { SignerEntry } from '../types.js'\n\n/**\n * Payment requirements received from an A2A server (402 response).\n * Matches the core PaymentRequired type shape.\n */\nexport interface A2APaymentRequired {\n t402Version: number\n resource: { url: string; description?: string; mimeType?: string }\n accepts: Array<{\n scheme: string\n network: string\n asset: string\n amount: string\n payTo: string\n maxTimeoutSeconds: number\n extra: Record<string, unknown>\n }>\n extensions?: Record<string, unknown>\n}\n\n/**\n * Payment payload to submit to an A2A server.\n * Matches the core PaymentPayload type shape.\n */\nexport interface A2APaymentPayload {\n t402Version: number\n resource?: { url: string; description?: string; mimeType?: string }\n accepted: A2APaymentRequired['accepts'][0]\n payload: Record<string, unknown>\n extensions?: Record<string, unknown>\n}\n\n/**\n * Options for the WDK A2A payment client adapter.\n */\nexport interface WdkA2AOptions {\n /** Maximum spending limit per payment (in atomic units) */\n spendingLimit?: bigint\n /** Callback when manual approval is required */\n onApprovalRequired?: (payment: { amount: bigint; network: string }) => Promise<boolean>\n /** Auto-check balance before payment */\n autoBalance?: boolean\n /** Auto-bridge if insufficient balance on target chain */\n autoBridge?: boolean\n /** Preferred payment scheme (default: \"exact\") */\n preferredScheme?: string\n}\n\n/**\n * Result of createWdkA2APaymentClient.\n */\nexport interface WdkA2APaymentClient {\n /** Signer entries from WDK for all configured chains */\n signers: SignerEntry[]\n /** Handle a 402 payment required response */\n paymentHandler: (req: A2APaymentRequired) => Promise<A2APaymentPayload>\n}\n\n/**\n * Find the best matching payment option for the available signers.\n */\nfunction findBestOption(\n accepts: A2APaymentRequired['accepts'],\n signers: SignerEntry[],\n preferredScheme: string,\n): A2APaymentRequired['accepts'][0] | undefined {\n const signerNetworks = new Set(signers.map((s) => s.network))\n\n // Prefer matching both scheme and network\n const exactMatch = accepts.find(\n (a) => a.scheme === preferredScheme && signerNetworks.has(a.network),\n )\n if (exactMatch) return exactMatch\n\n // Match by network only\n const networkMatch = accepts.find((a) => signerNetworks.has(a.network))\n if (networkMatch) return networkMatch\n\n // Match by scheme only\n const schemeMatch = accepts.find((a) => a.scheme === preferredScheme)\n if (schemeMatch) return schemeMatch\n\n return accepts[0]\n}\n\n/**\n * Create a WDK-backed A2A payment client.\n *\n * Extracts all configured chain signers from WDK and wraps them for A2A use.\n * The returned `paymentHandler` selects the best signer for the payment\n * requirements, optionally checks balance, and creates a signed payment payload.\n *\n * @param wdk - An initialized T402WDK instance\n * @param options - Configuration options\n * @returns Object with signers and a paymentHandler function\n *\n * @example\n * ```typescript\n * const { signers, paymentHandler } = await createWdkA2APaymentClient(wdk, {\n * spendingLimit: 10_000_000n, // 10 USDT0\n * autoBalance: true,\n * });\n *\n * // When the A2A agent receives a 402 response:\n * const payload = await paymentHandler(paymentRequired);\n * // Submit payload back to the A2A server\n * ```\n */\nexport async function createWdkA2APaymentClient(\n wdk: T402WDK,\n options?: WdkA2AOptions,\n): Promise<WdkA2APaymentClient> {\n const preferredScheme = options?.preferredScheme ?? 'exact'\n\n // Get all signers from WDK\n const signers = await wdk.getAllSigners({ schemes: [preferredScheme] })\n\n const paymentHandler = async (req: A2APaymentRequired): Promise<A2APaymentPayload> => {\n if (!req.accepts || req.accepts.length === 0) {\n throw new Error('No payment options in requirements')\n }\n\n // Find the best option\n const selected = findBestOption(req.accepts, signers, preferredScheme)\n if (!selected) {\n throw new Error('No compatible payment option found for available signers')\n }\n\n // Check spending limit\n if (options?.spendingLimit !== undefined) {\n const amount = BigInt(selected.amount)\n if (amount > options.spendingLimit) {\n throw new Error(`Payment amount ${amount} exceeds spending limit ${options.spendingLimit}`)\n }\n }\n\n // Request approval if callback provided\n if (options?.onApprovalRequired) {\n const approved = await options.onApprovalRequired({\n amount: BigInt(selected.amount),\n network: selected.network,\n })\n if (!approved) {\n throw new Error('Payment rejected by approval callback')\n }\n }\n\n // Find the matching signer\n const signerEntry =\n signers.find((s) => s.network === selected.network && s.scheme === selected.scheme) ??\n signers.find((s) => s.network === selected.network)\n\n if (!signerEntry) {\n throw new Error(`No signer available for network ${selected.network}`)\n }\n\n // Auto-balance check\n if (options?.autoBalance) {\n const chainName = getChainNameFromNetwork(wdk, selected.network)\n if (chainName) {\n const balance = await wdk.getUsdt0Balance(chainName)\n const requiredAmount = BigInt(selected.amount)\n if (balance < requiredAmount && options.autoBridge) {\n // Try to find a chain with enough balance and bridge\n const best = await wdk.findBestChainForPayment(requiredAmount)\n if (best && best.chain !== chainName) {\n await wdk.bridgeUsdt0({\n fromChain: best.chain,\n toChain: chainName,\n amount: requiredAmount,\n })\n }\n }\n }\n }\n\n // Sign the payment using the WDK signer\n const signer = signerEntry.signer as {\n signTypedData: (params: Record<string, unknown>) => Promise<string>\n address: string\n }\n\n // Create EIP-3009 transferWithAuthorization typed data\n const now = Math.floor(Date.now() / 1000)\n const deadline = now + selected.maxTimeoutSeconds\n const nonce =\n '0x' +\n Array.from(globalThis.crypto.getRandomValues(new Uint8Array(32)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n\n const chainId = parseInt(selected.network.split(':')[1] || '0')\n\n const signature = await signer.signTypedData({\n domain: {\n name: 'USD₮0',\n version: '1',\n chainId,\n verifyingContract: selected.asset,\n },\n types: {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n },\n primaryType: 'TransferWithAuthorization',\n message: {\n from: signer.address,\n to: selected.payTo,\n value: BigInt(selected.amount),\n validAfter: 0n,\n validBefore: BigInt(deadline),\n nonce,\n },\n })\n\n return {\n t402Version: req.t402Version,\n resource: req.resource,\n accepted: selected,\n payload: {\n signature,\n from: signer.address,\n validAfter: '0',\n validBefore: deadline.toString(),\n nonce,\n },\n }\n }\n\n return { signers, paymentHandler }\n}\n\n/**\n * Get chain name from CAIP-2 network identifier.\n */\nfunction getChainNameFromNetwork(wdk: T402WDK, network: string): string | undefined {\n for (const chain of wdk.getConfiguredChains()) {\n const config = wdk.getChainConfig(chain)\n if (config && config.network === network) {\n return chain\n }\n }\n return undefined\n}\n","/**\n * Facilitator + WDK Adapter\n *\n * Wraps a T402WDK wallet as a facilitator-compatible signer, enabling WDK\n * wallets to be used for on-chain settlement (verify + settle operations).\n */\n\nimport type { T402WDK } from '../t402wdk.js'\nimport type { WDKSigner } from '../signer.js'\n\n/**\n * Options for the facilitator WDK signer adapter.\n */\nexport interface FacilitatorWdkSignerOptions {\n /** Automatically settle payments after verification */\n autoSettle?: boolean\n /** Auto-bridge received payments to this chain (CAIP-2 network or chain name) */\n bridgeToMainChain?: string\n}\n\n/**\n * Facilitator-compatible signer backed by WDK.\n */\nexport interface FacilitatorWdkSigner {\n /** Wallet address on the target chain */\n address: string\n /** Sign a transaction for on-chain settlement */\n signTransaction: (tx: unknown) => Promise<string>\n /** Sign typed data (EIP-712) */\n signTypedData: (data: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }) => Promise<string>\n /** Send a signed transaction */\n sendTransaction: (params: { to: string; value?: bigint; data?: string }) => Promise<string>\n}\n\n/**\n * Convert a T402WDK instance into a facilitator-compatible signer for a given chain.\n *\n * The returned signer can be used with `toFacilitatorEvmSigner()` or directly\n * with a `t402Facilitator` instance for on-chain payment verification and settlement.\n *\n * @param wdk - An initialized T402WDK instance\n * @param chain - Chain name (e.g., \"arbitrum\", \"base\")\n * @param options - Optional configuration\n * @returns A facilitator-compatible signer object\n *\n * @example\n * ```typescript\n * const signer = await toFacilitatorWdkSigner(wdk, 'arbitrum', {\n * autoSettle: true,\n * bridgeToMainChain: 'arbitrum',\n * });\n *\n * // Use the signer with the facilitator\n * console.log('Facilitator address:', signer.address);\n * ```\n */\nexport async function toFacilitatorWdkSigner(\n wdk: T402WDK,\n chain: string,\n options?: FacilitatorWdkSignerOptions,\n): Promise<FacilitatorWdkSigner> {\n // Get the WDK signer for the specified chain\n const wdkSigner: WDKSigner = await wdk.getSigner(chain)\n const address = wdkSigner.address\n\n return {\n address,\n\n async signTransaction(tx: unknown): Promise<string> {\n // For EVM chains, sign typed data if the tx is structured as EIP-712\n if (tx && typeof tx === 'object' && 'domain' in tx) {\n const typedData = tx as {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }\n return wdkSigner.signTypedData(typedData)\n }\n\n // For raw message signing, convert to string\n if (typeof tx === 'string') {\n return wdkSigner.signMessage(tx)\n }\n\n throw new Error('Unsupported transaction format for WDK facilitator signer')\n },\n\n async signTypedData(data: {\n domain: Record<string, unknown>\n types: Record<string, unknown>\n primaryType: string\n message: Record<string, unknown>\n }): Promise<string> {\n return wdkSigner.signTypedData(data)\n },\n\n async sendTransaction(params: { to: string; value?: bigint; data?: string }): Promise<string> {\n const result = await wdkSigner.sendTransaction({\n to: params.to as `0x${string}`,\n value: params.value,\n data: params.data,\n })\n\n // Auto-bridge if configured\n if (options?.bridgeToMainChain && options.bridgeToMainChain !== chain) {\n // Check balance on source chain\n const balance = await wdk.getUsdt0Balance(chain)\n if (balance > 0n) {\n try {\n await wdk.bridgeUsdt0({\n fromChain: chain,\n toChain: options.bridgeToMainChain,\n amount: balance,\n })\n } catch {\n // Bridge failure is non-fatal for the facilitator\n }\n }\n }\n\n return result.hash\n },\n }\n}\n\n/**\n * Create facilitator signers for all configured WDK chains.\n *\n * @param wdk - An initialized T402WDK instance\n * @param options - Optional configuration applied to all signers\n * @returns Map of chain name to facilitator signer\n *\n * @example\n * ```typescript\n * const signers = await createFacilitatorSigners(wdk, {\n * bridgeToMainChain: 'arbitrum',\n * });\n *\n * for (const [chain, signer] of signers) {\n * console.log(`${chain}: ${signer.address}`);\n * }\n * ```\n */\nexport async function createFacilitatorSigners(\n wdk: T402WDK,\n options?: FacilitatorWdkSignerOptions,\n): Promise<Map<string, FacilitatorWdkSigner>> {\n const chains = wdk.getConfiguredChains()\n const signers = new Map<string, FacilitatorWdkSigner>()\n\n const results = await Promise.allSettled(\n chains.map(async (chain) => {\n const signer = await toFacilitatorWdkSigner(wdk, chain, options)\n return { chain, signer }\n }),\n )\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n signers.set(result.value.chain, result.value.signer)\n }\n }\n\n return signers\n}\n","/**\n * SIWx + WDK Adapter\n *\n * Wraps a T402WDK wallet as a SIWx (Sign-In-With-X) signer, enabling\n * WDK wallets to sign CAIP-122 authentication messages.\n */\n\nimport type { T402WDK } from '../t402wdk.js'\n\n/**\n * SIWx signer interface, compatible with the SIWxSigner from @t402/extensions.\n */\nexport interface SIWxSigner {\n /** Wallet address */\n address: string\n /** Sign a personal message (EIP-191) */\n signMessage(message: string): Promise<string>\n /** Sign EIP-712 typed data */\n signTypedData(data: {\n domain: unknown\n types: unknown\n primaryType: string\n message: unknown\n }): Promise<string>\n}\n\n/**\n * Convert a T402WDK instance into a SIWx-compatible signer for a given chain.\n *\n * The returned signer implements the `SIWxSigner` interface used by\n * `@t402/extensions` for CAIP-122 Sign-In-With-X authentication flows.\n *\n * @param wdk - An initialized T402WDK instance\n * @param chain - Chain name (e.g., \"arbitrum\", \"base\")\n * @returns A SIWx-compatible signer\n *\n * @example\n * ```typescript\n * import { toSIWxSigner } from '@t402/wdk';\n * import { createSIWxPayload, encodeSIWxHeader } from '@t402/extensions';\n *\n * const siwxSigner = await toSIWxSigner(wdk, 'arbitrum');\n *\n * // Create and sign SIWx payload\n * const payload = await createSIWxPayload(serverExtension, siwxSigner);\n * const header = encodeSIWxHeader(payload);\n *\n * // Include in request\n * fetch(url, { headers: { 'X-T402-SIWx': header } });\n * ```\n */\nexport async function toSIWxSigner(wdk: T402WDK, chain: string): Promise<SIWxSigner> {\n const wdkSigner = await wdk.getSigner(chain)\n\n return {\n address: wdkSigner.address,\n\n async signMessage(message: string): Promise<string> {\n return wdkSigner.signMessage(message)\n },\n\n async signTypedData(data: {\n domain: unknown\n types: unknown\n primaryType: string\n message: unknown\n }): Promise<string> {\n return wdkSigner.signTypedData({\n domain: data.domain as Record<string, unknown>,\n types: data.types as Record<string, unknown>,\n primaryType: data.primaryType,\n message: data.message as Record<string, unknown>,\n })\n },\n }\n}\n\n/**\n * Create SIWx signers for all configured WDK chains.\n *\n * @param wdk - An initialized T402WDK instance\n * @returns Map of chain name to SIWx signer\n *\n * @example\n * ```typescript\n * const signers = await createSIWxSigners(wdk);\n * const arbSigner = signers.get('arbitrum');\n * ```\n */\nexport async function createSIWxSigners(wdk: T402WDK): Promise<Map<string, SIWxSigner>> {\n const chains = wdk.getConfiguredChains()\n const signers = new Map<string, SIWxSigner>()\n\n const results = await Promise.allSettled(\n chains.map(async (chain) => {\n const signer = await toSIWxSigner(wdk, chain)\n return { chain, signer }\n }),\n )\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n signers.set(result.value.chain, result.value.signer)\n }\n }\n\n return signers\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,62 @@
1
+ import { c as WDKAccount, a as WDKTonAccount, W as WDKSolanaAccount, b as WDKTronAccount, d as WDKInstance } from '../types-BwK8Xgvg.js';
2
+ import 'viem';
3
+
4
+ /**
5
+ * Shared test harness for @t402/wdk
6
+ *
7
+ * Provides mock factories for WDK accounts, instances, and T402WDK
8
+ * to simplify testing across the T402 ecosystem.
9
+ */
10
+
11
+ /**
12
+ * Create a mock WDK EVM account with sensible defaults.
13
+ */
14
+ declare function createMockWDKAccount(overrides?: Partial<WDKAccount>): WDKAccount;
15
+ /**
16
+ * Create a mock WDK instance that returns the given accounts.
17
+ */
18
+ declare function createMockWDKInstance(accounts?: Record<string, WDKAccount>): WDKInstance;
19
+ /**
20
+ * Create a mock TON account.
21
+ */
22
+ declare function createMockTonAccount(overrides?: Partial<WDKTonAccount>): WDKTonAccount;
23
+ /**
24
+ * Create a mock Solana account.
25
+ */
26
+ declare function createMockSolanaAccount(overrides?: Partial<WDKSolanaAccount>): WDKSolanaAccount;
27
+ /**
28
+ * Create a mock TRON account.
29
+ */
30
+ declare function createMockTronAccount(overrides?: Partial<WDKTronAccount>): WDKTronAccount;
31
+ /**
32
+ * Configuration for createMockT402WDK.
33
+ */
34
+ interface MockT402WDKConfig {
35
+ /** Chains to configure (default: ['arbitrum']) */
36
+ chains?: string[];
37
+ /** Custom EVM account overrides */
38
+ evmAccount?: Partial<WDKAccount>;
39
+ /** Custom TON account overrides */
40
+ tonAccount?: Partial<WDKTonAccount>;
41
+ /** Custom Solana account overrides */
42
+ solanaAccount?: Partial<WDKSolanaAccount>;
43
+ /** Custom TRON account overrides */
44
+ tronAccount?: Partial<WDKTronAccount>;
45
+ }
46
+ /**
47
+ * Create a mock T402WDK-like object for testing, returning
48
+ * the underlying WDK instance and chain configuration.
49
+ *
50
+ * This is useful when you need to test code that depends on
51
+ * T402WDK without importing the full class.
52
+ */
53
+ declare function createMockT402WDK(config?: MockT402WDKConfig): {
54
+ wdkInstance: WDKInstance;
55
+ chainConfig: Record<string, string>;
56
+ evmAccount: WDKAccount;
57
+ tonAccount: WDKTonAccount;
58
+ solanaAccount: WDKSolanaAccount;
59
+ tronAccount: WDKTronAccount;
60
+ };
61
+
62
+ export { type MockT402WDKConfig, createMockSolanaAccount, createMockT402WDK, createMockTonAccount, createMockTronAccount, createMockWDKAccount, createMockWDKInstance };
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/testing/index.ts
21
+ var testing_exports = {};
22
+ __export(testing_exports, {
23
+ createMockSolanaAccount: () => createMockSolanaAccount,
24
+ createMockT402WDK: () => createMockT402WDK,
25
+ createMockTonAccount: () => createMockTonAccount,
26
+ createMockTronAccount: () => createMockTronAccount,
27
+ createMockWDKAccount: () => createMockWDKAccount,
28
+ createMockWDKInstance: () => createMockWDKInstance
29
+ });
30
+ module.exports = __toCommonJS(testing_exports);
31
+ function createMockWDKAccount(overrides) {
32
+ return {
33
+ getAddress: async () => "0x1234567890123456789012345678901234567890",
34
+ getBalance: async () => 1000000000000000000n,
35
+ getTokenBalance: async () => 1000000n,
36
+ signMessage: async () => "0xmocksignature",
37
+ signTypedData: async () => "0xmocktypedsignature",
38
+ sendTransaction: async () => "0xmocktxhash",
39
+ estimateGas: async () => 21000n,
40
+ ...overrides
41
+ };
42
+ }
43
+ function createMockWDKInstance(accounts) {
44
+ const defaultAccount = createMockWDKAccount();
45
+ return {
46
+ registerWallet: function() {
47
+ return this;
48
+ },
49
+ registerProtocol: function() {
50
+ return this;
51
+ },
52
+ getAccount: async (chain, _index) => {
53
+ return accounts?.[chain] ?? defaultAccount;
54
+ },
55
+ executeProtocol: async () => ({ txHash: "0xmockprotocoltxhash" })
56
+ };
57
+ }
58
+ function createMockTonAccount(overrides) {
59
+ return {
60
+ getAddress: async () => "UQBMock_TON_Address_For_Testing_Purposes_Only_12345",
61
+ getBalance: async () => 5000000000n,
62
+ getJettonBalance: async () => 1000000n,
63
+ signMessage: async () => new Uint8Array(64),
64
+ sendTransaction: async () => "mock_ton_tx_hash",
65
+ getSeqno: async () => 1,
66
+ transferJetton: async () => "mock_jetton_tx_hash",
67
+ ...overrides
68
+ };
69
+ }
70
+ function createMockSolanaAccount(overrides) {
71
+ return {
72
+ getAddress: async () => "11111111111111111111111111111112",
73
+ getBalance: async () => 2000000000n,
74
+ getTokenBalance: async () => 1000000n,
75
+ sign: async () => new Uint8Array(64),
76
+ signTransaction: async () => new Uint8Array(128),
77
+ sendTransaction: async () => "mock_sol_tx_hash",
78
+ transfer: async () => "mock_spl_tx_hash",
79
+ ...overrides
80
+ };
81
+ }
82
+ function createMockTronAccount(overrides) {
83
+ return {
84
+ getAddress: async () => "TJMockTronAddress1234567890ABCDEF",
85
+ getBalance: async () => 10000000n,
86
+ getTrc20Balance: async () => 1000000n,
87
+ signTransaction: async (tx) => tx,
88
+ sendTransaction: async () => "mock_tron_tx_hash",
89
+ transferTrc20: async () => "mock_trc20_tx_hash",
90
+ ...overrides
91
+ };
92
+ }
93
+ function createMockT402WDK(config) {
94
+ const chains = config?.chains ?? ["arbitrum"];
95
+ const evmAccount = createMockWDKAccount(config?.evmAccount);
96
+ const tonAccount = createMockTonAccount(config?.tonAccount);
97
+ const solanaAccount = createMockSolanaAccount(config?.solanaAccount);
98
+ const tronAccount = createMockTronAccount(config?.tronAccount);
99
+ const accountMap = {};
100
+ for (const chain of chains) {
101
+ accountMap[chain] = evmAccount;
102
+ }
103
+ accountMap["ton"] = tonAccount;
104
+ accountMap["solana"] = solanaAccount;
105
+ accountMap["tron"] = tronAccount;
106
+ const wdkInstance = createMockWDKInstance(accountMap);
107
+ const chainConfig = {};
108
+ for (const chain of chains) {
109
+ chainConfig[chain] = `https://mock-rpc.${chain}.test`;
110
+ }
111
+ return {
112
+ wdkInstance,
113
+ chainConfig,
114
+ evmAccount,
115
+ tonAccount,
116
+ solanaAccount,
117
+ tronAccount
118
+ };
119
+ }
120
+ // Annotate the CommonJS export names for ESM import in node:
121
+ 0 && (module.exports = {
122
+ createMockSolanaAccount,
123
+ createMockT402WDK,
124
+ createMockTonAccount,
125
+ createMockTronAccount,
126
+ createMockWDKAccount,
127
+ createMockWDKInstance
128
+ });
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/testing/index.ts"],"sourcesContent":["/**\n * Shared test harness for @t402/wdk\n *\n * Provides mock factories for WDK accounts, instances, and T402WDK\n * to simplify testing across the T402 ecosystem.\n */\n\nimport type {\n WDKAccount,\n WDKInstance,\n WDKTonAccount,\n WDKSolanaAccount,\n WDKTronAccount,\n} from '../types.js'\n\n/**\n * Create a mock WDK EVM account with sensible defaults.\n */\nexport function createMockWDKAccount(overrides?: Partial<WDKAccount>): WDKAccount {\n return {\n getAddress: async () => '0x1234567890123456789012345678901234567890',\n getBalance: async () => 1000000000000000000n,\n getTokenBalance: async () => 1000000n,\n signMessage: async () => '0xmocksignature',\n signTypedData: async () => '0xmocktypedsignature',\n sendTransaction: async () => '0xmocktxhash',\n estimateGas: async () => 21000n,\n ...overrides,\n }\n}\n\n/**\n * Create a mock WDK instance that returns the given accounts.\n */\nexport function createMockWDKInstance(accounts?: Record<string, WDKAccount>): WDKInstance {\n const defaultAccount = createMockWDKAccount()\n return {\n registerWallet: function () {\n return this as WDKInstance\n },\n registerProtocol: function () {\n return this as WDKInstance\n },\n getAccount: async (chain: string, _index: number) => {\n return accounts?.[chain] ?? defaultAccount\n },\n executeProtocol: async () => ({ txHash: '0xmockprotocoltxhash' }),\n }\n}\n\n/**\n * Create a mock TON account.\n */\nexport function createMockTonAccount(overrides?: Partial<WDKTonAccount>): WDKTonAccount {\n return {\n getAddress: async () => 'UQBMock_TON_Address_For_Testing_Purposes_Only_12345',\n getBalance: async () => 5000000000n,\n getJettonBalance: async () => 1000000n,\n signMessage: async () => new Uint8Array(64),\n sendTransaction: async () => 'mock_ton_tx_hash',\n getSeqno: async () => 1,\n transferJetton: async () => 'mock_jetton_tx_hash',\n ...overrides,\n }\n}\n\n/**\n * Create a mock Solana account.\n */\nexport function createMockSolanaAccount(overrides?: Partial<WDKSolanaAccount>): WDKSolanaAccount {\n return {\n getAddress: async () => '11111111111111111111111111111112',\n getBalance: async () => 2000000000n,\n getTokenBalance: async () => 1000000n,\n sign: async () => new Uint8Array(64),\n signTransaction: async () => new Uint8Array(128),\n sendTransaction: async () => 'mock_sol_tx_hash',\n transfer: async () => 'mock_spl_tx_hash',\n ...overrides,\n }\n}\n\n/**\n * Create a mock TRON account.\n */\nexport function createMockTronAccount(overrides?: Partial<WDKTronAccount>): WDKTronAccount {\n return {\n getAddress: async () => 'TJMockTronAddress1234567890ABCDEF',\n getBalance: async () => 10000000n,\n getTrc20Balance: async () => 1000000n,\n signTransaction: async (tx: unknown) => tx,\n sendTransaction: async () => 'mock_tron_tx_hash',\n transferTrc20: async () => 'mock_trc20_tx_hash',\n ...overrides,\n }\n}\n\n/**\n * Configuration for createMockT402WDK.\n */\nexport interface MockT402WDKConfig {\n /** Chains to configure (default: ['arbitrum']) */\n chains?: string[]\n /** Custom EVM account overrides */\n evmAccount?: Partial<WDKAccount>\n /** Custom TON account overrides */\n tonAccount?: Partial<WDKTonAccount>\n /** Custom Solana account overrides */\n solanaAccount?: Partial<WDKSolanaAccount>\n /** Custom TRON account overrides */\n tronAccount?: Partial<WDKTronAccount>\n}\n\n/**\n * Create a mock T402WDK-like object for testing, returning\n * the underlying WDK instance and chain configuration.\n *\n * This is useful when you need to test code that depends on\n * T402WDK without importing the full class.\n */\nexport function createMockT402WDK(config?: MockT402WDKConfig) {\n const chains = config?.chains ?? ['arbitrum']\n const evmAccount = createMockWDKAccount(config?.evmAccount)\n const tonAccount = createMockTonAccount(config?.tonAccount)\n const solanaAccount = createMockSolanaAccount(config?.solanaAccount)\n const tronAccount = createMockTronAccount(config?.tronAccount)\n\n const accountMap: Record<string, WDKAccount> = {}\n for (const chain of chains) {\n accountMap[chain] = evmAccount\n }\n // Non-EVM accounts returned as WDKAccount (runtime cast in T402WDK)\n accountMap['ton'] = tonAccount as unknown as WDKAccount\n accountMap['solana'] = solanaAccount as unknown as WDKAccount\n accountMap['tron'] = tronAccount as unknown as WDKAccount\n\n const wdkInstance = createMockWDKInstance(accountMap)\n\n const chainConfig: Record<string, string> = {}\n for (const chain of chains) {\n chainConfig[chain] = `https://mock-rpc.${chain}.test`\n }\n\n return {\n wdkInstance,\n chainConfig,\n evmAccount,\n tonAccount,\n solanaAccount,\n tronAccount,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBO,SAAS,qBAAqB,WAA6C;AAChF,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,YAAY,YAAY;AAAA,IACxB,iBAAiB,YAAY;AAAA,IAC7B,aAAa,YAAY;AAAA,IACzB,eAAe,YAAY;AAAA,IAC3B,iBAAiB,YAAY;AAAA,IAC7B,aAAa,YAAY;AAAA,IACzB,GAAG;AAAA,EACL;AACF;AAKO,SAAS,sBAAsB,UAAoD;AACxF,QAAM,iBAAiB,qBAAqB;AAC5C,SAAO;AAAA,IACL,gBAAgB,WAAY;AAC1B,aAAO;AAAA,IACT;AAAA,IACA,kBAAkB,WAAY;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,YAAY,OAAO,OAAe,WAAmB;AACnD,aAAO,WAAW,KAAK,KAAK;AAAA,IAC9B;AAAA,IACA,iBAAiB,aAAa,EAAE,QAAQ,uBAAuB;AAAA,EACjE;AACF;AAKO,SAAS,qBAAqB,WAAmD;AACtF,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,YAAY,YAAY;AAAA,IACxB,kBAAkB,YAAY;AAAA,IAC9B,aAAa,YAAY,IAAI,WAAW,EAAE;AAAA,IAC1C,iBAAiB,YAAY;AAAA,IAC7B,UAAU,YAAY;AAAA,IACtB,gBAAgB,YAAY;AAAA,IAC5B,GAAG;AAAA,EACL;AACF;AAKO,SAAS,wBAAwB,WAAyD;AAC/F,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,YAAY,YAAY;AAAA,IACxB,iBAAiB,YAAY;AAAA,IAC7B,MAAM,YAAY,IAAI,WAAW,EAAE;AAAA,IACnC,iBAAiB,YAAY,IAAI,WAAW,GAAG;AAAA,IAC/C,iBAAiB,YAAY;AAAA,IAC7B,UAAU,YAAY;AAAA,IACtB,GAAG;AAAA,EACL;AACF;AAKO,SAAS,sBAAsB,WAAqD;AACzF,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,YAAY,YAAY;AAAA,IACxB,iBAAiB,YAAY;AAAA,IAC7B,iBAAiB,OAAO,OAAgB;AAAA,IACxC,iBAAiB,YAAY;AAAA,IAC7B,eAAe,YAAY;AAAA,IAC3B,GAAG;AAAA,EACL;AACF;AAyBO,SAAS,kBAAkB,QAA4B;AAC5D,QAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC5C,QAAM,aAAa,qBAAqB,QAAQ,UAAU;AAC1D,QAAM,aAAa,qBAAqB,QAAQ,UAAU;AAC1D,QAAM,gBAAgB,wBAAwB,QAAQ,aAAa;AACnE,QAAM,cAAc,sBAAsB,QAAQ,WAAW;AAE7D,QAAM,aAAyC,CAAC;AAChD,aAAW,SAAS,QAAQ;AAC1B,eAAW,KAAK,IAAI;AAAA,EACtB;AAEA,aAAW,KAAK,IAAI;AACpB,aAAW,QAAQ,IAAI;AACvB,aAAW,MAAM,IAAI;AAErB,QAAM,cAAc,sBAAsB,UAAU;AAEpD,QAAM,cAAsC,CAAC;AAC7C,aAAW,SAAS,QAAQ;AAC1B,gBAAY,KAAK,IAAI,oBAAoB,KAAK;AAAA,EAChD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}