{"version":3,"sources":["../src/utils/types/TransferProphet.ts"],"sourcesContent":["import {\n  SDKNumber,\n  SDKNumberifyNestly,\n  toSDKNumberOrUndefined,\n} from \"../../xlinkSdkUtils/types\"\nimport { BigNumber } from \"../BigNumber\"\nimport { last } from \"../arrayHelpers\"\nimport { KnownRoute } from \"../buildSupportedRoutes\"\nimport {\n  applyTransferProphet,\n  applyTransferProphets,\n  composeTransferProphets,\n} from \"../feeRateHelpers\"\nimport { checkNever, isNotNull, OneOrMore } from \"../typeHelpers\"\nimport { KnownChainId, KnownTokenId } from \"./knownIds\"\n\nexport type TransferProphetAggregated<\n  T extends Readonly<TransferProphet[]> = OneOrMore<TransferProphet>,\n> = TransferProphet & {\n  transferProphets: T\n}\n\nexport type TransferProphet_Fee_Rate = {\n  type: \"rate\"\n  token: KnownTokenId.KnownToken\n  rate: BigNumber\n  minimumAmount: BigNumber\n}\nexport type TransferProphet_Fee_Fixed = {\n  type: \"fixed\"\n  token: KnownTokenId.KnownToken\n  amount: BigNumber\n}\nexport type TransferProphet_Fee =\n  | TransferProphet_Fee_Rate\n  | TransferProphet_Fee_Fixed\n\nexport interface TransferProphet {\n  isPaused: boolean\n  bridgeToken: KnownTokenId.KnownToken\n  minBridgeAmount: null | BigNumber\n  maxBridgeAmount: null | BigNumber\n  fees: TransferProphet_Fee[]\n}\n\nexport interface PublicTransferProphet\n  extends Omit<SDKNumberifyNestly<TransferProphet>, \"bridgeToken\" | \"fees\"> {\n  fromChain: KnownChainId.KnownChain\n  fromToken: KnownTokenId.KnownToken\n  toChain: KnownChainId.KnownChain\n  toToken: KnownTokenId.KnownToken\n  fromAmount: SDKNumber\n  toAmount: SDKNumber\n  fees: SDKNumberifyNestly<\n    (\n      | (TransferProphet_Fee_Rate & { amount: SDKNumber })\n      | TransferProphet_Fee_Fixed\n    )[]\n  >\n}\n\nexport interface PublicTransferProphetAggregated<\n  T extends readonly PublicTransferProphet[] = readonly PublicTransferProphet[],\n> extends SDKNumberifyNestly<PublicTransferProphet> {\n  transferProphets: T\n}\n\nexport function transformFromPublicTransferProphet(\n  transferProphet: PublicTransferProphet,\n): TransferProphet {\n  return {\n    isPaused: transferProphet.isPaused,\n    bridgeToken: transferProphet.fromToken,\n    fees: transferProphet.fees\n      .flatMap(f =>\n        f.type === \"rate\"\n          ? {\n              ...f,\n              rate: BigNumber.from(f.rate),\n              minimumAmount: BigNumber.from(f.minimumAmount),\n            }\n          : f.type === \"fixed\"\n            ? {\n                ...f,\n                amount: BigNumber.from(f.amount),\n              }\n            : checkNever(f),\n      )\n      .filter(isNotNull),\n    minBridgeAmount:\n      transferProphet.minBridgeAmount == null\n        ? null\n        : BigNumber.from(transferProphet.minBridgeAmount),\n    maxBridgeAmount:\n      transferProphet.maxBridgeAmount == null\n        ? null\n        : BigNumber.from(transferProphet.maxBridgeAmount),\n  }\n}\nexport function transformToPublicTransferProphet(\n  route: KnownRoute,\n  fromAmount: SDKNumber | BigNumber,\n  transferProphet: TransferProphet,\n): PublicTransferProphet {\n  const result = applyTransferProphet(\n    transferProphet,\n    BigNumber.from(fromAmount),\n  )\n\n  const fees: PublicTransferProphet[\"fees\"] = result.fees\n    .map(f =>\n      f.type === \"rate\"\n        ? {\n            ...f,\n            rate: toSDKNumberOrUndefined(f.rate),\n            minimumAmount: toSDKNumberOrUndefined(f.minimumAmount),\n            amount: toSDKNumberOrUndefined(f.amount),\n          }\n        : f.type === \"fixed\"\n          ? {\n              ...f,\n              amount: toSDKNumberOrUndefined(f.amount),\n            }\n          : checkNever(f),\n    )\n    .filter(isNotNull)\n\n  return {\n    ...route,\n    fromAmount: toSDKNumberOrUndefined(fromAmount),\n    toAmount: toSDKNumberOrUndefined(result.netAmount),\n    isPaused: transferProphet.isPaused,\n    minBridgeAmount: toSDKNumberOrUndefined(transferProphet.minBridgeAmount),\n    maxBridgeAmount: toSDKNumberOrUndefined(transferProphet.maxBridgeAmount),\n    fees,\n  }\n}\n\n/**\n * @example\n * transformToPublicTransferProphetAggregated(\n *   [\n *     // tokenA : chain1 -> chain2\n *     transferProphetOf(tokenAChain1, tokenAChain2),\n *     // tokenB : chain2 -> chain3\n *     transferProphetOf(tokenBChain2, tokenBChain3),\n *     // tokenC : chain3 -> chain4\n *     transferProphetOf(tokenCChain3, tokenCChain4),\n *   ],\n *   [\n *     // tokenA -> tokenB : chain2\n *     exchangeRateOf(tokenAChain2, tokenBChain2),\n *     // tokenB -> tokenC : chain3\n *     exchangeRateOf(tokenBChain3, tokenCChain3),\n *   ],\n * )\n */\nexport const transformToPublicTransferProphetAggregated = (\n  transferProphets: OneOrMore<PublicTransferProphet>,\n  exchangeRates: readonly BigNumber[],\n): PublicTransferProphetAggregated<OneOrMore<PublicTransferProphet>> => {\n  const firstTransferProphet = transferProphets[0]\n  const lastTransferProphet = last(transferProphets)\n\n  const steps = transferProphets.map(\n    transformFromPublicTransferProphet,\n  ) as any as OneOrMore<TransferProphet>\n  const composed = composeTransferProphets(steps, exchangeRates)\n\n  const fromAmount = BigNumber.from(firstTransferProphet.fromAmount)\n  const applyResult = applyTransferProphets(steps, fromAmount)\n\n  const fees: PublicTransferProphet[\"fees\"] = applyResult\n    .flatMap(r => r.fees)\n    .map(f =>\n      f.type === \"rate\"\n        ? {\n            ...f,\n            rate: toSDKNumberOrUndefined(f.rate),\n            minimumAmount: toSDKNumberOrUndefined(f.minimumAmount),\n            amount: toSDKNumberOrUndefined(f.amount),\n          }\n        : f.type === \"fixed\"\n          ? {\n              ...f,\n              amount: toSDKNumberOrUndefined(f.amount),\n            }\n          : checkNever(f),\n    )\n    .filter(isNotNull)\n\n  return {\n    fromChain: firstTransferProphet.fromChain,\n    fromToken: firstTransferProphet.fromToken,\n    toChain: lastTransferProphet.toChain,\n    toToken: lastTransferProphet.toToken,\n    fromAmount: toSDKNumberOrUndefined(fromAmount),\n    toAmount: toSDKNumberOrUndefined(last(applyResult).netAmount),\n    isPaused: composed.isPaused,\n    fees,\n    minBridgeAmount: toSDKNumberOrUndefined(composed.minBridgeAmount),\n    maxBridgeAmount: toSDKNumberOrUndefined(composed.maxBridgeAmount),\n    transferProphets,\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmEO,SAAS,mCACd,iBACiB;AACjB,SAAO;AAAA,IACL,UAAU,gBAAgB;AAAA,IAC1B,aAAa,gBAAgB;AAAA,IAC7B,MAAM,gBAAgB,KACnB;AAAA,MAAQ,OACP,EAAE,SAAS,SACP;AAAA,QACE,GAAG;AAAA,QACH,MAAM,UAAU,KAAK,EAAE,IAAI;AAAA,QAC3B,eAAe,UAAU,KAAK,EAAE,aAAa;AAAA,MAC/C,IACA,EAAE,SAAS,UACT;AAAA,QACE,GAAG;AAAA,QACH,QAAQ,UAAU,KAAK,EAAE,MAAM;AAAA,MACjC,IACA,WAAW,CAAC;AAAA,IACpB,EACC,OAAO,SAAS;AAAA,IACnB,iBACE,gBAAgB,mBAAmB,OAC/B,OACA,UAAU,KAAK,gBAAgB,eAAe;AAAA,IACpD,iBACE,gBAAgB,mBAAmB,OAC/B,OACA,UAAU,KAAK,gBAAgB,eAAe;AAAA,EACtD;AACF;AACO,SAAS,iCACd,OACA,YACA,iBACuB;AACvB,QAAM,SAAS;AAAA,IACb;AAAA,IACA,UAAU,KAAK,UAAU;AAAA,EAC3B;AAEA,QAAM,OAAsC,OAAO,KAChD;AAAA,IAAI,OACH,EAAE,SAAS,SACP;AAAA,MACE,GAAG;AAAA,MACH,MAAM,uBAAuB,EAAE,IAAI;AAAA,MACnC,eAAe,uBAAuB,EAAE,aAAa;AAAA,MACrD,QAAQ,uBAAuB,EAAE,MAAM;AAAA,IACzC,IACA,EAAE,SAAS,UACT;AAAA,MACE,GAAG;AAAA,MACH,QAAQ,uBAAuB,EAAE,MAAM;AAAA,IACzC,IACA,WAAW,CAAC;AAAA,EACpB,EACC,OAAO,SAAS;AAEnB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,uBAAuB,UAAU;AAAA,IAC7C,UAAU,uBAAuB,OAAO,SAAS;AAAA,IACjD,UAAU,gBAAgB;AAAA,IAC1B,iBAAiB,uBAAuB,gBAAgB,eAAe;AAAA,IACvE,iBAAiB,uBAAuB,gBAAgB,eAAe;AAAA,IACvE;AAAA,EACF;AACF;AAqBO,IAAM,6CAA6C,CACxD,kBACA,kBACsE;AACtE,QAAM,uBAAuB,iBAAiB,CAAC;AAC/C,QAAM,sBAAsB,KAAK,gBAAgB;AAEjD,QAAM,QAAQ,iBAAiB;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,WAAW,wBAAwB,OAAO,aAAa;AAE7D,QAAM,aAAa,UAAU,KAAK,qBAAqB,UAAU;AACjE,QAAM,cAAc,sBAAsB,OAAO,UAAU;AAE3D,QAAM,OAAsC,YACzC,QAAQ,OAAK,EAAE,IAAI,EACnB;AAAA,IAAI,OACH,EAAE,SAAS,SACP;AAAA,MACE,GAAG;AAAA,MACH,MAAM,uBAAuB,EAAE,IAAI;AAAA,MACnC,eAAe,uBAAuB,EAAE,aAAa;AAAA,MACrD,QAAQ,uBAAuB,EAAE,MAAM;AAAA,IACzC,IACA,EAAE,SAAS,UACT;AAAA,MACE,GAAG;AAAA,MACH,QAAQ,uBAAuB,EAAE,MAAM;AAAA,IACzC,IACA,WAAW,CAAC;AAAA,EACpB,EACC,OAAO,SAAS;AAEnB,SAAO;AAAA,IACL,WAAW,qBAAqB;AAAA,IAChC,WAAW,qBAAqB;AAAA,IAChC,SAAS,oBAAoB;AAAA,IAC7B,SAAS,oBAAoB;AAAA,IAC7B,YAAY,uBAAuB,UAAU;AAAA,IAC7C,UAAU,uBAAuB,KAAK,WAAW,EAAE,SAAS;AAAA,IAC5D,UAAU,SAAS;AAAA,IACnB;AAAA,IACA,iBAAiB,uBAAuB,SAAS,eAAe;AAAA,IAChE,iBAAiB,uBAAuB,SAAS,eAAe;AAAA,IAChE;AAAA,EACF;AACF;","names":[]}