moneyos 0.1.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/dist/index.js ADDED
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ MoneyOS: () => MoneyOS,
24
+ OdosProvider: () => OdosProvider,
25
+ chains: () => chains,
26
+ defaultChain: () => defaultChain,
27
+ getChain: () => getChain,
28
+ getToken: () => getToken,
29
+ getTokenAddress: () => getTokenAddress,
30
+ tokens: () => tokens
31
+ });
32
+ module.exports = __toCommonJS(src_exports);
33
+
34
+ // src/core/client.ts
35
+ var import_viem = require("viem");
36
+ var import_accounts = require("viem/accounts");
37
+ var import_chains = require("viem/chains");
38
+
39
+ // src/core/chains.ts
40
+ var chains = {
41
+ arbitrum: {
42
+ id: 42161,
43
+ name: "Arbitrum One",
44
+ rpcUrl: "https://arb1.arbitrum.io/rpc",
45
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
46
+ blockExplorer: "https://arbiscan.io"
47
+ },
48
+ ethereum: {
49
+ id: 1,
50
+ name: "Ethereum",
51
+ rpcUrl: "https://eth.public-rpc.com",
52
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
53
+ blockExplorer: "https://etherscan.io"
54
+ },
55
+ polygon: {
56
+ id: 137,
57
+ name: "Polygon",
58
+ rpcUrl: "https://polygon-rpc.com",
59
+ nativeCurrency: { name: "POL", symbol: "POL", decimals: 18 },
60
+ blockExplorer: "https://polygonscan.com"
61
+ }
62
+ };
63
+ var defaultChain = chains.arbitrum;
64
+ function getChain(idOrName) {
65
+ if (typeof idOrName === "number") {
66
+ return Object.values(chains).find((c) => c.id === idOrName);
67
+ }
68
+ return chains[idOrName.toLowerCase()];
69
+ }
70
+
71
+ // src/core/tokens.ts
72
+ var tokens = {
73
+ USDC: {
74
+ symbol: "USDC",
75
+ name: "USD Coin",
76
+ decimals: 6,
77
+ addresses: {
78
+ 42161: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
79
+ 1: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
80
+ 137: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"
81
+ }
82
+ },
83
+ USDT: {
84
+ symbol: "USDT",
85
+ name: "Tether USD",
86
+ decimals: 6,
87
+ addresses: {
88
+ 42161: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
89
+ 1: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
90
+ 137: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
91
+ }
92
+ },
93
+ RYZE: {
94
+ symbol: "RYZE",
95
+ name: "RYZE",
96
+ decimals: 18,
97
+ addresses: {
98
+ 42161: "0x7712da72127d5dD213B621497D6E4899d5989e5C"
99
+ }
100
+ }
101
+ };
102
+ function getToken(symbol) {
103
+ return tokens[symbol.toUpperCase()];
104
+ }
105
+ function getTokenAddress(symbol, chainId) {
106
+ return getToken(symbol)?.addresses[chainId];
107
+ }
108
+
109
+ // src/core/client.ts
110
+ var ERC20_ABI = [
111
+ {
112
+ name: "balanceOf",
113
+ type: "function",
114
+ stateMutability: "view",
115
+ inputs: [{ name: "account", type: "address" }],
116
+ outputs: [{ name: "", type: "uint256" }]
117
+ },
118
+ {
119
+ name: "transfer",
120
+ type: "function",
121
+ stateMutability: "nonpayable",
122
+ inputs: [
123
+ { name: "to", type: "address" },
124
+ { name: "amount", type: "uint256" }
125
+ ],
126
+ outputs: [{ name: "", type: "bool" }]
127
+ },
128
+ {
129
+ name: "decimals",
130
+ type: "function",
131
+ stateMutability: "view",
132
+ inputs: [],
133
+ outputs: [{ name: "", type: "uint8" }]
134
+ },
135
+ {
136
+ name: "symbol",
137
+ type: "function",
138
+ stateMutability: "view",
139
+ inputs: [],
140
+ outputs: [{ name: "", type: "string" }]
141
+ },
142
+ {
143
+ name: "approve",
144
+ type: "function",
145
+ stateMutability: "nonpayable",
146
+ inputs: [
147
+ { name: "spender", type: "address" },
148
+ { name: "amount", type: "uint256" }
149
+ ],
150
+ outputs: [{ name: "", type: "bool" }]
151
+ },
152
+ {
153
+ name: "allowance",
154
+ type: "function",
155
+ stateMutability: "view",
156
+ inputs: [
157
+ { name: "owner", type: "address" },
158
+ { name: "spender", type: "address" }
159
+ ],
160
+ outputs: [{ name: "", type: "uint256" }]
161
+ }
162
+ ];
163
+ var viemChains = {
164
+ 42161: import_chains.arbitrum,
165
+ 1: import_chains.mainnet,
166
+ 137: import_chains.polygon
167
+ };
168
+ var MoneyOS = class {
169
+ config;
170
+ publicClients = /* @__PURE__ */ new Map();
171
+ walletClient;
172
+ constructor(config) {
173
+ this.config = {
174
+ ...config,
175
+ chainId: config.chainId ?? defaultChain.id
176
+ };
177
+ }
178
+ getPublicClient(chainId) {
179
+ const id = chainId ?? this.config.chainId;
180
+ let client = this.publicClients.get(id);
181
+ if (!client) {
182
+ const chain = viemChains[id];
183
+ const chainInfo = getChain(id);
184
+ const rpcUrl = id === this.config.chainId ? this.config.rpcUrl : void 0;
185
+ client = (0, import_viem.createPublicClient)({
186
+ chain,
187
+ transport: (0, import_viem.http)(rpcUrl ?? chainInfo?.rpcUrl)
188
+ });
189
+ this.publicClients.set(id, client);
190
+ }
191
+ return client;
192
+ }
193
+ getWalletClient() {
194
+ if (!this.walletClient) {
195
+ if (!this.config.privateKey) {
196
+ throw new Error(
197
+ "No private key configured. Set privateKey in MoneyOS config."
198
+ );
199
+ }
200
+ const account = (0, import_accounts.privateKeyToAccount)(this.config.privateKey);
201
+ const chain = viemChains[this.config.chainId];
202
+ const chainInfo = getChain(this.config.chainId);
203
+ this.walletClient = (0, import_viem.createWalletClient)({
204
+ account,
205
+ chain,
206
+ transport: (0, import_viem.http)(this.config.rpcUrl ?? chainInfo?.rpcUrl)
207
+ });
208
+ }
209
+ return this.walletClient;
210
+ }
211
+ get address() {
212
+ if (!this.config.privateKey) {
213
+ throw new Error("No private key configured.");
214
+ }
215
+ return (0, import_accounts.privateKeyToAccount)(this.config.privateKey).address;
216
+ }
217
+ async balance(token, options) {
218
+ const chainId = options?.chainId ?? this.config.chainId;
219
+ const account = options?.address ?? this.address;
220
+ const client = this.getPublicClient(chainId);
221
+ if (token.toUpperCase() === "ETH") {
222
+ const raw2 = await client.getBalance({ address: account });
223
+ return {
224
+ token: "ETH",
225
+ symbol: "ETH",
226
+ amount: (0, import_viem.formatUnits)(raw2, 18),
227
+ rawAmount: raw2,
228
+ decimals: 18,
229
+ chainId
230
+ };
231
+ }
232
+ const tokenAddress = getTokenAddress(token, chainId);
233
+ if (!tokenAddress) {
234
+ throw new Error(`Token ${token} not found on chain ${chainId}`);
235
+ }
236
+ const tokenInfo = getToken(token);
237
+ const raw = await client.readContract({
238
+ address: tokenAddress,
239
+ abi: ERC20_ABI,
240
+ functionName: "balanceOf",
241
+ args: [account]
242
+ });
243
+ return {
244
+ token: tokenInfo.name,
245
+ symbol: tokenInfo.symbol,
246
+ amount: (0, import_viem.formatUnits)(raw, tokenInfo.decimals),
247
+ rawAmount: raw,
248
+ decimals: tokenInfo.decimals,
249
+ chainId
250
+ };
251
+ }
252
+ async send(token, to, amount, options) {
253
+ const chainId = options?.chainId ?? this.config.chainId;
254
+ const walletClient = this.getWalletClient();
255
+ const from = this.address;
256
+ if (token.toUpperCase() === "ETH") {
257
+ const value2 = (0, import_viem.parseUnits)(amount, 18);
258
+ const account = (0, import_accounts.privateKeyToAccount)(this.config.privateKey);
259
+ const hash2 = await walletClient.sendTransaction({
260
+ account,
261
+ to,
262
+ value: value2,
263
+ chain: viemChains[chainId]
264
+ });
265
+ return { hash: hash2, from, to, amount, token: "ETH", chainId };
266
+ }
267
+ const tokenAddress = getTokenAddress(token, chainId);
268
+ if (!tokenAddress) {
269
+ throw new Error(`Token ${token} not found on chain ${chainId}`);
270
+ }
271
+ const tokenInfo = getToken(token);
272
+ const value = (0, import_viem.parseUnits)(amount, tokenInfo.decimals);
273
+ const client = this.getPublicClient(chainId);
274
+ const { request } = await client.simulateContract({
275
+ address: tokenAddress,
276
+ abi: ERC20_ABI,
277
+ functionName: "transfer",
278
+ args: [to, value],
279
+ account: (0, import_accounts.privateKeyToAccount)(this.config.privateKey)
280
+ });
281
+ const hash = await walletClient.writeContract(request);
282
+ return { hash, from, to, amount, token: tokenInfo.symbol, chainId };
283
+ }
284
+ async swap(tokenIn, tokenOut, amount, provider, options) {
285
+ const chainId = options?.chainId ?? this.config.chainId;
286
+ const walletClient = this.getWalletClient();
287
+ const client = this.getPublicClient(chainId);
288
+ const sender = this.address;
289
+ const tokenInAddress = getTokenAddress(tokenIn, chainId);
290
+ const tokenOutAddress = getTokenAddress(tokenOut, chainId);
291
+ if (!tokenInAddress) {
292
+ throw new Error(`Token ${tokenIn} not found on chain ${chainId}`);
293
+ }
294
+ if (!tokenOutAddress) {
295
+ throw new Error(`Token ${tokenOut} not found on chain ${chainId}`);
296
+ }
297
+ const tokenInInfo = getToken(tokenIn);
298
+ const amountWei = (0, import_viem.parseUnits)(amount, tokenInInfo.decimals);
299
+ const quote = await provider.getQuote({
300
+ chainId,
301
+ tokenIn: tokenInAddress,
302
+ tokenOut: tokenOutAddress,
303
+ amount: amountWei,
304
+ sender,
305
+ slippage: options?.slippage
306
+ });
307
+ const calldata = await provider.getCalldata(quote);
308
+ const currentAllowance = await client.readContract({
309
+ address: tokenInAddress,
310
+ abi: ERC20_ABI,
311
+ functionName: "allowance",
312
+ args: [sender, calldata.to]
313
+ });
314
+ if (currentAllowance < amountWei) {
315
+ const account2 = (0, import_accounts.privateKeyToAccount)(this.config.privateKey);
316
+ const { request: approveRequest } = await client.simulateContract({
317
+ address: tokenInAddress,
318
+ abi: ERC20_ABI,
319
+ functionName: "approve",
320
+ args: [calldata.to, amountWei],
321
+ account: account2
322
+ });
323
+ await walletClient.writeContract(approveRequest);
324
+ }
325
+ const account = (0, import_accounts.privateKeyToAccount)(this.config.privateKey);
326
+ const hash = await walletClient.sendTransaction({
327
+ account,
328
+ to: calldata.to,
329
+ data: calldata.data,
330
+ value: calldata.value,
331
+ chain: viemChains[chainId]
332
+ });
333
+ const tokenOutInfo = getToken(tokenOut);
334
+ return {
335
+ hash,
336
+ tokenIn: tokenInInfo.symbol,
337
+ tokenOut: tokenOutInfo.symbol,
338
+ amountIn: amount,
339
+ amountOut: (0, import_viem.formatUnits)(BigInt(quote.expectedOut), tokenOutInfo.decimals),
340
+ chainId
341
+ };
342
+ }
343
+ };
344
+
345
+ // src/providers/odos.ts
346
+ var ODOS_API = "https://api.odos.xyz";
347
+ var OdosProvider = class {
348
+ name = "odos";
349
+ apiKey;
350
+ constructor(options) {
351
+ this.apiKey = options?.apiKey;
352
+ }
353
+ async getQuote(params) {
354
+ const headers = {
355
+ "Content-Type": "application/json"
356
+ };
357
+ if (this.apiKey) {
358
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
359
+ }
360
+ const response = await fetch(`${ODOS_API}/sor/quote/v2`, {
361
+ method: "POST",
362
+ headers,
363
+ body: JSON.stringify({
364
+ chainId: params.chainId,
365
+ inputTokens: [
366
+ {
367
+ tokenAddress: params.tokenIn,
368
+ amount: params.amount.toString()
369
+ }
370
+ ],
371
+ outputTokens: [
372
+ {
373
+ tokenAddress: params.tokenOut,
374
+ proportion: 1
375
+ }
376
+ ],
377
+ userAddr: params.sender,
378
+ slippageLimitPercent: params.slippage ?? 1,
379
+ referralCode: 0,
380
+ compact: true
381
+ })
382
+ });
383
+ if (!response.ok) {
384
+ const text = await response.text();
385
+ throw new Error(`Odos quote failed: ${response.status} ${text}`);
386
+ }
387
+ const data = await response.json();
388
+ return {
389
+ tokenIn: params.tokenIn,
390
+ tokenOut: params.tokenOut,
391
+ amountIn: params.amount.toString(),
392
+ expectedOut: data.outAmounts[0],
393
+ router: "",
394
+ chainId: params.chainId,
395
+ pathId: data.pathId
396
+ };
397
+ }
398
+ async getCalldata(quote) {
399
+ const headers = {
400
+ "Content-Type": "application/json"
401
+ };
402
+ if (this.apiKey) {
403
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
404
+ }
405
+ const response = await fetch(`${ODOS_API}/sor/assemble`, {
406
+ method: "POST",
407
+ headers,
408
+ body: JSON.stringify({
409
+ userAddr: quote.tokenIn,
410
+ pathId: quote.pathId,
411
+ simulate: false
412
+ })
413
+ });
414
+ if (!response.ok) {
415
+ const text = await response.text();
416
+ throw new Error(`Odos assemble failed: ${response.status} ${text}`);
417
+ }
418
+ const data = await response.json();
419
+ return {
420
+ to: data.transaction.to,
421
+ data: data.transaction.data,
422
+ value: BigInt(data.transaction.value)
423
+ };
424
+ }
425
+ };
426
+ // Annotate the CommonJS export names for ESM import in node:
427
+ 0 && (module.exports = {
428
+ MoneyOS,
429
+ OdosProvider,
430
+ chains,
431
+ defaultChain,
432
+ getChain,
433
+ getToken,
434
+ getTokenAddress,
435
+ tokens
436
+ });
437
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/core/client.ts","../src/core/chains.ts","../src/core/tokens.ts","../src/providers/odos.ts"],"sourcesContent":["export { MoneyOS } from \"./core/client.js\";\nexport { chains, defaultChain, getChain } from \"./core/chains.js\";\nexport { tokens, getToken, getTokenAddress } from \"./core/tokens.js\";\nexport { OdosProvider } from \"./providers/odos.js\";\n\nexport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapQuote,\n SwapResult,\n SwapProvider,\n Chain,\n} from \"./core/types.js\";\nexport type { Token } from \"./core/tokens.js\";\n","import {\n createPublicClient,\n createWalletClient,\n http,\n formatUnits,\n parseUnits,\n type Address,\n type Chain as ViemChain,\n type Hex,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapProvider,\n SwapResult,\n} from \"./types.js\";\nimport { getChain, defaultChain } from \"./chains.js\";\nimport { getToken, getTokenAddress } from \"./tokens.js\";\n\nconst ERC20_ABI = [\n {\n name: \"balanceOf\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n {\n name: \"transfer\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"decimals\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n },\n {\n name: \"symbol\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n },\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n\nconst viemChains: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nexport class MoneyOS {\n private config: MoneyOSConfig;\n private publicClients: Map<number, PublicClient> = new Map();\n private walletClient: WalletClient | undefined;\n\n constructor(config: MoneyOSConfig) {\n this.config = {\n ...config,\n chainId: config.chainId ?? defaultChain.id,\n };\n }\n\n private getPublicClient(chainId?: number): PublicClient {\n const id = chainId ?? this.config.chainId;\n let client = this.publicClients.get(id);\n if (!client) {\n const chain = viemChains[id];\n const chainInfo = getChain(id);\n const rpcUrl =\n id === this.config.chainId ? this.config.rpcUrl : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.publicClients.set(id, client);\n }\n return client;\n }\n\n private getWalletClient(): WalletClient {\n if (!this.walletClient) {\n if (!this.config.privateKey) {\n throw new Error(\n \"No private key configured. Set privateKey in MoneyOS config.\",\n );\n }\n const account = privateKeyToAccount(this.config.privateKey);\n const chain = viemChains[this.config.chainId];\n const chainInfo = getChain(this.config.chainId);\n this.walletClient = createWalletClient({\n account,\n chain,\n transport: http(this.config.rpcUrl ?? chainInfo?.rpcUrl),\n });\n }\n return this.walletClient;\n }\n\n get address(): Address {\n if (!this.config.privateKey) {\n throw new Error(\"No private key configured.\");\n }\n return privateKeyToAccount(this.config.privateKey).address;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.config.chainId;\n const account = options?.address ?? this.address;\n const client = this.getPublicClient(chainId);\n\n if (token.toUpperCase() === \"ETH\") {\n const raw = await client.getBalance({ address: account });\n return {\n token: \"ETH\",\n symbol: \"ETH\",\n amount: formatUnits(raw, 18),\n rawAmount: raw,\n decimals: 18,\n chainId,\n };\n }\n\n const tokenAddress = getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = getToken(token)!;\n const raw = await client.readContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n });\n\n return {\n token: tokenInfo.name,\n symbol: tokenInfo.symbol,\n amount: formatUnits(raw, tokenInfo.decimals),\n rawAmount: raw,\n decimals: tokenInfo.decimals,\n chainId,\n };\n }\n\n async send(\n token: string,\n to: Address,\n amount: string,\n options?: { chainId?: number },\n ): Promise<SendResult> {\n const chainId = options?.chainId ?? this.config.chainId;\n const walletClient = this.getWalletClient();\n const from = this.address;\n\n if (token.toUpperCase() === \"ETH\") {\n const value = parseUnits(amount, 18);\n const account = privateKeyToAccount(this.config.privateKey!);\n const hash = await walletClient.sendTransaction({\n account,\n to,\n value,\n chain: viemChains[chainId],\n });\n return { hash, from, to, amount, token: \"ETH\", chainId };\n }\n\n const tokenAddress = getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n const client = this.getPublicClient(chainId);\n\n const { request } = await client.simulateContract({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n account: privateKeyToAccount(this.config.privateKey!),\n });\n\n const hash = await walletClient.writeContract(request);\n return { hash, from, to, amount, token: tokenInfo.symbol, chainId };\n }\n\n async swap(\n tokenIn: string,\n tokenOut: string,\n amount: string,\n provider: SwapProvider,\n options?: { chainId?: number; slippage?: number },\n ): Promise<SwapResult> {\n const chainId = options?.chainId ?? this.config.chainId;\n const walletClient = this.getWalletClient();\n const client = this.getPublicClient(chainId);\n const sender = this.address;\n\n const tokenInAddress = getTokenAddress(tokenIn, chainId);\n const tokenOutAddress = getTokenAddress(tokenOut, chainId);\n if (!tokenInAddress) {\n throw new Error(`Token ${tokenIn} not found on chain ${chainId}`);\n }\n if (!tokenOutAddress) {\n throw new Error(`Token ${tokenOut} not found on chain ${chainId}`);\n }\n\n const tokenInInfo = getToken(tokenIn)!;\n const amountWei = parseUnits(amount, tokenInInfo.decimals);\n\n const quote = await provider.getQuote({\n chainId,\n tokenIn: tokenInAddress,\n tokenOut: tokenOutAddress,\n amount: amountWei,\n sender,\n slippage: options?.slippage,\n });\n\n const calldata = await provider.getCalldata(quote);\n\n const currentAllowance = await client.readContract({\n address: tokenInAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [sender, calldata.to],\n });\n\n if (currentAllowance < amountWei) {\n const account = privateKeyToAccount(this.config.privateKey!);\n const { request: approveRequest } = await client.simulateContract({\n address: tokenInAddress,\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [calldata.to, amountWei],\n account,\n });\n await walletClient.writeContract(approveRequest);\n }\n\n const account = privateKeyToAccount(this.config.privateKey!);\n const hash = await walletClient.sendTransaction({\n account,\n to: calldata.to,\n data: calldata.data,\n value: calldata.value,\n chain: viemChains[chainId],\n });\n\n const tokenOutInfo = getToken(tokenOut)!;\n return {\n hash,\n tokenIn: tokenInInfo.symbol,\n tokenOut: tokenOutInfo.symbol,\n amountIn: amount,\n amountOut: formatUnits(BigInt(quote.expectedOut), tokenOutInfo.decimals),\n chainId,\n };\n }\n}\n","import type { Chain } from \"./types.js\";\n\nexport const chains: Record<string, Chain> = {\n arbitrum: {\n id: 42161,\n name: \"Arbitrum One\",\n rpcUrl: \"https://arb1.arbitrum.io/rpc\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://arbiscan.io\",\n },\n ethereum: {\n id: 1,\n name: \"Ethereum\",\n rpcUrl: \"https://eth.public-rpc.com\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n blockExplorer: \"https://etherscan.io\",\n },\n polygon: {\n id: 137,\n name: \"Polygon\",\n rpcUrl: \"https://polygon-rpc.com\",\n nativeCurrency: { name: \"POL\", symbol: \"POL\", decimals: 18 },\n blockExplorer: \"https://polygonscan.com\",\n },\n};\n\nexport const defaultChain = chains.arbitrum;\n\nexport function getChain(idOrName: number | string): Chain | undefined {\n if (typeof idOrName === \"number\") {\n return Object.values(chains).find((c) => c.id === idOrName);\n }\n return chains[idOrName.toLowerCase()];\n}\n","import type { Address } from \"viem\";\n\nexport interface Token {\n symbol: string;\n name: string;\n decimals: number;\n addresses: Record<number, Address>;\n}\n\nexport const tokens: Record<string, Token> = {\n USDC: {\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n addresses: {\n 42161: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n 1: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n 137: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n },\n },\n USDT: {\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n addresses: {\n 42161: \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n 1: \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n 137: \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n },\n },\n RYZE: {\n symbol: \"RYZE\",\n name: \"RYZE\",\n decimals: 18,\n addresses: {\n 42161: \"0x7712da72127d5dD213B621497D6E4899d5989e5C\",\n },\n },\n};\n\nexport function getToken(symbol: string): Token | undefined {\n return tokens[symbol.toUpperCase()];\n}\n\nexport function getTokenAddress(\n symbol: string,\n chainId: number,\n): Address | undefined {\n return getToken(symbol)?.addresses[chainId];\n}\n","import type { Address, Hex } from \"viem\";\nimport type { SwapProvider, SwapQuote } from \"../core/types.js\";\n\nconst ODOS_API = \"https://api.odos.xyz\";\n\ninterface OdosQuoteResponse {\n pathId: string;\n outAmounts: string[];\n outValues: number[];\n}\n\ninterface OdosAssembleResponse {\n transaction: {\n to: string;\n data: string;\n value: string;\n };\n}\n\nexport class OdosProvider implements SwapProvider {\n name = \"odos\";\n private apiKey?: string;\n\n constructor(options?: { apiKey?: string }) {\n this.apiKey = options?.apiKey;\n }\n\n async getQuote(params: {\n chainId: number;\n tokenIn: Address;\n tokenOut: Address;\n amount: bigint;\n sender: Address;\n slippage?: number;\n }): Promise<SwapQuote & { pathId: string }> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(`${ODOS_API}/sor/quote/v2`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n chainId: params.chainId,\n inputTokens: [\n {\n tokenAddress: params.tokenIn,\n amount: params.amount.toString(),\n },\n ],\n outputTokens: [\n {\n tokenAddress: params.tokenOut,\n proportion: 1,\n },\n ],\n userAddr: params.sender,\n slippageLimitPercent: params.slippage ?? 1,\n referralCode: 0,\n compact: true,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Odos quote failed: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as OdosQuoteResponse;\n\n return {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amount.toString(),\n expectedOut: data.outAmounts[0],\n router: \"\" as Address,\n chainId: params.chainId,\n pathId: data.pathId,\n };\n }\n\n async getCalldata(\n quote: SwapQuote & { pathId: string },\n ): Promise<{ to: Address; data: Hex; value: bigint }> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this.apiKey) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n\n const response = await fetch(`${ODOS_API}/sor/assemble`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n userAddr: quote.tokenIn,\n pathId: quote.pathId,\n simulate: false,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Odos assemble failed: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as OdosAssembleResponse;\n\n return {\n to: data.transaction.to as Address,\n data: data.transaction.data as Hex,\n value: BigInt(data.transaction.value),\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAWO;AACP,sBAAoC;AACpC,oBAA2C;;;ACXpC,IAAM,SAAgC;AAAA,EAC3C,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC7D,eAAe;AAAA,EACjB;AAAA,EACA,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC7D,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC3D,eAAe;AAAA,EACjB;AACF;AAEO,IAAM,eAAe,OAAO;AAE5B,SAAS,SAAS,UAA8C;AACrE,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO,OAAO,OAAO,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAAA,EAC5D;AACA,SAAO,OAAO,SAAS,YAAY,CAAC;AACtC;;;ACxBO,IAAM,SAAgC;AAAA,EAC3C,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,MACT,OAAO;AAAA,MACP,GAAG;AAAA,MACH,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,MACT,OAAO;AAAA,MACP,GAAG;AAAA,MACH,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,SAAS,QAAmC;AAC1D,SAAO,OAAO,OAAO,YAAY,CAAC;AACpC;AAEO,SAAS,gBACd,QACA,SACqB;AACrB,SAAO,SAAS,MAAM,GAAG,UAAU,OAAO;AAC5C;;;AFzBA,IAAM,YAAY;AAAA,EAChB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,WAAW,MAAM,UAAU,CAAC;AAAA,IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,MAC9B,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,QAAQ,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MACnC,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MACjC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;AAEA,IAAM,aAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,GAAG;AAAA,EACH,KAAK;AACP;AAEO,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA,gBAA2C,oBAAI,IAAI;AAAA,EACnD;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,SAAS,OAAO,WAAW,aAAa;AAAA,IAC1C;AAAA,EACF;AAAA,EAEQ,gBAAgB,SAAgC;AACtD,UAAM,KAAK,WAAW,KAAK,OAAO;AAClC,QAAI,SAAS,KAAK,cAAc,IAAI,EAAE;AACtC,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,WAAW,EAAE;AAC3B,YAAM,YAAY,SAAS,EAAE;AAC7B,YAAM,SACJ,OAAO,KAAK,OAAO,UAAU,KAAK,OAAO,SAAS;AAEpD,mBAAS,gCAAmB;AAAA,QAC1B;AAAA,QACA,eAAW,kBAAK,UAAU,WAAW,MAAM;AAAA,MAC7C,CAAC;AACD,WAAK,cAAc,IAAI,IAAI,MAAM;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAgC;AACtC,QAAI,CAAC,KAAK,cAAc;AACtB,UAAI,CAAC,KAAK,OAAO,YAAY;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,YAAM,cAAU,qCAAoB,KAAK,OAAO,UAAU;AAC1D,YAAM,QAAQ,WAAW,KAAK,OAAO,OAAO;AAC5C,YAAM,YAAY,SAAS,KAAK,OAAO,OAAO;AAC9C,WAAK,mBAAe,gCAAmB;AAAA,QACrC;AAAA,QACA;AAAA,QACA,eAAW,kBAAK,KAAK,OAAO,UAAU,WAAW,MAAM;AAAA,MACzD,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAAmB;AACrB,QAAI,CAAC,KAAK,OAAO,YAAY;AAC3B,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,eAAO,qCAAoB,KAAK,OAAO,UAAU,EAAE;AAAA,EACrD;AAAA,EAEA,MAAM,QACJ,OACA,SACkB;AAClB,UAAM,UAAU,SAAS,WAAW,KAAK,OAAO;AAChD,UAAM,UAAU,SAAS,WAAW,KAAK;AACzC,UAAM,SAAS,KAAK,gBAAgB,OAAO;AAE3C,QAAI,MAAM,YAAY,MAAM,OAAO;AACjC,YAAMA,OAAM,MAAM,OAAO,WAAW,EAAE,SAAS,QAAQ,CAAC;AACxD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAQ,yBAAYA,MAAK,EAAE;AAAA,QAC3B,WAAWA;AAAA,QACX,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,gBAAgB,OAAO,OAAO;AACnD,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,SAAS,KAAK,uBAAuB,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,YAAY,SAAS,KAAK;AAChC,UAAM,MAAM,MAAM,OAAO,aAAa;AAAA,MACpC,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,OAAO;AAAA,IAChB,CAAC;AAED,WAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB,QAAQ,UAAU;AAAA,MAClB,YAAQ,yBAAY,KAAK,UAAU,QAAQ;AAAA,MAC3C,WAAW;AAAA,MACX,UAAU,UAAU;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,OACA,IACA,QACA,SACqB;AACrB,UAAM,UAAU,SAAS,WAAW,KAAK,OAAO;AAChD,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,OAAO,KAAK;AAElB,QAAI,MAAM,YAAY,MAAM,OAAO;AACjC,YAAMC,aAAQ,wBAAW,QAAQ,EAAE;AACnC,YAAM,cAAU,qCAAoB,KAAK,OAAO,UAAW;AAC3D,YAAMC,QAAO,MAAM,aAAa,gBAAgB;AAAA,QAC9C;AAAA,QACA;AAAA,QACA,OAAAD;AAAA,QACA,OAAO,WAAW,OAAO;AAAA,MAC3B,CAAC;AACD,aAAO,EAAE,MAAAC,OAAM,MAAM,IAAI,QAAQ,OAAO,OAAO,QAAQ;AAAA,IACzD;AAEA,UAAM,eAAe,gBAAgB,OAAO,OAAO;AACnD,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,SAAS,KAAK,uBAAuB,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,YAAY,SAAS,KAAK;AAChC,UAAM,YAAQ,wBAAW,QAAQ,UAAU,QAAQ;AACnD,UAAM,SAAS,KAAK,gBAAgB,OAAO;AAE3C,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,iBAAiB;AAAA,MAChD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,IAAI,KAAK;AAAA,MAChB,aAAS,qCAAoB,KAAK,OAAO,UAAW;AAAA,IACtD,CAAC;AAED,UAAM,OAAO,MAAM,aAAa,cAAc,OAAO;AACrD,WAAO,EAAE,MAAM,MAAM,IAAI,QAAQ,OAAO,UAAU,QAAQ,QAAQ;AAAA,EACpE;AAAA,EAEA,MAAM,KACJ,SACA,UACA,QACA,UACA,SACqB;AACrB,UAAM,UAAU,SAAS,WAAW,KAAK,OAAO;AAChD,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,SAAS,KAAK,gBAAgB,OAAO;AAC3C,UAAM,SAAS,KAAK;AAEpB,UAAM,iBAAiB,gBAAgB,SAAS,OAAO;AACvD,UAAM,kBAAkB,gBAAgB,UAAU,OAAO;AACzD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,SAAS,OAAO,uBAAuB,OAAO,EAAE;AAAA,IAClE;AACA,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI,MAAM,SAAS,QAAQ,uBAAuB,OAAO,EAAE;AAAA,IACnE;AAEA,UAAM,cAAc,SAAS,OAAO;AACpC,UAAM,gBAAY,wBAAW,QAAQ,YAAY,QAAQ;AAEzD,UAAM,QAAQ,MAAM,SAAS,SAAS;AAAA,MACpC;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,SAAS;AAAA,IACrB,CAAC;AAED,UAAM,WAAW,MAAM,SAAS,YAAY,KAAK;AAEjD,UAAM,mBAAmB,MAAM,OAAO,aAAa;AAAA,MACjD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,QAAQ,SAAS,EAAE;AAAA,IAC5B,CAAC;AAED,QAAI,mBAAmB,WAAW;AAChC,YAAMC,eAAU,qCAAoB,KAAK,OAAO,UAAW;AAC3D,YAAM,EAAE,SAAS,eAAe,IAAI,MAAM,OAAO,iBAAiB;AAAA,QAChE,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,SAAS,IAAI,SAAS;AAAA,QAC7B,SAAAA;AAAA,MACF,CAAC;AACD,YAAM,aAAa,cAAc,cAAc;AAAA,IACjD;AAEA,UAAM,cAAU,qCAAoB,KAAK,OAAO,UAAW;AAC3D,UAAM,OAAO,MAAM,aAAa,gBAAgB;AAAA,MAC9C;AAAA,MACA,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,OAAO,WAAW,OAAO;AAAA,IAC3B,CAAC;AAED,UAAM,eAAe,SAAS,QAAQ;AACtC,WAAO;AAAA,MACL;AAAA,MACA,SAAS,YAAY;AAAA,MACrB,UAAU,aAAa;AAAA,MACvB,UAAU;AAAA,MACV,eAAW,yBAAY,OAAO,MAAM,WAAW,GAAG,aAAa,QAAQ;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AACF;;;AGxSA,IAAM,WAAW;AAgBV,IAAM,eAAN,MAA2C;AAAA,EAChD,OAAO;AAAA,EACC;AAAA,EAER,YAAY,SAA+B;AACzC,SAAK,SAAS,SAAS;AAAA,EACzB;AAAA,EAEA,MAAM,SAAS,QAO6B;AAC1C,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AACA,QAAI,KAAK,QAAQ;AACf,cAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAAA,IAClD;AAEA,UAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,iBAAiB;AAAA,MACvD,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,SAAS,OAAO;AAAA,QAChB,aAAa;AAAA,UACX;AAAA,YACE,cAAc,OAAO;AAAA,YACrB,QAAQ,OAAO,OAAO,SAAS;AAAA,UACjC;AAAA,QACF;AAAA,QACA,cAAc;AAAA,UACZ;AAAA,YACE,cAAc,OAAO;AAAA,YACrB,YAAY;AAAA,UACd;AAAA,QACF;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,sBAAsB,OAAO,YAAY;AAAA,QACzC,cAAc;AAAA,QACd,SAAS;AAAA,MACX,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,MAAM,sBAAsB,SAAS,MAAM,IAAI,IAAI,EAAE;AAAA,IACjE;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO,OAAO,SAAS;AAAA,MACjC,aAAa,KAAK,WAAW,CAAC;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,MAChB,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,OACoD;AACpD,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AACA,QAAI,KAAK,QAAQ;AACf,cAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAAA,IAClD;AAEA,UAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,iBAAiB;AAAA,MACvD,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,IAAI,EAAE;AAAA,IACpE;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,WAAO;AAAA,MACL,IAAI,KAAK,YAAY;AAAA,MACrB,MAAM,KAAK,YAAY;AAAA,MACvB,OAAO,OAAO,KAAK,YAAY,KAAK;AAAA,IACtC;AAAA,EACF;AACF;","names":["raw","value","hash","account"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,21 @@
1
+ import {
2
+ MoneyOS,
3
+ OdosProvider,
4
+ chains,
5
+ defaultChain,
6
+ getChain,
7
+ getToken,
8
+ getTokenAddress,
9
+ tokens
10
+ } from "./chunk-RDIRDICH.mjs";
11
+ export {
12
+ MoneyOS,
13
+ OdosProvider,
14
+ chains,
15
+ defaultChain,
16
+ getChain,
17
+ getToken,
18
+ getTokenAddress,
19
+ tokens
20
+ };
21
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "moneyos",
3
+ "version": "0.1.0",
4
+ "description": "The operating system for money. Programmable money primitives for developers and AI agents.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "moneyos": "dist/cli/index.mjs"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "lint": "eslint src/",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest"
24
+ },
25
+ "keywords": [
26
+ "money",
27
+ "payments",
28
+ "crypto",
29
+ "stablecoin",
30
+ "wallet",
31
+ "sdk",
32
+ "cli",
33
+ "agent",
34
+ "ai",
35
+ "web3"
36
+ ],
37
+ "author": "Aryze",
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/moneyos/moneyos"
42
+ },
43
+ "engines": {
44
+ "node": ">=18"
45
+ },
46
+ "files": [
47
+ "dist"
48
+ ],
49
+ "dependencies": {
50
+ "viem": "^2.45.1",
51
+ "commander": "^13.1.0"
52
+ },
53
+ "devDependencies": {
54
+ "tsup": "^8.4.0",
55
+ "typescript": "^5.9.3",
56
+ "vitest": "^3.1.1",
57
+ "@types/node": "^22.15.3",
58
+ "eslint": "^9.25.1"
59
+ }
60
+ }