@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.
- package/dist/abi.d.ts +164 -0
- package/dist/abi.d.ts.map +1 -1
- package/dist/abi.js +115 -0
- package/dist/abi.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mechanisms/_exact_base/facilitator.d.ts +47 -23
- package/dist/mechanisms/_exact_base/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/_exact_base/facilitator.js +179 -43
- package/dist/mechanisms/_exact_base/facilitator.js.map +1 -1
- package/dist/mechanisms/_exact_permit_base/facilitator.d.ts +91 -19
- package/dist/mechanisms/_exact_permit_base/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/_exact_permit_base/facilitator.js +227 -25
- package/dist/mechanisms/_exact_permit_base/facilitator.js.map +1 -1
- package/dist/mechanisms/evm/exact/facilitator.d.ts +12 -13
- package/dist/mechanisms/evm/exact/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/evm/exact/facilitator.js +25 -19
- package/dist/mechanisms/evm/exact/facilitator.js.map +1 -1
- package/dist/mechanisms/evm/exact_permit/facilitator.d.ts +13 -9
- package/dist/mechanisms/evm/exact_permit/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/evm/exact_permit/facilitator.js +41 -13
- package/dist/mechanisms/evm/exact_permit/facilitator.js.map +1 -1
- package/dist/mechanisms/index.d.ts +1 -1
- package/dist/mechanisms/index.d.ts.map +1 -1
- package/dist/mechanisms/tron/exact/facilitator.d.ts +12 -10
- package/dist/mechanisms/tron/exact/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/tron/exact/facilitator.js +37 -16
- package/dist/mechanisms/tron/exact/facilitator.js.map +1 -1
- package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts +20 -29
- package/dist/mechanisms/tron/exact_gasfree/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/tron/exact_gasfree/facilitator.js +176 -38
- package/dist/mechanisms/tron/exact_gasfree/facilitator.js.map +1 -1
- package/dist/mechanisms/tron/exact_gasfree/index.d.ts +1 -1
- package/dist/mechanisms/tron/exact_gasfree/index.d.ts.map +1 -1
- package/dist/mechanisms/tron/exact_permit/facilitator.d.ts +14 -6
- package/dist/mechanisms/tron/exact_permit/facilitator.d.ts.map +1 -1
- package/dist/mechanisms/tron/exact_permit/facilitator.js +82 -11
- package/dist/mechanisms/tron/exact_permit/facilitator.js.map +1 -1
- package/dist/middleware/core.d.ts +13 -1
- package/dist/middleware/core.d.ts.map +1 -1
- package/dist/middleware/core.js +76 -6
- package/dist/middleware/core.js.map +1 -1
- package/dist/signers/facilitator/base.d.ts +67 -0
- package/dist/signers/facilitator/base.d.ts.map +1 -0
- package/dist/signers/facilitator/base.js +11 -0
- package/dist/signers/facilitator/base.js.map +1 -0
- package/dist/signers/facilitator/evmSigner.d.ts +28 -0
- package/dist/signers/facilitator/evmSigner.d.ts.map +1 -0
- package/dist/signers/facilitator/evmSigner.js +148 -0
- package/dist/signers/facilitator/evmSigner.js.map +1 -0
- package/dist/signers/facilitator/tronSigner.d.ts +93 -0
- package/dist/signers/facilitator/tronSigner.d.ts.map +1 -0
- package/dist/signers/facilitator/tronSigner.js +308 -0
- package/dist/signers/facilitator/tronSigner.js.map +1 -0
- package/dist/signers/index.d.ts +4 -0
- package/dist/signers/index.d.ts.map +1 -1
- package/dist/signers/index.js +4 -0
- package/dist/signers/index.js.map +1 -1
- package/dist/utils/gasfree.d.ts +6 -0
- package/dist/utils/gasfree.d.ts.map +1 -1
- package/dist/utils/gasfree.js +10 -0
- package/dist/utils/gasfree.js.map +1 -1
- 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}
|
|
7
|
-
* (
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
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
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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 {
|
|
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
|
-
|
|
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
|
|
27
|
-
*
|
|
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(
|
|
30
|
-
return
|
|
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
|
|
34
|
-
*
|
|
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
|
|
38
|
-
if (!
|
|
39
|
-
return { isValid: false, invalidReason: '
|
|
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
|
-
|
|
42
|
-
if (
|
|
43
|
-
return { isValid: false, invalidReason: '
|
|
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
|
-
|
|
47
|
-
|
|
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
|
|
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(
|
|
57
|
-
return
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
159
|
+
return 'invalid_time_window';
|
|
65
160
|
}
|
|
66
|
-
|
|
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
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
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
|
|
78
|
-
|
|
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":"AAAA
|
|
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
|
-
/**
|
|
11
|
-
|
|
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
|
-
*
|
|
16
|
-
* not in this map
|
|
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
|
-
|
|
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
|
|
24
|
-
|
|
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
|
|
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
|
-
*
|
|
34
|
-
*
|
|
35
|
-
|
|
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
|
|
107
|
+
protected buildPermitTuple(permit: PaymentPermit): PermitTuple;
|
|
38
108
|
/**
|
|
39
|
-
* Submit the permit on-chain. Chain-specific — subclasses MUST implement
|
|
40
|
-
*
|
|
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
|
|
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
|
|
1
|
+
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../../src/mechanisms/_exact_permit_base/facilitator.ts"],"names":[],"mappings":"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"}
|