@bankofai/x402 0.6.0-beta.0 → 0.6.0-beta.2

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 (65) hide show
  1. package/dist/abi.d.ts +164 -0
  2. package/dist/abi.d.ts.map +1 -1
  3. package/dist/abi.js +115 -0
  4. package/dist/abi.js.map +1 -1
  5. package/dist/index.d.ts +4 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +4 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/mechanisms/_exact_base/facilitator.d.ts +47 -23
  10. package/dist/mechanisms/_exact_base/facilitator.d.ts.map +1 -1
  11. package/dist/mechanisms/_exact_base/facilitator.js +179 -43
  12. package/dist/mechanisms/_exact_base/facilitator.js.map +1 -1
  13. package/dist/mechanisms/_exact_permit_base/facilitator.d.ts +91 -19
  14. package/dist/mechanisms/_exact_permit_base/facilitator.d.ts.map +1 -1
  15. package/dist/mechanisms/_exact_permit_base/facilitator.js +227 -25
  16. package/dist/mechanisms/_exact_permit_base/facilitator.js.map +1 -1
  17. package/dist/mechanisms/evm/exact/facilitator.d.ts +12 -13
  18. package/dist/mechanisms/evm/exact/facilitator.d.ts.map +1 -1
  19. package/dist/mechanisms/evm/exact/facilitator.js +25 -19
  20. package/dist/mechanisms/evm/exact/facilitator.js.map +1 -1
  21. package/dist/mechanisms/evm/exact_permit/facilitator.d.ts +13 -9
  22. package/dist/mechanisms/evm/exact_permit/facilitator.d.ts.map +1 -1
  23. package/dist/mechanisms/evm/exact_permit/facilitator.js +41 -13
  24. package/dist/mechanisms/evm/exact_permit/facilitator.js.map +1 -1
  25. package/dist/mechanisms/index.d.ts +1 -1
  26. package/dist/mechanisms/index.d.ts.map +1 -1
  27. package/dist/mechanisms/tron/exact/facilitator.d.ts +12 -10
  28. package/dist/mechanisms/tron/exact/facilitator.d.ts.map +1 -1
  29. package/dist/mechanisms/tron/exact/facilitator.js +37 -16
  30. package/dist/mechanisms/tron/exact/facilitator.js.map +1 -1
  31. package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts +20 -29
  32. package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts.map +1 -1
  33. package/dist/mechanisms/tron/exact_gasfree/facilitator.js +176 -38
  34. package/dist/mechanisms/tron/exact_gasfree/facilitator.js.map +1 -1
  35. package/dist/mechanisms/tron/exact_gasfree/index.d.ts +1 -1
  36. package/dist/mechanisms/tron/exact_gasfree/index.d.ts.map +1 -1
  37. package/dist/mechanisms/tron/exact_permit/facilitator.d.ts +14 -6
  38. package/dist/mechanisms/tron/exact_permit/facilitator.d.ts.map +1 -1
  39. package/dist/mechanisms/tron/exact_permit/facilitator.js +82 -11
  40. package/dist/mechanisms/tron/exact_permit/facilitator.js.map +1 -1
  41. package/dist/middleware/core.d.ts +13 -1
  42. package/dist/middleware/core.d.ts.map +1 -1
  43. package/dist/middleware/core.js +76 -6
  44. package/dist/middleware/core.js.map +1 -1
  45. package/dist/signers/facilitator/base.d.ts +67 -0
  46. package/dist/signers/facilitator/base.d.ts.map +1 -0
  47. package/dist/signers/facilitator/base.js +11 -0
  48. package/dist/signers/facilitator/base.js.map +1 -0
  49. package/dist/signers/facilitator/evmSigner.d.ts +28 -0
  50. package/dist/signers/facilitator/evmSigner.d.ts.map +1 -0
  51. package/dist/signers/facilitator/evmSigner.js +148 -0
  52. package/dist/signers/facilitator/evmSigner.js.map +1 -0
  53. package/dist/signers/facilitator/tronSigner.d.ts +93 -0
  54. package/dist/signers/facilitator/tronSigner.d.ts.map +1 -0
  55. package/dist/signers/facilitator/tronSigner.js +308 -0
  56. package/dist/signers/facilitator/tronSigner.js.map +1 -0
  57. package/dist/signers/index.d.ts +4 -0
  58. package/dist/signers/index.d.ts.map +1 -1
  59. package/dist/signers/index.js +4 -0
  60. package/dist/signers/index.js.map +1 -1
  61. package/dist/utils/gasfree.d.ts +6 -0
  62. package/dist/utils/gasfree.d.ts.map +1 -1
  63. package/dist/utils/gasfree.js +10 -0
  64. package/dist/utils/gasfree.js.map +1 -1
  65. package/package.json +8 -8
@@ -3,79 +3,215 @@
3
3
  *
4
4
  * Mirrors Python `mechanisms._exact_base.base.ExactBaseFacilitatorMechanism`.
5
5
  *
6
- * Per-chain subclasses provide a {@link ChainAdapter} and the chain RPC client
7
- * (viem PublicClient / tronweb instance). The base handles:
8
- * - basic structural verification (asset / payTo / value match, time window)
9
- * - dispatching feeQuote / verify / settle to the chain-specific impl
6
+ * Per-chain subclasses provide a {@link ChainAdapter}. The base handles:
7
+ * - structural verification (asset / payTo / value match, time window)
8
+ * - ERC-3009 EIP-712 signature recovery via the injected FacilitatorSigner
9
+ * - `transferWithAuthorization` settle + receipt polling
10
10
  *
11
- * Subclasses MUST implement chain interactions: signature recovery, balance
12
- * check, transaction broadcast. The base provides defaults that return
13
- * `null` / `false` so non-fully-implemented mechanisms remain visible at
14
- * the structural level but don't pretend to verify on-chain state.
11
+ * Subclasses ONLY need to override:
12
+ * - `settlePaymentOnly()` chain-specific contract call dispatch (TRON
13
+ * triggerSmartContract vs EVM viem writeContract)
15
14
  */
16
- import { SCHEME_EXACT } from './types.js';
15
+ import { findByAddress } from '../../tokens.js';
16
+ import { SCHEME_EXACT, TRANSFER_AUTH_EIP712_TYPES, TRANSFER_AUTH_PRIMARY_TYPE, } from './types.js';
17
+ const FEE_QUOTE_EXPIRY_SECONDS = 300;
18
+ function hexToBytes(hex) {
19
+ const clean = hex.startsWith('0x') ? hex.slice(2) : hex;
20
+ const out = new Uint8Array(clean.length / 2);
21
+ for (let i = 0; i < out.length; i++) {
22
+ out[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16);
23
+ }
24
+ return out;
25
+ }
17
26
  export class ExactBaseFacilitatorMechanism {
27
+ signer;
18
28
  adapter;
19
- constructor(adapter) {
29
+ allowedTokens;
30
+ constructor(signer, adapter, options = {}) {
31
+ this.signer = signer;
20
32
  this.adapter = adapter;
33
+ this.allowedTokens = options.allowedTokens
34
+ ? new Set(options.allowedTokens.map((t) => adapter.normalizeAddress(t)))
35
+ : null;
21
36
  }
22
37
  scheme() {
23
38
  return SCHEME_EXACT;
24
39
  }
25
40
  /**
26
- * `exact` scheme has no facilitator fee return `null` to drop from the
27
- * supported quote list. Permit-based schemes override this.
41
+ * `exact` scheme has no facilitator fee (single transfer per authorization).
42
+ * Returns `feeAmount: "0"` for compatibility with the `/fee/quote` flow.
28
43
  */
29
- async feeQuote(_accept, _context) {
30
- return null;
44
+ async feeQuote(accept, _context) {
45
+ return {
46
+ fee: { feeTo: this.signer.getAddress(), feeAmount: '0' },
47
+ pricing: 'flat',
48
+ scheme: accept.scheme,
49
+ network: accept.network,
50
+ asset: accept.asset,
51
+ expiresAt: Math.floor(Date.now() / 1000) + FEE_QUOTE_EXPIRY_SECONDS,
52
+ };
31
53
  }
32
54
  /**
33
- * Off-chain verification: structural + timing checks. Chain-specific
34
- * subclasses extend this to add signature recovery and balance check.
55
+ * Off-chain verify: structural + timing checks, then EIP-712 signature
56
+ * recovery against the token's ERC-3009 domain.
35
57
  */
36
58
  async verify(payload, requirements) {
37
- const authorization = this.extractAuthorization(payload);
38
- if (!authorization) {
39
- return { isValid: false, invalidReason: 'missing_authorization' };
59
+ const auth = this.extractAuthorization(payload);
60
+ if (!auth) {
61
+ return { isValid: false, invalidReason: 'missing_transfer_authorization' };
62
+ }
63
+ const validationError = this.validateAuthorization(auth, requirements);
64
+ if (validationError) {
65
+ return { isValid: false, invalidReason: validationError };
40
66
  }
41
- // Validate basic structural correctness
42
- if (String(authorization.to).toLowerCase() !== String(requirements.payTo).toLowerCase()) {
43
- return { isValid: false, invalidReason: 'payTo_mismatch' };
67
+ const validSig = await this.verifySignature(auth, payload.payload.signature, requirements);
68
+ if (!validSig) {
69
+ return { isValid: false, invalidReason: 'invalid_signature' };
44
70
  }
71
+ return { isValid: true };
72
+ }
73
+ /**
74
+ * Settle: verify, then submit `transferWithAuthorization(v,r,s)` via the
75
+ * subclass-provided `settlePaymentOnly`, then poll the receipt.
76
+ */
77
+ async settle(payload, requirements) {
78
+ const verifyResult = await this.verify(payload, requirements);
79
+ if (!verifyResult.isValid) {
80
+ return {
81
+ success: false,
82
+ network: requirements.network,
83
+ errorReason: verifyResult.invalidReason,
84
+ };
85
+ }
86
+ const auth = this.extractAuthorization(payload);
87
+ const signature = payload.payload.signature;
88
+ let txHash;
45
89
  try {
46
- if (BigInt(authorization.value) < BigInt(requirements.amount)) {
47
- return { isValid: false, invalidReason: 'amount_too_low' };
90
+ txHash = await this.settlePaymentOnly(auth, signature, requirements);
91
+ }
92
+ catch (err) {
93
+ return {
94
+ success: false,
95
+ network: requirements.network,
96
+ errorReason: `settle_error: ${err instanceof Error ? err.message : String(err)}`,
97
+ };
98
+ }
99
+ if (!txHash) {
100
+ return {
101
+ success: false,
102
+ network: requirements.network,
103
+ errorReason: 'transaction_failed',
104
+ };
105
+ }
106
+ try {
107
+ const receipt = await this.signer.waitForTransactionReceipt(txHash, requirements.network);
108
+ if (receipt.status !== 'confirmed') {
109
+ return {
110
+ success: false,
111
+ network: requirements.network,
112
+ transaction: txHash,
113
+ errorReason: 'transaction_failed_on_chain',
114
+ };
115
+ }
116
+ }
117
+ catch (err) {
118
+ return {
119
+ success: false,
120
+ network: requirements.network,
121
+ transaction: txHash,
122
+ errorReason: `receipt_timeout: ${err instanceof Error ? err.message : String(err)}`,
123
+ };
124
+ }
125
+ return {
126
+ success: true,
127
+ network: requirements.network,
128
+ transaction: txHash,
129
+ };
130
+ }
131
+ // -------------------------------------------------------------------------
132
+ // Protected helpers
133
+ // -------------------------------------------------------------------------
134
+ validateAuthorization(auth, requirements) {
135
+ const norm = (s) => this.adapter.normalizeAddress(s);
136
+ if (this.allowedTokens !== null &&
137
+ !this.allowedTokens.has(norm(requirements.asset))) {
138
+ return 'token_not_allowed';
139
+ }
140
+ try {
141
+ if (BigInt(auth.value) < BigInt(requirements.amount)) {
142
+ return 'amount_mismatch';
48
143
  }
49
144
  }
50
145
  catch {
51
- return { isValid: false, invalidReason: 'invalid_value' };
146
+ return 'invalid_value';
147
+ }
148
+ if (norm(auth.to) !== norm(requirements.payTo)) {
149
+ return 'payto_mismatch';
52
150
  }
53
- // Validate time window
54
151
  const now = Math.floor(Date.now() / 1000);
55
152
  try {
56
- if (BigInt(String(authorization.validBefore ?? '0')) < BigInt(now)) {
57
- return { isValid: false, invalidReason: 'expired' };
58
- }
59
- if (BigInt(String(authorization.validAfter ?? now)) > BigInt(now)) {
60
- return { isValid: false, invalidReason: 'not_yet_valid' };
61
- }
153
+ if (BigInt(auth.validBefore) < BigInt(now))
154
+ return 'expired';
155
+ if (BigInt(auth.validAfter) > BigInt(now))
156
+ return 'not_yet_valid';
62
157
  }
63
158
  catch {
64
- return { isValid: false, invalidReason: 'invalid_time_window' };
159
+ return 'invalid_time_window';
65
160
  }
66
- // Chain-specific signature + balance check (overridable)
67
- const sigResult = await this.verifySignatureOnChain(payload, requirements);
68
- if (!sigResult.isValid)
69
- return sigResult;
70
- return { isValid: true };
161
+ return null;
71
162
  }
72
163
  /**
73
- * Chain-specific signature recovery + balance check. Default returns
74
- * `isValid: true` (trust upstream); subclasses MUST override for real
75
- * signature verification. Marked protected so subclass can call super.
164
+ * Verify the buyer's ERC-3009 EIP-712 signature against the token's domain.
165
+ *
166
+ * Domain shape (ERC-3009): `{ name, version, chainId, verifyingContract: <token> }`.
167
+ * Token name / version come from the SDK token registry; addresses are
168
+ * converted to signing format (0x EVM hex) for both EVM and TRON.
76
169
  */
77
- async verifySignatureOnChain(_payload, _requirements) {
78
- return { isValid: true };
170
+ async verifySignature(auth, signature, requirements) {
171
+ const adapter = this.adapter;
172
+ const chainId = adapter.parseChainId(requirements.network);
173
+ const tokenInfo = findByAddress(requirements.network, requirements.asset);
174
+ const tokenName = tokenInfo?.name ?? 'Unknown Token';
175
+ const tokenVersion = tokenInfo?.version ?? '1';
176
+ const domain = {
177
+ name: tokenName,
178
+ version: tokenVersion,
179
+ chainId,
180
+ verifyingContract: adapter.toSigningAddress(requirements.asset),
181
+ };
182
+ const message = {
183
+ from: adapter.toSigningAddress(auth.from),
184
+ to: adapter.toSigningAddress(auth.to),
185
+ value: BigInt(auth.value),
186
+ validAfter: BigInt(auth.validAfter),
187
+ validBefore: BigInt(auth.validBefore),
188
+ // viem accepts hex string for bytes32 types
189
+ nonce: auth.nonce.startsWith('0x') ? auth.nonce : `0x${auth.nonce}`,
190
+ };
191
+ return this.signer.verifyTypedData(adapter.toSigningAddress(auth.from), domain, TRANSFER_AUTH_EIP712_TYPES, message, signature, TRANSFER_AUTH_PRIMARY_TYPE);
192
+ }
193
+ /**
194
+ * Split a 65-byte signature into v / r / s for the (v, r, s) variant of
195
+ * `transferWithAuthorization`. v is normalized to 27 or 28 (some signers
196
+ * return 0 / 1).
197
+ */
198
+ splitSignature(signature) {
199
+ const sigBytes = hexToBytes(signature);
200
+ if (sigBytes.length !== 65) {
201
+ throw new Error(`Invalid signature length: ${sigBytes.length}`);
202
+ }
203
+ const r = '0x' +
204
+ Array.from(sigBytes.slice(0, 32))
205
+ .map((b) => b.toString(16).padStart(2, '0'))
206
+ .join('');
207
+ const s = '0x' +
208
+ Array.from(sigBytes.slice(32, 64))
209
+ .map((b) => b.toString(16).padStart(2, '0'))
210
+ .join('');
211
+ let v = sigBytes[64];
212
+ if (v < 27)
213
+ v += 27;
214
+ return { v, r: r, s: s };
79
215
  }
80
216
  extractAuthorization(payload) {
81
217
  if (payload.payload.authorization)
@@ -1 +1 @@
1
- {"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../../src/mechanisms/_exact_base/facilitator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../../src/mechanisms/_exact_base/facilitator.ts"],"names":[],"mappings":"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"}
@@ -2,43 +2,115 @@
2
2
  * Shared base for `exact_permit` scheme facilitator mechanisms.
3
3
  *
4
4
  * Mirrors Python `mechanisms._exact_permit_base.facilitator.BaseExactPermitFacilitatorMechanism`.
5
+ *
6
+ * Subclasses override:
7
+ * - {@link getAddressConverter} — chain-specific address normalization
8
+ * - {@link settlePaymentOnly} — chain-specific contract call (PaymentPermit.permitTransferFrom)
5
9
  */
10
+ import { FacilitatorSigner } from '../../signers/facilitator/base.js';
6
11
  import type { FacilitatorMechanism } from '../../facilitator/x402Facilitator.js';
7
- import type { FeeQuoteResponse, PaymentPayload, PaymentRequirements, SettleResponse, VerifyResponse } from '../../types/index.js';
12
+ import type { FeeQuoteResponse, PaymentPayload, PaymentPermit, PaymentRequirements, SettleResponse, VerifyResponse } from '../../types/index.js';
13
+ import type { AddressConverter } from '../../address.js';
8
14
  /** Fee policy used by `feeQuote`. */
9
15
  export interface BaseExactPermitFee {
10
- /** Address that collects the facilitator fee. */
11
- feeTo: string;
16
+ /**
17
+ * Address that collects the facilitator fee. Defaults to
18
+ * `signer.getAddress()` when undefined.
19
+ */
20
+ feeTo?: string;
12
21
  /** Optional caller address that the on-chain contract requires. */
13
22
  caller?: string;
14
23
  /**
15
- * Base fee in smallest unit, keyed by `${network}:${tokenAddress}`. Tokens
16
- * not in this map use {@link defaultBaseFee}.
24
+ * Per-symbol base fee (smallest unit string). Token symbol is uppercased
25
+ * before lookup. Tokens not in this map are rejected by `fee_quote` and
26
+ * `_validate_permit`.
27
+ */
28
+ baseFee?: Record<string, string>;
29
+ /**
30
+ * Optional token allowlist (lowercased addresses). If set, only tokens
31
+ * in this set are accepted; otherwise all tokens pass the address check.
17
32
  */
18
- baseFeesByToken?: Record<string, string>;
19
- /** Fallback fee when no per-token entry matches. Default `"0"`. */
20
- defaultBaseFee?: string;
33
+ allowedTokens?: ReadonlyArray<string>;
21
34
  }
35
+ /**
36
+ * Tuple shape passed to `triggerSmartContract` (TRON) or `writeContract` (EVM)
37
+ * for `PaymentPermit.permitTransferFrom`. Matches the on-chain ABI tuple.
38
+ */
39
+ export type PermitTuple = [
40
+ [
41
+ number,
42
+ `0x${string}`,
43
+ string,
44
+ number,
45
+ number
46
+ ],
47
+ string,
48
+ string,
49
+ [
50
+ string,
51
+ string,
52
+ string
53
+ ],
54
+ [
55
+ string,
56
+ string
57
+ ]
58
+ ];
22
59
  export declare abstract class BaseExactPermitFacilitatorMechanism implements FacilitatorMechanism {
23
- protected readonly fee: BaseExactPermitFee;
24
- constructor(fee: BaseExactPermitFee);
60
+ protected readonly signer: FacilitatorSigner;
61
+ protected readonly feeTo: string;
62
+ protected readonly caller: string;
63
+ protected readonly baseFeeMap: Record<string, bigint>;
64
+ protected readonly allowedTokens: ReadonlySet<string> | null;
65
+ protected readonly addressConverter: AddressConverter;
66
+ constructor(signer: FacilitatorSigner, fee?: BaseExactPermitFee);
25
67
  scheme(): string;
68
+ /** Chain-specific address converter. */
69
+ protected abstract getAddressConverter(): AddressConverter;
70
+ /**
71
+ * Look up base fee for a token by symbol. Returns `null` if the token is
72
+ * not registered in the SDK token registry or the symbol has no entry
73
+ * in `baseFeeMap`.
74
+ */
75
+ protected getBaseFee(tokenAddress: string, network: string): bigint | null;
26
76
  feeQuote(accept: PaymentRequirements, _context?: Record<string, unknown>): Promise<FeeQuoteResponse | null>;
27
77
  /**
28
- * Off-chain verify path: structural checks live here, signature + balance
29
- * + nonce + on-chain state checks go in subclass.
78
+ * Off-chain verify path: structural + fee + signature checks.
30
79
  */
31
80
  verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>;
32
81
  /**
33
- * Chain-specific on-chain verification. Default: trust upstream
34
- * (returns `isValid: true`). Subclasses MUST override for real
35
- * signature recovery + balance + nonce checks.
82
+ * Settle the permit on-chain: verify, then submit via subclass
83
+ * `settlePaymentOnly`, then poll the receipt.
84
+ */
85
+ settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>;
86
+ /**
87
+ * Structural + fee validation. Returns the error reason string, or `null`
88
+ * if valid.
89
+ */
90
+ protected validatePermit(permit: PaymentPermit, requirements: PaymentRequirements): string | null;
91
+ /**
92
+ * Verify the buyer's EIP-712 / TIP-712 signature against the permit.
93
+ *
94
+ * Build the message in the exact shape the buyer signed:
95
+ * - `kind` as numeric (0 for PAYMENT_ONLY)
96
+ * - `paymentId` as hex string (bytes16 — viem accepts hex)
97
+ * - `nonce` / amounts as BigInt strings
98
+ * - all addresses converted to 0x EVM hex (required for TRON TIP-712)
99
+ */
100
+ protected verifySignature(permit: PaymentPermit, signature: string, network: string): Promise<boolean>;
101
+ /**
102
+ * Build the tuple passed to `permitTransferFrom(permit, owner, signature)`.
103
+ * Addresses are returned in the chain-canonical format (Base58 for TRON,
104
+ * 0x hex for EVM) since each chain's writer accepts both — let the subclass
105
+ * normalize further if needed.
36
106
  */
37
- protected verifyOnChain(_payload: PaymentPayload, _requirements: PaymentRequirements): Promise<VerifyResponse>;
107
+ protected buildPermitTuple(permit: PaymentPermit): PermitTuple;
38
108
  /**
39
- * Submit the permit on-chain. Chain-specific — subclasses MUST implement
40
- * via viem (EVM) / tronweb (TRON).
109
+ * Submit the permit on-chain. Chain-specific — subclasses MUST implement.
110
+ *
111
+ * Returns the tx hash on broadcast success, or `null` on failure (the base
112
+ * wraps null into a `SettleResponse{ success: false }`).
41
113
  */
42
- abstract settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>;
114
+ protected abstract settlePaymentOnly(permit: PaymentPermit, signature: string, requirements: PaymentRequirements): Promise<string | null>;
43
115
  }
44
116
  //# sourceMappingURL=facilitator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../../src/mechanisms/_exact_permit_base/facilitator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,sBAAsB,CAAC;AAI9B,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8BAAsB,mCAAoC,YAAW,oBAAoB;IAC3E,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAEtD,MAAM,IAAI,MAAM;IAIV,QAAQ,CACZ,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAiBnC;;;OAGG;IACG,MAAM,CACV,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,cAAc,CAAC;IAuB1B;;;;OAIG;cACa,aAAa,CAC3B,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,mBAAmB,GACjC,OAAO,CAAC,cAAc,CAAC;IAI1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CACb,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,cAAc,CAAC;CAC3B"}
1
+ {"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../../src/mechanisms/_exact_permit_base/facilitator.ts"],"names":[],"mappings":"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"}