{"version":3,"sources":["../../src/display/exchange-rate.ts"],"sourcesContent":["import { getRateInQuoteWithAssetDecimals } from \"../api/accountant\";\nimport type { ChainId } from \"../api/vault-config\";\nimport { bigIntToNumberAsString } from \"../utils/bigint\";\nimport { getVaultByKey } from \"../vaults\";\nimport type { VaultKey } from \"../vaults/config\";\n\ninterface GetDepositExchangeRateParams {\n  vaultKey: VaultKey;\n  sourceChainId: ChainId;\n  depositTokenSymbol: string;\n  minimumFractionDigits?: number;\n  maximumFractionDigits?: number;\n}\n\n/**\n * Gets the deposit exchange rate for a vault (tokens per share)\n * @throws {Error} If the token address is not found or if there's an error fetching the rate\n * @returns Promise<string> The exchange rate as a formatted string representing how many deposit tokens are worth 1 share\n */\nconst getDepositExchangeRate = async ({\n  vaultKey,\n  sourceChainId,\n  depositTokenSymbol,\n  minimumFractionDigits,\n  maximumFractionDigits = 3,\n}: GetDepositExchangeRateParams) => {\n  const vault = await getVaultByKey(vaultKey);\n\n  const sourceChain = vault.deposit.sourceChains[sourceChainId];\n  if (!sourceChain) {\n    throw new Error(\n      `Source chain ${sourceChainId} not found for vault ${vaultKey}`\n    );\n  }\n\n  const depositToken = sourceChain.depositTokens?.[depositTokenSymbol];\n  if (!depositToken) {\n    throw new Error(\n      `Deposit token ${depositTokenSymbol} not found for chain ${sourceChainId}`\n    );\n  }\n\n  const tokenAddress = depositToken.address;\n  if (!tokenAddress) {\n    throw new Error(`Token address not found for ${depositTokenSymbol}`);\n  }\n\n  const [decimals, rate] = await getRateInQuoteWithAssetDecimals({\n    assetAddress: tokenAddress,\n    accountantAddress: vault.contracts.accountant,\n    chainId: sourceChainId,\n  });\n\n  if (rate.status === \"failure\") {\n    throw new Error(`Failed to get rate: ${rate.error.message}`);\n  }\n  if (decimals.status === \"failure\") {\n    throw new Error(`Failed to get decimals: ${decimals.error.message}`);\n  }\n\n  return bigIntToNumberAsString(rate.result, {\n    decimals: decimals.result,\n    minimumFractionDigits,\n    maximumFractionDigits,\n  });\n};\n\ninterface GetWithdrawExchangeRateParams {\n  vaultKey: VaultKey;\n  sourceChainId: ChainId;\n  destinationChainId: ChainId;\n  wantTokenSymbol: string;\n  minimumFractionDigits?: number;\n  maximumFractionDigits?: number;\n}\n\n/**\n * Gets the withdraw exchange rate for a vault (tokens per share)\n * @throws {Error} If the token address is not found or if there's an error fetching the rate\n * @returns Promise<string> The exchange rate as a formatted string representing how many want tokens are worth 1 share\n */\nconst getWithdrawExchangeRate = async ({\n  vaultKey,\n  sourceChainId,\n  destinationChainId,\n  wantTokenSymbol,\n  minimumFractionDigits,\n  maximumFractionDigits = 3,\n}: GetWithdrawExchangeRateParams) => {\n  const vault = await getVaultByKey(vaultKey);\n\n  const sourceChain = vault.withdraw.sourceChains[sourceChainId];\n  if (!sourceChain) {\n    throw new Error(\n      `Source chain ${sourceChainId} not found for vault ${vaultKey}`\n    );\n  }\n\n  const destinationChain = sourceChain.destinationChains[destinationChainId];\n  if (!destinationChain) {\n    throw new Error(\n      `Destination chain ${destinationChainId} not found for source chain ${sourceChainId}`\n    );\n  }\n\n  const wantToken = destinationChain.wantTokens?.[wantTokenSymbol];\n  if (!wantToken) {\n    throw new Error(\n      `Want token ${wantTokenSymbol} not found for chain ${destinationChainId}`\n    );\n  }\n\n  const tokenAddress = wantToken.address;\n  if (!tokenAddress) {\n    throw new Error(`Token address not found for ${wantTokenSymbol}`);\n  }\n\n  const [decimals, rate] = await getRateInQuoteWithAssetDecimals({\n    assetAddress: tokenAddress,\n    accountantAddress: vault.contracts.accountant,\n    chainId: sourceChainId,\n  });\n\n  if (rate.status === \"failure\") {\n    throw new Error(`Failed to get rate: ${rate.error.message}`);\n  }\n  if (decimals.status === \"failure\") {\n    throw new Error(`Failed to get decimals: ${decimals.error.message}`);\n  }\n\n  return bigIntToNumberAsString(rate.result, {\n    decimals: decimals.result,\n    minimumFractionDigits,\n    maximumFractionDigits,\n  });\n};\n\nexport { getDepositExchangeRate, getWithdrawExchangeRate };\n"],"mappings":"AAAA,SAAS,uCAAuC;AAEhD,SAAS,8BAA8B;AACvC,SAAS,qBAAqB;AAgB9B,MAAM,yBAAyB,OAAO;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAC1B,MAAoC;AAClC,QAAM,QAAQ,MAAM,cAAc,QAAQ;AAE1C,QAAM,cAAc,MAAM,QAAQ,aAAa,aAAa;AAC5D,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,gBAAgB,aAAa,wBAAwB,QAAQ;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,gBAAgB,kBAAkB;AACnE,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR,iBAAiB,kBAAkB,wBAAwB,aAAa;AAAA,IAC1E;AAAA,EACF;AAEA,QAAM,eAAe,aAAa;AAClC,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,+BAA+B,kBAAkB,EAAE;AAAA,EACrE;AAEA,QAAM,CAAC,UAAU,IAAI,IAAI,MAAM,gCAAgC;AAAA,IAC7D,cAAc;AAAA,IACd,mBAAmB,MAAM,UAAU;AAAA,IACnC,SAAS;AAAA,EACX,CAAC;AAED,MAAI,KAAK,WAAW,WAAW;AAC7B,UAAM,IAAI,MAAM,uBAAuB,KAAK,MAAM,OAAO,EAAE;AAAA,EAC7D;AACA,MAAI,SAAS,WAAW,WAAW;AACjC,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,OAAO,EAAE;AAAA,EACrE;AAEA,SAAO,uBAAuB,KAAK,QAAQ;AAAA,IACzC,UAAU,SAAS;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAgBA,MAAM,0BAA0B,OAAO;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAC1B,MAAqC;AACnC,QAAM,QAAQ,MAAM,cAAc,QAAQ;AAE1C,QAAM,cAAc,MAAM,SAAS,aAAa,aAAa;AAC7D,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,gBAAgB,aAAa,wBAAwB,QAAQ;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY,kBAAkB,kBAAkB;AACzE,MAAI,CAAC,kBAAkB;AACrB,UAAM,IAAI;AAAA,MACR,qBAAqB,kBAAkB,+BAA+B,aAAa;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,YAAY,iBAAiB,aAAa,eAAe;AAC/D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI;AAAA,MACR,cAAc,eAAe,wBAAwB,kBAAkB;AAAA,IACzE;AAAA,EACF;AAEA,QAAM,eAAe,UAAU;AAC/B,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,+BAA+B,eAAe,EAAE;AAAA,EAClE;AAEA,QAAM,CAAC,UAAU,IAAI,IAAI,MAAM,gCAAgC;AAAA,IAC7D,cAAc;AAAA,IACd,mBAAmB,MAAM,UAAU;AAAA,IACnC,SAAS;AAAA,EACX,CAAC;AAED,MAAI,KAAK,WAAW,WAAW;AAC7B,UAAM,IAAI,MAAM,uBAAuB,KAAK,MAAM,OAAO,EAAE;AAAA,EAC7D;AACA,MAAI,SAAS,WAAW,WAAW;AACjC,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,OAAO,EAAE;AAAA,EACrE;AAEA,SAAO,uBAAuB,KAAK,QAAQ;AAAA,IACzC,UAAU,SAAS;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":[]}