@continuumdao/ctm-mpc-defi 0.2.56 → 0.2.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/catalog.cjs +749 -171
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +373 -44
- package/dist/agent/catalog.js +738 -173
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/aave-v4/SKILL.md +26 -3
- package/dist/agent/skills/aerodrome/SKILL.md +3 -1
- package/dist/agent/skills/circle-cctp/SKILL.md +1 -1
- package/dist/agent/skills/curve-dao/SKILL.md +2 -2
- package/dist/agent/skills/railgun/SKILL.md +39 -0
- package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
- package/dist/index.cjs +165 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +166 -20
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +198 -15
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
- package/dist/protocols/evm/aave-v4/index.js +189 -16
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +152 -63
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
- package/dist/protocols/evm/aerodrome/index.js +151 -64
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.cjs +5 -3
- package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.d.ts +3 -1
- package/dist/protocols/evm/circle-cctp/index.js +5 -4
- package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
- package/dist/protocols/evm/compound-v3/index.cjs +115 -2
- package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
- package/dist/protocols/evm/compound-v3/index.js +116 -3
- package/dist/protocols/evm/compound-v3/index.js.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.d.ts +1 -1
- package/dist/protocols/evm/continuum-dao/index.js +1 -1
- package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +120 -5
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.js +120 -5
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +121 -6
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js +121 -6
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +129 -57
- package/dist/protocols/evm/morpho/index.cjs.map +1 -1
- package/dist/protocols/evm/morpho/index.d.ts +2 -1
- package/dist/protocols/evm/morpho/index.js +129 -58
- package/dist/protocols/evm/morpho/index.js.map +1 -1
- package/dist/protocols/evm/pendle/index.cjs +129 -10
- package/dist/protocols/evm/pendle/index.cjs.map +1 -1
- package/dist/protocols/evm/pendle/index.js +129 -10
- package/dist/protocols/evm/pendle/index.js.map +1 -1
- package/dist/protocols/evm/railgun/index.cjs +1261 -0
- package/dist/protocols/evm/railgun/index.cjs.map +1 -0
- package/dist/protocols/evm/railgun/index.d.ts +294 -0
- package/dist/protocols/evm/railgun/index.js +1218 -0
- package/dist/protocols/evm/railgun/index.js.map +1 -0
- package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.js +165 -18
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/railgun/networks.ts","../../../../src/protocols/evm/continuum-dao/constants.ts","../../../../src/protocols/evm/railgun/popular-assets.ts","../../../../src/protocols/evm/railgun/snapshot.ts","../../../../src/protocols/evm/railgun/session.ts","../../../../src/protocols/evm/railgun/reads.ts","../../../../src/core/defiEvmClient.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/railgun/engine.ts","../../../../src/protocols/evm/railgun/gas.ts","../../../../src/protocols/evm/railgun/shield.ts","../../../../src/protocols/evm/railgun/private-actions.ts","../../../../src/protocols/evm/railgun/wallet.ts","../../../../src/protocols/evm/railgun/index.ts"],"names":["getAddress","zeroAddress","cached","gasLimitFromEstimateAndChainConfig","require","createPublicClient","TXIDVersion","session","walletModule","ChainType"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","export type RailgunNetworkSource = {\n chain?: { id?: number }\n name?: string\n publicName?: string\n proxyContract?: string\n deploymentBlock?: number\n baseToken?: { wrappedAddress?: string; symbol?: string; wrappedSymbol?: string; decimals?: number }\n deprecated?: boolean\n isDevOnlyNetwork?: boolean\n isTestnet?: boolean\n}\n\nexport type RailgunNetworkRow = {\n chainId: number\n networkName: string\n publicName: string\n proxyContract: string\n deploymentBlock: number\n wrappedAddress: string\n wrappedSymbol: string\n wrappedDecimals: number\n isTestnet: boolean\n}\n\nexport function selectRailgunNetworks(config: Record<string, RailgunNetworkSource>): RailgunNetworkRow[] {\n const rows: RailgunNetworkRow[] = []\n for (const entry of Object.values(config)) {\n if (!entry || entry.deprecated || entry.isDevOnlyNetwork) continue\n const chainId = Number(entry.chain?.id)\n const proxyContract = String(entry.proxyContract ?? '').trim()\n const wrappedAddress = String(entry.baseToken?.wrappedAddress ?? '').trim()\n if (!Number.isFinite(chainId) || chainId <= 0 || !proxyContract || !wrappedAddress) continue\n rows.push({\n chainId,\n networkName: String(entry.name ?? ''),\n publicName: String(entry.publicName ?? entry.name ?? ''),\n proxyContract,\n deploymentBlock: Number(entry.deploymentBlock ?? 0),\n wrappedAddress,\n wrappedSymbol: String(entry.baseToken?.wrappedSymbol ?? entry.baseToken?.symbol ?? ''),\n wrappedDecimals: Number(entry.baseToken?.decimals ?? 18),\n isTestnet: Boolean(entry.isTestnet),\n })\n }\n rows.sort((a, b) => a.chainId - b.chainId)\n return rows\n}\n\nlet cached: RailgunNetworkRow[] | null = null\n\nexport async function loadRailgunNetworks(): Promise<RailgunNetworkRow[]> {\n if (cached) return cached\n const mod = (await import('@railgun-community/shared-models')) as {\n NETWORK_CONFIG: Record<string, RailgunNetworkSource>\n }\n cached = selectRailgunNetworks(mod.NETWORK_CONFIG)\n return cached\n}\n\nexport async function loadRailgunSupportedChainIds(): Promise<ReadonlySet<number>> {\n const rows = await loadRailgunNetworks()\n return new Set(rows.map((row) => row.chainId))\n}\n\nexport async function railgunNetworkByChainId(chainId: number): Promise<RailgunNetworkRow | undefined> {\n const rows = await loadRailgunNetworks()\n return rows.find((row) => row.chainId === chainId)\n}\n\nexport function clearRailgunNetworkCache(): void {\n cached = null\n}\n","/**\n * ContinuumDAO (CTM / veCTM) — Linea escrow + node attach, Ethereum CTM hold.\n * CTM, Linea VotingEscrow, and the current Linea governor are configured on\n * mainnet. NodeProperties and Rewards stay zero until redeployed. Callers must\n * skip seed / write paths when {@link isConfiguredAddress} is false.\n */\nimport { getAddress, zeroAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport const CONTINUUM_DAO_PROTOCOL_ID = 'continuum-dao'\n\nexport const CONTINUUM_DAO_ETHEREUM_CHAIN_ID = 1\nexport const CONTINUUM_DAO_LINEA_CHAIN_ID = 59144\nexport const CONTINUUM_DAO_LINEA_SEPOLIA_CHAIN_ID = 59141\n\nexport const CTM_TOKEN_NAME = 'Continuum'\nexport const CTM_TOKEN_SYMBOL = 'CTM'\nexport const VECTM_TOKEN_NAME = 'Voting Escrow Continuum'\nexport const VECTM_TOKEN_SYMBOL = 'veCTM'\nexport const CTM_TOKEN_DECIMALS = 18\n\nexport const WEEK_SECONDS = 7 * 86400\nexport const MAXTIME_SECONDS = 4 * 365 * 86400\n/** Node-app / MCP lock-duration cap (4 years floored to whole weeks). */\nexport const VECTM_MAX_LOCK_WEEKS = 208\n/** VotingEscrow.minimumLock default (1 CTM). Live value is read on-chain when available. */\nexport const VECTM_DEFAULT_MINIMUM_LOCK_WEI = 10n ** 18n\n/** VotingEscrow.liquidate — `value <= 100 gwei` reverts VotingEscrow_InvalidValue. */\nexport const VECTM_LIQ_MIN_LOCKED_WEI = 100n\nexport const VECTM_LIQ_PENALTY_NUM = 50_000n\nexport const VECTM_LIQ_PENALTY_DEN = 100_000n\n\nexport type ContinuumDaoDeployment = {\n ctm: `0x${string}`\n votingEscrow: `0x${string}`\n nodeProperties: `0x${string}`\n rewards: `0x${string}`\n governor: `0x${string}`\n}\n\nconst UNSET: ContinuumDaoDeployment = {\n ctm: zeroAddress,\n votingEscrow: zeroAddress,\n nodeProperties: zeroAddress,\n rewards: zeroAddress,\n governor: zeroAddress,\n}\n\n/** Production CTM token — same address on Ethereum mainnet and Linea mainnet. */\nexport const CTM_TOKEN_ADDRESS = getAddress('0x7581696b0ED142f6534E5797baaABBb9a1b27086')\n\n/** Linea mainnet VotingEscrow (veCTM). */\nexport const VOTING_ESCROW_LINEA_ADDRESS = getAddress('0x221EC90B3B083A8501A37bdeb7035CeaedF3C31f')\n\n/** Linea mainnet MultiSignAgentWallet. Monthly fee and veCTM threshold live here. */\nexport const MULTISIGN_AGENT_WALLET_LINEA_ADDRESS = getAddress('0x4ebd7cCBe32a51d1638cFE90E8eD1c4BdF42f729')\n\n/** MultiSignAgentWallet scales `ctmPerFeeToken` by this amount. */\nexport const CTM_FEE_RATE_SCALE = 1000n\n\n/** Linea mainnet VotingEscrowMarketplace. */\nexport const VOTING_ESCROW_MARKETPLACE_LINEA_ADDRESS = getAddress('0x92557d38beAe4658d3c03A02F349FFB60c3bfFA5')\n\n/** First marketplace block the continuumdao-server crawler scans. */\nexport const VOTING_ESCROW_MARKETPLACE_START_BLOCK = 32_100_001n\n\n/** Linea WETH9 used by the marketplace for ETH-denominated orders. */\nexport const MARKETPLACE_WETH_LINEA_ADDRESS = getAddress('0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f')\n\n/** Linea USDC, a whitelisted marketplace payment token. */\nexport const MARKETPLACE_USDC_LINEA_ADDRESS = getAddress('0x176211869cA2b568f2A7D4EE941E073a821EE1ff')\n\nexport const CONTINUUM_DAO_MARKETPLACE_PROTOCOL_ID = 'continuum-dao-marketplace'\n\n/** Current Linea ContinuumDAO governor (backend catalog ids start at 0). */\nexport const CONTINUUM_DAO_LINEA_GOVERNOR_ADDRESS = getAddress('0x76FF2CB03175900F1D83328C82D27EA9aeaF2355')\n\n/**\n * Superseded Linea ContinuumDAO governor. The public catalog keeps its two\n * proposals as ids **-2** and **-1** so the new contract can start at 0.\n */\nexport const CONTINUUM_DAO_LINEA_GOVERNOR_LEGACY_ADDRESS = getAddress('0x4800F9f1dC1b6daCA841B71E0531F547D374168E')\n\n/** Placeholder deployments — fill NodeProperties / Rewards after redeploy. */\nexport const CONTINUUM_DAO_DEPLOYMENTS: Readonly<Record<number, ContinuumDaoDeployment>> = {\n [CONTINUUM_DAO_LINEA_CHAIN_ID]: {\n ...UNSET,\n ctm: CTM_TOKEN_ADDRESS,\n votingEscrow: VOTING_ESCROW_LINEA_ADDRESS,\n governor: CONTINUUM_DAO_LINEA_GOVERNOR_ADDRESS,\n },\n [CONTINUUM_DAO_LINEA_SEPOLIA_CHAIN_ID]: { ...UNSET },\n [CONTINUUM_DAO_ETHEREUM_CHAIN_ID]: {\n ...UNSET,\n ctm: CTM_TOKEN_ADDRESS,\n },\n}\n\n/** Public ContinuumDAO governance API (same host continuumdao-app proxies). */\nexport const CONTINUUM_DAO_GOVERNANCE_API = 'https://app-api.continuumdao.org'\n\n/** Marketplace catalog on the same host (`/marketplace/*`). */\nexport const CONTINUUM_DAO_MARKETPLACE_API = CONTINUUM_DAO_GOVERNANCE_API\n\nexport function isConfiguredAddress(addr?: string | null): boolean {\n if (!addr?.trim()) return false\n try {\n return getAddress(addr) !== zeroAddress\n } catch {\n return false\n }\n}\n\nexport function continuumDaoDeployment(chainId: number): ContinuumDaoDeployment | null {\n return CONTINUUM_DAO_DEPLOYMENTS[chainId] ?? null\n}\n\nexport function isContinuumDaoLockChain(chainId: number): boolean {\n return chainId === CONTINUUM_DAO_LINEA_CHAIN_ID || chainId === CONTINUUM_DAO_LINEA_SEPOLIA_CHAIN_ID\n}\n\nexport function isContinuumDaoSupportedChainId(chainId: number): boolean {\n return continuumDaoDeployment(chainId) != null\n}\n\nexport function ctmTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n const ctm = continuumDaoDeployment(chainId)?.ctm\n return ctm && isConfiguredAddress(ctm) ? getAddress(ctm) : null\n}\n\nexport function votingEscrowAddressOnEvmChain(chainId: number): `0x${string}` | null {\n const ve = continuumDaoDeployment(chainId)?.votingEscrow\n return ve && isConfiguredAddress(ve) ? getAddress(ve) : null\n}\n\nexport function votingEscrowMarketplaceAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId !== CONTINUUM_DAO_LINEA_CHAIN_ID) return null\n return VOTING_ESCROW_MARKETPLACE_LINEA_ADDRESS\n}\n\nexport function governorAddressOnEvmChain(chainId: number): `0x${string}` | null {\n const gov = continuumDaoDeployment(chainId)?.governor\n return gov && isConfiguredAddress(gov) ? getAddress(gov) : null\n}\n\nfunction sameAddr(a: string, b: string): boolean {\n try {\n return getAddress(a) === getAddress(b)\n } catch {\n return false\n }\n}\n\nexport function isContinuumDaoCtmOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = ctmTokenAddressOnEvmChain(n)\n if (!expected) return false\n return sameAddr(contractAddress, expected)\n}\n\nexport function isContinuumDaoVeCtmOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = votingEscrowAddressOnEvmChain(n)\n if (!expected) return false\n return sameAddr(contractAddress, expected)\n}\n\nexport function isVotingEscrowContinuumName(name?: string | null): boolean {\n return (name ?? '').trim() === VECTM_TOKEN_NAME\n}\n\nexport function isCtmTokenSymbol(symbol?: string | null): boolean {\n return (symbol ?? '').trim().toUpperCase() === CTM_TOKEN_SYMBOL\n}\n\nexport type ContinuumDaoDefaultAsset = {\n chainId: number\n tokenType: 'CTMERC20' | 'ERC721'\n contractAddress: `0x${string}`\n name: string\n symbol: string\n decimals?: number\n}\n\n/** Default registry rows when the configured address is non-zero. */\nexport function listContinuumDaoDefaultAssets(): ContinuumDaoDefaultAsset[] {\n const out: ContinuumDaoDefaultAsset[] = []\n for (const chainId of [\n CONTINUUM_DAO_LINEA_CHAIN_ID,\n CONTINUUM_DAO_LINEA_SEPOLIA_CHAIN_ID,\n CONTINUUM_DAO_ETHEREUM_CHAIN_ID,\n ]) {\n const dep = continuumDaoDeployment(chainId)\n if (!dep) continue\n if (isConfiguredAddress(dep.ctm)) {\n out.push({\n chainId,\n tokenType: 'CTMERC20',\n contractAddress: getAddress(dep.ctm),\n name: CTM_TOKEN_NAME,\n symbol: CTM_TOKEN_SYMBOL,\n decimals: CTM_TOKEN_DECIMALS,\n })\n }\n if (isContinuumDaoLockChain(chainId) && isConfiguredAddress(dep.votingEscrow)) {\n out.push({\n chainId,\n tokenType: 'ERC721',\n contractAddress: getAddress(dep.votingEscrow),\n name: VECTM_TOKEN_NAME,\n symbol: VECTM_TOKEN_SYMBOL,\n })\n }\n }\n return out\n}\n","import { getAddress, zeroAddress } from 'viem'\nimport { ctmTokenAddressOnEvmChain } from '../continuum-dao/constants.js'\nimport { railgunNetworkByChainId } from './networks.js'\n\nexport const RAILGUN_POPULAR_ASSET_LIMIT = 5\n\n/** Off until a broadcaster quotes CTM. Flip this to show the icon and accept CTM again. */\nexport const RAILGUN_CTM_ENABLED = false\n\nexport const RAILGUN_CTM_DISABLED_MESSAGE = 'Railgun support for CTM is off until a broadcaster quotes CTM.'\nconst POPULAR_ASSET_CACHE_MS = 10 * 60 * 1000\nconst RECENT_SHIELD_LIMIT = 200\n\n/** Railgun's indexed Shield feed. Keyed by NETWORK_CONFIG name, not chain id. */\nconst SHIELD_INDEX_BY_NETWORK_NAME: Record<string, string> = {\n Ethereum: 'https://rail-squid.squids.live/squid-railgun-ethereum-v2/graphql',\n BNB_Chain: 'https://rail-squid.squids.live/squid-railgun-bsc-v2/graphql',\n Polygon: 'https://rail-squid.squids.live/squid-railgun-polygon-v2/graphql',\n Arbitrum: 'https://rail-squid.squids.live/squid-railgun-arbitrum-v2/graphql',\n}\n\nconst RECENT_SHIELDS_QUERY = `query RecentShields($limit: Int!) {\n shieldCommitments(orderBy: [blockNumber_DESC], limit: $limit) {\n preimage { token { tokenType tokenAddress } }\n }\n}`\n\nexport type ShieldCommitmentLike = {\n tokenAddress: string\n tokenType: number\n}\n\ntype CacheEntry = {\n at: number\n tokens: { address: string }[]\n nativeWrapped?: string\n notes?: string\n}\n\nconst cache = new Map<number, CacheEntry>()\n\nexport function rankPopularShieldTokens(\n rows: readonly ShieldCommitmentLike[],\n limit = RAILGUN_POPULAR_ASSET_LIMIT,\n): string[] {\n const counts = new Map<string, number>()\n for (const row of rows) {\n if (Number(row.tokenType) !== 0) continue\n let address: string\n try {\n address = getAddress(row.tokenAddress)\n } catch {\n continue\n }\n if (address === zeroAddress) continue\n const key = address.toLowerCase()\n counts.set(key, (counts.get(key) ?? 0) + 1)\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))\n .slice(0, limit)\n .map(([address]) => getAddress(address))\n}\n\nexport function shieldIndexEndpoint(networkName: string): string | null {\n return SHIELD_INDEX_BY_NETWORK_NAME[networkName] ?? null\n}\n\nexport function commitmentsFromShieldIndex(payload: unknown): ShieldCommitmentLike[] {\n const rows = (payload as { data?: { shieldCommitments?: unknown } } | null)?.data?.shieldCommitments\n if (!Array.isArray(rows)) return []\n return rows.map((row) => {\n const token = (row as { preimage?: { token?: { tokenType?: unknown; tokenAddress?: unknown } } })?.preimage?.token\n const tokenType = token?.tokenType === 'ERC20' || token?.tokenType === 0 ? 0 : Number(token?.tokenType ?? -1)\n return {\n tokenAddress: String(token?.tokenAddress ?? ''),\n tokenType: Number.isFinite(tokenType) ? tokenType : -1,\n }\n })\n}\n\nlet shieldLogReaderOverride: ((args: {\n rpcUrl: string\n chainId: number\n proxy: `0x${string}`\n deploymentBlock: number\n networkName: string\n}) => Promise<ShieldCommitmentLike[]>) | null = null\n\nexport function setRailgunShieldLogReaderForTests(\n fn: typeof shieldLogReaderOverride,\n): void {\n shieldLogReaderOverride = fn\n}\n\nasync function readShieldCommitments(args: {\n rpcUrl: string\n chainId: number\n proxy: `0x${string}`\n deploymentBlock: number\n networkName: string\n}): Promise<ShieldCommitmentLike[]> {\n const endpoint = shieldIndexEndpoint(args.networkName)\n if (!endpoint) return []\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n query: RECENT_SHIELDS_QUERY,\n variables: { limit: RECENT_SHIELD_LIMIT },\n }),\n })\n if (!response.ok) throw new Error(`Railgun shield index returned ${response.status}`)\n return commitmentsFromShieldIndex(await response.json())\n}\n\nexport function assertRailgunCtmAllowed(chainId: number, tokenAddress: string): void {\n if (RAILGUN_CTM_ENABLED) return\n const ctm = ctmTokenAddressOnEvmChain(chainId)\n if (!ctm) return\n let normalized: string\n try {\n normalized = getAddress(tokenAddress)\n } catch {\n return\n }\n if (normalized.toLowerCase() === ctm.toLowerCase()) throw new Error(RAILGUN_CTM_DISABLED_MESSAGE)\n}\n\nfunction applyContinuumToken(\n chainId: number,\n result: { tokens: { address: string }[]; nativeWrapped?: string; notes?: string },\n): { tokens: { address: string }[]; nativeWrapped?: string; notes?: string } {\n const ctm = ctmTokenAddressOnEvmChain(chainId)\n if (!ctm) return result\n const present = result.tokens.some((token) => token.address.toLowerCase() === ctm.toLowerCase())\n if (!RAILGUN_CTM_ENABLED) {\n if (!present) return result\n return {\n ...result,\n tokens: result.tokens.filter((token) => token.address.toLowerCase() !== ctm.toLowerCase()),\n }\n }\n if (present) return result\n return { ...result, tokens: [...result.tokens, { address: ctm }] }\n}\n\nexport async function loadRailgunPopularAssets(args: {\n chainId: number\n rpcUrl?: string\n}): Promise<{ tokens: { address: string }[]; nativeWrapped?: string; notes?: string }> {\n const network = await railgunNetworkByChainId(args.chainId)\n if (!network) {\n return { tokens: [], notes: 'Railgun is not deployed on this chain.' }\n }\n const cached = cache.get(args.chainId)\n if (cached && Date.now() - cached.at < POPULAR_ASSET_CACHE_MS) {\n return applyContinuumToken(args.chainId, {\n tokens: cached.tokens,\n nativeWrapped: cached.nativeWrapped,\n notes: cached.notes,\n })\n }\n const rpcUrl = args.rpcUrl?.trim() ?? ''\n if (!shieldIndexEndpoint(network.networkName) && !shieldLogReaderOverride) {\n return applyContinuumToken(args.chainId, {\n tokens: [],\n nativeWrapped: network.wrappedAddress,\n notes: 'This chain has no indexed Railgun shield feed.',\n })\n }\n try {\n const commitments = await (shieldLogReaderOverride ?? readShieldCommitments)({\n rpcUrl,\n chainId: args.chainId,\n proxy: getAddress(network.proxyContract),\n deploymentBlock: network.deploymentBlock,\n networkName: network.networkName,\n })\n const tokens = rankPopularShieldTokens(commitments).map((address) => ({ address }))\n const notes =\n tokens.length === 0\n ? 'No recent ERC-20 shields were returned for this chain.'\n : `Top ${tokens.length} ERC-20s by recent indexed shield count.`\n const entry: CacheEntry = {\n at: Date.now(),\n tokens,\n nativeWrapped: network.wrappedAddress,\n notes,\n }\n cache.set(args.chainId, entry)\n return applyContinuumToken(args.chainId, { tokens, nativeWrapped: network.wrappedAddress, notes })\n } catch {\n return applyContinuumToken(args.chainId, {\n tokens: [],\n nativeWrapped: network.wrappedAddress,\n notes: 'The Railgun shield index could not be read.',\n })\n }\n}\n\nexport function clearRailgunPopularAssetCache(): void {\n cache.clear()\n}\n","export type RailgunPrivateBalanceRow = {\n tokenAddress: string\n spendable: string\n pending: string\n symbol?: string\n}\n\nexport type RailgunScanStatus = 'scanning' | 'ready' | 'empty' | 'error'\n\nexport type RailgunPrivateBalanceSnapshot = {\n chainId: number\n scanStatus: RailgunScanStatus\n balances: RailgunPrivateBalanceRow[]\n updatedAt: string\n notes?: string\n}\n\nconst byChain = new Map<number, RailgunPrivateBalanceSnapshot>()\n\nexport function publishRailgunPrivateBalanceSnapshot(snapshot: RailgunPrivateBalanceSnapshot): void {\n byChain.set(snapshot.chainId, snapshot)\n}\n\nexport function readRailgunPrivateBalanceSnapshot(chainId: number): RailgunPrivateBalanceSnapshot | undefined {\n return byChain.get(chainId)\n}\n\nexport function clearRailgunPrivateBalanceSnapshots(): void {\n byChain.clear()\n}\n\nexport function railgunFetchPrivateBalances(args: { chainId: number }): {\n chainId: number\n scanned: boolean\n scanStatus: RailgunScanStatus | 'unscanned'\n balances: RailgunPrivateBalanceRow[]\n notes: string\n} {\n const row = readRailgunPrivateBalanceSnapshot(args.chainId)\n if (!row || row.scanStatus === 'scanning') {\n return {\n chainId: args.chainId,\n scanned: false,\n scanStatus: row?.scanStatus ?? 'unscanned',\n balances: [],\n notes: 'No Railgun scan is stored for this chain yet.',\n }\n }\n return {\n chainId: args.chainId,\n scanned: true,\n scanStatus: row.scanStatus,\n balances: row.balances,\n notes:\n row.notes ??\n (row.balances.length === 0\n ? 'No private balance on this chain yet.'\n : 'Private balances from the latest Railgun wallet scan.'),\n }\n}\n","export const RAILGUN_WALLET_LOCKED_MESSAGE = 'Railgun wallet is not stored on this KeyGen.'\n\nexport type RailgunWalletSession = {\n walletId: string\n encryptionKey: string\n railgunAddress: string\n}\n\nlet session: RailgunWalletSession | null = null\n\nexport function setRailgunWalletSession(next: RailgunWalletSession | null): void {\n session = next\n}\n\nexport function getRailgunWalletSession(): RailgunWalletSession | null {\n return session\n}\n\nexport function requireRailgunWalletSession(): RailgunWalletSession {\n if (!session) throw new Error(RAILGUN_WALLET_LOCKED_MESSAGE)\n return session\n}\n","import { loadRailgunPopularAssets } from './popular-assets.js'\nimport { railgunFetchPrivateBalances } from './snapshot.js'\n\nexport async function railgunFetchPopularAssets(args: { chainId: number; rpcUrl?: string }) {\n const result = await loadRailgunPopularAssets(args)\n return {\n chainId: args.chainId,\n tokens: result.tokens,\n nativeWrapped: result.nativeWrapped,\n notes: result.notes ?? '',\n }\n}\n\nexport function railgunFetchPrivateBalancesSummary(args: { chainId: number }) {\n return railgunFetchPrivateBalances(args)\n}\n","import { http, type Transport } from 'viem'\n\n/**\n * Optional browser transport for protocol `eth_*` reads (allowance, decimals, spoke views).\n * Node / MCP leave this unset and use viem `http(rpcUrl)`.\n */\nlet evmRpcTransportFactory: ((rpcUrl: string) => Transport) | undefined\n\nexport function setDefiEvmRpcTransportFactory(factory: ((rpcUrl: string) => Transport) | undefined): void {\n evmRpcTransportFactory = factory\n}\n\nexport function getDefiEvmRpcTransportFactory(): ((rpcUrl: string) => Transport) | undefined {\n return evmRpcTransportFactory\n}\n\n/** Same-origin proxy in the browser when the app has called {@link setDefiEvmRpcTransportFactory}. */\nexport function defiEvmTransport(rpcUrl: string, opts?: Parameters<typeof http>[1]): Transport {\n const url = rpcUrl.trim()\n return evmRpcTransportFactory?.(url) ?? http(url, opts)\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import { keccak256, createPublicClient, defineChain, serializeTransaction, getAddress, parseGwei, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../core/defiEvmClient.js'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n expiryDate: context.expiryDate,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import { createRequire } from 'node:module'\nimport { dirname, join } from 'node:path'\nimport type { NetworkName } from '@railgun-community/shared-models'\nimport { railgunNetworkByChainId } from './networks.js'\n\nconst require = createRequire(import.meta.url)\n\nconst artifacts = new Map<string, Uint8Array | string>()\nlet started = false\nconst loadedProviders = new Set<string>()\nlet lastEngineError = ''\n\nfunction errorChain(err: unknown): string {\n const parts: string[] = []\n let current: unknown = err\n for (let depth = 0; current && depth < 4; depth += 1) {\n if (current instanceof Error) {\n parts.push(current.message)\n current = current.cause\n continue\n }\n parts.push(String(current))\n break\n }\n return parts.join(': ')\n}\n\nexport function latestRailgunEngineError(): string {\n return lastEngineError\n}\n\n/** Public aggregator from the Railgun quickstart. Ethereum will not load a provider without one. */\nconst POI_NODE_URLS = ['https://ppoi.fdi.network']\n\ntype WalletModule = {\n startRailgunEngine: (...args: unknown[]) => Promise<void>\n loadProvider: (\n config: { chainId: number; providers: { priority: number; weight: number; provider: string }[] },\n networkName: NetworkName,\n pollingInterval?: number,\n ) => Promise<unknown>\n ArtifactStore: new (\n get: (path: string) => Promise<Uint8Array | string | null>,\n store: (dir: string, path: string, item: string | Uint8Array) => Promise<void>,\n exists: (path: string) => Promise<boolean>,\n ) => unknown\n}\n\nasync function walletModule(): Promise<WalletModule> {\n return (await import('@railgun-community/wallet')) as unknown as WalletModule\n}\n\nconst artifactStore = {\n async get(path: string) {\n return artifacts.get(path) ?? null\n },\n async store(_dir: string, path: string, item: string | Uint8Array) {\n artifacts.set(path, item)\n },\n async exists(path: string) {\n return artifacts.has(path)\n },\n}\n\nexport async function ensureRailgunEngine(): Promise<void> {\n if (started) return\n const wallet = await walletModule()\n const walletEntry = require.resolve('@railgun-community/wallet')\n const { setLoggers } = require(join(dirname(walletEntry), 'utils/logger.js')) as {\n setLoggers: (log: (msg: string) => void, error: (err: unknown) => void) => void\n }\n setLoggers(\n () => undefined,\n (err) => {\n lastEngineError = errorChain(err)\n },\n )\n const memdown = (await import('memdown')).default as new () => object\n const store = new wallet.ArtifactStore(\n (path) => artifactStore.get(path),\n (dir, path, item) => artifactStore.store(dir, path, item),\n (path) => artifactStore.exists(path),\n )\n await wallet.startRailgunEngine('continuum', new memdown(), true, store, false, false, POI_NODE_URLS, [], false)\n started = true\n}\n\nexport async function ensureRailgunProvider(chainId: number, rpcUrl: string): Promise<NetworkName> {\n await ensureRailgunEngine()\n const network = await railgunNetworkByChainId(chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const networkName = network.networkName as NetworkName\n if (!loadedProviders.has(networkName)) {\n const wallet = await walletModule()\n await wallet.loadProvider(\n {\n chainId,\n providers: [{ provider: rpcUrl, priority: 1, weight: 2, stallTimeout: 2500 }],\n },\n networkName,\n 1000 * 60 * 5,\n )\n loadedProviders.add(networkName)\n }\n return networkName\n}\n","import { EVMGasType, type TransactionGasDetails } from '@railgun-community/shared-models'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\n\nexport function railgunGasDetails(chainDetail: EvmChainDetail, gasEstimate: bigint): TransactionGasDetails {\n if (chainDetail.legacy) {\n return {\n evmGasType: EVMGasType.Type0,\n gasEstimate,\n gasPrice: BigInt(Math.round(Number(chainDetail.gasPrice ?? 1) * 1e9)),\n }\n }\n return {\n evmGasType: EVMGasType.Type2,\n gasEstimate,\n maxFeePerGas: BigInt(Math.round(Number(chainDetail.baseFee ?? 1) * 1e9)),\n maxPriorityFeePerGas: BigInt(Math.round(Number(chainDetail.priorityFee ?? 1) * 1e9)),\n }\n}\n","import {\n encodeFunctionData,\n getAddress,\n hashMessage,\n parseAbi,\n stringToHex,\n zeroAddress,\n type Address,\n} from 'viem'\nimport { createPublicClient } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { finalizeMultisign } from '../../../core/envelope.js'\nimport type { KeyGenSubset } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { TXIDVersion, type NetworkName, type TransactionGasDetails } from '@railgun-community/shared-models'\nimport { ensureRailgunProvider } from './engine.js'\nimport { railgunGasDetails } from './gas.js'\nimport { railgunNetworkByChainId } from './networks.js'\nimport { assertRailgunCtmAllowed } from './popular-assets.js'\n\nconst erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\nconst wethAbi = parseAbi(['function deposit() payable', 'function withdraw(uint256 wad)'])\n\nexport type RailgunShieldArgs = {\n keyGen: KeyGenSubset\n executorAddress: Address | string\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas?: boolean\n customGasChainDetails?: Record<string, unknown> | null\n purposeText: string\n expiryDate?: number\n tokenAddress: string\n amountWei: string\n railgunAddress: string\n shieldSignature?: string\n /** Deposit native gas into the chain wrapped token, then shield that wrapped balance. */\n wrapNative?: boolean\n}\n\ntype PopulateShield = (\n txidVersion: TXIDVersion,\n networkName: NetworkName,\n shieldPrivateKey: string,\n erc20AmountRecipients: { tokenAddress: string; amount: bigint; recipientAddress: string }[],\n nftAmountRecipients: unknown[],\n gasDetails?: TransactionGasDetails,\n) => Promise<{ transaction?: { to?: string; data?: string; value?: bigint | string } }>\n\nlet populateShieldOverride: PopulateShield | null = null\n\ntype AllowanceReader = (args: {\n rpcUrl: string\n tokenAddress: Address\n owner: Address\n spender: Address\n}) => Promise<bigint>\n\nlet allowanceReaderOverride: AllowanceReader | null = null\n\nexport function setRailgunPopulateShieldForTests(fn: PopulateShield | null): void {\n populateShieldOverride = fn\n}\n\nexport function setRailgunAllowanceReaderForTests(fn: AllowanceReader | null): void {\n allowanceReaderOverride = fn\n}\n\nasync function shieldSignatureMessage(): Promise<string> {\n const wallet = (await import('@railgun-community/wallet')) as {\n getShieldPrivateKeySignatureMessage: () => string\n }\n return wallet.getShieldPrivateKeySignatureMessage()\n}\n\nfunction personalSignBody(args: RailgunShieldArgs, message: string) {\n const executor = getAddress(args.executorAddress)\n const digest = hashMessage(message)\n return finalizeMultisign({\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n destinationChainID: String(args.chainId),\n destinationAddress: executor,\n expiryDate: args.expiryDate,\n extraJSON: {\n signRequestKind: 'personal_sign',\n delivery: {\n kind: 'railgun_shield_signature',\n chainId: args.chainId,\n message,\n },\n },\n legs: [\n {\n msgHash: digest.startsWith('0x') ? digest.slice(2) : digest,\n msgRaw: stringToHex(message),\n destinationAddress: executor,\n signatureText: 'Railgun shield key',\n audit: {\n kind: 'PERSONAL_SIGN',\n protocol: 'railgun',\n action: 'shield-signature',\n },\n feeSnapshot: {},\n },\n ],\n })\n}\n\nasync function readAllowance(args: {\n rpcUrl: string\n tokenAddress: Address\n owner: Address\n spender: Address\n}): Promise<bigint> {\n if (allowanceReaderOverride) return allowanceReaderOverride(args)\n const client = createPublicClient({ transport: defiEvmTransport(args.rpcUrl) })\n return client.readContract({\n address: args.tokenAddress,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [args.owner, args.spender],\n })\n}\n\nexport async function buildEvmMultisignBodyWethUnwrap(args: {\n keyGen: KeyGenSubset\n executorAddress: Address | string\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas?: boolean\n customGasChainDetails?: Record<string, unknown> | null\n purposeText: string\n amountWei: string\n}) {\n const network = await railgunNetworkByChainId(args.chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const tokenAddress = getAddress(network.wrappedAddress)\n const amount = BigInt(args.amountWei)\n if (amount <= 0n) throw new Error('Amount must be greater than zero.')\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n chainId: args.chainId,\n rpcUrl,\n executorAddress: getAddress(args.executorAddress),\n chainDetail: args.chainDetail,\n useCustomGas: Boolean(args.useCustomGas),\n customGasChainDetails: args.customGasChainDetails,\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n },\n steps: [\n {\n to: tokenAddress,\n data: encodeFunctionData({ abi: wethAbi, functionName: 'withdraw', args: [amount] }),\n value: 0n,\n fallbackGas: 80_000n,\n },\n ],\n buildBatchMeta: () => ({ evm: { type: 'railgun_unwrap' } }),\n })\n}\n\nexport async function buildEvmMultisignBodyRailgunShield(args: RailgunShieldArgs) {\n assertRailgunCtmAllowed(args.chainId, args.tokenAddress)\n const signature = args.shieldSignature?.trim()\n if (!signature) {\n return personalSignBody(args, await shieldSignatureMessage())\n }\n const network = await railgunNetworkByChainId(args.chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const tokenAddress = getAddress(args.tokenAddress)\n if (tokenAddress === zeroAddress) {\n throw new Error('Shield the wrapped gas token. Railgun does not shield the native gas token directly.')\n }\n const amount = BigInt(args.amountWei)\n if (amount <= 0n) throw new Error('Amount must be greater than zero.')\n const executor = getAddress(args.executorAddress)\n const spender = getAddress(network.proxyContract)\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n const allowance = await readAllowance({\n rpcUrl,\n tokenAddress,\n owner: executor,\n spender,\n })\n const steps: EvmTxStep[] = []\n if (args.wrapNative) {\n if (getAddress(network.wrappedAddress) !== tokenAddress) {\n throw new Error('Native wrap only applies to this chain’s wrapped gas token.')\n }\n steps.push({\n to: tokenAddress,\n data: encodeFunctionData({ abi: wethAbi, functionName: 'deposit' }),\n value: amount,\n fallbackGas: 80_000n,\n })\n }\n if (allowance > 0n && allowance < amount) {\n steps.push({\n to: tokenAddress,\n data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [spender, 0n] }),\n value: 0n,\n fallbackGas: 80_000n,\n })\n }\n if (allowance < amount) {\n steps.push({\n to: tokenAddress,\n data: encodeFunctionData({ abi: erc20Abi, functionName: 'approve', args: [spender, amount] }),\n value: 0n,\n fallbackGas: 80_000n,\n })\n }\n const networkName = populateShieldOverride\n ? (network.networkName as NetworkName)\n : await ensureRailgunProvider(args.chainId, rpcUrl)\n const populate = populateShieldOverride ?? (await import('@railgun-community/wallet')).populateShield\n const populated = await populate(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n signature,\n [{ tokenAddress, amount, recipientAddress: args.railgunAddress.trim() }],\n [],\n railgunGasDetails(args.chainDetail, 1_200_000n),\n )\n const tx = populated.transaction\n const to = tx?.to ? getAddress(tx.to) : spender\n const data = tx?.data\n if (!data || !data.startsWith('0x')) throw new Error('Railgun shield transaction was empty.')\n steps.push({\n to,\n data: data as `0x${string}`,\n value: BigInt(tx?.value ?? 0),\n fallbackGas: 1_200_000n,\n })\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n chainId: args.chainId,\n rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: Boolean(args.useCustomGas),\n customGasChainDetails: args.customGasChainDetails,\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n },\n steps,\n buildBatchMeta: ({ step }) => ({\n evm: {\n type:\n step.value > 0n ? 'railgun_wrap' : step.to === tokenAddress ? 'railgun_approve' : 'railgun_shield',\n },\n }),\n })\n}\n","import { getAddress } from 'viem'\nimport {\n ChainType,\n TXIDVersion,\n calculateGasPrice,\n type Chain,\n type NetworkName,\n type RailgunERC20AmountRecipient,\n type SelectedBroadcaster,\n} from '@railgun-community/shared-models'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { ensureRailgunProvider } from './engine.js'\nimport { railgunGasDetails } from './gas.js'\nimport { railgunNetworkByChainId } from './networks.js'\nimport { assertRailgunCtmAllowed } from './popular-assets.js'\nimport { requireRailgunWalletSession } from './session.js'\n\nexport type RailgunPrivateActionArgs = {\n chainId: number\n rpcUrl?: string\n chainDetail?: EvmChainDetail\n tokenAddress: string\n amountWei: string\n recipientAddress: string\n memoText?: string\n onProofProgress?: (progress: number) => void\n}\n\ntype WalletTx = {\n gasEstimateForUnprovenTransfer: (...args: unknown[]) => Promise<{ gasEstimate: bigint }>\n generateTransferProof: (...args: unknown[]) => Promise<void>\n populateProvedTransfer: (...args: unknown[]) => Promise<{\n transaction: { to?: string; data?: string }\n nullifiers?: string[]\n preTransactionPOIsPerTxidLeafPerList: Record<string, Record<string, unknown>>\n }>\n gasEstimateForUnprovenUnshield: (...args: unknown[]) => Promise<{ gasEstimate: bigint }>\n generateUnshieldProof: (...args: unknown[]) => Promise<void>\n populateProvedUnshield: (...args: unknown[]) => Promise<{\n transaction: { to?: string; data?: string }\n nullifiers?: string[]\n preTransactionPOIsPerTxidLeafPerList: Record<string, Record<string, unknown>>\n }>\n calculateBroadcasterFeeERC20Amount: (\n feeTokenDetails: { tokenAddress: string; feePerUnitGas: bigint },\n gasDetails: unknown,\n ) => { tokenAddress: string; amount: bigint }\n}\n\ntype BroadcasterClient = {\n WakuBroadcasterClient: {\n start: (chain: Chain, options: { useDNSDiscovery?: boolean }, status: () => void) => Promise<void>\n isStarted: () => boolean\n setChain: (chain: Chain) => Promise<void>\n findBestBroadcaster: (\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ) => SelectedBroadcaster | undefined | null | Promise<SelectedBroadcaster | undefined | null>\n }\n BroadcasterTransaction: {\n create: (\n txidVersion: TXIDVersion,\n to: string,\n data: string,\n broadcasterRailgunAddress: string,\n broadcasterFeesID: string,\n chain: Chain,\n nullifiers: string[],\n overallBatchMinGasPrice: bigint,\n useRelayAdapt: boolean,\n preTransactionPOIsPerTxidLeafPerList: Record<string, Record<string, unknown>>,\n ) => Promise<{ send: () => Promise<string> }>\n }\n}\n\nfunction chainFor(chainId: number): Chain {\n return { type: ChainType.EVM, id: chainId }\n}\n\nasync function assertDeployed(chainId: number) {\n const network = await railgunNetworkByChainId(chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n return network\n}\n\nfunction parsedAmount(amountWei: string): bigint {\n const amount = BigInt(amountWei)\n if (amount <= 0n) throw new Error('Amount must be greater than zero.')\n return amount\n}\n\nasync function broadcasterClient(): Promise<BroadcasterClient> {\n try {\n return (await import('@railgun-community/waku-broadcaster-client-web')) as unknown as BroadcasterClient\n } catch {\n throw new Error('Railgun broadcaster client is not available.')\n }\n}\n\nasync function selectedBroadcaster(chain: Chain, tokenAddress: string): Promise<SelectedBroadcaster> {\n const { WakuBroadcasterClient } = await broadcasterClient()\n if (!WakuBroadcasterClient.isStarted()) {\n await WakuBroadcasterClient.start(chain, { useDNSDiscovery: true }, () => undefined)\n } else {\n await WakuBroadcasterClient.setChain(chain)\n }\n const deadline = Date.now() + 20_000\n let selected: SelectedBroadcaster | undefined | null\n while (Date.now() < deadline) {\n selected = await WakuBroadcasterClient.findBestBroadcaster(chain, tokenAddress, false)\n if (selected) return selected\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n throw new Error('No Railgun broadcaster is available for this token.')\n}\n\nasync function submitProved(args: {\n chain: Chain\n populated: {\n transaction: { to?: string; data?: string }\n nullifiers?: string[]\n preTransactionPOIsPerTxidLeafPerList: Record<string, Record<string, unknown>>\n }\n broadcaster: SelectedBroadcaster\n overallBatchMinGasPrice: bigint\n}): Promise<string> {\n const to = args.populated.transaction.to\n const data = args.populated.transaction.data\n if (!to || !data) throw new Error('Railgun proof did not produce a transaction.')\n const { BroadcasterTransaction } = await broadcasterClient()\n const tx = await BroadcasterTransaction.create(\n TXIDVersion.V2_PoseidonMerkle,\n to,\n data,\n args.broadcaster.railgunAddress,\n args.broadcaster.tokenFee.feesID,\n args.chain,\n args.populated.nullifiers ?? [],\n args.overallBatchMinGasPrice,\n false,\n args.populated.preTransactionPOIsPerTxidLeafPerList,\n )\n return tx.send()\n}\n\nfunction feeRecipient(\n wallet: WalletTx,\n broadcaster: SelectedBroadcaster,\n gasDetails: ReturnType<typeof railgunGasDetails>,\n): RailgunERC20AmountRecipient {\n const fee = wallet.calculateBroadcasterFeeERC20Amount(\n {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n },\n gasDetails,\n )\n return {\n tokenAddress: fee.tokenAddress,\n amount: fee.amount,\n recipientAddress: broadcaster.railgunAddress,\n }\n}\n\nexport async function railgunPrivateTransfer(args: RailgunPrivateActionArgs): Promise<{ txHash: string }> {\n assertRailgunCtmAllowed(args.chainId, args.tokenAddress)\n await assertDeployed(args.chainId)\n const tokenAddress = getAddress(args.tokenAddress)\n const amount = parsedAmount(args.amountWei)\n const recipientAddress = args.recipientAddress.trim()\n if (!recipientAddress.startsWith('0zk')) throw new Error('Private transfer recipient must be a 0zk address.')\n const session = requireRailgunWalletSession()\n const rpcUrl = args.rpcUrl?.trim() ?? ''\n if (!rpcUrl || !args.chainDetail) throw new Error('rpcUrl and chain details are required.')\n const networkName = await ensureRailgunProvider(args.chainId, rpcUrl)\n const wallet = (await import('@railgun-community/wallet')) as unknown as WalletTx\n const chain = chainFor(args.chainId)\n const broadcaster = await selectedBroadcaster(chain, tokenAddress)\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunGasDetails(args.chainDetail, 0n)\n const { gasEstimate } = await wallet.gasEstimateForUnprovenTransfer(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n session.walletId,\n session.encryptionKey,\n args.memoText ?? null,\n recipients,\n [],\n original,\n feeToken,\n false,\n )\n const gasDetails = railgunGasDetails(args.chainDetail, gasEstimate)\n const broadcasterFee = feeRecipient(wallet, broadcaster, gasDetails)\n const overallBatchMinGasPrice = calculateGasPrice(gasDetails)\n await wallet.generateTransferProof(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n session.walletId,\n session.encryptionKey,\n false,\n args.memoText ?? null,\n recipients,\n [],\n broadcasterFee,\n false,\n overallBatchMinGasPrice,\n (progress: number) => args.onProofProgress?.(progress),\n )\n const populated = await wallet.populateProvedTransfer(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n session.walletId,\n false,\n args.memoText ?? null,\n recipients,\n [],\n broadcasterFee,\n false,\n overallBatchMinGasPrice,\n gasDetails,\n )\n return { txHash: await submitProved({ chain, populated, broadcaster, overallBatchMinGasPrice }) }\n}\n\nexport async function railgunUnshield(args: RailgunPrivateActionArgs): Promise<{ txHash: string }> {\n assertRailgunCtmAllowed(args.chainId, args.tokenAddress)\n await assertDeployed(args.chainId)\n const tokenAddress = getAddress(args.tokenAddress)\n const amount = parsedAmount(args.amountWei)\n const recipientAddress = getAddress(args.recipientAddress)\n const session = requireRailgunWalletSession()\n const rpcUrl = args.rpcUrl?.trim() ?? ''\n if (!rpcUrl || !args.chainDetail) throw new Error('rpcUrl and chain details are required.')\n const networkName: NetworkName = await ensureRailgunProvider(args.chainId, rpcUrl)\n const wallet = (await import('@railgun-community/wallet')) as unknown as WalletTx\n const chain = chainFor(args.chainId)\n const broadcaster = await selectedBroadcaster(chain, tokenAddress)\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunGasDetails(args.chainDetail, 0n)\n const { gasEstimate } = await wallet.gasEstimateForUnprovenUnshield(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n session.walletId,\n session.encryptionKey,\n recipients,\n [],\n original,\n feeToken,\n false,\n )\n const gasDetails = railgunGasDetails(args.chainDetail, gasEstimate)\n const broadcasterFee = feeRecipient(wallet, broadcaster, gasDetails)\n const overallBatchMinGasPrice = calculateGasPrice(gasDetails)\n await wallet.generateUnshieldProof(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n session.walletId,\n session.encryptionKey,\n recipients,\n [],\n broadcasterFee,\n false,\n overallBatchMinGasPrice,\n (progress: number) => args.onProofProgress?.(progress),\n )\n const populated = await wallet.populateProvedUnshield(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n session.walletId,\n recipients,\n [],\n broadcasterFee,\n false,\n overallBatchMinGasPrice,\n gasDetails,\n )\n return { txHash: await submitProved({ chain, populated, broadcaster, overallBatchMinGasPrice }) }\n}\n","import { ChainType, RailgunWalletBalanceBucket, TXIDVersion, type RailgunBalancesEvent } from '@railgun-community/shared-models'\nimport { ensureRailgunEngine, ensureRailgunProvider, latestRailgunEngineError } from './engine.js'\nimport { railgunNetworkByChainId } from './networks.js'\nimport {\n publishRailgunPrivateBalanceSnapshot,\n type RailgunPrivateBalanceRow,\n type RailgunScanStatus,\n} from './snapshot.js'\nimport { setRailgunWalletSession, type RailgunWalletSession } from './session.js'\n\ntype WalletModule = {\n createRailgunWallet: (\n encryptionKey: string,\n mnemonic: string,\n creationBlockNumbers?: Record<string, number> | null,\n ) => Promise<{ id: string; railgunAddress: string }>\n createViewOnlyRailgunWallet: (\n encryptionKey: string,\n shareableViewingKey: string,\n creationBlockNumbers?: Record<string, number> | null,\n ) => Promise<{ id: string; railgunAddress: string }>\n getWalletShareableViewingKey: (railgunWalletID: string) => Promise<string | undefined>\n loadWalletByID: (encryptionKey: string, railgunWalletID: string, isViewOnlyWallet: boolean) => Promise<{ id: string; railgunAddress: string }>\n unloadWalletByID: (railgunWalletID: string) => void\n deleteWalletByID: (railgunWalletID: string) => Promise<void>\n setOnBalanceUpdateCallback: (callback?: (event: RailgunBalancesEvent) => void) => void\n setOnUTXOMerkletreeScanCallback: (callback: (event: { chain: { id: number }; scanStatus: string; progress: number }) => void) => void\n refreshBalances: (chain: { type: number; id: number }, walletIdFilter?: string[] | null) => Promise<void>\n awaitWalletScan: (walletID: string, chain: { type: number; id: number }) => Promise<unknown>\n validateRailgunAddress: (address: string) => boolean\n}\n\nasync function walletModule(): Promise<WalletModule> {\n return (await import('@railgun-community/wallet')) as unknown as WalletModule\n}\n\nexport async function createRailgunBrowserWallet(args: {\n encryptionKey: string\n mnemonic: string\n chainId: number\n}): Promise<RailgunWalletSession> {\n await ensureRailgunEngine()\n const network = await railgunNetworkByChainId(args.chainId)\n const wallet = await walletModule()\n const created = await wallet.createRailgunWallet(\n args.encryptionKey,\n args.mnemonic,\n network ? { [network.networkName]: network.deploymentBlock } : undefined,\n )\n const session = {\n walletId: created.id,\n encryptionKey: args.encryptionKey,\n railgunAddress: created.railgunAddress,\n }\n setRailgunWalletSession(session)\n return session\n}\n\nexport async function unlockRailgunBrowserWallet(args: {\n encryptionKey: string\n walletId: string\n}): Promise<RailgunWalletSession> {\n const wallet = await walletModule()\n const loaded = await wallet.loadWalletByID(args.encryptionKey, args.walletId, false)\n const session = {\n walletId: loaded.id,\n encryptionKey: args.encryptionKey,\n railgunAddress: loaded.railgunAddress,\n }\n setRailgunWalletSession(session)\n return session\n}\n\nexport async function railgunShareableViewingKey(walletId: string): Promise<string> {\n const wallet = await walletModule()\n const viewingKey = await wallet.getWalletShareableViewingKey(walletId)\n if (!viewingKey) throw new Error('Railgun viewing key is not available.')\n return viewingKey\n}\n\nexport async function openRailgunViewOnlyWallet(args: {\n encryptionKey: string\n shareableViewingKey: string\n chainId: number\n}): Promise<{ walletId: string; railgunAddress: string }> {\n await ensureRailgunEngine()\n const network = await railgunNetworkByChainId(args.chainId)\n const wallet = await walletModule()\n const created = await wallet.createViewOnlyRailgunWallet(\n args.encryptionKey,\n args.shareableViewingKey,\n network ? { [network.networkName]: network.deploymentBlock } : undefined,\n )\n return { walletId: created.id, railgunAddress: created.railgunAddress }\n}\n\nexport async function discardRailgunWallet(walletId: string): Promise<void> {\n setRailgunWalletSession(null)\n const wallet = await walletModule()\n wallet.unloadWalletByID(walletId)\n await wallet.deleteWalletByID(walletId)\n}\n\nexport function railgunAddressIsValid(address: string): Promise<boolean> {\n return walletModule().then((wallet) => wallet.validateRailgunAddress(address))\n}\n\ntype BalanceCell = { spendable: bigint; pending: Map<string, bigint> }\n\nconst buckets = new Map<number, Map<string, BalanceCell>>()\n\nfunction rowMap(chainId: number) {\n let rows = buckets.get(chainId)\n if (!rows) {\n rows = new Map()\n buckets.set(chainId, rows)\n }\n return rows\n}\n\nfunction cellFor(rows: Map<string, BalanceCell>, tokenAddress: string): BalanceCell {\n const key = tokenAddress.toLowerCase()\n let cell = rows.get(key)\n if (!cell) {\n cell = { spendable: 0n, pending: new Map() }\n rows.set(key, cell)\n }\n return cell\n}\n\nfunction applyBalanceEvent(event: RailgunBalancesEvent) {\n if (event.txidVersion !== TXIDVersion.V2_PoseidonMerkle) return\n const rows = rowMap(event.chain.id)\n const spendable = event.balanceBucket === RailgunWalletBalanceBucket.Spendable\n const pending =\n event.balanceBucket === RailgunWalletBalanceBucket.ShieldPending ||\n event.balanceBucket === RailgunWalletBalanceBucket.ProofSubmitted ||\n event.balanceBucket === RailgunWalletBalanceBucket.MissingExternalPOI ||\n event.balanceBucket === RailgunWalletBalanceBucket.MissingInternalPOI\n if (!spendable && !pending) return\n if (spendable) {\n for (const cell of rows.values()) cell.spendable = 0n\n }\n if (pending) {\n for (const cell of rows.values()) cell.pending.delete(event.balanceBucket)\n }\n for (const amount of event.erc20Amounts) {\n const cell = cellFor(rows, amount.tokenAddress)\n if (spendable) cell.spendable = amount.amount\n if (pending) cell.pending.set(event.balanceBucket, amount.amount)\n }\n}\n\nfunction snapshotRows(chainId: number): RailgunPrivateBalanceRow[] {\n const rows = buckets.get(chainId)\n if (!rows) return []\n return [...rows.entries()]\n .filter(([, cell]) => cell.spendable > 0n || [...cell.pending.values()].some((amount) => amount > 0n))\n .map(([tokenAddress, cell]) => ({\n tokenAddress,\n spendable: cell.spendable.toString(),\n pending: [...cell.pending.values()].reduce((sum, amount) => sum + amount, 0n).toString(),\n }))\n}\n\n/** History sync emits Complete on the merkletree callback. It does not emit the wallet event awaitWalletScan waits for. */\nexport function utxoScanTerminalStatus(scanStatus: string): 'done' | 'failed' | 'pending' {\n if (scanStatus === 'Complete') return 'done'\n if (scanStatus === 'Incomplete') return 'failed'\n return 'pending'\n}\n\nexport async function scanRailgunPrivateBalances(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n}): Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[] }> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n buckets.set(args.chainId, new Map())\n publishRailgunPrivateBalanceSnapshot({\n chainId: args.chainId,\n scanStatus: 'scanning',\n balances: [],\n updatedAt: new Date().toISOString(),\n })\n const wallet = await walletModule()\n let resolveScan: (status: 'done' | 'failed') => void = () => {}\n const scanSettled = new Promise<'done' | 'failed'>((resolve) => {\n resolveScan = resolve\n })\n wallet.setOnBalanceUpdateCallback((event) => {\n if (event.railgunWalletID !== args.walletId) return\n applyBalanceEvent(event)\n })\n wallet.setOnUTXOMerkletreeScanCallback((event) => {\n if (event.chain.id !== args.chainId) return\n args.onProgress?.(event.progress)\n const terminal = utxoScanTerminalStatus(event.scanStatus)\n if (terminal !== 'pending') resolveScan(terminal)\n })\n await ensureRailgunProvider(args.chainId, rpcUrl)\n const chain = { type: ChainType.EVM, id: args.chainId }\n await wallet.refreshBalances(chain, [args.walletId])\n if ((await scanSettled) === 'failed') {\n const cause = latestRailgunEngineError()\n throw new Error(cause ? `Railgun note scan stopped before it finished. ${cause}` : 'Railgun note scan stopped before it finished.')\n }\n const balances = snapshotRows(args.chainId)\n const scanStatus: RailgunScanStatus = balances.length === 0 ? 'empty' : 'ready'\n publishRailgunPrivateBalanceSnapshot({\n chainId: args.chainId,\n scanStatus,\n balances,\n updatedAt: new Date().toISOString(),\n notes: balances.length === 0 ? 'No private balance on this chain yet.' : undefined,\n })\n return { scanStatus, balances }\n}\n","/// <reference path=\"./ambient.d.ts\" />\nimport type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { loadRailgunSupportedChainIds } from './networks.js'\n\nexport * from './networks.js'\nexport * from './popular-assets.js'\nexport * from './snapshot.js'\nexport * from './session.js'\nexport * from './reads.js'\nexport * from './shield.js'\nexport * from './private-actions.js'\nexport * from './wallet.js'\n\nexport const RAILGUN_PROTOCOL_ID = 'railgun'\n\nexport const railgunProtocolModule: ProtocolModule = {\n id: RAILGUN_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return loadRailgunSupportedChainIds().then((ids) => ids.has(Number(ctx.chainId)))\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n {\n id: 'railgun.shield',\n protocolId: RAILGUN_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Shield an ERC-20 into a Railgun 0zk address',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n tokenAddress: { type: 'string', required: true, description: 'ERC-20 to shield' },\n amountWei: { type: 'string', required: true, description: 'Amount in wei' },\n railgunAddress: { type: 'string', required: true, description: 'Recipient 0zk address' },\n },\n },\n {\n id: 'railgun.private-transfer',\n protocolId: RAILGUN_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Private transfer from the unlocked Railgun wallet',\n commonParams: ['purposeText'],\n params: {\n tokenAddress: { type: 'string', required: true, description: 'Shielded ERC-20' },\n amountWei: { type: 'string', required: true, description: 'Amount in wei' },\n recipientAddress: { type: 'string', required: true, description: 'Recipient 0zk address' },\n },\n },\n {\n id: 'railgun.unshield',\n protocolId: RAILGUN_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Unshield from the unlocked Railgun wallet to a public address',\n commonParams: ['purposeText'],\n params: {\n tokenAddress: { type: 'string', required: true, description: 'Shielded ERC-20' },\n amountWei: { type: 'string', required: true, description: 'Amount in wei' },\n recipientAddress: { type: 'string', required: true, description: 'Public recipient' },\n },\n },\n ],\n}\n\nregisterProtocolModule(railgunProtocolModule)\n"]}
|
|
@@ -262,6 +262,119 @@ var UNISWAP_V4_LP_WETH_DEPOSIT_FALLBACK = 120000n;
|
|
|
262
262
|
var UNISWAP_V4_LP_PERMIT2_APPROVE_FALLBACK = 100000n;
|
|
263
263
|
var UNISWAP_V4_PERMISSION_FLAG_SWAP = 1;
|
|
264
264
|
var UNISWAP_V4_PERMISSION_FLAG_LIQUIDITY = 2;
|
|
265
|
+
var COINBASE_B20_STOCK_DECIMALS = 8;
|
|
266
|
+
var COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
|
|
267
|
+
function isCoinbaseB20AssetToken(address) {
|
|
268
|
+
try {
|
|
269
|
+
return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
|
|
270
|
+
} catch {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function looksLikeCoinbaseStockSymbol(symbol) {
|
|
275
|
+
return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
|
|
276
|
+
}
|
|
277
|
+
var COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
|
|
278
|
+
var CATALOG_TTL_MS = 15 * 60 * 1e3;
|
|
279
|
+
var CATALOG_MAX = 500;
|
|
280
|
+
var catalogRows = null;
|
|
281
|
+
var catalogAt = 0;
|
|
282
|
+
var catalogInflight = null;
|
|
283
|
+
var catalogBySymbol = /* @__PURE__ */ new Map();
|
|
284
|
+
var catalogByAddress = /* @__PURE__ */ new Map();
|
|
285
|
+
function indexCatalog(rows) {
|
|
286
|
+
catalogRows = rows;
|
|
287
|
+
catalogAt = Date.now();
|
|
288
|
+
catalogBySymbol.clear();
|
|
289
|
+
catalogByAddress.clear();
|
|
290
|
+
for (const row of rows) {
|
|
291
|
+
catalogBySymbol.set(row.symbol.toLowerCase(), row);
|
|
292
|
+
catalogByAddress.set(row.address.toLowerCase(), row);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function parseCoinbaseTokenizedStocksPayload(payload) {
|
|
296
|
+
const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
|
|
297
|
+
const out = [];
|
|
298
|
+
const seen = /* @__PURE__ */ new Set();
|
|
299
|
+
for (const row of tokens) {
|
|
300
|
+
if (!row || typeof row !== "object") continue;
|
|
301
|
+
const rec = row;
|
|
302
|
+
const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
|
|
303
|
+
const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
|
|
304
|
+
if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
|
|
305
|
+
const address = viem.getAddress(addressRaw);
|
|
306
|
+
const key = address.toLowerCase();
|
|
307
|
+
if (seen.has(key)) continue;
|
|
308
|
+
seen.add(key);
|
|
309
|
+
const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
|
|
310
|
+
const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
|
|
311
|
+
const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
|
|
312
|
+
out.push({ address, symbol, name, decimals, iconUrl });
|
|
313
|
+
if (out.length >= CATALOG_MAX) break;
|
|
314
|
+
}
|
|
315
|
+
return out;
|
|
316
|
+
}
|
|
317
|
+
async function fetchCoinbaseB20StockCatalog() {
|
|
318
|
+
const merged = [];
|
|
319
|
+
const seen = /* @__PURE__ */ new Set();
|
|
320
|
+
let pageToken = "";
|
|
321
|
+
for (let page = 0; page < 4; page++) {
|
|
322
|
+
const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
|
|
323
|
+
url.searchParams.set("page_size", "500");
|
|
324
|
+
if (pageToken) url.searchParams.set("page_token", pageToken);
|
|
325
|
+
const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
|
|
326
|
+
if (!res.ok) break;
|
|
327
|
+
const json = await res.json();
|
|
328
|
+
for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
|
|
329
|
+
const key = row.address.toLowerCase();
|
|
330
|
+
if (seen.has(key)) continue;
|
|
331
|
+
seen.add(key);
|
|
332
|
+
merged.push(row);
|
|
333
|
+
if (merged.length >= CATALOG_MAX) break;
|
|
334
|
+
}
|
|
335
|
+
pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
|
|
336
|
+
if (!pageToken || merged.length >= CATALOG_MAX) break;
|
|
337
|
+
}
|
|
338
|
+
if (merged.length > 0) indexCatalog(merged);
|
|
339
|
+
return catalogRows ?? [];
|
|
340
|
+
}
|
|
341
|
+
async function ensureCoinbaseB20StockCatalog() {
|
|
342
|
+
if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
|
|
343
|
+
if (!catalogInflight) {
|
|
344
|
+
catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
|
|
345
|
+
catalogInflight = null;
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
try {
|
|
349
|
+
return await catalogInflight;
|
|
350
|
+
} catch {
|
|
351
|
+
return catalogRows ?? [];
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
function lookupCoinbaseB20StockToken(token) {
|
|
355
|
+
const key = (token ?? "").trim();
|
|
356
|
+
if (!key) return null;
|
|
357
|
+
const fromCatalog = catalogBySymbol.get(key.toLowerCase());
|
|
358
|
+
if (fromCatalog) return fromCatalog;
|
|
359
|
+
try {
|
|
360
|
+
return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
|
|
361
|
+
} catch {
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async function canonicalizeEvmTokenInput(token) {
|
|
366
|
+
const raw = (token ?? "").trim();
|
|
367
|
+
if (!raw || viem.isAddress(raw)) return raw;
|
|
368
|
+
if (!looksLikeCoinbaseStockSymbol(raw)) return raw;
|
|
369
|
+
await ensureCoinbaseB20StockCatalog().catch(() => []);
|
|
370
|
+
const hit = lookupCoinbaseB20StockToken(raw);
|
|
371
|
+
if (!hit) {
|
|
372
|
+
throw new Error(
|
|
373
|
+
`Unknown Coinbase stock ticker "${raw}". It is not in the live tokenized-stocks catalog.`
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
return hit.address;
|
|
377
|
+
}
|
|
265
378
|
function defiEvmTransport(rpcUrl, opts) {
|
|
266
379
|
const url = rpcUrl.trim();
|
|
267
380
|
return viem.http(url, opts);
|
|
@@ -714,6 +827,11 @@ function messageFromUniswapHttpResponseBody(text, status, statusText = "") {
|
|
|
714
827
|
return short;
|
|
715
828
|
}
|
|
716
829
|
async function uniswapTradeQuote(args) {
|
|
830
|
+
args = {
|
|
831
|
+
...args,
|
|
832
|
+
tokenIn: await canonicalizeEvmTokenInput(args.tokenIn),
|
|
833
|
+
tokenOut: await canonicalizeEvmTokenInput(args.tokenOut)
|
|
834
|
+
};
|
|
717
835
|
const apiKey = (args.uniswapApiKey || "").trim();
|
|
718
836
|
if (!apiKey) {
|
|
719
837
|
throw new Error("uniswapApiKey (x-api-key) is required");
|
|
@@ -1619,7 +1737,7 @@ async function buildEvmMultisignBodyUniswapV4NativeInOnly(args, quoteInputWei) {
|
|
|
1619
1737
|
});
|
|
1620
1738
|
}
|
|
1621
1739
|
async function buildEvmMultisignBodyUniswapV4SkipPermit2Batch(args) {
|
|
1622
|
-
const tokenIn = viem.getAddress(args.tokenIn);
|
|
1740
|
+
const tokenIn = viem.getAddress(await canonicalizeEvmTokenInput(args.tokenIn));
|
|
1623
1741
|
const parsedInOut = parseUniswapQuoteClassicInOut(args.fullQuoteSnapshot);
|
|
1624
1742
|
const quoteInputWei = parsedInOut?.inputWei;
|
|
1625
1743
|
if (quoteInputWei == null || quoteInputWei <= 0n) {
|
|
@@ -2214,36 +2332,47 @@ function extractUniswapLpTokenAmounts(response) {
|
|
|
2214
2332
|
return { token0: read("token0"), token1: read("token1") };
|
|
2215
2333
|
}
|
|
2216
2334
|
async function uniswapLpCreatePosition(args) {
|
|
2335
|
+
const independentAddress = await canonicalizeEvmTokenInput(args.independentToken.tokenAddress);
|
|
2336
|
+
const existingPool = args.existingPool ? {
|
|
2337
|
+
...args.existingPool,
|
|
2338
|
+
token0Address: await canonicalizeEvmTokenInput(args.existingPool.token0Address),
|
|
2339
|
+
token1Address: await canonicalizeEvmTokenInput(args.existingPool.token1Address)
|
|
2340
|
+
} : void 0;
|
|
2341
|
+
const newPool = args.newPool ? {
|
|
2342
|
+
...args.newPool,
|
|
2343
|
+
token0Address: await canonicalizeEvmTokenInput(args.newPool.token0Address),
|
|
2344
|
+
token1Address: await canonicalizeEvmTokenInput(args.newPool.token1Address)
|
|
2345
|
+
} : void 0;
|
|
2217
2346
|
const body = {
|
|
2218
2347
|
protocol: "V4",
|
|
2219
2348
|
walletAddress: trimAddr2(args.walletAddress),
|
|
2220
2349
|
chainId: args.chainId,
|
|
2221
2350
|
independentToken: {
|
|
2222
|
-
tokenAddress: trimAddr2(
|
|
2351
|
+
tokenAddress: trimAddr2(independentAddress),
|
|
2223
2352
|
amount: String(args.independentToken.amount).trim()
|
|
2224
2353
|
},
|
|
2225
2354
|
slippageTolerance: args.slippageTolerance ?? UNISWAP_LP_DEFAULT_SLIPPAGE_PERCENT,
|
|
2226
2355
|
deadline: args.deadline ?? lpDeadlineUnix(),
|
|
2227
2356
|
simulateTransaction: args.simulateTransaction ?? false
|
|
2228
2357
|
};
|
|
2229
|
-
if (
|
|
2358
|
+
if (existingPool) {
|
|
2230
2359
|
body.existingPool = {
|
|
2231
|
-
token0Address: trimAddr2(
|
|
2232
|
-
token1Address: trimAddr2(
|
|
2233
|
-
poolReference: trimAddr2(
|
|
2360
|
+
token0Address: trimAddr2(existingPool.token0Address),
|
|
2361
|
+
token1Address: trimAddr2(existingPool.token1Address),
|
|
2362
|
+
poolReference: trimAddr2(existingPool.poolReference)
|
|
2234
2363
|
};
|
|
2235
2364
|
}
|
|
2236
|
-
if (
|
|
2365
|
+
if (newPool) {
|
|
2237
2366
|
body.newPool = {
|
|
2238
|
-
token0Address: trimAddr2(
|
|
2239
|
-
token1Address: trimAddr2(
|
|
2240
|
-
fee:
|
|
2241
|
-
tickSpacing:
|
|
2242
|
-
initialPrice: String(
|
|
2243
|
-
...
|
|
2367
|
+
token0Address: trimAddr2(newPool.token0Address),
|
|
2368
|
+
token1Address: trimAddr2(newPool.token1Address),
|
|
2369
|
+
fee: newPool.fee,
|
|
2370
|
+
tickSpacing: newPool.tickSpacing,
|
|
2371
|
+
initialPrice: String(newPool.initialPrice).trim(),
|
|
2372
|
+
...newPool.hooks ? { hooks: trimAddr2(newPool.hooks) } : {}
|
|
2244
2373
|
};
|
|
2245
2374
|
}
|
|
2246
|
-
if (!
|
|
2375
|
+
if (!existingPool && !newPool) {
|
|
2247
2376
|
throw new Error("Provide existingPool or newPool for LP create.");
|
|
2248
2377
|
}
|
|
2249
2378
|
if (args.priceBounds) {
|
|
@@ -2278,11 +2407,11 @@ async function uniswapLpIncreasePosition(args) {
|
|
|
2278
2407
|
protocol: "V4",
|
|
2279
2408
|
walletAddress: trimAddr2(args.walletAddress),
|
|
2280
2409
|
chainId: args.chainId,
|
|
2281
|
-
token0Address: trimAddr2(args.token0Address),
|
|
2282
|
-
token1Address: trimAddr2(args.token1Address),
|
|
2410
|
+
token0Address: trimAddr2(await canonicalizeEvmTokenInput(args.token0Address)),
|
|
2411
|
+
token1Address: trimAddr2(await canonicalizeEvmTokenInput(args.token1Address)),
|
|
2283
2412
|
nftTokenId: String(args.nftTokenId),
|
|
2284
2413
|
independentToken: {
|
|
2285
|
-
tokenAddress: trimAddr2(args.independentToken.tokenAddress),
|
|
2414
|
+
tokenAddress: trimAddr2(await canonicalizeEvmTokenInput(args.independentToken.tokenAddress)),
|
|
2286
2415
|
amount: String(args.independentToken.amount).trim()
|
|
2287
2416
|
},
|
|
2288
2417
|
slippageTolerance: args.slippageTolerance ?? UNISWAP_LP_DEFAULT_SLIPPAGE_PERCENT,
|
|
@@ -4194,6 +4323,19 @@ async function fetchFromSwapsTier(args) {
|
|
|
4194
4323
|
};
|
|
4195
4324
|
}
|
|
4196
4325
|
async function uniswapV4FetchOhlcv(args) {
|
|
4326
|
+
if (args.existingPool) {
|
|
4327
|
+
args = {
|
|
4328
|
+
...args,
|
|
4329
|
+
existingPool: {
|
|
4330
|
+
...args.existingPool,
|
|
4331
|
+
token0Address: await canonicalizeEvmTokenInput(args.existingPool.token0Address),
|
|
4332
|
+
token1Address: await canonicalizeEvmTokenInput(args.existingPool.token1Address)
|
|
4333
|
+
}
|
|
4334
|
+
};
|
|
4335
|
+
}
|
|
4336
|
+
if (args.currencyAddress?.trim()) {
|
|
4337
|
+
args = { ...args, currencyAddress: await canonicalizeEvmTokenInput(args.currencyAddress) };
|
|
4338
|
+
}
|
|
4197
4339
|
const chainId = parseUniswapChainId(args.chainId);
|
|
4198
4340
|
const interval = assertUniswapV4OhlcvInterval(args.interval ?? "1h");
|
|
4199
4341
|
const { startTimeMs, endTimeMs } = windowFromArgs(args);
|
|
@@ -4460,6 +4602,11 @@ async function uniswapLimitOrderQuote(args) {
|
|
|
4460
4602
|
args.nodeReadAuth ?? { bearerOnGet: true, jwt: null }
|
|
4461
4603
|
);
|
|
4462
4604
|
}
|
|
4605
|
+
args = {
|
|
4606
|
+
...args,
|
|
4607
|
+
tokenIn: await canonicalizeEvmTokenInput(args.tokenIn),
|
|
4608
|
+
tokenOut: await canonicalizeEvmTokenInput(args.tokenOut)
|
|
4609
|
+
};
|
|
4463
4610
|
const chainIdForGuard = parseUniswapChainId(resolveInputChainId(args));
|
|
4464
4611
|
assertUniswapLimitOrderChain(chainIdForGuard);
|
|
4465
4612
|
const base = args.baseUrl && args.baseUrl.trim() ? args.baseUrl.trim().replace(/\/$/, "") : "https://trade-api.gateway.uniswap.org/v1";
|