moneyos 0.3.2 → 0.3.3
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/README.md +0 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -9
package/README.md
CHANGED
|
@@ -12,7 +12,6 @@ but the repo is structured so each major surface can evolve independently.
|
|
|
12
12
|
- `moneyos`: the root SDK + CLI package
|
|
13
13
|
- `@moneyos/core`: runtime interfaces, shared types, chain/token registries
|
|
14
14
|
- `@moneyos/tool-swap`: swap execution tool and provider surface
|
|
15
|
-
- `@moneyos/executor-particle`: Particle AA smart-account executor
|
|
16
15
|
|
|
17
16
|
## CLI
|
|
18
17
|
|
|
@@ -186,7 +185,6 @@ What still needs more hands-on validation:
|
|
|
186
185
|
- live session-backed ETH send
|
|
187
186
|
- live session-backed ERC-20 send
|
|
188
187
|
- live session-backed swap
|
|
189
|
-
- Particle executor against real infrastructure
|
|
190
188
|
- more live usage of the encrypted-wallet/auth/backup flow in a real terminal
|
|
191
189
|
|
|
192
190
|
## Development
|
|
@@ -195,7 +193,6 @@ What still needs more hands-on validation:
|
|
|
195
193
|
npm install
|
|
196
194
|
npm run build:core
|
|
197
195
|
npm run build:tool-swap
|
|
198
|
-
npm run build:executor-particle
|
|
199
196
|
npm run typecheck
|
|
200
197
|
npm test
|
|
201
198
|
npm run lint
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/client.ts","../packages/core/src/tokens.ts","../packages/core/src/chains.ts","../src/core/eoa.ts","../src/core/signer.ts","../src/tools/swap.ts","../src/providers/odos.ts","../src/core/access-local.ts","../src/core/keystore-file.ts","../src/core/factory.ts"],"sourcesContent":["export { MoneyOS } from \"./core/client.js\";\nexport { OdosProvider } from \"./providers/odos.js\";\n\n// Runtime implementations\nexport { ViemReadClient, EOAExecutor } from \"./core/eoa.js\";\nexport { LocalAccessAdapter } from \"./core/access-local.js\";\n\n// KeyStores\nexport { FileKeyStore } from \"./core/keystore-file.js\";\nexport type { FileKeyStoreOptions } from \"./core/keystore-file.js\";\n\n// Factory\nexport { createMoneyOS } from \"./core/factory.js\";\n\n// Re-export everything from @moneyos/core for backwards compatibility\nexport {\n chains,\n defaultChain,\n getChain,\n tokens,\n getToken,\n getTokenAddress,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\n\nexport type {\n // Types\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapQuote,\n SwapResult,\n SwapProvider,\n Chain,\n Token,\n // Runtime\n MoneyOSRuntime,\n RuntimeConfig,\n CallRequest,\n ExecutionResult,\n ExecutionClient,\n ReadClient,\n AccessAdapter,\n AccessSession,\n SessionContext,\n MoneyOSAction,\n ActionContext,\n AssetRegistry,\n // KeyStore\n KeyStore,\n KeyStoreKind,\n KeyStoreMetadata,\n} from \"@moneyos/core\";\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapProvider,\n SwapResult,\n ReadClient,\n ExecutionClient,\n AssetRegistry,\n MoneyOSRuntime,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport {\n getChain,\n defaultChain,\n getToken,\n getTokenAddress,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\nimport { ViemReadClient, EOAExecutor } from \"./eoa.js\";\nimport { executeSwap } from \"../tools/swap.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] as const;\n\nclass DefaultAssetRegistry implements AssetRegistry {\n readonly nativeTokenAddress = NATIVE_TOKEN_ADDRESS;\n getToken = getToken;\n getTokenAddress = getTokenAddress;\n getChain = getChain;\n}\n\nexport class MoneyOS {\n private read: ReadClient;\n private executor: ExecutionClient | undefined;\n private assets: AssetRegistry;\n private runtimeConfig: RuntimeConfig;\n\n constructor(config: MoneyOSConfig) {\n // Mutual exclusion: at most one of `execute`, `privateKey`, `signer`.\n // These represent three different ways to produce a signing identity;\n // combining them would be ambiguous.\n const provided: string[] = [];\n if (config.execute) provided.push(\"execute\");\n if (config.privateKey) provided.push(\"privateKey\");\n if (config.signer) provided.push(\"signer\");\n if (provided.length > 1) {\n throw new Error(\n `MoneyOSConfig: pass at most one of \\`execute\\`, \\`privateKey\\`, or \\`signer\\`. Received: ${provided.join(\", \")}.`,\n );\n }\n\n this.runtimeConfig = {\n defaultChainId: config.chainId ?? defaultChain.id,\n rpcUrl: config.rpcUrl,\n };\n\n this.read = config.read ?? new ViemReadClient(this.runtimeConfig);\n this.assets = config.assets ?? new DefaultAssetRegistry();\n\n if (config.execute) {\n this.executor = config.execute;\n } else if (config.signer) {\n this.executor = new EOAExecutor(config.signer, this.runtimeConfig);\n } else if (config.privateKey) {\n this.executor = EOAExecutor.fromPrivateKey(\n config.privateKey,\n this.runtimeConfig,\n );\n }\n }\n\n get runtime(): MoneyOSRuntime {\n return {\n read: this.read,\n execute: this.requireExecutor(),\n assets: this.assets,\n config: this.runtimeConfig,\n };\n }\n\n get address(): Address {\n return this.requireExecutor().getAddress();\n }\n\n private requireExecutor(): ExecutionClient {\n if (!this.executor) {\n throw new Error(\n \"No signing account configured. Set `signer`, `privateKey`, or `execute` in MoneyOS config.\",\n );\n }\n return this.executor;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const raw = await this.read.getBalance({ address: account, chainId });\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 const raw = await this.read.readContract<bigint>({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n chainId,\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const from = execute.getAddress();\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const result = await execute.send({ to, value, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n });\n\n const result = await execute.send({ to: tokenAddress, data, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n\n return executeSwap(\n { tokenIn, tokenOut, amount, provider, chainId, slippage: options?.slippage },\n { read: this.read, execute, assets: this.assets },\n );\n }\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 NATIVE_TOKEN_ADDRESS =\n \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as Address;\n\nexport const tokens: Record<string, Token> = {\n ETH: {\n symbol: \"ETH\",\n name: \"Ether\",\n decimals: 18,\n addresses: {\n 42161: NATIVE_TOKEN_ADDRESS,\n 1: NATIVE_TOKEN_ADDRESS,\n },\n },\n POL: {\n symbol: \"POL\",\n name: \"POL\",\n decimals: 18,\n addresses: {\n 137: NATIVE_TOKEN_ADDRESS,\n },\n },\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 { 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 {\n createPublicClient,\n createWalletClient,\n http,\n type Account,\n type Address,\n type Hex,\n type PublicClient,\n type WalletClient,\n type Chain as ViemChain,\n} from \"viem\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport { getChain } from \"@moneyos/core\";\nimport type {\n CallRequest,\n ExecutionClient,\n ExecutionResult,\n ReadClient,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\nconst viemChainMap: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nfunction getViemChain(chainId: number): ViemChain | undefined {\n return viemChainMap[chainId];\n}\n\n// --- Read ---\n\nexport class ViemReadClient implements ReadClient {\n private clients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n }\n\n private getClient(chainId: number): PublicClient {\n let client = this.clients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.clients.set(chainId, client);\n }\n return client;\n }\n\n async getBalance(params: {\n address: Address;\n chainId: number;\n }): Promise<bigint> {\n const client = this.getClient(params.chainId);\n return client.getBalance({ address: params.address });\n }\n\n async readContract<T = unknown>(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n chainId: number;\n }): Promise<T> {\n const client = this.getClient(params.chainId);\n return client.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }) as Promise<T>;\n }\n}\n\n// --- Execute ---\n\nexport class EOAExecutor implements ExecutionClient {\n readonly mode = \"eoa\" as const;\n private signer: Account;\n private walletClients: Map<number, WalletClient> = new Map();\n private publicClients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(signer: Account, config: RuntimeConfig) {\n this.signer = signer;\n this.config = config;\n }\n\n /**\n * Convenience factory: build an EOAExecutor from a raw private key.\n * Equivalent to `new EOAExecutor(privateKeyToAccount(privateKey), config)`.\n * Kept as a helper so the common \"I have a hex key\" path stays one line\n * while the constructor itself takes a viem `Account` to accommodate\n * future keystore-backed signers (hardware, KMS, MPC).\n *\n * Attach viem's nonce manager so back-to-back live transactions use a\n * pending-aware nonce source instead of relying on RPC fill behavior.\n */\n static fromPrivateKey(privateKey: Hex, config: RuntimeConfig): EOAExecutor {\n return new EOAExecutor(privateKeyToManagedAccount(privateKey), config);\n }\n\n private getWalletClient(chainId: number): WalletClient {\n let client = this.walletClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createWalletClient({\n account: this.signer,\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.walletClients.set(chainId, client);\n }\n return client;\n }\n\n private getPublicClient(chainId: number): PublicClient {\n let client = this.publicClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.publicClients.set(chainId, client);\n }\n return client;\n }\n\n getAddress(): Address {\n return this.signer.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const walletClient = this.getWalletClient(call.chainId);\n const hash = await walletClient.sendTransaction({\n account: walletClient.account!,\n to: call.to,\n data: call.data,\n value: call.value ?? 0n,\n chain: walletClient.chain,\n });\n\n // Wait for inclusion before resolving. Returning on broadcast makes\n // sequenced operations like \"approve then swap\" unsafe: the next\n // call's preflight (eth_estimateGas / eth_call) runs against the\n // latest mined block, so a still-pending approve is invisible and\n // the swap reverts at simulation time. The same broadcast-only\n // resolution also lets viem's nonce manager drift past the chain\n // when a sequenced call fails preflight, leaving the executor stuck\n // submitting nonces the chain has not yet reached.\n //\n // For an interactive CLI, slower is acceptable; ambiguous transaction\n // state is not.\n const publicClient = this.getPublicClient(call.chainId);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(\n `Transaction ${hash} reverted on chain ${call.chainId} (block ${receipt.blockNumber}).`,\n );\n }\n\n return { hash, chainId: call.chainId };\n }\n\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n }\n}\n","import type { Account, Hex } from \"viem\";\nimport { nonceManager } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n/**\n * Build a local viem Account with nonce management enabled so back-to-back\n * live transactions use a pending-aware nonce source.\n */\nexport function privateKeyToManagedAccount(privateKey: Hex): Account {\n return privateKeyToAccount(privateKey, { nonceManager });\n}\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n} from \"viem\";\nimport type { ReadClient, ExecutionClient, AssetRegistry, SwapProvider, SwapResult } from \"@moneyos/core\";\n\nconst ERC20_ABI = [\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\nexport interface SwapInput {\n tokenIn: string;\n tokenOut: string;\n amount: string;\n provider: SwapProvider;\n chainId: number;\n slippage?: number;\n}\n\nexport async function executeSwap(\n input: SwapInput,\n ctx: { read: ReadClient; execute: ExecutionClient; assets: AssetRegistry },\n): Promise<SwapResult> {\n const { tokenIn, tokenOut, amount, provider, chainId, slippage } = input;\n const { read, execute, assets } = ctx;\n const sender = execute.getAddress();\n\n const tokenInAddress = assets.getTokenAddress(tokenIn, chainId);\n const tokenOutAddress = assets.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 = assets.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,\n });\n\n const calldata = await provider.getCalldata(quote);\n\n const isNativeIn = tokenInAddress === assets.nativeTokenAddress;\n\n if (!isNativeIn) {\n const currentAllowance = await read.readContract<bigint>({\n address: tokenInAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [sender, calldata.to],\n chainId,\n });\n\n if (currentAllowance < amountWei) {\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [calldata.to, amountWei],\n });\n await execute.send({ to: tokenInAddress, data: approveData, chainId });\n }\n }\n\n const result = await execute.send({\n to: calldata.to,\n data: calldata.data,\n value: isNativeIn ? amountWei : calldata.value,\n chainId,\n });\n\n const tokenOutInfo = assets.getToken(tokenOut)!;\n return {\n hash: result.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","import type { Address, Hex } from \"viem\";\nimport type { SwapProvider, SwapQuote } from \"@moneyos/core\";\nimport { NATIVE_TOKEN_ADDRESS } from \"@moneyos/core\";\n\nconst ODOS_API = \"https://api.odos.xyz\";\nconst ODOS_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\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 private toOdosAddress(address: Address): Address {\n return address === NATIVE_TOKEN_ADDRESS ? ODOS_NATIVE_ADDRESS : address;\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; sender: Address }> {\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: this.toOdosAddress(params.tokenIn),\n amount: params.amount.toString(),\n },\n ],\n outputTokens: [\n {\n tokenAddress: this.toOdosAddress(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 sender: params.sender,\n };\n }\n\n async getCalldata(\n quote: SwapQuote & { pathId: string; sender: Address },\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.sender,\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","import type { Address, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { AccessAdapter, AccessSession, SessionContext } from \"@moneyos/core\";\n\nclass LocalAccessSession implements AccessSession {\n readonly kind = \"local\" as const;\n private address: Address;\n\n constructor(privateKey: Hex) {\n this.address = privateKeyToAccount(privateKey).address;\n }\n\n getAddress(): Address {\n return this.address;\n }\n}\n\nexport class LocalAccessAdapter implements AccessAdapter {\n readonly name = \"local\";\n private privateKey: Hex;\n\n constructor(privateKey: Hex) {\n this.privateKey = privateKey;\n }\n\n async openSession(_ctx: SessionContext): Promise<AccessSession> {\n return new LocalAccessSession(this.privateKey);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Account, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { KeyStore, KeyStoreMetadata } from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\n/**\n * FileKeyStore — raw-key JSON helper for library consumers.\n *\n * Reads a raw private key from a JSON file on disk (by default\n * `~/.moneyos/config.json`) and derives a viem `Account` from it.\n *\n * MoneyOS CLI no longer uses plaintext `config.json` wallet storage as its\n * default path. The CLI now uses an encrypted wallet file plus a local unlock\n * session. This helper remains available for advanced SDK use cases and\n * explicit raw-key compatibility paths outside the default CLI flow.\n */\n\nexport interface FileKeyStoreOptions {\n /**\n * Absolute path to the JSON config file that holds the private key.\n * Defaults to `~/.moneyos/config.json` for compatibility with earlier\n * raw-key layouts and explicit SDK usage.\n */\n configPath?: string;\n}\n\nconst DEFAULT_CONFIG_PATH = join(homedir(), \".moneyos\", \"config.json\");\n\n/**\n * Minimal shape of the on-disk config that `FileKeyStore` cares about.\n * Other fields (chainId, rpcUrl, future keystore metadata) are tolerated\n * and ignored.\n */\ninterface FileKeyStoreConfig {\n privateKey?: Hex;\n}\n\nexport class FileKeyStore implements KeyStore {\n readonly kind = \"file\" as const;\n private configPath: string;\n\n constructor(options: FileKeyStoreOptions = {}) {\n this.configPath = options.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async hasKey(): Promise<boolean> {\n const config = this.readConfig();\n return Boolean(config?.privateKey);\n }\n\n async metadata(): Promise<KeyStoreMetadata> {\n const config = this.readConfig();\n const address = config?.privateKey\n ? privateKeyToAccount(config.privateKey).address\n : undefined;\n return {\n kind: \"file\",\n address,\n };\n }\n\n async loadSigner(): Promise<Account> {\n const config = this.readConfig();\n if (!config?.privateKey) {\n throw new Error(\n `FileKeyStore: no private key found at ${this.configPath}. Run \\`moneyos init\\` to create one.`,\n );\n }\n return privateKeyToManagedAccount(config.privateKey);\n }\n\n /**\n * Read and validate the config file. Returns `undefined` if the file does\n * not exist. Throws with context for any other failure mode (malformed\n * JSON, wrong top-level type, wrong `privateKey` type). The hex format of\n * the key itself is validated later by viem's `privateKeyToAccount`.\n */\n private readConfig(): FileKeyStoreConfig | undefined {\n if (!existsSync(this.configPath)) {\n return undefined;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(this.configPath, \"utf-8\"));\n } catch (error) {\n throw new Error(\n `FileKeyStore: failed to read config at ${this.configPath}`,\n { cause: error },\n );\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\n `FileKeyStore: config at ${this.configPath} is not a JSON object`,\n );\n }\n\n const pk = (parsed as { privateKey?: unknown }).privateKey;\n if (pk === undefined || pk === null) {\n return {};\n }\n if (typeof pk !== \"string\") {\n throw new Error(\n `FileKeyStore: privateKey at ${this.configPath} must be a string`,\n );\n }\n return { privateKey: pk as Hex };\n }\n}\n","import type { MoneyOSConfig } from \"@moneyos/core\";\nimport { MoneyOS } from \"./client.js\";\n\n/**\n * Create a MoneyOS instance.\n *\n * Default EOA usage:\n * ```ts\n * const moneyos = createMoneyOS({ chainId: 42161, privateKey: \"0x...\" });\n * await moneyos.send(\"USDC\", \"0x...\", \"10\");\n * ```\n *\n * Custom execution (e.g. gasless smart-account):\n * ```ts\n * import { ParticleExecutor } from \"@moneyos/executor-particle\";\n * const moneyos = createMoneyOS({\n * chainId: 42161,\n * execute: new ParticleExecutor({ ... }),\n * });\n * // moneyos.send / moneyos.swap transparently use the injected executor\n * ```\n *\n * You can also inject `read` or `assets` if you need custom implementations.\n * `privateKey` and `execute` are mutually exclusive.\n *\n * Future (with tools):\n * ```ts\n * const moneyos = createMoneyOS(config).use(swapTool());\n * ```\n */\nexport function createMoneyOS(config: MoneyOSConfig): MoneyOS {\n return new MoneyOS(config);\n}\n"],"mappings":"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","names":["import_viem","import_viem","import_viem","ERC20_ABI","raw","result","import_accounts","import_accounts"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/client.ts","../packages/core/src/tokens.ts","../packages/core/src/chains.ts","../src/core/eoa.ts","../src/core/signer.ts","../src/tools/swap.ts","../src/providers/odos.ts","../src/core/access-local.ts","../src/core/keystore-file.ts","../src/core/factory.ts"],"sourcesContent":["export { MoneyOS } from \"./core/client.js\";\nexport { OdosProvider } from \"./providers/odos.js\";\n\n// Runtime implementations\nexport { ViemReadClient, EOAExecutor } from \"./core/eoa.js\";\nexport { LocalAccessAdapter } from \"./core/access-local.js\";\n\n// KeyStores\nexport { FileKeyStore } from \"./core/keystore-file.js\";\nexport type { FileKeyStoreOptions } from \"./core/keystore-file.js\";\n\n// Factory\nexport { createMoneyOS } from \"./core/factory.js\";\n\n// Re-export everything from @moneyos/core for backwards compatibility\nexport {\n chains,\n defaultChain,\n getChain,\n tokens,\n getToken,\n getTokenAddress,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\n\nexport type {\n // Types\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapQuote,\n SwapResult,\n SwapProvider,\n Chain,\n Token,\n // Runtime\n MoneyOSRuntime,\n RuntimeConfig,\n CallRequest,\n ExecutionResult,\n ExecutionClient,\n ReadClient,\n AccessAdapter,\n AccessSession,\n SessionContext,\n MoneyOSAction,\n ActionContext,\n AssetRegistry,\n // KeyStore\n KeyStore,\n KeyStoreKind,\n KeyStoreMetadata,\n} from \"@moneyos/core\";\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapProvider,\n SwapResult,\n ReadClient,\n ExecutionClient,\n AssetRegistry,\n MoneyOSRuntime,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport {\n getChain,\n defaultChain,\n getToken,\n getTokenAddress,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\nimport { ViemReadClient, EOAExecutor } from \"./eoa.js\";\nimport { executeSwap } from \"../tools/swap.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] as const;\n\nclass DefaultAssetRegistry implements AssetRegistry {\n readonly nativeTokenAddress = NATIVE_TOKEN_ADDRESS;\n getToken = getToken;\n getTokenAddress = getTokenAddress;\n getChain = getChain;\n}\n\nexport class MoneyOS {\n private read: ReadClient;\n private executor: ExecutionClient | undefined;\n private assets: AssetRegistry;\n private runtimeConfig: RuntimeConfig;\n\n constructor(config: MoneyOSConfig) {\n // Mutual exclusion: at most one of `execute`, `privateKey`, `signer`.\n // These represent three different ways to produce a signing identity;\n // combining them would be ambiguous.\n const provided: string[] = [];\n if (config.execute) provided.push(\"execute\");\n if (config.privateKey) provided.push(\"privateKey\");\n if (config.signer) provided.push(\"signer\");\n if (provided.length > 1) {\n throw new Error(\n `MoneyOSConfig: pass at most one of \\`execute\\`, \\`privateKey\\`, or \\`signer\\`. Received: ${provided.join(\", \")}.`,\n );\n }\n\n this.runtimeConfig = {\n defaultChainId: config.chainId ?? defaultChain.id,\n rpcUrl: config.rpcUrl,\n };\n\n this.read = config.read ?? new ViemReadClient(this.runtimeConfig);\n this.assets = config.assets ?? new DefaultAssetRegistry();\n\n if (config.execute) {\n this.executor = config.execute;\n } else if (config.signer) {\n this.executor = new EOAExecutor(config.signer, this.runtimeConfig);\n } else if (config.privateKey) {\n this.executor = EOAExecutor.fromPrivateKey(\n config.privateKey,\n this.runtimeConfig,\n );\n }\n }\n\n get runtime(): MoneyOSRuntime {\n return {\n read: this.read,\n execute: this.requireExecutor(),\n assets: this.assets,\n config: this.runtimeConfig,\n };\n }\n\n get address(): Address {\n return this.requireExecutor().getAddress();\n }\n\n private requireExecutor(): ExecutionClient {\n if (!this.executor) {\n throw new Error(\n \"No signing account configured. Set `signer`, `privateKey`, or `execute` in MoneyOS config.\",\n );\n }\n return this.executor;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const raw = await this.read.getBalance({ address: account, chainId });\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 const raw = await this.read.readContract<bigint>({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n chainId,\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const from = execute.getAddress();\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const result = await execute.send({ to, value, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n });\n\n const result = await execute.send({ to: tokenAddress, data, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n\n return executeSwap(\n { tokenIn, tokenOut, amount, provider, chainId, slippage: options?.slippage },\n { read: this.read, execute, assets: this.assets },\n );\n }\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 NATIVE_TOKEN_ADDRESS =\n \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as Address;\n\nexport const tokens: Record<string, Token> = {\n ETH: {\n symbol: \"ETH\",\n name: \"Ether\",\n decimals: 18,\n addresses: {\n 42161: NATIVE_TOKEN_ADDRESS,\n 1: NATIVE_TOKEN_ADDRESS,\n },\n },\n POL: {\n symbol: \"POL\",\n name: \"POL\",\n decimals: 18,\n addresses: {\n 137: NATIVE_TOKEN_ADDRESS,\n },\n },\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 { 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 {\n createPublicClient,\n createWalletClient,\n http,\n type Account,\n type Address,\n type Hex,\n type PublicClient,\n type WalletClient,\n type Chain as ViemChain,\n} from \"viem\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport { getChain } from \"@moneyos/core\";\nimport type {\n CallRequest,\n ExecutionClient,\n ExecutionResult,\n ReadClient,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\nconst viemChainMap: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nfunction getViemChain(chainId: number): ViemChain | undefined {\n return viemChainMap[chainId];\n}\n\n// --- Read ---\n\nexport class ViemReadClient implements ReadClient {\n private clients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n }\n\n private getClient(chainId: number): PublicClient {\n let client = this.clients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.clients.set(chainId, client);\n }\n return client;\n }\n\n async getBalance(params: {\n address: Address;\n chainId: number;\n }): Promise<bigint> {\n const client = this.getClient(params.chainId);\n return client.getBalance({ address: params.address });\n }\n\n async readContract<T = unknown>(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n chainId: number;\n }): Promise<T> {\n const client = this.getClient(params.chainId);\n return client.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }) as Promise<T>;\n }\n}\n\n// --- Execute ---\n\nexport class EOAExecutor implements ExecutionClient {\n readonly mode = \"eoa\" as const;\n private signer: Account;\n private walletClients: Map<number, WalletClient> = new Map();\n private publicClients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(signer: Account, config: RuntimeConfig) {\n this.signer = signer;\n this.config = config;\n }\n\n /**\n * Convenience factory: build an EOAExecutor from a raw private key.\n * Equivalent to `new EOAExecutor(privateKeyToAccount(privateKey), config)`.\n * Kept as a helper so the common \"I have a hex key\" path stays one line\n * while the constructor itself takes a viem `Account` to accommodate\n * future keystore-backed signers (hardware, KMS, MPC).\n *\n * Attach viem's nonce manager so back-to-back live transactions use a\n * pending-aware nonce source instead of relying on RPC fill behavior.\n */\n static fromPrivateKey(privateKey: Hex, config: RuntimeConfig): EOAExecutor {\n return new EOAExecutor(privateKeyToManagedAccount(privateKey), config);\n }\n\n private getWalletClient(chainId: number): WalletClient {\n let client = this.walletClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createWalletClient({\n account: this.signer,\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.walletClients.set(chainId, client);\n }\n return client;\n }\n\n private getPublicClient(chainId: number): PublicClient {\n let client = this.publicClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.publicClients.set(chainId, client);\n }\n return client;\n }\n\n getAddress(): Address {\n return this.signer.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const walletClient = this.getWalletClient(call.chainId);\n const hash = await walletClient.sendTransaction({\n account: walletClient.account!,\n to: call.to,\n data: call.data,\n value: call.value ?? 0n,\n chain: walletClient.chain,\n });\n\n // Wait for inclusion before resolving. Returning on broadcast makes\n // sequenced operations like \"approve then swap\" unsafe: the next\n // call's preflight (eth_estimateGas / eth_call) runs against the\n // latest mined block, so a still-pending approve is invisible and\n // the swap reverts at simulation time. The same broadcast-only\n // resolution also lets viem's nonce manager drift past the chain\n // when a sequenced call fails preflight, leaving the executor stuck\n // submitting nonces the chain has not yet reached.\n //\n // For an interactive CLI, slower is acceptable; ambiguous transaction\n // state is not.\n const publicClient = this.getPublicClient(call.chainId);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(\n `Transaction ${hash} reverted on chain ${call.chainId} (block ${receipt.blockNumber}).`,\n );\n }\n\n return { hash, chainId: call.chainId };\n }\n\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n }\n}\n","import type { Account, Hex } from \"viem\";\nimport { nonceManager } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n/**\n * Build a local viem Account with nonce management enabled so back-to-back\n * live transactions use a pending-aware nonce source.\n */\nexport function privateKeyToManagedAccount(privateKey: Hex): Account {\n return privateKeyToAccount(privateKey, { nonceManager });\n}\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n} from \"viem\";\nimport type { ReadClient, ExecutionClient, AssetRegistry, SwapProvider, SwapResult } from \"@moneyos/core\";\n\nconst ERC20_ABI = [\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\nexport interface SwapInput {\n tokenIn: string;\n tokenOut: string;\n amount: string;\n provider: SwapProvider;\n chainId: number;\n slippage?: number;\n}\n\nexport async function executeSwap(\n input: SwapInput,\n ctx: { read: ReadClient; execute: ExecutionClient; assets: AssetRegistry },\n): Promise<SwapResult> {\n const { tokenIn, tokenOut, amount, provider, chainId, slippage } = input;\n const { read, execute, assets } = ctx;\n const sender = execute.getAddress();\n\n const tokenInAddress = assets.getTokenAddress(tokenIn, chainId);\n const tokenOutAddress = assets.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 = assets.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,\n });\n\n const calldata = await provider.getCalldata(quote);\n\n const isNativeIn = tokenInAddress === assets.nativeTokenAddress;\n\n if (!isNativeIn) {\n const currentAllowance = await read.readContract<bigint>({\n address: tokenInAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [sender, calldata.to],\n chainId,\n });\n\n if (currentAllowance < amountWei) {\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [calldata.to, amountWei],\n });\n await execute.send({ to: tokenInAddress, data: approveData, chainId });\n }\n }\n\n const result = await execute.send({\n to: calldata.to,\n data: calldata.data,\n value: isNativeIn ? amountWei : calldata.value,\n chainId,\n });\n\n const tokenOutInfo = assets.getToken(tokenOut)!;\n return {\n hash: result.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","import type { Address, Hex } from \"viem\";\nimport type { SwapProvider, SwapQuote } from \"@moneyos/core\";\nimport { NATIVE_TOKEN_ADDRESS } from \"@moneyos/core\";\n\nconst ODOS_API = \"https://api.odos.xyz\";\nconst ODOS_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\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 private toOdosAddress(address: Address): Address {\n return address === NATIVE_TOKEN_ADDRESS ? ODOS_NATIVE_ADDRESS : address;\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; sender: Address }> {\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: this.toOdosAddress(params.tokenIn),\n amount: params.amount.toString(),\n },\n ],\n outputTokens: [\n {\n tokenAddress: this.toOdosAddress(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 sender: params.sender,\n };\n }\n\n async getCalldata(\n quote: SwapQuote & { pathId: string; sender: Address },\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.sender,\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","import type { Address, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { AccessAdapter, AccessSession, SessionContext } from \"@moneyos/core\";\n\nclass LocalAccessSession implements AccessSession {\n readonly kind = \"local\" as const;\n private address: Address;\n\n constructor(privateKey: Hex) {\n this.address = privateKeyToAccount(privateKey).address;\n }\n\n getAddress(): Address {\n return this.address;\n }\n}\n\nexport class LocalAccessAdapter implements AccessAdapter {\n readonly name = \"local\";\n private privateKey: Hex;\n\n constructor(privateKey: Hex) {\n this.privateKey = privateKey;\n }\n\n async openSession(_ctx: SessionContext): Promise<AccessSession> {\n return new LocalAccessSession(this.privateKey);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Account, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { KeyStore, KeyStoreMetadata } from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\n/**\n * FileKeyStore — raw-key JSON helper for library consumers.\n *\n * Reads a raw private key from a JSON file on disk (by default\n * `~/.moneyos/config.json`) and derives a viem `Account` from it.\n *\n * MoneyOS CLI no longer uses plaintext `config.json` wallet storage as its\n * default path. The CLI now uses an encrypted wallet file plus a local unlock\n * session. This helper remains available for advanced SDK use cases and\n * explicit raw-key compatibility paths outside the default CLI flow.\n */\n\nexport interface FileKeyStoreOptions {\n /**\n * Absolute path to the JSON config file that holds the private key.\n * Defaults to `~/.moneyos/config.json` for compatibility with earlier\n * raw-key layouts and explicit SDK usage.\n */\n configPath?: string;\n}\n\nconst DEFAULT_CONFIG_PATH = join(homedir(), \".moneyos\", \"config.json\");\n\n/**\n * Minimal shape of the on-disk config that `FileKeyStore` cares about.\n * Other fields (chainId, rpcUrl, future keystore metadata) are tolerated\n * and ignored.\n */\ninterface FileKeyStoreConfig {\n privateKey?: Hex;\n}\n\nexport class FileKeyStore implements KeyStore {\n readonly kind = \"file\" as const;\n private configPath: string;\n\n constructor(options: FileKeyStoreOptions = {}) {\n this.configPath = options.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async hasKey(): Promise<boolean> {\n const config = this.readConfig();\n return Boolean(config?.privateKey);\n }\n\n async metadata(): Promise<KeyStoreMetadata> {\n const config = this.readConfig();\n const address = config?.privateKey\n ? privateKeyToAccount(config.privateKey).address\n : undefined;\n return {\n kind: \"file\",\n address,\n };\n }\n\n async loadSigner(): Promise<Account> {\n const config = this.readConfig();\n if (!config?.privateKey) {\n throw new Error(\n `FileKeyStore: no private key found at ${this.configPath}. Run \\`moneyos init\\` to create one.`,\n );\n }\n return privateKeyToManagedAccount(config.privateKey);\n }\n\n /**\n * Read and validate the config file. Returns `undefined` if the file does\n * not exist. Throws with context for any other failure mode (malformed\n * JSON, wrong top-level type, wrong `privateKey` type). The hex format of\n * the key itself is validated later by viem's `privateKeyToAccount`.\n */\n private readConfig(): FileKeyStoreConfig | undefined {\n if (!existsSync(this.configPath)) {\n return undefined;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(this.configPath, \"utf-8\"));\n } catch (error) {\n throw new Error(\n `FileKeyStore: failed to read config at ${this.configPath}`,\n { cause: error },\n );\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\n `FileKeyStore: config at ${this.configPath} is not a JSON object`,\n );\n }\n\n const pk = (parsed as { privateKey?: unknown }).privateKey;\n if (pk === undefined || pk === null) {\n return {};\n }\n if (typeof pk !== \"string\") {\n throw new Error(\n `FileKeyStore: privateKey at ${this.configPath} must be a string`,\n );\n }\n return { privateKey: pk as Hex };\n }\n}\n","import type { MoneyOSConfig } from \"@moneyos/core\";\nimport { MoneyOS } from \"./client.js\";\n\n/**\n * Create a MoneyOS instance.\n *\n * Default EOA usage:\n * ```ts\n * const moneyos = createMoneyOS({ chainId: 42161, privateKey: \"0x...\" });\n * await moneyos.send(\"USDC\", \"0x...\", \"10\");\n * ```\n *\n * Custom execution:\n * ```ts\n * const moneyos = createMoneyOS({\n * chainId: 42161,\n * execute: myExecutionClient,\n * });\n * // moneyos.send / moneyos.swap transparently use the injected executor\n * ```\n *\n * You can also inject `read` or `assets` if you need custom implementations.\n * `privateKey` and `execute` are mutually exclusive.\n *\n * Future (with tools):\n * ```ts\n * const moneyos = createMoneyOS(config).use(swapTool());\n * ```\n */\nexport function createMoneyOS(config: MoneyOSConfig): MoneyOS {\n return new MoneyOS(config);\n}\n"],"mappings":"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","names":["import_viem","import_viem","import_viem","ERC20_ABI","raw","result","import_accounts","import_accounts"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -382,12 +382,11 @@ declare class FileKeyStore implements KeyStore {
|
|
|
382
382
|
* await moneyos.send("USDC", "0x...", "10");
|
|
383
383
|
* ```
|
|
384
384
|
*
|
|
385
|
-
* Custom execution
|
|
385
|
+
* Custom execution:
|
|
386
386
|
* ```ts
|
|
387
|
-
* import { ParticleExecutor } from "@moneyos/executor-particle";
|
|
388
387
|
* const moneyos = createMoneyOS({
|
|
389
388
|
* chainId: 42161,
|
|
390
|
-
* execute:
|
|
389
|
+
* execute: myExecutionClient,
|
|
391
390
|
* });
|
|
392
391
|
* // moneyos.send / moneyos.swap transparently use the injected executor
|
|
393
392
|
* ```
|
package/dist/index.d.ts
CHANGED
|
@@ -382,12 +382,11 @@ declare class FileKeyStore implements KeyStore {
|
|
|
382
382
|
* await moneyos.send("USDC", "0x...", "10");
|
|
383
383
|
* ```
|
|
384
384
|
*
|
|
385
|
-
* Custom execution
|
|
385
|
+
* Custom execution:
|
|
386
386
|
* ```ts
|
|
387
|
-
* import { ParticleExecutor } from "@moneyos/executor-particle";
|
|
388
387
|
* const moneyos = createMoneyOS({
|
|
389
388
|
* chainId: 42161,
|
|
390
|
-
* execute:
|
|
389
|
+
* execute: myExecutionClient,
|
|
391
390
|
* });
|
|
392
391
|
* // moneyos.send / moneyos.swap transparently use the injected executor
|
|
393
392
|
* ```
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/client.ts","../packages/core/src/tokens.ts","../packages/core/src/chains.ts","../src/core/eoa.ts","../src/core/signer.ts","../src/tools/swap.ts","../src/providers/odos.ts","../src/core/access-local.ts","../src/core/keystore-file.ts","../src/core/factory.ts"],"sourcesContent":["import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapProvider,\n SwapResult,\n ReadClient,\n ExecutionClient,\n AssetRegistry,\n MoneyOSRuntime,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport {\n getChain,\n defaultChain,\n getToken,\n getTokenAddress,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\nimport { ViemReadClient, EOAExecutor } from \"./eoa.js\";\nimport { executeSwap } from \"../tools/swap.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] as const;\n\nclass DefaultAssetRegistry implements AssetRegistry {\n readonly nativeTokenAddress = NATIVE_TOKEN_ADDRESS;\n getToken = getToken;\n getTokenAddress = getTokenAddress;\n getChain = getChain;\n}\n\nexport class MoneyOS {\n private read: ReadClient;\n private executor: ExecutionClient | undefined;\n private assets: AssetRegistry;\n private runtimeConfig: RuntimeConfig;\n\n constructor(config: MoneyOSConfig) {\n // Mutual exclusion: at most one of `execute`, `privateKey`, `signer`.\n // These represent three different ways to produce a signing identity;\n // combining them would be ambiguous.\n const provided: string[] = [];\n if (config.execute) provided.push(\"execute\");\n if (config.privateKey) provided.push(\"privateKey\");\n if (config.signer) provided.push(\"signer\");\n if (provided.length > 1) {\n throw new Error(\n `MoneyOSConfig: pass at most one of \\`execute\\`, \\`privateKey\\`, or \\`signer\\`. Received: ${provided.join(\", \")}.`,\n );\n }\n\n this.runtimeConfig = {\n defaultChainId: config.chainId ?? defaultChain.id,\n rpcUrl: config.rpcUrl,\n };\n\n this.read = config.read ?? new ViemReadClient(this.runtimeConfig);\n this.assets = config.assets ?? new DefaultAssetRegistry();\n\n if (config.execute) {\n this.executor = config.execute;\n } else if (config.signer) {\n this.executor = new EOAExecutor(config.signer, this.runtimeConfig);\n } else if (config.privateKey) {\n this.executor = EOAExecutor.fromPrivateKey(\n config.privateKey,\n this.runtimeConfig,\n );\n }\n }\n\n get runtime(): MoneyOSRuntime {\n return {\n read: this.read,\n execute: this.requireExecutor(),\n assets: this.assets,\n config: this.runtimeConfig,\n };\n }\n\n get address(): Address {\n return this.requireExecutor().getAddress();\n }\n\n private requireExecutor(): ExecutionClient {\n if (!this.executor) {\n throw new Error(\n \"No signing account configured. Set `signer`, `privateKey`, or `execute` in MoneyOS config.\",\n );\n }\n return this.executor;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const raw = await this.read.getBalance({ address: account, chainId });\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 const raw = await this.read.readContract<bigint>({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n chainId,\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const from = execute.getAddress();\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const result = await execute.send({ to, value, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n });\n\n const result = await execute.send({ to: tokenAddress, data, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n\n return executeSwap(\n { tokenIn, tokenOut, amount, provider, chainId, slippage: options?.slippage },\n { read: this.read, execute, assets: this.assets },\n );\n }\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 NATIVE_TOKEN_ADDRESS =\n \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as Address;\n\nexport const tokens: Record<string, Token> = {\n ETH: {\n symbol: \"ETH\",\n name: \"Ether\",\n decimals: 18,\n addresses: {\n 42161: NATIVE_TOKEN_ADDRESS,\n 1: NATIVE_TOKEN_ADDRESS,\n },\n },\n POL: {\n symbol: \"POL\",\n name: \"POL\",\n decimals: 18,\n addresses: {\n 137: NATIVE_TOKEN_ADDRESS,\n },\n },\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 { 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 {\n createPublicClient,\n createWalletClient,\n http,\n type Account,\n type Address,\n type Hex,\n type PublicClient,\n type WalletClient,\n type Chain as ViemChain,\n} from \"viem\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport { getChain } from \"@moneyos/core\";\nimport type {\n CallRequest,\n ExecutionClient,\n ExecutionResult,\n ReadClient,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\nconst viemChainMap: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nfunction getViemChain(chainId: number): ViemChain | undefined {\n return viemChainMap[chainId];\n}\n\n// --- Read ---\n\nexport class ViemReadClient implements ReadClient {\n private clients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n }\n\n private getClient(chainId: number): PublicClient {\n let client = this.clients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.clients.set(chainId, client);\n }\n return client;\n }\n\n async getBalance(params: {\n address: Address;\n chainId: number;\n }): Promise<bigint> {\n const client = this.getClient(params.chainId);\n return client.getBalance({ address: params.address });\n }\n\n async readContract<T = unknown>(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n chainId: number;\n }): Promise<T> {\n const client = this.getClient(params.chainId);\n return client.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }) as Promise<T>;\n }\n}\n\n// --- Execute ---\n\nexport class EOAExecutor implements ExecutionClient {\n readonly mode = \"eoa\" as const;\n private signer: Account;\n private walletClients: Map<number, WalletClient> = new Map();\n private publicClients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(signer: Account, config: RuntimeConfig) {\n this.signer = signer;\n this.config = config;\n }\n\n /**\n * Convenience factory: build an EOAExecutor from a raw private key.\n * Equivalent to `new EOAExecutor(privateKeyToAccount(privateKey), config)`.\n * Kept as a helper so the common \"I have a hex key\" path stays one line\n * while the constructor itself takes a viem `Account` to accommodate\n * future keystore-backed signers (hardware, KMS, MPC).\n *\n * Attach viem's nonce manager so back-to-back live transactions use a\n * pending-aware nonce source instead of relying on RPC fill behavior.\n */\n static fromPrivateKey(privateKey: Hex, config: RuntimeConfig): EOAExecutor {\n return new EOAExecutor(privateKeyToManagedAccount(privateKey), config);\n }\n\n private getWalletClient(chainId: number): WalletClient {\n let client = this.walletClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createWalletClient({\n account: this.signer,\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.walletClients.set(chainId, client);\n }\n return client;\n }\n\n private getPublicClient(chainId: number): PublicClient {\n let client = this.publicClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.publicClients.set(chainId, client);\n }\n return client;\n }\n\n getAddress(): Address {\n return this.signer.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const walletClient = this.getWalletClient(call.chainId);\n const hash = await walletClient.sendTransaction({\n account: walletClient.account!,\n to: call.to,\n data: call.data,\n value: call.value ?? 0n,\n chain: walletClient.chain,\n });\n\n // Wait for inclusion before resolving. Returning on broadcast makes\n // sequenced operations like \"approve then swap\" unsafe: the next\n // call's preflight (eth_estimateGas / eth_call) runs against the\n // latest mined block, so a still-pending approve is invisible and\n // the swap reverts at simulation time. The same broadcast-only\n // resolution also lets viem's nonce manager drift past the chain\n // when a sequenced call fails preflight, leaving the executor stuck\n // submitting nonces the chain has not yet reached.\n //\n // For an interactive CLI, slower is acceptable; ambiguous transaction\n // state is not.\n const publicClient = this.getPublicClient(call.chainId);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(\n `Transaction ${hash} reverted on chain ${call.chainId} (block ${receipt.blockNumber}).`,\n );\n }\n\n return { hash, chainId: call.chainId };\n }\n\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n }\n}\n","import type { Account, Hex } from \"viem\";\nimport { nonceManager } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n/**\n * Build a local viem Account with nonce management enabled so back-to-back\n * live transactions use a pending-aware nonce source.\n */\nexport function privateKeyToManagedAccount(privateKey: Hex): Account {\n return privateKeyToAccount(privateKey, { nonceManager });\n}\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n} from \"viem\";\nimport type { ReadClient, ExecutionClient, AssetRegistry, SwapProvider, SwapResult } from \"@moneyos/core\";\n\nconst ERC20_ABI = [\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\nexport interface SwapInput {\n tokenIn: string;\n tokenOut: string;\n amount: string;\n provider: SwapProvider;\n chainId: number;\n slippage?: number;\n}\n\nexport async function executeSwap(\n input: SwapInput,\n ctx: { read: ReadClient; execute: ExecutionClient; assets: AssetRegistry },\n): Promise<SwapResult> {\n const { tokenIn, tokenOut, amount, provider, chainId, slippage } = input;\n const { read, execute, assets } = ctx;\n const sender = execute.getAddress();\n\n const tokenInAddress = assets.getTokenAddress(tokenIn, chainId);\n const tokenOutAddress = assets.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 = assets.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,\n });\n\n const calldata = await provider.getCalldata(quote);\n\n const isNativeIn = tokenInAddress === assets.nativeTokenAddress;\n\n if (!isNativeIn) {\n const currentAllowance = await read.readContract<bigint>({\n address: tokenInAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [sender, calldata.to],\n chainId,\n });\n\n if (currentAllowance < amountWei) {\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [calldata.to, amountWei],\n });\n await execute.send({ to: tokenInAddress, data: approveData, chainId });\n }\n }\n\n const result = await execute.send({\n to: calldata.to,\n data: calldata.data,\n value: isNativeIn ? amountWei : calldata.value,\n chainId,\n });\n\n const tokenOutInfo = assets.getToken(tokenOut)!;\n return {\n hash: result.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","import type { Address, Hex } from \"viem\";\nimport type { SwapProvider, SwapQuote } from \"@moneyos/core\";\nimport { NATIVE_TOKEN_ADDRESS } from \"@moneyos/core\";\n\nconst ODOS_API = \"https://api.odos.xyz\";\nconst ODOS_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\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 private toOdosAddress(address: Address): Address {\n return address === NATIVE_TOKEN_ADDRESS ? ODOS_NATIVE_ADDRESS : address;\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; sender: Address }> {\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: this.toOdosAddress(params.tokenIn),\n amount: params.amount.toString(),\n },\n ],\n outputTokens: [\n {\n tokenAddress: this.toOdosAddress(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 sender: params.sender,\n };\n }\n\n async getCalldata(\n quote: SwapQuote & { pathId: string; sender: Address },\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.sender,\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","import type { Address, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { AccessAdapter, AccessSession, SessionContext } from \"@moneyos/core\";\n\nclass LocalAccessSession implements AccessSession {\n readonly kind = \"local\" as const;\n private address: Address;\n\n constructor(privateKey: Hex) {\n this.address = privateKeyToAccount(privateKey).address;\n }\n\n getAddress(): Address {\n return this.address;\n }\n}\n\nexport class LocalAccessAdapter implements AccessAdapter {\n readonly name = \"local\";\n private privateKey: Hex;\n\n constructor(privateKey: Hex) {\n this.privateKey = privateKey;\n }\n\n async openSession(_ctx: SessionContext): Promise<AccessSession> {\n return new LocalAccessSession(this.privateKey);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Account, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { KeyStore, KeyStoreMetadata } from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\n/**\n * FileKeyStore — raw-key JSON helper for library consumers.\n *\n * Reads a raw private key from a JSON file on disk (by default\n * `~/.moneyos/config.json`) and derives a viem `Account` from it.\n *\n * MoneyOS CLI no longer uses plaintext `config.json` wallet storage as its\n * default path. The CLI now uses an encrypted wallet file plus a local unlock\n * session. This helper remains available for advanced SDK use cases and\n * explicit raw-key compatibility paths outside the default CLI flow.\n */\n\nexport interface FileKeyStoreOptions {\n /**\n * Absolute path to the JSON config file that holds the private key.\n * Defaults to `~/.moneyos/config.json` for compatibility with earlier\n * raw-key layouts and explicit SDK usage.\n */\n configPath?: string;\n}\n\nconst DEFAULT_CONFIG_PATH = join(homedir(), \".moneyos\", \"config.json\");\n\n/**\n * Minimal shape of the on-disk config that `FileKeyStore` cares about.\n * Other fields (chainId, rpcUrl, future keystore metadata) are tolerated\n * and ignored.\n */\ninterface FileKeyStoreConfig {\n privateKey?: Hex;\n}\n\nexport class FileKeyStore implements KeyStore {\n readonly kind = \"file\" as const;\n private configPath: string;\n\n constructor(options: FileKeyStoreOptions = {}) {\n this.configPath = options.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async hasKey(): Promise<boolean> {\n const config = this.readConfig();\n return Boolean(config?.privateKey);\n }\n\n async metadata(): Promise<KeyStoreMetadata> {\n const config = this.readConfig();\n const address = config?.privateKey\n ? privateKeyToAccount(config.privateKey).address\n : undefined;\n return {\n kind: \"file\",\n address,\n };\n }\n\n async loadSigner(): Promise<Account> {\n const config = this.readConfig();\n if (!config?.privateKey) {\n throw new Error(\n `FileKeyStore: no private key found at ${this.configPath}. Run \\`moneyos init\\` to create one.`,\n );\n }\n return privateKeyToManagedAccount(config.privateKey);\n }\n\n /**\n * Read and validate the config file. Returns `undefined` if the file does\n * not exist. Throws with context for any other failure mode (malformed\n * JSON, wrong top-level type, wrong `privateKey` type). The hex format of\n * the key itself is validated later by viem's `privateKeyToAccount`.\n */\n private readConfig(): FileKeyStoreConfig | undefined {\n if (!existsSync(this.configPath)) {\n return undefined;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(this.configPath, \"utf-8\"));\n } catch (error) {\n throw new Error(\n `FileKeyStore: failed to read config at ${this.configPath}`,\n { cause: error },\n );\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\n `FileKeyStore: config at ${this.configPath} is not a JSON object`,\n );\n }\n\n const pk = (parsed as { privateKey?: unknown }).privateKey;\n if (pk === undefined || pk === null) {\n return {};\n }\n if (typeof pk !== \"string\") {\n throw new Error(\n `FileKeyStore: privateKey at ${this.configPath} must be a string`,\n );\n }\n return { privateKey: pk as Hex };\n }\n}\n","import type { MoneyOSConfig } from \"@moneyos/core\";\nimport { MoneyOS } from \"./client.js\";\n\n/**\n * Create a MoneyOS instance.\n *\n * Default EOA usage:\n * ```ts\n * const moneyos = createMoneyOS({ chainId: 42161, privateKey: \"0x...\" });\n * await moneyos.send(\"USDC\", \"0x...\", \"10\");\n * ```\n *\n * Custom execution (e.g. gasless smart-account):\n * ```ts\n * import { ParticleExecutor } from \"@moneyos/executor-particle\";\n * const moneyos = createMoneyOS({\n * chainId: 42161,\n * execute: new ParticleExecutor({ ... }),\n * });\n * // moneyos.send / moneyos.swap transparently use the injected executor\n * ```\n *\n * You can also inject `read` or `assets` if you need custom implementations.\n * `privateKey` and `execute` are mutually exclusive.\n *\n * Future (with tools):\n * ```ts\n * const moneyos = createMoneyOS(config).use(swapTool());\n * ```\n */\nexport function createMoneyOS(config: MoneyOSConfig): MoneyOS {\n return new MoneyOS(config);\n}\n"],"mappings":";AAAA;AAAA,EACE,eAAAA;AAAA,EACA,cAAAC;AAAA,EACA,sBAAAC;AAAA,OAEK;;;ACIA,IAAM,uBACX;AAEK,IAAM,SAAgC;EAC3C,KAAK;IACH,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;MACT,OAAO;MACP,GAAG;IACL;EACF;EACA,KAAK;IACH,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;MACT,KAAK;IACP;EACF;EACA,MAAM;IACJ,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;MACT,OAAO;MACP,GAAG;MACH,KAAK;IACP;EACF;EACA,MAAM;IACJ,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;MACT,OAAO;MACP,GAAG;MACH,KAAK;IACP;EACF;EACA,MAAM;IACJ,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;MACT,OAAO;IACT;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;ACnEO,IAAM,SAAgC;EAC3C,UAAU;IACR,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,gBAAgB,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;IAC7D,eAAe;EACjB;EACA,UAAU;IACR,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,gBAAgB,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;IAC7D,eAAe;EACjB;EACA,SAAS;IACP,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,gBAAgB,EAAE,MAAM,OAAO,QAAQ,OAAO,UAAU,GAAG;IAC3D,eAAe;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;EAC5D;AACA,SAAO,OAAO,SAAS,YAAY,CAAC;AACtC;;;ACjCA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAOK;AACP,SAAS,UAAU,SAAS,eAAe;;;ACV3C,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAM7B,SAAS,2BAA2B,YAA0B;AACnE,SAAO,oBAAoB,YAAY,EAAE,aAAa,CAAC;AACzD;;;ADYA,IAAM,eAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,GAAG;AAAA,EACH,KAAK;AACP;AAEA,SAAS,aAAa,SAAwC;AAC5D,SAAO,aAAa,OAAO;AAC7B;AAIO,IAAM,iBAAN,MAA2C;AAAA,EACxC,UAAqC,oBAAI,IAAI;AAAA,EAC7C;AAAA,EAER,YAAY,QAAuB;AACjC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,UAAU,SAA+B;AAC/C,QAAI,SAAS,KAAK,QAAQ,IAAI,OAAO;AACrC,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,aAAa,OAAO;AAClC,YAAM,YAAY,SAAS,OAAO;AAClC,YAAM,SACJ,YAAY,KAAK,OAAO,iBACpB,KAAK,OAAO,SACZ;AAEN,eAAS,mBAAmB;AAAA,QAC1B;AAAA,QACA,WAAW,KAAK,UAAU,WAAW,MAAM;AAAA,MAC7C,CAAC;AACD,WAAK,QAAQ,IAAI,SAAS,MAAM;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,QAGG;AAClB,UAAM,SAAS,KAAK,UAAU,OAAO,OAAO;AAC5C,WAAO,OAAO,WAAW,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,aAA0B,QAMjB;AACb,UAAM,SAAS,KAAK,UAAU,OAAO,OAAO;AAC5C,WAAO,OAAO,aAAa;AAAA,MACzB,SAAS,OAAO;AAAA,MAChB,KAAK,OAAO;AAAA,MACZ,cAAc,OAAO;AAAA,MACrB,MAAM,OAAO;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAIO,IAAM,cAAN,MAAM,aAAuC;AAAA,EACzC,OAAO;AAAA,EACR;AAAA,EACA,gBAA2C,oBAAI,IAAI;AAAA,EACnD,gBAA2C,oBAAI,IAAI;AAAA,EACnD;AAAA,EAER,YAAY,QAAiB,QAAuB;AAClD,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,eAAe,YAAiB,QAAoC;AACzE,WAAO,IAAI,aAAY,2BAA2B,UAAU,GAAG,MAAM;AAAA,EACvE;AAAA,EAEQ,gBAAgB,SAA+B;AACrD,QAAI,SAAS,KAAK,cAAc,IAAI,OAAO;AAC3C,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,aAAa,OAAO;AAClC,YAAM,YAAY,SAAS,OAAO;AAClC,YAAM,SACJ,YAAY,KAAK,OAAO,iBACpB,KAAK,OAAO,SACZ;AAEN,eAAS,mBAAmB;AAAA,QAC1B,SAAS,KAAK;AAAA,QACd;AAAA,QACA,WAAW,KAAK,UAAU,WAAW,MAAM;AAAA,MAC7C,CAAC;AACD,WAAK,cAAc,IAAI,SAAS,MAAM;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,SAA+B;AACrD,QAAI,SAAS,KAAK,cAAc,IAAI,OAAO;AAC3C,QAAI,CAAC,QAAQ;AACX,YAAM,QAAQ,aAAa,OAAO;AAClC,YAAM,YAAY,SAAS,OAAO;AAClC,YAAM,SACJ,YAAY,KAAK,OAAO,iBACpB,KAAK,OAAO,SACZ;AAEN,eAAS,mBAAmB;AAAA,QAC1B;AAAA,QACA,WAAW,KAAK,UAAU,WAAW,MAAM;AAAA,MAC7C,CAAC;AACD,WAAK,cAAc,IAAI,SAAS,MAAM;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,KAAK,MAA6C;AACtD,UAAM,eAAe,KAAK,gBAAgB,KAAK,OAAO;AACtD,UAAM,OAAO,MAAM,aAAa,gBAAgB;AAAA,MAC9C,SAAS,aAAa;AAAA,MACtB,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,SAAS;AAAA,MACrB,OAAO,aAAa;AAAA,IACtB,CAAC;AAaD,UAAM,eAAe,KAAK,gBAAgB,KAAK,OAAO;AACtD,UAAM,UAAU,MAAM,aAAa,0BAA0B,EAAE,KAAK,CAAC;AAErE,QAAI,QAAQ,WAAW,WAAW;AAChC,YAAM,IAAI;AAAA,QACR,eAAe,IAAI,sBAAsB,KAAK,OAAO,WAAW,QAAQ,WAAW;AAAA,MACrF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,SAAS,KAAK,QAAQ;AAAA,EACvC;AAAA,EAEA,eAAe;AACb,WAAO;AAAA,MACL,cAAc;AAAA,MACd,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;AErMA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,YAAY;AAAA,EAChB;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;AAWA,eAAsB,YACpB,OACA,KACqB;AACrB,QAAM,EAAE,SAAS,UAAU,QAAQ,UAAU,SAAS,SAAS,IAAI;AACnE,QAAM,EAAE,MAAM,SAAS,OAAO,IAAI;AAClC,QAAM,SAAS,QAAQ,WAAW;AAElC,QAAM,iBAAiB,OAAO,gBAAgB,SAAS,OAAO;AAC9D,QAAM,kBAAkB,OAAO,gBAAgB,UAAU,OAAO;AAChE,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,OAAO,uBAAuB,OAAO,EAAE;AAAA,EAClE;AACA,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,SAAS,QAAQ,uBAAuB,OAAO,EAAE;AAAA,EACnE;AAEA,QAAM,cAAc,OAAO,SAAS,OAAO;AAC3C,QAAM,YAAY,WAAW,QAAQ,YAAY,QAAQ;AAEzD,QAAM,QAAQ,MAAM,SAAS,SAAS;AAAA,IACpC;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,SAAS,YAAY,KAAK;AAEjD,QAAM,aAAa,mBAAmB,OAAO;AAE7C,MAAI,CAAC,YAAY;AACf,UAAM,mBAAmB,MAAM,KAAK,aAAqB;AAAA,MACvD,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,QAAQ,SAAS,EAAE;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,QAAI,mBAAmB,WAAW;AAChC,YAAM,cAAc,mBAAmB;AAAA,QACrC,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,SAAS,IAAI,SAAS;AAAA,MAC/B,CAAC;AACD,YAAM,QAAQ,KAAK,EAAE,IAAI,gBAAgB,MAAM,aAAa,QAAQ,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK;AAAA,IAChC,IAAI,SAAS;AAAA,IACb,MAAM,SAAS;AAAA,IACf,OAAO,aAAa,YAAY,SAAS;AAAA,IACzC;AAAA,EACF,CAAC;AAED,QAAM,eAAe,OAAO,SAAS,QAAQ;AAC7C,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,SAAS,YAAY;AAAA,IACrB,UAAU,aAAa;AAAA,IACvB,UAAU;AAAA,IACV,WAAW,YAAY,OAAO,MAAM,WAAW,GAAG,aAAa,QAAQ;AAAA,IACvE;AAAA,EACF;AACF;;;AL/EA,IAAMC,aAAY;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;AACF;AAEA,IAAM,uBAAN,MAAoD;AAAA,EACzC,qBAAqB;AAAA,EAC9B,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,WAAW;AACb;AAEO,IAAM,UAAN,MAAc;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAuB;AAIjC,UAAM,WAAqB,CAAC;AAC5B,QAAI,OAAO,QAAS,UAAS,KAAK,SAAS;AAC3C,QAAI,OAAO,WAAY,UAAS,KAAK,YAAY;AACjD,QAAI,OAAO,OAAQ,UAAS,KAAK,QAAQ;AACzC,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,4FAA4F,SAAS,KAAK,IAAI,CAAC;AAAA,MACjH;AAAA,IACF;AAEA,SAAK,gBAAgB;AAAA,MACnB,gBAAgB,OAAO,WAAW,aAAa;AAAA,MAC/C,QAAQ,OAAO;AAAA,IACjB;AAEA,SAAK,OAAO,OAAO,QAAQ,IAAI,eAAe,KAAK,aAAa;AAChE,SAAK,SAAS,OAAO,UAAU,IAAI,qBAAqB;AAExD,QAAI,OAAO,SAAS;AAClB,WAAK,WAAW,OAAO;AAAA,IACzB,WAAW,OAAO,QAAQ;AACxB,WAAK,WAAW,IAAI,YAAY,OAAO,QAAQ,KAAK,aAAa;AAAA,IACnE,WAAW,OAAO,YAAY;AAC5B,WAAK,WAAW,YAAY;AAAA,QAC1B,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,UAA0B;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK,gBAAgB;AAAA,MAC9B,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,gBAAgB,EAAE,WAAW;AAAA,EAC3C;AAAA,EAEQ,kBAAmC;AACzC,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QACJ,OACA,SACkB;AAClB,UAAM,UAAU,SAAS,WAAW,KAAK,cAAc;AACvD,UAAM,UAAU,SAAS,WAAW,KAAK;AAEzC,UAAM,eAAe,KAAK,OAAO,gBAAgB,OAAO,OAAO;AAC/D,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,SAAS,KAAK,uBAAuB,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,YAAY,KAAK,OAAO,SAAS,KAAK;AAE5C,QAAI,iBAAiB,sBAAsB;AACzC,YAAMC,OAAM,MAAM,KAAK,KAAK,WAAW,EAAE,SAAS,SAAS,QAAQ,CAAC;AACpE,aAAO;AAAA,QACL,OAAO,UAAU;AAAA,QACjB,QAAQ,UAAU;AAAA,QAClB,QAAQC,aAAYD,MAAK,UAAU,QAAQ;AAAA,QAC3C,WAAWA;AAAA,QACX,UAAU,UAAU;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,KAAK,KAAK,aAAqB;AAAA,MAC/C,SAAS;AAAA,MACT,KAAKD;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB,QAAQ,UAAU;AAAA,MAClB,QAAQE,aAAY,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,KAAK,gBAAgB;AACrC,UAAM,UAAU,SAAS,WAAW,KAAK,cAAc;AACvD,UAAM,OAAO,QAAQ,WAAW;AAEhC,UAAM,eAAe,KAAK,OAAO,gBAAgB,OAAO,OAAO;AAC/D,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,SAAS,KAAK,uBAAuB,OAAO,EAAE;AAAA,IAChE;AAEA,UAAM,YAAY,KAAK,OAAO,SAAS,KAAK;AAC5C,UAAM,QAAQC,YAAW,QAAQ,UAAU,QAAQ;AAEnD,QAAI,iBAAiB,sBAAsB;AACzC,YAAMC,UAAS,MAAM,QAAQ,KAAK,EAAE,IAAI,OAAO,QAAQ,CAAC;AACxD,aAAO;AAAA,QACL,MAAMA,QAAO;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAOC,oBAAmB;AAAA,MAC9B,KAAKL;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,IAAI,KAAK;AAAA,IAClB,CAAC;AAED,UAAM,SAAS,MAAM,QAAQ,KAAK,EAAE,IAAI,cAAc,MAAM,QAAQ,CAAC;AACrE,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KACJ,SACA,UACA,QACA,UACA,SACqB;AACrB,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,UAAU,SAAS,WAAW,KAAK,cAAc;AAEvD,WAAO;AAAA,MACL,EAAE,SAAS,UAAU,QAAQ,UAAU,SAAS,UAAU,SAAS,SAAS;AAAA,MAC5E,EAAE,MAAM,KAAK,MAAM,SAAS,QAAQ,KAAK,OAAO;AAAA,IAClD;AAAA,EACF;AACF;;;AMzOA,IAAM,WAAW;AACjB,IAAM,sBAAsB;AAgBrB,IAAM,eAAN,MAA2C;AAAA,EAChD,OAAO;AAAA,EACC;AAAA,EAER,YAAY,SAA+B;AACzC,SAAK,SAAS,SAAS;AAAA,EACzB;AAAA,EAEQ,cAAc,SAA2B;AAC/C,WAAO,YAAY,uBAAuB,sBAAsB;AAAA,EAClE;AAAA,EAEA,MAAM,SAAS,QAO8C;AAC3D,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,KAAK,cAAc,OAAO,OAAO;AAAA,YAC/C,QAAQ,OAAO,OAAO,SAAS;AAAA,UACjC;AAAA,QACF;AAAA,QACA,cAAc;AAAA,UACZ;AAAA,YACE,cAAc,KAAK,cAAc,OAAO,QAAQ;AAAA,YAChD,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,MACb,QAAQ,OAAO;AAAA,IACjB;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;;;AC3HA,SAAS,uBAAAM,4BAA2B;AAGpC,IAAM,qBAAN,MAAkD;AAAA,EACvC,OAAO;AAAA,EACR;AAAA,EAER,YAAY,YAAiB;AAC3B,SAAK,UAAUA,qBAAoB,UAAU,EAAE;AAAA,EACjD;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,MAAkD;AAAA,EAC9C,OAAO;AAAA,EACR;AAAA,EAER,YAAY,YAAiB;AAC3B,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,YAAY,MAA8C;AAC9D,WAAO,IAAI,mBAAmB,KAAK,UAAU;AAAA,EAC/C;AACF;;;AC5BA,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,SAAS,uBAAAC,4BAA2B;AAyBpC,IAAM,sBAAsB,KAAK,QAAQ,GAAG,YAAY,aAAa;AAW9D,IAAM,eAAN,MAAuC;AAAA,EACnC,OAAO;AAAA,EACR;AAAA,EAER,YAAY,UAA+B,CAAC,GAAG;AAC7C,SAAK,aAAa,QAAQ,cAAc;AAAA,EAC1C;AAAA,EAEA,MAAM,SAA2B;AAC/B,UAAM,SAAS,KAAK,WAAW;AAC/B,WAAO,QAAQ,QAAQ,UAAU;AAAA,EACnC;AAAA,EAEA,MAAM,WAAsC;AAC1C,UAAM,SAAS,KAAK,WAAW;AAC/B,UAAM,UAAU,QAAQ,aACpBC,qBAAoB,OAAO,UAAU,EAAE,UACvC;AACJ,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAA+B;AACnC,UAAM,SAAS,KAAK,WAAW;AAC/B,QAAI,CAAC,QAAQ,YAAY;AACvB,YAAM,IAAI;AAAA,QACR,yCAAyC,KAAK,UAAU;AAAA,MAC1D;AAAA,IACF;AACA,WAAO,2BAA2B,OAAO,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAA6C;AACnD,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,aAAa,KAAK,YAAY,OAAO,CAAC;AAAA,IAC5D,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,0CAA0C,KAAK,UAAU;AAAA,QACzD,EAAE,OAAO,MAAM;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,YAAM,IAAI;AAAA,QACR,2BAA2B,KAAK,UAAU;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,KAAM,OAAoC;AAChD,QAAI,OAAO,UAAa,OAAO,MAAM;AACnC,aAAO,CAAC;AAAA,IACV;AACA,QAAI,OAAO,OAAO,UAAU;AAC1B,YAAM,IAAI;AAAA,QACR,+BAA+B,KAAK,UAAU;AAAA,MAChD;AAAA,IACF;AACA,WAAO,EAAE,YAAY,GAAU;AAAA,EACjC;AACF;;;AClFO,SAAS,cAAc,QAAgC;AAC5D,SAAO,IAAI,QAAQ,MAAM;AAC3B;","names":["formatUnits","parseUnits","encodeFunctionData","ERC20_ABI","raw","formatUnits","parseUnits","result","encodeFunctionData","privateKeyToAccount","privateKeyToAccount","privateKeyToAccount"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/client.ts","../packages/core/src/tokens.ts","../packages/core/src/chains.ts","../src/core/eoa.ts","../src/core/signer.ts","../src/tools/swap.ts","../src/providers/odos.ts","../src/core/access-local.ts","../src/core/keystore-file.ts","../src/core/factory.ts"],"sourcesContent":["import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n type Address,\n} from \"viem\";\nimport type {\n MoneyOSConfig,\n Balance,\n SendResult,\n SwapProvider,\n SwapResult,\n ReadClient,\n ExecutionClient,\n AssetRegistry,\n MoneyOSRuntime,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport {\n getChain,\n defaultChain,\n getToken,\n getTokenAddress,\n NATIVE_TOKEN_ADDRESS,\n} from \"@moneyos/core\";\nimport { ViemReadClient, EOAExecutor } from \"./eoa.js\";\nimport { executeSwap } from \"../tools/swap.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] as const;\n\nclass DefaultAssetRegistry implements AssetRegistry {\n readonly nativeTokenAddress = NATIVE_TOKEN_ADDRESS;\n getToken = getToken;\n getTokenAddress = getTokenAddress;\n getChain = getChain;\n}\n\nexport class MoneyOS {\n private read: ReadClient;\n private executor: ExecutionClient | undefined;\n private assets: AssetRegistry;\n private runtimeConfig: RuntimeConfig;\n\n constructor(config: MoneyOSConfig) {\n // Mutual exclusion: at most one of `execute`, `privateKey`, `signer`.\n // These represent three different ways to produce a signing identity;\n // combining them would be ambiguous.\n const provided: string[] = [];\n if (config.execute) provided.push(\"execute\");\n if (config.privateKey) provided.push(\"privateKey\");\n if (config.signer) provided.push(\"signer\");\n if (provided.length > 1) {\n throw new Error(\n `MoneyOSConfig: pass at most one of \\`execute\\`, \\`privateKey\\`, or \\`signer\\`. Received: ${provided.join(\", \")}.`,\n );\n }\n\n this.runtimeConfig = {\n defaultChainId: config.chainId ?? defaultChain.id,\n rpcUrl: config.rpcUrl,\n };\n\n this.read = config.read ?? new ViemReadClient(this.runtimeConfig);\n this.assets = config.assets ?? new DefaultAssetRegistry();\n\n if (config.execute) {\n this.executor = config.execute;\n } else if (config.signer) {\n this.executor = new EOAExecutor(config.signer, this.runtimeConfig);\n } else if (config.privateKey) {\n this.executor = EOAExecutor.fromPrivateKey(\n config.privateKey,\n this.runtimeConfig,\n );\n }\n }\n\n get runtime(): MoneyOSRuntime {\n return {\n read: this.read,\n execute: this.requireExecutor(),\n assets: this.assets,\n config: this.runtimeConfig,\n };\n }\n\n get address(): Address {\n return this.requireExecutor().getAddress();\n }\n\n private requireExecutor(): ExecutionClient {\n if (!this.executor) {\n throw new Error(\n \"No signing account configured. Set `signer`, `privateKey`, or `execute` in MoneyOS config.\",\n );\n }\n return this.executor;\n }\n\n async balance(\n token: string,\n options?: { address?: Address; chainId?: number },\n ): Promise<Balance> {\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const account = options?.address ?? this.address;\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const raw = await this.read.getBalance({ address: account, chainId });\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 const raw = await this.read.readContract<bigint>({\n address: tokenAddress,\n abi: ERC20_ABI,\n functionName: \"balanceOf\",\n args: [account],\n chainId,\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n const from = execute.getAddress();\n\n const tokenAddress = this.assets.getTokenAddress(token, chainId);\n if (!tokenAddress) {\n throw new Error(`Token ${token} not found on chain ${chainId}`);\n }\n\n const tokenInfo = this.assets.getToken(token)!;\n const value = parseUnits(amount, tokenInfo.decimals);\n\n if (tokenAddress === NATIVE_TOKEN_ADDRESS) {\n const result = await execute.send({ to, value, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\n }\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"transfer\",\n args: [to, value],\n });\n\n const result = await execute.send({ to: tokenAddress, data, chainId });\n return {\n hash: result.hash,\n from,\n to,\n amount,\n token: tokenInfo.symbol,\n chainId,\n };\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 execute = this.requireExecutor();\n const chainId = options?.chainId ?? this.runtimeConfig.defaultChainId;\n\n return executeSwap(\n { tokenIn, tokenOut, amount, provider, chainId, slippage: options?.slippage },\n { read: this.read, execute, assets: this.assets },\n );\n }\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 NATIVE_TOKEN_ADDRESS =\n \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\" as Address;\n\nexport const tokens: Record<string, Token> = {\n ETH: {\n symbol: \"ETH\",\n name: \"Ether\",\n decimals: 18,\n addresses: {\n 42161: NATIVE_TOKEN_ADDRESS,\n 1: NATIVE_TOKEN_ADDRESS,\n },\n },\n POL: {\n symbol: \"POL\",\n name: \"POL\",\n decimals: 18,\n addresses: {\n 137: NATIVE_TOKEN_ADDRESS,\n },\n },\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 { 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 {\n createPublicClient,\n createWalletClient,\n http,\n type Account,\n type Address,\n type Hex,\n type PublicClient,\n type WalletClient,\n type Chain as ViemChain,\n} from \"viem\";\nimport { arbitrum, mainnet, polygon } from \"viem/chains\";\nimport { getChain } from \"@moneyos/core\";\nimport type {\n CallRequest,\n ExecutionClient,\n ExecutionResult,\n ReadClient,\n RuntimeConfig,\n} from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\nconst viemChainMap: Record<number, ViemChain> = {\n 42161: arbitrum,\n 1: mainnet,\n 137: polygon,\n};\n\nfunction getViemChain(chainId: number): ViemChain | undefined {\n return viemChainMap[chainId];\n}\n\n// --- Read ---\n\nexport class ViemReadClient implements ReadClient {\n private clients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n }\n\n private getClient(chainId: number): PublicClient {\n let client = this.clients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.clients.set(chainId, client);\n }\n return client;\n }\n\n async getBalance(params: {\n address: Address;\n chainId: number;\n }): Promise<bigint> {\n const client = this.getClient(params.chainId);\n return client.getBalance({ address: params.address });\n }\n\n async readContract<T = unknown>(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n chainId: number;\n }): Promise<T> {\n const client = this.getClient(params.chainId);\n return client.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }) as Promise<T>;\n }\n}\n\n// --- Execute ---\n\nexport class EOAExecutor implements ExecutionClient {\n readonly mode = \"eoa\" as const;\n private signer: Account;\n private walletClients: Map<number, WalletClient> = new Map();\n private publicClients: Map<number, PublicClient> = new Map();\n private config: RuntimeConfig;\n\n constructor(signer: Account, config: RuntimeConfig) {\n this.signer = signer;\n this.config = config;\n }\n\n /**\n * Convenience factory: build an EOAExecutor from a raw private key.\n * Equivalent to `new EOAExecutor(privateKeyToAccount(privateKey), config)`.\n * Kept as a helper so the common \"I have a hex key\" path stays one line\n * while the constructor itself takes a viem `Account` to accommodate\n * future keystore-backed signers (hardware, KMS, MPC).\n *\n * Attach viem's nonce manager so back-to-back live transactions use a\n * pending-aware nonce source instead of relying on RPC fill behavior.\n */\n static fromPrivateKey(privateKey: Hex, config: RuntimeConfig): EOAExecutor {\n return new EOAExecutor(privateKeyToManagedAccount(privateKey), config);\n }\n\n private getWalletClient(chainId: number): WalletClient {\n let client = this.walletClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createWalletClient({\n account: this.signer,\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.walletClients.set(chainId, client);\n }\n return client;\n }\n\n private getPublicClient(chainId: number): PublicClient {\n let client = this.publicClients.get(chainId);\n if (!client) {\n const chain = getViemChain(chainId);\n const chainInfo = getChain(chainId);\n const rpcUrl =\n chainId === this.config.defaultChainId\n ? this.config.rpcUrl\n : undefined;\n\n client = createPublicClient({\n chain,\n transport: http(rpcUrl ?? chainInfo?.rpcUrl),\n });\n this.publicClients.set(chainId, client);\n }\n return client;\n }\n\n getAddress(): Address {\n return this.signer.address;\n }\n\n async send(call: CallRequest): Promise<ExecutionResult> {\n const walletClient = this.getWalletClient(call.chainId);\n const hash = await walletClient.sendTransaction({\n account: walletClient.account!,\n to: call.to,\n data: call.data,\n value: call.value ?? 0n,\n chain: walletClient.chain,\n });\n\n // Wait for inclusion before resolving. Returning on broadcast makes\n // sequenced operations like \"approve then swap\" unsafe: the next\n // call's preflight (eth_estimateGas / eth_call) runs against the\n // latest mined block, so a still-pending approve is invisible and\n // the swap reverts at simulation time. The same broadcast-only\n // resolution also lets viem's nonce manager drift past the chain\n // when a sequenced call fails preflight, leaving the executor stuck\n // submitting nonces the chain has not yet reached.\n //\n // For an interactive CLI, slower is acceptable; ambiguous transaction\n // state is not.\n const publicClient = this.getPublicClient(call.chainId);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== \"success\") {\n throw new Error(\n `Transaction ${hash} reverted on chain ${call.chainId} (block ${receipt.blockNumber}).`,\n );\n }\n\n return { hash, chainId: call.chainId };\n }\n\n capabilities() {\n return {\n sponsoredGas: false,\n batching: false,\n simulation: false,\n };\n }\n}\n","import type { Account, Hex } from \"viem\";\nimport { nonceManager } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\n/**\n * Build a local viem Account with nonce management enabled so back-to-back\n * live transactions use a pending-aware nonce source.\n */\nexport function privateKeyToManagedAccount(privateKey: Hex): Account {\n return privateKeyToAccount(privateKey, { nonceManager });\n}\n","import {\n formatUnits,\n parseUnits,\n encodeFunctionData,\n} from \"viem\";\nimport type { ReadClient, ExecutionClient, AssetRegistry, SwapProvider, SwapResult } from \"@moneyos/core\";\n\nconst ERC20_ABI = [\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\nexport interface SwapInput {\n tokenIn: string;\n tokenOut: string;\n amount: string;\n provider: SwapProvider;\n chainId: number;\n slippage?: number;\n}\n\nexport async function executeSwap(\n input: SwapInput,\n ctx: { read: ReadClient; execute: ExecutionClient; assets: AssetRegistry },\n): Promise<SwapResult> {\n const { tokenIn, tokenOut, amount, provider, chainId, slippage } = input;\n const { read, execute, assets } = ctx;\n const sender = execute.getAddress();\n\n const tokenInAddress = assets.getTokenAddress(tokenIn, chainId);\n const tokenOutAddress = assets.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 = assets.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,\n });\n\n const calldata = await provider.getCalldata(quote);\n\n const isNativeIn = tokenInAddress === assets.nativeTokenAddress;\n\n if (!isNativeIn) {\n const currentAllowance = await read.readContract<bigint>({\n address: tokenInAddress,\n abi: ERC20_ABI,\n functionName: \"allowance\",\n args: [sender, calldata.to],\n chainId,\n });\n\n if (currentAllowance < amountWei) {\n const approveData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: \"approve\",\n args: [calldata.to, amountWei],\n });\n await execute.send({ to: tokenInAddress, data: approveData, chainId });\n }\n }\n\n const result = await execute.send({\n to: calldata.to,\n data: calldata.data,\n value: isNativeIn ? amountWei : calldata.value,\n chainId,\n });\n\n const tokenOutInfo = assets.getToken(tokenOut)!;\n return {\n hash: result.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","import type { Address, Hex } from \"viem\";\nimport type { SwapProvider, SwapQuote } from \"@moneyos/core\";\nimport { NATIVE_TOKEN_ADDRESS } from \"@moneyos/core\";\n\nconst ODOS_API = \"https://api.odos.xyz\";\nconst ODOS_NATIVE_ADDRESS = \"0x0000000000000000000000000000000000000000\" as Address;\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 private toOdosAddress(address: Address): Address {\n return address === NATIVE_TOKEN_ADDRESS ? ODOS_NATIVE_ADDRESS : address;\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; sender: Address }> {\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: this.toOdosAddress(params.tokenIn),\n amount: params.amount.toString(),\n },\n ],\n outputTokens: [\n {\n tokenAddress: this.toOdosAddress(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 sender: params.sender,\n };\n }\n\n async getCalldata(\n quote: SwapQuote & { pathId: string; sender: Address },\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.sender,\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","import type { Address, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { AccessAdapter, AccessSession, SessionContext } from \"@moneyos/core\";\n\nclass LocalAccessSession implements AccessSession {\n readonly kind = \"local\" as const;\n private address: Address;\n\n constructor(privateKey: Hex) {\n this.address = privateKeyToAccount(privateKey).address;\n }\n\n getAddress(): Address {\n return this.address;\n }\n}\n\nexport class LocalAccessAdapter implements AccessAdapter {\n readonly name = \"local\";\n private privateKey: Hex;\n\n constructor(privateKey: Hex) {\n this.privateKey = privateKey;\n }\n\n async openSession(_ctx: SessionContext): Promise<AccessSession> {\n return new LocalAccessSession(this.privateKey);\n }\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Account, Hex } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport type { KeyStore, KeyStoreMetadata } from \"@moneyos/core\";\nimport { privateKeyToManagedAccount } from \"./signer.js\";\n\n/**\n * FileKeyStore — raw-key JSON helper for library consumers.\n *\n * Reads a raw private key from a JSON file on disk (by default\n * `~/.moneyos/config.json`) and derives a viem `Account` from it.\n *\n * MoneyOS CLI no longer uses plaintext `config.json` wallet storage as its\n * default path. The CLI now uses an encrypted wallet file plus a local unlock\n * session. This helper remains available for advanced SDK use cases and\n * explicit raw-key compatibility paths outside the default CLI flow.\n */\n\nexport interface FileKeyStoreOptions {\n /**\n * Absolute path to the JSON config file that holds the private key.\n * Defaults to `~/.moneyos/config.json` for compatibility with earlier\n * raw-key layouts and explicit SDK usage.\n */\n configPath?: string;\n}\n\nconst DEFAULT_CONFIG_PATH = join(homedir(), \".moneyos\", \"config.json\");\n\n/**\n * Minimal shape of the on-disk config that `FileKeyStore` cares about.\n * Other fields (chainId, rpcUrl, future keystore metadata) are tolerated\n * and ignored.\n */\ninterface FileKeyStoreConfig {\n privateKey?: Hex;\n}\n\nexport class FileKeyStore implements KeyStore {\n readonly kind = \"file\" as const;\n private configPath: string;\n\n constructor(options: FileKeyStoreOptions = {}) {\n this.configPath = options.configPath ?? DEFAULT_CONFIG_PATH;\n }\n\n async hasKey(): Promise<boolean> {\n const config = this.readConfig();\n return Boolean(config?.privateKey);\n }\n\n async metadata(): Promise<KeyStoreMetadata> {\n const config = this.readConfig();\n const address = config?.privateKey\n ? privateKeyToAccount(config.privateKey).address\n : undefined;\n return {\n kind: \"file\",\n address,\n };\n }\n\n async loadSigner(): Promise<Account> {\n const config = this.readConfig();\n if (!config?.privateKey) {\n throw new Error(\n `FileKeyStore: no private key found at ${this.configPath}. Run \\`moneyos init\\` to create one.`,\n );\n }\n return privateKeyToManagedAccount(config.privateKey);\n }\n\n /**\n * Read and validate the config file. Returns `undefined` if the file does\n * not exist. Throws with context for any other failure mode (malformed\n * JSON, wrong top-level type, wrong `privateKey` type). The hex format of\n * the key itself is validated later by viem's `privateKeyToAccount`.\n */\n private readConfig(): FileKeyStoreConfig | undefined {\n if (!existsSync(this.configPath)) {\n return undefined;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(this.configPath, \"utf-8\"));\n } catch (error) {\n throw new Error(\n `FileKeyStore: failed to read config at ${this.configPath}`,\n { cause: error },\n );\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\n `FileKeyStore: config at ${this.configPath} is not a JSON object`,\n );\n }\n\n const pk = (parsed as { privateKey?: unknown }).privateKey;\n if (pk === undefined || pk === null) {\n return {};\n }\n if (typeof pk !== \"string\") {\n throw new Error(\n `FileKeyStore: privateKey at ${this.configPath} must be a string`,\n );\n }\n return { privateKey: pk as Hex };\n }\n}\n","import type { MoneyOSConfig } from \"@moneyos/core\";\nimport { MoneyOS } from \"./client.js\";\n\n/**\n * Create a MoneyOS instance.\n *\n * Default EOA usage:\n * ```ts\n * const moneyos = createMoneyOS({ chainId: 42161, privateKey: \"0x...\" });\n * await moneyos.send(\"USDC\", \"0x...\", \"10\");\n * ```\n *\n * Custom execution:\n * ```ts\n * const moneyos = createMoneyOS({\n * chainId: 42161,\n * execute: myExecutionClient,\n * });\n * // moneyos.send / moneyos.swap transparently use the injected executor\n * ```\n *\n * You can also inject `read` or `assets` if you need custom implementations.\n * `privateKey` and `execute` are mutually exclusive.\n *\n * Future (with tools):\n * ```ts\n * const moneyos = createMoneyOS(config).use(swapTool());\n * ```\n */\nexport function createMoneyOS(config: MoneyOSConfig): MoneyOS {\n return new MoneyOS(config);\n}\n"],"mappings":"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","names":["formatUnits","parseUnits","encodeFunctionData","ERC20_ABI","raw","formatUnits","parseUnits","result","encodeFunctionData","privateKeyToAccount","privateKeyToAccount","privateKeyToAccount"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moneyos",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "The operating system for money. Programmable money primitives for developers and AI agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,12 +30,7 @@
|
|
|
30
30
|
"lint:core": "npm run lint --workspace=packages/core",
|
|
31
31
|
"build:tool-swap": "npm run build --workspace=packages/tool-swap",
|
|
32
32
|
"typecheck:tool-swap": "npm run typecheck --workspace=packages/tool-swap",
|
|
33
|
-
"lint:tool-swap": "npm run lint --workspace=packages/tool-swap"
|
|
34
|
-
"build:executor-particle": "npm run build --workspace=packages/executor-particle",
|
|
35
|
-
"typecheck:executor-particle": "npm run typecheck --workspace=packages/executor-particle",
|
|
36
|
-
"lint:executor-particle": "npm run lint --workspace=packages/executor-particle",
|
|
37
|
-
"test:executor-particle": "npm run test --workspace=packages/executor-particle",
|
|
38
|
-
"smoke:particle": "npm run build:core && npm run build:executor-particle && tsx scripts/smoke-particle.ts"
|
|
33
|
+
"lint:tool-swap": "npm run lint --workspace=packages/tool-swap"
|
|
39
34
|
},
|
|
40
35
|
"keywords": [
|
|
41
36
|
"money",
|
|
@@ -68,11 +63,9 @@
|
|
|
68
63
|
"devDependencies": {
|
|
69
64
|
"@eslint/js": "^9.39.4",
|
|
70
65
|
"@moneyos/core": "workspace:*",
|
|
71
|
-
"@moneyos/executor-particle": "workspace:*",
|
|
72
66
|
"@types/node": "^22.15.3",
|
|
73
67
|
"eslint": "^9.25.1",
|
|
74
68
|
"tsup": "^8.4.0",
|
|
75
|
-
"tsx": "^4.21.0",
|
|
76
69
|
"typescript": "^5.9.3",
|
|
77
70
|
"typescript-eslint": "^8.58.1",
|
|
78
71
|
"vitest": "^3.1.1"
|