@dexterai/x402 1.0.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.
- package/LICENSE +22 -0
- package/README.md +254 -0
- package/assets/dexter-wordmark.svg +30 -0
- package/dist/adapters/index.cjs +481 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +15 -0
- package/dist/adapters/index.d.ts +15 -0
- package/dist/adapters/index.js +473 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/client/index.cjs +602 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.cts +4 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.js +583 -0
- package/dist/client/index.js.map +1 -0
- package/dist/evm-B4mhmeNZ.d.cts +120 -0
- package/dist/evm-av6iEAW7.d.ts +120 -0
- package/dist/react/index.cjs +827 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +108 -0
- package/dist/react/index.d.ts +108 -0
- package/dist/react/index.js +814 -0
- package/dist/react/index.js.map +1 -0
- package/dist/server/index.cjs +295 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +191 -0
- package/dist/server/index.d.ts +191 -0
- package/dist/server/index.js +262 -0
- package/dist/server/index.js.map +1 -0
- package/dist/types-DkTxHOns.d.cts +119 -0
- package/dist/types-DkTxHOns.d.ts +119 -0
- package/dist/types-uljmYAuY.d.ts +118 -0
- package/dist/types-vWD8uj2B.d.cts +118 -0
- package/dist/x402-client-BSWNMJbm.d.ts +84 -0
- package/dist/x402-client-DUipGiRr.d.cts +84 -0
- package/package.json +99 -0
|
@@ -0,0 +1,481 @@
|
|
|
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 __esm = (fn, res) => function __init() {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
};
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
|
+
|
|
23
|
+
// src/adapters/solana.ts
|
|
24
|
+
var solana_exports = {};
|
|
25
|
+
__export(solana_exports, {
|
|
26
|
+
SOLANA_DEVNET: () => SOLANA_DEVNET,
|
|
27
|
+
SOLANA_MAINNET: () => SOLANA_MAINNET,
|
|
28
|
+
SOLANA_TESTNET: () => SOLANA_TESTNET,
|
|
29
|
+
SolanaAdapter: () => SolanaAdapter,
|
|
30
|
+
createSolanaAdapter: () => createSolanaAdapter,
|
|
31
|
+
isSolanaWallet: () => isSolanaWallet
|
|
32
|
+
});
|
|
33
|
+
function isSolanaWallet(wallet) {
|
|
34
|
+
if (!wallet || typeof wallet !== "object") return false;
|
|
35
|
+
const w = wallet;
|
|
36
|
+
return "publicKey" in w && "signTransaction" in w && typeof w.signTransaction === "function";
|
|
37
|
+
}
|
|
38
|
+
function createSolanaAdapter(config) {
|
|
39
|
+
return new SolanaAdapter(config);
|
|
40
|
+
}
|
|
41
|
+
var import_web3, import_spl_token, SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET, DEFAULT_RPC_URLS, DEFAULT_COMPUTE_UNIT_LIMIT, DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS, SolanaAdapter;
|
|
42
|
+
var init_solana = __esm({
|
|
43
|
+
"src/adapters/solana.ts"() {
|
|
44
|
+
"use strict";
|
|
45
|
+
import_web3 = require("@solana/web3.js");
|
|
46
|
+
import_spl_token = require("@solana/spl-token");
|
|
47
|
+
SOLANA_MAINNET = "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp";
|
|
48
|
+
SOLANA_DEVNET = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1";
|
|
49
|
+
SOLANA_TESTNET = "solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z";
|
|
50
|
+
DEFAULT_RPC_URLS = {
|
|
51
|
+
[SOLANA_MAINNET]: "https://api.mainnet-beta.solana.com",
|
|
52
|
+
[SOLANA_DEVNET]: "https://api.devnet.solana.com",
|
|
53
|
+
[SOLANA_TESTNET]: "https://api.testnet.solana.com"
|
|
54
|
+
};
|
|
55
|
+
DEFAULT_COMPUTE_UNIT_LIMIT = 12e3;
|
|
56
|
+
DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;
|
|
57
|
+
SolanaAdapter = class {
|
|
58
|
+
name = "Solana";
|
|
59
|
+
networks = [SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET];
|
|
60
|
+
config;
|
|
61
|
+
log;
|
|
62
|
+
constructor(config = {}) {
|
|
63
|
+
this.config = config;
|
|
64
|
+
this.log = config.verbose ? console.log.bind(console, "[x402:solana]") : () => {
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
canHandle(network) {
|
|
68
|
+
if (this.networks.includes(network)) return true;
|
|
69
|
+
if (network === "solana") return true;
|
|
70
|
+
if (network === "solana-devnet") return true;
|
|
71
|
+
if (network === "solana-testnet") return true;
|
|
72
|
+
if (network.startsWith("solana:")) return true;
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
getDefaultRpcUrl(network) {
|
|
76
|
+
if (this.config.rpcUrls?.[network]) {
|
|
77
|
+
return this.config.rpcUrls[network];
|
|
78
|
+
}
|
|
79
|
+
if (DEFAULT_RPC_URLS[network]) {
|
|
80
|
+
return DEFAULT_RPC_URLS[network];
|
|
81
|
+
}
|
|
82
|
+
if (network === "solana") return DEFAULT_RPC_URLS[SOLANA_MAINNET];
|
|
83
|
+
if (network === "solana-devnet") return DEFAULT_RPC_URLS[SOLANA_DEVNET];
|
|
84
|
+
if (network === "solana-testnet") return DEFAULT_RPC_URLS[SOLANA_TESTNET];
|
|
85
|
+
return DEFAULT_RPC_URLS[SOLANA_MAINNET];
|
|
86
|
+
}
|
|
87
|
+
getAddress(wallet) {
|
|
88
|
+
if (!isSolanaWallet(wallet)) return null;
|
|
89
|
+
return wallet.publicKey?.toBase58() ?? null;
|
|
90
|
+
}
|
|
91
|
+
isConnected(wallet) {
|
|
92
|
+
if (!isSolanaWallet(wallet)) return false;
|
|
93
|
+
return wallet.publicKey !== null;
|
|
94
|
+
}
|
|
95
|
+
async getBalance(accept, wallet, rpcUrl) {
|
|
96
|
+
if (!isSolanaWallet(wallet) || !wallet.publicKey) {
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
const url = rpcUrl || this.getDefaultRpcUrl(accept.network);
|
|
100
|
+
const connection = new import_web3.Connection(url, "confirmed");
|
|
101
|
+
const userPubkey = new import_web3.PublicKey(wallet.publicKey.toBase58());
|
|
102
|
+
const mintPubkey = new import_web3.PublicKey(accept.asset);
|
|
103
|
+
try {
|
|
104
|
+
const mintInfo = await connection.getAccountInfo(mintPubkey, "confirmed");
|
|
105
|
+
const programId = mintInfo?.owner.toBase58() === import_spl_token.TOKEN_2022_PROGRAM_ID.toBase58() ? import_spl_token.TOKEN_2022_PROGRAM_ID : import_spl_token.TOKEN_PROGRAM_ID;
|
|
106
|
+
const ata = await (0, import_spl_token.getAssociatedTokenAddress)(
|
|
107
|
+
mintPubkey,
|
|
108
|
+
userPubkey,
|
|
109
|
+
false,
|
|
110
|
+
programId
|
|
111
|
+
);
|
|
112
|
+
const account = await (0, import_spl_token.getAccount)(connection, ata, void 0, programId);
|
|
113
|
+
const decimals = accept.extra?.decimals ?? 6;
|
|
114
|
+
return Number(account.amount) / Math.pow(10, decimals);
|
|
115
|
+
} catch {
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async buildTransaction(accept, wallet, rpcUrl) {
|
|
120
|
+
if (!isSolanaWallet(wallet)) {
|
|
121
|
+
throw new Error("Invalid Solana wallet");
|
|
122
|
+
}
|
|
123
|
+
if (!wallet.publicKey) {
|
|
124
|
+
throw new Error("Wallet not connected");
|
|
125
|
+
}
|
|
126
|
+
const url = rpcUrl || this.getDefaultRpcUrl(accept.network);
|
|
127
|
+
const connection = new import_web3.Connection(url, "confirmed");
|
|
128
|
+
const userPubkey = new import_web3.PublicKey(wallet.publicKey.toBase58());
|
|
129
|
+
const { payTo, asset, amount, extra } = accept;
|
|
130
|
+
if (!extra?.feePayer) {
|
|
131
|
+
throw new Error("Missing feePayer in payment requirements");
|
|
132
|
+
}
|
|
133
|
+
if (typeof extra?.decimals !== "number") {
|
|
134
|
+
throw new Error("Missing decimals in payment requirements");
|
|
135
|
+
}
|
|
136
|
+
const feePayerPubkey = new import_web3.PublicKey(extra.feePayer);
|
|
137
|
+
const mintPubkey = new import_web3.PublicKey(asset);
|
|
138
|
+
const destinationPubkey = new import_web3.PublicKey(payTo);
|
|
139
|
+
this.log("Building transaction:", {
|
|
140
|
+
from: userPubkey.toBase58(),
|
|
141
|
+
to: payTo,
|
|
142
|
+
amount,
|
|
143
|
+
asset,
|
|
144
|
+
feePayer: extra.feePayer
|
|
145
|
+
});
|
|
146
|
+
const instructions = [];
|
|
147
|
+
instructions.push(
|
|
148
|
+
import_web3.ComputeBudgetProgram.setComputeUnitLimit({
|
|
149
|
+
units: DEFAULT_COMPUTE_UNIT_LIMIT
|
|
150
|
+
})
|
|
151
|
+
);
|
|
152
|
+
instructions.push(
|
|
153
|
+
import_web3.ComputeBudgetProgram.setComputeUnitPrice({
|
|
154
|
+
microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS
|
|
155
|
+
})
|
|
156
|
+
);
|
|
157
|
+
const mintInfo = await connection.getAccountInfo(mintPubkey, "confirmed");
|
|
158
|
+
if (!mintInfo) {
|
|
159
|
+
throw new Error(`Token mint ${asset} not found`);
|
|
160
|
+
}
|
|
161
|
+
const programId = mintInfo.owner.toBase58() === import_spl_token.TOKEN_2022_PROGRAM_ID.toBase58() ? import_spl_token.TOKEN_2022_PROGRAM_ID : import_spl_token.TOKEN_PROGRAM_ID;
|
|
162
|
+
const mint = await (0, import_spl_token.getMint)(connection, mintPubkey, void 0, programId);
|
|
163
|
+
if (mint.decimals !== extra.decimals) {
|
|
164
|
+
this.log(
|
|
165
|
+
`Decimals mismatch: requirements say ${extra.decimals}, mint says ${mint.decimals}`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
const sourceAta = await (0, import_spl_token.getAssociatedTokenAddress)(
|
|
169
|
+
mintPubkey,
|
|
170
|
+
userPubkey,
|
|
171
|
+
false,
|
|
172
|
+
programId
|
|
173
|
+
);
|
|
174
|
+
const destinationAta = await (0, import_spl_token.getAssociatedTokenAddress)(
|
|
175
|
+
mintPubkey,
|
|
176
|
+
destinationPubkey,
|
|
177
|
+
false,
|
|
178
|
+
programId
|
|
179
|
+
);
|
|
180
|
+
const sourceAtaInfo = await connection.getAccountInfo(sourceAta, "confirmed");
|
|
181
|
+
if (!sourceAtaInfo) {
|
|
182
|
+
throw new Error(
|
|
183
|
+
`No token account found for ${asset}. Please ensure you have USDC in your wallet.`
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
const destAtaInfo = await connection.getAccountInfo(destinationAta, "confirmed");
|
|
187
|
+
if (!destAtaInfo) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`Seller token account not found. The seller (${payTo}) must have a USDC account.`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const amountBigInt = BigInt(amount);
|
|
193
|
+
instructions.push(
|
|
194
|
+
(0, import_spl_token.createTransferCheckedInstruction)(
|
|
195
|
+
sourceAta,
|
|
196
|
+
mintPubkey,
|
|
197
|
+
destinationAta,
|
|
198
|
+
userPubkey,
|
|
199
|
+
amountBigInt,
|
|
200
|
+
mint.decimals,
|
|
201
|
+
[],
|
|
202
|
+
programId
|
|
203
|
+
)
|
|
204
|
+
);
|
|
205
|
+
const { blockhash } = await connection.getLatestBlockhash("confirmed");
|
|
206
|
+
const message = new import_web3.TransactionMessage({
|
|
207
|
+
payerKey: feePayerPubkey,
|
|
208
|
+
recentBlockhash: blockhash,
|
|
209
|
+
instructions
|
|
210
|
+
}).compileToV0Message();
|
|
211
|
+
const transaction = new import_web3.VersionedTransaction(message);
|
|
212
|
+
const signedTx = await wallet.signTransaction(transaction);
|
|
213
|
+
this.log("Transaction signed successfully");
|
|
214
|
+
return {
|
|
215
|
+
serialized: Buffer.from(signedTx.serialize()).toString("base64")
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// src/adapters/evm.ts
|
|
223
|
+
var evm_exports = {};
|
|
224
|
+
__export(evm_exports, {
|
|
225
|
+
ARBITRUM_ONE: () => ARBITRUM_ONE,
|
|
226
|
+
BASE_MAINNET: () => BASE_MAINNET,
|
|
227
|
+
BASE_SEPOLIA: () => BASE_SEPOLIA,
|
|
228
|
+
ETHEREUM_MAINNET: () => ETHEREUM_MAINNET,
|
|
229
|
+
EvmAdapter: () => EvmAdapter,
|
|
230
|
+
USDC_ADDRESSES: () => USDC_ADDRESSES,
|
|
231
|
+
createEvmAdapter: () => createEvmAdapter,
|
|
232
|
+
isEvmWallet: () => isEvmWallet
|
|
233
|
+
});
|
|
234
|
+
function isEvmWallet(wallet) {
|
|
235
|
+
if (!wallet || typeof wallet !== "object") return false;
|
|
236
|
+
const w = wallet;
|
|
237
|
+
return "address" in w && typeof w.address === "string" && w.address.startsWith("0x");
|
|
238
|
+
}
|
|
239
|
+
function createEvmAdapter(config) {
|
|
240
|
+
return new EvmAdapter(config);
|
|
241
|
+
}
|
|
242
|
+
var BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE, CHAIN_IDS, DEFAULT_RPC_URLS2, USDC_ADDRESSES, EvmAdapter;
|
|
243
|
+
var init_evm = __esm({
|
|
244
|
+
"src/adapters/evm.ts"() {
|
|
245
|
+
"use strict";
|
|
246
|
+
BASE_MAINNET = "eip155:8453";
|
|
247
|
+
BASE_SEPOLIA = "eip155:84532";
|
|
248
|
+
ETHEREUM_MAINNET = "eip155:1";
|
|
249
|
+
ARBITRUM_ONE = "eip155:42161";
|
|
250
|
+
CHAIN_IDS = {
|
|
251
|
+
[BASE_MAINNET]: 8453,
|
|
252
|
+
[BASE_SEPOLIA]: 84532,
|
|
253
|
+
[ETHEREUM_MAINNET]: 1,
|
|
254
|
+
[ARBITRUM_ONE]: 42161
|
|
255
|
+
};
|
|
256
|
+
DEFAULT_RPC_URLS2 = {
|
|
257
|
+
[BASE_MAINNET]: "https://mainnet.base.org",
|
|
258
|
+
[BASE_SEPOLIA]: "https://sepolia.base.org",
|
|
259
|
+
[ETHEREUM_MAINNET]: "https://eth.llamarpc.com",
|
|
260
|
+
[ARBITRUM_ONE]: "https://arb1.arbitrum.io/rpc"
|
|
261
|
+
};
|
|
262
|
+
USDC_ADDRESSES = {
|
|
263
|
+
[BASE_MAINNET]: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
264
|
+
[ETHEREUM_MAINNET]: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
265
|
+
[ARBITRUM_ONE]: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
|
|
266
|
+
};
|
|
267
|
+
EvmAdapter = class {
|
|
268
|
+
name = "EVM";
|
|
269
|
+
networks = [BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE];
|
|
270
|
+
config;
|
|
271
|
+
log;
|
|
272
|
+
constructor(config = {}) {
|
|
273
|
+
this.config = config;
|
|
274
|
+
this.log = config.verbose ? console.log.bind(console, "[x402:evm]") : () => {
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
canHandle(network) {
|
|
278
|
+
if (this.networks.includes(network)) return true;
|
|
279
|
+
if (network === "base") return true;
|
|
280
|
+
if (network === "ethereum") return true;
|
|
281
|
+
if (network === "arbitrum") return true;
|
|
282
|
+
if (network.startsWith("eip155:")) return true;
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
getDefaultRpcUrl(network) {
|
|
286
|
+
if (this.config.rpcUrls?.[network]) {
|
|
287
|
+
return this.config.rpcUrls[network];
|
|
288
|
+
}
|
|
289
|
+
if (DEFAULT_RPC_URLS2[network]) {
|
|
290
|
+
return DEFAULT_RPC_URLS2[network];
|
|
291
|
+
}
|
|
292
|
+
if (network === "base") return DEFAULT_RPC_URLS2[BASE_MAINNET];
|
|
293
|
+
if (network === "ethereum") return DEFAULT_RPC_URLS2[ETHEREUM_MAINNET];
|
|
294
|
+
if (network === "arbitrum") return DEFAULT_RPC_URLS2[ARBITRUM_ONE];
|
|
295
|
+
return DEFAULT_RPC_URLS2[BASE_MAINNET];
|
|
296
|
+
}
|
|
297
|
+
getAddress(wallet) {
|
|
298
|
+
if (!isEvmWallet(wallet)) return null;
|
|
299
|
+
return wallet.address;
|
|
300
|
+
}
|
|
301
|
+
isConnected(wallet) {
|
|
302
|
+
if (!isEvmWallet(wallet)) return false;
|
|
303
|
+
return !!wallet.address;
|
|
304
|
+
}
|
|
305
|
+
getChainId(network) {
|
|
306
|
+
if (CHAIN_IDS[network]) return CHAIN_IDS[network];
|
|
307
|
+
if (network.startsWith("eip155:")) {
|
|
308
|
+
const chainIdStr = network.split(":")[1];
|
|
309
|
+
return parseInt(chainIdStr, 10);
|
|
310
|
+
}
|
|
311
|
+
if (network === "base") return 8453;
|
|
312
|
+
if (network === "ethereum") return 1;
|
|
313
|
+
if (network === "arbitrum") return 42161;
|
|
314
|
+
return 8453;
|
|
315
|
+
}
|
|
316
|
+
async getBalance(accept, wallet, rpcUrl) {
|
|
317
|
+
if (!isEvmWallet(wallet) || !wallet.address) {
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
const url = rpcUrl || this.getDefaultRpcUrl(accept.network);
|
|
321
|
+
try {
|
|
322
|
+
const data = this.encodeBalanceOf(wallet.address);
|
|
323
|
+
const response = await fetch(url, {
|
|
324
|
+
method: "POST",
|
|
325
|
+
headers: { "Content-Type": "application/json" },
|
|
326
|
+
body: JSON.stringify({
|
|
327
|
+
jsonrpc: "2.0",
|
|
328
|
+
id: 1,
|
|
329
|
+
method: "eth_call",
|
|
330
|
+
params: [
|
|
331
|
+
{
|
|
332
|
+
to: accept.asset,
|
|
333
|
+
data
|
|
334
|
+
},
|
|
335
|
+
"latest"
|
|
336
|
+
]
|
|
337
|
+
})
|
|
338
|
+
});
|
|
339
|
+
const result = await response.json();
|
|
340
|
+
if (result.error || !result.result) {
|
|
341
|
+
return 0;
|
|
342
|
+
}
|
|
343
|
+
const balance = BigInt(result.result);
|
|
344
|
+
const decimals = accept.extra?.decimals ?? 6;
|
|
345
|
+
return Number(balance) / Math.pow(10, decimals);
|
|
346
|
+
} catch {
|
|
347
|
+
return 0;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
encodeBalanceOf(address) {
|
|
351
|
+
const selector = "0x70a08231";
|
|
352
|
+
const paddedAddress = address.slice(2).toLowerCase().padStart(64, "0");
|
|
353
|
+
return selector + paddedAddress;
|
|
354
|
+
}
|
|
355
|
+
async buildTransaction(accept, wallet, _rpcUrl) {
|
|
356
|
+
if (!isEvmWallet(wallet)) {
|
|
357
|
+
throw new Error("Invalid EVM wallet");
|
|
358
|
+
}
|
|
359
|
+
if (!wallet.address) {
|
|
360
|
+
throw new Error("Wallet not connected");
|
|
361
|
+
}
|
|
362
|
+
const { payTo, asset, amount, extra } = accept;
|
|
363
|
+
this.log("Building EVM transaction:", {
|
|
364
|
+
from: wallet.address,
|
|
365
|
+
to: payTo,
|
|
366
|
+
amount,
|
|
367
|
+
asset,
|
|
368
|
+
network: accept.network
|
|
369
|
+
});
|
|
370
|
+
const chainId = this.getChainId(accept.network);
|
|
371
|
+
const domain = {
|
|
372
|
+
name: extra?.name ?? "USD Coin",
|
|
373
|
+
version: extra?.version ?? "2",
|
|
374
|
+
chainId: BigInt(chainId),
|
|
375
|
+
verifyingContract: asset
|
|
376
|
+
};
|
|
377
|
+
const types = {
|
|
378
|
+
TransferWithAuthorization: [
|
|
379
|
+
{ name: "from", type: "address" },
|
|
380
|
+
{ name: "to", type: "address" },
|
|
381
|
+
{ name: "value", type: "uint256" },
|
|
382
|
+
{ name: "validAfter", type: "uint256" },
|
|
383
|
+
{ name: "validBefore", type: "uint256" },
|
|
384
|
+
{ name: "nonce", type: "bytes32" }
|
|
385
|
+
]
|
|
386
|
+
};
|
|
387
|
+
const nonce = "0x" + [...Array(32)].map(() => Math.floor(Math.random() * 256).toString(16).padStart(2, "0")).join("");
|
|
388
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
389
|
+
const authorization = {
|
|
390
|
+
from: wallet.address,
|
|
391
|
+
to: payTo,
|
|
392
|
+
value: amount,
|
|
393
|
+
// string
|
|
394
|
+
validAfter: String(now - 600),
|
|
395
|
+
// 10 minutes before (matching upstream)
|
|
396
|
+
validBefore: String(now + (accept.maxTimeoutSeconds || 60)),
|
|
397
|
+
nonce
|
|
398
|
+
};
|
|
399
|
+
const message = {
|
|
400
|
+
from: wallet.address,
|
|
401
|
+
to: payTo,
|
|
402
|
+
value: BigInt(amount),
|
|
403
|
+
validAfter: BigInt(now - 600),
|
|
404
|
+
validBefore: BigInt(now + (accept.maxTimeoutSeconds || 60)),
|
|
405
|
+
nonce
|
|
406
|
+
};
|
|
407
|
+
if (!wallet.signTypedData) {
|
|
408
|
+
throw new Error("Wallet does not support signTypedData (EIP-712)");
|
|
409
|
+
}
|
|
410
|
+
const signature = await wallet.signTypedData({
|
|
411
|
+
domain,
|
|
412
|
+
types,
|
|
413
|
+
primaryType: "TransferWithAuthorization",
|
|
414
|
+
message
|
|
415
|
+
});
|
|
416
|
+
this.log("EIP-712 signature obtained");
|
|
417
|
+
const payload = {
|
|
418
|
+
authorization,
|
|
419
|
+
signature
|
|
420
|
+
};
|
|
421
|
+
return {
|
|
422
|
+
serialized: JSON.stringify(payload),
|
|
423
|
+
signature
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
// src/adapters/index.ts
|
|
431
|
+
var adapters_exports = {};
|
|
432
|
+
__export(adapters_exports, {
|
|
433
|
+
ARBITRUM_ONE: () => ARBITRUM_ONE,
|
|
434
|
+
BASE_MAINNET: () => BASE_MAINNET,
|
|
435
|
+
BASE_SEPOLIA: () => BASE_SEPOLIA,
|
|
436
|
+
ETHEREUM_MAINNET: () => ETHEREUM_MAINNET,
|
|
437
|
+
EvmAdapter: () => EvmAdapter,
|
|
438
|
+
SOLANA_DEVNET: () => SOLANA_DEVNET,
|
|
439
|
+
SOLANA_MAINNET: () => SOLANA_MAINNET,
|
|
440
|
+
SOLANA_TESTNET: () => SOLANA_TESTNET,
|
|
441
|
+
SolanaAdapter: () => SolanaAdapter,
|
|
442
|
+
createDefaultAdapters: () => createDefaultAdapters,
|
|
443
|
+
createEvmAdapter: () => createEvmAdapter,
|
|
444
|
+
createSolanaAdapter: () => createSolanaAdapter,
|
|
445
|
+
findAdapter: () => findAdapter,
|
|
446
|
+
isEvmWallet: () => isEvmWallet,
|
|
447
|
+
isSolanaWallet: () => isSolanaWallet
|
|
448
|
+
});
|
|
449
|
+
module.exports = __toCommonJS(adapters_exports);
|
|
450
|
+
init_solana();
|
|
451
|
+
init_evm();
|
|
452
|
+
function createDefaultAdapters(verbose = false) {
|
|
453
|
+
const { createSolanaAdapter: createSolanaAdapter2 } = (init_solana(), __toCommonJS(solana_exports));
|
|
454
|
+
const { createEvmAdapter: createEvmAdapter2 } = (init_evm(), __toCommonJS(evm_exports));
|
|
455
|
+
return [
|
|
456
|
+
createSolanaAdapter2({ verbose }),
|
|
457
|
+
createEvmAdapter2({ verbose })
|
|
458
|
+
];
|
|
459
|
+
}
|
|
460
|
+
function findAdapter(adapters, network) {
|
|
461
|
+
return adapters.find((adapter) => adapter.canHandle(network));
|
|
462
|
+
}
|
|
463
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
464
|
+
0 && (module.exports = {
|
|
465
|
+
ARBITRUM_ONE,
|
|
466
|
+
BASE_MAINNET,
|
|
467
|
+
BASE_SEPOLIA,
|
|
468
|
+
ETHEREUM_MAINNET,
|
|
469
|
+
EvmAdapter,
|
|
470
|
+
SOLANA_DEVNET,
|
|
471
|
+
SOLANA_MAINNET,
|
|
472
|
+
SOLANA_TESTNET,
|
|
473
|
+
SolanaAdapter,
|
|
474
|
+
createDefaultAdapters,
|
|
475
|
+
createEvmAdapter,
|
|
476
|
+
createSolanaAdapter,
|
|
477
|
+
findAdapter,
|
|
478
|
+
isEvmWallet,
|
|
479
|
+
isSolanaWallet
|
|
480
|
+
});
|
|
481
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/solana.ts","../../src/adapters/evm.ts","../../src/adapters/index.ts"],"sourcesContent":["/**\n * Solana Chain Adapter\n *\n * Implements the ChainAdapter interface for Solana networks.\n * Handles transaction building, signing, and balance queries.\n */\n\nimport {\n PublicKey,\n Connection,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n type TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n getAssociatedTokenAddress,\n getAccount,\n createTransferCheckedInstruction,\n getMint,\n TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for Solana\n */\nexport const SOLANA_MAINNET = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp';\nexport const SOLANA_DEVNET = 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1';\nexport const SOLANA_TESTNET = 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z';\n\n/**\n * Default RPC URLs\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [SOLANA_MAINNET]: 'https://api.mainnet-beta.solana.com',\n [SOLANA_DEVNET]: 'https://api.devnet.solana.com',\n [SOLANA_TESTNET]: 'https://api.testnet.solana.com',\n};\n\n/**\n * Dexter policy-safe compute budget settings\n */\nconst DEFAULT_COMPUTE_UNIT_LIMIT = 12_000;\nconst DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS = 1;\n\n/**\n * Solana wallet interface (compatible with @solana/wallet-adapter)\n */\nexport interface SolanaWallet {\n publicKey: { toBase58(): string } | null;\n signTransaction<T>(tx: T): Promise<T>;\n}\n\n/**\n * Check if an object is a valid Solana wallet\n */\nexport function isSolanaWallet(wallet: unknown): wallet is SolanaWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'publicKey' in w &&\n 'signTransaction' in w &&\n typeof w.signTransaction === 'function'\n );\n}\n\n/**\n * Solana Chain Adapter\n */\nexport class SolanaAdapter implements ChainAdapter {\n readonly name = 'Solana';\n readonly networks = [SOLANA_MAINNET, SOLANA_DEVNET, SOLANA_TESTNET];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:solana]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle both exact CAIP-2 and legacy formats\n if (this.networks.includes(network)) return true;\n // Legacy format support\n if (network === 'solana') return true;\n if (network === 'solana-devnet') return true;\n if (network === 'solana-testnet') return true;\n // Check if it starts with 'solana:'\n if (network.startsWith('solana:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n // Check custom config first\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n // Check defaults\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy networks\n if (network === 'solana') return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n if (network === 'solana-devnet') return DEFAULT_RPC_URLS[SOLANA_DEVNET];\n if (network === 'solana-testnet') return DEFAULT_RPC_URLS[SOLANA_TESTNET];\n // Default to mainnet\n return DEFAULT_RPC_URLS[SOLANA_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isSolanaWallet(wallet)) return null;\n return wallet.publicKey?.toBase58() ?? null;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isSolanaWallet(wallet)) return false;\n return wallet.publicKey !== null;\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isSolanaWallet(wallet) || !wallet.publicKey) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n const mintPubkey = new PublicKey(accept.asset);\n\n try {\n // Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n const programId =\n mintInfo?.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n const ata = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n\n const account = await getAccount(connection, ata, undefined, programId);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(account.amount) / Math.pow(10, decimals);\n } catch {\n // Token account doesn't exist\n return 0;\n }\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isSolanaWallet(wallet)) {\n throw new Error('Invalid Solana wallet');\n }\n if (!wallet.publicKey) {\n throw new Error('Wallet not connected');\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n const connection = new Connection(url, 'confirmed');\n const userPubkey = new PublicKey(wallet.publicKey.toBase58());\n\n // Extract required fields\n const { payTo, asset, amount, extra } = accept;\n\n if (!extra?.feePayer) {\n throw new Error('Missing feePayer in payment requirements');\n }\n if (typeof extra?.decimals !== 'number') {\n throw new Error('Missing decimals in payment requirements');\n }\n\n const feePayerPubkey = new PublicKey(extra.feePayer);\n const mintPubkey = new PublicKey(asset);\n const destinationPubkey = new PublicKey(payTo);\n\n this.log('Building transaction:', {\n from: userPubkey.toBase58(),\n to: payTo,\n amount,\n asset,\n feePayer: extra.feePayer,\n });\n\n // Build instructions\n const instructions: TransactionInstruction[] = [];\n\n // 1. ComputeBudget: Set compute unit limit\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n })\n );\n\n // 2. ComputeBudget: Set compute unit price\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n })\n );\n\n // 3. Determine token program\n const mintInfo = await connection.getAccountInfo(mintPubkey, 'confirmed');\n if (!mintInfo) {\n throw new Error(`Token mint ${asset} not found`);\n }\n\n const programId =\n mintInfo.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58()\n ? TOKEN_2022_PROGRAM_ID\n : TOKEN_PROGRAM_ID;\n\n // Fetch mint to verify decimals\n const mint = await getMint(connection, mintPubkey, undefined, programId);\n if (mint.decimals !== extra.decimals) {\n this.log(\n `Decimals mismatch: requirements say ${extra.decimals}, mint says ${mint.decimals}`\n );\n }\n\n // Derive Associated Token Accounts\n const sourceAta = await getAssociatedTokenAddress(\n mintPubkey,\n userPubkey,\n false,\n programId\n );\n const destinationAta = await getAssociatedTokenAddress(\n mintPubkey,\n destinationPubkey,\n false,\n programId\n );\n\n // Verify source ATA exists\n const sourceAtaInfo = await connection.getAccountInfo(sourceAta, 'confirmed');\n if (!sourceAtaInfo) {\n throw new Error(\n `No token account found for ${asset}. Please ensure you have USDC in your wallet.`\n );\n }\n\n // Verify destination ATA exists\n const destAtaInfo = await connection.getAccountInfo(destinationAta, 'confirmed');\n if (!destAtaInfo) {\n throw new Error(\n `Seller token account not found. The seller (${payTo}) must have a USDC account.`\n );\n }\n\n // 4. TransferChecked instruction\n const amountBigInt = BigInt(amount);\n instructions.push(\n createTransferCheckedInstruction(\n sourceAta,\n mintPubkey,\n destinationAta,\n userPubkey,\n amountBigInt,\n mint.decimals,\n [],\n programId\n )\n );\n\n // Get recent blockhash\n const { blockhash } = await connection.getLatestBlockhash('confirmed');\n\n // Compile to V0 message (feePayer is facilitator)\n const message = new TransactionMessage({\n payerKey: feePayerPubkey,\n recentBlockhash: blockhash,\n instructions,\n }).compileToV0Message();\n\n // Create and sign transaction\n const transaction = new VersionedTransaction(message);\n const signedTx = await wallet.signTransaction(transaction);\n\n this.log('Transaction signed successfully');\n\n return {\n serialized: Buffer.from(signedTx.serialize()).toString('base64'),\n };\n }\n}\n\n/**\n * Create a Solana adapter instance\n */\nexport function createSolanaAdapter(config?: AdapterConfig): SolanaAdapter {\n return new SolanaAdapter(config);\n}\n\n","/**\n * EVM Chain Adapter\n *\n * Implements the ChainAdapter interface for EVM networks (Base, Ethereum, Arbitrum, etc.)\n * Uses EIP-712 typed data signing for x402 v2 payments.\n */\n\nimport type { ChainAdapter, AdapterConfig, SignedTransaction } from './types';\nimport type { PaymentAccept } from '../types';\n\n/**\n * CAIP-2 network identifiers for EVM chains\n */\nexport const BASE_MAINNET = 'eip155:8453';\nexport const BASE_SEPOLIA = 'eip155:84532';\nexport const ETHEREUM_MAINNET = 'eip155:1';\nexport const ARBITRUM_ONE = 'eip155:42161';\n\n/**\n * Chain IDs by CAIP-2 network\n */\nconst CHAIN_IDS: Record<string, number> = {\n [BASE_MAINNET]: 8453,\n [BASE_SEPOLIA]: 84532,\n [ETHEREUM_MAINNET]: 1,\n [ARBITRUM_ONE]: 42161,\n};\n\n/**\n * Default RPC URLs\n */\nconst DEFAULT_RPC_URLS: Record<string, string> = {\n [BASE_MAINNET]: 'https://mainnet.base.org',\n [BASE_SEPOLIA]: 'https://sepolia.base.org',\n [ETHEREUM_MAINNET]: 'https://eth.llamarpc.com',\n [ARBITRUM_ONE]: 'https://arb1.arbitrum.io/rpc',\n};\n\n/**\n * USDC addresses by chain (for reference)\n */\nexport const USDC_ADDRESSES: Record<string, string> = {\n [BASE_MAINNET]: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n [ETHEREUM_MAINNET]: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n [ARBITRUM_ONE]: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n};\n\n/**\n * EVM wallet interface (compatible with wagmi, ethers, viem)\n */\nexport interface EvmWallet {\n /** Wallet address */\n address: string;\n /** Chain ID currently connected to */\n chainId?: number;\n /**\n * Sign typed data (EIP-712)\n * This is the primary signing method for x402 EVM payments\n */\n signTypedData?(params: {\n domain: Record<string, unknown>;\n types: Record<string, unknown[]>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<string>;\n /**\n * Alternative: Send transaction directly\n * Used if signTypedData is not available\n */\n sendTransaction?(params: {\n to: string;\n data: string;\n value?: bigint;\n }): Promise<string>;\n}\n\n/**\n * Check if an object is a valid EVM wallet\n */\nexport function isEvmWallet(wallet: unknown): wallet is EvmWallet {\n if (!wallet || typeof wallet !== 'object') return false;\n const w = wallet as Record<string, unknown>;\n return (\n 'address' in w &&\n typeof w.address === 'string' &&\n w.address.startsWith('0x')\n );\n}\n\n// ERC20 balanceOf function selector: 0x70a08231\n\n/**\n * EVM Chain Adapter\n */\nexport class EvmAdapter implements ChainAdapter {\n readonly name = 'EVM';\n readonly networks = [BASE_MAINNET, BASE_SEPOLIA, ETHEREUM_MAINNET, ARBITRUM_ONE];\n\n private config: AdapterConfig;\n private log: (...args: unknown[]) => void;\n\n constructor(config: AdapterConfig = {}) {\n this.config = config;\n this.log = config.verbose\n ? console.log.bind(console, '[x402:evm]')\n : () => {};\n }\n\n canHandle(network: string): boolean {\n // Handle exact CAIP-2\n if (this.networks.includes(network)) return true;\n // Legacy format\n if (network === 'base') return true;\n if (network === 'ethereum') return true;\n if (network === 'arbitrum') return true;\n // Check if it starts with 'eip155:'\n if (network.startsWith('eip155:')) return true;\n return false;\n }\n\n getDefaultRpcUrl(network: string): string {\n if (this.config.rpcUrls?.[network]) {\n return this.config.rpcUrls[network];\n }\n if (DEFAULT_RPC_URLS[network]) {\n return DEFAULT_RPC_URLS[network];\n }\n // Normalize legacy\n if (network === 'base') return DEFAULT_RPC_URLS[BASE_MAINNET];\n if (network === 'ethereum') return DEFAULT_RPC_URLS[ETHEREUM_MAINNET];\n if (network === 'arbitrum') return DEFAULT_RPC_URLS[ARBITRUM_ONE];\n return DEFAULT_RPC_URLS[BASE_MAINNET];\n }\n\n getAddress(wallet: unknown): string | null {\n if (!isEvmWallet(wallet)) return null;\n return wallet.address;\n }\n\n isConnected(wallet: unknown): boolean {\n if (!isEvmWallet(wallet)) return false;\n return !!wallet.address;\n }\n\n private getChainId(network: string): number {\n if (CHAIN_IDS[network]) return CHAIN_IDS[network];\n // Try to extract from CAIP-2\n if (network.startsWith('eip155:')) {\n const chainIdStr = network.split(':')[1];\n return parseInt(chainIdStr, 10);\n }\n // Defaults\n if (network === 'base') return 8453;\n if (network === 'ethereum') return 1;\n if (network === 'arbitrum') return 42161;\n return 8453; // Default to Base\n }\n\n async getBalance(\n accept: PaymentAccept,\n wallet: unknown,\n rpcUrl?: string\n ): Promise<number> {\n if (!isEvmWallet(wallet) || !wallet.address) {\n return 0;\n }\n\n const url = rpcUrl || this.getDefaultRpcUrl(accept.network);\n\n try {\n // Use eth_call to check ERC20 balance\n const data = this.encodeBalanceOf(wallet.address);\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'eth_call',\n params: [\n {\n to: accept.asset,\n data,\n },\n 'latest',\n ],\n }),\n });\n\n const result = (await response.json()) as { error?: unknown; result?: string };\n if (result.error || !result.result) {\n return 0;\n }\n\n const balance = BigInt(result.result);\n const decimals = accept.extra?.decimals ?? 6;\n return Number(balance) / Math.pow(10, decimals);\n } catch {\n return 0;\n }\n }\n\n private encodeBalanceOf(address: string): string {\n // Function selector for balanceOf(address)\n const selector = '0x70a08231';\n // Pad address to 32 bytes\n const paddedAddress = address.slice(2).toLowerCase().padStart(64, '0');\n return selector + paddedAddress;\n }\n\n async buildTransaction(\n accept: PaymentAccept,\n wallet: unknown,\n _rpcUrl?: string\n ): Promise<SignedTransaction> {\n if (!isEvmWallet(wallet)) {\n throw new Error('Invalid EVM wallet');\n }\n if (!wallet.address) {\n throw new Error('Wallet not connected');\n }\n\n const { payTo, asset, amount, extra } = accept;\n\n this.log('Building EVM transaction:', {\n from: wallet.address,\n to: payTo,\n amount,\n asset,\n network: accept.network,\n });\n\n // For x402 v2 EVM payments, we use EIP-712 typed data signing\n // The facilitator will execute the transfer on behalf of the user\n\n const chainId = this.getChainId(accept.network);\n\n // Build the EIP-712 typed data\n // This matches what Dexter's facilitator expects\n const domain = {\n name: extra?.name ?? 'USD Coin',\n version: extra?.version ?? '2',\n chainId: BigInt(chainId),\n verifyingContract: asset as `0x${string}`,\n };\n\n const 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\n // Generate a random nonce (32 bytes hex)\n const nonce = '0x' + [...Array(32)]\n .map(() => Math.floor(Math.random() * 256).toString(16).padStart(2, '0'))\n .join('') as `0x${string}`;\n\n const now = Math.floor(Date.now() / 1000);\n \n // Authorization object - values as strings for JSON, BigInts for signing\n const authorization = {\n from: wallet.address,\n to: payTo,\n value: amount, // string\n validAfter: String(now - 600), // 10 minutes before (matching upstream)\n validBefore: String(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n // Message for signing uses BigInt values\n const message = {\n from: wallet.address,\n to: payTo,\n value: BigInt(amount),\n validAfter: BigInt(now - 600),\n validBefore: BigInt(now + (accept.maxTimeoutSeconds || 60)),\n nonce,\n };\n\n if (!wallet.signTypedData) {\n throw new Error('Wallet does not support signTypedData (EIP-712)');\n }\n\n const signature = await wallet.signTypedData({\n domain: domain as Record<string, unknown>,\n types: types as Record<string, unknown[]>,\n primaryType: 'TransferWithAuthorization',\n message: message as Record<string, unknown>,\n });\n\n this.log('EIP-712 signature obtained');\n\n // Payload structure matches upstream @x402/evm exactly\n const payload = {\n authorization,\n signature,\n };\n\n return {\n serialized: JSON.stringify(payload),\n signature,\n };\n }\n}\n\n/**\n * Create an EVM adapter instance\n */\nexport function createEvmAdapter(config?: AdapterConfig): EvmAdapter {\n return new EvmAdapter(config);\n}\n\n","/**\n * Chain Adapters\n *\n * x402 v2 is designed to be chain-agnostic. Each adapter handles\n * the specifics of transaction building and signing for its chain.\n *\n * @example\n * ```typescript\n * import { createSolanaAdapter, createEvmAdapter } from '@dexterai/x402/adapters';\n *\n * const adapters = [\n * createSolanaAdapter(),\n * createEvmAdapter(),\n * ];\n *\n * // Find adapter for a network\n * const adapter = adapters.find(a => a.canHandle('eip155:8453'));\n * ```\n */\n\n// Types\nexport type {\n ChainAdapter,\n AdapterConfig,\n SignedTransaction,\n GenericWallet,\n WalletSet,\n BalanceInfo,\n} from './types';\n\n// Solana\nexport {\n SolanaAdapter,\n createSolanaAdapter,\n isSolanaWallet,\n SOLANA_MAINNET,\n SOLANA_DEVNET,\n SOLANA_TESTNET,\n} from './solana';\nexport type { SolanaWallet } from './solana';\n\n// EVM\nexport {\n EvmAdapter,\n createEvmAdapter,\n isEvmWallet,\n BASE_MAINNET,\n BASE_SEPOLIA,\n ETHEREUM_MAINNET,\n ARBITRUM_ONE,\n} from './evm';\nexport type { EvmWallet } from './evm';\n\n/**\n * Create all default adapters\n */\nexport function createDefaultAdapters(verbose = false) {\n const { createSolanaAdapter } = require('./solana');\n const { createEvmAdapter } = require('./evm');\n return [\n createSolanaAdapter({ verbose }),\n createEvmAdapter({ verbose }),\n ];\n}\n\n/**\n * Find adapter that can handle a network\n */\nexport function findAdapter(\n adapters: import('./types').ChainAdapter[],\n network: string\n): import('./types').ChainAdapter | undefined {\n return adapters.find(adapter => adapter.canHandle(network));\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DO,SAAS,eAAe,QAAyC;AACtE,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,IAAI;AACV,SACE,eAAe,KACf,qBAAqB,KACrB,OAAO,EAAE,oBAAoB;AAEjC;AAgPO,SAAS,oBAAoB,QAAuC;AACzE,SAAO,IAAI,cAAc,MAAM;AACjC;AArTA,IAOA,aAQA,kBAca,gBACA,eACA,gBAKP,kBASA,4BACA,0CA0BO;AAxEb;AAAA;AAAA;AAOA,kBAOO;AACP,uBAOO;AAOA,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAK9B,IAAM,mBAA2C;AAAA,MAC/C,CAAC,cAAc,GAAG;AAAA,MAClB,CAAC,aAAa,GAAG;AAAA,MACjB,CAAC,cAAc,GAAG;AAAA,IACpB;AAKA,IAAM,6BAA6B;AACnC,IAAM,2CAA2C;AA0B1C,IAAM,gBAAN,MAA4C;AAAA,MACxC,OAAO;AAAA,MACP,WAAW,CAAC,gBAAgB,eAAe,cAAc;AAAA,MAE1D;AAAA,MACA;AAAA,MAER,YAAY,SAAwB,CAAC,GAAG;AACtC,aAAK,SAAS;AACd,aAAK,MAAM,OAAO,UACd,QAAQ,IAAI,KAAK,SAAS,eAAe,IACzC,MAAM;AAAA,QAAC;AAAA,MACb;AAAA,MAEA,UAAU,SAA0B;AAElC,YAAI,KAAK,SAAS,SAAS,OAAO,EAAG,QAAO;AAE5C,YAAI,YAAY,SAAU,QAAO;AACjC,YAAI,YAAY,gBAAiB,QAAO;AACxC,YAAI,YAAY,iBAAkB,QAAO;AAEzC,YAAI,QAAQ,WAAW,SAAS,EAAG,QAAO;AAC1C,eAAO;AAAA,MACT;AAAA,MAEA,iBAAiB,SAAyB;AAExC,YAAI,KAAK,OAAO,UAAU,OAAO,GAAG;AAClC,iBAAO,KAAK,OAAO,QAAQ,OAAO;AAAA,QACpC;AAEA,YAAI,iBAAiB,OAAO,GAAG;AAC7B,iBAAO,iBAAiB,OAAO;AAAA,QACjC;AAEA,YAAI,YAAY,SAAU,QAAO,iBAAiB,cAAc;AAChE,YAAI,YAAY,gBAAiB,QAAO,iBAAiB,aAAa;AACtE,YAAI,YAAY,iBAAkB,QAAO,iBAAiB,cAAc;AAExE,eAAO,iBAAiB,cAAc;AAAA,MACxC;AAAA,MAEA,WAAW,QAAgC;AACzC,YAAI,CAAC,eAAe,MAAM,EAAG,QAAO;AACpC,eAAO,OAAO,WAAW,SAAS,KAAK;AAAA,MACzC;AAAA,MAEA,YAAY,QAA0B;AACpC,YAAI,CAAC,eAAe,MAAM,EAAG,QAAO;AACpC,eAAO,OAAO,cAAc;AAAA,MAC9B;AAAA,MAEA,MAAM,WACJ,QACA,QACA,QACiB;AACjB,YAAI,CAAC,eAAe,MAAM,KAAK,CAAC,OAAO,WAAW;AAChD,iBAAO;AAAA,QACT;AAEA,cAAM,MAAM,UAAU,KAAK,iBAAiB,OAAO,OAAO;AAC1D,cAAM,aAAa,IAAI,uBAAW,KAAK,WAAW;AAClD,cAAM,aAAa,IAAI,sBAAU,OAAO,UAAU,SAAS,CAAC;AAC5D,cAAM,aAAa,IAAI,sBAAU,OAAO,KAAK;AAE7C,YAAI;AAEF,gBAAM,WAAW,MAAM,WAAW,eAAe,YAAY,WAAW;AACxE,gBAAM,YACJ,UAAU,MAAM,SAAS,MAAM,uCAAsB,SAAS,IAC1D,yCACA;AAEN,gBAAM,MAAM,UAAM;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,UAAU,UAAM,6BAAW,YAAY,KAAK,QAAW,SAAS;AACtE,gBAAM,WAAW,OAAO,OAAO,YAAY;AAC3C,iBAAO,OAAO,QAAQ,MAAM,IAAI,KAAK,IAAI,IAAI,QAAQ;AAAA,QACvD,QAAQ;AAEN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,iBACJ,QACA,QACA,QAC4B;AAC5B,YAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,gBAAM,IAAI,MAAM,uBAAuB;AAAA,QACzC;AACA,YAAI,CAAC,OAAO,WAAW;AACrB,gBAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AAEA,cAAM,MAAM,UAAU,KAAK,iBAAiB,OAAO,OAAO;AAC1D,cAAM,aAAa,IAAI,uBAAW,KAAK,WAAW;AAClD,cAAM,aAAa,IAAI,sBAAU,OAAO,UAAU,SAAS,CAAC;AAG5D,cAAM,EAAE,OAAO,OAAO,QAAQ,MAAM,IAAI;AAExC,YAAI,CAAC,OAAO,UAAU;AACpB,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AACA,YAAI,OAAO,OAAO,aAAa,UAAU;AACvC,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,cAAM,iBAAiB,IAAI,sBAAU,MAAM,QAAQ;AACnD,cAAM,aAAa,IAAI,sBAAU,KAAK;AACtC,cAAM,oBAAoB,IAAI,sBAAU,KAAK;AAE7C,aAAK,IAAI,yBAAyB;AAAA,UAChC,MAAM,WAAW,SAAS;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AAAA,QAClB,CAAC;AAGD,cAAM,eAAyC,CAAC;AAGhD,qBAAa;AAAA,UACX,iCAAqB,oBAAoB;AAAA,YACvC,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAGA,qBAAa;AAAA,UACX,iCAAqB,oBAAoB;AAAA,YACvC,eAAe;AAAA,UACjB,CAAC;AAAA,QACH;AAGA,cAAM,WAAW,MAAM,WAAW,eAAe,YAAY,WAAW;AACxE,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,cAAc,KAAK,YAAY;AAAA,QACjD;AAEA,cAAM,YACJ,SAAS,MAAM,SAAS,MAAM,uCAAsB,SAAS,IACzD,yCACA;AAGN,cAAM,OAAO,UAAM,0BAAQ,YAAY,YAAY,QAAW,SAAS;AACvE,YAAI,KAAK,aAAa,MAAM,UAAU;AACpC,eAAK;AAAA,YACH,uCAAuC,MAAM,QAAQ,eAAe,KAAK,QAAQ;AAAA,UACnF;AAAA,QACF;AAGA,cAAM,YAAY,UAAM;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,iBAAiB,UAAM;AAAA,UAC3B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAGA,cAAM,gBAAgB,MAAM,WAAW,eAAe,WAAW,WAAW;AAC5E,YAAI,CAAC,eAAe;AAClB,gBAAM,IAAI;AAAA,YACR,8BAA8B,KAAK;AAAA,UACrC;AAAA,QACF;AAGA,cAAM,cAAc,MAAM,WAAW,eAAe,gBAAgB,WAAW;AAC/E,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI;AAAA,YACR,+CAA+C,KAAK;AAAA,UACtD;AAAA,QACF;AAGA,cAAM,eAAe,OAAO,MAAM;AAClC,qBAAa;AAAA,cACX;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,CAAC;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAGA,cAAM,EAAE,UAAU,IAAI,MAAM,WAAW,mBAAmB,WAAW;AAGrE,cAAM,UAAU,IAAI,+BAAmB;AAAA,UACrC,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB;AAAA,QACF,CAAC,EAAE,mBAAmB;AAGtB,cAAM,cAAc,IAAI,iCAAqB,OAAO;AACpD,cAAM,WAAW,MAAM,OAAO,gBAAgB,WAAW;AAEzD,aAAK,IAAI,iCAAiC;AAE1C,eAAO;AAAA,UACL,YAAY,OAAO,KAAK,SAAS,UAAU,CAAC,EAAE,SAAS,QAAQ;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC9SA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+EO,SAAS,YAAY,QAAsC;AAChE,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,IAAI;AACV,SACE,aAAa,KACb,OAAO,EAAE,YAAY,YACrB,EAAE,QAAQ,WAAW,IAAI;AAE7B;AAkOO,SAAS,iBAAiB,QAAoC;AACnE,SAAO,IAAI,WAAW,MAAM;AAC9B;AA3TA,IAaa,cACA,cACA,kBACA,cAKP,WAUAA,mBAUO,gBAqDA;AA9Fb;AAAA;AAAA;AAaO,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,eAAe;AAK5B,IAAM,YAAoC;AAAA,MACxC,CAAC,YAAY,GAAG;AAAA,MAChB,CAAC,YAAY,GAAG;AAAA,MAChB,CAAC,gBAAgB,GAAG;AAAA,MACpB,CAAC,YAAY,GAAG;AAAA,IAClB;AAKA,IAAMA,oBAA2C;AAAA,MAC/C,CAAC,YAAY,GAAG;AAAA,MAChB,CAAC,YAAY,GAAG;AAAA,MAChB,CAAC,gBAAgB,GAAG;AAAA,MACpB,CAAC,YAAY,GAAG;AAAA,IAClB;AAKO,IAAM,iBAAyC;AAAA,MACpD,CAAC,YAAY,GAAG;AAAA,MAChB,CAAC,gBAAgB,GAAG;AAAA,MACpB,CAAC,YAAY,GAAG;AAAA,IAClB;AAiDO,IAAM,aAAN,MAAyC;AAAA,MACrC,OAAO;AAAA,MACP,WAAW,CAAC,cAAc,cAAc,kBAAkB,YAAY;AAAA,MAEvE;AAAA,MACA;AAAA,MAER,YAAY,SAAwB,CAAC,GAAG;AACtC,aAAK,SAAS;AACd,aAAK,MAAM,OAAO,UACd,QAAQ,IAAI,KAAK,SAAS,YAAY,IACtC,MAAM;AAAA,QAAC;AAAA,MACb;AAAA,MAEA,UAAU,SAA0B;AAElC,YAAI,KAAK,SAAS,SAAS,OAAO,EAAG,QAAO;AAE5C,YAAI,YAAY,OAAQ,QAAO;AAC/B,YAAI,YAAY,WAAY,QAAO;AACnC,YAAI,YAAY,WAAY,QAAO;AAEnC,YAAI,QAAQ,WAAW,SAAS,EAAG,QAAO;AAC1C,eAAO;AAAA,MACT;AAAA,MAEA,iBAAiB,SAAyB;AACxC,YAAI,KAAK,OAAO,UAAU,OAAO,GAAG;AAClC,iBAAO,KAAK,OAAO,QAAQ,OAAO;AAAA,QACpC;AACA,YAAIA,kBAAiB,OAAO,GAAG;AAC7B,iBAAOA,kBAAiB,OAAO;AAAA,QACjC;AAEA,YAAI,YAAY,OAAQ,QAAOA,kBAAiB,YAAY;AAC5D,YAAI,YAAY,WAAY,QAAOA,kBAAiB,gBAAgB;AACpE,YAAI,YAAY,WAAY,QAAOA,kBAAiB,YAAY;AAChE,eAAOA,kBAAiB,YAAY;AAAA,MACtC;AAAA,MAEA,WAAW,QAAgC;AACzC,YAAI,CAAC,YAAY,MAAM,EAAG,QAAO;AACjC,eAAO,OAAO;AAAA,MAChB;AAAA,MAEA,YAAY,QAA0B;AACpC,YAAI,CAAC,YAAY,MAAM,EAAG,QAAO;AACjC,eAAO,CAAC,CAAC,OAAO;AAAA,MAClB;AAAA,MAEQ,WAAW,SAAyB;AAC1C,YAAI,UAAU,OAAO,EAAG,QAAO,UAAU,OAAO;AAEhD,YAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,gBAAM,aAAa,QAAQ,MAAM,GAAG,EAAE,CAAC;AACvC,iBAAO,SAAS,YAAY,EAAE;AAAA,QAChC;AAEA,YAAI,YAAY,OAAQ,QAAO;AAC/B,YAAI,YAAY,WAAY,QAAO;AACnC,YAAI,YAAY,WAAY,QAAO;AACnC,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,WACJ,QACA,QACA,QACiB;AACjB,YAAI,CAAC,YAAY,MAAM,KAAK,CAAC,OAAO,SAAS;AAC3C,iBAAO;AAAA,QACT;AAEA,cAAM,MAAM,UAAU,KAAK,iBAAiB,OAAO,OAAO;AAE1D,YAAI;AAEF,gBAAM,OAAO,KAAK,gBAAgB,OAAO,OAAO;AAChD,gBAAM,WAAW,MAAM,MAAM,KAAK;AAAA,YAChC,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU;AAAA,cACnB,SAAS;AAAA,cACT,IAAI;AAAA,cACJ,QAAQ;AAAA,cACR,QAAQ;AAAA,gBACN;AAAA,kBACE,IAAI,OAAO;AAAA,kBACX;AAAA,gBACF;AAAA,gBACA;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAED,gBAAM,SAAU,MAAM,SAAS,KAAK;AACpC,cAAI,OAAO,SAAS,CAAC,OAAO,QAAQ;AAClC,mBAAO;AAAA,UACT;AAEA,gBAAM,UAAU,OAAO,OAAO,MAAM;AACpC,gBAAM,WAAW,OAAO,OAAO,YAAY;AAC3C,iBAAO,OAAO,OAAO,IAAI,KAAK,IAAI,IAAI,QAAQ;AAAA,QAChD,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEQ,gBAAgB,SAAyB;AAE/C,cAAM,WAAW;AAEjB,cAAM,gBAAgB,QAAQ,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,IAAI,GAAG;AACrE,eAAO,WAAW;AAAA,MACpB;AAAA,MAEA,MAAM,iBACJ,QACA,QACA,SAC4B;AAC5B,YAAI,CAAC,YAAY,MAAM,GAAG;AACxB,gBAAM,IAAI,MAAM,oBAAoB;AAAA,QACtC;AACA,YAAI,CAAC,OAAO,SAAS;AACnB,gBAAM,IAAI,MAAM,sBAAsB;AAAA,QACxC;AAEA,cAAM,EAAE,OAAO,OAAO,QAAQ,MAAM,IAAI;AAExC,aAAK,IAAI,6BAA6B;AAAA,UACpC,MAAM,OAAO;AAAA,UACb,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,SAAS,OAAO;AAAA,QAClB,CAAC;AAKD,cAAM,UAAU,KAAK,WAAW,OAAO,OAAO;AAI9C,cAAM,SAAS;AAAA,UACb,MAAM,OAAO,QAAQ;AAAA,UACrB,SAAS,OAAO,WAAW;AAAA,UAC3B,SAAS,OAAO,OAAO;AAAA,UACvB,mBAAmB;AAAA,QACrB;AAEA,cAAM,QAAQ;AAAA,UACZ,2BAA2B;AAAA,YACzB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,YAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,YAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,YACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,YACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,YACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,UACnC;AAAA,QACF;AAGA,cAAM,QAAQ,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC,EAC/B,IAAI,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EACvE,KAAK,EAAE;AAEV,cAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAGxC,cAAM,gBAAgB;AAAA,UACpB,MAAM,OAAO;AAAA,UACb,IAAI;AAAA,UACJ,OAAO;AAAA;AAAA,UACP,YAAY,OAAO,MAAM,GAAG;AAAA;AAAA,UAC5B,aAAa,OAAO,OAAO,OAAO,qBAAqB,GAAG;AAAA,UAC1D;AAAA,QACF;AAGA,cAAM,UAAU;AAAA,UACd,MAAM,OAAO;AAAA,UACb,IAAI;AAAA,UACJ,OAAO,OAAO,MAAM;AAAA,UACpB,YAAY,OAAO,MAAM,GAAG;AAAA,UAC5B,aAAa,OAAO,OAAO,OAAO,qBAAqB,GAAG;AAAA,UAC1D;AAAA,QACF;AAEA,YAAI,CAAC,OAAO,eAAe;AACzB,gBAAM,IAAI,MAAM,iDAAiD;AAAA,QACnE;AAEA,cAAM,YAAY,MAAM,OAAO,cAAc;AAAA,UAC3C;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb;AAAA,QACF,CAAC;AAED,aAAK,IAAI,4BAA4B;AAGrC,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,YAAY,KAAK,UAAU,OAAO;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACpTA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BA;AAWA;AAcO,SAAS,sBAAsB,UAAU,OAAO;AACrD,QAAM,EAAE,qBAAAC,qBAAoB,IAAI;AAChC,QAAM,EAAE,kBAAAC,kBAAiB,IAAI;AAC7B,SAAO;AAAA,IACLD,qBAAoB,EAAE,QAAQ,CAAC;AAAA,IAC/BC,kBAAiB,EAAE,QAAQ,CAAC;AAAA,EAC9B;AACF;AAKO,SAAS,YACd,UACA,SAC4C;AAC5C,SAAO,SAAS,KAAK,aAAW,QAAQ,UAAU,OAAO,CAAC;AAC5D;","names":["DEFAULT_RPC_URLS","createSolanaAdapter","createEvmAdapter"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { C as ChainAdapter } from '../types-vWD8uj2B.cjs';
|
|
2
|
+
export { A as AdapterConfig, B as BalanceInfo, G as GenericWallet, S as SignedTransaction, W as WalletSet } from '../types-vWD8uj2B.cjs';
|
|
3
|
+
export { A as ARBITRUM_ONE, B as BASE_MAINNET, h as BASE_SEPOLIA, j as ETHEREUM_MAINNET, E as EvmAdapter, k as EvmWallet, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, b as SolanaAdapter, f as SolanaWallet, a as createEvmAdapter, c as createSolanaAdapter, g as isEvmWallet, i as isSolanaWallet } from '../evm-B4mhmeNZ.cjs';
|
|
4
|
+
import '../types-DkTxHOns.cjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create all default adapters
|
|
8
|
+
*/
|
|
9
|
+
declare function createDefaultAdapters(verbose?: boolean): any[];
|
|
10
|
+
/**
|
|
11
|
+
* Find adapter that can handle a network
|
|
12
|
+
*/
|
|
13
|
+
declare function findAdapter(adapters: ChainAdapter[], network: string): ChainAdapter | undefined;
|
|
14
|
+
|
|
15
|
+
export { ChainAdapter, createDefaultAdapters, findAdapter };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { C as ChainAdapter } from '../types-uljmYAuY.js';
|
|
2
|
+
export { A as AdapterConfig, B as BalanceInfo, G as GenericWallet, S as SignedTransaction, W as WalletSet } from '../types-uljmYAuY.js';
|
|
3
|
+
export { A as ARBITRUM_ONE, B as BASE_MAINNET, h as BASE_SEPOLIA, j as ETHEREUM_MAINNET, E as EvmAdapter, k as EvmWallet, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, b as SolanaAdapter, f as SolanaWallet, a as createEvmAdapter, c as createSolanaAdapter, g as isEvmWallet, i as isSolanaWallet } from '../evm-av6iEAW7.js';
|
|
4
|
+
import '../types-DkTxHOns.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create all default adapters
|
|
8
|
+
*/
|
|
9
|
+
declare function createDefaultAdapters(verbose?: boolean): any[];
|
|
10
|
+
/**
|
|
11
|
+
* Find adapter that can handle a network
|
|
12
|
+
*/
|
|
13
|
+
declare function findAdapter(adapters: ChainAdapter[], network: string): ChainAdapter | undefined;
|
|
14
|
+
|
|
15
|
+
export { ChainAdapter, createDefaultAdapters, findAdapter };
|