@keelcodes/sdk 2.2.0 → 2.3.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.
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // UserOp v0.7 构建 / 编码 / 哈希(ERC-4337)
4
+ //
5
+ // callData = Kernel v3 execute(execMode, executionCalldata)(ERC-7579 单调用)
6
+ // userOpHash = viem getUserOperationHash(v0.7 EIP-712,含 chainId 防跨链重放)
7
+ // ---------------------------------------------------------------------------
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.EXECUTE_USER_OP_SELECTOR = void 0;
10
+ exports.encodeExecute = encodeExecute;
11
+ exports.encodeExecuteUserOp = encodeExecuteUserOp;
12
+ exports.buildUserOpWithCallData = buildUserOpWithCallData;
13
+ exports.getUserOpHash = getUserOpHash;
14
+ exports.userOpToRpc = userOpToRpc;
15
+ const viem_1 = require("viem");
16
+ const account_abstraction_1 = require("viem/account-abstraction");
17
+ /** Kernel v3 execute ABI(ERC-7579:execMode + executionCalldata) */
18
+ const KernelV3ExecuteAbi = [
19
+ {
20
+ type: 'function',
21
+ name: 'execute',
22
+ inputs: [
23
+ { name: 'execMode', type: 'bytes32', internalType: 'ExecMode' },
24
+ { name: 'executionCalldata', type: 'bytes', internalType: 'bytes' },
25
+ ],
26
+ outputs: [],
27
+ stateMutability: 'payable',
28
+ },
29
+ ];
30
+ /** DEFAULT execMode(root / call / no-revert-on-error)→ 全零 bytes32 */
31
+ const DEFAULT_EXEC_MODE = '0x0000000000000000000000000000000000000000000000000000000000000000';
32
+ /** 编码 Kernel v3 单调用 callData:executionCalldata = target ‖ value(32B) ‖ data */
33
+ function encodeExecute(target, value, data) {
34
+ return (0, viem_1.encodeFunctionData)({
35
+ abi: KernelV3ExecuteAbi,
36
+ functionName: 'execute',
37
+ args: [DEFAULT_EXEC_MODE, (0, viem_1.concatHex)([target, (0, viem_1.toHex)(value ?? 0n, { size: 32 }), data ?? '0x'])],
38
+ });
39
+ }
40
+ /**
41
+ * IAccountExecute.executeUserOp selector(ERC-4337 v0.7)。
42
+ * 挂 KeelPolicyHook 的 session 配置下,Kernel 在验证期强制 callData 以它开头。
43
+ */
44
+ exports.EXECUTE_USER_OP_SELECTOR = '0x8dd7712f';
45
+ /** 外层包装:executeUserOp.selector ‖ execute(...)(Route C / 挂真 hook 时必需) */
46
+ function encodeExecuteUserOp(executeCallData) {
47
+ return (0, viem_1.concatHex)([exports.EXECUTE_USER_OP_SELECTOR, executeCallData]);
48
+ }
49
+ /** 以已编码 callData 构建 UserOp v0.7(未签名)。 */
50
+ function buildUserOpWithCallData(params) {
51
+ return {
52
+ sender: params.sender,
53
+ nonce: params.nonce,
54
+ factory: params.factory,
55
+ factoryData: params.factoryData,
56
+ callData: params.callData,
57
+ callGasLimit: params.gas?.callGasLimit ?? 0n,
58
+ verificationGasLimit: params.gas?.verificationGasLimit ?? 0n,
59
+ preVerificationGas: params.gas?.preVerificationGas ?? 0n,
60
+ maxFeePerGas: params.gas?.maxFeePerGas ?? 0n,
61
+ maxPriorityFeePerGas: params.gas?.maxPriorityFeePerGas ?? 0n,
62
+ signature: '0x',
63
+ };
64
+ }
65
+ /** EIP-712 userOpHash(v0.7 标准,含 chainId)。 */
66
+ function getUserOpHash(op, entryPoint, chainId) {
67
+ return (0, account_abstraction_1.getUserOperationHash)({
68
+ chainId,
69
+ entryPointAddress: entryPoint,
70
+ entryPointVersion: '0.7',
71
+ userOperation: op,
72
+ });
73
+ }
74
+ /** UserOp v0.7 → bundler RPC 参数(bigint → hex;paymaster 字段缺省剔除)。 */
75
+ function userOpToRpc(op) {
76
+ const rpc = {
77
+ sender: op.sender,
78
+ nonce: (0, viem_1.toHex)(op.nonce),
79
+ factory: op.factory,
80
+ factoryData: op.factoryData,
81
+ callData: op.callData,
82
+ callGasLimit: (0, viem_1.toHex)(op.callGasLimit),
83
+ verificationGasLimit: (0, viem_1.toHex)(op.verificationGasLimit),
84
+ preVerificationGas: (0, viem_1.toHex)(op.preVerificationGas),
85
+ maxFeePerGas: (0, viem_1.toHex)(op.maxFeePerGas),
86
+ maxPriorityFeePerGas: (0, viem_1.toHex)(op.maxPriorityFeePerGas),
87
+ signature: op.signature,
88
+ };
89
+ if (op.paymaster) {
90
+ rpc.paymaster = op.paymaster;
91
+ if (op.paymasterVerificationGasLimit !== undefined) {
92
+ rpc.paymasterVerificationGasLimit = (0, viem_1.toHex)(op.paymasterVerificationGasLimit);
93
+ }
94
+ if (op.paymasterPostOpGasLimit !== undefined) {
95
+ rpc.paymasterPostOpGasLimit = (0, viem_1.toHex)(op.paymasterPostOpGasLimit);
96
+ }
97
+ rpc.paymasterData = op.paymasterData;
98
+ }
99
+ return rpc;
100
+ }
@@ -0,0 +1,96 @@
1
+ import { type Address, type Hex } from 'viem';
2
+ import type { BundlerLike, ChainAAConfig, SessionPolicy, Signer, UserOperationV7 } from './types';
3
+ import { type X402Accept, type X402Payment, type X402PaymentPayload, type X402PaymentRequired, type X402TypedData } from './x402';
4
+ /** Kernel 包装结构类型哈希:`Kernel(bytes32 hash)` */
5
+ export declare const KERNEL_WRAPPER_TYPE_HASH: Hex;
6
+ /** Kernel EIP-712 domain */
7
+ export declare const KERNEL_DOMAIN_NAME = "Kernel";
8
+ export declare const KERNEL_DOMAIN_VERSION = "0.3.1";
9
+ /**
10
+ * Kernel ERC-1271 包装摘要:与 `Kernel._toWrappedHash` 完全一致
11
+ * (domain = Kernel/0.3.1/chainId/account)。
12
+ */
13
+ export declare function kernelWrappedDigest(args: {
14
+ account: Address;
15
+ chainId: number;
16
+ digest: Hex;
17
+ kernelVersion?: string;
18
+ }): Hex;
19
+ /**
20
+ * session key 在 ERC-1271 场景要签的摘要:
21
+ * keccak256(kernelWrapped(x402Digest) ‖ keccak256(policyData))
22
+ * —— 与 `KeelSessionValidator.isValidSignatureWithSender` 逐字节一致。
23
+ */
24
+ export declare function sessionX402Digest(args: {
25
+ typed: X402TypedData;
26
+ account: Address;
27
+ chainId: number;
28
+ policy: SessionPolicy;
29
+ kernelVersion?: string;
30
+ }): Hex;
31
+ export interface SignX402WithSessionParams {
32
+ /** x402 待签结构(由 {@link buildX402TypedData} 生成) */
33
+ typed: X402TypedData;
34
+ chainConfig: ChainAAConfig;
35
+ account: Address;
36
+ policy: SessionPolicy;
37
+ /** session validator 副本 slot(一 key 一副本) */
38
+ slot: number;
39
+ /** session key(客户端自持) */
40
+ sessionSigner: Signer;
41
+ }
42
+ /**
43
+ * 产出可直接放进 x402 `payload.signature` 的 ERC-1271 签名:
44
+ * `0x01 ‖ validator ‖ sessionId ‖ policyData ‖ sessionKeySig`
45
+ */
46
+ export declare function signX402WithSession(p: SignX402WithSessionParams): Promise<Hex>;
47
+ export interface PayX402WithSessionParams {
48
+ challenge: X402PaymentRequired;
49
+ /** 指定 accept;缺省按 `token` 自动匹配(只接受稳定币) */
50
+ accept?: X402Accept;
51
+ chainConfig: ChainAAConfig;
52
+ account: Address;
53
+ policy: SessionPolicy;
54
+ slot: number;
55
+ sessionSigner: Signer;
56
+ /** 查询 nonce(viem PublicClient 可直接传入) */
57
+ publicClient: {
58
+ readContract: (args: any) => Promise<unknown>;
59
+ };
60
+ bundler: BundlerLike;
61
+ /** KeelTokenPaymaster:gas 由它垫付,按 token 向账户结算 */
62
+ paymaster: {
63
+ address: Address;
64
+ token: Address;
65
+ /** 客户端自报价(可选,只有比链上价更保守才生效) */
66
+ clientPrice?: bigint;
67
+ validationGasLimit?: bigint;
68
+ postOpGasLimit?: bigint;
69
+ };
70
+ /** EIP-1559 费用(调用方按链取实时值;BSC 必须给非零 tip) */
71
+ maxFeePerGas: bigint;
72
+ maxPriorityFeePerGas: bigint;
73
+ /** agent 通道号(nonceKey 隔离并发 agent),缺省 0 */
74
+ agentIndex?: number;
75
+ method?: string;
76
+ url?: string;
77
+ salt?: Hex;
78
+ }
79
+ export interface PayX402WithSessionResult {
80
+ /** 可直接写入 `PAYMENT-SIGNATURE` 头 */
81
+ header: string;
82
+ payload: X402PaymentPayload;
83
+ /** 链上付款交易哈希(= payload.payload.txHash) */
84
+ txHash: Hex;
85
+ userOpHash: Hex;
86
+ payment: X402Payment;
87
+ userOp: UserOperationV7;
88
+ accept: X402Accept;
89
+ }
90
+ /**
91
+ * 一次完成「链上付款 + gas 垫付 + x402 凭证签名」。
92
+ *
93
+ * 流程:session key 签 UserOp(ERC-20 transfer → payTo,paymaster 计费)
94
+ * → bundler 广播并等待收据 → 组 x402 payload → session key 产 ERC-1271 签名。
95
+ */
96
+ export declare function payX402WithSession(p: PayX402WithSessionParams): Promise<PayX402WithSessionResult>;
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // x402 + Keel session 整合:agent 自主付款 + paymaster 垫付 gas
4
+ //
5
+ // 闭环:
6
+ // 1. agent 用 session key 签一笔 UserOp:ERC-20 transfer → x402 payTo
7
+ // 2. 同一笔 UserOp 由 KeelTokenPaymaster 计费(gas 从 paymaster deposit 垫付,
8
+ // 账户以同一 token 结算)——零 native
9
+ // 3. 上链后 session key 再产一份 ERC-1271 签名,作为 x402 `PAYMENT-SIGNATURE`
10
+ // (服务端用 `Kernel.isValidSignature` 校验,返回 0x1626ba7e)
11
+ //
12
+ // 签名布局:
13
+ // UserOp.signature = sessionId(32B) ‖ policyData ‖ agentSig(65B)
14
+ // ERC-1271 sig = 0x01 ‖ validator(20B) ‖ sessionId(32B) ‖ policyData ‖ agentSig(65B)
15
+ // ---------------------------------------------------------------------------
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.KERNEL_DOMAIN_VERSION = exports.KERNEL_DOMAIN_NAME = exports.KERNEL_WRAPPER_TYPE_HASH = void 0;
18
+ exports.kernelWrappedDigest = kernelWrappedDigest;
19
+ exports.sessionX402Digest = sessionX402Digest;
20
+ exports.signX402WithSession = signX402WithSession;
21
+ exports.payX402WithSession = payX402WithSession;
22
+ const viem_1 = require("viem");
23
+ const keel_session_1 = require("./keel-session");
24
+ const nonce_1 = require("./nonce");
25
+ const token_paymaster_1 = require("./token-paymaster");
26
+ const userop_1 = require("./userop");
27
+ const x402_1 = require("./x402");
28
+ /** Kernel 包装结构类型哈希:`Kernel(bytes32 hash)` */
29
+ exports.KERNEL_WRAPPER_TYPE_HASH = '0x1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c83';
30
+ /** Kernel EIP-712 domain */
31
+ exports.KERNEL_DOMAIN_NAME = 'Kernel';
32
+ exports.KERNEL_DOMAIN_VERSION = '0.3.1';
33
+ /** VALIDATION_TYPE_VALIDATOR:ERC-1271 签名首字节 */
34
+ const VALIDATION_TYPE_VALIDATOR_PREFIX = '0x01';
35
+ const ENTRYPOINT_NONCE_ABI = (0, viem_1.parseAbi)([
36
+ 'function getNonce(address sender, uint192 key) view returns (uint256)',
37
+ ]);
38
+ /**
39
+ * 估算前的占位 gas 上限。
40
+ * ⚠️ 不能开太大:token paymaster 在 validation 阶段按
41
+ * `maxFeePerGas × 全部 gas 上限` **预扣** token(postOp 退差),
42
+ * ETH 主网上一笔 2M/1.2M 的占位就能预扣 ~2.4 USDC,小额账户直接 AA33。
43
+ * 真实用量 ~300k,这里 800k/600k 已留足余量。
44
+ */
45
+ const DEFAULT_OP_GAS = {
46
+ callGasLimit: 800000n,
47
+ verificationGasLimit: 600000n,
48
+ preVerificationGas: 100000n,
49
+ };
50
+ /** paymaster 两段 gas 上限默认值;postOp 必须 ≥ refundPostopCost(40000) */
51
+ const DEFAULT_PAYMASTER_GAS = {
52
+ paymasterVerificationGasLimit: 200000n,
53
+ paymasterPostOpGasLimit: 60000n,
54
+ };
55
+ /**
56
+ * Kernel ERC-1271 包装摘要:与 `Kernel._toWrappedHash` 完全一致
57
+ * (domain = Kernel/0.3.1/chainId/account)。
58
+ */
59
+ function kernelWrappedDigest(args) {
60
+ return (0, viem_1.hashTypedData)({
61
+ domain: {
62
+ name: exports.KERNEL_DOMAIN_NAME,
63
+ version: args.kernelVersion ?? exports.KERNEL_DOMAIN_VERSION,
64
+ chainId: args.chainId,
65
+ verifyingContract: args.account,
66
+ },
67
+ types: { Kernel: [{ name: 'hash', type: 'bytes32' }] },
68
+ primaryType: 'Kernel',
69
+ message: { hash: args.digest },
70
+ });
71
+ }
72
+ /**
73
+ * session key 在 ERC-1271 场景要签的摘要:
74
+ * keccak256(kernelWrapped(x402Digest) ‖ keccak256(policyData))
75
+ * —— 与 `KeelSessionValidator.isValidSignatureWithSender` 逐字节一致。
76
+ */
77
+ function sessionX402Digest(args) {
78
+ const x402Digest = (0, viem_1.hashTypedData)(args.typed);
79
+ const wrapped = kernelWrappedDigest({
80
+ account: args.account,
81
+ chainId: args.chainId,
82
+ digest: x402Digest,
83
+ kernelVersion: args.kernelVersion,
84
+ });
85
+ return (0, viem_1.keccak256)((0, viem_1.concatHex)([wrapped, (0, viem_1.keccak256)((0, keel_session_1.encodeKeelPolicyData)(args.policy))]));
86
+ }
87
+ /**
88
+ * 产出可直接放进 x402 `payload.signature` 的 ERC-1271 签名:
89
+ * `0x01 ‖ validator ‖ sessionId ‖ policyData ‖ sessionKeySig`
90
+ */
91
+ async function signX402WithSession(p) {
92
+ const validator = (0, keel_session_1.resolveKeelValidator)(p.chainConfig, p.slot);
93
+ const policyData = (0, keel_session_1.encodeKeelPolicyData)(p.policy);
94
+ const digest = sessionX402Digest({
95
+ typed: p.typed,
96
+ account: p.account,
97
+ chainId: p.chainConfig.chainId,
98
+ policy: p.policy,
99
+ kernelVersion: p.chainConfig.kernelVersion,
100
+ });
101
+ const sig = await p.sessionSigner.signUserOp(digest);
102
+ return (0, viem_1.concatHex)([
103
+ VALIDATION_TYPE_VALIDATOR_PREFIX,
104
+ validator,
105
+ (0, keel_session_1.toBytes32)(p.policy.sessionId),
106
+ policyData,
107
+ sig,
108
+ ]);
109
+ }
110
+ /**
111
+ * 一次完成「链上付款 + gas 垫付 + x402 凭证签名」。
112
+ *
113
+ * 流程:session key 签 UserOp(ERC-20 transfer → payTo,paymaster 计费)
114
+ * → bundler 广播并等待收据 → 组 x402 payload → session key 产 ERC-1271 签名。
115
+ */
116
+ async function payX402WithSession(p) {
117
+ const accept = p.accept ??
118
+ (0, x402_1.selectX402Accept)(p.challenge, {
119
+ asset: p.paymaster.token,
120
+ network: `eip155:${p.chainConfig.chainId}`,
121
+ });
122
+ const payment = (0, x402_1.buildX402Payment)(accept);
123
+ const validator = (0, keel_session_1.resolveKeelValidator)(p.chainConfig, p.slot);
124
+ const nonceKey = (0, nonce_1.validatorNonceKey)(validator, p.agentIndex ?? 0);
125
+ const nonce = (await p.publicClient.readContract({
126
+ address: p.chainConfig.entryPoint,
127
+ abi: ENTRYPOINT_NONCE_ABI,
128
+ functionName: 'getNonce',
129
+ args: [p.account, nonceKey],
130
+ }));
131
+ const paymasterGas = {
132
+ paymasterVerificationGasLimit: p.paymaster.validationGasLimit ?? DEFAULT_PAYMASTER_GAS.paymasterVerificationGasLimit,
133
+ paymasterPostOpGasLimit: p.paymaster.postOpGasLimit ?? DEFAULT_PAYMASTER_GAS.paymasterPostOpGasLimit,
134
+ };
135
+ /** 构建未签名 session op(paymaster 字段必须在签名前就位:userOpHash 覆盖它们) */
136
+ const buildOp = (gas) => ({
137
+ ...(0, userop_1.buildUserOpWithCallData)({
138
+ sender: p.account,
139
+ nonce,
140
+ callData: (0, userop_1.encodeExecuteUserOp)((0, userop_1.encodeExecute)(payment.to, payment.value, payment.data)),
141
+ gas: {
142
+ ...gas,
143
+ maxFeePerGas: p.maxFeePerGas,
144
+ maxPriorityFeePerGas: p.maxPriorityFeePerGas,
145
+ },
146
+ }),
147
+ paymaster: p.paymaster.address,
148
+ paymasterData: (0, token_paymaster_1.buildTokenPaymasterData)({
149
+ token: p.paymaster.token,
150
+ clientPrice: p.paymaster.clientPrice,
151
+ }),
152
+ ...paymasterGas,
153
+ });
154
+ const policyData = (0, keel_session_1.encodeKeelPolicyData)(p.policy);
155
+ const signOp = async (op) => {
156
+ const hash = (0, userop_1.getUserOpHash)(op, p.chainConfig.entryPoint, p.chainConfig.chainId);
157
+ const sig = await p.sessionSigner.signUserOp((0, keel_session_1.keelSessionDigest)(hash, policyData));
158
+ return {
159
+ ...op,
160
+ signature: (0, keel_session_1.encodeKeelSessionSignature)({ sessionId: p.policy.sessionId, policyData, sig }),
161
+ };
162
+ };
163
+ // 估算必须先签名(bundler 会跑真实验证),因此用占位 gas 签一次
164
+ const probe = await signOp(buildOp(DEFAULT_OP_GAS));
165
+ const est = await p.bundler.estimateUserOperationGas(probe);
166
+ const op = await signOp(buildOp({
167
+ callGasLimit: est.callGasLimit ?? DEFAULT_OP_GAS.callGasLimit,
168
+ verificationGasLimit: est.verificationGasLimit ?? DEFAULT_OP_GAS.verificationGasLimit,
169
+ preVerificationGas: est.preVerificationGas ?? DEFAULT_OP_GAS.preVerificationGas,
170
+ }));
171
+ const sent = await p.bundler.sendUserOperation(op);
172
+ if (!sent.receipt?.success) {
173
+ throw new Error(`[keel-sdk] x402 payment UserOp failed (hash ${sent.userOpHash}): ${JSON.stringify(sent.receipt)}`);
174
+ }
175
+ const txHash = sent.receipt.txHash;
176
+ if (!txHash)
177
+ throw new Error('[keel-sdk] bundler receipt has no transactionHash');
178
+ const unsigned = (0, x402_1.buildX402Payload)({
179
+ challenge: p.challenge,
180
+ accepted: accept,
181
+ txHash,
182
+ method: p.method,
183
+ url: p.url,
184
+ salt: p.salt,
185
+ });
186
+ unsigned.signature = await signX402WithSession({
187
+ typed: (0, x402_1.buildX402TypedData)(unsigned),
188
+ chainConfig: p.chainConfig,
189
+ account: p.account,
190
+ policy: p.policy,
191
+ slot: p.slot,
192
+ sessionSigner: p.sessionSigner,
193
+ });
194
+ return {
195
+ header: (0, x402_1.encodePaymentSignature)(unsigned),
196
+ payload: unsigned,
197
+ txHash,
198
+ userOpHash: sent.userOpHash,
199
+ payment,
200
+ userOp: op,
201
+ accept,
202
+ };
203
+ }
@@ -0,0 +1,144 @@
1
+ import { type Address, type Hex } from 'viem';
2
+ export interface X402Accept {
3
+ scheme: 'exact' | 'upto';
4
+ network: string;
5
+ amount: string;
6
+ asset: string;
7
+ payTo: string;
8
+ maxTimeoutSeconds: number;
9
+ extra?: Record<string, unknown>;
10
+ }
11
+ export interface X402ResourceInfo {
12
+ url: string;
13
+ description?: string;
14
+ mimeType?: string;
15
+ }
16
+ export interface X402PaymentRequired {
17
+ x402Version: 2;
18
+ error?: string;
19
+ resource?: X402ResourceInfo;
20
+ accepts: X402Accept[];
21
+ extensions?: Record<string, unknown>;
22
+ }
23
+ export interface X402PaymentPayload {
24
+ x402Version: 2;
25
+ resource?: X402ResourceInfo;
26
+ accepted: X402Accept;
27
+ payload: {
28
+ method: string;
29
+ url: string;
30
+ salt: Hex;
31
+ txHash: Hex;
32
+ };
33
+ extensions?: Record<string, unknown>;
34
+ signature: Hex;
35
+ }
36
+ export interface X402Payment {
37
+ /** 交易目标:native → payTo;token → token 合约 */
38
+ to: Address;
39
+ value: bigint;
40
+ data: Hex;
41
+ /** 计费资产(native 为 0x0 哨兵) */
42
+ asset: Address;
43
+ }
44
+ export interface X402TypedData {
45
+ domain: {
46
+ name: string;
47
+ version: string;
48
+ chainId: number;
49
+ verifyingContract: Address;
50
+ };
51
+ types: {
52
+ Payment: readonly {
53
+ name: string;
54
+ type: string;
55
+ }[];
56
+ };
57
+ primaryType: 'Payment';
58
+ message: Record<string, string>;
59
+ }
60
+ export interface PayX402Params {
61
+ challenge: X402PaymentRequired;
62
+ /** 不传则按 asset/network 自动选第一个可用 accept */
63
+ accept?: X402Accept;
64
+ /** 发起链上付款并返回 txHash */
65
+ sendPayment: (payment: X402Payment) => Promise<Hex>;
66
+ /** EIP-712 签名(EOA 用 walletClient.signTypedData;智能账户用其 1271 签名) */
67
+ signTypedData: (typed: X402TypedData) => Promise<Hex>;
68
+ /** 等 tx 上链(建议传入,避免服务端 verify 时查不到 receipt) */
69
+ waitForTransaction?: (hash: Hex) => Promise<unknown>;
70
+ method?: string;
71
+ url?: string;
72
+ /** 覆盖盐值(默认由 txHash + 时间派生) */
73
+ salt?: Hex;
74
+ }
75
+ export declare const X402_DOMAIN_NAME = "x402";
76
+ export declare const X402_DOMAIN_VERSION = "2";
77
+ export declare const X402_TYPES: {
78
+ readonly Payment: readonly [{
79
+ readonly name: "scheme";
80
+ readonly type: "string";
81
+ }, {
82
+ readonly name: "network";
83
+ readonly type: "string";
84
+ }, {
85
+ readonly name: "amount";
86
+ readonly type: "string";
87
+ }, {
88
+ readonly name: "asset";
89
+ readonly type: "address";
90
+ }, {
91
+ readonly name: "payTo";
92
+ readonly type: "address";
93
+ }, {
94
+ readonly name: "method";
95
+ readonly type: "string";
96
+ }, {
97
+ readonly name: "url";
98
+ readonly type: "string";
99
+ }, {
100
+ readonly name: "salt";
101
+ readonly type: "string";
102
+ }, {
103
+ readonly name: "txHash";
104
+ readonly type: "string";
105
+ }];
106
+ };
107
+ /** 解 `PAYMENT-REQUIRED` 头(base64 或直接 JSON)。 */
108
+ export declare function decodePaymentRequired(header: string): X402PaymentRequired;
109
+ /** 选 accept:优先 exact,其次按传入的 asset / network 过滤。 */
110
+ export declare function selectX402Accept(challenge: X402PaymentRequired, opts?: {
111
+ asset?: string;
112
+ network?: string;
113
+ }): X402Accept;
114
+ /** 按 accept 组装链上付款参数(native 转账或 ERC20 transfer)。 */
115
+ export declare function buildX402Payment(accept: X402Accept): X402Payment;
116
+ /** 构造待签的 EIP-712 结构(必须与 payments 侧逐字段一致)。 */
117
+ export declare function buildX402TypedData(payload: X402PaymentPayload): X402TypedData;
118
+ /**
119
+ * 已有签名时组装 `PAYMENT-SIGNATURE` 头(base64)。
120
+ * 配合 {@link buildX402TypedData} + `wallet.signTypedData` 用于纯 EOA 客户端。
121
+ */
122
+ export declare function encodePaymentSignature(payload: X402PaymentPayload): string;
123
+ /** 由链上付款结果构造未签名的 payload(salt 缺省自动派生)。 */
124
+ export declare function buildX402Payload(args: {
125
+ challenge: X402PaymentRequired;
126
+ accepted: X402Accept;
127
+ txHash: Hex;
128
+ method?: string;
129
+ url?: string;
130
+ salt?: Hex;
131
+ }): X402PaymentPayload;
132
+ /**
133
+ * 完成一次 x402 付款:发起链上支付 → 等确认 → 构造并签名 PaymentPayload。
134
+ * @returns `header` 可直接写入 `PAYMENT-SIGNATURE`。
135
+ */
136
+ export declare function payX402(params: PayX402Params): Promise<{
137
+ header: string;
138
+ payload: X402PaymentPayload;
139
+ txHash: Hex;
140
+ payment: X402Payment;
141
+ }>;
142
+ /** 供调试:把任意 32 字节值转成 x402 salt 形态 */
143
+ export declare function toX402Salt(value: bigint | number): Hex;
144
+ export declare function toBase64(text: string): string;