@avalabs/fusion-sdk 0.15.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/constants.cjs +1 -1
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.cts +21 -1
  4. package/dist/constants.d.ts +21 -1
  5. package/dist/constants.js +1 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/errors.cjs +1 -1
  8. package/dist/errors.cjs.map +1 -1
  9. package/dist/errors.js +1 -1
  10. package/dist/errors.js.map +1 -1
  11. package/dist/mod.cjs +1 -1
  12. package/dist/mod.d.cts +7 -5
  13. package/dist/mod.d.ts +7 -5
  14. package/dist/mod.js +1 -1
  15. package/dist/quoter/quoter.cjs +1 -1
  16. package/dist/quoter/quoter.cjs.map +1 -1
  17. package/dist/quoter/quoter.js +1 -1
  18. package/dist/quoter/quoter.js.map +1 -1
  19. package/dist/transfer-manager.cjs +1 -1
  20. package/dist/transfer-manager.cjs.map +1 -1
  21. package/dist/transfer-manager.js +1 -1
  22. package/dist/transfer-manager.js.map +1 -1
  23. package/dist/transfer-service/_evm-gas.cjs +1 -1
  24. package/dist/transfer-service/_evm-gas.js +1 -1
  25. package/dist/transfer-service/_utils.cjs +1 -1
  26. package/dist/transfer-service/_utils.cjs.map +1 -1
  27. package/dist/transfer-service/_utils.js +1 -1
  28. package/dist/transfer-service/_utils.js.map +1 -1
  29. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs +2 -0
  30. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs.map +1 -0
  31. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js +2 -0
  32. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js.map +1 -0
  33. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +2 -0
  34. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs.map +1 -0
  35. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +2 -0
  36. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js.map +1 -0
  37. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs +2 -0
  38. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs.map +1 -0
  39. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js +2 -0
  40. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js.map +1 -0
  41. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +2 -0
  42. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  43. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +2 -0
  44. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -0
  45. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs +2 -0
  46. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs.map +1 -0
  47. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js +2 -0
  48. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js.map +1 -0
  49. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +2 -0
  50. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -0
  51. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +2 -0
  52. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -0
  53. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +2 -0
  54. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs.map +1 -0
  55. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +2 -0
  56. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js.map +1 -0
  57. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +2 -0
  58. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -0
  59. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +2 -0
  60. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -0
  61. package/dist/transfer-service/avalanche-cct/_type-guards.cjs +2 -0
  62. package/dist/transfer-service/avalanche-cct/_type-guards.cjs.map +1 -0
  63. package/dist/transfer-service/avalanche-cct/_type-guards.js +2 -0
  64. package/dist/transfer-service/avalanche-cct/_type-guards.js.map +1 -0
  65. package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs +2 -0
  66. package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs.map +1 -0
  67. package/dist/transfer-service/avalanche-cct/_utils/addresses.js +2 -0
  68. package/dist/transfer-service/avalanche-cct/_utils/addresses.js.map +1 -0
  69. package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +2 -0
  70. package/dist/transfer-service/avalanche-cct/_utils/fees.cjs.map +1 -0
  71. package/dist/transfer-service/avalanche-cct/_utils/fees.js +2 -0
  72. package/dist/transfer-service/avalanche-cct/_utils/fees.js.map +1 -0
  73. package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs +2 -0
  74. package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs.map +1 -0
  75. package/dist/transfer-service/avalanche-cct/_utils/p-chain.js +2 -0
  76. package/dist/transfer-service/avalanche-cct/_utils/p-chain.js.map +1 -0
  77. package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +2 -0
  78. package/dist/transfer-service/avalanche-cct/_utils/polling.cjs.map +1 -0
  79. package/dist/transfer-service/avalanche-cct/_utils/polling.js +2 -0
  80. package/dist/transfer-service/avalanche-cct/_utils/polling.js.map +1 -0
  81. package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs +2 -0
  82. package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs.map +1 -0
  83. package/dist/transfer-service/avalanche-cct/_utils/transactions.js +2 -0
  84. package/dist/transfer-service/avalanche-cct/_utils/transactions.js.map +1 -0
  85. package/dist/transfer-service/avalanche-cct/_utils.cjs +2 -0
  86. package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -0
  87. package/dist/transfer-service/avalanche-cct/_utils.js +2 -0
  88. package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -0
  89. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +2 -0
  90. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -0
  91. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +2 -0
  92. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -0
  93. package/dist/transfer-service/avalanche-cct/constants.cjs +2 -0
  94. package/dist/transfer-service/avalanche-cct/constants.cjs.map +1 -0
  95. package/dist/transfer-service/avalanche-cct/constants.js +2 -0
  96. package/dist/transfer-service/avalanche-cct/constants.js.map +1 -0
  97. package/dist/transfer-service/avalanche-cct/types.d.cts +33 -0
  98. package/dist/transfer-service/avalanche-cct/types.d.ts +33 -0
  99. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs +1 -1
  100. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs.map +1 -1
  101. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js +1 -1
  102. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js.map +1 -1
  103. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +1 -1
  104. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +1 -1
  105. package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +1 -1
  106. package/dist/transfer-service/avalanche-evm/_utils/wrap.js +1 -1
  107. package/dist/transfer-service/fetch-utilities.cjs +1 -1
  108. package/dist/transfer-service/fetch-utilities.cjs.map +1 -1
  109. package/dist/transfer-service/fetch-utilities.js +1 -1
  110. package/dist/transfer-service/fetch-utilities.js.map +1 -1
  111. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs +1 -1
  112. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs.map +1 -1
  113. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js +1 -1
  114. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js.map +1 -1
  115. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs +1 -1
  116. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs.map +1 -1
  117. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js +1 -1
  118. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js.map +1 -1
  119. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  120. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  121. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs +1 -1
  122. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs.map +1 -1
  123. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js +1 -1
  124. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js.map +1 -1
  125. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
  126. package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
  127. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  128. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  129. package/dist/transfer-service/markr/_schema.cjs +1 -1
  130. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  131. package/dist/transfer-service/markr/_schema.js +1 -1
  132. package/dist/transfer-service/markr/_schema.js.map +1 -1
  133. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  134. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  135. package/dist/transfer-service/service-schemas.cjs +1 -1
  136. package/dist/transfer-service/service-schemas.cjs.map +1 -1
  137. package/dist/transfer-service/service-schemas.js +1 -1
  138. package/dist/transfer-service/service-schemas.js.map +1 -1
  139. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +1 -1
  140. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -1
  141. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +1 -1
  142. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -1
  143. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
  144. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
  145. package/dist/types/asset.d.cts +18 -2
  146. package/dist/types/asset.d.ts +18 -2
  147. package/dist/types/quote.d.cts +1 -1
  148. package/dist/types/quote.d.ts +1 -1
  149. package/dist/types/service.d.cts +95 -7
  150. package/dist/types/service.d.ts +95 -7
  151. package/dist/types/transfer-manager.d.cts +19 -10
  152. package/dist/types/transfer-manager.d.ts +19 -10
  153. package/dist/types/utility-types.d.cts +8 -1
  154. package/dist/types/utility-types.d.ts +8 -1
  155. package/dist/utils/asset-id.cjs +1 -1
  156. package/dist/utils/asset-id.cjs.map +1 -1
  157. package/dist/utils/asset-id.js +1 -1
  158. package/dist/utils/asset-id.js.map +1 -1
  159. package/dist/utils/bridgeable-assets.cjs +2 -0
  160. package/dist/utils/bridgeable-assets.cjs.map +1 -0
  161. package/dist/utils/bridgeable-assets.d.cts +16 -0
  162. package/dist/utils/bridgeable-assets.d.ts +16 -0
  163. package/dist/utils/bridgeable-assets.js +2 -0
  164. package/dist/utils/bridgeable-assets.js.map +1 -0
  165. package/dist/utils/transfer-utils.cjs +1 -1
  166. package/dist/utils/transfer-utils.cjs.map +1 -1
  167. package/dist/utils/transfer-utils.js +1 -1
  168. package/dist/utils/transfer-utils.js.map +1 -1
  169. package/package.json +5 -3
@@ -0,0 +1,33 @@
1
+ import { AvalancheBlockchainAlias } from "../../constants.cjs";
2
+ import { Address } from "viem";
3
+ import { utils } from "@avalabs/avalanchejs";
4
+
5
+ //#region src/transfer-service/avalanche-cct/types.d.ts
6
+ type UtxoSet = utils.UtxoSet;
7
+ /**
8
+ * Returns a list of atomic UTXOs that have not been imported
9
+ * into the destination chain from the source chain yet.
10
+ *
11
+ * i.e. An export transaction occurred on the source chain, but a
12
+ * corresponding import transaction has not been executed on the destination chain yet.
13
+ */
14
+ type GetAtomicUtxosCallback = (destinationChain: AvalancheBlockchainAlias, sourceChain: AvalancheBlockchainAlias) => Promise<UtxoSet>;
15
+ /**
16
+ * Returns a list of UTXOs that are available to be used for a transfer on the specified chain.
17
+ */
18
+ type GetUtxosCallback = (chainAlias: Exclude<AvalancheBlockchainAlias, "C">) => Promise<UtxoSet>;
19
+ /**
20
+ * Given an EVM hex address, returns the corresponding Coreth bech32 address.
21
+ */
22
+ type GetCoreEthAddressCallback = (evmAddress: Address) => Promise<string> | string;
23
+ /**
24
+ * Given a chain alias, returns a list of addresses that the connected wallet controls on that chain.
25
+ */
26
+ type GetWalletAddressesForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string[]> | string[];
27
+ /**
28
+ * Get the address that will receive the "change" after transactions
29
+ */
30
+ type GetWalletChangeAddressForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string> | string;
31
+ //#endregion
32
+ export { GetAtomicUtxosCallback, GetCoreEthAddressCallback, GetUtxosCallback, GetWalletAddressesForChainAliasCallback, GetWalletChangeAddressForChainAliasCallback };
33
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1,33 @@
1
+ import { AvalancheBlockchainAlias } from "../../constants.js";
2
+ import { Address } from "viem";
3
+ import { utils } from "@avalabs/avalanchejs";
4
+
5
+ //#region src/transfer-service/avalanche-cct/types.d.ts
6
+ type UtxoSet = utils.UtxoSet;
7
+ /**
8
+ * Returns a list of atomic UTXOs that have not been imported
9
+ * into the destination chain from the source chain yet.
10
+ *
11
+ * i.e. An export transaction occurred on the source chain, but a
12
+ * corresponding import transaction has not been executed on the destination chain yet.
13
+ */
14
+ type GetAtomicUtxosCallback = (destinationChain: AvalancheBlockchainAlias, sourceChain: AvalancheBlockchainAlias) => Promise<UtxoSet>;
15
+ /**
16
+ * Returns a list of UTXOs that are available to be used for a transfer on the specified chain.
17
+ */
18
+ type GetUtxosCallback = (chainAlias: Exclude<AvalancheBlockchainAlias, "C">) => Promise<UtxoSet>;
19
+ /**
20
+ * Given an EVM hex address, returns the corresponding Coreth bech32 address.
21
+ */
22
+ type GetCoreEthAddressCallback = (evmAddress: Address) => Promise<string> | string;
23
+ /**
24
+ * Given a chain alias, returns a list of addresses that the connected wallet controls on that chain.
25
+ */
26
+ type GetWalletAddressesForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string[]> | string[];
27
+ /**
28
+ * Get the address that will receive the "change" after transactions
29
+ */
30
+ type GetWalletChangeAddressForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string> | string;
31
+ //#endregion
32
+ export { GetAtomicUtxosCallback, GetCoreEthAddressCallback, GetUtxosCallback, GetWalletAddressesForChainAliasCallback, GetWalletChangeAddressForChainAliasCallback };
33
+ //# sourceMappingURL=types.d.ts.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`);function n({serviceAssets:n}){return async({sourceAsset:r,sourceChainId:i,targetChainId:a})=>{let o=n[i];if(!o)return[];let s=t.getAssetId(i,r),c=o.find(e=>t.getAssetId(i,e)===s);if(!c)return[];let l=c.destinations[a];if(!l)return[];let u=n[a];if(!u)return[];let d=u.find(e=>`address`in e&&e.address.toLowerCase()===l.address.toLowerCase());return d?[{type:d.type,name:d.name,symbol:d.symbol,decimals:d.decimals,...`address`in d&&{address:d.address},...d.logoUri!==void 0&&{logoUri:d.logoUri},bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}]:[]}}exports.getBridgeableAssetsFactory=n;
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({serviceAssets:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1,d=r[a];if(!d)return n({assets:[],limit:l,page:u});let f=t.getAssetId(a,i),p=d.find(e=>t.getAssetId(a,e)===f);if(!p)return n({assets:[],limit:l,page:u});let m=p.destinations[o];if(!m)return n({assets:[],limit:l,page:u});let h=r[o];if(!h)return n({assets:[],limit:l,page:u});let g=h.find(e=>`address`in e&&e.address.toLowerCase()===m.address.toLowerCase());if(!g)return n({assets:[],limit:l,page:u});let _;return _=g.type===`native`?{id:t.getAssetId(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}:(g.type,{id:t.getAssetId(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,address:g.address,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}),n({assets:[_],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
2
2
  //# sourceMappingURL=get-bridgeable-assets.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.cjs","names":["getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return [];\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return [];\n\n const destination = found.destinations[targetChainId];\n if (!destination) return [];\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return [];\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return [];\n\n return [\n {\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...('address' in target && { address: target.address }),\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n } as BridgeableUiAsset,\n ];\n };\n}\n"],"mappings":"mFAKA,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBACqE,CACrE,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAWA,EAAAA,WAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAMA,EAAAA,WAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,MAAO,EAAE,CAErB,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,MAAO,EAAE,CAE3B,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CAGD,OAFK,EAEE,CACL,CACE,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,YAAa,GAAU,CAAE,QAAS,EAAO,QAAS,CACtD,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAACC,EAAAA,YAAY,cAAc,CAC7C,CACF,CAZmB,EAAE"}
1
+ {"version":3,"file":"get-bridgeable-assets.cjs","names":["getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: readonly BridgeableUiAsset[];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const destination = found.destinations[targetChainId];\n if (!destination) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n let bridgeableAsset: BridgeableUiAsset;\n\n if (target.type === 'native') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else if (target.type === 'erc20') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n }\n\n return paginateAssets({ assets: [bridgeableAsset], limit: pageLimit, page: currentPage });\n };\n}\n"],"mappings":"mFAQM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAEtB,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAWA,EAAAA,WAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAMA,EAAAA,WAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEtF,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAE5F,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CACD,GAAI,CAAC,EAAQ,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEvF,IAAI,EAoCJ,MAlCA,CAsBE,EAtBE,EAAO,OAAS,SACA,CAChB,GAAIA,EAAAA,WAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAACC,EAAAA,YAAY,cAAc,CAC7C,EACQ,EAAO,KACE,CAChB,GAAID,EAAAA,WAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,QAAS,EAAO,QAChB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAACC,EAAAA,YAAY,cAAc,CAC7C,EAcI,EAAe,CAAE,OAAQ,CAAC,EAAgB,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";function n({serviceAssets:n}){return async({sourceAsset:r,sourceChainId:i,targetChainId:a})=>{let o=n[i];if(!o)return[];let s=t(i,r),c=o.find(e=>t(i,e)===s);if(!c)return[];let l=c.destinations[a];if(!l)return[];let u=n[a];if(!u)return[];let d=u.find(e=>`address`in e&&e.address.toLowerCase()===l.address.toLowerCase());return d?[{type:d.type,name:d.name,symbol:d.symbol,decimals:d.decimals,...`address`in d&&{address:d.address},...d.logoUri!==void 0&&{logoUri:d.logoUri},bridgeProviders:[e.AVALANCHE_EVM]}]:[]}}export{n as getBridgeableAssetsFactory};
1
+ import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";const n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({serviceAssets:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1,d=r[a];if(!d)return n({assets:[],limit:l,page:u});let f=t(a,i),p=d.find(e=>t(a,e)===f);if(!p)return n({assets:[],limit:l,page:u});let m=p.destinations[o];if(!m)return n({assets:[],limit:l,page:u});let h=r[o];if(!h)return n({assets:[],limit:l,page:u});let g=h.find(e=>`address`in e&&e.address.toLowerCase()===m.address.toLowerCase());if(!g)return n({assets:[],limit:l,page:u});let _;return _=g.type===`native`?{id:t(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.AVALANCHE_EVM]}:(g.type,{id:t(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,address:g.address,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.AVALANCHE_EVM]}),n({assets:[_],limit:l,page:u})}}export{r as getBridgeableAssetsFactory};
2
2
  //# sourceMappingURL=get-bridgeable-assets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return [];\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return [];\n\n const destination = found.destinations[targetChainId];\n if (!destination) return [];\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return [];\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return [];\n\n return [\n {\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...('address' in target && { address: target.address }),\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n } as BridgeableUiAsset,\n ];\n };\n}\n"],"mappings":"4GAKA,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBACqE,CACrE,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAW,EAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAM,EAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,MAAO,EAAE,CAErB,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,MAAO,EAAE,CAE3B,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CAGD,OAFK,EAEE,CACL,CACE,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,YAAa,GAAU,CAAE,QAAS,EAAO,QAAS,CACtD,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAAC,EAAY,cAAc,CAC7C,CACF,CAZmB,EAAE"}
1
+ {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: readonly BridgeableUiAsset[];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const destination = found.destinations[targetChainId];\n if (!destination) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n let bridgeableAsset: BridgeableUiAsset;\n\n if (target.type === 'native') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else if (target.type === 'erc20') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n }\n\n return paginateAssets({ assets: [bridgeableAsset], limit: pageLimit, page: currentPage });\n };\n}\n"],"mappings":"4GAKA,MAGM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAEtB,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAW,EAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAM,EAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEtF,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAE5F,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CACD,GAAI,CAAC,EAAQ,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEvF,IAAI,EAoCJ,MAlCA,CAsBE,EAtBE,EAAO,OAAS,SACA,CAChB,GAAI,EAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAAC,EAAY,cAAc,CAC7C,EACQ,EAAO,KACE,CAChB,GAAI,EAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,QAAS,EAAO,QAChB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAAC,EAAY,cAAc,CAC7C,EAcI,EAAe,CAAE,OAAQ,CAAC,EAAgB,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../_utils/validations.cjs`),i=require(`../../_utils.cjs`),a=require(`../_utils/transfer-data.cjs`),o=require(`./get-minimum-transfer-amount.cjs`),s=require(`../_utils/unwrap.cjs`),c=require(`../_utils/wrap.cjs`);let l=require(`viem`);function u({config:u,evmSigner:d,feeEstimationMultiplier:f}){return async({gasSettings:p,onStepChange:m,quote:h})=>{if(!(0,l.isAddress)(h.fromAddress)||!(0,l.isAddress)(h.toAddress))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");r.validateTransferAddressesOrThrow(h.fromAddress,h.toAddress),r.validateTransferAddressesNotBlockedOrThrow([h.fromAddress,h.toAddress],u.addressBlocklist),r.validateChainCombinationOrThrow(h.sourceChain.chainId,h.targetChain.chainId);let g=await o.getMinimumTransferAmountFactory({config:u,feeEstimationMultiplier:f})({sourceAsset:h.assetIn,sourceChainId:h.sourceChain.chainId,targetAsset:h.assetOut,targetChainId:h.targetChain.chainId});if(h.amountIn<g)throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${g.toString()}`);let{ethToAva:_,source:v}=a.getTransferData({assetIn:h.assetIn,sourceChainId:h.sourceChain.chainId,targetChainId:h.targetChain.chainId},u),y=Date.now(),b,x,S=i.getEvmClientForChain({chain:h.targetChain}),C;try{C=await S.getBlockNumber()}catch{}_?[b,x]=await c.transferAssetFromEthToAva({amountIn:h.amountIn,assetIn:h.assetIn,evmConfig:u,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,targetChain:h.targetChain,gasSettings:p,onStepChange:m,quote:h}):[b,x]=await s.transferAssetFromAvaToEth({amountIn:h.amountIn,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,gasSettings:p,onStepChange:m,quote:h});let w=n.isAvalancheChain(h.sourceChain)?u.minimumConfirmations.avalanche:u.minimumConfirmations.ethereum;return x.status===`reverted`?{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,errorCode:t.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:w,startedAtMs:y,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`failed`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}:{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:w,startedAtMs:y,targetStartBlockNumber:C,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`source-pending`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}}}exports.transferAssetFactory=u;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../_utils/validations.cjs`),a=require(`../_utils/transfer-data.cjs`),o=require(`./get-minimum-transfer-amount.cjs`),s=require(`../_utils/unwrap.cjs`),c=require(`../_utils/wrap.cjs`);let l=require(`viem`);function u({config:u,evmSigner:d,feeEstimationMultiplier:f}){return async({gasSettings:p,onStepChange:m,quote:h})=>{if(!(0,l.isAddress)(h.fromAddress)||!(0,l.isAddress)(h.toAddress))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");i.validateTransferAddressesOrThrow(h.fromAddress,h.toAddress),i.validateTransferAddressesNotBlockedOrThrow([h.fromAddress,h.toAddress],u.addressBlocklist),i.validateChainCombinationOrThrow(h.sourceChain.chainId,h.targetChain.chainId);let g=await o.getMinimumTransferAmountFactory({config:u,feeEstimationMultiplier:f})({sourceAsset:h.assetIn,sourceChainId:h.sourceChain.chainId,targetAsset:h.assetOut,targetChainId:h.targetChain.chainId});if(h.amountIn<g)throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${g.toString()}`);let{ethToAva:_,source:v}=a.getTransferData({assetIn:h.assetIn,sourceChainId:h.sourceChain.chainId,targetChainId:h.targetChain.chainId},u),y=Date.now(),b,x,S=n.getEvmClientForChain({chain:h.targetChain}),C;try{C=await S.getBlockNumber()}catch{}_?[b,x]=await c.transferAssetFromEthToAva({amountIn:h.amountIn,assetIn:h.assetIn,evmConfig:u,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,targetChain:h.targetChain,gasSettings:p,onStepChange:m,quote:h}):[b,x]=await s.transferAssetFromAvaToEth({amountIn:h.amountIn,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,gasSettings:p,onStepChange:m,quote:h});let w=r.isAvalancheChain(h.sourceChain)?u.minimumConfirmations.avalanche:u.minimumConfirmations.ethereum;return x.status===`reverted`?{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,errorCode:t.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:w,startedAtMs:y,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`failed`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}:{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:w,startedAtMs:y,targetStartBlockNumber:C,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`source-pending`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}}}exports.transferAssetFactory=u;
2
2
  //# sourceMappingURL=transfer-asset.cjs.map
@@ -1,2 +1,2 @@
1
- import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r}from"../../../errors.js";import{isAvalancheChain as i}from"../../../_utils/chain.js";import{validateChainCombinationOrThrow as a,validateTransferAddressesNotBlockedOrThrow as o,validateTransferAddressesOrThrow as s}from"../_utils/validations.js";import{getEvmClientForChain as c}from"../../_utils.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{getMinimumTransferAmountFactory as u}from"./get-minimum-transfer-amount.js";import{transferAssetFromAvaToEth as d}from"../_utils/unwrap.js";import{transferAssetFromEthToAva as f}from"../_utils/wrap.js";import{isAddress as p}from"viem";function m({config:m,evmSigner:h,feeEstimationMultiplier:g}){return async({gasSettings:_,onStepChange:v,quote:y})=>{if(!p(y.fromAddress)||!p(y.toAddress))throw new r(n.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");s(y.fromAddress,y.toAddress),o([y.fromAddress,y.toAddress],m.addressBlocklist),a(y.sourceChain.chainId,y.targetChain.chainId);let b=await u({config:m,feeEstimationMultiplier:g})({sourceAsset:y.assetIn,sourceChainId:y.sourceChain.chainId,targetAsset:y.assetOut,targetChainId:y.targetChain.chainId});if(y.amountIn<b)throw new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${b.toString()}`);let{ethToAva:x,source:S}=l({assetIn:y.assetIn,sourceChainId:y.sourceChain.chainId,targetChainId:y.targetChain.chainId},m),C=Date.now(),w,T,E=c({chain:y.targetChain}),D;try{D=await E.getBlockNumber()}catch{}x?[w,T]=await f({amountIn:y.amountIn,assetIn:y.assetIn,evmConfig:m,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,targetChain:y.targetChain,gasSettings:_,onStepChange:v,quote:y}):[w,T]=await d({amountIn:y.amountIn,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,gasSettings:_,onStepChange:v,quote:y});let O=i(y.sourceChain)?m.minimumConfirmations.avalanche:m.minimumConfirmations.ethereum;return T.status===`reverted`?{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,errorCode:t.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:O,startedAtMs:C,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`failed`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}:{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:O,startedAtMs:C,targetStartBlockNumber:D,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`source-pending`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}}}export{m as transferAssetFactory};
1
+ import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r}from"../../../errors.js";import{getEvmClientForChain as i}from"../../_utils.js";import{isAvalancheChain as a}from"../../../_utils/chain.js";import{validateChainCombinationOrThrow as o,validateTransferAddressesNotBlockedOrThrow as s,validateTransferAddressesOrThrow as c}from"../_utils/validations.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{getMinimumTransferAmountFactory as u}from"./get-minimum-transfer-amount.js";import{transferAssetFromAvaToEth as d}from"../_utils/unwrap.js";import{transferAssetFromEthToAva as f}from"../_utils/wrap.js";import{isAddress as p}from"viem";function m({config:m,evmSigner:h,feeEstimationMultiplier:g}){return async({gasSettings:_,onStepChange:v,quote:y})=>{if(!p(y.fromAddress)||!p(y.toAddress))throw new r(n.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");c(y.fromAddress,y.toAddress),s([y.fromAddress,y.toAddress],m.addressBlocklist),o(y.sourceChain.chainId,y.targetChain.chainId);let b=await u({config:m,feeEstimationMultiplier:g})({sourceAsset:y.assetIn,sourceChainId:y.sourceChain.chainId,targetAsset:y.assetOut,targetChainId:y.targetChain.chainId});if(y.amountIn<b)throw new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${b.toString()}`);let{ethToAva:x,source:S}=l({assetIn:y.assetIn,sourceChainId:y.sourceChain.chainId,targetChainId:y.targetChain.chainId},m),C=Date.now(),w,T,E=i({chain:y.targetChain}),D;try{D=await E.getBlockNumber()}catch{}x?[w,T]=await f({amountIn:y.amountIn,assetIn:y.assetIn,evmConfig:m,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,targetChain:y.targetChain,gasSettings:_,onStepChange:v,quote:y}):[w,T]=await d({amountIn:y.amountIn,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,gasSettings:_,onStepChange:v,quote:y});let O=a(y.sourceChain)?m.minimumConfirmations.avalanche:m.minimumConfirmations.ethereum;return T.status===`reverted`?{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,errorCode:t.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:O,startedAtMs:C,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`failed`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}:{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:O,startedAtMs:C,targetStartBlockNumber:D,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`source-pending`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}}}export{m as transferAssetFactory};
2
2
  //# sourceMappingURL=transfer-asset.js.map
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../type-guards.cjs`),r=require(`../../../utils/caip.cjs`),i=require(`../../../_utils/chain.cjs`),a=require(`../../_utils.cjs`),o=require(`../../_abis.cjs`);let s=require(`viem`);async function c({amountIn:e,assetIn:t,evmConfig:r,fromAddress:i,gasSettings:a,onStepChange:o,quote:s,sign:c,source:u,sourceChain:d,targetChain:p}){return n.isNativeAsset(t)?f({amountIn:e,evmConfig:r,fromAddress:i,source:u,sourceChain:d,targetChain:p,quote:s,sign:c,onStepChange:o,gasSettings:a}):l({amountIn:e,evmConfig:r,source:u,sourceChain:d,quote:s,fromAddress:i,sign:c,onStepChange:o,gasSettings:a})}async function l({amountIn:t,evmConfig:n,fromAddress:i,gasSettings:o,onStepChange:c,quote:l,sign:u,source:d,sourceChain:f}){let p=n.walletAddresses.ethereum,m=a.getEvmClientForChain({chain:f}),h={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:l,requiredSignatures:1};c?.(h);let g=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[p,t]}),_=await u({chainId:r.caip2ToEip155HexChainId(f.chainId),data:g,from:i,to:d.token.address,...o?.maxFeePerGas===void 0?null:{maxFeePerGas:o.maxFeePerGas,maxPriorityFeePerGas:o.maxPriorityFeePerGas}},e=>m.sendRawTransaction({serializedTransaction:e}),h);return[_,await m.waitForTransactionReceipt({hash:_})]}const u={[e.Blockchain.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.Blockchain.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function d({evmConfig:t,fromAddress:n,sourceChain:r,targetChain:o}){if(!(t.environment===e.Environment.PROD&&i.isMainnetChain(r)&&i.isMainnetChain(o)))return!1;let c=t.nativeTokenConfig.ethereumToken,l=t.nativeTokenConfig.avalancheToken;try{return await a.getEvmClientForChain({chain:r}).readContract({address:c.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.ETHEREUM]]})>0n?!0:await a.getEvmClientForChain({chain:o}).readContract({address:l.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.AVALANCHE]]})>0n}catch{return!1}}async function f({amountIn:n,evmConfig:c,fromAddress:l,gasSettings:u,onStepChange:f,quote:p,sign:m,source:h,sourceChain:g,targetChain:_}){let v=c.walletAddresses.ethereum,y=a.getEvmClientForChain({chain:g});if(!i.isAvalancheChain(_))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await d({evmConfig:c,fromAddress:l,sourceChain:g,targetChain:_}))throw new t.InvalidParamsError(t.ErrorReason.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.WrapToken,quote:p,requiredSignatures:2};f?.(b);let x=(0,s.encodeFunctionData)({abi:o.WETH_ABI,functionName:`deposit`}),S=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:x,from:l,to:h.token.address,value:n,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),b),C=await y.waitForTransactionReceipt({hash:S});if(C.status===`reverted`)return[S,C];let w={currentSignature:2,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:2};f?.(w);let T=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[v,n]}),E=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:T,from:l,to:h.token.address,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),w);return[E,await y.waitForTransactionReceipt({hash:E})]}exports.transferAssetFromEthToAva=c;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../type-guards.cjs`),r=require(`../../../utils/caip.cjs`),i=require(`../../_utils.cjs`),a=require(`../../../_utils/chain.cjs`),o=require(`../../_abis.cjs`);let s=require(`viem`);async function c({amountIn:e,assetIn:t,evmConfig:r,fromAddress:i,gasSettings:a,onStepChange:o,quote:s,sign:c,source:u,sourceChain:d,targetChain:p}){return n.isNativeAsset(t)?f({amountIn:e,evmConfig:r,fromAddress:i,source:u,sourceChain:d,targetChain:p,quote:s,sign:c,onStepChange:o,gasSettings:a}):l({amountIn:e,evmConfig:r,source:u,sourceChain:d,quote:s,fromAddress:i,sign:c,onStepChange:o,gasSettings:a})}async function l({amountIn:t,evmConfig:n,fromAddress:a,gasSettings:o,onStepChange:c,quote:l,sign:u,source:d,sourceChain:f}){let p=n.walletAddresses.ethereum,m=i.getEvmClientForChain({chain:f}),h={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:l,requiredSignatures:1};c?.(h);let g=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[p,t]}),_=await u({chainId:r.caip2ToEip155HexChainId(f.chainId),data:g,from:a,to:d.token.address,...o?.maxFeePerGas===void 0?null:{maxFeePerGas:o.maxFeePerGas,maxPriorityFeePerGas:o.maxPriorityFeePerGas}},e=>m.sendRawTransaction({serializedTransaction:e}),h);return[_,await m.waitForTransactionReceipt({hash:_})]}const u={[e.Blockchain.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.Blockchain.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function d({evmConfig:t,fromAddress:n,sourceChain:r,targetChain:o}){if(!(t.environment===e.Environment.PROD&&a.isMainnetChain(r)&&a.isMainnetChain(o)))return!1;let c=t.nativeTokenConfig.ethereumToken,l=t.nativeTokenConfig.avalancheToken;try{return await i.getEvmClientForChain({chain:r}).readContract({address:c.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.ETHEREUM]]})>0n?!0:await i.getEvmClientForChain({chain:o}).readContract({address:l.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.AVALANCHE]]})>0n}catch{return!1}}async function f({amountIn:n,evmConfig:c,fromAddress:l,gasSettings:u,onStepChange:f,quote:p,sign:m,source:h,sourceChain:g,targetChain:_}){let v=c.walletAddresses.ethereum,y=i.getEvmClientForChain({chain:g});if(!a.isAvalancheChain(_))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await d({evmConfig:c,fromAddress:l,sourceChain:g,targetChain:_}))throw new t.InvalidParamsError(t.ErrorReason.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.WrapToken,quote:p,requiredSignatures:2};f?.(b);let x=(0,s.encodeFunctionData)({abi:o.WETH_ABI,functionName:`deposit`}),S=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:x,from:l,to:h.token.address,value:n,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),b),C=await y.waitForTransactionReceipt({hash:S});if(C.status===`reverted`)return[S,C];let w={currentSignature:2,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:2};f?.(w);let T=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[v,n]}),E=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:T,from:l,to:h.token.address,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),w);return[E,await y.waitForTransactionReceipt({hash:E})]}exports.transferAssetFromEthToAva=c;
2
2
  //# sourceMappingURL=wrap.cjs.map
@@ -1,2 +1,2 @@
1
- import{Blockchain as e,Environment as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorReason as r,InvalidParamsError as i}from"../../../errors.js";import{isNativeAsset as a}from"../../../type-guards.js";import{caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{isAvalancheChain as s,isMainnetChain as c}from"../../../_utils/chain.js";import{getEvmClientForChain as l}from"../../_utils.js";import{WETH_ABI as u}from"../../_abis.js";import{encodeFunctionData as d,erc20Abi as f}from"viem";async function p({amountIn:e,assetIn:t,evmConfig:n,fromAddress:r,gasSettings:i,onStepChange:o,quote:s,sign:c,source:l,sourceChain:u,targetChain:d}){return a(t)?_({amountIn:e,evmConfig:n,fromAddress:r,source:l,sourceChain:u,targetChain:d,quote:s,sign:c,onStepChange:o,gasSettings:i}):m({amountIn:e,evmConfig:n,source:l,sourceChain:u,quote:s,fromAddress:r,sign:c,onStepChange:o,gasSettings:i})}async function m({amountIn:e,evmConfig:t,fromAddress:r,gasSettings:i,onStepChange:a,quote:s,sign:c,source:u,sourceChain:p}){let m=t.walletAddresses.ethereum,h=l({chain:p}),g={currentSignature:1,currentSignatureReason:n.TokensTransfer,quote:s,requiredSignatures:1};a?.(g);let _=d({abi:f,functionName:`transfer`,args:[m,e]}),v=await c({chainId:o(p.chainId),data:_,from:r,to:u.token.address,...i?.maxFeePerGas===void 0?null:{maxFeePerGas:i.maxFeePerGas,maxPriorityFeePerGas:i.maxPriorityFeePerGas}},e=>h.sendRawTransaction({serializedTransaction:e}),g);return[v,await h.waitForTransactionReceipt({hash:v})]}const h={[e.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function g({evmConfig:n,fromAddress:r,sourceChain:i,targetChain:a}){if(!(n.environment===t.PROD&&c(i)&&c(a)))return!1;let o=n.nativeTokenConfig.ethereumToken,s=n.nativeTokenConfig.avalancheToken;try{return await l({chain:i}).readContract({address:o.token.address,abi:f,functionName:`allowance`,args:[r,h[e.ETHEREUM]]})>0n?!0:await l({chain:a}).readContract({address:s.token.address,abi:f,functionName:`allowance`,args:[r,h[e.AVALANCHE]]})>0n}catch{return!1}}async function _({amountIn:e,evmConfig:t,fromAddress:a,gasSettings:c,onStepChange:p,quote:m,sign:h,source:_,sourceChain:v,targetChain:y}){let b=t.walletAddresses.ethereum,x=l({chain:v});if(!s(y))throw new i(r.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await g({evmConfig:t,fromAddress:a,sourceChain:v,targetChain:y}))throw new i(r.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let S={currentSignature:1,currentSignatureReason:n.WrapToken,quote:m,requiredSignatures:2};p?.(S);let C=d({abi:u,functionName:`deposit`}),w=await h({chainId:o(v.chainId),data:C,from:a,to:_.token.address,value:e,...c?.maxFeePerGas===void 0?null:{maxFeePerGas:c.maxFeePerGas,maxPriorityFeePerGas:c.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),S),T=await x.waitForTransactionReceipt({hash:w});if(T.status===`reverted`)return[w,T];let E={currentSignature:2,currentSignatureReason:n.TokensTransfer,quote:m,requiredSignatures:2};p?.(E);let D=d({abi:f,functionName:`transfer`,args:[b,e]}),O=await h({chainId:o(v.chainId),data:D,from:a,to:_.token.address,...c?.maxFeePerGas===void 0?null:{maxFeePerGas:c.maxFeePerGas,maxPriorityFeePerGas:c.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),E);return[O,await x.waitForTransactionReceipt({hash:O})]}export{p as transferAssetFromEthToAva};
1
+ import{Blockchain as e,Environment as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorReason as r,InvalidParamsError as i}from"../../../errors.js";import{isNativeAsset as a}from"../../../type-guards.js";import{caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{getEvmClientForChain as s}from"../../_utils.js";import{isAvalancheChain as c,isMainnetChain as l}from"../../../_utils/chain.js";import{WETH_ABI as u}from"../../_abis.js";import{encodeFunctionData as d,erc20Abi as f}from"viem";async function p({amountIn:e,assetIn:t,evmConfig:n,fromAddress:r,gasSettings:i,onStepChange:o,quote:s,sign:c,source:l,sourceChain:u,targetChain:d}){return a(t)?_({amountIn:e,evmConfig:n,fromAddress:r,source:l,sourceChain:u,targetChain:d,quote:s,sign:c,onStepChange:o,gasSettings:i}):m({amountIn:e,evmConfig:n,source:l,sourceChain:u,quote:s,fromAddress:r,sign:c,onStepChange:o,gasSettings:i})}async function m({amountIn:e,evmConfig:t,fromAddress:r,gasSettings:i,onStepChange:a,quote:c,sign:l,source:u,sourceChain:p}){let m=t.walletAddresses.ethereum,h=s({chain:p}),g={currentSignature:1,currentSignatureReason:n.TokensTransfer,quote:c,requiredSignatures:1};a?.(g);let _=d({abi:f,functionName:`transfer`,args:[m,e]}),v=await l({chainId:o(p.chainId),data:_,from:r,to:u.token.address,...i?.maxFeePerGas===void 0?null:{maxFeePerGas:i.maxFeePerGas,maxPriorityFeePerGas:i.maxPriorityFeePerGas}},e=>h.sendRawTransaction({serializedTransaction:e}),g);return[v,await h.waitForTransactionReceipt({hash:v})]}const h={[e.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function g({evmConfig:n,fromAddress:r,sourceChain:i,targetChain:a}){if(!(n.environment===t.PROD&&l(i)&&l(a)))return!1;let o=n.nativeTokenConfig.ethereumToken,c=n.nativeTokenConfig.avalancheToken;try{return await s({chain:i}).readContract({address:o.token.address,abi:f,functionName:`allowance`,args:[r,h[e.ETHEREUM]]})>0n?!0:await s({chain:a}).readContract({address:c.token.address,abi:f,functionName:`allowance`,args:[r,h[e.AVALANCHE]]})>0n}catch{return!1}}async function _({amountIn:e,evmConfig:t,fromAddress:a,gasSettings:l,onStepChange:p,quote:m,sign:h,source:_,sourceChain:v,targetChain:y}){let b=t.walletAddresses.ethereum,x=s({chain:v});if(!c(y))throw new i(r.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await g({evmConfig:t,fromAddress:a,sourceChain:v,targetChain:y}))throw new i(r.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let S={currentSignature:1,currentSignatureReason:n.WrapToken,quote:m,requiredSignatures:2};p?.(S);let C=d({abi:u,functionName:`deposit`}),w=await h({chainId:o(v.chainId),data:C,from:a,to:_.token.address,value:e,...l?.maxFeePerGas===void 0?null:{maxFeePerGas:l.maxFeePerGas,maxPriorityFeePerGas:l.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),S),T=await x.waitForTransactionReceipt({hash:w});if(T.status===`reverted`)return[w,T];let E={currentSignature:2,currentSignatureReason:n.TokensTransfer,quote:m,requiredSignatures:2};p?.(E);let D=d({abi:f,functionName:`transfer`,args:[b,e]}),O=await h({chainId:o(v.chainId),data:D,from:a,to:_.token.address,...l?.maxFeePerGas===void 0?null:{maxFeePerGas:l.maxFeePerGas,maxPriorityFeePerGas:l.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),E);return[O,await x.waitForTransactionReceipt({hash:O})]}export{p as transferAssetFromEthToAva};
2
2
  //# sourceMappingURL=wrap.js.map
@@ -1,4 +1,4 @@
1
- const e=require(`../errors.cjs`),t=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];async function n(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e.AbortedError)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e.AbortedError);n.addEventListener(`abort`,o)}})}function r(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function i(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function a(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function o(t,n){let r=new AbortController,i,a=!1,o=()=>{r.abort(t?.reason??new e.AbortedError)};return t&&(t.aborted?r.abort(t.reason??new e.AbortedError):t.addEventListener(`abort`,o)),n&&n>0&&(i=setTimeout(()=>{a=!0,r.abort(new e.TimeoutError)},n)),{cleanup:()=>{t&&t.removeEventListener(`abort`,o),i&&clearTimeout(i)},signal:r.signal,timedOut:()=>a}}function s(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):i(e,r?.backoff))}async function c(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function l(i,l={},u={}){let{fetch:d,retries:f=3,retryMethods:p=t,retryOn:m=e=>a(e,p)}=u,h=d??globalThis.fetch,g;for(let t=0;t<=f;t++){let{cleanup:a,signal:d,timedOut:p}=o(u.signal,u.timeoutMs);try{let o=await h(i,{...l,signal:d});if(o.ok)return a(),o;let p={attempt:t,init:l,input:i,response:o};if(!await m(p)||t===f){let t;try{t=await c(o)}catch{}throw a(),new e.HttpError(`HTTP ${o.status} ${o.statusText}`,o,t)}let g=r(o.headers.get(`retry-after`)),_=s(t,p,g,u);a(),await n(_,u.signal);continue}catch(r){a(),g=r;let o=e.isAbortedError(r),c={attempt:t,error:r,init:l,input:i};if(!(!o&&await m(c))||t===f)throw p()?new e.TimeoutError:o?new e.AbortedError(r.message??`Aborted`):r;await n(s(t,c,null,u),u.signal);continue}}throw g??Error(`Unknown fetch error.`)}function u(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
1
+ const e=require(`../errors.cjs`),t=require(`./_utils.cjs`),n=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];function r(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function i(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function a(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function o(t,n){let r=new AbortController,i,a=!1,o=()=>{r.abort(t?.reason??new e.AbortedError)};return t&&(t.aborted?r.abort(t.reason??new e.AbortedError):t.addEventListener(`abort`,o)),n&&n>0&&(i=setTimeout(()=>{a=!0,r.abort(new e.TimeoutError)},n)),{cleanup:()=>{t&&t.removeEventListener(`abort`,o),i&&clearTimeout(i)},signal:r.signal,timedOut:()=>a}}function s(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):i(e,r?.backoff))}async function c(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function l(i,l={},u={}){let{fetch:d,retries:f=3,retryMethods:p=n,retryOn:m=e=>a(e,p)}=u,h=d??globalThis.fetch,g;for(let n=0;n<=f;n++){let{cleanup:a,signal:d,timedOut:p}=o(u.signal,u.timeoutMs);try{let o=await h(i,{...l,signal:d});if(o.ok)return a(),o;let p={attempt:n,init:l,input:i,response:o};if(!await m(p)||n===f){let t;try{t=await c(o)}catch{}throw a(),new e.HttpError(`HTTP ${o.status} ${o.statusText}`,o,t)}let g=r(o.headers.get(`retry-after`)),_=s(n,p,g,u);a(),await t.wait(_,u.signal);continue}catch(r){a(),g=r;let o=e.isAbortedError(r),c={attempt:n,error:r,init:l,input:i};if(!(!o&&await m(c))||n===f)throw p()?new e.TimeoutError:o?new e.AbortedError(r.message??`Aborted`):r;await t.wait(s(n,c,null,u),u.signal);continue}}throw g??Error(`Unknown fetch error.`)}function u(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
2
2
  `:``)+i;break;case`event`:e.event=i;break;case`id`:e.id=i;break;case`retry`:{let t=Number(i);if(Number.isFinite(t)){e.retry=Math.floor(t);break}}}return null}}async function d(t,n={}){let r={Accept:n.accept??`application/json`,...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await l(t,{method:o,headers:r,body:i},n);if(!s.headers.get(`content-type`)?.includes(`application/json`))throw new e.HttpError(`Expected application/json response.`,s,await s.text());return await s.json()}function f(e,t){let n=e.pathname,r=n.endsWith(`/`)&&t.startsWith(`/`)?n+t.slice(1):!n.endsWith(`/`)&&!t.startsWith(`/`)?n+`/`+t:n+t;return new URL(r,e)}async function*p(t,n={}){let r={Accept:n.accept??(n.sse===!1?`*/*`:`text/event-stream`),...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await l(t,{body:i,headers:r,method:o},n);if(!s.body)throw new e.HttpError(`Response body is not a readable stream.`,s);let c=s.body.getReader(),d=new TextDecoder,f=u(),p=``;try{for(;;){let{done:e,value:t}=await c.read();if(e)break;p+=d.decode(t,{stream:!0});let r;for(;(r=p.indexOf(`
3
3
  `))>=0;){let e=p.slice(0,r);if(p=p.slice(r+1),n.sse===!1)e.length&&(yield e);else{let t=f(e);t&&(yield t)}}}n.sse===!1&&p.length&&(yield p)}finally{try{c.releaseLock()}catch{}}}exports.combineUrlPathnames=f,exports.fetchEventStream=p,exports.fetchJson=d;
4
4
  //# sourceMappingURL=fetch-utilities.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-utilities.cjs","names":["AbortedError","TimeoutError","HttpError","isAbortedError"],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\nexport async function _wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await _wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await _wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"iCAYM,EAAwB,CAAC,MAAO,OAAQ,UAAW,QAAQ,CAwDjE,eAAsB,EAAM,EAAiB,EAAqC,CAChF,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,GAAI,GAAW,EACb,OAAO,GAAS,CAGlB,IAAM,EAAY,eAAiB,CACjC,GAAS,CACT,GAAS,EACR,EAAQ,CAEL,MAAgB,CACpB,GAAS,CACT,EAAO,IAAIA,EAAAA,aAAe,EAGtB,MAAgB,CACpB,aAAa,EAAU,CAEnB,GACF,EAAO,oBAAoB,QAAS,EAAQ,EAIhD,GAAI,EAAQ,CACV,GAAI,EAAO,QAGT,OAFA,GAAS,CAEF,EAAO,IAAIA,EAAAA,aAAe,CAGnC,EAAO,iBAAiB,QAAS,EAAQ,GAE3C,CAaJ,SAAgB,EAAuB,EAA0C,CAC/E,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAU,OAAO,EAAW,CAElC,GAAI,CAAC,OAAO,MAAM,EAAQ,EAAI,GAAW,EACvC,OAAO,KAAK,MAAM,EAAQ,CAAG,IAK/B,IAAM,EAFO,IAAI,KAAK,EAAW,CAEd,SAAS,CAAG,KAAK,KAAK,CAEzC,OAAO,OAAO,SAAS,EAAM,EAAI,EAAQ,EAAI,EAAQ,KAGvD,SAAgB,EAAoB,EAAiB,EAA0B,EAAE,CAAU,CACzF,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,QAAU,IAAwB,CAAC,CACzE,EAAM,KAAK,IAAI,EAAM,KAAK,MAAM,EAAQ,OAAS,IAAuB,CAAC,CAEzE,EAAM,KAAK,IAAI,EAAK,EAAO,GAAK,EAAQ,CAG9C,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAG,EAAI,CAGxC,SAAgB,EAAa,EAAmB,EAAiC,CAC/E,IAAM,GAAU,EAAI,KAAK,QAAU,OAAO,aAAa,CAEvD,GAAI,CAAC,EAAa,SAAS,EAAO,CAChC,MAAO,GAGT,GAAI,EAAI,MAKN,MAJA,EAAI,EAAI,iBAAiBA,EAAAA,cAO3B,IAAM,EAAS,EAAI,UAAU,QAAU,EAMvC,OAJI,IAAW,KAAO,IAAW,KAAO,IAAW,KAAQ,GAAU,KAAO,GAAU,IAOxF,SAAgB,EACd,EACA,EACuE,CACvE,IAAM,EAAa,IAAI,gBAEnB,EACA,EAAa,GAEX,MAAwB,CAC5B,EAAW,MAAM,GAAU,QAAU,IAAIA,EAAAA,aAAe,EA4B1D,OAzBI,IACE,EAAS,QACX,EAAW,MAAM,EAAS,QAAU,IAAIA,EAAAA,aAAe,CAEvD,EAAS,iBAAiB,QAAS,EAAgB,EAInD,GAAa,EAAY,IAC3B,EAAY,eAAiB,CAC3B,EAAa,GACb,EAAW,MAAM,IAAIC,EAAAA,aAAe,EACnC,EAAU,EAaR,CACL,YAXoB,CAChB,GACF,EAAS,oBAAoB,QAAS,EAAgB,CAGpD,GACF,aAAa,EAAU,EAMzB,OAAQ,EAAW,OACnB,aAAgB,EACjB,CAGH,SAAgB,EACd,EACA,EACA,EACA,EACQ,CASR,OARI,IAIA,OAAO,GAAS,SAAY,WACvB,EAAQ,QAAQ,EAAI,CAGtB,EAAoB,EAAS,GAAS,QAAQ,EAGvD,eAAe,EAAmB,EAAsC,CAGtE,IAFoB,EAAS,QAAQ,IAAI,eAAe,EAAI,IAE5C,SAAS,mBAAmB,CAC1C,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,EAKV,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,GAOV,eAAsB,EACpB,EACA,EAAoB,EAAE,CACtB,EAAiC,EAAE,CAChB,CACnB,GAAM,CACJ,MAAO,EACP,UAAU,EACV,eAAe,EACf,UAAW,GAAsB,EAAa,EAAK,EAAa,EAC9D,EAEE,EAAmB,GAAe,WAAW,MAE/C,EAEJ,IAAK,IAAI,EAAU,EAAG,GAAW,EAAS,IAAW,CACnD,GAAM,CAAE,UAAS,SAAQ,YAAa,EAAqB,EAAQ,OAAQ,EAAQ,UAAU,CAE7F,GAAI,CACF,IAAM,EAAW,MAAM,EAAU,EAAO,CAAE,GAAG,EAAM,SAAQ,CAAC,CAE5D,GAAI,EAAS,GAEX,OADA,GAAS,CACF,EAGT,IAAM,EAAoB,CACxB,UACA,OACA,QACA,WACD,CAID,GAAI,CAFY,MAAM,EAAQ,EAAI,EAElB,IAAY,EAAS,CAGnC,IAAI,EACJ,GAAI,CACF,EAAO,MAAM,EAAmB,EAAS,MACnC,EAMR,MAFA,GAAS,CAEH,IAAIC,EAAAA,UAAU,QAAQ,EAAS,OAAO,GAAG,EAAS,aAAc,EAAU,EAAK,CAGvF,IAAM,EAAe,EAAuB,EAAS,QAAQ,IAAI,cAAc,CAAC,CAC1E,EAAQ,EAAqB,EAAS,EAAK,EAAc,EAAQ,CAEvE,GAAS,CAET,MAAM,EAAM,EAAO,EAAQ,OAAO,CAElC,eACO,EAAgB,CACvB,GAAS,CAET,EAAY,EAEZ,IAAM,EAAeC,EAAAA,eAAe,EAAM,CAEpC,EAAoB,CACxB,UACA,QACA,OACA,QACD,CAID,GAAI,EAFY,CAAC,GAAiB,MAAM,EAAQ,EAAI,GAEpC,IAAY,EAS1B,MARI,GAAU,CACN,IAAIF,EAAAA,aAGR,EACI,IAAID,EAAAA,aAAa,EAAM,SAAW,UAAU,CAG9C,EAKR,MAAM,EAFQ,EAAqB,EAAS,EAAK,KAAM,EAAQ,CAE5C,EAAQ,OAAO,CAElC,UAKJ,MAAM,GAAiB,MAAM,uBAAuB,CAGtD,SAAgB,GAAoD,CAClE,IAAI,EAAyC,KAE7C,MAAQ,IAAkC,CAExC,GAAI,EAAK,MAAM,GAAK,GAAI,CACtB,GAAI,GAAgB,OAAO,EAAa,MAAS,SAAU,CACzD,IAAM,EAAgB,CACpB,KAAM,EAAa,KACnB,MAAO,EAAa,MACpB,GAAI,EAAa,GACjB,MAAO,EAAa,MACrB,CAID,MAFA,GAAe,KAER,EAKT,MAFA,GAAe,KAER,KAGT,IAAM,EAAa,EAAK,QAAQ,IAAI,CAC9B,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAG,EAAW,CAAG,EACxD,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAa,EAAE,CAAG,GAQ3D,OANI,EAAM,WAAW,IAAI,GACvB,EAAQ,EAAM,MAAM,EAAE,EAGxB,IAA+B,EAAE,CAEzB,EAAR,CACE,IAAK,OACH,EAAa,MAAQ,EAAa,KAAO,EAAa,KAAO;EAAO,IAAM,EAC1E,MAEF,IAAK,QACH,EAAa,MAAQ,EACrB,MAEF,IAAK,KACH,EAAa,GAAK,EAClB,MAEF,IAAK,QAAS,CACZ,IAAM,EAAQ,OAAO,EAAM,CAE3B,GAAI,OAAO,SAAS,EAAM,CAAE,CAC1B,EAAa,MAAQ,KAAK,MAAM,EAAM,CACtC,QAKN,OAAO,MAYX,eAAsB,EAAU,EAA0B,EAA8B,EAAE,CAAoB,CAC5G,IAAM,EAAkC,CACtC,OAAQ,EAAQ,QAAU,mBAC1B,GAAI,EAAQ,SAAW,EAAE,CAC1B,CAEK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,SAAQ,UAAS,OAAM,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAGrE,MAAM,IAAIE,EAAAA,UAAU,sCAAuC,EAF9C,MAAM,EAAS,MAAM,CAEwC,CAK5E,OAFc,MAAM,EAAS,MAAM,CAKrC,SAAgB,EAAoB,EAAc,EAAuB,CACvE,IAAM,EAAkB,EAAQ,SAE1B,EACJ,EAAgB,SAAS,IAAI,EAAI,EAAS,WAAW,IAAI,CACrD,EAAkB,EAAS,MAAM,EAAE,CACnC,CAAC,EAAgB,SAAS,IAAI,EAAI,CAAC,EAAS,WAAW,IAAI,CAC3D,EAAkB,IAAM,EACxB,EAAkB,EAExB,OAAO,IAAI,IAAI,EAAS,EAAQ,CA8BlC,eAAuB,EACrB,EACA,EAA8B,EAAE,CACG,CACnC,IAAM,EAAkC,CACtC,OAAQ,EAAQ,SAAW,EAAQ,MAAQ,GAAQ,MAAQ,qBAC3D,GAAI,EAAQ,SAAW,EAAE,CAC1B,CACK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,OAAM,UAAS,SAAQ,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,KACZ,MAAM,IAAIA,EAAAA,UAAU,0CAA2C,EAAS,CAG1E,IAAM,EAAS,EAAS,KAAK,WAAW,CAClC,EAAU,IAAI,YACd,EAAQ,GAAgB,CAE1B,EAAS,GAEb,GAAI,CACF,OAAa,CACX,GAAM,CAAE,OAAM,SAAU,MAAM,EAAO,MAAM,CAE3C,GAAI,EACF,MAGF,GAAU,EAAQ,OAAO,EAAO,CAAE,OAAQ,GAAM,CAAC,CAEjD,IAAI,EAEJ,MAAQ,EAAe,EAAO,QAAQ;EAAK,GAAK,GAAG,CACjD,IAAM,EAAO,EAAO,MAAM,EAAG,EAAa,CAG1C,GAFA,EAAS,EAAO,MAAM,EAAe,EAAE,CAEnC,EAAQ,MAAQ,GACd,EAAK,SACP,MAAM,OAEH,CACL,IAAM,EAAQ,EAAM,EAAK,CAErB,IACF,MAAM,KAMV,EAAQ,MAAQ,IAAS,EAAO,SAClC,MAAM,UAEA,CACR,GAAI,CACF,EAAO,aAAa,MACd"}
1
+ {"version":3,"file":"fetch-utilities.cjs","names":["AbortedError","TimeoutError","HttpError","wait","isAbortedError"],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\nimport { wait } from './_utils';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{AbortedError as e,HttpError as t,TimeoutError as n,isAbortedError as r}from"../errors.js";const i=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];async function a(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e);n.addEventListener(`abort`,o)}})}function o(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function s(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function c(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function l(t,r){let i=new AbortController,a,o=!1,s=()=>{i.abort(t?.reason??new e)};return t&&(t.aborted?i.abort(t.reason??new e):t.addEventListener(`abort`,s)),r&&r>0&&(a=setTimeout(()=>{o=!0,i.abort(new n)},r)),{cleanup:()=>{t&&t.removeEventListener(`abort`,s),a&&clearTimeout(a)},signal:i.signal,timedOut:()=>o}}function u(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):s(e,r?.backoff))}async function d(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function f(s,f={},p={}){let{fetch:m,retries:h=3,retryMethods:g=i,retryOn:_=e=>c(e,g)}=p,v=m??globalThis.fetch,y;for(let i=0;i<=h;i++){let{cleanup:c,signal:m,timedOut:g}=l(p.signal,p.timeoutMs);try{let e=await v(s,{...f,signal:m});if(e.ok)return c(),e;let n={attempt:i,init:f,input:s,response:e};if(!await _(n)||i===h){let n;try{n=await d(e)}catch{}throw c(),new t(`HTTP ${e.status} ${e.statusText}`,e,n)}let r=o(e.headers.get(`retry-after`)),l=u(i,n,r,p);c(),await a(l,p.signal);continue}catch(t){c(),y=t;let o=r(t),l={attempt:i,error:t,init:f,input:s};if(!(!o&&await _(l))||i===h)throw g()?new n:o?new e(t.message??`Aborted`):t;await a(u(i,l,null,p),p.signal);continue}}throw y??Error(`Unknown fetch error.`)}function p(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
1
+ import{AbortedError as e,HttpError as t,TimeoutError as n,isAbortedError as r}from"../errors.js";import{wait as i}from"./_utils.js";const a=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];function o(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function s(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function c(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function l(t,r){let i=new AbortController,a,o=!1,s=()=>{i.abort(t?.reason??new e)};return t&&(t.aborted?i.abort(t.reason??new e):t.addEventListener(`abort`,s)),r&&r>0&&(a=setTimeout(()=>{o=!0,i.abort(new n)},r)),{cleanup:()=>{t&&t.removeEventListener(`abort`,s),a&&clearTimeout(a)},signal:i.signal,timedOut:()=>o}}function u(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):s(e,r?.backoff))}async function d(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function f(s,f={},p={}){let{fetch:m,retries:h=3,retryMethods:g=a,retryOn:_=e=>c(e,g)}=p,v=m??globalThis.fetch,y;for(let a=0;a<=h;a++){let{cleanup:c,signal:m,timedOut:g}=l(p.signal,p.timeoutMs);try{let e=await v(s,{...f,signal:m});if(e.ok)return c(),e;let n={attempt:a,init:f,input:s,response:e};if(!await _(n)||a===h){let n;try{n=await d(e)}catch{}throw c(),new t(`HTTP ${e.status} ${e.statusText}`,e,n)}let r=o(e.headers.get(`retry-after`)),l=u(a,n,r,p);c(),await i(l,p.signal);continue}catch(t){c(),y=t;let o=r(t),l={attempt:a,error:t,init:f,input:s};if(!(!o&&await _(l))||a===h)throw g()?new n:o?new e(t.message??`Aborted`):t;await i(u(a,l,null,p),p.signal);continue}}throw y??Error(`Unknown fetch error.`)}function p(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
2
2
  `:``)+i;break;case`event`:e.event=i;break;case`id`:e.id=i;break;case`retry`:{let t=Number(i);if(Number.isFinite(t)){e.retry=Math.floor(t);break}}}return null}}async function m(e,n={}){let r={Accept:n.accept??`application/json`,...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await f(e,{method:o,headers:r,body:i},n);if(!s.headers.get(`content-type`)?.includes(`application/json`))throw new t(`Expected application/json response.`,s,await s.text());return await s.json()}function h(e,t){let n=e.pathname,r=n.endsWith(`/`)&&t.startsWith(`/`)?n+t.slice(1):!n.endsWith(`/`)&&!t.startsWith(`/`)?n+`/`+t:n+t;return new URL(r,e)}async function*g(e,n={}){let r={Accept:n.accept??(n.sse===!1?`*/*`:`text/event-stream`),...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await f(e,{body:i,headers:r,method:o},n);if(!s.body)throw new t(`Response body is not a readable stream.`,s);let c=s.body.getReader(),l=new TextDecoder,u=p(),d=``;try{for(;;){let{done:e,value:t}=await c.read();if(e)break;d+=l.decode(t,{stream:!0});let r;for(;(r=d.indexOf(`
3
3
  `))>=0;){let e=d.slice(0,r);if(d=d.slice(r+1),n.sse===!1)e.length&&(yield e);else{let t=u(e);t&&(yield t)}}}n.sse===!1&&d.length&&(yield d)}finally{try{c.releaseLock()}catch{}}}export{h as combineUrlPathnames,g as fetchEventStream,m as fetchJson};
4
4
  //# sourceMappingURL=fetch-utilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-utilities.js","names":[],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\nexport async function _wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await _wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await _wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"fetch-utilities.js","names":[],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\nimport { wait } from './_utils';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../constants.cjs`);function t({config:t}){return async({sourceAsset:n,sourceChainId:r,targetChainId:i})=>r!==t.sourceChain||i!==t.targetChain||n.type!==e.TokenType.NATIVE?[]:[{...t.targetAsset,bridgeProviders:[e.ServiceType.LOMBARD_BTC_TO_BTCB]}]}exports.getBridgeableAssetsFactory=t;
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({config:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1;return a!==r.sourceChain||o!==r.targetChain||i.type!==e.TokenType.NATIVE?n({assets:[],limit:l,page:u}):n({assets:[{...r.targetAsset,id:t.getAssetId(o,r.targetAsset),bridgeProviders:[e.ServiceType.LOMBARD_BTC_TO_BTCB]}],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
2
2
  //# sourceMappingURL=get-bridgeable-assets.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport type { BridgeableUiAsset } from '../../../../types/asset';\nimport type { BtcToBtcbConfig } from '../../types';\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcToBtcbConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.NATIVE\n ) {\n return [];\n }\n return [{ ...config.targetAsset, bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB] }];\n };\n}\n"],"mappings":"6CAKA,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBAGE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAExB,EAAE,CAEJ,CAAC,CAAE,GAAG,EAAO,YAAa,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CAAE,CAAC"}
1
+ {"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","getAssetId","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcToBtcbConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcToBtcbConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.NATIVE\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"yFAQM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAU5B,OAPE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAExB,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAIC,EAAAA,WAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e,TokenType as t}from"../../../../constants.js";function n({config:n}){return async({sourceAsset:r,sourceChainId:i,targetChainId:a})=>i!==n.sourceChain||a!==n.targetChain||r.type!==t.NATIVE?[]:[{...n.targetAsset,bridgeProviders:[e.LOMBARD_BTC_TO_BTCB]}]}export{n as getBridgeableAssetsFactory};
1
+ import{ServiceType as e,TokenType as t}from"../../../../constants.js";import{getAssetId as n}from"../../../../utils/asset-id.js";const r=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function i({config:i}){return async({sourceAsset:a,sourceChainId:o,targetChainId:s,limit:c,page:l})=>{let u=c??100,d=l??1;return o!==i.sourceChain||s!==i.targetChain||a.type!==t.NATIVE?r({assets:[],limit:u,page:d}):r({assets:[{...i.targetAsset,id:n(s,i.targetAsset),bridgeProviders:[e.LOMBARD_BTC_TO_BTCB]}],limit:u,page:d})}}export{i as getBridgeableAssetsFactory};
2
2
  //# sourceMappingURL=get-bridgeable-assets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport type { BridgeableUiAsset } from '../../../../types/asset';\nimport type { BtcToBtcbConfig } from '../../types';\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcToBtcbConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.NATIVE\n ) {\n return [];\n }\n return [{ ...config.targetAsset, bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB] }];\n };\n}\n"],"mappings":"sEAKA,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBAGE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,OAExB,EAAE,CAEJ,CAAC,CAAE,GAAG,EAAO,YAAa,gBAAiB,CAAC,EAAY,oBAAoB,CAAE,CAAC"}
1
+ {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcToBtcbConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcToBtcbConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.NATIVE\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"iIAKA,MAGM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAU5B,OAPE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,OAExB,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAI,EAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAAC,EAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../constants.cjs`);function t({config:t}){return async({sourceAsset:n,sourceChainId:r,targetChainId:i})=>r!==t.sourceChain||i!==t.targetChain||n.type!==e.TokenType.ERC20||n.address.toLowerCase()!==t.sourceAsset.address.toLowerCase()?[]:[{...t.targetAsset,bridgeProviders:[e.ServiceType.LOMBARD_BTCB_TO_BTC]}]}exports.getBridgeableAssetsFactory=t;
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({config:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1;return a!==r.sourceChain||o!==r.targetChain||i.type!==e.TokenType.ERC20||i.address.toLowerCase()!==r.sourceAsset.address.toLowerCase()?n({assets:[],limit:l,page:u}):n({assets:[{...r.targetAsset,id:t.getAssetId(o,r.targetAsset),bridgeProviders:[e.ServiceType.LOMBARD_BTCB_TO_BTC]}],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
2
2
  //# sourceMappingURL=get-bridgeable-assets.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport type { BridgeableUiAsset } from '../../../../types/asset';\nimport type { BtcbToBtcConfig } from '../../types';\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcbToBtcConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.ERC20 ||\n sourceAsset.address.toLowerCase() !== config.sourceAsset.address.toLowerCase()\n ) {\n return [];\n }\n return [{ ...config.targetAsset, bridgeProviders: [ServiceType.LOMBARD_BTCB_TO_BTC] }];\n };\n}\n"],"mappings":"6CAKA,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBAGE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,YAAY,QAAQ,aAAa,CAEvE,EAAE,CAEJ,CAAC,CAAE,GAAG,EAAO,YAAa,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CAAE,CAAC"}
1
+ {"version":3,"file":"get-bridgeable-assets.cjs","names":["TokenType","getAssetId","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcbToBtcConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcbToBtcConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.ERC20 ||\n sourceAsset.address.toLowerCase() !== config.sourceAsset.address.toLowerCase()\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTCB_TO_BTC],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"yFAQM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAW5B,OARE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,YAAY,QAAQ,aAAa,CAEvE,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAIC,EAAAA,WAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e,TokenType as t}from"../../../../constants.js";function n({config:n}){return async({sourceAsset:r,sourceChainId:i,targetChainId:a})=>i!==n.sourceChain||a!==n.targetChain||r.type!==t.ERC20||r.address.toLowerCase()!==n.sourceAsset.address.toLowerCase()?[]:[{...n.targetAsset,bridgeProviders:[e.LOMBARD_BTCB_TO_BTC]}]}export{n as getBridgeableAssetsFactory};
1
+ import{ServiceType as e,TokenType as t}from"../../../../constants.js";import{getAssetId as n}from"../../../../utils/asset-id.js";const r=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function i({config:i}){return async({sourceAsset:a,sourceChainId:o,targetChainId:s,limit:c,page:l})=>{let u=c??100,d=l??1;return o!==i.sourceChain||s!==i.targetChain||a.type!==t.ERC20||a.address.toLowerCase()!==i.sourceAsset.address.toLowerCase()?r({assets:[],limit:u,page:d}):r({assets:[{...i.targetAsset,id:n(s,i.targetAsset),bridgeProviders:[e.LOMBARD_BTCB_TO_BTC]}],limit:u,page:d})}}export{i as getBridgeableAssetsFactory};
2
2
  //# sourceMappingURL=get-bridgeable-assets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../../types/service';\nimport type { BridgeableUiAsset } from '../../../../types/asset';\nimport type { BtcbToBtcConfig } from '../../types';\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcbToBtcConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.ERC20 ||\n sourceAsset.address.toLowerCase() !== config.sourceAsset.address.toLowerCase()\n ) {\n return [];\n }\n return [{ ...config.targetAsset, bridgeProviders: [ServiceType.LOMBARD_BTCB_TO_BTC] }];\n };\n}\n"],"mappings":"sEAKA,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBAGE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,YAAY,QAAQ,aAAa,CAEvE,EAAE,CAEJ,CAAC,CAAE,GAAG,EAAO,YAAa,gBAAiB,CAAC,EAAY,oBAAoB,CAAE,CAAC"}
1
+ {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../../constants';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../../types/service';\nimport { getAssetId } from '../../../../utils/asset-id';\nimport type { BtcbToBtcConfig } from '../../types';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: GetBridgeableAssetsResult['assets'];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n config,\n}: {\n config: BtcbToBtcConfig;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (\n sourceChainId !== config.sourceChain ||\n targetChainId !== config.targetChain ||\n sourceAsset.type !== TokenType.ERC20 ||\n sourceAsset.address.toLowerCase() !== config.sourceAsset.address.toLowerCase()\n ) {\n return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n }\n\n return paginateAssets({\n assets: [\n {\n ...config.targetAsset,\n id: getAssetId(targetChainId, config.targetAsset),\n bridgeProviders: [ServiceType.LOMBARD_BTCB_TO_BTC],\n },\n ],\n limit: pageLimit,\n page: currentPage,\n });\n };\n}\n"],"mappings":"iIAKA,MAGM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,UAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAW5B,OARE,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,OAC/B,EAAY,QAAQ,aAAa,GAAK,EAAO,YAAY,QAAQ,aAAa,CAEvE,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAGrE,EAAe,CACpB,OAAQ,CACN,CACE,GAAG,EAAO,YACV,GAAI,EAAW,EAAe,EAAO,YAAY,CACjD,gBAAiB,CAAC,EAAY,oBAAoB,CACnD,CACF,CACD,MAAO,EACP,KAAM,EACP,CAAC"}