{"version":3,"sources":["../src/index.ts","../src/abis/ERC20Abi.ts","../src/abis/Factory.json","../src/abis/FactoryAbi.ts","../src/abis/Deposit.json","../src/abis/VaultAbi.ts","../src/abis/WETHAbi.ts","../src/config/tokens.ts","../src/config/chains.ts","../src/config/contracts.ts","../src/config/environments.ts","../src/core/SurfClient.ts","../src/core/EventEmitter.ts","../src/utils/errors.ts","../src/services/HttpClient.ts","../src/services/AuthService.ts","../src/services/FactoryService.ts","../src/services/TokenService.ts","../src/services/VaultApiService.ts","../src/services/VaultService.ts","../src/utils/amounts.ts","../src/wallets/BaseWalletAdapter.ts","../src/wallets/CoinbaseAdapter.ts","../src/wallets/InjectedAdapter.ts","../src/wallets/MetaMaskAdapter.ts","../src/wallets/PhantomAdapter.ts","../src/wallets/RabbyAdapter.ts","../src/wallets/TrustWalletAdapter.ts","../src/wallets/WalletConnectAdapter.ts","../src/utils/validation.ts","../src/core/SurfClientBuilder.ts"],"sourcesContent":["export * from \"./abis\";\nexport * from \"./config\";\nexport * from \"./core/SurfClient\";\nexport * from \"./core/SurfClientBuilder\";\nexport * from \"./core/EventEmitter\";\nexport * from \"./services/AuthService\";\nexport * from \"./services/FactoryService\";\nexport * from \"./services/HttpClient\";\nexport * from \"./services/TokenService\";\nexport * from \"./services/VaultApiService\";\nexport * from \"./services/VaultService\";\nexport * from \"./types\";\nexport * from \"./utils/amounts\";\nexport * from \"./utils/errors\";\nexport * from \"./utils/validation\";\nexport * from \"./wallets\";\n","export const ERC20Abi = [\n  \"function approve(address spender, uint256 amount) returns (bool)\",\n  \"function allowance(address owner, address spender) view returns (uint256)\",\n  \"function balanceOf(address owner) view returns (uint256)\",\n  \"function decimals() view returns (uint8)\",\n] as const;\n","[\n  {\n    \"type\": \"function\",\n    \"name\": \"deployVault\",\n    \"inputs\": [\n      { \"name\": \"vaultOwner\", \"type\": \"address\" },\n      { \"name\": \"salt\", \"type\": \"bytes32\" }\n    ],\n    \"outputs\": [{ \"name\": \"vaultAddress\", \"type\": \"address\" }],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"deployVaultWithNonce\",\n    \"inputs\": [\n      { \"name\": \"vaultOwner\", \"type\": \"address\" },\n      { \"name\": \"nonce\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [\n      { \"name\": \"vaultAddress\", \"type\": \"address\" },\n      { \"name\": \"salt\", \"type\": \"bytes32\" }\n    ],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"computeVaultAddress\",\n    \"inputs\": [\n      { \"name\": \"vaultOwner\", \"type\": \"address\" },\n      { \"name\": \"salt\", \"type\": \"bytes32\" }\n    ],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"address\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"generateDeterministicSalt\",\n    \"inputs\": [\n      { \"name\": \"vaultOwner\", \"type\": \"address\" },\n      { \"name\": \"nonce\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"bytes32\" }],\n    \"stateMutability\": \"pure\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getOwnerVaults\",\n    \"inputs\": [{ \"name\": \"vaultOwner\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"address[]\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getOwnerVaultCount\",\n    \"inputs\": [{ \"name\": \"vaultOwner\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"isVaultFromFactory\",\n    \"inputs\": [{ \"name\": \"vault\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"bool\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"VaultDeployed\",\n    \"inputs\": [\n      { \"name\": \"vaultAddress\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"owner\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"salt\", \"type\": \"bytes32\", \"indexed\": false }\n    ]\n  }\n]\n","import factoryAbi from \"./Factory.json\";\n\nexport const FactoryAbi = factoryAbi;\n","[\n  {\n    \"type\": \"function\",\n    \"name\": \"initialDeposit\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\" },\n      { \"name\": \"vault\", \"type\": \"address\" },\n      { \"name\": \"amount\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"userDeposit\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\" },\n      { \"name\": \"amount\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"withdraw\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\" },\n      { \"name\": \"amount\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getPortfolioSummary\",\n    \"inputs\": [],\n    \"outputs\": [\n      { \"name\": \"assets\", \"type\": \"address[]\" },\n      { \"name\": \"deposited\", \"type\": \"uint256[]\" },\n      { \"name\": \"currentValues\", \"type\": \"uint256[]\" },\n      { \"name\": \"profits\", \"type\": \"int256[]\" },\n      { \"name\": \"activeCount\", \"type\": \"uint256\" }\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAssetVaultBalance\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAssetVaultAssets\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAssetProfit\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"int256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAssetProfitPercentage\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"int256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAllowedAssets\",\n    \"inputs\": [],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"address[]\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getTokenBalance\",\n    \"inputs\": [{ \"name\": \"token\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getFeeInfo\",\n    \"inputs\": [],\n    \"outputs\": [\n      { \"name\": \"_revenueAddress\", \"type\": \"address\" },\n      { \"name\": \"_feePercentage\", \"type\": \"uint256\" },\n      { \"name\": \"_rebalanceFeePercentage\", \"type\": \"uint256\" },\n      { \"name\": \"_merklClaimFeePercentage\", \"type\": \"uint256\" }\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAssetAvailableVaults\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"address[]\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"owner\",\n    \"inputs\": [],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"address\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"assetTotalDeposited\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"assetHasInitialDeposit\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"bool\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"assetToVault\",\n    \"inputs\": [{ \"name\": \"asset\", \"type\": \"address\" }],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"address\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"bridgeNonce\",\n    \"inputs\": [],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"assetBridgedOut\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\" },\n      { \"name\": \"destChainId\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"assetBridgedIn\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\" },\n      { \"name\": \"srcChainId\", \"type\": \"uint256\" }\n    ],\n    \"outputs\": [{ \"name\": \"\", \"type\": \"uint256\" }],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"InitialDeposit\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"vault\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"amount\", \"type\": \"uint256\", \"indexed\": false }\n    ]\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"UserDeposit\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"vault\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"amount\", \"type\": \"uint256\", \"indexed\": false }\n    ]\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"Withdrawal\",\n    \"inputs\": [\n      { \"name\": \"asset\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"vault\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"recipient\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"amount\", \"type\": \"uint256\", \"indexed\": false }\n    ]\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"BridgeWithdraw\",\n    \"inputs\": [\n      { \"name\": \"nonce\", \"type\": \"uint256\", \"indexed\": true },\n      { \"name\": \"asset\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"amount\", \"type\": \"uint256\", \"indexed\": false },\n      { \"name\": \"spent\", \"type\": \"uint256\", \"indexed\": false },\n      { \"name\": \"bridgeRouter\", \"type\": \"address\", \"indexed\": false },\n      { \"name\": \"destChainId\", \"type\": \"uint256\", \"indexed\": false },\n      { \"name\": \"feeAmount\", \"type\": \"uint256\", \"indexed\": false }\n    ]\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"BridgeDepositAcknowledged\",\n    \"inputs\": [\n      { \"name\": \"nonce\", \"type\": \"uint256\", \"indexed\": true },\n      { \"name\": \"asset\", \"type\": \"address\", \"indexed\": true },\n      { \"name\": \"amount\", \"type\": \"uint256\", \"indexed\": false },\n      { \"name\": \"srcChainId\", \"type\": \"uint256\", \"indexed\": false }\n    ]\n  }\n]\n","import vaultAbi from \"./Deposit.json\";\n\nexport const VaultAbi = vaultAbi;\n","export const WETHAbi = [\n  \"function deposit() payable\",\n  \"function withdraw(uint256 amount)\",\n  \"function balanceOf(address owner) view returns (uint256)\",\n] as const;\n","import type { TokenConfig } from \"../types\";\n\nexport const ETHEREUM_MAINNET_TOKENS: TokenConfig[] = [\n  {\n    symbol: \"USDC\",\n    address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n    decimals: 6,\n    vaultAddresses: [],\n  },\n  {\n    symbol: \"WETH\",\n    address: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n    decimals: 18,\n    vaultAddresses: [],\n  },\n];\n\nexport const POLYGON_MAINNET_TOKENS: TokenConfig[] = [\n  {\n    symbol: \"USDC\",\n    address: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n    decimals: 6,\n    vaultAddresses: [\n      \"0xAcB0DCe4b0FF400AD8F6917f3ca13E434C9ed6bC\"\n    ],\n  },\n];\n\nexport const BASE_MAINNET_TOKENS: TokenConfig[] = [\n  {\n    symbol: \"USDC\",\n    address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n    decimals: 6,\n    vaultAddresses: [\n      \"0xcdDCDd18A16ED441F6CB10c3909e5e7ec2B9e8f3\",\n      \"0x1D3b1Cd0a0f242d598834b3F2d126dC6bd774657\",\n      \"0x5435BC53f2C61298167cdB11Cdf0Db2BFa259ca0\",\n      \"0x23479229e52Ab6aaD312D0B03DF9F33B46753B5e\",\n      \"0xef417a2512C5a41f69AE4e021648b69a7CdE5D03\",\n      \"0x12AFDeFb2237a5963e7BAb3e2D46ad0eee70406e\",\n      \"0xE74c499fA461AF1844fCa84204490877787cED56\",\n      \"0x75e1A1f9535C01CDcE25E51ea4aFF0d171337E1F\",\n      \"0xBEEFE94c8aD530842bfE7d8B397938fFc1cb83b2\",\n      \"0xeE8F4eC5672F09119b96Ab6fB59C27E1b7e44b61\",\n      \"0x236919F11ff9eA9550A4287696C2FC9e18E6e890\",\n      \"0x43e623Ff7D14d5b105F7bE9c488F36dbF11D1F46\",\n      \"0xBEEFA7B88064FeEF0cEe02AAeBBd95D30df3878F\",\n      \"0xbeeF010f9cb27031ad51e3333f9aF9C6B1228183\",\n      \"0x616a4E1db48e22028f6bbf20444Cd3b8e3273738\",\n      \"0x1401d1271C47648AC70cBcdfA3776D4A87CE006B\",\n      \"0xc0c5689e6f4D256E861F65465b691aeEcC0dEb12\",\n      \"0x7BfA7C4f149E7415b73bdeDfe609237e29CBF34A\",\n      \"0xc1256Ae5FF1cf2719D4937adb3bbCCab2E00A2Ca\",\n      \"0xCd347c1e7d600a9A3e403497562eDd0A7Bc3Ef21\",\n      \"0xCBeeF01994E24a60f7DCB8De98e75AD8BD4Ad60d\",\n      \"0xB7890CEE6CF4792cdCC13489D36D9d42726ab863\",\n      \"0x8773447e6369472D9B72f064Ea62e405216E9084\",\n    ],\n  },\n  {\n    symbol: \"WETH\",\n    address: \"0x4200000000000000000000000000000000000006\",\n    decimals: 18,\n    vaultAddresses: [\n      \"0x5A32099837D89E3a794a44fb131CBbAD41f87a8C\",\n      \"0x09832347586E238841F49149C84d121Bc2191C53\",\n      \"0x27D8c7273fd3fcC6956a0B370cE5Fd4A7fc65c18\",\n      \"0xa0E430870c4604CcfC7B38Ca7845B1FF653D0ff1\",\n      \"0xbEEf050a7485865A7a8d8Ca0CC5f7536b7a3443e\",\n      \"0x1D795E29044A62Da42D927c4b179269139A28A6B\",\n      \"0x6b13c060F13Af1fdB319F52315BbbF3fb1D88844\",\n    ],\n  },\n  {\n    symbol: \"cbBTC\",\n    address: \"0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf\",\n    decimals: 8,\n    vaultAddresses: [\n      \"0x543257eF2161176D7C8cD90BA65C2d4CaEF5a796\",\n      \"0x6770216aC60F634483Ec073cBABC4011c94307Cb\",\n      \"0x5a47C803488FE2BB0A0EAaf346b420e4dF22F3C7\",\n    ],\n  },\n];\n","import type { ChainConfig, Environment } from \"../types\";\nimport { BASE_MAINNET_TOKENS, ETHEREUM_MAINNET_TOKENS, POLYGON_MAINNET_TOKENS } from \"./tokens\";\n\nexport const DEFAULT_CHAIN_IDS: Record<Environment, number> = {\n  mainnet: 8453,\n  testnet: 84532,\n};\n\nexport const CHAIN_REGISTRIES: Record<Environment, Record<number, ChainConfig>> = {\n  mainnet: {\n    8453: {\n      environment: \"mainnet\",\n      chainId: 8453,\n      name: \"Base\",\n      rpcUrl: \"https://mainnet.base.org\",\n      factoryAddress: \"0x8fa50DeA8DB10987D7d22ac092001c3613C18779\",\n      wethAddress: \"0x4200000000000000000000000000000000000006\",\n      blockExplorerUrl: \"https://basescan.org\",\n      tokens: BASE_MAINNET_TOKENS,\n    },\n    137: {\n      environment: \"mainnet\",\n      chainId: 137,\n      name: \"Polygon\",\n      rpcUrl: \"https://polygon-bor-rpc.publicnode.com\",\n      factoryAddress: \"0x8fa50DeA8DB10987D7d22ac092001c3613C18779\",\n      wethAddress: \"0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619\",\n      blockExplorerUrl: \"https://polygonscan.com\",\n      tokens: POLYGON_MAINNET_TOKENS,\n    },\n    1: {\n      environment: \"mainnet\",\n      chainId: 1,\n      name: \"Ethereum\",\n      rpcUrl: \"https://ethereum-rpc.publicnode.com\",\n      factoryAddress: \"0x8fa50DeA8DB10987D7d22ac092001c3613C18779\",\n      wethAddress: \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\",\n      blockExplorerUrl: \"https://etherscan.io\",\n      tokens: ETHEREUM_MAINNET_TOKENS,\n    },\n  },\n  testnet: {\n    84532: {\n      environment: \"testnet\",\n      chainId: 84532,\n      name: \"Base Sepolia\",\n      rpcUrl: \"\",\n      factoryAddress: \"0x0000000000000000000000000000000000000000\",\n      wethAddress: \"0x0000000000000000000000000000000000000000\",\n      blockExplorerUrl: \"https://sepolia.basescan.org\",\n      tokens: [],\n    },\n  },\n};\n","import type { Address, Environment } from \"../types\";\nimport { CHAIN_REGISTRIES } from \"./chains\";\n\nexport function getFactoryAddress(\n  environment: Environment,\n  chainId: number,\n): Address {\n  const chain = CHAIN_REGISTRIES[environment][chainId];\n  if (!chain) {\n    throw new Error(`Unknown chain ${chainId} for ${environment}`);\n  }\n  return chain.factoryAddress;\n}\n\nexport function getWethAddress(\n  environment: Environment,\n  chainId: number,\n): Address {\n  const chain = CHAIN_REGISTRIES[environment][chainId];\n  if (!chain) {\n    throw new Error(`Unknown chain ${chainId} for ${environment}`);\n  }\n  return chain.wethAddress;\n}\n","import type { ChainConfig, Environment } from \"../types\";\nimport { CHAIN_REGISTRIES, DEFAULT_CHAIN_IDS } from \"./chains\";\n\nexport function cloneRegistries(): Record<Environment, Record<number, ChainConfig>> {\n  return {\n    mainnet: Object.fromEntries(\n      Object.entries(CHAIN_REGISTRIES.mainnet).map(([chainId, config]) => [\n        Number(chainId),\n        { ...config, tokens: [...config.tokens] },\n      ]),\n    ),\n    testnet: Object.fromEntries(\n      Object.entries(CHAIN_REGISTRIES.testnet).map(([chainId, config]) => [\n        Number(chainId),\n        { ...config, tokens: [...config.tokens] },\n      ]),\n    ),\n  };\n}\n\nexport function getDefaultChainId(environment: Environment): number {\n  return DEFAULT_CHAIN_IDS[environment];\n}\n","import {\n  JsonRpcProvider,\n  getAddress,\n  parseUnits,\n  type ContractRunner,\n  type Provider,\n  type TransactionResponse,\n} from \"ethers\";\nimport type {\n  Address,\n  AgentMessagesResult,\n  AuthState,\n  BestVaultOption,\n  ChainConfig,\n  DepositParams,\n  DeployVaultResult,\n  FeeInfo,\n  IWalletAdapter,\n  PortfolioSummary,\n  RefreshResult,\n  ResolvedSurfConfig,\n  SurfClientOptions,\n  SurfEventMap,\n  SupportedAsset,\n  TokenConfig,\n  TransactionResult,\n  VaultInfo,\n  WalletName,\n  WalletState,\n  WithdrawParams,\n} from \"../types\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { HttpClient } from \"../services/HttpClient\";\nimport { AuthService } from \"../services/AuthService\";\nimport { FactoryService } from \"../services/FactoryService\";\nimport { TokenService } from \"../services/TokenService\";\nimport { VaultApiService } from \"../services/VaultApiService\";\nimport { VaultService } from \"../services/VaultService\";\nimport { addApprovalBuffer, parseTokenAmount } from \"../utils/amounts\";\nimport { SurfError, SurfErrorCode } from \"../utils/errors\";\nimport { SurfClientBuilder } from \"./SurfClientBuilder\";\n\nexport class SurfClient {\n  static create(config: import(\"../types\").SurfConfig): SurfClient {\n    const builder = new SurfClientBuilder();\n    if (config.projectName && (config.appId ?? config.projectId)) {\n      builder.setProject(config.projectName, config.appId ?? config.projectId!);\n    }\n\n    if (config.environment) {\n      builder.setEnvironment(config.environment);\n    }\n    if (config.appId) {\n      builder.setAppId(config.appId);\n    }\n    if (config.chainId !== undefined) {\n      builder.setChain(config.chainId);\n    }\n    if (config.rpcUrl) {\n      builder.setRpcUrl(config.rpcUrl);\n    }\n    if (config.apiBaseUrl) {\n      builder.setApiBaseUrl(config.apiBaseUrl);\n    }\n    if (config.factoryAddress) {\n      builder.setFactoryAddress(config.factoryAddress);\n    }\n    if (config.autoApprove !== undefined) {\n      builder.setAutoApprove(config.autoApprove);\n    }\n    if (config.logger) {\n      builder.setLogLevel(config.logger);\n    }\n\n    return builder.build();\n  }\n\n  static builder(): SurfClientBuilder {\n    return new SurfClientBuilder();\n  }\n\n  private readonly events = new EventEmitter<SurfEventMap>();\n  private readonly authState: AuthState = {\n    token: null,\n    address: null,\n    authenticated: false,\n    user: null,\n  };\n  private readonly config: ResolvedSurfConfig;\n  private readonly registries: SurfClientOptions[\"registries\"];\n  private readonly walletAdapters: Map<string, IWalletAdapter>;\n  private readonly httpClient: HttpClient;\n  private readonly authService: AuthService;\n  private readonly vaultApiService: VaultApiService;\n  private readonly tokenService = new TokenService();\n  private readonly factoryService = new FactoryService();\n  private readonly vaultService = new VaultService();\n  private readProvider: Provider;\n  private activeWalletAdapter: IWalletAdapter | null = null;\n  private walletState: WalletState | null = null;\n\n  constructor(options: SurfClientOptions) {\n    this.config = options.config;\n    this.registries = options.registries;\n    this.walletAdapters = options.walletAdapters;\n    this.httpClient = new HttpClient({\n      baseUrl: this.config.apiBaseUrl,\n      projectName: this.config.projectName,\n      projectId: this.config.projectId,\n      appId: this.config.appId,\n    });\n    this.authService = new AuthService(this.httpClient);\n    this.vaultApiService = new VaultApiService(this.httpClient);\n    this.readProvider = new JsonRpcProvider(this.config.rpcUrl);\n  }\n\n  on<K extends keyof SurfEventMap>(\n    event: K,\n    handler: (data: SurfEventMap[K]) => void,\n  ): void {\n    this.events.on(event, handler);\n  }\n\n  off<K extends keyof SurfEventMap>(\n    event: K,\n    handler: (data: SurfEventMap[K]) => void,\n  ): void {\n    this.events.off(event, handler);\n  }\n\n  /**\n   * Validates the configured `appId` against the backend by calling\n   * `GET /api/sdk/public/overview` with the `x-app-id` header. A 2xx response means\n   * the appId is valid and returns the overview payload. Call this during client\n   * setup (appId is required). Throws `SurfError(INVALID_APP_ID)` if the appId is\n   * missing or rejected by the backend.\n   */\n  async verifyApp(): Promise<unknown> {\n    const appId = this.config.appId;\n    if (!appId) {\n      throw new SurfError(SurfErrorCode.MISSING_PROJECT_ID, \"appId is required\");\n    }\n    try {\n      return await this.httpClient.get(\"/api/sdk/public/overview\", { \"x-app-id\": appId });\n    } catch (error) {\n      throw new SurfError(\n        SurfErrorCode.INVALID_APP_ID,\n        `App ID \"${appId}\" is not valid`,\n        error,\n      );\n    }\n  }\n\n  async connectWallet(walletName: WalletName | string): Promise<WalletState> {\n    const adapter = this.walletAdapters.get(walletName);\n    if (!adapter) {\n      throw new SurfError(\n        SurfErrorCode.WALLET_NOT_INSTALLED,\n        `Wallet adapter ${walletName} is not registered`,\n      );\n    }\n\n    // Disconnect any previously active adapter to clear stale listeners\n    if (this.activeWalletAdapter && this.activeWalletAdapter !== adapter) {\n      await this.activeWalletAdapter.disconnect();\n    }\n\n    const walletState = await adapter.connect(this.config.chainId);\n    this.activeWalletAdapter = adapter;\n    this.walletState = walletState;\n\n    adapter.onAccountsChanged((accounts) => {\n      const next = accounts[0];\n      if (!next || !this.walletState) {\n        return;\n      }\n      const oldAddress = this.walletState.address;\n      const newAddress = getAddress(next) as Address;\n      this.walletState = {\n        ...this.walletState,\n        address: newAddress,\n      };\n      this.events.emit(\"wallet:accountChanged\", {\n        oldAddress,\n        newAddress,\n      });\n    });\n\n    adapter.onChainChanged((chainId) => {\n      if (this.walletState) {\n        this.walletState = { ...this.walletState, chainId };\n      }\n      this.events.emit(\"wallet:chainChanged\", { chainId });\n    });\n\n    adapter.onDisconnect(() => {\n      this.walletState = null;\n      this.activeWalletAdapter = null;\n      this.events.emit(\"wallet:disconnected\", undefined);\n    });\n\n    this.events.emit(\"wallet:connected\", walletState);\n    return walletState;\n  }\n\n  async disconnectWallet(): Promise<void> {\n    await this.activeWalletAdapter?.disconnect();\n    this.activeWalletAdapter = null;\n    this.walletState = null;\n    this.events.emit(\"wallet:disconnected\", undefined);\n  }\n\n  getWalletState(): WalletState | null {\n    return this.walletState;\n  }\n\n  /**\n   * Switches the SDK's active chain (and the connected wallet, if any). After this,\n   * all reads/writes target `chainId`: `config.chainId`, the read provider, the\n   * factory address, and the token list are updated from the chain registry.\n   *\n   * The chain must be registered for the active environment, else `UNSUPPORTED_CHAIN`.\n   * Auth is unaffected (the cookie session is per-wallet, not per-chain). Note: any\n   * custom `rpcUrl`/`factoryAddress` set at creation is replaced by the target chain's\n   * registry values (a single override can't serve multiple chains).\n   */\n  async switchChain(chainId: number): Promise<void> {\n    const chain = this.registries[this.config.environment][chainId];\n    if (!chain) {\n      throw new SurfError(\n        SurfErrorCode.UNSUPPORTED_CHAIN,\n        `Chain ${chainId} is not configured for ${this.config.environment}`,\n      );\n    }\n\n    // Switch the connected wallet too (if any); read-only clients can switch without one.\n    if (this.activeWalletAdapter) {\n      await this.activeWalletAdapter.switchChain(chainId);\n      if (this.walletState) {\n        this.walletState = { ...this.walletState, chainId };\n      }\n    }\n\n    // Re-point the SDK's active chain at the target chain's registry values.\n    this.config.chainId = chainId;\n    this.config.rpcUrl = chain.rpcUrl;\n    this.config.factoryAddress = chain.factoryAddress;\n    this.readProvider = new JsonRpcProvider(chain.rpcUrl);\n\n    this.events.emit(\"wallet:chainChanged\", { chainId });\n  }\n\n  registerWalletAdapter(name: string, adapter: IWalletAdapter): void {\n    this.walletAdapters.set(name, adapter);\n  }\n\n  async authenticate(): Promise<AuthState> {\n    const wallet = this.requireWallet();\n    const { message } = await this.authService.getNonce(wallet.address);\n    let signature: string;\n    try {\n      signature = await this.activeWalletAdapter!.signMessage(message);\n    } catch (error) {\n      throw new SurfError(\n        SurfErrorCode.SIGNATURE_REJECTED,\n        \"Failed to sign authentication message\",\n        error,\n      );\n    }\n\n    const login = await this.authService.login(\n      wallet.address,\n      message,\n      signature,\n    );\n    // The session token is delivered as an httpOnly cookie set by the backend\n    // (SameSite=None) and is sent automatically on subsequent requests via\n    // credentials: \"include\". The SDK no longer stores or reads it directly.\n    this.authState.token = null;\n    this.authState.address = wallet.address;\n    this.authState.user = login.user ?? this.authState.user;\n    this.authState.authenticated = true;\n    this.events.emit(\"auth:authenticated\", this.getAuthState());\n    return this.getAuthState();\n  }\n\n  getAuthState(): AuthState {\n    return { ...this.authState };\n  }\n\n  async logout(): Promise<void> {\n    this.authState.token = null;\n    this.authState.address = null;\n    this.authState.user = null;\n    this.authState.authenticated = false;\n    this.events.emit(\"auth:logout\", undefined);\n  }\n\n  /**\n   * Extends the session using the existing httpOnly auth cookie — no wallet\n   * signature required. Requires a currently-valid session cookie; throws\n   * `API_ERROR` (401) if the cookie is missing, expired, or already revoked.\n   * The backend rotates the cookie; the old token is invalidated immediately.\n   */\n  async refreshSession(): Promise<RefreshResult> {\n    return this.authService.refresh();\n  }\n\n  async getVault(walletAddress?: Address): Promise<VaultInfo> {\n    return this.vaultApiService.getVault(walletAddress ?? this.requireWallet().address);\n  }\n\n  async getSupportedAssets(chainId?: number): Promise<SupportedAsset[]> {\n    return this.vaultApiService.getSupportedAssets(chainId);\n  }\n\n  async getAgentMessages(\n    walletAddress?: Address,\n    page = 1,\n    limit = 20,\n    from?: string,\n    to?: string,\n  ): Promise<AgentMessagesResult> {\n    const address = walletAddress ?? this.requireWallet().address;\n    return this.vaultApiService.getAgentMessages(address, page, limit, from, to);\n  }\n\n  async deployVault(): Promise<DeployVaultResult> {\n    const wallet = this.requireWallet();\n    const existing = await this.getVault(wallet.address);\n\n    // Check if vault is already deployed on the current chain\n    const deployedOnCurrentChain = existing.assets?.some(\n      (a) => a.chainId === this.config.chainId && !!a.vaultAddress,\n    );\n    if (existing.exists && deployedOnCurrentChain) {\n      throw new SurfError(\n        SurfErrorCode.VAULT_ALREADY_EXISTS,\n        `Vault already deployed on chain ${this.config.chainId} at ${existing.userVaultAddress}`,\n      );\n    }\n\n    // If vault exists on another chain, reuse existing salt; otherwise prepare a new one\n    const isNewVault = !existing.exists || !existing.deploymentSalt;\n    let salt: string;\n\n    if (isNewVault) {\n      const prepared = await this.vaultApiService.prepare(this.config.chainId);\n      salt = prepared.salt;\n\n      const signer = await this.getSignerRunner();\n      const predictedVaultAddress = await this.factoryService.computeVaultAddress(\n        this.config.factoryAddress,\n        wallet.address,\n        salt,\n        signer,\n      );\n\n      const chainPrediction = prepared.predictions.find(\n        (prediction) => prediction.chainId === this.config.chainId,\n      );\n\n      if (\n        chainPrediction &&\n        predictedVaultAddress.toLowerCase() !== chainPrediction.predictedVaultAddress.toLowerCase()\n      ) {\n        throw new SurfError(\n          SurfErrorCode.VAULT_DEPLOY_FAILED,\n          `Backend predicted vault address does not match factory computation: chain predicted: ${predictedVaultAddress} :: backend predicted: ${chainPrediction?.predictedVaultAddress}`,\n        );\n      }\n    } else {\n      salt = existing.deploymentSalt!;\n    }\n\n    const signer = await this.getSignerRunner();\n    const predictedVaultAddress = await this.factoryService.computeVaultAddress(\n      this.config.factoryAddress,\n      wallet.address,\n      salt,\n      signer,\n    );\n\n    const deployOverrides = await this.getGasOverrides();\n    // Pre-estimate the gas limit via the read provider (see estimateWriteGas) so the wallet\n    // doesn't re-estimate against stale state and fail.\n    const readFactory = this.factoryService.contract(\n      this.config.factoryAddress,\n      this.getReadRunner(),\n    );\n    const deployGasLimit = await this.estimateWriteGas(readFactory, \"deployVault\", [\n      wallet.address,\n      salt,\n    ]);\n    const tx = await this.factoryService.deployVault(\n      this.config.factoryAddress,\n      wallet.address,\n      salt,\n      signer,\n      deployGasLimit !== undefined\n        ? { ...deployOverrides, gasLimit: deployGasLimit }\n        : deployOverrides,\n    );\n    const receipt = await tx.wait();\n\n    if (!receipt) {\n      throw new SurfError(\n        SurfErrorCode.TRANSACTION_FAILED,\n        \"Vault deployment transaction did not return a receipt\",\n      );\n    }\n\n    // Only confirm with backend for first-time deployment\n    if (isNewVault) {\n      await this.vaultApiService.confirm({\n        userVaultAddress: predictedVaultAddress,\n        homeChainId: this.config.chainId,\n        deploymentSalt: salt,\n        initialAssets: [],\n      });\n    }\n\n    const result = {\n      vaultAddress: predictedVaultAddress,\n      transactionHash: tx.hash,\n      salt,\n    };\n\n    this.events.emit(\"vault:deployed\", result);\n\n    return result;\n  }\n\n  async getOwnerVaults(owner?: Address): Promise<string[]> {\n    return this.factoryService.getOwnerVaults(\n      this.config.factoryAddress,\n      owner ?? this.requireWallet().address,\n      this.getReadRunner(),\n    );\n  }\n\n  async getOwnerVaultCount(owner?: Address): Promise<number> {\n    return this.factoryService.getOwnerVaultCount(\n      this.config.factoryAddress,\n      owner ?? this.requireWallet().address,\n      this.getReadRunner(),\n    );\n  }\n\n  async isVaultFromFactory(vaultAddress: string): Promise<boolean> {\n    return this.factoryService.isVaultFromFactory(\n      this.config.factoryAddress,\n      vaultAddress,\n      this.getReadRunner(),\n    );\n  }\n\n  async deposit(params: DepositParams): Promise<TransactionResult> {\n    const token = this.resolveToken(params.asset);\n    const vaultAddress = await this.resolveVaultAddress(params.vaultAddress);\n    const signer = await this.getSignerRunner();\n    const overrides = await this.getGasOverrides();\n    let asset = token.address;\n\n    this.events.emit(\"deposit:started\", {\n      asset: params.asset,\n      amount: params.amount,\n    });\n\n    let amountWei = parseTokenAmount(params.amount, token.decimals);\n    if (params.wrapEth) {\n      const wrapTx = await this.tokenService.wrapNative(\n        amountWei,\n        this.getChainConfig().wethAddress,\n        signer,\n        overrides,\n      );\n      await wrapTx.wait();\n      asset = this.getChainConfig().wethAddress;\n    }\n\n    if (this.config.autoApprove) {\n      const owner = this.requireWallet().address;\n      const allowance = await this.tokenService.allowance(asset, owner, vaultAddress, signer);\n      if (allowance < amountWei) {\n        const approvalTx = await this.tokenService.approve(\n          asset,\n          vaultAddress,\n          addApprovalBuffer(amountWei),\n          signer,\n          overrides,\n        );\n        this.events.emit(\"deposit:approved\", {\n          asset,\n          txHash: approvalTx.hash,\n        });\n        await approvalTx.wait();\n        // The deposit's gas estimation can race the approval: if the estimating node hasn't\n        // yet observed the new allowance, the deposit's `transferFrom` reverts during\n        // estimateGas (require(false), no data). Wait until the allowance is actually visible\n        // before depositing.\n        await this.waitForAllowance(asset, owner, vaultAddress, amountWei);\n      }\n    }\n\n    const hasInitialDeposit = await this.vaultService.assetHasInitialDeposit(\n      vaultAddress,\n      asset,\n      signer,\n    );\n\n    // Resolve the Morpho vault for a first-time deposit up front so the gas pre-estimate below\n    // can include it.\n    const bestVault = hasInitialDeposit\n      ? undefined\n      : await this.resolveBestVault(token, params.bestVault, vaultAddress);\n\n    // Pre-estimate the gas limit via the read provider so the wallet doesn't re-estimate\n    // against stale post-approval state (the original require(false) revert). See\n    // estimateWriteGas.\n    const readVault = this.vaultService.contract(vaultAddress, this.getReadRunner());\n    const gasLimit = await this.estimateWriteGas(\n      readVault,\n      hasInitialDeposit ? \"userDeposit\" : \"initialDeposit\",\n      hasInitialDeposit ? [asset, amountWei] : [asset, bestVault, amountWei],\n    );\n    const txOverrides = gasLimit !== undefined ? { ...overrides, gasLimit } : overrides;\n\n    const tx = hasInitialDeposit\n      ? await this.vaultService.userDeposit(vaultAddress, asset, amountWei, signer, txOverrides)\n      : await this.vaultService.initialDeposit(\n          vaultAddress,\n          asset,\n          bestVault!,\n          amountWei,\n          signer,\n          txOverrides,\n        );\n\n    this.events.emit(\"deposit:completed\", {\n      asset,\n      amount: params.amount,\n      txHash: tx.hash,\n    });\n\n    return this.toTransactionResult(tx);\n  }\n\n  async getBestVault(assetSymbol: string): Promise<BestVaultOption[]> {\n    return this.vaultApiService.getBestVault(assetSymbol);\n  }\n\n  async hasInitialDeposit(asset: string, vaultAddress?: string): Promise<boolean> {\n    return this.vaultService.assetHasInitialDeposit(\n      await this.resolveVaultAddress(vaultAddress),\n      asset,\n      this.getReadRunner(),\n    );\n  }\n\n  async withdraw(params: WithdrawParams): Promise<TransactionResult> {\n    const vaultAddress = await this.resolveVaultAddress(params.vaultAddress);\n    const signer = await this.getSignerRunner();\n    const overrides = await this.getGasOverrides();\n    const amountString = params.amount ?? \"0\";\n    let amountWei = 0n;\n\n    if (params.amount && params.amount !== \"0\") {\n      const assetDecimals = await this.tokenService.decimals(\n        params.asset,\n        this.getReadRunner(),\n      );\n      amountWei = parseUnits(params.amount, assetDecimals);\n    }\n\n    this.events.emit(\"withdraw:started\", {\n      asset: params.asset,\n      amount: amountString,\n    });\n\n    // Pre-estimate the gas limit via the read provider so the wallet doesn't re-estimate\n    // against stale state (e.g. right after a deposit) and fail with \"missing revert data\".\n    // See estimateWriteGas.\n    const readVault = this.vaultService.contract(vaultAddress, this.getReadRunner());\n    const gasLimit = await this.estimateWriteGas(readVault, \"withdraw\", [params.asset, amountWei]);\n    const txOverrides = gasLimit !== undefined ? { ...overrides, gasLimit } : overrides;\n\n    const tx = await this.vaultService.withdraw(\n      vaultAddress,\n      params.asset,\n      amountWei,\n      signer,\n      txOverrides,\n    );\n\n    this.events.emit(\"withdraw:completed\", {\n      asset: params.asset,\n      amount: amountString,\n      txHash: tx.hash,\n    });\n\n    return this.toTransactionResult(tx);\n  }\n\n  async getWithdrawableAmount(asset: string, vaultAddress?: string): Promise<bigint> {\n    return this.vaultService.getAssetVaultAssets(\n      await this.resolveVaultAddress(vaultAddress),\n      asset,\n      this.getReadRunner(),\n    );\n  }\n\n  async getPortfolioSummary(vaultAddress?: string): Promise<PortfolioSummary> {\n    return this.vaultService.getPortfolioSummary(\n      await this.resolveVaultAddress(vaultAddress),\n      this.getReadRunner(),\n    );\n  }\n\n  async getAssetProfit(asset: string, vaultAddress?: string): Promise<bigint> {\n    return this.vaultService.getAssetProfit(\n      await this.resolveVaultAddress(vaultAddress),\n      asset,\n      this.getReadRunner(),\n    );\n  }\n\n  async getAssetProfitPercentage(asset: string, vaultAddress?: string): Promise<bigint> {\n    return this.vaultService.getAssetProfitPercentage(\n      await this.resolveVaultAddress(vaultAddress),\n      asset,\n      this.getReadRunner(),\n    );\n  }\n\n  async getTokenBalance(token: string, owner?: string): Promise<bigint> {\n    const holder = owner ?? this.requireWallet().address;\n    return this.tokenService.balanceOf(token, holder, this.getReadRunner());\n  }\n\n  async getAllowedAssets(vaultAddress?: string): Promise<string[]> {\n    return this.vaultService.getAllowedAssets(\n      await this.resolveVaultAddress(vaultAddress),\n      this.getReadRunner(),\n    );\n  }\n\n  async getFeeInfo(vaultAddress?: string): Promise<FeeInfo> {\n    return this.vaultService.getFeeInfo(\n      await this.resolveVaultAddress(vaultAddress),\n      this.getReadRunner(),\n    );\n  }\n\n  getConfig(): Readonly<ResolvedSurfConfig> {\n    return Object.freeze({ ...this.config });\n  }\n\n  getSupportedTokens(): TokenConfig[] {\n    return [...this.getChainConfig().tokens];\n  }\n\n  private getChainConfig(): ChainConfig {\n    const chain = this.registries[this.config.environment][this.config.chainId];\n    if (!chain) {\n      throw new SurfError(\n        SurfErrorCode.UNSUPPORTED_CHAIN,\n        `Chain ${this.config.chainId} is not configured for ${this.config.environment}`,\n      );\n    }\n    return chain;\n  }\n\n  private resolveToken(asset: string): TokenConfig {\n    const token = this.getChainConfig().tokens.find(\n      (candidate) => candidate.address.toLowerCase() === asset.toLowerCase(),\n    );\n\n    if (!token) {\n      throw new SurfError(\n        SurfErrorCode.INVALID_CONFIG,\n        `Asset ${asset} is not registered on chain ${this.config.chainId}`,\n      );\n    }\n\n    return token;\n  }\n\n  private async resolveBestVault(\n    token: TokenConfig,\n    bestVault: string | undefined,\n    vaultAddress: string,\n  ): Promise<string> {\n    if (bestVault) {\n      return bestVault;\n    }\n\n    const candidates = await this.vaultApiService.getBestVault(token.symbol);\n    const candidate = candidates.find((item) => item.chainId === this.config.chainId);\n    if (candidate) {\n      return candidate.vaultAddress;\n    }\n\n    const onChainCandidates = await this.vaultService.getAssetAvailableVaults(\n      vaultAddress,\n      token.address,\n      this.getReadRunner(),\n    );\n    if (onChainCandidates[0]) {\n      return onChainCandidates[0];\n    }\n\n    throw new SurfError(\n      SurfErrorCode.NO_BEST_VAULT,\n      `No best vault available for ${token.symbol}`,\n    );\n  }\n\n  private async resolveVaultAddress(vaultAddress?: string): Promise<string> {\n    if (vaultAddress) {\n      return vaultAddress;\n    }\n\n    const activeChain = this.config.chainId;\n    const vault = await this.getVault();\n\n    // The vault can be deployed at a different address per chain. Prefer the\n    // active chain's explicit `chainAddresses` entry (e.g. Ethereum).\n    const chainSpecific = vault.chainAddresses?.find(\n      (entry) => entry.chainId === activeChain,\n    )?.vaultAddress;\n    if (chainSpecific) {\n      return chainSpecific;\n    }\n\n    // Otherwise the vault lives at the canonical `userVaultAddress` — but only on\n    // chains where it is actually deployed (an asset on that chain carries a vault\n    // address). On a chain with no vault we must NOT fall back to userVaultAddress:\n    // that address has no contract there and would fail with ethers BAD_DATA.\n    const deployedOnActiveChain = vault.assets?.some(\n      (a) => a.chainId === activeChain && Boolean(a.vaultAddress),\n    );\n    if (deployedOnActiveChain && vault.userVaultAddress) {\n      return vault.userVaultAddress;\n    }\n\n    throw new SurfError(\n      SurfErrorCode.VAULT_NOT_FOUND,\n      `No vault deployed on chain ${activeChain} — deploy a vault on this chain first.`,\n    );\n  }\n\n  private requireWallet(): WalletState {\n    if (!this.walletState || !this.activeWalletAdapter) {\n      throw new SurfError(\n        SurfErrorCode.WALLET_NOT_CONNECTED,\n        \"Wallet connection is required for this operation\",\n      );\n    }\n    return this.walletState;\n  }\n\n  private async getSignerRunner(): Promise<ContractRunner> {\n    this.requireWallet();\n    return this.activeWalletAdapter!.getSigner();\n  }\n\n  private getReadRunner(): ContractRunner {\n    return this.readProvider;\n  }\n\n  // On Ethereum mainnet (chainId 1), set a low EIP-1559 fee (the \"Low\" tier) so the\n  // transaction costs as little as possible. `type: 2` is set explicitly: without it,\n  // wallets like MetaMask ignore dapp-supplied 1559 fees and substitute their own\n  // (\"market\") estimate. Other chains return no overrides (wallet/provider defaults).\n  private async getGasOverrides(): Promise<Record<string, unknown>> {\n    if (this.config.chainId !== 1) {\n      return {};\n    }\n    const fees = await this.getEthLowFees();\n    if (!fees) {\n      return {};\n    }\n    return {\n      type: 2,\n      maxPriorityFeePerGas: fees.maxPriorityFeePerGas,\n      maxFeePerGas: fees.maxFeePerGas,\n    };\n  }\n\n  // Low Ethereum fees, tuned to match a wallet's \"Low\" tier so our \"Site suggested\" values\n  // aren't higher than the wallet's own lowest option. The tip is the 10th-percentile\n  // priority fee from `eth_feeHistory` over recent blocks (floored so the tx stays\n  // includable). maxFeePerGas uses only 1.25x base-fee headroom (not the 2x EIP-1559\n  // \"survive 6 blocks\" default) — this is what MetaMask was displaying as a high \"max\" for\n  // site-suggested txs. Effective cost is still ~baseFee + tip; trade-off is that a sharp\n  // base-fee spike may delay mining (the same trade-off the wallet's Low tier makes). Falls\n  // back to the latest block's base fee + floor tip if feeHistory is unavailable.\n  private async getEthLowFees(): Promise<\n    { maxPriorityFeePerGas: bigint; maxFeePerGas: bigint } | null\n  > {\n    const FLOOR = 100_000_000n; // 0.1 gwei — minimum tip to remain includable\n    const rpc = this.readProvider as unknown as {\n      send(method: string, params: unknown[]): Promise<{ reward?: string[][]; baseFeePerGas?: string[] }>;\n    };\n    try {\n      // last 20 blocks, 10th-percentile reward per block\n      const history = await rpc.send(\"eth_feeHistory\", [\"0x14\", \"latest\", [10]]);\n      const baseFees = history.baseFeePerGas ?? [];\n      if (baseFees.length > 0) {\n        const tips = (history.reward ?? [])\n          .map((entry) => BigInt(entry?.[0] ?? \"0x0\"))\n          .filter((tip) => tip > 0n)\n          .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n        const median = tips.length ? tips[Math.floor(tips.length / 2)] : undefined;\n        let priorityFee = median ?? FLOOR;\n        if (priorityFee < FLOOR) {\n          priorityFee = FLOOR;\n        }\n        const baseFee = BigInt(baseFees[baseFees.length - 1] ?? \"0x0\");\n        return { maxPriorityFeePerGas: priorityFee, maxFeePerGas: (baseFee * 5n) / 4n + priorityFee };\n      }\n    } catch {\n      // fall through to the base-fee fallback below\n    }\n    try {\n      const block = await this.readProvider.getBlock(\"latest\");\n      const baseFee = block?.baseFeePerGas ?? 0n;\n      return { maxPriorityFeePerGas: FLOOR, maxFeePerGas: (baseFee * 5n) / 4n + FLOOR };\n    } catch {\n      return null;\n    }\n  }\n\n  // After an approval, the new allowance may not be immediately visible to every node. Poll\n  // the read provider until it reflects the approval (or a short budget elapses) so a\n  // following deposit doesn't gas-estimate against stale state and revert with require(false).\n  private async waitForAllowance(\n    asset: string,\n    owner: string,\n    spender: string,\n    min: bigint,\n  ): Promise<void> {\n    for (let attempt = 0; attempt < 8; attempt++) {\n      try {\n        const allowance = await this.tokenService.allowance(\n          asset,\n          owner,\n          spender,\n          this.getReadRunner(),\n        );\n        if (allowance >= min) {\n          return;\n        }\n      } catch {\n        // transient read error — retry\n      }\n      await new Promise((resolve) => setTimeout(resolve, 1_000));\n    }\n    // Proceed anyway: if the allowance is genuinely insufficient the deposit surfaces it.\n  }\n\n  // Estimate a write's gas limit via the read provider and hand it to the wallet, so the\n  // wallet doesn't re-estimate against stale state — the cause of the post-approval\n  // require(false)/no-data revert on first deposits. Scoped to Ethereum mainnet, where that\n  // race was seen and where the explicit low-fee overrides already apply. A small buffer is\n  // added so a slight state shift between estimate and mining can't cause out-of-gas (you\n  // still only pay for gas used). A genuine contract revert is re-thrown (retrying won't\n  // help); a transient/non-revert failure returns undefined so the wallet estimates itself.\n  private async estimateWriteGas(\n    contract: { [method: string]: { estimateGas: (...args: unknown[]) => Promise<bigint> } },\n    method: string,\n    args: unknown[],\n  ): Promise<bigint | undefined> {\n    if (this.config.chainId !== 1) {\n      return undefined;\n    }\n    try {\n      const from = this.requireWallet().address;\n      const gas = await contract[method]!.estimateGas(...args, { from });\n      return (gas * 12n) / 10n;\n    } catch (error) {\n      if (this.isContractRevert(error)) {\n        throw error;\n      }\n      return undefined;\n    }\n  }\n\n  private isContractRevert(error: unknown): boolean {\n    const e = error as {\n      code?: string;\n      data?: unknown;\n      shortMessage?: string;\n      message?: string;\n      info?: { error?: { data?: unknown } };\n      error?: { data?: unknown };\n    };\n    const data = e?.data ?? e?.info?.error?.data ?? e?.error?.data;\n    return (\n      e?.code === \"CALL_EXCEPTION\" ||\n      (typeof data === \"string\" && data.startsWith(\"0x\")) ||\n      /execution reverted|revert/i.test(String(e?.shortMessage ?? e?.message ?? \"\"))\n    );\n  }\n\n  private toTransactionResult(tx: TransactionResponse): TransactionResult {\n    return {\n      hash: tx.hash,\n      wait: () => tx.wait(),\n    };\n  }\n}\n","export class EventEmitter<EventMap extends Record<string, unknown>> {\n  private readonly listeners = new Map<\n    keyof EventMap,\n    Set<(payload: EventMap[keyof EventMap]) => void>\n  >();\n\n  on<K extends keyof EventMap>(\n    event: K,\n    handler: (payload: EventMap[K]) => void,\n  ): void {\n    const handlers = this.listeners.get(event) ?? new Set();\n    handlers.add(handler as (payload: EventMap[keyof EventMap]) => void);\n    this.listeners.set(event, handlers);\n  }\n\n  off<K extends keyof EventMap>(\n    event: K,\n    handler: (payload: EventMap[K]) => void,\n  ): void {\n    this.listeners.get(event)?.delete(\n      handler as (payload: EventMap[keyof EventMap]) => void,\n    );\n  }\n\n  emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n    this.listeners.get(event)?.forEach((handler) => {\n      try {\n        handler(payload);\n      } catch (error) {\n        console.error(`[SurfLiquid] Unhandled error in \"${String(event)}\" event handler:`, error);\n      }\n    });\n  }\n}\n","export enum SurfErrorCode {\n  INVALID_CONFIG = \"INVALID_CONFIG\",\n  MISSING_PROJECT_ID = \"MISSING_PROJECT_ID\",\n  INVALID_APP_ID = \"INVALID_APP_ID\",\n  INVALID_ENVIRONMENT = \"INVALID_ENVIRONMENT\",\n  UNSUPPORTED_CHAIN = \"UNSUPPORTED_CHAIN\",\n  ENVIRONMENT_CHAIN_MISMATCH = \"ENVIRONMENT_CHAIN_MISMATCH\",\n  WALLET_NOT_INSTALLED = \"WALLET_NOT_INSTALLED\",\n  WALLET_NOT_CONNECTED = \"WALLET_NOT_CONNECTED\",\n  WALLET_REJECTED = \"WALLET_REJECTED\",\n  WRONG_CHAIN = \"WRONG_CHAIN\",\n  AUTH_FAILED = \"AUTH_FAILED\",\n  SIGNATURE_REJECTED = \"SIGNATURE_REJECTED\",\n  VAULT_NOT_FOUND = \"VAULT_NOT_FOUND\",\n  VAULT_ALREADY_EXISTS = \"VAULT_ALREADY_EXISTS\",\n  VAULT_DEPLOY_FAILED = \"VAULT_DEPLOY_FAILED\",\n  INSUFFICIENT_BALANCE = \"INSUFFICIENT_BALANCE\",\n  APPROVE_FAILED = \"APPROVE_FAILED\",\n  DEPOSIT_FAILED = \"DEPOSIT_FAILED\",\n  WITHDRAW_FAILED = \"WITHDRAW_FAILED\",\n  NO_BEST_VAULT = \"NO_BEST_VAULT\",\n  API_ERROR = \"API_ERROR\",\n  RPC_ERROR = \"RPC_ERROR\",\n  TRANSACTION_FAILED = \"TRANSACTION_FAILED\",\n}\n\nexport class SurfError extends Error {\n  constructor(\n    public readonly code: SurfErrorCode,\n    message: string,\n    public readonly cause?: unknown,\n  ) {\n    super(message);\n    this.name = \"SurfError\";\n  }\n}\n","import { SurfError, SurfErrorCode } from \"../utils/errors\";\n\nexport interface HttpClientOptions {\n  baseUrl: string;\n  projectName: string;\n  projectId: string;\n  appId: string;\n}\n\nexport class HttpClient {\n  constructor(private readonly options: HttpClientOptions) {}\n\n  getAppId(): string {\n    return this.options.appId;\n  }\n\n  async get<T>(path: string, headers?: HeadersInit): Promise<T> {\n    const init: RequestInit = { method: \"GET\" };\n    if (headers !== undefined) {\n      init.headers = headers;\n    }\n    return this.request<T>(path, init);\n  }\n\n  async post<T>(path: string, body?: unknown, headers?: HeadersInit): Promise<T> {\n    const init: RequestInit = {\n      method: \"POST\",\n    };\n    if (body !== undefined) {\n      init.body = JSON.stringify(body);\n    }\n    if (headers !== undefined) {\n      init.headers = headers;\n    }\n    return this.request<T>(path, init);\n  }\n\n  private async request<T>(\n    path: string,\n    init: RequestInit,\n  ): Promise<T> {\n    const response = await fetch(this.resolveUrl(path), {\n      ...init,\n      // Auth is cookie-based: the backend sets an httpOnly session cookie\n      // (SameSite=None) on login. Including credentials makes the browser send\n      // and receive that cookie cross-origin on every request.\n      credentials: \"include\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        \"X-Surf-Project-Name\": this.options.projectName,\n        \"X-Surf-Project-Id\": this.options.projectId,\n        ...(init.headers ?? {}),\n      },\n    });\n\n    if (!response.ok) {\n      throw new SurfError(\n        SurfErrorCode.API_ERROR,\n        `Request failed with status ${response.status}`,\n        await response.text().catch(() => undefined),\n      );\n    }\n\n    return (await response.json()) as T;\n  }\n\n  private resolveUrl(path: string): string {\n    const baseUrl = this.options.baseUrl.replace(/\\/$/, \"\");\n    const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n    if (baseUrl.endsWith(\"/api\") && normalizedPath.startsWith(\"/api/\")) {\n      return `${baseUrl}${normalizedPath.slice(4)}`;\n    }\n    return `${baseUrl}${normalizedPath}`;\n  }\n}\n","import type {\n  LoginResponse,\n  NonceResponse,\n  RefreshResult,\n  UserProfile,\n} from \"../types\";\nimport { HttpClient } from \"./HttpClient\";\n\ninterface LoginEnvelope {\n  success: boolean;\n  data: {\n    user: {\n      walletAddress: string;\n      activeStrategies: string[];\n      isActive: boolean;\n      referralCode: string;\n      vaultVersion?: string;\n    };\n    // The session token is now delivered via an httpOnly Set-Cookie header\n    // rather than the response body. It may be omitted entirely; when present\n    // only `expiresAt` is of interest (the token value stays in the cookie).\n    token?: {\n      token?: string;\n      expiresAt?: string;\n    };\n  };\n}\n\nexport class AuthService {\n  constructor(private readonly http: HttpClient) {}\n\n  async getNonce(address: string): Promise<NonceResponse> {\n    const response = await this.http.post<{\n      success: boolean;\n      data: {\n        message: string;\n        walletAddress: string;\n        timestamp: number;\n      };\n    }>(\"/api/auth/nonce\", {\n      walletAddress: address,\n    });\n\n    return {\n      message: response.data.message,\n      walletAddress: response.data.walletAddress as `0x${string}`,\n      timestamp: response.data.timestamp,\n    };\n  }\n\n  async login(\n    address: string,\n    message: string,\n    signature: string,\n  ): Promise<LoginResponse> {\n    const response = await this.http.post<LoginEnvelope>(\"/api/auth/login\", {\n      walletAddress: address,\n      message,\n      signature,\n    }, {\n      \"X-App-ID\": this.http.getAppId(),\n    });\n    return {\n      // token now lives in an httpOnly cookie; expiry is managed server-side.\n      user: {\n        walletAddress: response.data.user.walletAddress as `0x${string}`,\n        activeStrategies: response.data.user.activeStrategies,\n        isActive: response.data.user.isActive,\n        vaultVersion: response.data.user.vaultVersion ?? \"\",\n        morphoVault: null,\n        isInitialDeposit: false,\n        isWhitelisted: false,\n      },\n    };\n  }\n\n  async refresh(): Promise<RefreshResult> {\n    // Cookie-based: the current auth_token cookie is sent via credentials:\"include\".\n    // No body or wallet signature required (Content-Type: application/json is set\n    // by HttpClient). The backend revokes the old token and sets a new cookie.\n    const response = await this.http.post<{\n      success: boolean;\n      data: { expiresAt: string };\n    }>(\"/api/auth/refresh\");\n    return { expiresAt: response.data?.expiresAt ?? \"\" };\n  }\n\n  async getMe(): Promise<UserProfile> {\n    const response = await this.http.get<any>(\"/api/auth/me\");\n    const profile: UserProfile = {\n      morphoVault: response.morphoVault ?? null,\n      isInitialDeposit: response.isInitialDeposit ?? false,\n      isWhitelisted: Boolean(response.isWhitelisted),\n      vaultVersion: response.vaultVersion ?? \"\",\n    };\n    if (response.twitterAccount !== undefined) {\n      profile.twitterAccount = response.twitterAccount;\n    }\n    return profile;\n  }\n}\n","import { Contract, type ContractRunner } from \"ethers\";\nimport { FactoryAbi } from \"../abis\";\n\nexport class FactoryService {\n  contract(factoryAddress: string, runner: ContractRunner) {\n    return new Contract(factoryAddress, FactoryAbi, runner) as any;\n  }\n\n  async deployVault(\n    factoryAddress: string,\n    owner: string,\n    salt: string,\n    runner: ContractRunner,\n    overrides: Record<string, unknown> = {},\n  ) {\n    return this.contract(factoryAddress, runner).deployVault(owner, salt, overrides);\n  }\n\n  async computeVaultAddress(\n    factoryAddress: string,\n    owner: string,\n    salt: string,\n    runner: ContractRunner,\n  ): Promise<string> {\n    return this.contract(factoryAddress, runner).computeVaultAddress(owner, salt);\n  }\n\n  async getOwnerVaults(\n    factoryAddress: string,\n    owner: string,\n    runner: ContractRunner,\n  ): Promise<string[]> {\n    return this.contract(factoryAddress, runner).getOwnerVaults(owner);\n  }\n\n  async getOwnerVaultCount(\n    factoryAddress: string,\n    owner: string,\n    runner: ContractRunner,\n  ): Promise<number> {\n    return Number(await this.contract(factoryAddress, runner).getOwnerVaultCount(owner));\n  }\n\n  async isVaultFromFactory(\n    factoryAddress: string,\n    vaultAddress: string,\n    runner: ContractRunner,\n  ): Promise<boolean> {\n    return this.contract(factoryAddress, runner).isVaultFromFactory(vaultAddress);\n  }\n}\n","import { Contract, type ContractRunner } from \"ethers\";\nimport { ERC20Abi, WETHAbi } from \"../abis\";\n\nexport class TokenService {\n  async allowance(\n    tokenAddress: string,\n    owner: string,\n    spender: string,\n    runner: ContractRunner,\n  ): Promise<bigint> {\n    const contract = new Contract(tokenAddress, ERC20Abi, runner) as any;\n    return (await contract.allowance(owner, spender)) as bigint;\n  }\n\n  async approve(\n    tokenAddress: string,\n    spender: string,\n    amount: bigint,\n    runner: ContractRunner,\n    overrides: Record<string, unknown> = {},\n  ) {\n    const contract = new Contract(tokenAddress, ERC20Abi, runner) as any;\n    return contract.approve(spender, amount, overrides);\n  }\n\n  async balanceOf(\n    tokenAddress: string,\n    owner: string,\n    runner: ContractRunner,\n  ): Promise<bigint> {\n    const contract = new Contract(tokenAddress, ERC20Abi, runner) as any;\n    return (await contract.balanceOf(owner)) as bigint;\n  }\n\n  async decimals(tokenAddress: string, runner: ContractRunner): Promise<number> {\n    const contract = new Contract(tokenAddress, ERC20Abi, runner) as any;\n    return Number(await contract.decimals());\n  }\n\n  async wrapNative(\n    amount: bigint,\n    wethAddress: string,\n    runner: ContractRunner,\n    overrides: Record<string, unknown> = {},\n  ) {\n    const contract = new Contract(wethAddress, WETHAbi, runner) as any;\n    return contract.deposit({ value: amount, ...overrides });\n  }\n}\n","import type { AgentMessagesResult, BestVaultOption, SupportedAsset, VaultDeploymentPrediction, VaultInfo } from \"../types\";\nimport { HttpClient } from \"./HttpClient\";\n\nexport interface PrepareVaultResponse {\n  salt: string;\n  homeChainId: number;\n  predictions: VaultDeploymentPrediction[];\n}\n\nexport class VaultApiService {\n  constructor(private readonly http: HttpClient) {}\n\n  async getVault(walletAddress: string): Promise<VaultInfo> {\n    const response = await this.http.get<any>(\n      `/api/v4/vault?walletAddress=${walletAddress}`,\n    );\n    const vault = response.vault ?? response.data?.vault ?? response.data ?? response;\n    return {\n      userVaultAddress: vault?.userVaultAddress ?? null,\n      deploymentSalt: vault?.deploymentSalt ?? null,\n      exists: Boolean(vault?.userVaultAddress),\n      walletAddress: vault?.walletAddress ?? null,\n      homeChainId: vault?.homeChainId ?? null,\n      vaultVersion: vault?.vaultVersion ?? null,\n      isActive: vault?.isActive,\n      totalValueUSD: vault?.totalValueUSD ?? null,\n      totalDepositedUSD: vault?.totalDepositedUSD ?? null,\n      earned: vault?.earned ?? null,\n      apyBreakdown: vault?.apyBreakdown ?? null,\n      league: vault?.league ?? null,\n      assets: vault?.assets ?? [],\n      chainAddresses: vault?.chainAddresses ?? [],\n    };\n  }\n\n  async prepare(homeChainId: number): Promise<PrepareVaultResponse> {\n    const response = await this.http.post<any>(\"/api/v4/vault/prepare\", {\n      homeChainId,\n    });\n    const prepared = response.data ?? response;\n    return {\n      salt: prepared.salt,\n      homeChainId: prepared.homeChainId,\n      predictions: prepared.predictions ?? [],\n    };\n  }\n\n  async confirm(input: {\n    userVaultAddress: string;\n    homeChainId: number;\n    deploymentSalt: string;\n    initialAssets: Array<Record<string, unknown>>;\n  }): Promise<void> {\n    await this.http.post(\"/api/v4/vault/confirm\", input);\n  }\n\n  async getPending(): Promise<{\n    deploymentSalt: string | null;\n    chainId?: number;\n    factoryAddress?: string;\n    predictedVaultAddress?: string;\n  } | null> {\n    const response = await this.http.get<{\n      deploymentSalt: string | null;\n      chainId?: number;\n      factoryAddress?: string;\n      predictedVaultAddress?: string;\n    } | null>(\n      \"/api/v4/vault/pending\",\n    );\n    return (response as any)?.data ?? response;\n  }\n\n  async getSupportedAssets(chainId?: number): Promise<SupportedAsset[]> {\n    const response = await this.http.get<any>(\"/api/v4/vault?walletAddress=0x\");\n    // The supported-asset catalog now lives under `vault.assets` (annotated with\n    // the caller's holdings when a session cookie identifies them). Older\n    // responses exposed it as a top-level `defaultAssets` array — fall back to\n    // that, and to other historical shapes, for compatibility.\n    const vault = response.vault ?? response.data?.vault ?? response.data ?? response;\n    const sourceAssets: any[] =\n      vault?.assets ??\n      vault?.defaultAssets ??\n      response.defaultAssets ??\n      response.data?.defaultAssets ??\n      [];\n    const assets: SupportedAsset[] = sourceAssets.map((a) => ({\n      assetAddress: a.assetAddress,\n      assetSymbol: a.assetSymbol,\n      assetDecimals: a.assetDecimals,\n      chainId: a.chainId,\n      chainStatus: a.chainStatus,\n      currentAPY: a.currentAPY,\n      nativeAPY: a.nativeAPY,\n      merklAPY: a.merklAPY,\n      leagueAPY: a.leagueAPY,\n      apy7d: a.apy7d ?? null,\n      apy14d: a.apy14d ?? null,\n      apy30d: a.apy30d ?? null,\n    }));\n    if (chainId !== undefined) {\n      return assets.filter((a) => a.chainId === chainId);\n    }\n    return assets;\n  }\n\n  async getAgentMessages(\n    walletAddress: string,\n    page = 1,\n    limit = 20,\n    from?: string,\n    to?: string,\n  ): Promise<AgentMessagesResult> {\n    let path = `/api/v4/agent-messages?walletAddress=${walletAddress}&page=${page}&limit=${limit}`;\n    if (from) {\n      path += `&from=${encodeURIComponent(from)}`;\n    }\n    if (to) {\n      path += `&to=${encodeURIComponent(to)}`;\n    }\n    const response = await this.http.get<any>(path);\n    const data = response.data ?? response;\n    return {\n      page: data.page ?? page,\n      limit: data.limit ?? limit,\n      total: data.total ?? 0,\n      pages: data.pages ?? 1,\n      messages: data.messages ?? [],\n    };\n  }\n\n  async getBestVault(assetSymbol: string): Promise<BestVaultOption[]> {\n    const response = await this.http.get<any>(\n      `/api/v4/vaults/best?assetSymbol=${encodeURIComponent(assetSymbol)}`,\n    );\n    return response.vaults ?? response.data ?? response ?? [];\n  }\n}\n","import { Contract, type ContractRunner } from \"ethers\";\nimport { VaultAbi } from \"../abis\";\nimport type { FeeInfo, PortfolioSummary } from \"../types\";\n\nexport class VaultService {\n  contract(vaultAddress: string, runner: ContractRunner) {\n    return new Contract(vaultAddress, VaultAbi, runner) as any;\n  }\n\n  async assetHasInitialDeposit(\n    vaultAddress: string,\n    asset: string,\n    runner: ContractRunner,\n  ): Promise<boolean> {\n    return this.contract(vaultAddress, runner).assetHasInitialDeposit(asset);\n  }\n\n  async initialDeposit(\n    vaultAddress: string,\n    asset: string,\n    bestVault: string,\n    amount: bigint,\n    runner: ContractRunner,\n    overrides: Record<string, unknown> = {},\n  ) {\n    return this.contract(vaultAddress, runner).initialDeposit(asset, bestVault, amount, overrides);\n  }\n\n  async userDeposit(\n    vaultAddress: string,\n    asset: string,\n    amount: bigint,\n    runner: ContractRunner,\n    overrides: Record<string, unknown> = {},\n  ) {\n    return this.contract(vaultAddress, runner).userDeposit(asset, amount, overrides);\n  }\n\n  async withdraw(\n    vaultAddress: string,\n    asset: string,\n    amount: bigint,\n    runner: ContractRunner,\n    overrides: Record<string, unknown> = {},\n  ) {\n    return this.contract(vaultAddress, runner).withdraw(asset, amount, overrides);\n  }\n\n  async getAssetAvailableVaults(\n    vaultAddress: string,\n    asset: string,\n    runner: ContractRunner,\n  ): Promise<string[]> {\n    return this.contract(vaultAddress, runner).getAssetAvailableVaults(asset);\n  }\n\n  async getAssetVaultAssets(\n    vaultAddress: string,\n    asset: string,\n    runner: ContractRunner,\n  ): Promise<bigint> {\n    return this.contract(vaultAddress, runner).getAssetVaultAssets(asset);\n  }\n\n  async getPortfolioSummary(\n    vaultAddress: string,\n    runner: ContractRunner,\n  ): Promise<PortfolioSummary> {\n    const [assets, deposited, currentValues, profits, activeCount] =\n      await this.contract(vaultAddress, runner).getPortfolioSummary();\n\n    return {\n      assets,\n      deposited,\n      currentValues,\n      profits,\n      activeCount: Number(activeCount),\n    };\n  }\n\n  async getAssetProfit(\n    vaultAddress: string,\n    asset: string,\n    runner: ContractRunner,\n  ): Promise<bigint> {\n    return this.contract(vaultAddress, runner).getAssetProfit(asset);\n  }\n\n  async getAssetProfitPercentage(\n    vaultAddress: string,\n    asset: string,\n    runner: ContractRunner,\n  ): Promise<bigint> {\n    return this.contract(vaultAddress, runner).getAssetProfitPercentage(asset);\n  }\n\n  async getTokenBalance(\n    vaultAddress: string,\n    token: string,\n    runner: ContractRunner,\n  ): Promise<bigint> {\n    return this.contract(vaultAddress, runner).getTokenBalance(token);\n  }\n\n  async getAllowedAssets(\n    vaultAddress: string,\n    runner: ContractRunner,\n  ): Promise<string[]> {\n    return this.contract(vaultAddress, runner).getAllowedAssets();\n  }\n\n  async getFeeInfo(\n    vaultAddress: string,\n    runner: ContractRunner,\n  ): Promise<FeeInfo> {\n    const [revenueAddress, feePercentage, rebalanceFeePercentage, merklClaimFeePercentage] =\n      await this.contract(vaultAddress, runner).getFeeInfo();\n    return {\n      revenueAddress,\n      feePercentage,\n      rebalanceFeePercentage,\n      merklClaimFeePercentage,\n    };\n  }\n}\n","import { formatUnits, parseUnits } from \"ethers\";\n\nexport function parseTokenAmount(amount: string, decimals: number): bigint {\n  return parseUnits(amount, decimals);\n}\n\nexport function formatTokenAmount(amount: bigint, decimals: number): string {\n  return formatUnits(amount, decimals);\n}\n\nexport function addApprovalBuffer(amount: bigint, basisPoints = 10n): bigint {\n  return amount + (amount * basisPoints) / 10_000n;\n}\n","import {\n  BrowserProvider,\n  type Eip1193Provider,\n  type Signer,\n  getAddress,\n} from \"ethers\";\nimport type { WalletState } from \"../types\";\nimport { SurfError, SurfErrorCode } from \"../utils/errors\";\n\ntype ListenerMap = {\n  accountsChanged: Array<(accounts: string[]) => void>;\n  chainChanged: Array<(chainId: number) => void>;\n  disconnect: Array<() => void>;\n};\n\nexport abstract class BaseWalletAdapter {\n  protected provider: Eip1193Provider | undefined;\n  private readonly listeners: ListenerMap = {\n    accountsChanged: [],\n    chainChanged: [],\n    disconnect: [],\n  };\n\n  abstract readonly name: string;\n  abstract get installed(): boolean;\n\n  protected abstract resolveProvider(): Eip1193Provider | undefined;\n\n  async connect(chainId: number): Promise<WalletState> {\n    const provider = this.requireProvider();\n    await this.switchChain(chainId);\n    const accounts = (await provider.request({\n      method: \"eth_requestAccounts\",\n    })) as string[];\n    if (!accounts[0]) {\n      throw new SurfError(\n        SurfErrorCode.WALLET_NOT_CONNECTED,\n        `${this.name} did not return any connected account`,\n      );\n    }\n    const chainHex = (await provider.request({\n      method: \"eth_chainId\",\n    })) as string;\n\n    this.bindListeners(provider);\n\n    return {\n      address: getAddress(accounts[0]) as `0x${string}`,\n      chainId: Number.parseInt(chainHex, 16),\n      connected: true,\n    };\n  }\n\n  async disconnect(): Promise<void> {\n    this.removeAllListeners();\n    this.listeners.accountsChanged = [];\n    this.listeners.chainChanged = [];\n    this.listeners.disconnect = [];\n    this.provider = undefined;\n  }\n\n  async switchChain(chainId: number): Promise<void> {\n    const provider = this.requireProvider();\n    try {\n      await provider.request({\n        method: \"wallet_switchEthereumChain\",\n        params: [{ chainId: `0x${chainId.toString(16)}` }],\n      });\n    } catch (error: any) {\n      if (error?.code === 4902) {\n        throw new SurfError(\n          SurfErrorCode.WRONG_CHAIN,\n          `Chain ${chainId} is not added in the wallet`,\n          error,\n        );\n      }\n\n      if (error?.code === 4001) {\n        throw new SurfError(\n          SurfErrorCode.WALLET_REJECTED,\n          \"Chain switch rejected by user\",\n          error,\n        );\n      }\n\n      throw error;\n    }\n  }\n\n  async getSigner(): Promise<Signer> {\n    return (await this.getBrowserProvider()).getSigner();\n  }\n\n  async getProvider(): Promise<Eip1193Provider> {\n    return this.requireProvider();\n  }\n\n  async getBrowserProvider(): Promise<BrowserProvider> {\n    return new BrowserProvider(this.requireProvider());\n  }\n\n  async signMessage(message: string): Promise<string> {\n    const signer = await this.getSigner();\n    return signer.signMessage(message);\n  }\n\n  onAccountsChanged(cb: (accounts: string[]) => void): void {\n    this.listeners.accountsChanged.push(cb);\n  }\n\n  onChainChanged(cb: (chainId: number) => void): void {\n    this.listeners.chainChanged.push(cb);\n  }\n\n  onDisconnect(cb: () => void): void {\n    this.listeners.disconnect.push(cb);\n  }\n\n  removeAllListeners(): void {\n    const provider = this.provider as\n      | (Eip1193Provider & { removeAllListeners?: (event?: string) => void })\n      | undefined;\n    provider?.removeAllListeners?.(\"accountsChanged\");\n    provider?.removeAllListeners?.(\"chainChanged\");\n    provider?.removeAllListeners?.(\"disconnect\");\n  }\n\n  protected requireProvider(): Eip1193Provider {\n    this.provider ??= this.resolveProvider();\n    if (!this.provider) {\n      throw new SurfError(\n        SurfErrorCode.WALLET_NOT_INSTALLED,\n        `${this.name} wallet is not installed`,\n      );\n    }\n    return this.provider;\n  }\n\n  protected bindListeners(provider: Eip1193Provider): void {\n    const evented = provider as Eip1193Provider & {\n      on?: (event: string, callback: (...args: any[]) => void) => void;\n    };\n\n    evented.on?.(\"accountsChanged\", (accounts: string[]) => {\n      this.listeners.accountsChanged.forEach((listener) => listener(accounts));\n    });\n\n    evented.on?.(\"chainChanged\", (chainIdHex: string) => {\n      const chainId =\n        typeof chainIdHex === \"string\"\n          ? Number.parseInt(chainIdHex, 16)\n          : Number(chainIdHex);\n      this.listeners.chainChanged.forEach((listener) => listener(chainId));\n    });\n\n    evented.on?.(\"disconnect\", () => {\n      this.listeners.disconnect.forEach((listener) => listener());\n    });\n  }\n}\n","import type { Eip1193Provider } from \"ethers\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\n\nexport class CoinbaseAdapter extends BaseWalletAdapter {\n  readonly name = \"coinbase\";\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    if (typeof window === \"undefined\") return undefined;\n    const win = window as any;\n    if (win.ethereum?.providers?.length) {\n      const found = win.ethereum.providers.find((p: any) => p?.isCoinbaseWallet);\n      if (found) return found;\n    }\n    if (win.ethereum?.isCoinbaseWallet) return win.ethereum;\n    if (win.coinbaseWalletExtension?.isCoinbaseWallet) return win.coinbaseWalletExtension;\n    return undefined;\n  }\n}\n","import type { Eip1193Provider } from \"ethers\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\n\nexport class InjectedAdapter extends BaseWalletAdapter {\n  readonly name = \"injected\";\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    if (typeof window === \"undefined\") return undefined;\n    return (window as any).ethereum;\n  }\n}\n","import type { Eip1193Provider } from \"ethers\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\n\nexport class MetaMaskAdapter extends BaseWalletAdapter {\n  readonly name = \"metamask\";\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    if (typeof window === \"undefined\") return undefined;\n    const ethereum = (window as any).ethereum;\n    if (!ethereum) return undefined;\n    // Multiple extensions: search the providers array for the real MetaMask\n    if (ethereum.providers?.length) {\n      const found = ethereum.providers.find(\n        (p: any) => p?.isMetaMask && !p?.isRabby && !p?.isBraveWallet,\n      );\n      if (found) return found;\n    }\n    // window.ethereum is MetaMask directly (no other extensions)\n    if (ethereum.isMetaMask && !ethereum.isRabby && !ethereum.isBraveWallet) {\n      return ethereum;\n    }\n    // Last resort: MetaMask always exposes window.ethereum._metamask — no other wallet does\n    if (ethereum._metamask) return ethereum;\n    return undefined;\n  }\n}\n","import type { Eip1193Provider } from \"ethers\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\n\nexport class PhantomAdapter extends BaseWalletAdapter {\n  readonly name = \"phantom\";\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    if (typeof window === \"undefined\") return undefined;\n    return (window as any).phantom?.ethereum;\n  }\n}\n","import type { Eip1193Provider } from \"ethers\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\n\nexport class RabbyAdapter extends BaseWalletAdapter {\n  readonly name = \"rabby\";\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    if (typeof window === \"undefined\") return undefined;\n    const win = window as any;\n    if (win.ethereum?.providers?.length) {\n      const found = win.ethereum.providers.find((p: any) => p?.isRabby);\n      if (found) return found;\n    }\n    if (win.ethereum?.isRabby) return win.ethereum;\n    if (win.rabby) return win.rabby;\n    return undefined;\n  }\n}\n","import type { Eip1193Provider } from \"ethers\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\n\nexport class TrustWalletAdapter extends BaseWalletAdapter {\n  readonly name = \"trust\";\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    if (typeof window === \"undefined\") return undefined;\n    const win = window as any;\n    const isTrust = (p: any) => p?.isTrust || p?.isTrustWallet;\n    if (win.ethereum?.providers?.length) {\n      const found = win.ethereum.providers.find(isTrust);\n      if (found) return found;\n    }\n    if (isTrust(win.ethereum)) return win.ethereum;\n    if (win.trustwallet) return win.trustwallet;\n    return undefined;\n  }\n}\n","import { getAddress, type Eip1193Provider } from \"ethers\";\nimport type { WalletState } from \"../types\";\nimport { BaseWalletAdapter } from \"./BaseWalletAdapter\";\nimport { SurfError, SurfErrorCode } from \"../utils/errors\";\n\nexport class WalletConnectAdapter extends BaseWalletAdapter {\n  readonly name = \"walletconnect\";\n\n  constructor(private readonly providerFactory?: () => Eip1193Provider | undefined) {\n    super();\n  }\n\n  get installed(): boolean {\n    return Boolean(this.resolveProvider());\n  }\n\n  protected resolveProvider(): Eip1193Provider | undefined {\n    return this.providerFactory?.();\n  }\n\n  override async connect(chainId: number): Promise<WalletState> {\n    if (!this.providerFactory) {\n      throw new SurfError(\n        SurfErrorCode.WALLET_NOT_INSTALLED,\n        \"WalletConnect requires a provider factory during SDK setup\",\n      );\n    }\n\n    const provider = this.requireProvider() as any;\n\n    // WalletConnect must establish its session before any request() calls\n    if (typeof provider.connect === \"function\") {\n      await provider.connect({ chains: [chainId] });\n    }\n\n    const accounts = (await provider.request({ method: \"eth_requestAccounts\" })) as string[];\n    if (!accounts[0]) {\n      throw new SurfError(\n        SurfErrorCode.WALLET_NOT_CONNECTED,\n        \"WalletConnect did not return any connected account\",\n      );\n    }\n\n    const chainHex = (await provider.request({ method: \"eth_chainId\" })) as string;\n\n    this.bindListeners(provider);\n\n    return {\n      address: getAddress(accounts[0]) as `0x${string}`,\n      chainId: Number.parseInt(chainHex, 16),\n      connected: true,\n    };\n  }\n}\n","import { isAddress } from \"ethers\";\nimport type {\n  ChainConfig,\n  Environment,\n  ResolvedSurfConfig,\n  SurfConfig,\n  TokenConfig,\n} from \"../types\";\nimport { SurfError, SurfErrorCode } from \"./errors\";\n\nexport function assertAddress(value: string, fieldName: string): void {\n  if (!isAddress(value)) {\n    throw new SurfError(\n      SurfErrorCode.INVALID_CONFIG,\n      `${fieldName} must be a valid EVM address`,\n    );\n  }\n}\n\nexport function validateTokenConfig(token: TokenConfig): void {\n  assertAddress(token.address, `${token.symbol}.address`);\n  token.vaultAddresses.forEach((vaultAddress, index) => {\n    assertAddress(vaultAddress, `${token.symbol}.vaultAddresses[${index}]`);\n  });\n}\n\nexport function validateChainConfig(chain: ChainConfig): void {\n  assertAddress(chain.factoryAddress, `${chain.name}.factoryAddress`);\n  assertAddress(chain.wethAddress, `${chain.name}.wethAddress`);\n  chain.tokens.forEach(validateTokenConfig);\n}\n\nexport function validateEnvironment(value: string): asserts value is Environment {\n  if (value !== \"mainnet\" && value !== \"testnet\") {\n    throw new SurfError(\n      SurfErrorCode.INVALID_ENVIRONMENT,\n      `Unsupported environment: ${value}`,\n    );\n  }\n}\n\nexport function validateConfig(\n  config: SurfConfig,\n  chainExists: (environment: Environment, chainId: number) => boolean,\n  defaultChainIdForEnvironment: (environment: Environment) => number,\n): ResolvedSurfConfig {\n  const resolvedProjectId = config.appId ?? config.projectId;\n  if (!config.projectName || !resolvedProjectId) {\n    throw new SurfError(\n      SurfErrorCode.MISSING_PROJECT_ID,\n      \"projectName and appId/projectId are required\",\n    );\n  }\n\n  const environment = config.environment ?? \"mainnet\";\n  validateEnvironment(environment);\n\n  const chainId = config.chainId ?? defaultChainIdForEnvironment(environment);\n  if (!chainExists(environment, chainId)) {\n    throw new SurfError(\n      SurfErrorCode.UNSUPPORTED_CHAIN,\n      `Chain ${chainId} is not registered for environment ${environment}`,\n    );\n  }\n\n  return {\n    projectName: config.projectName,\n    projectId: resolvedProjectId,\n    appId: resolvedProjectId,\n    environment,\n    chainId,\n    rpcUrl: config.rpcUrl ?? \"\",\n    apiBaseUrl: config.apiBaseUrl ?? \"https://api.surfliquid.com\",\n    factoryAddress: (config.factoryAddress ?? \"0x0000000000000000000000000000000000000000\") as `0x${string}`,\n    autoApprove: config.autoApprove ?? true,\n    logger: config.logger ?? \"error\",\n  };\n}\n","import type { ChainConfig, Environment, IWalletAdapter, SurfConfig, TokenConfig } from \"../types\";\nimport { cloneRegistries, getDefaultChainId } from \"../config\";\nimport { SurfClient } from \"./SurfClient\";\nimport {\n  CoinbaseAdapter,\n  InjectedAdapter,\n  MetaMaskAdapter,\n  PhantomAdapter,\n  RabbyAdapter,\n  TrustWalletAdapter,\n  WalletConnectAdapter,\n} from \"../wallets\";\nimport { validateChainConfig, validateConfig, validateTokenConfig } from \"../utils/validation\";\n\nexport class SurfClientBuilder {\n  private config: SurfConfig = {\n    projectName: \"\",\n  };\n\n  private readonly registries = cloneRegistries();\n  private readonly walletAdapters = new Map<string, IWalletAdapter>();\n\n  constructor() {\n    this.walletAdapters.set(\"metamask\", new MetaMaskAdapter());\n    this.walletAdapters.set(\"trust\", new TrustWalletAdapter());\n    this.walletAdapters.set(\"coinbase\", new CoinbaseAdapter());\n    this.walletAdapters.set(\"rabby\", new RabbyAdapter());\n    this.walletAdapters.set(\"phantom\", new PhantomAdapter());\n    this.walletAdapters.set(\"walletconnect\", new WalletConnectAdapter());\n    this.walletAdapters.set(\"injected\", new InjectedAdapter());\n  }\n\n  setProject(name: string, id: string): this {\n    this.config.projectName = name;\n    this.config.projectId = id;\n    this.config.appId = id;\n    return this;\n  }\n\n  setAppId(id: string): this {\n    this.config.appId = id;\n    this.config.projectId = id;\n    return this;\n  }\n\n  setEnvironment(environment: Environment): this {\n    this.config.environment = environment;\n    return this;\n  }\n\n  setChain(chainId: number): this {\n    this.config.chainId = chainId;\n    return this;\n  }\n\n  setRpcUrl(url: string): this {\n    this.config.rpcUrl = url;\n    return this;\n  }\n\n  setApiBaseUrl(url: string): this {\n    this.config.apiBaseUrl = url;\n    return this;\n  }\n\n  setFactoryAddress(address: `0x${string}`): this {\n    this.config.factoryAddress = address;\n    return this;\n  }\n\n  setAutoApprove(enabled: boolean): this {\n    this.config.autoApprove = enabled;\n    return this;\n  }\n\n  setLogLevel(level: SurfConfig[\"logger\"]): this {\n    if (level !== undefined) {\n      this.config.logger = level;\n    }\n    return this;\n  }\n\n  registerWalletAdapter(name: string, adapter: IWalletAdapter): this {\n    this.walletAdapters.set(name, adapter);\n    return this;\n  }\n\n  registerChain(environment: Environment, config: ChainConfig): this {\n    validateChainConfig(config);\n    this.registries[environment][config.chainId] = {\n      ...config,\n      tokens: [...config.tokens],\n    };\n    return this;\n  }\n\n  registerToken(environment: Environment, chainId: number, token: TokenConfig): this {\n    validateTokenConfig(token);\n    const chain = this.registries[environment][chainId];\n    if (!chain) {\n      throw new Error(`Cannot register token on unknown chain ${chainId} in ${environment}`);\n    }\n    chain.tokens.push(token);\n    return this;\n  }\n\n  build(): SurfClient {\n    const resolved = validateConfig(\n      this.config,\n      (environment, chainId) => Boolean(this.registries[environment][chainId]),\n      getDefaultChainId,\n    );\n\n    const chain = this.registries[resolved.environment][resolved.chainId];\n    if (!chain) {\n      throw new Error(\n        `Missing chain config for ${resolved.environment}:${resolved.chainId}`,\n      );\n    }\n    return new SurfClient({\n      config: {\n        ...resolved,\n        rpcUrl: resolved.rpcUrl || chain.rpcUrl,\n        factoryAddress: resolved.factoryAddress === \"0x0000000000000000000000000000000000000000\"\n          ? chain.factoryAddress\n          : resolved.factoryAddress,\n      },\n      registries: this.registries,\n      walletAdapters: this.walletAdapters,\n    });\n  }\n}\n"],"mappings":"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","names":["import_ethers","SurfErrorCode","import_ethers","import_ethers","import_ethers","import_ethers","import_ethers","import_ethers","signer","predictedVaultAddress"]}