@continuumdao/ctm-mpc-defi 0.2.61 → 0.2.63
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 +328 -78
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +217 -27
- package/dist/agent/catalog.js +324 -79
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/aerodrome/SKILL.md +8 -8
- package/dist/agent/skills/railgun/SKILL.md +10 -4
- package/dist/agent/skills/yield-compare/SKILL.md +5 -5
- package/dist/index.cjs +5 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +476 -282
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +38 -13
- package/dist/protocols/evm/aerodrome/index.js +473 -284
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +54 -6
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.js +54 -6
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +45 -10
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.d.ts +10 -2
- package/dist/protocols/evm/euler-v2/index.js +44 -11
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/railgun/index.cjs +26 -9
- package/dist/protocols/evm/railgun/index.cjs.map +1 -1
- package/dist/protocols/evm/railgun/index.d.ts +1 -0
- package/dist/protocols/evm/railgun/index.js +26 -9
- package/dist/protocols/evm/railgun/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +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/data-dir.ts","../../../../src/protocols/evm/railgun/engine.ts","../../../../src/protocols/evm/railgun/gas.ts","../../../../src/protocols/evm/railgun/shield.ts","../../../../src/chains/evm/coingecko.ts","../../../../src/protocols/evm/railgun/broadcaster-choice.ts","../../../../src/protocols/evm/railgun/private-actions.ts","../../../../src/protocols/evm/railgun/fees.ts","../../../../src/protocols/evm/railgun/wallet.ts","../../../../src/protocols/evm/railgun/index.ts"],"names":["zeroAddress","getAddress","cached","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","require","EVMGasType","getEVMGasTypeForTransaction","parseAbi","hashMessage","recoverAddress","stringToHex","encodeFunctionData","TXIDVersion","ChainType","NETWORK_CONFIG","row","session","calculateGasPrice","walletModule","RailgunWalletBalanceBucket","delay","balances","record"],"mappings":"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","file":"index.cjs","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","/** Host folder beside user_folder, bind-mounted at this path in continuum-mcp. */\nexport const RAILGUN_CONTAINER_DATA_DIR = '/app/railgun_data'\n\n/**\n * Note tree directory. The MCP server defaults to the mounted folder.\n * Tests and the dashboard leave the variable unset and keep an in-memory tree.\n */\nexport function railgunDataRoot(): string {\n if (typeof process === 'undefined') return ''\n const fromEnv = process.env.RAILGUN_DATA_DIR?.trim() ?? ''\n if (fromEnv) return fromEnv\n if (process.versions?.node && process.env.MCP_HTTP_PORT?.trim() && process.cwd() === '/app') {\n return RAILGUN_CONTAINER_DATA_DIR\n }\n return ''\n}\n\nexport async function resolveRailgunDataRoot(): Promise<string> {\n return railgunDataRoot()\n}\n\n/** KeyGen ids are timestamps plus hex. Anything else must not become a path segment. */\nexport function safeKeyGenFolderName(keyGenId: string): string {\n const name = keyGenId.trim()\n if (!/^[A-Za-z0-9_-]{1,80}$/.test(name)) {\n throw new Error('KeyGen id cannot be used as a Railgun data folder name.')\n }\n return name\n}\n\nfunction under(root: string, ...parts: string[]): string {\n return [root.replace(/\\/+$/, ''), ...parts].join('/')\n}\n\nexport function railgunEnginePath(root: string): string {\n return under(root, 'engine')\n}\n\nexport function railgunArtifactPath(root: string): string {\n return under(root, 'artifacts')\n}\n\nexport function railgunKeyGenWalletPath(root: string, keyGenId: string): string {\n return under(root, 'keygens', safeKeyGenFolderName(keyGenId), 'wallet.json')\n}\n","import type { NetworkName } from '@railgun-community/shared-models'\nimport { railgunArtifactPath, railgunEnginePath, resolveRailgunDataRoot } from './data-dir.js'\nimport { railgunNetworkByChainId } from './networks.js'\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; stallTimeout?: number }[] },\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\nfunction artifactFile(root: string, itemPath: string): string {\n const relative = itemPath.replace(/^\\/+/, '')\n if (!relative || relative.split('/').some((part) => part === '..' || part === '')) {\n throw new Error('Railgun artifact path is not valid.')\n }\n return `${railgunArtifactPath(root)}/${relative}`\n}\n\nfunction memoryArtifactStore() {\n return {\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}\n\nfunction diskArtifactStore(root: string) {\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<typeof import('node:fs/promises')>\n return {\n async get(itemPath: string) {\n const fs = await load('node:fs/promises')\n try {\n return await fs.readFile(artifactFile(root, itemPath))\n } catch {\n return null\n }\n },\n async store(_dir: string, itemPath: string, item: string | Uint8Array) {\n const fs = await load('node:fs/promises')\n const file = artifactFile(root, itemPath)\n await fs.mkdir(file.slice(0, file.lastIndexOf('/')), { recursive: true })\n await fs.writeFile(file, item)\n },\n async exists(itemPath: string) {\n const fs = await load('node:fs/promises')\n try {\n await fs.access(artifactFile(root, itemPath))\n return true\n } catch {\n return false\n }\n },\n }\n}\n\nasync function railgunDatabase(root: string): Promise<object> {\n if (!root) {\n const memdown = (await import('memdown')).default as new () => object\n return new memdown()\n }\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const fs = (await load('node:fs/promises')) as typeof import('node:fs/promises')\n const engineDir = railgunEnginePath(root)\n await fs.mkdir(engineDir, { recursive: true })\n await fs.mkdir(railgunArtifactPath(root), { recursive: true })\n const leveldownModule = (await load('leveldown')) as { default?: (location: string) => object }\n const open = leveldownModule.default ?? (leveldownModule as unknown as (location: string) => object)\n return open(engineDir)\n}\n\n/** Node-only. Keep the specifier out of the bundle so Next does not try to resolve Node's `module`. */\nasync function attachEngineErrorLogger(): Promise<void> {\n if (typeof window !== 'undefined') return\n if (typeof process === 'undefined' || !process.versions?.node) return\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const nodeModule = (await load('node:' + 'module')) as unknown as typeof import('node:module')\n const nodePath = (await load('node:' + 'path')) as unknown as typeof import('node:path')\n const require = nodeModule.createRequire(import.meta.url)\n const walletEntry = require.resolve('@railgun-community/wallet')\n const { setLoggers } = require(nodePath.join(nodePath.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}\n\ntype SnarkGroth16 = {\n fullProve: (...args: unknown[]) => Promise<unknown>\n verify?: (...args: unknown[]) => Promise<boolean>\n}\n\n/**\n * The engine starts with an empty prover. Proof generation then throws\n * \"Requires groth16 full prover implementation\". snarkjs is the Node prover.\n */\nasync function attachSnarkJsGroth16(): Promise<void> {\n if (typeof window !== 'undefined') return\n if (typeof process === 'undefined' || !process.versions?.node) return\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const nodeModule = (await load('node:' + 'module')) as unknown as typeof import('node:module')\n const nodePath = (await load('node:' + 'path')) as unknown as typeof import('node:path')\n const require = nodeModule.createRequire(import.meta.url)\n const walletEntry = require.resolve('@railgun-community/wallet')\n const { getProver } = require(nodePath.join(nodePath.dirname(walletEntry), 'services/railgun/core/prover.js')) as {\n getProver: () => { setSnarkJSGroth16: (groth16: SnarkGroth16) => void }\n }\n const snark = require('snarkjs') as { groth16?: SnarkGroth16 }\n const groth16 = snark.groth16\n if (!groth16 || typeof groth16.fullProve !== 'function') {\n throw new Error('snarkjs groth16 prover is missing.')\n }\n getProver().setSnarkJSGroth16(groth16)\n}\n\nexport async function ensureRailgunEngine(): Promise<void> {\n if (started) return\n const wallet = await walletModule()\n await attachEngineErrorLogger()\n const root = await resolveRailgunDataRoot()\n const files = root ? diskArtifactStore(root) : memoryArtifactStore()\n const store = new wallet.ArtifactStore(\n (path) => files.get(path),\n (dir, path, item) => files.store(dir, path, item),\n (path) => files.exists(path),\n )\n await wallet.startRailgunEngine('continuum', await railgunDatabase(root), true, store, false, false, POI_NODE_URLS, [], false)\n await attachSnarkJsGroth16()\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 { createPublicClient } from 'viem'\nimport {\n EVMGasType,\n getEVMGasTypeForTransaction,\n type NetworkName,\n type TransactionGasDetails,\n} from '@railgun-community/shared-models'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\n\n/** One private-transfer circuit, used when the spending wallet is still sealed at quote time. Execute replaces this with the scanned wallet's own gas estimate. */\nexport const RAILGUN_TRANSFER_GAS_ESTIMATE = 2_900_000n\n/** One unshield circuit, quoted the same way as a transfer before the spending wallet is scanned. */\nexport const RAILGUN_UNSHIELD_GAS_ESTIMATE = 3_400_000n\n\nfunction weiFromGwei(gwei: number | undefined, fallback = 1): bigint {\n return BigInt(Math.round(Number(gwei ?? fallback) * 1e9))\n}\n\nexport function railgunGasDetails(chainDetail: EvmChainDetail, gasEstimate: bigint): TransactionGasDetails {\n if (chainDetail.legacy) {\n return {\n evmGasType: EVMGasType.Type0,\n gasEstimate,\n gasPrice: weiFromGwei(chainDetail.gasPrice),\n }\n }\n return {\n evmGasType: EVMGasType.Type2,\n gasEstimate,\n maxFeePerGas: weiFromGwei(chainDetail.baseFee),\n maxPriorityFeePerGas: weiFromGwei(chainDetail.priorityFee),\n }\n}\n\n/**\n * A broadcaster on an EIP-1559 chain requires type 1 gas (a single gasPrice).\n * Type 2 is only valid when the sender signs the transaction itself.\n */\nexport function railgunBroadcasterGasDetails(\n networkName: NetworkName,\n chainDetail: EvmChainDetail,\n gasEstimate: bigint,\n): TransactionGasDetails {\n const evmGasType = getEVMGasTypeForTransaction(networkName, false)\n if (evmGasType === EVMGasType.Type2 || evmGasType === EVMGasType.Type4) {\n return {\n evmGasType,\n gasEstimate,\n maxFeePerGas: weiFromGwei(chainDetail.baseFee),\n maxPriorityFeePerGas: weiFromGwei(chainDetail.priorityFee),\n }\n }\n const gasPrice =\n evmGasType === EVMGasType.Type0 || chainDetail.legacy\n ? weiFromGwei(chainDetail.gasPrice)\n : weiFromGwei(chainDetail.baseFee) + weiFromGwei(chainDetail.priorityFee)\n return { evmGasType, gasEstimate, gasPrice }\n}\n\nexport function gweiFromWei(wei: bigint): number {\n return Number(wei) / 1e9\n}\n\n/** Fill a missing registry gas price from the latest block. A stored price is left as configured. */\nexport function chainDetailWithFetchedGas(\n chainDetail: EvmChainDetail,\n live: { baseFeeWei?: bigint; priorityFeeWei?: bigint; gasPriceWei?: bigint },\n): EvmChainDetail {\n if (chainDetail.legacy) {\n if (chainDetail.gasPrice != null && chainDetail.gasPrice > 0) return chainDetail\n if (live.gasPriceWei == null) return chainDetail\n return { ...chainDetail, gasPrice: gweiFromWei(live.gasPriceWei) }\n }\n if (chainDetail.baseFee != null && chainDetail.baseFee > 0) return chainDetail\n return {\n ...chainDetail,\n baseFee: live.baseFeeWei != null ? gweiFromWei(live.baseFeeWei) : chainDetail.baseFee,\n priorityFee:\n chainDetail.priorityFee != null && chainDetail.priorityFee > 0\n ? chainDetail.priorityFee\n : live.priorityFeeWei != null\n ? gweiFromWei(live.priorityFeeWei)\n : chainDetail.priorityFee,\n }\n}\n\nexport async function chainDetailWithLiveGas(rpcUrl: string, chainDetail: EvmChainDetail): Promise<EvmChainDetail> {\n const needsLive = chainDetail.legacy\n ? chainDetail.gasPrice == null || chainDetail.gasPrice <= 0\n : chainDetail.baseFee == null || chainDetail.baseFee <= 0\n if (!needsLive) return chainDetail\n const client = createPublicClient({ transport: defiEvmTransport(rpcUrl) })\n if (chainDetail.legacy) {\n const gasPriceWei = await client.getGasPrice()\n return chainDetailWithFetchedGas(chainDetail, { gasPriceWei })\n }\n const block = await client.getBlock({ blockTag: 'latest' })\n let priorityFeeWei = 0n\n try {\n priorityFeeWei = await client.estimateMaxPriorityFeePerGas()\n } catch {\n priorityFeeWei = 1_000_000_000n\n }\n return chainDetailWithFetchedGas(chainDetail, {\n baseFeeWei: block.baseFeePerGas ?? 0n,\n priorityFeeWei,\n })\n}\n\n/** Same token amount Railgun charges: feePerUnitGas × (gas estimate × 1.2) × gas price / 1e18. */\nexport function broadcasterTokenFee(feePerUnitGas: bigint, gasDetails: TransactionGasDetails): bigint {\n const price =\n gasDetails.evmGasType === EVMGasType.Type2 || gasDetails.evmGasType === EVMGasType.Type4\n ? gasDetails.maxFeePerGas\n : gasDetails.gasPrice\n const maximumGas = ((gasDetails.gasEstimate * 12_000n) / 10_000n) * price\n return (feePerUnitGas * maximumGas) / 10n ** 18n\n}\n","import {\n encodeFunctionData,\n getAddress,\n hashMessage,\n keccak256,\n parseAbi,\n recoverAddress,\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\n/** Railgun hashes the 65-byte personal_sign. The node often returns r||s without the recovery byte. */\nexport async function shieldPrivateKeyFromSignature(\n signature: string,\n executorAddress?: string,\n): Promise<`0x${string}`> {\n return keccak256(await canonicalRailgunShieldSignature(signature, executorAddress))\n}\n\nasync function canonicalRailgunShieldSignature(\n signature: string,\n executorAddress?: string,\n): Promise<`0x${string}`> {\n const body = signature.trim().replace(/^0x/i, '').toLowerCase()\n if (!/^[0-9a-f]+$/.test(body) || body.length % 2 !== 0) {\n throw new Error('Shield-key signature must be hex.')\n }\n const rs = body.length === 130 ? body.slice(0, 128) : body\n if (rs.length !== 128) {\n throw new Error('Shield-key signature must be the 65-byte personal_sign of RAILGUN_SHIELD.')\n }\n const stated = body.length === 130 ? body.slice(128) : ''\n if (!executorAddress) {\n if (stated === '00') return `0x${rs}1b`\n if (stated === '01') return `0x${rs}1c`\n if (body.length === 130) return `0x${body}`\n throw new Error('Shield-key signature must be the 65-byte personal_sign of RAILGUN_SHIELD.')\n }\n const preferred = stated === '01' || stated === '1c' ? (['1c', '1b'] as const) : (['1b', '1c'] as const)\n const hash = hashMessage('RAILGUN_SHIELD')\n const executor = getAddress(executorAddress).toLowerCase()\n for (const v of preferred) {\n const candidate = `0x${rs}${v}` as `0x${string}`\n try {\n const recovered = await recoverAddress({ hash, signature: candidate })\n if (recovered.toLowerCase() === executor) return candidate\n } catch {\n continue\n }\n }\n if (body.length === 130 && stated !== '00' && stated !== '01' && stated !== '1b' && stated !== '1c') {\n return `0x${body}`\n }\n throw new Error('Shield-key signature does not recover to this KeyGen address.')\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 shieldPrivateKey = await shieldPrivateKeyFromSignature(signature, executor)\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 shieldPrivateKey,\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","/**\n * CoinGecko asset platform id by mainnet chainId (contract + token_price endpoints).\n * IDs from CoinGecko GET /asset_platforms (chain_identifier → id).\n * Keep in sync with continuumdao-node-app `COINGECKO_PLATFORM_BY_CHAIN_ID`.\n */\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Record<string, string> = {\n '1': 'ethereum',\n '10': 'optimistic-ethereum',\n '30': 'rootstock',\n '56': 'binance-smart-chain',\n '100': 'xdai',\n '137': 'polygon-pos',\n '146': 'sonic',\n '169': 'manta-pacific',\n '196': 'x-layer',\n '204': 'op-bnb',\n '239': 'tac',\n '250': 'fantom',\n '252': 'fraxtal',\n '288': 'boba',\n '324': 'zk-sync-era',\n '480': 'world-chain',\n '999': 'hyperevm',\n '1088': 'metis-andromeda',\n '1101': 'polygon-zkevm',\n '1116': 'core',\n '1135': 'lisk',\n '130': 'unichain',\n '1868': 'soneium',\n '1923': 'swellchain',\n '2222': 'kava',\n '2818': 'morph-l2',\n '34443': 'mode',\n '42161': 'arbitrum-one',\n '42220': 'celo',\n '43114': 'avalanche',\n '4663': 'robinhood',\n '5042': 'arc',\n '48900': 'zircuit',\n '5000': 'mantle',\n '534352': 'scroll',\n '57073': 'ink',\n '59144': 'linea',\n '60808': 'bob-network',\n '80084': 'berachain',\n '80094': 'berachain',\n '81457': 'blast',\n '8453': 'base',\n '9745': 'plasma',\n '167000': 'taiko',\n '7777777': 'zora',\n}\n\nexport function coingeckoPlatformForChainId(chainId: string | number): string | undefined {\n return COINGECKO_PLATFORM_BY_CHAIN_ID[String(chainId).trim()]\n}\n","/** One thousandths of a 1:1 fee ratio. 1000 means the token fee matches the gas cost. */\nexport const FEE_RATIO_ONE_TO_ONE_MILLI = 1000\n\nexport type BroadcasterChoiceFields = {\n feesId: string\n feePerUnitGas: bigint\n ratioMilli: number | null\n reliability: number\n coversGas: boolean\n}\n\n/**\n * Railway's fee ratio. feePerUnitGas is token base units per 1e18 wei of gas, so the\n * gas amount cancels and the ratio is the token's dollar value divided by the native gas token's.\n * 1.00 means the broadcaster is paid about the full gas estimate.\n */\nexport function feeRatioMilli(\n feePerUnitGas: bigint,\n tokenDecimals: number,\n tokenUsd: number,\n nativeUsd: number,\n): number | null {\n if (!Number.isInteger(tokenDecimals) || tokenDecimals < 0 || tokenDecimals > 36) return null\n if (!(tokenUsd > 0) || !(nativeUsd > 0) || !Number.isFinite(tokenUsd) || !Number.isFinite(nativeUsd)) return null\n const tokenMicro = BigInt(Math.round(tokenUsd * 1_000_000))\n const nativeMicro = BigInt(Math.round(nativeUsd * 1_000_000))\n if (tokenMicro <= 0n || nativeMicro <= 0n) return null\n const denom = 10n ** BigInt(tokenDecimals) * nativeMicro\n if (denom <= 0n) return null\n const milli = (feePerUnitGas * tokenMicro * 1000n) / denom\n if (milli > BigInt(Number.MAX_SAFE_INTEGER)) return null\n return Number(milli)\n}\n\nexport function formatFeeRatioMilli(milli: number): string {\n const abs = Math.abs(Math.trunc(milli))\n const whole = Math.floor(abs / 1000)\n const frac = String(abs % 1000).padStart(3, '0').slice(0, 2)\n return `${milli < 0 ? '-' : ''}${whole}.${frac}`\n}\n\nexport function coversGasCost(ratioMilli: number | null): boolean {\n return ratioMilli != null && ratioMilli >= FEE_RATIO_ONE_TO_ONE_MILLI\n}\n\nexport function orderBroadcasterChoices<T extends BroadcasterChoiceFields>(rows: readonly T[]): T[] {\n return [...rows].sort((left, right) => {\n if (left.coversGas !== right.coversGas) return left.coversGas ? -1 : 1\n if (left.ratioMilli != null && right.ratioMilli != null && left.ratioMilli !== right.ratioMilli) {\n return left.coversGas ? left.ratioMilli - right.ratioMilli : right.ratioMilli - left.ratioMilli\n }\n if (left.ratioMilli == null && right.ratioMilli != null) return 1\n if (left.ratioMilli != null && right.ratioMilli == null) return -1\n if (left.feePerUnitGas !== right.feePerUnitGas) return left.feePerUnitGas < right.feePerUnitGas ? -1 : 1\n return right.reliability - left.reliability\n })\n}\n\nexport function defaultBroadcasterChoice<T extends BroadcasterChoiceFields>(rows: readonly T[]): T | undefined {\n return rows.find((row) => row.coversGas) ?? rows[0]\n}\n\n/** The next broadcaster whose fee still covers gas, skipping any that already refused. */\nexport function nextCoveringBroadcaster<T extends BroadcasterChoiceFields>(\n rows: readonly T[],\n refused: ReadonlySet<string>,\n): T | undefined {\n return rows.find((row) => row.coversGas && !refused.has(row.feesId))\n}\n\nexport function isBroadcasterGasRefusal(message: string): boolean {\n return /gas cost is too high/i.test(message)\n}\n","import { createPublicClient, getAddress, parseAbi } from 'viem'\nimport {\n ChainType,\n NETWORK_CONFIG,\n TXIDVersion,\n calculateGasPrice,\n type Chain,\n type NetworkName,\n type RailgunERC20AmountRecipient,\n type SelectedBroadcaster,\n} from '@railgun-community/shared-models'\nimport { coingeckoPlatformForChainId } from '../../../chains/evm/coingecko.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport {\n coversGasCost,\n defaultBroadcasterChoice,\n feeRatioMilli,\n formatFeeRatioMilli,\n isBroadcasterGasRefusal,\n nextCoveringBroadcaster,\n orderBroadcasterChoices,\n type BroadcasterChoiceFields,\n} from './broadcaster-choice.js'\nimport { ensureRailgunProvider } from './engine.js'\nimport {\n RAILGUN_TRANSFER_GAS_ESTIMATE,\n RAILGUN_UNSHIELD_GAS_ESTIMATE,\n broadcasterTokenFee,\n chainDetailWithLiveGas,\n railgunBroadcasterGasDetails,\n} 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 onBroadcasterSearch?: () => void\n onBroadcasterNote?: (note: string) => void\n onProofProgress?: (progress: number) => void\n onProofStatusRefresh?: () => void\n broadcasterFeesId?: string\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\n/** Railgun replaces the note-check text with a short sentence. Keep the required amount and balance when they are still attached. */\nexport function railgunDetailedError(err: unknown): string {\n const seen = new Set<unknown>()\n let current: unknown = err\n let fallback = 'Railgun spend proof failed.'\n while (current != null && !seen.has(current)) {\n seen.add(current)\n if (!(current instanceof Error)) break\n const message = current.message.trim()\n if (message && /amount required|balance:/i.test(message)) return message\n if (message) fallback = message\n current = current.cause\n }\n return fallback\n}\n\n/** The broadcaster accepted the proof request and asked for a fresh proof-of-innocence status. */\nexport function broadcasterAskedToRefreshProofStatus(err: unknown): boolean {\n const message = railgunDetailedError(err)\n return (\n message.includes(BROADCASTER_POI_INCOMPLETE) ||\n /could not validate proof of innocence/i.test(message) ||\n /failed to validate poi merkleroots/i.test(message) ||\n /invalid poi merkleroots/i.test(message)\n )\n}\n\nexport function broadcasterRefusedForGas(err: unknown): boolean {\n return isBroadcasterGasRefusal(railgunDetailedError(err))\n}\n\ntype SpendingWallet = {\n refreshPOIsForTXIDVersion: (chain: Chain, txidVersion: TXIDVersion, forceRefresh?: boolean) => Promise<void>\n getBalanceERC20: (\n txidVersion: TXIDVersion,\n chain: Chain,\n tokenAddress: string,\n balanceBucketFilter: string[],\n ) => Promise<bigint | undefined>\n}\n\nfunction chainForNetwork(networkName: NetworkName): Chain {\n return NETWORK_CONFIG[networkName].chain\n}\n\n/** Finish the received, spent, and generated proof-of-innocence pass before a proof. */\nasync function refreshSpendingProofStatus(networkName: NetworkName, walletId: string): Promise<void> {\n const wallet = (await import('@railgun-community/wallet')) as unknown as {\n walletForID: (id: string) => SpendingWallet\n resumePPOIBatching: (chain: Chain) => void\n }\n const chain = chainForNetwork(networkName)\n wallet.resumePPOIBatching(chain)\n await wallet.walletForID(walletId).refreshPOIsForTXIDVersion(chain, TXIDVersion.V2_PoseidonMerkle, true)\n}\n\nasync function assertTokenSpendable(\n networkName: NetworkName,\n walletId: string,\n tokenAddress: string,\n amount: bigint,\n): Promise<void> {\n const wallet = (await import('@railgun-community/wallet')) as unknown as {\n walletForID: (id: string) => SpendingWallet\n }\n const balance = await wallet.walletForID(walletId).getBalanceERC20(\n TXIDVersion.V2_PoseidonMerkle,\n chainForNetwork(networkName),\n tokenAddress,\n ['Spendable'],\n )\n if ((balance ?? 0n) < amount) {\n throw new Error(\n 'These notes are still waiting for proof-of-innocence. The private transfer can start once that status is spendable.',\n )\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\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\nconst BROADCASTER_CACHE_MS = 60_000\n/** Fee quotes stay short so the dialog's 40s request still gets an answer. */\nconst BROADCASTER_QUOTE_WAIT_MS = 20_000\n/** A fee message can take about a minute to arrive after the spending-wallet sync. */\nexport const BROADCASTER_PROOF_WAIT_MS = 3 * 60 * 1000\n/** Same margin the Waku client uses before it treats a fee as expired. */\nexport const BROADCASTER_FEE_MIN_REMAINING_MS = 40_000\nconst BROADCASTER_PROOF_ATTEMPTS = 3\n/** The aggregator often answers the broadcaster a little after the proof is submitted. */\nconst POI_STATUS_RETRY_MS = 20_000\nconst POI_ROOT_WAIT_MS = 3 * 60 * 1000\nconst BROADCASTER_POI_INCOMPLETE = 'Proof-of-innocence validation did not complete'\nexport function broadcasterFeeStillValid(expiration: number, now = Date.now()): boolean {\n return Number.isFinite(expiration) && expiration >= now + BROADCASTER_FEE_MIN_REMAINING_MS\n}\n\nconst BROADCASTER_LIST_CACHE_MS = 15_000\nconst MAX_GAS_BROADCASTERS = 3\nconst NATIVE_COINGECKO_ID: Record<number, string> = {\n 1: 'ethereum',\n 10: 'ethereum',\n 56: 'binancecoin',\n 100: 'xdai',\n 137: 'polygon-ecosystem-token',\n 250: 'fantom',\n 324: 'ethereum',\n 1101: 'ethereum',\n 5000: 'mantle',\n 8453: 'ethereum',\n 34443: 'ethereum',\n 42161: 'ethereum',\n 43114: 'avalanche-2',\n 59144: 'ethereum',\n 81457: 'ethereum',\n 534352: 'ethereum',\n 167000: 'ethereum',\n}\n\nexport type RailgunBroadcasterChoice = {\n feesId: string\n railgunAddress: string\n feeWei: string\n ratio: string | null\n coversGas: boolean\n reliability: number\n expiration: number\n tokenDecimals: number\n}\n\ntype ListedBroadcaster = RailgunBroadcasterChoice & BroadcasterChoiceFields & { selected: SelectedBroadcaster }\n\nconst broadcasterListCache = new Map<string, { at: number; rows: ListedBroadcaster[] }>()\nconst tokenDecimalsCache = new Map<string, number>()\nconst tokenUsdCache = new Map<string, { at: number; tokenUsd: number | null; nativeUsd: number | null }>()\n\nasync function ensureBroadcasterWaku(chain: Chain): Promise<void> {\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}\n\nasync function findTokenBroadcasters(chain: Chain, tokenAddress: string): Promise<SelectedBroadcaster[]> {\n const node = await nodeRequire()\n if (!node) throw new Error('Railgun broadcasters are listed from the node.')\n const entry = node.require.resolve('@railgun-community/waku-broadcaster-client-web')\n const loaded = node.require(node.path.join(node.path.dirname(entry), 'search/best-broadcaster.js')) as {\n BroadcasterSearch: {\n findBroadcastersForToken: (chain: Chain, tokenAddress: string, useRelayAdapt: boolean) => SelectedBroadcaster[] | undefined\n }\n }\n return loaded.BroadcasterSearch.findBroadcastersForToken(chain, tokenAddress, false) ?? []\n}\n\nasync function erc20Decimals(rpcUrl: string, tokenAddress: string): Promise<number> {\n const key = tokenAddress.toLowerCase()\n const cached = tokenDecimalsCache.get(key)\n if (cached != null) return cached\n const client = createPublicClient({ transport: defiEvmTransport(rpcUrl) })\n const decimals = await client.readContract({\n address: getAddress(tokenAddress),\n abi: parseAbi(['function decimals() view returns (uint8)']),\n functionName: 'decimals',\n })\n const value = Number(decimals)\n if (!Number.isInteger(value) || value < 0 || value > 36) throw new Error('Token decimals are not available.')\n tokenDecimalsCache.set(key, value)\n return value\n}\n\nasync function readUsd(url: string): Promise<number | null> {\n try {\n const response = await fetch(url, { signal: AbortSignal.timeout(8_000) })\n if (!response.ok) return null\n const body = (await response.json()) as Record<string, { usd?: number }>\n for (const row of Object.values(body)) {\n if (typeof row?.usd === 'number' && row.usd > 0) return row.usd\n }\n } catch {\n return null\n }\n return null\n}\n\nasync function broadcasterUsdPrices(chainId: number, tokenAddress: string, wrappedAddress: string): Promise<{ tokenUsd: number | null; nativeUsd: number | null }> {\n const key = `${chainId}:${tokenAddress.toLowerCase()}`\n const cached = tokenUsdCache.get(key)\n if (cached && Date.now() - cached.at < 60_000) return cached\n const nativeId = NATIVE_COINGECKO_ID[chainId]\n const nativeUsd = nativeId\n ? await readUsd(`https://api.coingecko.com/api/v3/simple/price?ids=${encodeURIComponent(nativeId)}&vs_currencies=usd`)\n : null\n const wrapped = wrappedAddress.toLowerCase() === tokenAddress.toLowerCase()\n let tokenUsd = wrapped ? nativeUsd : null\n if (!wrapped) {\n const platform = coingeckoPlatformForChainId(chainId)\n tokenUsd = platform\n ? await readUsd(\n `https://api.coingecko.com/api/v3/simple/token_price/${encodeURIComponent(platform)}?contract_addresses=${encodeURIComponent(tokenAddress)}&vs_currencies=usd`,\n )\n : null\n }\n const prices = { tokenUsd, nativeUsd }\n tokenUsdCache.set(key, { at: Date.now(), ...prices })\n return prices\n}\n\nasync function loadRailgunBroadcasters(args: {\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n kind: 'transfer' | 'unshield'\n waitMs?: number\n}): Promise<ListedBroadcaster[]> {\n const tokenAddress = getAddress(args.tokenAddress)\n const cacheKey = `${args.kind}:${args.chainId}:${tokenAddress.toLowerCase()}`\n const cached = broadcasterListCache.get(cacheKey)\n if (cached && Date.now() - cached.at < BROADCASTER_LIST_CACHE_MS) return cached.rows\n const chain = chainFor(args.chainId)\n await ensureBroadcasterWaku(chain)\n const deadline = Date.now() + (args.waitMs ?? BROADCASTER_QUOTE_WAIT_MS)\n let found: SelectedBroadcaster[] = []\n while (Date.now() < deadline) {\n found = (await findTokenBroadcasters(chain, tokenAddress)).filter((row) => broadcasterFeeStillValid(row.tokenFee.expiration))\n if (found.length > 0) break\n await delay(1000)\n }\n if (found.length === 0) throw new Error('No Railgun broadcaster is available for this token.')\n const network = await railgunNetworkByChainId(args.chainId)\n const [decimals, prices, priced] = await Promise.all([\n erc20Decimals(args.rpcUrl, tokenAddress),\n broadcasterUsdPrices(args.chainId, tokenAddress, network?.wrappedAddress ?? ''),\n chainDetailWithLiveGas(args.rpcUrl, args.chainDetail),\n ])\n const networkName = (network?.networkName ?? '') as NetworkName\n const gasEstimate = args.kind === 'unshield' ? RAILGUN_UNSHIELD_GAS_ESTIMATE : RAILGUN_TRANSFER_GAS_ESTIMATE\n const gasDetails = railgunBroadcasterGasDetails(networkName, priced, gasEstimate)\n const byFeesId = new Map<string, ListedBroadcaster>()\n for (const selected of found) {\n const feesId = selected.tokenFee.feesID\n if (!feesId) continue\n const feePerUnitGas = BigInt(selected.tokenFee.feePerUnitGas)\n const ratioMilli =\n prices.tokenUsd != null && prices.nativeUsd != null\n ? feeRatioMilli(feePerUnitGas, decimals, prices.tokenUsd, prices.nativeUsd)\n : null\n const row: ListedBroadcaster = {\n feesId,\n railgunAddress: selected.railgunAddress,\n feeWei: broadcasterTokenFee(feePerUnitGas, gasDetails).toString(),\n ratio: ratioMilli == null ? null : formatFeeRatioMilli(ratioMilli),\n coversGas: coversGasCost(ratioMilli),\n reliability: Number(selected.tokenFee.reliability) || 0,\n expiration: selected.tokenFee.expiration,\n tokenDecimals: decimals,\n feePerUnitGas,\n ratioMilli,\n selected,\n }\n const previous = byFeesId.get(feesId)\n if (!previous || row.reliability > previous.reliability) byFeesId.set(feesId, row)\n }\n const rows = orderBroadcasterChoices([...byFeesId.values()])\n broadcasterListCache.set(cacheKey, { at: Date.now(), rows })\n return rows\n}\n\nexport async function listRailgunBroadcasters(args: {\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n kind: string\n}): Promise<RailgunBroadcasterChoice[]> {\n const kind = args.kind.trim()\n if (kind !== 'transfer' && kind !== 'unshield') throw new Error('kind must be transfer or unshield.')\n const rows = await loadRailgunBroadcasters({ ...args, kind })\n return rows.map((row) => ({\n feesId: row.feesId,\n railgunAddress: row.railgunAddress,\n feeWei: row.feeWei,\n ratio: row.ratio,\n coversGas: row.coversGas,\n reliability: row.reliability,\n expiration: row.expiration,\n tokenDecimals: row.tokenDecimals,\n }))\n}\n\nfunction broadcasterNote(row: ListedBroadcaster, switching: boolean): string {\n const ratioLabel = row.ratio ? `${row.ratio}:1` : 'the selected fee'\n return switching ? `Trying the next broadcaster at ${ratioLabel}` : `Broadcaster ${ratioLabel}`\n}\n\ntype ProvedPrivateAction = {\n populated: {\n transaction: { to?: string; data?: string }\n nullifiers?: string[]\n preTransactionPOIsPerTxidLeafPerList: Record<string, Record<string, unknown>>\n }\n overallBatchMinGasPrice: bigint\n}\n\nfunction poiListsPresent(pois: Record<string, Record<string, unknown>>): boolean {\n return Object.values(pois).some((leaves) => Object.keys(leaves).length > 0)\n}\n\nfunction poiRoots(poi: unknown): string[] {\n if (!poi || typeof poi !== 'object' || !('poiMerkleroots' in poi)) return []\n const roots = (poi as { poiMerkleroots?: unknown }).poiMerkleroots\n return Array.isArray(roots) ? roots.filter((root): root is string => typeof root === 'string') : []\n}\n\ntype PoiRootValidator = {\n validatePOIMerkleroots: (\n txidVersion: TXIDVersion,\n chain: Chain,\n listKey: string,\n poiMerkleroots: string[],\n ) => Promise<boolean>\n}\n\n/**\n * Node-only. A bundled import of the engine rewrites `require(\"events\")` and then\n * the proof-of-innocence class is missing. Resolve the copy the wallet already started.\n */\nasync function nodeRequire(): Promise<{ require: NodeRequire; path: typeof import('node:path') } | null> {\n if (typeof window !== 'undefined') return null\n if (typeof process === 'undefined' || !process.versions?.node) return null\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const nodeModule = (await load('node:' + 'module')) as unknown as typeof import('node:module')\n const nodePath = (await load('node:' + 'path')) as unknown as typeof import('node:path')\n return { require: nodeModule.createRequire(import.meta.url), path: nodePath }\n}\n\nasync function poiRootValidator(): Promise<PoiRootValidator> {\n const node = await nodeRequire()\n if (!node) throw new Error('Proof-of-innocence checks need the node Railgun engine.')\n const walletEntry = node.require.resolve('@railgun-community/wallet')\n const engineEntry = node.require.resolve('@railgun-community/' + 'engine', {\n paths: [node.path.dirname(walletEntry)],\n })\n const loaded = node.require(engineEntry) as { POI?: PoiRootValidator }\n if (!loaded.POI) throw new Error('The Railgun engine did not load its proof-of-innocence checker.')\n return loaded.POI\n}\n\n/** The same merkleroot check the broadcaster runs, asked of the public aggregator first. */\nasync function poiMerklerootsConfirmed(\n chain: Chain,\n pois: Record<string, Record<string, unknown>>,\n): Promise<boolean> {\n const poi = await poiRootValidator()\n for (const [listKey, leaves] of Object.entries(pois)) {\n for (const entry of Object.values(leaves)) {\n const roots = poiRoots(entry)\n if (roots.length === 0) return false\n const confirmed = await poi.validatePOIMerkleroots(TXIDVersion.V2_PoseidonMerkle, chain, listKey, roots)\n if (!confirmed) return false\n }\n }\n return true\n}\n\nasync function waitForConfirmedPoiRoots(\n chain: Chain,\n proved: ProvedPrivateAction,\n onProofStatusRefresh?: () => void,\n): Promise<void> {\n const pois = proved.populated.preTransactionPOIsPerTxidLeafPerList\n if (!poiListsPresent(pois)) {\n throw new Error('The proof did not include a proof of innocence.')\n }\n const deadline = Date.now() + POI_ROOT_WAIT_MS\n while (Date.now() < deadline) {\n try {\n if (await poiMerklerootsConfirmed(chain, pois)) return\n } catch (err) {\n if (!broadcasterAskedToRefreshProofStatus(err)) throw err\n }\n onProofStatusRefresh?.()\n await delay(POI_STATUS_RETRY_MS)\n }\n throw new Error('The proof-of-innocence list has not confirmed these notes. Wait a few minutes and try the private transfer again.')\n}\n\n/**\n * The fee is an input to the proof. Read it after the spending wallet is ready, then\n * submit only while that fee id is still valid. A long proof can outlive the id.\n * A broadcaster that refuses because gas is too high is skipped, and the next fee\n * that still covers gas is proved. A proof-of-innocence refresh reuses the same proof.\n */\nasync function submitFreshProof(args: {\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n kind: 'transfer' | 'unshield'\n chain: Chain\n tokenAddress: string\n broadcasterFeesId?: string\n onBroadcasterSearch?: () => void\n onBroadcasterNote?: (note: string) => void\n onProofStatusRefresh?: () => void\n refreshProofStatus?: () => Promise<void>\n assertSpendable?: () => Promise<void>\n build: (broadcaster: SelectedBroadcaster) => Promise<ProvedPrivateAction>\n}): Promise<{ txHash: string }> {\n if (args.refreshProofStatus) {\n args.onProofStatusRefresh?.()\n await args.refreshProofStatus().catch(() => undefined)\n }\n await args.assertSpendable?.()\n const refused = new Set<string>()\n let feesId = args.broadcasterFeesId?.trim() ?? ''\n let lastError: unknown = new Error('No Railgun broadcaster is available for this token.')\n let builds = 0\n while (builds < MAX_GAS_BROADCASTERS) {\n args.onBroadcasterSearch?.()\n const rows = await loadRailgunBroadcasters({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress: args.tokenAddress,\n kind: args.kind,\n waitMs: BROADCASTER_PROOF_WAIT_MS,\n })\n const requested = feesId && !refused.has(feesId) ? rows.find((row) => row.feesId === feesId) : undefined\n if (builds === 0 && args.broadcasterFeesId?.trim() && !requested) {\n throw new Error('That broadcaster fee expired. Refresh the list and choose again.')\n }\n const row =\n requested ?? nextCoveringBroadcaster(rows, refused) ?? (refused.size === 0 ? defaultBroadcasterChoice(rows) : undefined)\n if (!row || !broadcasterFeeStillValid(row.expiration)) {\n if (!row) break\n refused.add(row.feesId)\n feesId = ''\n if (refused.size >= rows.length) break\n continue\n }\n builds += 1\n feesId = row.feesId\n args.onBroadcasterNote?.(broadcasterNote(row, refused.size > 0))\n const broadcaster = row.selected\n const proved = await args.build(broadcaster)\n if (!broadcasterFeeStillValid(broadcaster.tokenFee.expiration)) {\n broadcasterListCache.clear()\n refused.add(feesId)\n feesId = ''\n continue\n }\n await waitForConfirmedPoiRoots(args.chain, proved, args.onProofStatusRefresh)\n let switchBroadcaster = false\n for (let poiTry = 1; poiTry <= BROADCASTER_PROOF_ATTEMPTS && !switchBroadcaster; poiTry += 1) {\n try {\n return {\n txHash: await submitProved({\n chain: args.chain,\n populated: proved.populated,\n broadcaster,\n overallBatchMinGasPrice: proved.overallBatchMinGasPrice,\n }),\n }\n } catch (err) {\n lastError = err\n if (broadcasterRefusedForGas(err)) {\n refused.add(feesId)\n feesId = ''\n switchBroadcaster = true\n break\n }\n if (poiTry === BROADCASTER_PROOF_ATTEMPTS || !broadcasterAskedToRefreshProofStatus(err)) throw err\n args.onProofStatusRefresh?.()\n await delay(POI_STATUS_RETRY_MS)\n await args.refreshProofStatus?.().catch(() => undefined)\n if (!broadcasterFeeStillValid(broadcaster.tokenFee.expiration)) {\n broadcasterListCache.clear()\n refused.add(feesId)\n feesId = ''\n switchBroadcaster = true\n break\n }\n await waitForConfirmedPoiRoots(args.chain, proved, args.onProofStatusRefresh)\n }\n }\n }\n if (lastError instanceof Error) throw lastError\n throw new Error('The broadcaster fee expired while the proof was building. Try the private transfer again.')\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 detail = await broadcasterDetailConfig()\n const previousDetail = detail?.IS_DEV\n if (detail) detail.IS_DEV = true\n try {\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 } finally {\n if (detail && previousDetail !== undefined) detail.IS_DEV = previousDetail\n }\n}\n\n/** Ask the broadcaster for the underlying proof-of-innocence error instead of its summary. */\nasync function broadcasterDetailConfig(): Promise<{ IS_DEV: boolean } | null> {\n const node = await nodeRequire()\n if (!node) return null\n const entry = node.require.resolve('@railgun-community/waku-broadcaster-client-web')\n const loaded = node.require(node.path.join(node.path.dirname(entry), 'models/broadcaster-config.js')) as {\n BroadcasterConfig: { IS_DEV: boolean }\n }\n return loaded.BroadcasterConfig\n}\n\nfunction feeRecipient(\n wallet: WalletTx,\n broadcaster: SelectedBroadcaster,\n gasDetails: ReturnType<typeof railgunBroadcasterGasDetails>,\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\nconst broadcasterFeeCache = new Map<string, { at: number; feeWei: string; tokenAddress: string }>()\n\nexport async function quoteRailgunBroadcasterFee(args: {\n kind: 'transfer' | 'unshield'\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n amountWei: string\n recipientAddress: string\n memoText?: string\n walletId: string\n encryptionKey: string\n}): Promise<{ feeWei: string; tokenAddress: string }> {\n const tokenAddress = getAddress(args.tokenAddress)\n const cacheKey = `${args.kind}:${args.chainId}:${tokenAddress.toLowerCase()}`\n const cached = broadcasterFeeCache.get(cacheKey)\n if (cached && Date.now() - cached.at < BROADCASTER_CACHE_MS) {\n return { feeWei: cached.feeWei, tokenAddress: cached.tokenAddress }\n }\n const amount = parsedAmount(args.amountWei)\n const networkName = await ensureRailgunProvider(args.chainId, args.rpcUrl)\n const wallet = (await import('@railgun-community/wallet')) as unknown as WalletTx\n const priced = await chainDetailWithLiveGas(args.rpcUrl, args.chainDetail)\n const listed = await loadRailgunBroadcasters({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress,\n kind: args.kind,\n })\n const chosen = defaultBroadcasterChoice(listed)\n if (!chosen) throw new Error('No Railgun broadcaster is available for this token.')\n const broadcaster = chosen.selected\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunBroadcasterGasDetails(networkName, priced, 0n)\n const recipientAddress =\n args.kind === 'unshield'\n ? getAddress(args.recipientAddress || '0x0000000000000000000000000000000000000001')\n : args.recipientAddress.trim()\n if (args.kind === 'transfer' && !recipientAddress.startsWith('0zk')) {\n throw new Error('A 0zk address is required to estimate the private-transfer fee.')\n }\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n const estimated =\n args.kind === 'unshield'\n ? await wallet.gasEstimateForUnprovenUnshield(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n args.walletId,\n args.encryptionKey,\n recipients,\n [],\n original,\n feeToken,\n false,\n )\n : await wallet.gasEstimateForUnprovenTransfer(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n args.walletId,\n args.encryptionKey,\n args.memoText ?? null,\n recipients,\n [],\n original,\n feeToken,\n false,\n )\n const fee = feeRecipient(wallet, broadcaster, railgunBroadcasterGasDetails(networkName, priced, estimated.gasEstimate))\n const quoted = { feeWei: fee.amount.toString(), tokenAddress: getAddress(fee.tokenAddress) }\n broadcasterFeeCache.set(cacheKey, { at: Date.now(), ...quoted })\n return quoted\n}\n\n/** Broadcaster fee from the live fee rate and chain gas. A view-only wallet cannot run the proof estimate. */\nexport async function quoteRailgunBroadcasterFeeRate(args: {\n kind: 'transfer' | 'unshield'\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n}): Promise<{ feeWei: string; tokenAddress: string }> {\n const tokenAddress = getAddress(args.tokenAddress)\n const network = await railgunNetworkByChainId(args.chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const listed = await loadRailgunBroadcasters({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress,\n kind: args.kind,\n })\n const chosen = defaultBroadcasterChoice(listed)\n if (!chosen) throw new Error('No Railgun broadcaster is available for this token.')\n return { feeWei: chosen.feeWei, tokenAddress }\n}\n\nexport async function railgunPrivateTransfer(args: RailgunPrivateActionArgs): Promise<{ txHash: string }> {\n try {\n return await provePrivateTransfer(args)\n } catch (err) {\n throw new Error(railgunDetailedError(err))\n }\n}\n\nasync function provePrivateTransfer(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 priced = await chainDetailWithLiveGas(rpcUrl, args.chainDetail)\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n return submitFreshProof({\n chainId: args.chainId,\n rpcUrl,\n chainDetail: args.chainDetail,\n kind: 'transfer',\n chain,\n tokenAddress,\n broadcasterFeesId: args.broadcasterFeesId,\n onBroadcasterSearch: args.onBroadcasterSearch,\n onBroadcasterNote: args.onBroadcasterNote,\n onProofStatusRefresh: args.onProofStatusRefresh,\n refreshProofStatus: () => refreshSpendingProofStatus(networkName, session.walletId),\n assertSpendable: () => assertTokenSpendable(networkName, session.walletId, tokenAddress, amount),\n build: async (broadcaster) => {\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunBroadcasterGasDetails(networkName, priced, 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 = railgunBroadcasterGasDetails(networkName, priced, 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 { populated, overallBatchMinGasPrice }\n },\n })\n}\n\nexport async function railgunUnshield(args: RailgunPrivateActionArgs): Promise<{ txHash: string }> {\n try {\n return await proveUnshield(args)\n } catch (err) {\n throw new Error(railgunDetailedError(err))\n }\n}\n\nasync function proveUnshield(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 priced = await chainDetailWithLiveGas(rpcUrl, args.chainDetail)\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n return submitFreshProof({\n chainId: args.chainId,\n rpcUrl,\n chainDetail: args.chainDetail,\n kind: 'unshield',\n chain,\n tokenAddress,\n broadcasterFeesId: args.broadcasterFeesId,\n onBroadcasterSearch: args.onBroadcasterSearch,\n onBroadcasterNote: args.onBroadcasterNote,\n onProofStatusRefresh: args.onProofStatusRefresh,\n refreshProofStatus: () => refreshSpendingProofStatus(networkName, session.walletId),\n assertSpendable: () => assertTokenSpendable(networkName, session.walletId, tokenAddress, amount),\n build: async (broadcaster) => {\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunBroadcasterGasDetails(networkName, priced, 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 = railgunBroadcasterGasDetails(networkName, priced, 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 { populated, overallBatchMinGasPrice }\n },\n })\n}\n","import { createPublicClient, getAddress, parseAbi } from 'viem'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { railgunNetworkByChainId } from './networks.js'\nimport { quoteRailgunBroadcasterFeeRate } from './private-actions.js'\n\nconst feeAbi = parseAbi([\n 'function shieldFee() view returns (uint256)',\n 'function unshieldFee() view returns (uint256)',\n])\n\nconst BASIS_POINTS = 10_000n\nconst FEE_CACHE_MS = 60_000\n\nexport type RailgunFeeKind = 'shield' | 'transfer' | 'unshield'\n\nexport type RailgunFeeQuote = {\n kind: RailgunFeeKind\n amountWei: string\n protocolFeeBasisPoints: string\n protocolFeeWei: string\n receivedWei: string\n broadcasterFeeWei: string\n broadcasterTokenAddress: string\n totalDebitWei: string\n broadcasterError?: string\n}\n\ntype BasisPoints = { shield: bigint; unshield: bigint; at: number }\n\nconst basisCache = new Map<number, BasisPoints>()\n\nexport function railgunProtocolFee(amount: bigint, basisPoints: bigint): { fee: bigint; received: bigint } {\n const value = amount > 0n ? amount : 0n\n const bps = basisPoints > 0n ? basisPoints : 0n\n const fee = (value * bps) / BASIS_POINTS\n return { fee, received: value - fee }\n}\n\nasync function protocolBasisPoints(chainId: number, rpcUrl: string): Promise<BasisPoints> {\n const cached = basisCache.get(chainId)\n if (cached && Date.now() - cached.at < FEE_CACHE_MS) return cached\n const network = await railgunNetworkByChainId(chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const client = createPublicClient({ transport: defiEvmTransport(rpcUrl) })\n const address = getAddress(network.proxyContract)\n const [shield, unshield] = await Promise.all([\n client.readContract({ address, abi: feeAbi, functionName: 'shieldFee' }),\n client.readContract({ address, abi: feeAbi, functionName: 'unshieldFee' }),\n ])\n const next = { shield, unshield, at: Date.now() }\n basisCache.set(chainId, next)\n return next\n}\n\nexport function clearRailgunFeeCache(): void {\n basisCache.clear()\n}\n\nexport async function quoteRailgunFee(args: {\n kind: RailgunFeeKind\n chainId: number\n rpcUrl: string\n chainDetail?: EvmChainDetail\n tokenAddress: string\n amountWei: string\n recipientAddress?: string\n memoText?: string\n walletId?: string\n encryptionKey?: string\n}): Promise<RailgunFeeQuote> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n const amount = (() => {\n try {\n return BigInt(args.amountWei.trim() || '0')\n } catch {\n throw new Error('Amount must be an integer in wei.')\n }\n })()\n if (amount < 0n) throw new Error('Amount must be greater than zero.')\n const rates = await protocolBasisPoints(args.chainId, rpcUrl)\n const basisPoints = args.kind === 'shield' ? rates.shield : args.kind === 'unshield' ? rates.unshield : 0n\n const protocol = railgunProtocolFee(amount, basisPoints)\n let broadcasterFee = 0n\n let broadcasterTokenAddress = ''\n let broadcasterError: string | undefined\n if (args.kind !== 'shield') {\n if (!args.chainDetail) {\n broadcasterError = 'Chain gas details are required to estimate the broadcaster fee.'\n } else {\n try {\n const quoted = await quoteRailgunBroadcasterFeeRate({\n kind: args.kind,\n chainId: args.chainId,\n rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress: args.tokenAddress,\n })\n broadcasterFee = BigInt(quoted.feeWei)\n broadcasterTokenAddress = quoted.tokenAddress\n } catch (err) {\n broadcasterError = err instanceof Error ? err.message : 'Broadcaster fee is not available.'\n }\n }\n }\n const totalDebit = args.kind === 'shield' ? amount : amount + broadcasterFee\n const quote: RailgunFeeQuote = {\n kind: args.kind,\n amountWei: amount.toString(),\n protocolFeeBasisPoints: basisPoints.toString(),\n protocolFeeWei: protocol.fee.toString(),\n receivedWei: (args.kind === 'transfer' ? amount : protocol.received).toString(),\n broadcasterFeeWei: broadcasterFee.toString(),\n broadcasterTokenAddress,\n totalDebitWei: totalDebit.toString(),\n }\n if (broadcasterError) quote.broadcasterError = broadcasterError\n return quote\n}\n","import { ChainType, RailgunWalletBalanceBucket, TXIDVersion, type RailgunBalancesEvent } from '@railgun-community/shared-models'\nimport { railgunKeyGenWalletPath, resolveRailgunDataRoot } from './data-dir.js'\nimport { ensureRailgunEngine, ensureRailgunProvider } 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\nasync function rememberKeyGenWallet(keyGenId: string, walletId: string, railgunAddress: string): Promise<void> {\n const root = await resolveRailgunDataRoot()\n if (!root) return\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<typeof import('node:fs/promises')>\n const fs = await load('node:fs/promises')\n const file = railgunKeyGenWalletPath(root, keyGenId)\n await fs.mkdir(file.slice(0, file.lastIndexOf('/')), { recursive: true })\n await fs.writeFile(file, `${JSON.stringify({ walletId, railgunAddress })}\\n`, { mode: 0o600 })\n}\n\nexport async function openRailgunViewOnlyWallet(args: {\n encryptionKey: string\n shareableViewingKey: string\n chainId: number\n keyGenId?: string\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 if (args.keyGenId) await rememberKeyGenWallet(args.keyGenId, created.id, created.railgunAddress)\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<string, Map<string, BalanceCell>>()\n\nfunction bucketKey(walletId: string, chainId: number): string {\n return `${walletId}:${chainId}`\n}\n\nfunction rowMap(walletId: string, chainId: number) {\n const key = bucketKey(walletId, chainId)\n let rows = buckets.get(key)\n if (!rows) {\n rows = new Map()\n buckets.set(key, 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\nexport function recordRailgunWalletBalance(event: RailgunBalancesEvent): void {\n applyBalanceEvent(event)\n}\n\nexport function railgunWalletBalanceSnapshot(walletId: string, chainId: number): RailgunPrivateBalanceRow[] {\n return snapshotRows(walletId, chainId)\n}\n\nexport function clearRailgunWalletBalances(): void {\n buckets.clear()\n}\n\nfunction applyBalanceEvent(event: RailgunBalancesEvent) {\n if (!event.railgunWalletID || event.txidVersion !== TXIDVersion.V2_PoseidonMerkle) return\n const rows = rowMap(event.railgunWalletID, 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(walletId: string, chainId: number): RailgunPrivateBalanceRow[] {\n const rows = buckets.get(bucketKey(walletId, 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\nconst RAILGUN_RESCAN_QUIET_MS = 4000\n\n/** After the note scan reports 100%, wait this long for the spendable-note check, then save the balances already decrypted. */\nexport const RAILGUN_TXID_WAIT_AFTER_NOTES_MS = 45_000\n\n/** After the history walk, sync blocks that were mined while it was running. A shield in that gap is otherwise left out. */\nexport const RAILGUN_CATCH_UP_MS = 120_000\n\n/** The first merkletree walk can take much longer than the catch-up window. Give up only when progress itself stops. */\nexport const RAILGUN_MERKLETREE_STALL_MS = 5 * 60 * 1000\n\nexport const RAILGUN_SCAN_BEHIND_NOTE =\n 'The shielded balance is saved. The newest blocks did not finish syncing, so a shield that just landed may be missing until the next scan.'\n\nexport const RAILGUN_SCAN_STOPPED_NOTE =\n 'The note scan stopped before it reached the latest block. The shielded balance is unchanged until a scan finishes.'\n\n/** A catch-up timer that expires while leaves are still arriving has not finished the tree. */\nexport function merkletreeScanStillRunning(args: {\n sawProgress: boolean\n notesFinished: boolean\n terminal: 'done' | 'failed' | 'pending'\n}): boolean {\n return args.sawProgress && !args.notesFinished && args.terminal === 'pending'\n}\n\nexport function railgunScanRecord(\n merkletree: 'done' | 'failed',\n balanceCount: number,\n caughtUp: boolean,\n): { scanStatus: RailgunScanStatus; notes: string } {\n if (merkletree !== 'done') {\n return { scanStatus: 'error', notes: RAILGUN_SCAN_STOPPED_NOTE }\n }\n if (!caughtUp) {\n return {\n scanStatus: balanceCount === 0 ? 'empty' : 'ready',\n notes: RAILGUN_SCAN_BEHIND_NOTE,\n }\n }\n return {\n scanStatus: balanceCount === 0 ? 'empty' : 'ready',\n notes: balanceCount === 0 ? 'No private balance on this chain yet.' : '',\n }\n}\n\nexport function balancesToKeepAfterNoteScan(\n decrypted: RailgunPrivateBalanceRow[],\n afterRefresh: RailgunPrivateBalanceRow[],\n previous: RailgunPrivateBalanceRow[],\n): RailgunPrivateBalanceRow[] {\n if (afterRefresh.length > 0) return afterRefresh\n if (decrypted.length > 0) return decrypted\n return previous\n}\n\ntype UtxoScanListener = (event: { chain: { id: number }; scanStatus: string; progress: number }) => void\n\nconst utxoListeners = new Set<UtxoScanListener>()\nlet utxoHooked = false\nconst balanceListeners = new Set<(event: RailgunBalancesEvent) => void>()\nlet balanceHooked = false\nconst scansInFlight = new Map<\n string,\n Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string }>\n>()\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function hookUtxoScans(wallet: WalletModule): Promise<void> {\n if (utxoHooked) return\n utxoHooked = true\n wallet.setOnUTXOMerkletreeScanCallback((event) => {\n for (const listener of utxoListeners) listener(event)\n })\n}\n\nasync function hookBalanceUpdates(wallet: WalletModule): Promise<void> {\n if (balanceHooked) return\n balanceHooked = true\n wallet.setOnBalanceUpdateCallback((event) => {\n for (const listener of balanceListeners) listener(event)\n })\n}\n\nfunction publishScan(\n chainId: number,\n scanStatus: RailgunScanStatus,\n balances: RailgunPrivateBalanceRow[],\n settled: boolean,\n notes?: string,\n): { scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string } {\n const text = notes ?? (balances.length === 0 ? 'No private balance on this chain yet.' : undefined)\n publishRailgunPrivateBalanceSnapshot({\n chainId,\n scanStatus,\n balances,\n updatedAt: new Date().toISOString(),\n notes: text,\n })\n return { scanStatus, balances, settled, notes: text ?? '' }\n}\n\nasync function scanRailgunPrivateBalancesOnce(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n onBalances?: (balances: RailgunPrivateBalanceRow[]) => void\n}): Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string }> {\n const previous = snapshotRows(args.walletId, args.chainId)\n publishRailgunPrivateBalanceSnapshot({\n chainId: args.chainId,\n scanStatus: 'scanning',\n balances: previous,\n updatedAt: new Date().toISOString(),\n })\n const wallet = await walletModule()\n let resolveScan: (status: 'done' | 'failed') => void = () => {}\n let scanSettled = new Promise<'done' | 'failed'>((resolve) => {\n resolveScan = resolve\n })\n const armScanWait = () => {\n scanSettled = new Promise<'done' | 'failed'>((resolve) => {\n resolveScan = resolve\n })\n }\n let sawUtxoEvent = false\n let lastUtxoAt = 0\n let replacedBuckets = false\n let resolveNotesEnd: () => void = () => {}\n const notesEnded = new Promise<void>((resolve) => {\n resolveNotesEnd = resolve\n })\n const publishLiveBalances = () => {\n const rows = snapshotRows(args.walletId, args.chainId)\n if (rows.length > 0) args.onBalances?.(rows)\n }\n let notesFinished = false\n const listener: UtxoScanListener = (event) => {\n if (event.chain.id !== args.chainId) return\n if (!replacedBuckets) {\n buckets.set(bucketKey(args.walletId, args.chainId), new Map())\n replacedBuckets = true\n }\n sawUtxoEvent = true\n lastUtxoAt = Date.now()\n args.onProgress?.(event.progress)\n const terminal = utxoScanTerminalStatus(event.scanStatus)\n if (event.progress >= 1 || terminal === 'done') {\n notesFinished = true\n publishLiveBalances()\n resolveNotesEnd()\n }\n if (terminal !== 'pending') resolveScan(terminal)\n }\n await hookUtxoScans(wallet)\n await hookBalanceUpdates(wallet)\n utxoListeners.add(listener)\n const onBalance = (event: RailgunBalancesEvent) => {\n if (event.railgunWalletID !== args.walletId || event.chain.id !== args.chainId) return\n recordRailgunWalletBalance(event)\n publishLiveBalances()\n }\n balanceListeners.add(onBalance)\n try {\n await ensureRailgunProvider(args.chainId, args.rpcUrl)\n const chain = { type: ChainType.EVM, id: args.chainId }\n // refreshBalances also syncs the TXID tree after the note scan. A second call while that\n // walk is still running does not emit a new UTXO Complete event, so this returns the\n // balances already decrypted instead of waiting for the history walk.\n const refresh = wallet.refreshBalances(chain, [args.walletId]).then(\n () => 'returned' as const,\n () => 'returned' as const,\n )\n const quiet = delay(RAILGUN_RESCAN_QUIET_MS).then(() => 'quiet' as const)\n const notesTimeout = notesEnded.then(() => delay(RAILGUN_TXID_WAIT_AFTER_NOTES_MS)).then(() => 'notes-timeout' as const)\n let status: 'done' | 'failed' | 'returned' | 'quiet' | 'notes-timeout' | 'catch-up-timeout' = await Promise.race([\n scanSettled,\n refresh,\n quiet,\n notesTimeout,\n ])\n if (status === 'quiet') {\n status = await Promise.race([\n scanSettled,\n refresh,\n notesTimeout,\n delay(RAILGUN_CATCH_UP_MS).then(() => 'catch-up-timeout' as const),\n ])\n }\n let historyFinished = status === 'done' || ((status === 'notes-timeout' || status === 'returned') && notesFinished)\n const terminal = status === 'done' || status === 'failed' ? status : 'pending'\n if (\n !historyFinished &&\n merkletreeScanStillRunning({ sawProgress: sawUtxoEvent, notesFinished, terminal })\n ) {\n let walked: 'done' | 'failed' | 'stalled' = 'stalled'\n while (walked === 'stalled') {\n const idle = Date.now() - lastUtxoAt\n const slice = Math.max(250, RAILGUN_MERKLETREE_STALL_MS - idle)\n const step = await Promise.race([scanSettled, delay(slice).then(() => 'tick' as const)])\n if (step === 'done' || step === 'failed') {\n walked = step\n break\n }\n if (Date.now() - lastUtxoAt >= RAILGUN_MERKLETREE_STALL_MS) break\n }\n if (walked !== 'done') {\n const rows = snapshotRows(args.walletId, args.chainId)\n const balances = rows.length > 0 ? rows : previous\n const record = railgunScanRecord('failed', balances.length, false)\n return publishScan(args.chainId, record.scanStatus, balances, false, record.notes)\n }\n notesFinished = true\n historyFinished = true\n }\n if (!historyFinished) {\n armScanWait()\n const retry = wallet.refreshBalances(chain, [args.walletId]).then(\n () => 'returned' as const,\n () => 'returned' as const,\n )\n const retried = await Promise.race([\n scanSettled,\n retry,\n delay(RAILGUN_CATCH_UP_MS).then(() => 'catch-up-timeout' as const),\n ])\n if (retried !== 'done' && !notesFinished) {\n const rows = snapshotRows(args.walletId, args.chainId)\n const balances = rows.length > 0 ? rows : previous\n const record = railgunScanRecord('failed', balances.length, false)\n return publishScan(args.chainId, record.scanStatus, balances, false, record.notes)\n }\n }\n // Complete is the note decrypt. The TXID walk after it can move a shield to spendable.\n // It must not keep the saved balance on the pre-scan amount after the notes are already scanned.\n const decrypted = snapshotRows(args.walletId, args.chainId)\n publishLiveBalances()\n const refreshed = await Promise.race([\n refresh.then(() => true),\n delay(RAILGUN_TXID_WAIT_AFTER_NOTES_MS).then(() => false),\n ])\n if (!refreshed) {\n await Promise.race([refresh.then(() => undefined), delay(RAILGUN_CATCH_UP_MS).then(() => undefined)])\n }\n // The history walk reads the chain height once. A shield mined after that is a short second pass.\n sawUtxoEvent = false\n armScanWait()\n const followUpStarted = Date.now()\n const followUp = wallet.refreshBalances(chain, [args.walletId]).then(\n () => 'returned' as const,\n () => 'returned' as const,\n )\n let followStatus: 'done' | 'failed' | 'returned' | 'quiet' | 'catch-up-timeout' = await Promise.race([\n scanSettled,\n followUp,\n delay(RAILGUN_RESCAN_QUIET_MS).then(() => 'quiet' as const),\n delay(RAILGUN_CATCH_UP_MS).then(() => 'catch-up-timeout' as const),\n ])\n if ((followStatus === 'quiet' || followStatus === 'returned') && sawUtxoEvent) {\n const remaining = Math.max(0, RAILGUN_CATCH_UP_MS - (Date.now() - followUpStarted))\n followStatus = await Promise.race([\n scanSettled,\n delay(remaining).then(() => 'catch-up-timeout' as const),\n ])\n }\n const caughtUp = followStatus === 'done' || (followStatus === 'quiet' && !sawUtxoEvent)\n const balances = balancesToKeepAfterNoteScan(decrypted, snapshotRows(args.walletId, args.chainId), previous)\n const record = railgunScanRecord('done', balances.length, caughtUp)\n return publishScan(args.chainId, record.scanStatus, balances, refreshed && caughtUp, record.notes || undefined)\n } finally {\n utxoListeners.delete(listener)\n balanceListeners.delete(onBalance)\n }\n}\n\nconst SPEND_DECRYPT_WAIT_MS = 3 * 60 * 1000\n\nexport const RAILGUN_SPEND_SCAN_STOPPED =\n 'The spending wallet did not finish scanning private notes.'\n\n/**\n * History complete is emitted at 100% after this wallet's notes are decrypted.\n * The decrypt-complete wallet event is deferred until after that, so 100% is the\n * signal to build the proof. Give up only when leaves stop arriving before then.\n */\nexport function spendingScanReadyAfterHistory(progress: number, scanStatus: string): boolean {\n return progress >= 1 || utxoScanTerminalStatus(scanStatus) === 'done'\n}\n\nexport function spendingNoteScanGaveUp(args: {\n walletReady: boolean\n sawProgress: boolean\n notesFinished: boolean\n msSinceProgress: number\n msWaitingForDecrypt: number | null\n}): boolean {\n if (args.walletReady || args.notesFinished) return false\n if (args.sawProgress) return args.msSinceProgress >= RAILGUN_MERKLETREE_STALL_MS\n if (args.msWaitingForDecrypt == null) return false\n return args.msWaitingForDecrypt >= SPEND_DECRYPT_WAIT_MS\n}\n\n/** Decrypt this spending wallet's notes before a proof. A view-only scan does not fill this wallet. */\nexport async function scanSpendingWalletNotes(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n}): Promise<void> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n await ensureRailgunProvider(args.chainId, rpcUrl)\n const wallet = await walletModule()\n const chain = { type: ChainType.EVM, id: args.chainId }\n await hookUtxoScans(wallet)\n let sawUtxoEvent = false\n let lastUtxoAt = Date.now()\n let notesFinished = false\n let walletReady = false\n const listener: UtxoScanListener = (event) => {\n if (event.chain.id !== args.chainId) return\n sawUtxoEvent = true\n lastUtxoAt = Date.now()\n if (spendingScanReadyAfterHistory(event.progress, event.scanStatus)) {\n notesFinished = true\n walletReady = true\n }\n args.onProgress?.(event.progress)\n }\n utxoListeners.add(listener)\n const listenForDecrypt = () => {\n wallet.awaitWalletScan(args.walletId, chain).then(\n () => {\n walletReady = true\n },\n () => {\n listenForDecrypt()\n },\n )\n }\n listenForDecrypt()\n let refreshSettled = false\n let refreshError: unknown = null\n void wallet.refreshBalances(chain, [args.walletId]).then(\n () => {\n refreshSettled = true\n },\n (err: unknown) => {\n refreshError = err\n refreshSettled = true\n },\n )\n let decryptWaitStarted: number | null = null\n try {\n while (!walletReady) {\n if (refreshError) throw refreshError\n const waitingForDecrypt =\n notesFinished || (!sawUtxoEvent && refreshSettled) ? (decryptWaitStarted ??= Date.now()) : null\n if (waitingForDecrypt == null) decryptWaitStarted = null\n if (\n spendingNoteScanGaveUp({\n walletReady,\n sawProgress: sawUtxoEvent,\n notesFinished,\n msSinceProgress: Date.now() - lastUtxoAt,\n msWaitingForDecrypt: waitingForDecrypt == null ? null : Date.now() - waitingForDecrypt,\n })\n ) {\n throw new Error(RAILGUN_SPEND_SCAN_STOPPED)\n }\n await delay(250)\n }\n } finally {\n utxoListeners.delete(listener)\n }\n}\n\nexport async function scanRailgunPrivateBalances(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n onBalances?: (balances: RailgunPrivateBalanceRow[]) => void\n}): Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string }> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n const key = `${args.chainId}:${args.walletId}`\n const existing = scansInFlight.get(key)\n if (existing) return existing\n const run = scanRailgunPrivateBalancesOnce({ ...args, rpcUrl }).finally(() => {\n if (scansInFlight.get(key) === run) scansInFlight.delete(key)\n })\n scansInFlight.set(key, run)\n return run\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 './fees.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: {\n type: 'string',\n required: false,\n description: 'Recipient 0zk address. Omit when toContactName is set.',\n },\n toContactName: {\n type: 'string',\n required: false,\n description: 'Address-book contact name. Uses that contact’s saved 0zk address, not their Ethereum address.',\n },\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"]}
|
|
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/data-dir.ts","../../../../src/protocols/evm/railgun/engine.ts","../../../../src/protocols/evm/railgun/gas.ts","../../../../src/protocols/evm/railgun/shield.ts","../../../../src/chains/evm/coingecko.ts","../../../../src/protocols/evm/railgun/broadcaster-choice.ts","../../../../src/protocols/evm/railgun/private-actions.ts","../../../../src/protocols/evm/railgun/fees.ts","../../../../src/protocols/evm/railgun/wallet.ts","../../../../src/protocols/evm/railgun/index.ts"],"names":["zeroAddress","getAddress","cached","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","require","EVMGasType","getEVMGasTypeForTransaction","parseAbi","hashMessage","recoverAddress","stringToHex","encodeFunctionData","TXIDVersion","row","ChainType","NETWORK_CONFIG","session","calculateGasPrice","walletModule","RailgunWalletBalanceBucket","delay","balances","record"],"mappings":"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","file":"index.cjs","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","/** Host folder beside user_folder, bind-mounted at this path in continuum-mcp. */\nexport const RAILGUN_CONTAINER_DATA_DIR = '/app/railgun_data'\n\n/**\n * Note tree directory. The MCP server defaults to the mounted folder.\n * Tests and the dashboard leave the variable unset and keep an in-memory tree.\n */\nexport function railgunDataRoot(): string {\n if (typeof process === 'undefined') return ''\n const fromEnv = process.env.RAILGUN_DATA_DIR?.trim() ?? ''\n if (fromEnv) return fromEnv\n if (process.versions?.node && process.env.MCP_HTTP_PORT?.trim() && process.cwd() === '/app') {\n return RAILGUN_CONTAINER_DATA_DIR\n }\n return ''\n}\n\nexport async function resolveRailgunDataRoot(): Promise<string> {\n return railgunDataRoot()\n}\n\n/** KeyGen ids are timestamps plus hex. Anything else must not become a path segment. */\nexport function safeKeyGenFolderName(keyGenId: string): string {\n const name = keyGenId.trim()\n if (!/^[A-Za-z0-9_-]{1,80}$/.test(name)) {\n throw new Error('KeyGen id cannot be used as a Railgun data folder name.')\n }\n return name\n}\n\nfunction under(root: string, ...parts: string[]): string {\n return [root.replace(/\\/+$/, ''), ...parts].join('/')\n}\n\nexport function railgunEnginePath(root: string): string {\n return under(root, 'engine')\n}\n\nexport function railgunArtifactPath(root: string): string {\n return under(root, 'artifacts')\n}\n\nexport function railgunKeyGenWalletPath(root: string, keyGenId: string): string {\n return under(root, 'keygens', safeKeyGenFolderName(keyGenId), 'wallet.json')\n}\n","import type { NetworkName } from '@railgun-community/shared-models'\nimport { railgunArtifactPath, railgunEnginePath, resolveRailgunDataRoot } from './data-dir.js'\nimport { railgunNetworkByChainId } from './networks.js'\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; stallTimeout?: number }[] },\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\nfunction artifactFile(root: string, itemPath: string): string {\n const relative = itemPath.replace(/^\\/+/, '')\n if (!relative || relative.split('/').some((part) => part === '..' || part === '')) {\n throw new Error('Railgun artifact path is not valid.')\n }\n return `${railgunArtifactPath(root)}/${relative}`\n}\n\nfunction memoryArtifactStore() {\n return {\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}\n\nfunction diskArtifactStore(root: string) {\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<typeof import('node:fs/promises')>\n return {\n async get(itemPath: string) {\n const fs = await load('node:fs/promises')\n try {\n return await fs.readFile(artifactFile(root, itemPath))\n } catch {\n return null\n }\n },\n async store(_dir: string, itemPath: string, item: string | Uint8Array) {\n const fs = await load('node:fs/promises')\n const file = artifactFile(root, itemPath)\n await fs.mkdir(file.slice(0, file.lastIndexOf('/')), { recursive: true })\n await fs.writeFile(file, item)\n },\n async exists(itemPath: string) {\n const fs = await load('node:fs/promises')\n try {\n await fs.access(artifactFile(root, itemPath))\n return true\n } catch {\n return false\n }\n },\n }\n}\n\nasync function railgunDatabase(root: string): Promise<object> {\n if (!root) {\n const memdown = (await import('memdown')).default as new () => object\n return new memdown()\n }\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const fs = (await load('node:fs/promises')) as typeof import('node:fs/promises')\n const engineDir = railgunEnginePath(root)\n await fs.mkdir(engineDir, { recursive: true })\n await fs.mkdir(railgunArtifactPath(root), { recursive: true })\n const leveldownModule = (await load('leveldown')) as { default?: (location: string) => object }\n const open = leveldownModule.default ?? (leveldownModule as unknown as (location: string) => object)\n return open(engineDir)\n}\n\n/** Node-only. Keep the specifier out of the bundle so Next does not try to resolve Node's `module`. */\nasync function attachEngineErrorLogger(): Promise<void> {\n if (typeof window !== 'undefined') return\n if (typeof process === 'undefined' || !process.versions?.node) return\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const nodeModule = (await load('node:' + 'module')) as unknown as typeof import('node:module')\n const nodePath = (await load('node:' + 'path')) as unknown as typeof import('node:path')\n const require = nodeModule.createRequire(import.meta.url)\n const walletEntry = require.resolve('@railgun-community/wallet')\n const { setLoggers } = require(nodePath.join(nodePath.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}\n\ntype SnarkGroth16 = {\n fullProve: (...args: unknown[]) => Promise<unknown>\n verify?: (...args: unknown[]) => Promise<boolean>\n}\n\n/**\n * The engine starts with an empty prover. Proof generation then throws\n * \"Requires groth16 full prover implementation\". snarkjs is the Node prover.\n */\nasync function attachSnarkJsGroth16(): Promise<void> {\n if (typeof window !== 'undefined') return\n if (typeof process === 'undefined' || !process.versions?.node) return\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const nodeModule = (await load('node:' + 'module')) as unknown as typeof import('node:module')\n const nodePath = (await load('node:' + 'path')) as unknown as typeof import('node:path')\n const require = nodeModule.createRequire(import.meta.url)\n const walletEntry = require.resolve('@railgun-community/wallet')\n const { getProver } = require(nodePath.join(nodePath.dirname(walletEntry), 'services/railgun/core/prover.js')) as {\n getProver: () => { setSnarkJSGroth16: (groth16: SnarkGroth16) => void }\n }\n const snark = require('snarkjs') as { groth16?: SnarkGroth16 }\n const groth16 = snark.groth16\n if (!groth16 || typeof groth16.fullProve !== 'function') {\n throw new Error('snarkjs groth16 prover is missing.')\n }\n getProver().setSnarkJSGroth16(groth16)\n}\n\nexport async function ensureRailgunEngine(): Promise<void> {\n if (started) return\n const wallet = await walletModule()\n await attachEngineErrorLogger()\n const root = await resolveRailgunDataRoot()\n const files = root ? diskArtifactStore(root) : memoryArtifactStore()\n const store = new wallet.ArtifactStore(\n (path) => files.get(path),\n (dir, path, item) => files.store(dir, path, item),\n (path) => files.exists(path),\n )\n await wallet.startRailgunEngine('continuum', await railgunDatabase(root), true, store, false, false, POI_NODE_URLS, [], false)\n await attachSnarkJsGroth16()\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 { createPublicClient } from 'viem'\nimport {\n EVMGasType,\n getEVMGasTypeForTransaction,\n type NetworkName,\n type TransactionGasDetails,\n} from '@railgun-community/shared-models'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\n\n/** One private-transfer circuit, used when the spending wallet is still sealed at quote time. Execute replaces this with the scanned wallet's own gas estimate. */\nexport const RAILGUN_TRANSFER_GAS_ESTIMATE = 2_900_000n\n/** One unshield circuit, quoted the same way as a transfer before the spending wallet is scanned. */\nexport const RAILGUN_UNSHIELD_GAS_ESTIMATE = 3_400_000n\n\nfunction weiFromGwei(gwei: number | undefined, fallback = 1): bigint {\n return BigInt(Math.round(Number(gwei ?? fallback) * 1e9))\n}\n\nexport function railgunGasDetails(chainDetail: EvmChainDetail, gasEstimate: bigint): TransactionGasDetails {\n if (chainDetail.legacy) {\n return {\n evmGasType: EVMGasType.Type0,\n gasEstimate,\n gasPrice: weiFromGwei(chainDetail.gasPrice),\n }\n }\n return {\n evmGasType: EVMGasType.Type2,\n gasEstimate,\n maxFeePerGas: weiFromGwei(chainDetail.baseFee),\n maxPriorityFeePerGas: weiFromGwei(chainDetail.priorityFee),\n }\n}\n\n/**\n * A broadcaster on an EIP-1559 chain requires type 1 gas (a single gasPrice).\n * Type 2 is only valid when the sender signs the transaction itself.\n */\nexport function railgunBroadcasterGasDetails(\n networkName: NetworkName,\n chainDetail: EvmChainDetail,\n gasEstimate: bigint,\n): TransactionGasDetails {\n const evmGasType = getEVMGasTypeForTransaction(networkName, false)\n if (evmGasType === EVMGasType.Type2 || evmGasType === EVMGasType.Type4) {\n return {\n evmGasType,\n gasEstimate,\n maxFeePerGas: weiFromGwei(chainDetail.baseFee),\n maxPriorityFeePerGas: weiFromGwei(chainDetail.priorityFee),\n }\n }\n const gasPrice =\n evmGasType === EVMGasType.Type0 || chainDetail.legacy\n ? weiFromGwei(chainDetail.gasPrice)\n : weiFromGwei(chainDetail.baseFee) + weiFromGwei(chainDetail.priorityFee)\n return { evmGasType, gasEstimate, gasPrice }\n}\n\nexport function gweiFromWei(wei: bigint): number {\n return Number(wei) / 1e9\n}\n\n/** Fill a missing registry gas price from the latest block. A stored price is left as configured. */\nexport function chainDetailWithFetchedGas(\n chainDetail: EvmChainDetail,\n live: { baseFeeWei?: bigint; priorityFeeWei?: bigint; gasPriceWei?: bigint },\n): EvmChainDetail {\n if (chainDetail.legacy) {\n if (chainDetail.gasPrice != null && chainDetail.gasPrice > 0) return chainDetail\n if (live.gasPriceWei == null) return chainDetail\n return { ...chainDetail, gasPrice: gweiFromWei(live.gasPriceWei) }\n }\n if (chainDetail.baseFee != null && chainDetail.baseFee > 0) return chainDetail\n return {\n ...chainDetail,\n baseFee: live.baseFeeWei != null ? gweiFromWei(live.baseFeeWei) : chainDetail.baseFee,\n priorityFee:\n chainDetail.priorityFee != null && chainDetail.priorityFee > 0\n ? chainDetail.priorityFee\n : live.priorityFeeWei != null\n ? gweiFromWei(live.priorityFeeWei)\n : chainDetail.priorityFee,\n }\n}\n\nexport async function chainDetailWithLiveGas(rpcUrl: string, chainDetail: EvmChainDetail): Promise<EvmChainDetail> {\n const needsLive = chainDetail.legacy\n ? chainDetail.gasPrice == null || chainDetail.gasPrice <= 0\n : chainDetail.baseFee == null || chainDetail.baseFee <= 0\n if (!needsLive) return chainDetail\n const client = createPublicClient({ transport: defiEvmTransport(rpcUrl) })\n if (chainDetail.legacy) {\n const gasPriceWei = await client.getGasPrice()\n return chainDetailWithFetchedGas(chainDetail, { gasPriceWei })\n }\n const block = await client.getBlock({ blockTag: 'latest' })\n let priorityFeeWei = 0n\n try {\n priorityFeeWei = await client.estimateMaxPriorityFeePerGas()\n } catch {\n priorityFeeWei = 1_000_000_000n\n }\n return chainDetailWithFetchedGas(chainDetail, {\n baseFeeWei: block.baseFeePerGas ?? 0n,\n priorityFeeWei,\n })\n}\n\n/** Same token amount Railgun charges: feePerUnitGas × (gas estimate × 1.2) × gas price / 1e18. */\nexport function broadcasterTokenFee(feePerUnitGas: bigint, gasDetails: TransactionGasDetails): bigint {\n const price =\n gasDetails.evmGasType === EVMGasType.Type2 || gasDetails.evmGasType === EVMGasType.Type4\n ? gasDetails.maxFeePerGas\n : gasDetails.gasPrice\n const maximumGas = ((gasDetails.gasEstimate * 12_000n) / 10_000n) * price\n return (feePerUnitGas * maximumGas) / 10n ** 18n\n}\n","import {\n encodeFunctionData,\n getAddress,\n hashMessage,\n keccak256,\n parseAbi,\n recoverAddress,\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\n/** Railgun hashes the 65-byte personal_sign. The node often returns r||s without the recovery byte. */\nexport async function shieldPrivateKeyFromSignature(\n signature: string,\n executorAddress?: string,\n): Promise<`0x${string}`> {\n return keccak256(await canonicalRailgunShieldSignature(signature, executorAddress))\n}\n\nasync function canonicalRailgunShieldSignature(\n signature: string,\n executorAddress?: string,\n): Promise<`0x${string}`> {\n const body = signature.trim().replace(/^0x/i, '').toLowerCase()\n if (!/^[0-9a-f]+$/.test(body) || body.length % 2 !== 0) {\n throw new Error('Shield-key signature must be hex.')\n }\n const rs = body.length === 130 ? body.slice(0, 128) : body\n if (rs.length !== 128) {\n throw new Error('Shield-key signature must be the 65-byte personal_sign of RAILGUN_SHIELD.')\n }\n const stated = body.length === 130 ? body.slice(128) : ''\n if (!executorAddress) {\n if (stated === '00') return `0x${rs}1b`\n if (stated === '01') return `0x${rs}1c`\n if (body.length === 130) return `0x${body}`\n throw new Error('Shield-key signature must be the 65-byte personal_sign of RAILGUN_SHIELD.')\n }\n const preferred = stated === '01' || stated === '1c' ? (['1c', '1b'] as const) : (['1b', '1c'] as const)\n const hash = hashMessage('RAILGUN_SHIELD')\n const executor = getAddress(executorAddress).toLowerCase()\n for (const v of preferred) {\n const candidate = `0x${rs}${v}` as `0x${string}`\n try {\n const recovered = await recoverAddress({ hash, signature: candidate })\n if (recovered.toLowerCase() === executor) return candidate\n } catch {\n continue\n }\n }\n if (body.length === 130 && stated !== '00' && stated !== '01' && stated !== '1b' && stated !== '1c') {\n return `0x${body}`\n }\n throw new Error('Shield-key signature does not recover to this KeyGen address.')\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 shieldPrivateKey = await shieldPrivateKeyFromSignature(signature, executor)\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 shieldPrivateKey,\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","/**\n * CoinGecko asset platform id by mainnet chainId (contract + token_price endpoints).\n * IDs from CoinGecko GET /asset_platforms (chain_identifier → id).\n * Keep in sync with continuumdao-node-app `COINGECKO_PLATFORM_BY_CHAIN_ID`.\n */\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Record<string, string> = {\n '1': 'ethereum',\n '10': 'optimistic-ethereum',\n '30': 'rootstock',\n '56': 'binance-smart-chain',\n '100': 'xdai',\n '137': 'polygon-pos',\n '146': 'sonic',\n '169': 'manta-pacific',\n '196': 'x-layer',\n '204': 'op-bnb',\n '239': 'tac',\n '250': 'fantom',\n '252': 'fraxtal',\n '288': 'boba',\n '324': 'zk-sync-era',\n '480': 'world-chain',\n '999': 'hyperevm',\n '1088': 'metis-andromeda',\n '1101': 'polygon-zkevm',\n '1116': 'core',\n '1135': 'lisk',\n '130': 'unichain',\n '1868': 'soneium',\n '1923': 'swellchain',\n '2222': 'kava',\n '2818': 'morph-l2',\n '34443': 'mode',\n '42161': 'arbitrum-one',\n '42220': 'celo',\n '43114': 'avalanche',\n '4663': 'robinhood',\n '5042': 'arc',\n '48900': 'zircuit',\n '5000': 'mantle',\n '534352': 'scroll',\n '57073': 'ink',\n '59144': 'linea',\n '60808': 'bob-network',\n '80084': 'berachain',\n '80094': 'berachain',\n '81457': 'blast',\n '8453': 'base',\n '9745': 'plasma',\n '167000': 'taiko',\n '7777777': 'zora',\n}\n\nexport function coingeckoPlatformForChainId(chainId: string | number): string | undefined {\n return COINGECKO_PLATFORM_BY_CHAIN_ID[String(chainId).trim()]\n}\n","/** One thousandths of a 1:1 fee ratio. 1000 means the token fee matches the gas cost. */\nexport const FEE_RATIO_ONE_TO_ONE_MILLI = 1000\n\nexport type BroadcasterChoiceFields = {\n feesId: string\n feePerUnitGas: bigint\n ratioMilli: number | null\n reliability: number\n coversGas: boolean\n}\n\n/**\n * Railway's fee ratio. feePerUnitGas is token base units per 1e18 wei of gas, so the\n * gas amount cancels and the ratio is the token's dollar value divided by the native gas token's.\n * 1.00 means the broadcaster is paid about the full gas estimate.\n */\nexport function feeRatioMilli(\n feePerUnitGas: bigint,\n tokenDecimals: number,\n tokenUsd: number,\n nativeUsd: number,\n): number | null {\n if (!Number.isInteger(tokenDecimals) || tokenDecimals < 0 || tokenDecimals > 36) return null\n if (!(tokenUsd > 0) || !(nativeUsd > 0) || !Number.isFinite(tokenUsd) || !Number.isFinite(nativeUsd)) return null\n const tokenMicro = BigInt(Math.round(tokenUsd * 1_000_000))\n const nativeMicro = BigInt(Math.round(nativeUsd * 1_000_000))\n if (tokenMicro <= 0n || nativeMicro <= 0n) return null\n const denom = 10n ** BigInt(tokenDecimals) * nativeMicro\n if (denom <= 0n) return null\n const milli = (feePerUnitGas * tokenMicro * 1000n) / denom\n if (milli > BigInt(Number.MAX_SAFE_INTEGER)) return null\n return Number(milli)\n}\n\nexport function formatFeeRatioMilli(milli: number): string {\n const abs = Math.abs(Math.trunc(milli))\n const whole = Math.floor(abs / 1000)\n const frac = String(abs % 1000).padStart(3, '0').slice(0, 2)\n return `${milli < 0 ? '-' : ''}${whole}.${frac}`\n}\n\nexport function coversGasCost(ratioMilli: number | null): boolean {\n return ratioMilli != null && ratioMilli >= FEE_RATIO_ONE_TO_ONE_MILLI\n}\n\nexport function orderBroadcasterChoices<T extends BroadcasterChoiceFields>(rows: readonly T[]): T[] {\n return [...rows].sort((left, right) => {\n if (left.coversGas !== right.coversGas) return left.coversGas ? -1 : 1\n if (left.ratioMilli != null && right.ratioMilli != null && left.ratioMilli !== right.ratioMilli) {\n return left.coversGas ? left.ratioMilli - right.ratioMilli : right.ratioMilli - left.ratioMilli\n }\n if (left.ratioMilli == null && right.ratioMilli != null) return 1\n if (left.ratioMilli != null && right.ratioMilli == null) return -1\n if (left.feePerUnitGas !== right.feePerUnitGas) return left.feePerUnitGas < right.feePerUnitGas ? -1 : 1\n return right.reliability - left.reliability\n })\n}\n\nexport function defaultBroadcasterChoice<T extends BroadcasterChoiceFields>(rows: readonly T[]): T | undefined {\n return rows.find((row) => row.coversGas) ?? rows[0]\n}\n\n/**\n * The fee the user picked, or that broadcaster's current advertisement when the\n * picked fee id has expired. A long wallet sync outlives a fee advertisement.\n */\nexport function currentBroadcasterChoice<T extends BroadcasterChoiceFields & { railgunAddress: string }>(\n rows: readonly T[],\n feesId: string,\n railgunAddress: string,\n refused: ReadonlySet<string>,\n): { row: T; refreshed: boolean } | undefined {\n const id = feesId.trim()\n if (id && !refused.has(id)) {\n const exact = rows.find((row) => row.feesId === id)\n if (exact) return { row: exact, refreshed: false }\n }\n const address = railgunAddress.trim()\n if (!address) return undefined\n const same = rows.filter((row) => row.railgunAddress === address && !refused.has(row.feesId))\n const row = same.find((item) => item.coversGas) ?? same[0]\n return row ? { row, refreshed: true } : undefined\n}\n\n/** The next broadcaster whose fee still covers gas, skipping any that already refused. */\nexport function nextCoveringBroadcaster<T extends BroadcasterChoiceFields>(\n rows: readonly T[],\n refused: ReadonlySet<string>,\n): T | undefined {\n return rows.find((row) => row.coversGas && !refused.has(row.feesId))\n}\n\nexport function isBroadcasterGasRefusal(message: string): boolean {\n return /gas cost is too high/i.test(message)\n}\n","import { createPublicClient, getAddress, parseAbi } from 'viem'\nimport {\n ChainType,\n NETWORK_CONFIG,\n TXIDVersion,\n calculateGasPrice,\n type Chain,\n type NetworkName,\n type RailgunERC20AmountRecipient,\n type SelectedBroadcaster,\n} from '@railgun-community/shared-models'\nimport { coingeckoPlatformForChainId } from '../../../chains/evm/coingecko.js'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport {\n coversGasCost,\n currentBroadcasterChoice,\n defaultBroadcasterChoice,\n feeRatioMilli,\n formatFeeRatioMilli,\n isBroadcasterGasRefusal,\n nextCoveringBroadcaster,\n orderBroadcasterChoices,\n type BroadcasterChoiceFields,\n} from './broadcaster-choice.js'\nimport { ensureRailgunProvider } from './engine.js'\nimport {\n RAILGUN_TRANSFER_GAS_ESTIMATE,\n RAILGUN_UNSHIELD_GAS_ESTIMATE,\n broadcasterTokenFee,\n chainDetailWithLiveGas,\n railgunBroadcasterGasDetails,\n} 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 onBroadcasterSearch?: () => void\n onBroadcasterNote?: (note: string) => void\n onProofProgress?: (progress: number) => void\n onProofStatusRefresh?: () => void\n broadcasterAddress?: string\n broadcasterFeesId?: string\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\n/** Railgun replaces the note-check text with a short sentence. Keep the required amount and balance when they are still attached. */\nexport function railgunDetailedError(err: unknown): string {\n const seen = new Set<unknown>()\n let current: unknown = err\n let fallback = 'Railgun spend proof failed.'\n while (current != null && !seen.has(current)) {\n seen.add(current)\n if (!(current instanceof Error)) break\n const message = current.message.trim()\n if (message && /amount required|balance:/i.test(message)) return message\n if (message) fallback = message\n current = current.cause\n }\n return fallback\n}\n\n/** The broadcaster accepted the proof request and asked for a fresh proof-of-innocence status. */\nexport function broadcasterAskedToRefreshProofStatus(err: unknown): boolean {\n const message = railgunDetailedError(err)\n return (\n message.includes(BROADCASTER_POI_INCOMPLETE) ||\n /could not validate proof of innocence/i.test(message) ||\n /failed to validate poi merkleroots/i.test(message) ||\n /invalid poi merkleroots/i.test(message)\n )\n}\n\nexport function broadcasterRefusedForGas(err: unknown): boolean {\n return isBroadcasterGasRefusal(railgunDetailedError(err))\n}\n\ntype SpendingWallet = {\n refreshPOIsForTXIDVersion: (chain: Chain, txidVersion: TXIDVersion, forceRefresh?: boolean) => Promise<void>\n getBalanceERC20: (\n txidVersion: TXIDVersion,\n chain: Chain,\n tokenAddress: string,\n balanceBucketFilter: string[],\n ) => Promise<bigint | undefined>\n}\n\nfunction chainForNetwork(networkName: NetworkName): Chain {\n return NETWORK_CONFIG[networkName].chain\n}\n\n/** Finish the received, spent, and generated proof-of-innocence pass before a proof. */\nasync function refreshSpendingProofStatus(networkName: NetworkName, walletId: string): Promise<void> {\n const wallet = (await import('@railgun-community/wallet')) as unknown as {\n walletForID: (id: string) => SpendingWallet\n resumePPOIBatching: (chain: Chain) => void\n }\n const chain = chainForNetwork(networkName)\n wallet.resumePPOIBatching(chain)\n await wallet.walletForID(walletId).refreshPOIsForTXIDVersion(chain, TXIDVersion.V2_PoseidonMerkle, true)\n}\n\nasync function assertTokenSpendable(\n networkName: NetworkName,\n walletId: string,\n tokenAddress: string,\n amount: bigint,\n): Promise<void> {\n const wallet = (await import('@railgun-community/wallet')) as unknown as {\n walletForID: (id: string) => SpendingWallet\n }\n const balance = await wallet.walletForID(walletId).getBalanceERC20(\n TXIDVersion.V2_PoseidonMerkle,\n chainForNetwork(networkName),\n tokenAddress,\n ['Spendable'],\n )\n if ((balance ?? 0n) < amount) {\n throw new Error(\n 'These notes are still waiting for proof-of-innocence. The private transfer can start once that status is spendable.',\n )\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\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\nconst BROADCASTER_CACHE_MS = 60_000\n/** Fee quotes stay short so the dialog's 40s request still gets an answer. */\nconst BROADCASTER_QUOTE_WAIT_MS = 20_000\n/** A fee message can take about a minute to arrive after the spending-wallet sync. */\nexport const BROADCASTER_PROOF_WAIT_MS = 3 * 60 * 1000\n/** Same margin the Waku client uses before it treats a fee as expired. */\nexport const BROADCASTER_FEE_MIN_REMAINING_MS = 40_000\nconst BROADCASTER_PROOF_ATTEMPTS = 3\n/** The aggregator often answers the broadcaster a little after the proof is submitted. */\nconst POI_STATUS_RETRY_MS = 20_000\nconst POI_ROOT_WAIT_MS = 3 * 60 * 1000\nconst BROADCASTER_POI_INCOMPLETE = 'Proof-of-innocence validation did not complete'\nexport function broadcasterFeeStillValid(expiration: number, now = Date.now()): boolean {\n return Number.isFinite(expiration) && expiration >= now + BROADCASTER_FEE_MIN_REMAINING_MS\n}\n\nconst BROADCASTER_LIST_CACHE_MS = 15_000\nconst MAX_GAS_BROADCASTERS = 3\nconst NATIVE_COINGECKO_ID: Record<number, string> = {\n 1: 'ethereum',\n 10: 'ethereum',\n 56: 'binancecoin',\n 100: 'xdai',\n 137: 'polygon-ecosystem-token',\n 250: 'fantom',\n 324: 'ethereum',\n 1101: 'ethereum',\n 5000: 'mantle',\n 8453: 'ethereum',\n 34443: 'ethereum',\n 42161: 'ethereum',\n 43114: 'avalanche-2',\n 59144: 'ethereum',\n 81457: 'ethereum',\n 534352: 'ethereum',\n 167000: 'ethereum',\n}\n\nexport type RailgunBroadcasterChoice = {\n feesId: string\n railgunAddress: string\n feeWei: string\n ratio: string | null\n coversGas: boolean\n reliability: number\n expiration: number\n tokenDecimals: number\n}\n\ntype ListedBroadcaster = RailgunBroadcasterChoice & BroadcasterChoiceFields & { selected: SelectedBroadcaster }\n\nconst broadcasterListCache = new Map<string, { at: number; rows: ListedBroadcaster[] }>()\nconst tokenDecimalsCache = new Map<string, number>()\nconst tokenUsdCache = new Map<string, { at: number; tokenUsd: number | null; nativeUsd: number | null }>()\n\nasync function ensureBroadcasterWaku(chain: Chain): Promise<void> {\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}\n\nasync function findTokenBroadcasters(chain: Chain, tokenAddress: string): Promise<SelectedBroadcaster[]> {\n const node = await nodeRequire()\n if (!node) throw new Error('Railgun broadcasters are listed from the node.')\n const entry = node.require.resolve('@railgun-community/waku-broadcaster-client-web')\n const loaded = node.require(node.path.join(node.path.dirname(entry), 'search/best-broadcaster.js')) as {\n BroadcasterSearch: {\n findBroadcastersForToken: (chain: Chain, tokenAddress: string, useRelayAdapt: boolean) => SelectedBroadcaster[] | undefined\n }\n }\n return loaded.BroadcasterSearch.findBroadcastersForToken(chain, tokenAddress, false) ?? []\n}\n\nasync function erc20Decimals(rpcUrl: string, tokenAddress: string): Promise<number> {\n const key = tokenAddress.toLowerCase()\n const cached = tokenDecimalsCache.get(key)\n if (cached != null) return cached\n const client = createPublicClient({ transport: defiEvmTransport(rpcUrl) })\n const decimals = await client.readContract({\n address: getAddress(tokenAddress),\n abi: parseAbi(['function decimals() view returns (uint8)']),\n functionName: 'decimals',\n })\n const value = Number(decimals)\n if (!Number.isInteger(value) || value < 0 || value > 36) throw new Error('Token decimals are not available.')\n tokenDecimalsCache.set(key, value)\n return value\n}\n\nasync function readUsd(url: string): Promise<number | null> {\n try {\n const response = await fetch(url, { signal: AbortSignal.timeout(8_000) })\n if (!response.ok) return null\n const body = (await response.json()) as Record<string, { usd?: number }>\n for (const row of Object.values(body)) {\n if (typeof row?.usd === 'number' && row.usd > 0) return row.usd\n }\n } catch {\n return null\n }\n return null\n}\n\nasync function broadcasterUsdPrices(chainId: number, tokenAddress: string, wrappedAddress: string): Promise<{ tokenUsd: number | null; nativeUsd: number | null }> {\n const key = `${chainId}:${tokenAddress.toLowerCase()}`\n const cached = tokenUsdCache.get(key)\n if (cached && Date.now() - cached.at < 60_000) return cached\n const nativeId = NATIVE_COINGECKO_ID[chainId]\n const nativeUsd = nativeId\n ? await readUsd(`https://api.coingecko.com/api/v3/simple/price?ids=${encodeURIComponent(nativeId)}&vs_currencies=usd`)\n : null\n const wrapped = wrappedAddress.toLowerCase() === tokenAddress.toLowerCase()\n let tokenUsd = wrapped ? nativeUsd : null\n if (!wrapped) {\n const platform = coingeckoPlatformForChainId(chainId)\n tokenUsd = platform\n ? await readUsd(\n `https://api.coingecko.com/api/v3/simple/token_price/${encodeURIComponent(platform)}?contract_addresses=${encodeURIComponent(tokenAddress)}&vs_currencies=usd`,\n )\n : null\n }\n const prices = { tokenUsd, nativeUsd }\n tokenUsdCache.set(key, { at: Date.now(), ...prices })\n return prices\n}\n\nasync function loadRailgunBroadcasters(args: {\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n kind: 'transfer' | 'unshield'\n waitMs?: number\n}): Promise<ListedBroadcaster[]> {\n const tokenAddress = getAddress(args.tokenAddress)\n const cacheKey = `${args.kind}:${args.chainId}:${tokenAddress.toLowerCase()}`\n const cached = broadcasterListCache.get(cacheKey)\n if (cached && Date.now() - cached.at < BROADCASTER_LIST_CACHE_MS) return cached.rows\n const chain = chainFor(args.chainId)\n await ensureBroadcasterWaku(chain)\n const deadline = Date.now() + (args.waitMs ?? BROADCASTER_QUOTE_WAIT_MS)\n let found: SelectedBroadcaster[] = []\n while (Date.now() < deadline) {\n found = (await findTokenBroadcasters(chain, tokenAddress)).filter((row) => broadcasterFeeStillValid(row.tokenFee.expiration))\n if (found.length > 0) break\n await delay(1000)\n }\n if (found.length === 0) throw new Error('No Railgun broadcaster is available for this token.')\n const network = await railgunNetworkByChainId(args.chainId)\n const [decimals, prices, priced] = await Promise.all([\n erc20Decimals(args.rpcUrl, tokenAddress),\n broadcasterUsdPrices(args.chainId, tokenAddress, network?.wrappedAddress ?? ''),\n chainDetailWithLiveGas(args.rpcUrl, args.chainDetail),\n ])\n const networkName = (network?.networkName ?? '') as NetworkName\n const gasEstimate = args.kind === 'unshield' ? RAILGUN_UNSHIELD_GAS_ESTIMATE : RAILGUN_TRANSFER_GAS_ESTIMATE\n const gasDetails = railgunBroadcasterGasDetails(networkName, priced, gasEstimate)\n const byFeesId = new Map<string, ListedBroadcaster>()\n for (const selected of found) {\n const feesId = selected.tokenFee.feesID\n if (!feesId) continue\n const feePerUnitGas = BigInt(selected.tokenFee.feePerUnitGas)\n const ratioMilli =\n prices.tokenUsd != null && prices.nativeUsd != null\n ? feeRatioMilli(feePerUnitGas, decimals, prices.tokenUsd, prices.nativeUsd)\n : null\n const row: ListedBroadcaster = {\n feesId,\n railgunAddress: selected.railgunAddress,\n feeWei: broadcasterTokenFee(feePerUnitGas, gasDetails).toString(),\n ratio: ratioMilli == null ? null : formatFeeRatioMilli(ratioMilli),\n coversGas: coversGasCost(ratioMilli),\n reliability: Number(selected.tokenFee.reliability) || 0,\n expiration: selected.tokenFee.expiration,\n tokenDecimals: decimals,\n feePerUnitGas,\n ratioMilli,\n selected,\n }\n const previous = byFeesId.get(feesId)\n if (!previous || row.reliability > previous.reliability) byFeesId.set(feesId, row)\n }\n const rows = orderBroadcasterChoices([...byFeesId.values()])\n broadcasterListCache.set(cacheKey, { at: Date.now(), rows })\n return rows\n}\n\nexport async function listRailgunBroadcasters(args: {\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n kind: string\n}): Promise<RailgunBroadcasterChoice[]> {\n const kind = args.kind.trim()\n if (kind !== 'transfer' && kind !== 'unshield') throw new Error('kind must be transfer or unshield.')\n const rows = await loadRailgunBroadcasters({ ...args, kind })\n return rows.map((row) => ({\n feesId: row.feesId,\n railgunAddress: row.railgunAddress,\n feeWei: row.feeWei,\n ratio: row.ratio,\n coversGas: row.coversGas,\n reliability: row.reliability,\n expiration: row.expiration,\n tokenDecimals: row.tokenDecimals,\n }))\n}\n\nfunction broadcasterNote(row: ListedBroadcaster, mode: 'selected' | 'refreshed' | 'next'): string {\n const ratioLabel = row.ratio ? `${row.ratio}:1` : 'the selected fee'\n if (mode === 'next') return `Trying the next broadcaster at ${ratioLabel}`\n if (mode === 'refreshed') return `The chosen fee expired. Broadcaster ${ratioLabel}`\n return `Broadcaster ${ratioLabel}`\n}\n\ntype ProvedPrivateAction = {\n populated: {\n transaction: { to?: string; data?: string }\n nullifiers?: string[]\n preTransactionPOIsPerTxidLeafPerList: Record<string, Record<string, unknown>>\n }\n overallBatchMinGasPrice: bigint\n}\n\nfunction poiListsPresent(pois: Record<string, Record<string, unknown>>): boolean {\n return Object.values(pois).some((leaves) => Object.keys(leaves).length > 0)\n}\n\nfunction poiRoots(poi: unknown): string[] {\n if (!poi || typeof poi !== 'object' || !('poiMerkleroots' in poi)) return []\n const roots = (poi as { poiMerkleroots?: unknown }).poiMerkleroots\n return Array.isArray(roots) ? roots.filter((root): root is string => typeof root === 'string') : []\n}\n\ntype PoiRootValidator = {\n validatePOIMerkleroots: (\n txidVersion: TXIDVersion,\n chain: Chain,\n listKey: string,\n poiMerkleroots: string[],\n ) => Promise<boolean>\n}\n\n/**\n * Node-only. A bundled import of the engine rewrites `require(\"events\")` and then\n * the proof-of-innocence class is missing. Resolve the copy the wallet already started.\n */\nasync function nodeRequire(): Promise<{ require: NodeRequire; path: typeof import('node:path') } | null> {\n if (typeof window !== 'undefined') return null\n if (typeof process === 'undefined' || !process.versions?.node) return null\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<Record<string, unknown>>\n const nodeModule = (await load('node:' + 'module')) as unknown as typeof import('node:module')\n const nodePath = (await load('node:' + 'path')) as unknown as typeof import('node:path')\n return { require: nodeModule.createRequire(import.meta.url), path: nodePath }\n}\n\nasync function poiRootValidator(): Promise<PoiRootValidator> {\n const node = await nodeRequire()\n if (!node) throw new Error('Proof-of-innocence checks need the node Railgun engine.')\n const walletEntry = node.require.resolve('@railgun-community/wallet')\n const engineEntry = node.require.resolve('@railgun-community/' + 'engine', {\n paths: [node.path.dirname(walletEntry)],\n })\n const loaded = node.require(engineEntry) as { POI?: PoiRootValidator }\n if (!loaded.POI) throw new Error('The Railgun engine did not load its proof-of-innocence checker.')\n return loaded.POI\n}\n\n/** The same merkleroot check the broadcaster runs, asked of the public aggregator first. */\nasync function poiMerklerootsConfirmed(\n chain: Chain,\n pois: Record<string, Record<string, unknown>>,\n): Promise<boolean> {\n const poi = await poiRootValidator()\n for (const [listKey, leaves] of Object.entries(pois)) {\n for (const entry of Object.values(leaves)) {\n const roots = poiRoots(entry)\n if (roots.length === 0) return false\n const confirmed = await poi.validatePOIMerkleroots(TXIDVersion.V2_PoseidonMerkle, chain, listKey, roots)\n if (!confirmed) return false\n }\n }\n return true\n}\n\nasync function waitForConfirmedPoiRoots(\n chain: Chain,\n proved: ProvedPrivateAction,\n onProofStatusRefresh?: () => void,\n): Promise<void> {\n const pois = proved.populated.preTransactionPOIsPerTxidLeafPerList\n if (!poiListsPresent(pois)) {\n throw new Error('The proof did not include a proof of innocence.')\n }\n const deadline = Date.now() + POI_ROOT_WAIT_MS\n while (Date.now() < deadline) {\n try {\n if (await poiMerklerootsConfirmed(chain, pois)) return\n } catch (err) {\n if (!broadcasterAskedToRefreshProofStatus(err)) throw err\n }\n onProofStatusRefresh?.()\n await delay(POI_STATUS_RETRY_MS)\n }\n throw new Error('The proof-of-innocence list has not confirmed these notes. Wait a few minutes and try the private transfer again.')\n}\n\n/**\n * The fee is an input to the proof. Read it after the spending wallet is ready, then\n * submit only while that fee id is still valid. A long proof can outlive the id.\n * A broadcaster that refuses because gas is too high is skipped, and the next fee\n * that still covers gas is proved. A proof-of-innocence refresh reuses the same proof.\n */\nasync function submitFreshProof(args: {\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n kind: 'transfer' | 'unshield'\n chain: Chain\n tokenAddress: string\n broadcasterAddress?: string\n broadcasterFeesId?: string\n onBroadcasterSearch?: () => void\n onBroadcasterNote?: (note: string) => void\n onProofStatusRefresh?: () => void\n refreshProofStatus?: () => Promise<void>\n assertSpendable?: () => Promise<void>\n build: (broadcaster: SelectedBroadcaster) => Promise<ProvedPrivateAction>\n}): Promise<{ txHash: string }> {\n if (args.refreshProofStatus) {\n args.onProofStatusRefresh?.()\n await args.refreshProofStatus().catch(() => undefined)\n }\n await args.assertSpendable?.()\n const refused = new Set<string>()\n const chosenFeesId = args.broadcasterFeesId?.trim() ?? ''\n const chosenAddress = args.broadcasterAddress?.trim() ?? ''\n let feesId = chosenFeesId\n let lastError: unknown = new Error('No Railgun broadcaster is available for this token.')\n let builds = 0\n while (builds < MAX_GAS_BROADCASTERS) {\n args.onBroadcasterSearch?.()\n const rows = await loadRailgunBroadcasters({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress: args.tokenAddress,\n kind: args.kind,\n waitMs: BROADCASTER_PROOF_WAIT_MS,\n })\n const picked =\n refused.size === 0 ? currentBroadcasterChoice(rows, feesId, chosenAddress, refused) : undefined\n const row =\n picked?.row ?? nextCoveringBroadcaster(rows, refused) ?? (refused.size === 0 ? defaultBroadcasterChoice(rows) : undefined)\n if (!row || !broadcasterFeeStillValid(row.expiration)) {\n if (!row) break\n refused.add(row.feesId)\n feesId = ''\n if (refused.size >= rows.length) break\n continue\n }\n builds += 1\n feesId = row.feesId\n const replaced = Boolean(chosenFeesId) && row.feesId !== chosenFeesId\n const mode = refused.size > 0 ? 'next' : replaced ? 'refreshed' : 'selected'\n args.onBroadcasterNote?.(broadcasterNote(row, mode))\n const broadcaster = row.selected\n const proved = await args.build(broadcaster)\n if (!broadcasterFeeStillValid(broadcaster.tokenFee.expiration)) {\n broadcasterListCache.clear()\n refused.add(feesId)\n feesId = ''\n continue\n }\n await waitForConfirmedPoiRoots(args.chain, proved, args.onProofStatusRefresh)\n let switchBroadcaster = false\n for (let poiTry = 1; poiTry <= BROADCASTER_PROOF_ATTEMPTS && !switchBroadcaster; poiTry += 1) {\n try {\n return {\n txHash: await submitProved({\n chain: args.chain,\n populated: proved.populated,\n broadcaster,\n overallBatchMinGasPrice: proved.overallBatchMinGasPrice,\n }),\n }\n } catch (err) {\n lastError = err\n if (broadcasterRefusedForGas(err)) {\n refused.add(feesId)\n feesId = ''\n switchBroadcaster = true\n break\n }\n if (poiTry === BROADCASTER_PROOF_ATTEMPTS || !broadcasterAskedToRefreshProofStatus(err)) throw err\n args.onProofStatusRefresh?.()\n await delay(POI_STATUS_RETRY_MS)\n await args.refreshProofStatus?.().catch(() => undefined)\n if (!broadcasterFeeStillValid(broadcaster.tokenFee.expiration)) {\n broadcasterListCache.clear()\n refused.add(feesId)\n feesId = ''\n switchBroadcaster = true\n break\n }\n await waitForConfirmedPoiRoots(args.chain, proved, args.onProofStatusRefresh)\n }\n }\n }\n if (lastError instanceof Error) throw lastError\n throw new Error('The broadcaster fee expired while the proof was building. Try the private transfer again.')\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 detail = await broadcasterDetailConfig()\n const previousDetail = detail?.IS_DEV\n if (detail) detail.IS_DEV = true\n try {\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 } finally {\n if (detail && previousDetail !== undefined) detail.IS_DEV = previousDetail\n }\n}\n\n/** Ask the broadcaster for the underlying proof-of-innocence error instead of its summary. */\nasync function broadcasterDetailConfig(): Promise<{ IS_DEV: boolean } | null> {\n const node = await nodeRequire()\n if (!node) return null\n const entry = node.require.resolve('@railgun-community/waku-broadcaster-client-web')\n const loaded = node.require(node.path.join(node.path.dirname(entry), 'models/broadcaster-config.js')) as {\n BroadcasterConfig: { IS_DEV: boolean }\n }\n return loaded.BroadcasterConfig\n}\n\nfunction feeRecipient(\n wallet: WalletTx,\n broadcaster: SelectedBroadcaster,\n gasDetails: ReturnType<typeof railgunBroadcasterGasDetails>,\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\nconst broadcasterFeeCache = new Map<string, { at: number; feeWei: string; tokenAddress: string }>()\n\nexport async function quoteRailgunBroadcasterFee(args: {\n kind: 'transfer' | 'unshield'\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n amountWei: string\n recipientAddress: string\n memoText?: string\n walletId: string\n encryptionKey: string\n}): Promise<{ feeWei: string; tokenAddress: string }> {\n const tokenAddress = getAddress(args.tokenAddress)\n const cacheKey = `${args.kind}:${args.chainId}:${tokenAddress.toLowerCase()}`\n const cached = broadcasterFeeCache.get(cacheKey)\n if (cached && Date.now() - cached.at < BROADCASTER_CACHE_MS) {\n return { feeWei: cached.feeWei, tokenAddress: cached.tokenAddress }\n }\n const amount = parsedAmount(args.amountWei)\n const networkName = await ensureRailgunProvider(args.chainId, args.rpcUrl)\n const wallet = (await import('@railgun-community/wallet')) as unknown as WalletTx\n const priced = await chainDetailWithLiveGas(args.rpcUrl, args.chainDetail)\n const listed = await loadRailgunBroadcasters({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress,\n kind: args.kind,\n })\n const chosen = defaultBroadcasterChoice(listed)\n if (!chosen) throw new Error('No Railgun broadcaster is available for this token.')\n const broadcaster = chosen.selected\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunBroadcasterGasDetails(networkName, priced, 0n)\n const recipientAddress =\n args.kind === 'unshield'\n ? getAddress(args.recipientAddress || '0x0000000000000000000000000000000000000001')\n : args.recipientAddress.trim()\n if (args.kind === 'transfer' && !recipientAddress.startsWith('0zk')) {\n throw new Error('A 0zk address is required to estimate the private-transfer fee.')\n }\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n const estimated =\n args.kind === 'unshield'\n ? await wallet.gasEstimateForUnprovenUnshield(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n args.walletId,\n args.encryptionKey,\n recipients,\n [],\n original,\n feeToken,\n false,\n )\n : await wallet.gasEstimateForUnprovenTransfer(\n TXIDVersion.V2_PoseidonMerkle,\n networkName,\n args.walletId,\n args.encryptionKey,\n args.memoText ?? null,\n recipients,\n [],\n original,\n feeToken,\n false,\n )\n const fee = feeRecipient(wallet, broadcaster, railgunBroadcasterGasDetails(networkName, priced, estimated.gasEstimate))\n const quoted = { feeWei: fee.amount.toString(), tokenAddress: getAddress(fee.tokenAddress) }\n broadcasterFeeCache.set(cacheKey, { at: Date.now(), ...quoted })\n return quoted\n}\n\n/** Broadcaster fee from the live fee rate and chain gas. A view-only wallet cannot run the proof estimate. */\nexport async function quoteRailgunBroadcasterFeeRate(args: {\n kind: 'transfer' | 'unshield'\n chainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n tokenAddress: string\n}): Promise<{ feeWei: string; tokenAddress: string }> {\n const tokenAddress = getAddress(args.tokenAddress)\n const network = await railgunNetworkByChainId(args.chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const listed = await loadRailgunBroadcasters({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress,\n kind: args.kind,\n })\n const chosen = defaultBroadcasterChoice(listed)\n if (!chosen) throw new Error('No Railgun broadcaster is available for this token.')\n return { feeWei: chosen.feeWei, tokenAddress }\n}\n\nexport async function railgunPrivateTransfer(args: RailgunPrivateActionArgs): Promise<{ txHash: string }> {\n try {\n return await provePrivateTransfer(args)\n } catch (err) {\n throw new Error(railgunDetailedError(err))\n }\n}\n\nasync function provePrivateTransfer(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 priced = await chainDetailWithLiveGas(rpcUrl, args.chainDetail)\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n return submitFreshProof({\n chainId: args.chainId,\n rpcUrl,\n chainDetail: args.chainDetail,\n kind: 'transfer',\n chain,\n tokenAddress,\n broadcasterAddress: args.broadcasterAddress,\n broadcasterFeesId: args.broadcasterFeesId,\n onBroadcasterSearch: args.onBroadcasterSearch,\n onBroadcasterNote: args.onBroadcasterNote,\n onProofStatusRefresh: args.onProofStatusRefresh,\n refreshProofStatus: () => refreshSpendingProofStatus(networkName, session.walletId),\n assertSpendable: () => assertTokenSpendable(networkName, session.walletId, tokenAddress, amount),\n build: async (broadcaster) => {\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunBroadcasterGasDetails(networkName, priced, 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 = railgunBroadcasterGasDetails(networkName, priced, 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 { populated, overallBatchMinGasPrice }\n },\n })\n}\n\nexport async function railgunUnshield(args: RailgunPrivateActionArgs): Promise<{ txHash: string }> {\n try {\n return await proveUnshield(args)\n } catch (err) {\n throw new Error(railgunDetailedError(err))\n }\n}\n\nasync function proveUnshield(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 priced = await chainDetailWithLiveGas(rpcUrl, args.chainDetail)\n const recipients: RailgunERC20AmountRecipient[] = [{ tokenAddress, amount, recipientAddress }]\n return submitFreshProof({\n chainId: args.chainId,\n rpcUrl,\n chainDetail: args.chainDetail,\n kind: 'unshield',\n chain,\n tokenAddress,\n broadcasterAddress: args.broadcasterAddress,\n broadcasterFeesId: args.broadcasterFeesId,\n onBroadcasterSearch: args.onBroadcasterSearch,\n onBroadcasterNote: args.onBroadcasterNote,\n onProofStatusRefresh: args.onProofStatusRefresh,\n refreshProofStatus: () => refreshSpendingProofStatus(networkName, session.walletId),\n assertSpendable: () => assertTokenSpendable(networkName, session.walletId, tokenAddress, amount),\n build: async (broadcaster) => {\n const feeToken = {\n tokenAddress: broadcaster.tokenAddress,\n feePerUnitGas: BigInt(broadcaster.tokenFee.feePerUnitGas),\n }\n const original = railgunBroadcasterGasDetails(networkName, priced, 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 = railgunBroadcasterGasDetails(networkName, priced, 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 { populated, overallBatchMinGasPrice }\n },\n })\n}\n","import { createPublicClient, getAddress, parseAbi } from 'viem'\nimport type { EvmChainDetail } from '../../../chains/evm/types.js'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { railgunNetworkByChainId } from './networks.js'\nimport { quoteRailgunBroadcasterFeeRate } from './private-actions.js'\n\nconst feeAbi = parseAbi([\n 'function shieldFee() view returns (uint256)',\n 'function unshieldFee() view returns (uint256)',\n])\n\nconst BASIS_POINTS = 10_000n\nconst FEE_CACHE_MS = 60_000\n\nexport type RailgunFeeKind = 'shield' | 'transfer' | 'unshield'\n\nexport type RailgunFeeQuote = {\n kind: RailgunFeeKind\n amountWei: string\n protocolFeeBasisPoints: string\n protocolFeeWei: string\n receivedWei: string\n broadcasterFeeWei: string\n broadcasterTokenAddress: string\n totalDebitWei: string\n broadcasterError?: string\n}\n\ntype BasisPoints = { shield: bigint; unshield: bigint; at: number }\n\nconst basisCache = new Map<number, BasisPoints>()\n\nexport function railgunProtocolFee(amount: bigint, basisPoints: bigint): { fee: bigint; received: bigint } {\n const value = amount > 0n ? amount : 0n\n const bps = basisPoints > 0n ? basisPoints : 0n\n const fee = (value * bps) / BASIS_POINTS\n return { fee, received: value - fee }\n}\n\nasync function protocolBasisPoints(chainId: number, rpcUrl: string): Promise<BasisPoints> {\n const cached = basisCache.get(chainId)\n if (cached && Date.now() - cached.at < FEE_CACHE_MS) return cached\n const network = await railgunNetworkByChainId(chainId)\n if (!network) throw new Error('Railgun is not deployed on this chain.')\n const client = createPublicClient({ transport: defiEvmTransport(rpcUrl) })\n const address = getAddress(network.proxyContract)\n const [shield, unshield] = await Promise.all([\n client.readContract({ address, abi: feeAbi, functionName: 'shieldFee' }),\n client.readContract({ address, abi: feeAbi, functionName: 'unshieldFee' }),\n ])\n const next = { shield, unshield, at: Date.now() }\n basisCache.set(chainId, next)\n return next\n}\n\nexport function clearRailgunFeeCache(): void {\n basisCache.clear()\n}\n\nexport async function quoteRailgunFee(args: {\n kind: RailgunFeeKind\n chainId: number\n rpcUrl: string\n chainDetail?: EvmChainDetail\n tokenAddress: string\n amountWei: string\n recipientAddress?: string\n memoText?: string\n walletId?: string\n encryptionKey?: string\n}): Promise<RailgunFeeQuote> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n const amount = (() => {\n try {\n return BigInt(args.amountWei.trim() || '0')\n } catch {\n throw new Error('Amount must be an integer in wei.')\n }\n })()\n if (amount < 0n) throw new Error('Amount must be greater than zero.')\n const rates = await protocolBasisPoints(args.chainId, rpcUrl)\n const basisPoints = args.kind === 'shield' ? rates.shield : args.kind === 'unshield' ? rates.unshield : 0n\n const protocol = railgunProtocolFee(amount, basisPoints)\n let broadcasterFee = 0n\n let broadcasterTokenAddress = ''\n let broadcasterError: string | undefined\n if (args.kind !== 'shield') {\n if (!args.chainDetail) {\n broadcasterError = 'Chain gas details are required to estimate the broadcaster fee.'\n } else {\n try {\n const quoted = await quoteRailgunBroadcasterFeeRate({\n kind: args.kind,\n chainId: args.chainId,\n rpcUrl,\n chainDetail: args.chainDetail,\n tokenAddress: args.tokenAddress,\n })\n broadcasterFee = BigInt(quoted.feeWei)\n broadcasterTokenAddress = quoted.tokenAddress\n } catch (err) {\n broadcasterError = err instanceof Error ? err.message : 'Broadcaster fee is not available.'\n }\n }\n }\n const totalDebit = args.kind === 'shield' ? amount : amount + broadcasterFee\n const quote: RailgunFeeQuote = {\n kind: args.kind,\n amountWei: amount.toString(),\n protocolFeeBasisPoints: basisPoints.toString(),\n protocolFeeWei: protocol.fee.toString(),\n receivedWei: (args.kind === 'transfer' ? amount : protocol.received).toString(),\n broadcasterFeeWei: broadcasterFee.toString(),\n broadcasterTokenAddress,\n totalDebitWei: totalDebit.toString(),\n }\n if (broadcasterError) quote.broadcasterError = broadcasterError\n return quote\n}\n","import { ChainType, RailgunWalletBalanceBucket, TXIDVersion, type RailgunBalancesEvent } from '@railgun-community/shared-models'\nimport { railgunKeyGenWalletPath, resolveRailgunDataRoot } from './data-dir.js'\nimport { ensureRailgunEngine, ensureRailgunProvider } 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\nasync function rememberKeyGenWallet(keyGenId: string, walletId: string, railgunAddress: string): Promise<void> {\n const root = await resolveRailgunDataRoot()\n if (!root) return\n const load = new Function('id', 'return import(id)') as (id: string) => Promise<typeof import('node:fs/promises')>\n const fs = await load('node:fs/promises')\n const file = railgunKeyGenWalletPath(root, keyGenId)\n await fs.mkdir(file.slice(0, file.lastIndexOf('/')), { recursive: true })\n await fs.writeFile(file, `${JSON.stringify({ walletId, railgunAddress })}\\n`, { mode: 0o600 })\n}\n\nexport async function openRailgunViewOnlyWallet(args: {\n encryptionKey: string\n shareableViewingKey: string\n chainId: number\n keyGenId?: string\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 if (args.keyGenId) await rememberKeyGenWallet(args.keyGenId, created.id, created.railgunAddress)\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<string, Map<string, BalanceCell>>()\n\nfunction bucketKey(walletId: string, chainId: number): string {\n return `${walletId}:${chainId}`\n}\n\nfunction rowMap(walletId: string, chainId: number) {\n const key = bucketKey(walletId, chainId)\n let rows = buckets.get(key)\n if (!rows) {\n rows = new Map()\n buckets.set(key, 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\nexport function recordRailgunWalletBalance(event: RailgunBalancesEvent): void {\n applyBalanceEvent(event)\n}\n\nexport function railgunWalletBalanceSnapshot(walletId: string, chainId: number): RailgunPrivateBalanceRow[] {\n return snapshotRows(walletId, chainId)\n}\n\nexport function clearRailgunWalletBalances(): void {\n buckets.clear()\n}\n\nfunction applyBalanceEvent(event: RailgunBalancesEvent) {\n if (!event.railgunWalletID || event.txidVersion !== TXIDVersion.V2_PoseidonMerkle) return\n const rows = rowMap(event.railgunWalletID, 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(walletId: string, chainId: number): RailgunPrivateBalanceRow[] {\n const rows = buckets.get(bucketKey(walletId, 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\nconst RAILGUN_RESCAN_QUIET_MS = 4000\n\n/** After the note scan reports 100%, wait this long for the spendable-note check, then save the balances already decrypted. */\nexport const RAILGUN_TXID_WAIT_AFTER_NOTES_MS = 45_000\n\n/** After the history walk, sync blocks that were mined while it was running. A shield in that gap is otherwise left out. */\nexport const RAILGUN_CATCH_UP_MS = 120_000\n\n/** The first merkletree walk can take much longer than the catch-up window. Give up only when progress itself stops. */\nexport const RAILGUN_MERKLETREE_STALL_MS = 5 * 60 * 1000\n\nexport const RAILGUN_SCAN_BEHIND_NOTE =\n 'The shielded balance is saved. The newest blocks did not finish syncing, so a shield that just landed may be missing until the next scan.'\n\nexport const RAILGUN_SCAN_STOPPED_NOTE =\n 'The note scan stopped before it reached the latest block. The shielded balance is unchanged until a scan finishes.'\n\n/** A catch-up timer that expires while leaves are still arriving has not finished the tree. */\nexport function merkletreeScanStillRunning(args: {\n sawProgress: boolean\n notesFinished: boolean\n terminal: 'done' | 'failed' | 'pending'\n}): boolean {\n return args.sawProgress && !args.notesFinished && args.terminal === 'pending'\n}\n\nexport function railgunScanRecord(\n merkletree: 'done' | 'failed',\n balanceCount: number,\n caughtUp: boolean,\n): { scanStatus: RailgunScanStatus; notes: string } {\n if (merkletree !== 'done') {\n return { scanStatus: 'error', notes: RAILGUN_SCAN_STOPPED_NOTE }\n }\n if (!caughtUp) {\n return {\n scanStatus: balanceCount === 0 ? 'empty' : 'ready',\n notes: RAILGUN_SCAN_BEHIND_NOTE,\n }\n }\n return {\n scanStatus: balanceCount === 0 ? 'empty' : 'ready',\n notes: balanceCount === 0 ? 'No private balance on this chain yet.' : '',\n }\n}\n\nexport function balancesToKeepAfterNoteScan(\n decrypted: RailgunPrivateBalanceRow[],\n afterRefresh: RailgunPrivateBalanceRow[],\n previous: RailgunPrivateBalanceRow[],\n): RailgunPrivateBalanceRow[] {\n if (afterRefresh.length > 0) return afterRefresh\n if (decrypted.length > 0) return decrypted\n return previous\n}\n\ntype UtxoScanListener = (event: { chain: { id: number }; scanStatus: string; progress: number }) => void\n\nconst utxoListeners = new Set<UtxoScanListener>()\nlet utxoHooked = false\nconst balanceListeners = new Set<(event: RailgunBalancesEvent) => void>()\nlet balanceHooked = false\nconst scansInFlight = new Map<\n string,\n Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string }>\n>()\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function hookUtxoScans(wallet: WalletModule): Promise<void> {\n if (utxoHooked) return\n utxoHooked = true\n wallet.setOnUTXOMerkletreeScanCallback((event) => {\n for (const listener of utxoListeners) listener(event)\n })\n}\n\nasync function hookBalanceUpdates(wallet: WalletModule): Promise<void> {\n if (balanceHooked) return\n balanceHooked = true\n wallet.setOnBalanceUpdateCallback((event) => {\n for (const listener of balanceListeners) listener(event)\n })\n}\n\nfunction publishScan(\n chainId: number,\n scanStatus: RailgunScanStatus,\n balances: RailgunPrivateBalanceRow[],\n settled: boolean,\n notes?: string,\n): { scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string } {\n const text = notes ?? (balances.length === 0 ? 'No private balance on this chain yet.' : undefined)\n publishRailgunPrivateBalanceSnapshot({\n chainId,\n scanStatus,\n balances,\n updatedAt: new Date().toISOString(),\n notes: text,\n })\n return { scanStatus, balances, settled, notes: text ?? '' }\n}\n\nasync function scanRailgunPrivateBalancesOnce(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n onBalances?: (balances: RailgunPrivateBalanceRow[]) => void\n}): Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string }> {\n const previous = snapshotRows(args.walletId, args.chainId)\n publishRailgunPrivateBalanceSnapshot({\n chainId: args.chainId,\n scanStatus: 'scanning',\n balances: previous,\n updatedAt: new Date().toISOString(),\n })\n const wallet = await walletModule()\n let resolveScan: (status: 'done' | 'failed') => void = () => {}\n let scanSettled = new Promise<'done' | 'failed'>((resolve) => {\n resolveScan = resolve\n })\n const armScanWait = () => {\n scanSettled = new Promise<'done' | 'failed'>((resolve) => {\n resolveScan = resolve\n })\n }\n let sawUtxoEvent = false\n let lastUtxoAt = 0\n let replacedBuckets = false\n let resolveNotesEnd: () => void = () => {}\n const notesEnded = new Promise<void>((resolve) => {\n resolveNotesEnd = resolve\n })\n const publishLiveBalances = () => {\n const rows = snapshotRows(args.walletId, args.chainId)\n if (rows.length > 0) args.onBalances?.(rows)\n }\n let notesFinished = false\n const listener: UtxoScanListener = (event) => {\n if (event.chain.id !== args.chainId) return\n if (!replacedBuckets) {\n buckets.set(bucketKey(args.walletId, args.chainId), new Map())\n replacedBuckets = true\n }\n sawUtxoEvent = true\n lastUtxoAt = Date.now()\n args.onProgress?.(event.progress)\n const terminal = utxoScanTerminalStatus(event.scanStatus)\n if (event.progress >= 1 || terminal === 'done') {\n notesFinished = true\n publishLiveBalances()\n resolveNotesEnd()\n }\n if (terminal !== 'pending') resolveScan(terminal)\n }\n await hookUtxoScans(wallet)\n await hookBalanceUpdates(wallet)\n utxoListeners.add(listener)\n const onBalance = (event: RailgunBalancesEvent) => {\n if (event.railgunWalletID !== args.walletId || event.chain.id !== args.chainId) return\n recordRailgunWalletBalance(event)\n publishLiveBalances()\n }\n balanceListeners.add(onBalance)\n try {\n await ensureRailgunProvider(args.chainId, args.rpcUrl)\n const chain = { type: ChainType.EVM, id: args.chainId }\n // refreshBalances also syncs the TXID tree after the note scan. A second call while that\n // walk is still running does not emit a new UTXO Complete event, so this returns the\n // balances already decrypted instead of waiting for the history walk.\n const refresh = wallet.refreshBalances(chain, [args.walletId]).then(\n () => 'returned' as const,\n () => 'returned' as const,\n )\n const quiet = delay(RAILGUN_RESCAN_QUIET_MS).then(() => 'quiet' as const)\n const notesTimeout = notesEnded.then(() => delay(RAILGUN_TXID_WAIT_AFTER_NOTES_MS)).then(() => 'notes-timeout' as const)\n let status: 'done' | 'failed' | 'returned' | 'quiet' | 'notes-timeout' | 'catch-up-timeout' = await Promise.race([\n scanSettled,\n refresh,\n quiet,\n notesTimeout,\n ])\n if (status === 'quiet') {\n status = await Promise.race([\n scanSettled,\n refresh,\n notesTimeout,\n delay(RAILGUN_CATCH_UP_MS).then(() => 'catch-up-timeout' as const),\n ])\n }\n let historyFinished = status === 'done' || ((status === 'notes-timeout' || status === 'returned') && notesFinished)\n const terminal = status === 'done' || status === 'failed' ? status : 'pending'\n if (\n !historyFinished &&\n merkletreeScanStillRunning({ sawProgress: sawUtxoEvent, notesFinished, terminal })\n ) {\n let walked: 'done' | 'failed' | 'stalled' = 'stalled'\n while (walked === 'stalled') {\n const idle = Date.now() - lastUtxoAt\n const slice = Math.max(250, RAILGUN_MERKLETREE_STALL_MS - idle)\n const step = await Promise.race([scanSettled, delay(slice).then(() => 'tick' as const)])\n if (step === 'done' || step === 'failed') {\n walked = step\n break\n }\n if (Date.now() - lastUtxoAt >= RAILGUN_MERKLETREE_STALL_MS) break\n }\n if (walked !== 'done') {\n const rows = snapshotRows(args.walletId, args.chainId)\n const balances = rows.length > 0 ? rows : previous\n const record = railgunScanRecord('failed', balances.length, false)\n return publishScan(args.chainId, record.scanStatus, balances, false, record.notes)\n }\n notesFinished = true\n historyFinished = true\n }\n if (!historyFinished) {\n armScanWait()\n const retry = wallet.refreshBalances(chain, [args.walletId]).then(\n () => 'returned' as const,\n () => 'returned' as const,\n )\n const retried = await Promise.race([\n scanSettled,\n retry,\n delay(RAILGUN_CATCH_UP_MS).then(() => 'catch-up-timeout' as const),\n ])\n if (retried !== 'done' && !notesFinished) {\n const rows = snapshotRows(args.walletId, args.chainId)\n const balances = rows.length > 0 ? rows : previous\n const record = railgunScanRecord('failed', balances.length, false)\n return publishScan(args.chainId, record.scanStatus, balances, false, record.notes)\n }\n }\n // Complete is the note decrypt. The TXID walk after it can move a shield to spendable.\n // It must not keep the saved balance on the pre-scan amount after the notes are already scanned.\n const decrypted = snapshotRows(args.walletId, args.chainId)\n publishLiveBalances()\n const refreshed = await Promise.race([\n refresh.then(() => true),\n delay(RAILGUN_TXID_WAIT_AFTER_NOTES_MS).then(() => false),\n ])\n if (!refreshed) {\n await Promise.race([refresh.then(() => undefined), delay(RAILGUN_CATCH_UP_MS).then(() => undefined)])\n }\n // The history walk reads the chain height once. A shield mined after that is a short second pass.\n sawUtxoEvent = false\n armScanWait()\n const followUpStarted = Date.now()\n const followUp = wallet.refreshBalances(chain, [args.walletId]).then(\n () => 'returned' as const,\n () => 'returned' as const,\n )\n let followStatus: 'done' | 'failed' | 'returned' | 'quiet' | 'catch-up-timeout' = await Promise.race([\n scanSettled,\n followUp,\n delay(RAILGUN_RESCAN_QUIET_MS).then(() => 'quiet' as const),\n delay(RAILGUN_CATCH_UP_MS).then(() => 'catch-up-timeout' as const),\n ])\n if ((followStatus === 'quiet' || followStatus === 'returned') && sawUtxoEvent) {\n const remaining = Math.max(0, RAILGUN_CATCH_UP_MS - (Date.now() - followUpStarted))\n followStatus = await Promise.race([\n scanSettled,\n delay(remaining).then(() => 'catch-up-timeout' as const),\n ])\n }\n const caughtUp = followStatus === 'done' || (followStatus === 'quiet' && !sawUtxoEvent)\n const balances = balancesToKeepAfterNoteScan(decrypted, snapshotRows(args.walletId, args.chainId), previous)\n const record = railgunScanRecord('done', balances.length, caughtUp)\n return publishScan(args.chainId, record.scanStatus, balances, refreshed && caughtUp, record.notes || undefined)\n } finally {\n utxoListeners.delete(listener)\n balanceListeners.delete(onBalance)\n }\n}\n\nconst SPEND_DECRYPT_WAIT_MS = 3 * 60 * 1000\n\nexport const RAILGUN_SPEND_SCAN_STOPPED =\n 'The spending wallet did not finish scanning private notes.'\n\n/**\n * History complete is emitted at 100% after this wallet's notes are decrypted.\n * The decrypt-complete wallet event is deferred until after that, so 100% is the\n * signal to build the proof. Give up only when leaves stop arriving before then.\n */\nexport function spendingScanReadyAfterHistory(progress: number, scanStatus: string): boolean {\n return progress >= 1 || utxoScanTerminalStatus(scanStatus) === 'done'\n}\n\nexport function spendingNoteScanGaveUp(args: {\n walletReady: boolean\n sawProgress: boolean\n notesFinished: boolean\n msSinceProgress: number\n msWaitingForDecrypt: number | null\n}): boolean {\n if (args.walletReady || args.notesFinished) return false\n if (args.sawProgress) return args.msSinceProgress >= RAILGUN_MERKLETREE_STALL_MS\n if (args.msWaitingForDecrypt == null) return false\n return args.msWaitingForDecrypt >= SPEND_DECRYPT_WAIT_MS\n}\n\n/** Decrypt this spending wallet's notes before a proof. A view-only scan does not fill this wallet. */\nexport async function scanSpendingWalletNotes(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n}): Promise<void> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n await ensureRailgunProvider(args.chainId, rpcUrl)\n const wallet = await walletModule()\n const chain = { type: ChainType.EVM, id: args.chainId }\n await hookUtxoScans(wallet)\n let sawUtxoEvent = false\n let lastUtxoAt = Date.now()\n let notesFinished = false\n let walletReady = false\n const listener: UtxoScanListener = (event) => {\n if (event.chain.id !== args.chainId) return\n sawUtxoEvent = true\n lastUtxoAt = Date.now()\n if (spendingScanReadyAfterHistory(event.progress, event.scanStatus)) {\n notesFinished = true\n walletReady = true\n }\n args.onProgress?.(event.progress)\n }\n utxoListeners.add(listener)\n const listenForDecrypt = () => {\n wallet.awaitWalletScan(args.walletId, chain).then(\n () => {\n walletReady = true\n },\n () => {\n listenForDecrypt()\n },\n )\n }\n listenForDecrypt()\n let refreshSettled = false\n let refreshError: unknown = null\n void wallet.refreshBalances(chain, [args.walletId]).then(\n () => {\n refreshSettled = true\n },\n (err: unknown) => {\n refreshError = err\n refreshSettled = true\n },\n )\n let decryptWaitStarted: number | null = null\n try {\n while (!walletReady) {\n if (refreshError) throw refreshError\n const waitingForDecrypt =\n notesFinished || (!sawUtxoEvent && refreshSettled) ? (decryptWaitStarted ??= Date.now()) : null\n if (waitingForDecrypt == null) decryptWaitStarted = null\n if (\n spendingNoteScanGaveUp({\n walletReady,\n sawProgress: sawUtxoEvent,\n notesFinished,\n msSinceProgress: Date.now() - lastUtxoAt,\n msWaitingForDecrypt: waitingForDecrypt == null ? null : Date.now() - waitingForDecrypt,\n })\n ) {\n throw new Error(RAILGUN_SPEND_SCAN_STOPPED)\n }\n await delay(250)\n }\n } finally {\n utxoListeners.delete(listener)\n }\n}\n\nexport async function scanRailgunPrivateBalances(args: {\n chainId: number\n rpcUrl: string\n walletId: string\n onProgress?: (progress: number) => void\n onBalances?: (balances: RailgunPrivateBalanceRow[]) => void\n}): Promise<{ scanStatus: RailgunScanStatus; balances: RailgunPrivateBalanceRow[]; settled: boolean; notes: string }> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) throw new Error('rpcUrl is required.')\n const key = `${args.chainId}:${args.walletId}`\n const existing = scansInFlight.get(key)\n if (existing) return existing\n const run = scanRailgunPrivateBalancesOnce({ ...args, rpcUrl }).finally(() => {\n if (scansInFlight.get(key) === run) scansInFlight.delete(key)\n })\n scansInFlight.set(key, run)\n return run\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 './fees.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: {\n type: 'string',\n required: false,\n description: 'Recipient 0zk address. Omit when toContactName is set.',\n },\n toContactName: {\n type: 'string',\n required: false,\n description: 'Address-book contact name. Uses that contact’s saved 0zk address, not their Ethereum address.',\n },\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"]}
|