@avalabs/fusion-sdk 0.17.0 → 0.19.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 (79) hide show
  1. package/dist/constants.cjs +1 -1
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.cts +14 -2
  4. package/dist/constants.d.ts +14 -2
  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.d.cts +6 -0
  10. package/dist/errors.d.ts +6 -0
  11. package/dist/errors.js +1 -1
  12. package/dist/errors.js.map +1 -1
  13. package/dist/mod.cjs +1 -1
  14. package/dist/mod.d.cts +4 -4
  15. package/dist/mod.d.ts +4 -4
  16. package/dist/mod.js +1 -1
  17. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +1 -1
  18. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -1
  19. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +1 -1
  20. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -1
  21. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +1 -1
  22. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -1
  23. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +1 -1
  24. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -1
  25. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +1 -1
  26. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -1
  27. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +1 -1
  28. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -1
  29. package/dist/transfer-service/avalanche-cct/_utils.cjs +1 -1
  30. package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -1
  31. package/dist/transfer-service/avalanche-cct/_utils.js +1 -1
  32. package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -1
  33. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +1 -1
  34. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -1
  35. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +1 -1
  36. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -1
  37. package/dist/transfer-service/markr/_api.cjs +1 -1
  38. package/dist/transfer-service/markr/_api.cjs.map +1 -1
  39. package/dist/transfer-service/markr/_api.js +1 -1
  40. package/dist/transfer-service/markr/_api.js.map +1 -1
  41. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  42. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -1
  43. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  44. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -1
  45. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.cjs +2 -0
  46. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.cjs.map +1 -0
  47. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.js +2 -0
  48. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.js.map +1 -0
  49. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  50. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -1
  51. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  52. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -1
  53. package/dist/transfer-service/markr/_hyperliquid-eip712.cjs +2 -0
  54. package/dist/transfer-service/markr/_hyperliquid-eip712.cjs.map +1 -0
  55. package/dist/transfer-service/markr/_hyperliquid-eip712.js +2 -0
  56. package/dist/transfer-service/markr/_hyperliquid-eip712.js.map +1 -0
  57. package/dist/transfer-service/markr/_hyperliquid-schema.cjs +2 -0
  58. package/dist/transfer-service/markr/_hyperliquid-schema.cjs.map +1 -0
  59. package/dist/transfer-service/markr/_hyperliquid-schema.js +2 -0
  60. package/dist/transfer-service/markr/_hyperliquid-schema.js.map +1 -0
  61. package/dist/transfer-service/markr/_hyperliquid.cjs +2 -0
  62. package/dist/transfer-service/markr/_hyperliquid.cjs.map +1 -0
  63. package/dist/transfer-service/markr/_hyperliquid.js +2 -0
  64. package/dist/transfer-service/markr/_hyperliquid.js.map +1 -0
  65. package/dist/transfer-service/markr/_schema.cjs +1 -1
  66. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  67. package/dist/transfer-service/markr/_schema.js +1 -1
  68. package/dist/transfer-service/markr/_schema.js.map +1 -1
  69. package/dist/transfer-service/markr/_type-guards.cjs +1 -1
  70. package/dist/transfer-service/markr/_type-guards.cjs.map +1 -1
  71. package/dist/transfer-service/markr/_type-guards.js +1 -1
  72. package/dist/transfer-service/markr/_type-guards.js.map +1 -1
  73. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  74. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  75. package/dist/types/service.d.cts +13 -2
  76. package/dist/types/service.d.ts +13 -2
  77. package/dist/types/signer.d.cts +37 -1
  78. package/dist/types/signer.d.ts +37 -1
  79. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.cjs","names":["CHAIN_PREFIXES_REGEX","AvalancheFujiBlockchainChainIds","AvalancheMainnetBlockchainChainIds","InvalidParamsError","AVALANCHE_C_CHAIN_NATIVE_ASSET","AVALANCHE_PX_CHAIN_NATIVE_ASSET","Environment","AVALANCHE_API_URIS","SdkError","ErrorCode","WEI_PER_NANO_AVAX_BIGINT","utils","evm","pvm","avm"],"sources":["../../../src/transfer-service/avalanche-cct/_utils.ts"],"sourcesContent":["import { avm, evm, pvm, utils, type Context, type Utxo } from '@avalabs/avalanchejs';\nimport { orderBy } from 'es-toolkit';\nimport {\n AvalancheChainIds,\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { XpAddress } from './types';\nimport {\n AVALANCHE_API_URIS,\n AVALANCHE_C_CHAIN_NATIVE_ASSET,\n AVALANCHE_PX_CHAIN_NATIVE_ASSET,\n CHAIN_PREFIXES_REGEX,\n WEI_PER_NANO_AVAX_BIGINT,\n} from './constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../errors';\n\nexport function tryOrThrow<T>(fn: () => T, errorHandler: (error: unknown) => SdkError): T {\n try {\n return fn();\n } catch (error) {\n throw errorHandler(error);\n }\n}\n\n/**\n * Remaps Avalanche C-Chain CAIP2 chain IDs to their corresponding EIP-155 chain IDs.\n */\nexport function mapAvalancheBlockchainChainIdToEip155ChainId(caip2ChainId: Caip2ChainId): Caip2ChainId {\n switch (caip2ChainId) {\n case 'avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a': {\n return AvalancheChainIds.MAINNET;\n }\n\n case 'avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd': {\n return AvalancheChainIds.FUJI;\n }\n\n default: {\n return caip2ChainId;\n }\n }\n}\n\nexport function getOutputAmountForAvalancheCct({\n amountIn,\n sourceAsset: { decimals: sourceDecimals },\n targetAsset: { decimals: targetDecimals },\n}: {\n amountIn: bigint;\n sourceAsset: NativeAsset;\n targetAsset: NativeAsset;\n}): bigint {\n if (sourceDecimals < targetDecimals) {\n return amountIn * 10n ** BigInt(targetDecimals - sourceDecimals);\n }\n\n if (sourceDecimals > targetDecimals) {\n return amountIn / 10n ** BigInt(sourceDecimals - targetDecimals);\n }\n\n return amountIn;\n}\n\nexport function stripAddressPrefix<T extends string>(address: T): T {\n return address ? (address.replace(CHAIN_PREFIXES_REGEX, '') as T) : address;\n}\n\nexport function xpAddressMatchesNetwork(xpAddress: XpAddress, isTestnet: boolean): boolean {\n const prefix = isTestnet ? 'fuji' : 'avax';\n return stripAddressPrefix(xpAddress).startsWith(prefix);\n}\n\nexport function getChainAlias(chainId: Caip2ChainId, isTestnet: boolean): AvalancheBlockchainAlias {\n const chainIds = isTestnet ? AvalancheFujiBlockchainChainIds : AvalancheMainnetBlockchainChainIds;\n\n if (chainId === chainIds.C) {\n return 'C';\n }\n\n if (chainId === chainIds.P) {\n return 'P';\n }\n\n if (chainId === chainIds.X) {\n return 'X';\n }\n throw new InvalidParamsError(\n `Unsupported Avalanche chainId for ${isTestnet ? 'testnet' : 'mainnet'}: ${chainId}`,\n `Chain ID ${chainId} is not supported for ${\n isTestnet ? 'Fuji' : 'Mainnet'\n }. Supported chain IDs are: ${Object.values(chainIds).join(', ')}.`,\n );\n}\n\nexport function getNativeTokenForChainAlias(chainAlias: AvalancheBlockchainAlias): NativeAsset {\n if (chainAlias === 'C') {\n return AVALANCHE_C_CHAIN_NATIVE_ASSET;\n }\n\n return AVALANCHE_PX_CHAIN_NATIVE_ASSET;\n}\n\nexport function getAvalancheApiUrl(environment: Environment): string {\n switch (environment) {\n case Environment.TEST: {\n return AVALANCHE_API_URIS.fuji;\n }\n\n case Environment.PROD: {\n return AVALANCHE_API_URIS.mainnet;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function convertNanoAvaxToWei(nanoAvaxAmount: bigint): bigint {\n return nanoAvaxAmount * WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function convertWeiToNanoAvax(weiAmount: bigint): bigint {\n return weiAmount / WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function getChainIdFromContext(chainAlias: AvalancheBlockchainAlias, context: Context.Context): string {\n switch (chainAlias) {\n case 'C': {\n return context.cBlockchainID;\n }\n case 'P': {\n return context.pBlockchainID;\n }\n case 'X': {\n return context.xBlockchainID;\n }\n default: {\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n }\n}\n\nexport function sortUTXOsByAmount(utxos: Utxo[], isDescending: boolean): Utxo[] {\n const utxosWithInfo = utxos.map((utxo) => ({\n utxo,\n ...utils.getUtxoInfo(utxo),\n }));\n\n return orderBy(utxosWithInfo, ['amount'], [isDescending ? 'desc' : 'asc']).map(({ utxo }) => utxo);\n}\n\nexport function getAddressesAsBuffers(addresses: string[]): Uint8Array[] {\n return addresses.map((address) => utils.parse(address)[2]);\n}\n\nexport function getEnvironmentIsTestnet(environment: Environment): boolean {\n switch (environment) {\n case Environment.TEST: {\n return true;\n }\n\n case Environment.PROD: {\n return false;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'C'): evm.EVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'P'): pvm.PVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'X'): avm.AVMApi;\nexport function getAvalancheProvider(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): avm.AVMApi | pvm.PVMApi | evm.EVMApi {\n const baseUrl = getAvalancheApiUrl(environment);\n\n switch (chainAlias) {\n case 'C': {\n return new evm.EVMApi(baseUrl);\n }\n case 'P': {\n return new pvm.PVMApi(baseUrl);\n }\n case 'X': {\n return new avm.AVMApi(baseUrl);\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get Avalanche provider for unsupported chain alias.',\n );\n }\n }\n}\n"],"mappings":"gNAqBA,SAAgB,EAAc,EAAa,EAA+C,CACxF,GAAI,CACF,OAAO,GAAI,OACJ,EAAO,CACd,MAAM,EAAa,EAAM,EAuB7B,SAAgB,EAA+B,CAC7C,WACA,YAAa,CAAE,SAAU,GACzB,YAAa,CAAE,SAAU,IAKhB,CAST,OARI,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG9D,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG3D,EAGT,SAAgB,EAAqC,EAAe,CAClE,OAAO,GAAW,EAAQ,QAAQA,EAAAA,qBAAsB,GAAG,CAG7D,SAAgB,EAAwB,EAAsB,EAA6B,CACzF,IAAM,EAAS,EAAY,OAAS,OACpC,OAAO,EAAmB,EAAU,CAAC,WAAW,EAAO,CAGzD,SAAgB,EAAc,EAAuB,EAA8C,CACjG,IAAM,EAAW,EAAYC,EAAAA,gCAAkCC,EAAAA,mCAE/D,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAET,MAAM,IAAIC,EAAAA,mBACR,qCAAqC,EAAY,UAAY,UAAU,IAAI,IAC3E,YAAY,EAAQ,wBAClB,EAAY,OAAS,UACtB,6BAA6B,OAAO,OAAO,EAAS,CAAC,KAAK,KAAK,CAAC,GAClE,CAGH,SAAgB,EAA4B,EAAmD,CAK7F,OAJI,IAAe,IACVC,EAAAA,+BAGFC,EAAAA,gCAGT,SAAgB,EAAmB,EAAkC,CACnE,OAAQ,EAAR,CACE,KAAKC,EAAAA,YAAY,KACf,OAAOC,EAAAA,mBAAmB,KAG5B,KAAKD,EAAAA,YAAY,KACf,OAAOC,EAAAA,mBAAmB,QAG5B,QACE,MAAM,IAAIC,EAAAA,SAAS,qDAAsDC,EAAAA,UAAU,eAAe,EAKxG,SAAgB,EAAqB,EAAgC,CACnE,OAAO,EAAiBC,EAAAA,yBAO1B,SAAgB,EAAsB,EAAsC,EAAkC,CAC5G,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,QACE,MAAM,IAAIP,EAAAA,mBAAmB,4BAA4B,IAAa,EAK5E,SAAgB,EAAkB,EAAe,EAA+B,CAM9E,OAAA,EAAA,EAAA,SALsB,EAAM,IAAK,IAAU,CACzC,OACA,GAAGQ,EAAAA,MAAM,YAAY,EAAK,CAC3B,EAAE,CAE2B,CAAC,SAAS,CAAE,CAAC,EAAe,OAAS,MAAM,CAAC,CAAC,KAAK,CAAE,UAAW,EAAK,CAGpG,SAAgB,EAAsB,EAAmC,CACvE,OAAO,EAAU,IAAK,GAAYA,EAAAA,MAAM,MAAM,EAAQ,CAAC,GAAG,CAG5D,SAAgB,EAAwB,EAAmC,CACzE,OAAQ,EAAR,CACE,KAAKL,EAAAA,YAAY,KACf,MAAO,GAGT,KAAKA,EAAAA,YAAY,KACf,MAAO,GAGT,QACE,MAAM,IAAIE,EAAAA,SAAS,qDAAsDC,EAAAA,UAAU,eAAe,EAQxG,SAAgB,EACd,EACA,EACsC,CACtC,IAAM,EAAU,EAAmB,EAAY,CAE/C,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,IAAIG,EAAAA,IAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAIC,EAAAA,IAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAIC,EAAAA,IAAI,OAAO,EAAQ,CAEhC,QACE,MAAM,IAAIX,EAAAA,mBACR,4BAA4B,IAC5B,8DACD"}
1
+ {"version":3,"file":"_utils.cjs","names":["CHAIN_PREFIXES_REGEX","AvalancheFujiBlockchainChainIds","AvalancheMainnetBlockchainChainIds","InvalidParamsError","AVALANCHE_C_CHAIN_NATIVE_ASSET","AVALANCHE_PX_CHAIN_NATIVE_ASSET","Environment","AVALANCHE_API_URIS","SdkError","ErrorCode","WEI_PER_NANO_AVAX_BIGINT","utils","evm","pvm","avm"],"sources":["../../../src/transfer-service/avalanche-cct/_utils.ts"],"sourcesContent":["import { avm, evm, pvm, utils, type Context, type Utxo } from '@avalabs/avalanchejs';\nimport { orderBy } from 'es-toolkit';\nimport {\n AvalancheChainIds,\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { XpAddress } from './types';\nimport {\n AVALANCHE_API_URIS,\n AVALANCHE_C_CHAIN_NATIVE_ASSET,\n AVALANCHE_PX_CHAIN_NATIVE_ASSET,\n CHAIN_PREFIXES_REGEX,\n WEI_PER_NANO_AVAX_BIGINT,\n} from './constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../errors';\n\nexport function tryOrThrow<T>(fn: () => T, errorHandler: (error: unknown) => SdkError): T {\n try {\n return fn();\n } catch (error) {\n throw errorHandler(error);\n }\n}\n\n/**\n * Remaps Avalanche C-Chain CAIP2 chain IDs to their corresponding EIP-155 chain IDs.\n */\nexport function mapAvalancheBlockchainChainIdToEip155ChainId(caip2ChainId: Caip2ChainId): Caip2ChainId {\n switch (caip2ChainId) {\n case 'avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a': {\n return AvalancheChainIds.MAINNET;\n }\n\n case 'avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd': {\n return AvalancheChainIds.FUJI;\n }\n\n default: {\n return caip2ChainId;\n }\n }\n}\n\nexport function getOutputAmountForAvalancheCct({\n amountIn,\n sourceAsset: { decimals: sourceDecimals },\n targetAsset: { decimals: targetDecimals },\n}: {\n amountIn: bigint;\n sourceAsset: NativeAsset;\n targetAsset: NativeAsset;\n}): bigint {\n if (sourceDecimals < targetDecimals) {\n return amountIn * 10n ** BigInt(targetDecimals - sourceDecimals);\n }\n\n if (sourceDecimals > targetDecimals) {\n return amountIn / 10n ** BigInt(sourceDecimals - targetDecimals);\n }\n\n return amountIn;\n}\n\nexport function stripAddressPrefix<T extends string>(address: T): T {\n return address ? (address.replace(CHAIN_PREFIXES_REGEX, '') as T) : address;\n}\n\nexport function xpAddressMatchesNetwork(xpAddress: XpAddress, isTestnet: boolean): boolean {\n const prefix = isTestnet ? 'fuji' : 'avax';\n return stripAddressPrefix(xpAddress).startsWith(prefix);\n}\n\nexport function getChainAlias(chainId: Caip2ChainId, isTestnet: boolean): AvalancheBlockchainAlias {\n const chainIds = isTestnet ? AvalancheFujiBlockchainChainIds : AvalancheMainnetBlockchainChainIds;\n\n if (chainId === chainIds.C) {\n return 'C';\n }\n\n if (chainId === chainIds.P) {\n return 'P';\n }\n\n if (chainId === chainIds.X) {\n return 'X';\n }\n throw new InvalidParamsError(\n `Unsupported Avalanche chainId for ${isTestnet ? 'testnet' : 'mainnet'}: ${chainId}`,\n `Chain ID ${chainId} is not supported for ${\n isTestnet ? 'Fuji' : 'Mainnet'\n }. Supported chain IDs are: ${Object.values(chainIds).join(', ')}.`,\n );\n}\n\nexport function getNativeTokenForChainAlias(chainAlias: AvalancheBlockchainAlias): NativeAsset {\n if (chainAlias === 'C') {\n return AVALANCHE_C_CHAIN_NATIVE_ASSET;\n }\n\n return AVALANCHE_PX_CHAIN_NATIVE_ASSET;\n}\n\nexport function getAvalancheApiUrl(environment: Environment): string {\n switch (environment) {\n case Environment.TEST: {\n return AVALANCHE_API_URIS.fuji;\n }\n\n case Environment.PROD: {\n return AVALANCHE_API_URIS.mainnet;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function convertNanoAvaxToWei(nanoAvaxAmount: bigint): bigint {\n return nanoAvaxAmount * WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function convertWeiToNanoAvax(weiAmount: bigint): bigint {\n return weiAmount / WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function getChainIdFromContext(chainAlias: AvalancheBlockchainAlias, context: Context.Context): string {\n switch (chainAlias) {\n case 'C': {\n return context.cBlockchainID;\n }\n case 'P': {\n return context.pBlockchainID;\n }\n case 'X': {\n return context.xBlockchainID;\n }\n default: {\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n }\n}\n\nexport function sortUTXOsByAmount(utxos: Utxo[], isDescending: boolean): Utxo[] {\n const utxosWithInfo = utxos.map((utxo) => ({\n utxo,\n ...utils.getUtxoInfo(utxo),\n }));\n\n return orderBy(utxosWithInfo, ['amount'], [isDescending ? 'desc' : 'asc']).map(({ utxo }) => utxo);\n}\n\nexport function getUtxosTotalAmount(utxos: Utxo[]): bigint {\n return utxos.reduce((total, utxo) => {\n const utxoInfo = utils.getUtxoInfo(utxo);\n\n return total + utxoInfo.amount;\n }, 0n);\n}\n\nexport function getAddressesAsBuffers(addresses: string[]): Uint8Array[] {\n return addresses.map((address) => utils.parse(address)[2]);\n}\n\nexport function getEnvironmentIsTestnet(environment: Environment): boolean {\n switch (environment) {\n case Environment.TEST: {\n return true;\n }\n\n case Environment.PROD: {\n return false;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'C'): evm.EVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'P'): pvm.PVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'X'): avm.AVMApi;\nexport function getAvalancheProvider(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): avm.AVMApi | pvm.PVMApi | evm.EVMApi {\n const baseUrl = getAvalancheApiUrl(environment);\n\n switch (chainAlias) {\n case 'C': {\n return new evm.EVMApi(baseUrl);\n }\n case 'P': {\n return new pvm.PVMApi(baseUrl);\n }\n case 'X': {\n return new avm.AVMApi(baseUrl);\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get Avalanche provider for unsupported chain alias.',\n );\n }\n }\n}\n"],"mappings":"gNAqBA,SAAgB,EAAc,EAAa,EAA+C,CACxF,GAAI,CACF,OAAO,GAAI,OACJ,EAAO,CACd,MAAM,EAAa,EAAM,EAuB7B,SAAgB,EAA+B,CAC7C,WACA,YAAa,CAAE,SAAU,GACzB,YAAa,CAAE,SAAU,IAKhB,CAST,OARI,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG9D,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG3D,EAGT,SAAgB,EAAqC,EAAe,CAClE,OAAO,GAAW,EAAQ,QAAQA,EAAAA,qBAAsB,GAAG,CAG7D,SAAgB,EAAwB,EAAsB,EAA6B,CACzF,IAAM,EAAS,EAAY,OAAS,OACpC,OAAO,EAAmB,EAAU,CAAC,WAAW,EAAO,CAGzD,SAAgB,EAAc,EAAuB,EAA8C,CACjG,IAAM,EAAW,EAAYC,EAAAA,gCAAkCC,EAAAA,mCAE/D,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAET,MAAM,IAAIC,EAAAA,mBACR,qCAAqC,EAAY,UAAY,UAAU,IAAI,IAC3E,YAAY,EAAQ,wBAClB,EAAY,OAAS,UACtB,6BAA6B,OAAO,OAAO,EAAS,CAAC,KAAK,KAAK,CAAC,GAClE,CAGH,SAAgB,EAA4B,EAAmD,CAK7F,OAJI,IAAe,IACVC,EAAAA,+BAGFC,EAAAA,gCAGT,SAAgB,EAAmB,EAAkC,CACnE,OAAQ,EAAR,CACE,KAAKC,EAAAA,YAAY,KACf,OAAOC,EAAAA,mBAAmB,KAG5B,KAAKD,EAAAA,YAAY,KACf,OAAOC,EAAAA,mBAAmB,QAG5B,QACE,MAAM,IAAIC,EAAAA,SAAS,qDAAsDC,EAAAA,UAAU,eAAe,EAKxG,SAAgB,EAAqB,EAAgC,CACnE,OAAO,EAAiBC,EAAAA,yBAO1B,SAAgB,EAAsB,EAAsC,EAAkC,CAC5G,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,QACE,MAAM,IAAIP,EAAAA,mBAAmB,4BAA4B,IAAa,EAK5E,SAAgB,EAAkB,EAAe,EAA+B,CAM9E,OAAA,EAAA,EAAA,SALsB,EAAM,IAAK,IAAU,CACzC,OACA,GAAGQ,EAAAA,MAAM,YAAY,EAAK,CAC3B,EAAE,CAE2B,CAAC,SAAS,CAAE,CAAC,EAAe,OAAS,MAAM,CAAC,CAAC,KAAK,CAAE,UAAW,EAAK,CAGpG,SAAgB,EAAoB,EAAuB,CACzD,OAAO,EAAM,QAAQ,EAAO,IAGnB,EAFUA,EAAAA,MAAM,YAAY,EAAK,CAEhB,OACvB,GAAG,CAGR,SAAgB,EAAsB,EAAmC,CACvE,OAAO,EAAU,IAAK,GAAYA,EAAAA,MAAM,MAAM,EAAQ,CAAC,GAAG,CAG5D,SAAgB,EAAwB,EAAmC,CACzE,OAAQ,EAAR,CACE,KAAKL,EAAAA,YAAY,KACf,MAAO,GAGT,KAAKA,EAAAA,YAAY,KACf,MAAO,GAGT,QACE,MAAM,IAAIE,EAAAA,SAAS,qDAAsDC,EAAAA,UAAU,eAAe,EAQxG,SAAgB,EACd,EACA,EACsC,CACtC,IAAM,EAAU,EAAmB,EAAY,CAE/C,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,IAAIG,EAAAA,IAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAIC,EAAAA,IAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAIC,EAAAA,IAAI,OAAO,EAAQ,CAEhC,QACE,MAAM,IAAIX,EAAAA,mBACR,4BAA4B,IAC5B,8DACD"}
@@ -1,2 +1,2 @@
1
- import{AvalancheFujiBlockchainChainIds as e,AvalancheMainnetBlockchainChainIds as t,Environment as n}from"../../constants.js";import{ErrorCode as r,InvalidParamsError as i,SdkError as a}from"../../errors.js";import{AVALANCHE_API_URIS as o,AVALANCHE_C_CHAIN_NATIVE_ASSET as s,AVALANCHE_PX_CHAIN_NATIVE_ASSET as c,CHAIN_PREFIXES_REGEX as l,WEI_PER_NANO_AVAX_BIGINT as u}from"./constants.js";import{avm as d,evm as f,pvm as p,utils as m}from"@avalabs/avalanchejs";import{orderBy as h}from"es-toolkit";function g(e,t){try{return e()}catch(e){throw t(e)}}function _({amountIn:e,sourceAsset:{decimals:t},targetAsset:{decimals:n}}){return t<n?e*10n**BigInt(n-t):t>n?e/10n**BigInt(t-n):e}function v(e){return e&&e.replace(l,``)}function y(e,t){let n=t?`fuji`:`avax`;return v(e).startsWith(n)}function b(n,r){let a=r?e:t;if(n===a.C)return`C`;if(n===a.P)return`P`;if(n===a.X)return`X`;throw new i(`Unsupported Avalanche chainId for ${r?`testnet`:`mainnet`}: ${n}`,`Chain ID ${n} is not supported for ${r?`Fuji`:`Mainnet`}. Supported chain IDs are: ${Object.values(a).join(`, `)}.`)}function x(e){return e===`C`?s:c}function S(e){switch(e){case n.TEST:return o.fuji;case n.PROD:return o.mainnet;default:throw new a(`Unsupported environment for Avalanche CCT service.`,r.INVALID_PARAMS)}}function C(e){return e*u}function w(e,t){switch(e){case`C`:return t.cBlockchainID;case`P`:return t.pBlockchainID;case`X`:return t.xBlockchainID;default:throw new i(`Unsupported chain alias: ${e}`)}}function T(e,t){return h(e.map(e=>({utxo:e,...m.getUtxoInfo(e)})),[`amount`],[t?`desc`:`asc`]).map(({utxo:e})=>e)}function E(e){return e.map(e=>m.parse(e)[2])}function D(e){switch(e){case n.TEST:return!0;case n.PROD:return!1;default:throw new a(`Unsupported environment for Avalanche CCT service.`,r.INVALID_PARAMS)}}function O(e,t){let n=S(e);switch(t){case`C`:return new f.EVMApi(n);case`P`:return new p.PVMApi(n);case`X`:return new d.AVMApi(n);default:throw new i(`Unsupported chain alias: ${t}`,`Can not get Avalanche provider for unsupported chain alias.`)}}export{C as convertNanoAvaxToWei,E as getAddressesAsBuffers,S as getAvalancheApiUrl,O as getAvalancheProvider,b as getChainAlias,w as getChainIdFromContext,D as getEnvironmentIsTestnet,x as getNativeTokenForChainAlias,_ as getOutputAmountForAvalancheCct,T as sortUTXOsByAmount,v as stripAddressPrefix,g as tryOrThrow,y as xpAddressMatchesNetwork};
1
+ import{AvalancheFujiBlockchainChainIds as e,AvalancheMainnetBlockchainChainIds as t,Environment as n}from"../../constants.js";import{ErrorCode as r,InvalidParamsError as i,SdkError as a}from"../../errors.js";import{AVALANCHE_API_URIS as o,AVALANCHE_C_CHAIN_NATIVE_ASSET as s,AVALANCHE_PX_CHAIN_NATIVE_ASSET as c,CHAIN_PREFIXES_REGEX as l,WEI_PER_NANO_AVAX_BIGINT as u}from"./constants.js";import{avm as d,evm as f,pvm as p,utils as m}from"@avalabs/avalanchejs";import{orderBy as h}from"es-toolkit";function g(e,t){try{return e()}catch(e){throw t(e)}}function _({amountIn:e,sourceAsset:{decimals:t},targetAsset:{decimals:n}}){return t<n?e*10n**BigInt(n-t):t>n?e/10n**BigInt(t-n):e}function v(e){return e&&e.replace(l,``)}function y(e,t){let n=t?`fuji`:`avax`;return v(e).startsWith(n)}function b(n,r){let a=r?e:t;if(n===a.C)return`C`;if(n===a.P)return`P`;if(n===a.X)return`X`;throw new i(`Unsupported Avalanche chainId for ${r?`testnet`:`mainnet`}: ${n}`,`Chain ID ${n} is not supported for ${r?`Fuji`:`Mainnet`}. Supported chain IDs are: ${Object.values(a).join(`, `)}.`)}function x(e){return e===`C`?s:c}function S(e){switch(e){case n.TEST:return o.fuji;case n.PROD:return o.mainnet;default:throw new a(`Unsupported environment for Avalanche CCT service.`,r.INVALID_PARAMS)}}function C(e){return e*u}function w(e,t){switch(e){case`C`:return t.cBlockchainID;case`P`:return t.pBlockchainID;case`X`:return t.xBlockchainID;default:throw new i(`Unsupported chain alias: ${e}`)}}function T(e,t){return h(e.map(e=>({utxo:e,...m.getUtxoInfo(e)})),[`amount`],[t?`desc`:`asc`]).map(({utxo:e})=>e)}function E(e){return e.reduce((e,t)=>e+m.getUtxoInfo(t).amount,0n)}function D(e){return e.map(e=>m.parse(e)[2])}function O(e){switch(e){case n.TEST:return!0;case n.PROD:return!1;default:throw new a(`Unsupported environment for Avalanche CCT service.`,r.INVALID_PARAMS)}}function k(e,t){let n=S(e);switch(t){case`C`:return new f.EVMApi(n);case`P`:return new p.PVMApi(n);case`X`:return new d.AVMApi(n);default:throw new i(`Unsupported chain alias: ${t}`,`Can not get Avalanche provider for unsupported chain alias.`)}}export{C as convertNanoAvaxToWei,D as getAddressesAsBuffers,S as getAvalancheApiUrl,k as getAvalancheProvider,b as getChainAlias,w as getChainIdFromContext,O as getEnvironmentIsTestnet,x as getNativeTokenForChainAlias,_ as getOutputAmountForAvalancheCct,E as getUtxosTotalAmount,T as sortUTXOsByAmount,v as stripAddressPrefix,g as tryOrThrow,y as xpAddressMatchesNetwork};
2
2
  //# sourceMappingURL=_utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/_utils.ts"],"sourcesContent":["import { avm, evm, pvm, utils, type Context, type Utxo } from '@avalabs/avalanchejs';\nimport { orderBy } from 'es-toolkit';\nimport {\n AvalancheChainIds,\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { XpAddress } from './types';\nimport {\n AVALANCHE_API_URIS,\n AVALANCHE_C_CHAIN_NATIVE_ASSET,\n AVALANCHE_PX_CHAIN_NATIVE_ASSET,\n CHAIN_PREFIXES_REGEX,\n WEI_PER_NANO_AVAX_BIGINT,\n} from './constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../errors';\n\nexport function tryOrThrow<T>(fn: () => T, errorHandler: (error: unknown) => SdkError): T {\n try {\n return fn();\n } catch (error) {\n throw errorHandler(error);\n }\n}\n\n/**\n * Remaps Avalanche C-Chain CAIP2 chain IDs to their corresponding EIP-155 chain IDs.\n */\nexport function mapAvalancheBlockchainChainIdToEip155ChainId(caip2ChainId: Caip2ChainId): Caip2ChainId {\n switch (caip2ChainId) {\n case 'avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a': {\n return AvalancheChainIds.MAINNET;\n }\n\n case 'avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd': {\n return AvalancheChainIds.FUJI;\n }\n\n default: {\n return caip2ChainId;\n }\n }\n}\n\nexport function getOutputAmountForAvalancheCct({\n amountIn,\n sourceAsset: { decimals: sourceDecimals },\n targetAsset: { decimals: targetDecimals },\n}: {\n amountIn: bigint;\n sourceAsset: NativeAsset;\n targetAsset: NativeAsset;\n}): bigint {\n if (sourceDecimals < targetDecimals) {\n return amountIn * 10n ** BigInt(targetDecimals - sourceDecimals);\n }\n\n if (sourceDecimals > targetDecimals) {\n return amountIn / 10n ** BigInt(sourceDecimals - targetDecimals);\n }\n\n return amountIn;\n}\n\nexport function stripAddressPrefix<T extends string>(address: T): T {\n return address ? (address.replace(CHAIN_PREFIXES_REGEX, '') as T) : address;\n}\n\nexport function xpAddressMatchesNetwork(xpAddress: XpAddress, isTestnet: boolean): boolean {\n const prefix = isTestnet ? 'fuji' : 'avax';\n return stripAddressPrefix(xpAddress).startsWith(prefix);\n}\n\nexport function getChainAlias(chainId: Caip2ChainId, isTestnet: boolean): AvalancheBlockchainAlias {\n const chainIds = isTestnet ? AvalancheFujiBlockchainChainIds : AvalancheMainnetBlockchainChainIds;\n\n if (chainId === chainIds.C) {\n return 'C';\n }\n\n if (chainId === chainIds.P) {\n return 'P';\n }\n\n if (chainId === chainIds.X) {\n return 'X';\n }\n throw new InvalidParamsError(\n `Unsupported Avalanche chainId for ${isTestnet ? 'testnet' : 'mainnet'}: ${chainId}`,\n `Chain ID ${chainId} is not supported for ${\n isTestnet ? 'Fuji' : 'Mainnet'\n }. Supported chain IDs are: ${Object.values(chainIds).join(', ')}.`,\n );\n}\n\nexport function getNativeTokenForChainAlias(chainAlias: AvalancheBlockchainAlias): NativeAsset {\n if (chainAlias === 'C') {\n return AVALANCHE_C_CHAIN_NATIVE_ASSET;\n }\n\n return AVALANCHE_PX_CHAIN_NATIVE_ASSET;\n}\n\nexport function getAvalancheApiUrl(environment: Environment): string {\n switch (environment) {\n case Environment.TEST: {\n return AVALANCHE_API_URIS.fuji;\n }\n\n case Environment.PROD: {\n return AVALANCHE_API_URIS.mainnet;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function convertNanoAvaxToWei(nanoAvaxAmount: bigint): bigint {\n return nanoAvaxAmount * WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function convertWeiToNanoAvax(weiAmount: bigint): bigint {\n return weiAmount / WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function getChainIdFromContext(chainAlias: AvalancheBlockchainAlias, context: Context.Context): string {\n switch (chainAlias) {\n case 'C': {\n return context.cBlockchainID;\n }\n case 'P': {\n return context.pBlockchainID;\n }\n case 'X': {\n return context.xBlockchainID;\n }\n default: {\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n }\n}\n\nexport function sortUTXOsByAmount(utxos: Utxo[], isDescending: boolean): Utxo[] {\n const utxosWithInfo = utxos.map((utxo) => ({\n utxo,\n ...utils.getUtxoInfo(utxo),\n }));\n\n return orderBy(utxosWithInfo, ['amount'], [isDescending ? 'desc' : 'asc']).map(({ utxo }) => utxo);\n}\n\nexport function getAddressesAsBuffers(addresses: string[]): Uint8Array[] {\n return addresses.map((address) => utils.parse(address)[2]);\n}\n\nexport function getEnvironmentIsTestnet(environment: Environment): boolean {\n switch (environment) {\n case Environment.TEST: {\n return true;\n }\n\n case Environment.PROD: {\n return false;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'C'): evm.EVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'P'): pvm.PVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'X'): avm.AVMApi;\nexport function getAvalancheProvider(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): avm.AVMApi | pvm.PVMApi | evm.EVMApi {\n const baseUrl = getAvalancheApiUrl(environment);\n\n switch (chainAlias) {\n case 'C': {\n return new evm.EVMApi(baseUrl);\n }\n case 'P': {\n return new pvm.PVMApi(baseUrl);\n }\n case 'X': {\n return new avm.AVMApi(baseUrl);\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get Avalanche provider for unsupported chain alias.',\n );\n }\n }\n}\n"],"mappings":"kfAqBA,SAAgB,EAAc,EAAa,EAA+C,CACxF,GAAI,CACF,OAAO,GAAI,OACJ,EAAO,CACd,MAAM,EAAa,EAAM,EAuB7B,SAAgB,EAA+B,CAC7C,WACA,YAAa,CAAE,SAAU,GACzB,YAAa,CAAE,SAAU,IAKhB,CAST,OARI,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG9D,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG3D,EAGT,SAAgB,EAAqC,EAAe,CAClE,OAAO,GAAW,EAAQ,QAAQ,EAAsB,GAAG,CAG7D,SAAgB,EAAwB,EAAsB,EAA6B,CACzF,IAAM,EAAS,EAAY,OAAS,OACpC,OAAO,EAAmB,EAAU,CAAC,WAAW,EAAO,CAGzD,SAAgB,EAAc,EAAuB,EAA8C,CACjG,IAAM,EAAW,EAAY,EAAkC,EAE/D,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAET,MAAM,IAAI,EACR,qCAAqC,EAAY,UAAY,UAAU,IAAI,IAC3E,YAAY,EAAQ,wBAClB,EAAY,OAAS,UACtB,6BAA6B,OAAO,OAAO,EAAS,CAAC,KAAK,KAAK,CAAC,GAClE,CAGH,SAAgB,EAA4B,EAAmD,CAK7F,OAJI,IAAe,IACV,EAGF,EAGT,SAAgB,EAAmB,EAAkC,CACnE,OAAQ,EAAR,CACE,KAAK,EAAY,KACf,OAAO,EAAmB,KAG5B,KAAK,EAAY,KACf,OAAO,EAAmB,QAG5B,QACE,MAAM,IAAI,EAAS,qDAAsD,EAAU,eAAe,EAKxG,SAAgB,EAAqB,EAAgC,CACnE,OAAO,EAAiB,EAO1B,SAAgB,EAAsB,EAAsC,EAAkC,CAC5G,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,QACE,MAAM,IAAI,EAAmB,4BAA4B,IAAa,EAK5E,SAAgB,EAAkB,EAAe,EAA+B,CAM9E,OAAO,EALe,EAAM,IAAK,IAAU,CACzC,OACA,GAAG,EAAM,YAAY,EAAK,CAC3B,EAAE,CAE2B,CAAC,SAAS,CAAE,CAAC,EAAe,OAAS,MAAM,CAAC,CAAC,KAAK,CAAE,UAAW,EAAK,CAGpG,SAAgB,EAAsB,EAAmC,CACvE,OAAO,EAAU,IAAK,GAAY,EAAM,MAAM,EAAQ,CAAC,GAAG,CAG5D,SAAgB,EAAwB,EAAmC,CACzE,OAAQ,EAAR,CACE,KAAK,EAAY,KACf,MAAO,GAGT,KAAK,EAAY,KACf,MAAO,GAGT,QACE,MAAM,IAAI,EAAS,qDAAsD,EAAU,eAAe,EAQxG,SAAgB,EACd,EACA,EACsC,CACtC,IAAM,EAAU,EAAmB,EAAY,CAE/C,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,QACE,MAAM,IAAI,EACR,4BAA4B,IAC5B,8DACD"}
1
+ {"version":3,"file":"_utils.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/_utils.ts"],"sourcesContent":["import { avm, evm, pvm, utils, type Context, type Utxo } from '@avalabs/avalanchejs';\nimport { orderBy } from 'es-toolkit';\nimport {\n AvalancheChainIds,\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { XpAddress } from './types';\nimport {\n AVALANCHE_API_URIS,\n AVALANCHE_C_CHAIN_NATIVE_ASSET,\n AVALANCHE_PX_CHAIN_NATIVE_ASSET,\n CHAIN_PREFIXES_REGEX,\n WEI_PER_NANO_AVAX_BIGINT,\n} from './constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../errors';\n\nexport function tryOrThrow<T>(fn: () => T, errorHandler: (error: unknown) => SdkError): T {\n try {\n return fn();\n } catch (error) {\n throw errorHandler(error);\n }\n}\n\n/**\n * Remaps Avalanche C-Chain CAIP2 chain IDs to their corresponding EIP-155 chain IDs.\n */\nexport function mapAvalancheBlockchainChainIdToEip155ChainId(caip2ChainId: Caip2ChainId): Caip2ChainId {\n switch (caip2ChainId) {\n case 'avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a': {\n return AvalancheChainIds.MAINNET;\n }\n\n case 'avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd': {\n return AvalancheChainIds.FUJI;\n }\n\n default: {\n return caip2ChainId;\n }\n }\n}\n\nexport function getOutputAmountForAvalancheCct({\n amountIn,\n sourceAsset: { decimals: sourceDecimals },\n targetAsset: { decimals: targetDecimals },\n}: {\n amountIn: bigint;\n sourceAsset: NativeAsset;\n targetAsset: NativeAsset;\n}): bigint {\n if (sourceDecimals < targetDecimals) {\n return amountIn * 10n ** BigInt(targetDecimals - sourceDecimals);\n }\n\n if (sourceDecimals > targetDecimals) {\n return amountIn / 10n ** BigInt(sourceDecimals - targetDecimals);\n }\n\n return amountIn;\n}\n\nexport function stripAddressPrefix<T extends string>(address: T): T {\n return address ? (address.replace(CHAIN_PREFIXES_REGEX, '') as T) : address;\n}\n\nexport function xpAddressMatchesNetwork(xpAddress: XpAddress, isTestnet: boolean): boolean {\n const prefix = isTestnet ? 'fuji' : 'avax';\n return stripAddressPrefix(xpAddress).startsWith(prefix);\n}\n\nexport function getChainAlias(chainId: Caip2ChainId, isTestnet: boolean): AvalancheBlockchainAlias {\n const chainIds = isTestnet ? AvalancheFujiBlockchainChainIds : AvalancheMainnetBlockchainChainIds;\n\n if (chainId === chainIds.C) {\n return 'C';\n }\n\n if (chainId === chainIds.P) {\n return 'P';\n }\n\n if (chainId === chainIds.X) {\n return 'X';\n }\n throw new InvalidParamsError(\n `Unsupported Avalanche chainId for ${isTestnet ? 'testnet' : 'mainnet'}: ${chainId}`,\n `Chain ID ${chainId} is not supported for ${\n isTestnet ? 'Fuji' : 'Mainnet'\n }. Supported chain IDs are: ${Object.values(chainIds).join(', ')}.`,\n );\n}\n\nexport function getNativeTokenForChainAlias(chainAlias: AvalancheBlockchainAlias): NativeAsset {\n if (chainAlias === 'C') {\n return AVALANCHE_C_CHAIN_NATIVE_ASSET;\n }\n\n return AVALANCHE_PX_CHAIN_NATIVE_ASSET;\n}\n\nexport function getAvalancheApiUrl(environment: Environment): string {\n switch (environment) {\n case Environment.TEST: {\n return AVALANCHE_API_URIS.fuji;\n }\n\n case Environment.PROD: {\n return AVALANCHE_API_URIS.mainnet;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function convertNanoAvaxToWei(nanoAvaxAmount: bigint): bigint {\n return nanoAvaxAmount * WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function convertWeiToNanoAvax(weiAmount: bigint): bigint {\n return weiAmount / WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function getChainIdFromContext(chainAlias: AvalancheBlockchainAlias, context: Context.Context): string {\n switch (chainAlias) {\n case 'C': {\n return context.cBlockchainID;\n }\n case 'P': {\n return context.pBlockchainID;\n }\n case 'X': {\n return context.xBlockchainID;\n }\n default: {\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n }\n}\n\nexport function sortUTXOsByAmount(utxos: Utxo[], isDescending: boolean): Utxo[] {\n const utxosWithInfo = utxos.map((utxo) => ({\n utxo,\n ...utils.getUtxoInfo(utxo),\n }));\n\n return orderBy(utxosWithInfo, ['amount'], [isDescending ? 'desc' : 'asc']).map(({ utxo }) => utxo);\n}\n\nexport function getUtxosTotalAmount(utxos: Utxo[]): bigint {\n return utxos.reduce((total, utxo) => {\n const utxoInfo = utils.getUtxoInfo(utxo);\n\n return total + utxoInfo.amount;\n }, 0n);\n}\n\nexport function getAddressesAsBuffers(addresses: string[]): Uint8Array[] {\n return addresses.map((address) => utils.parse(address)[2]);\n}\n\nexport function getEnvironmentIsTestnet(environment: Environment): boolean {\n switch (environment) {\n case Environment.TEST: {\n return true;\n }\n\n case Environment.PROD: {\n return false;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'C'): evm.EVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'P'): pvm.PVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'X'): avm.AVMApi;\nexport function getAvalancheProvider(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): avm.AVMApi | pvm.PVMApi | evm.EVMApi {\n const baseUrl = getAvalancheApiUrl(environment);\n\n switch (chainAlias) {\n case 'C': {\n return new evm.EVMApi(baseUrl);\n }\n case 'P': {\n return new pvm.PVMApi(baseUrl);\n }\n case 'X': {\n return new avm.AVMApi(baseUrl);\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get Avalanche provider for unsupported chain alias.',\n );\n }\n }\n}\n"],"mappings":"kfAqBA,SAAgB,EAAc,EAAa,EAA+C,CACxF,GAAI,CACF,OAAO,GAAI,OACJ,EAAO,CACd,MAAM,EAAa,EAAM,EAuB7B,SAAgB,EAA+B,CAC7C,WACA,YAAa,CAAE,SAAU,GACzB,YAAa,CAAE,SAAU,IAKhB,CAST,OARI,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG9D,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG3D,EAGT,SAAgB,EAAqC,EAAe,CAClE,OAAO,GAAW,EAAQ,QAAQ,EAAsB,GAAG,CAG7D,SAAgB,EAAwB,EAAsB,EAA6B,CACzF,IAAM,EAAS,EAAY,OAAS,OACpC,OAAO,EAAmB,EAAU,CAAC,WAAW,EAAO,CAGzD,SAAgB,EAAc,EAAuB,EAA8C,CACjG,IAAM,EAAW,EAAY,EAAkC,EAE/D,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAET,MAAM,IAAI,EACR,qCAAqC,EAAY,UAAY,UAAU,IAAI,IAC3E,YAAY,EAAQ,wBAClB,EAAY,OAAS,UACtB,6BAA6B,OAAO,OAAO,EAAS,CAAC,KAAK,KAAK,CAAC,GAClE,CAGH,SAAgB,EAA4B,EAAmD,CAK7F,OAJI,IAAe,IACV,EAGF,EAGT,SAAgB,EAAmB,EAAkC,CACnE,OAAQ,EAAR,CACE,KAAK,EAAY,KACf,OAAO,EAAmB,KAG5B,KAAK,EAAY,KACf,OAAO,EAAmB,QAG5B,QACE,MAAM,IAAI,EAAS,qDAAsD,EAAU,eAAe,EAKxG,SAAgB,EAAqB,EAAgC,CACnE,OAAO,EAAiB,EAO1B,SAAgB,EAAsB,EAAsC,EAAkC,CAC5G,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,QACE,MAAM,IAAI,EAAmB,4BAA4B,IAAa,EAK5E,SAAgB,EAAkB,EAAe,EAA+B,CAM9E,OAAO,EALe,EAAM,IAAK,IAAU,CACzC,OACA,GAAG,EAAM,YAAY,EAAK,CAC3B,EAAE,CAE2B,CAAC,SAAS,CAAE,CAAC,EAAe,OAAS,MAAM,CAAC,CAAC,KAAK,CAAE,UAAW,EAAK,CAGpG,SAAgB,EAAoB,EAAuB,CACzD,OAAO,EAAM,QAAQ,EAAO,IAGnB,EAFU,EAAM,YAAY,EAAK,CAEhB,OACvB,GAAG,CAGR,SAAgB,EAAsB,EAAmC,CACvE,OAAO,EAAU,IAAK,GAAY,EAAM,MAAM,EAAQ,CAAC,GAAG,CAG5D,SAAgB,EAAwB,EAAmC,CACzE,OAAQ,EAAR,CACE,KAAK,EAAY,KACf,MAAO,GAGT,KAAK,EAAY,KACf,MAAO,GAGT,QACE,MAAM,IAAI,EAAS,qDAAsD,EAAU,eAAe,EAQxG,SAAgB,EACd,EACA,EACsC,CACtC,IAAM,EAAU,EAAmB,EAAY,CAE/C,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,QACE,MAAM,IAAI,EACR,4BAA4B,IAC5B,8DACD"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`./_handlers/analyze-support.cjs`),r=require(`./_handlers/get-bridgeable-assets.cjs`),i=require(`./_handlers/get-minimum-transfer-amount.cjs`),a=require(`./_handlers/get-supported-chains.cjs`),o=require(`./_utils.cjs`),s=require(`./_handlers/stream-quotes.cjs`),c=require(`./_handlers/transfer-asset.cjs`),l=require(`./_handlers/estimate-native-fee.cjs`),u=require(`./_handlers/track-transfer.cjs`);let d=require(`@avalabs/avalanchejs`);async function f({avalancheSendTx:f,environment:p,getCoreEthAddress:m,getAtomicUtxos:h,getUtxos:g,getWalletAddressesForChainAlias:_,getWalletChangeAddressForChainAlias:v}){let y,b;try{y=o.getAvalancheApiUrl(p),b=await d.Context.getContextFromURI(y)}catch(e){throw new t.ServiceInitializationError(`Failed to initialize Avalanche CCT context.`,void 0,e)}return{analyzeSupport:n.analyzeSupportFactory({environment:p}),estimateNativeFee:l.estimateNativeFeeFactory({ajsContext:b,environment:p,getAtomicUtxos:h,getUtxos:g}),getAssets:async()=>{throw new t.NotImplementedError},getBridgeableAssets:r.getBridgeableAssetsFactory({environment:p}),getMinimumTransferAmount:i.getMinimumTransferAmountFactory(),getSupportedChains:a.getSupportedChainsFactory({environment:p}),streamQuotes:s.streamQuotesFactory({environment:p,getAtomicUtxos:h}),trackTransfer:u.trackTransferFactory({environment:p}),transferAsset:c.transferAssetFactory({ajsContext:b,avalancheSendTx:f,environment:p,getCoreEthAddress:m,getAtomicUtxos:h,getUtxos:g,getWalletAddressesForChainAlias:_,getWalletChangeAddressForChainAlias:v}),type:e.ServiceType.AVALANCHE_CCT}}exports.createAvalancheCctService=f;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`./_handlers/analyze-support.cjs`),r=require(`./_handlers/get-bridgeable-assets.cjs`),i=require(`./_utils.cjs`),a=require(`./_handlers/get-minimum-transfer-amount.cjs`),o=require(`./_handlers/get-supported-chains.cjs`),s=require(`./_handlers/stream-quotes.cjs`),c=require(`./_handlers/transfer-asset.cjs`),l=require(`./_handlers/estimate-native-fee.cjs`),u=require(`./_handlers/track-transfer.cjs`);let d=require(`@avalabs/avalanchejs`);async function f({avalancheSendTx:f,environment:p,getCoreEthAddress:m,getAtomicUtxos:h,getUtxos:g,getWalletAddressesForChainAlias:_,getWalletChangeAddressForChainAlias:v}){let y,b;try{y=i.getAvalancheApiUrl(p),b=await d.Context.getContextFromURI(y)}catch(e){throw new t.ServiceInitializationError(`Failed to initialize Avalanche CCT context.`,void 0,e)}return{analyzeSupport:n.analyzeSupportFactory({environment:p}),estimateNativeFee:l.estimateNativeFeeFactory({ajsContext:b,environment:p,getAtomicUtxos:h,getUtxos:g}),getAssets:async()=>{throw new t.NotImplementedError},getBridgeableAssets:r.getBridgeableAssetsFactory({environment:p}),getMinimumTransferAmount:a.getMinimumTransferAmountFactory({environment:p,getAtomicUtxos:h}),getSupportedChains:o.getSupportedChainsFactory({environment:p}),streamQuotes:s.streamQuotesFactory({environment:p,getAtomicUtxos:h}),trackTransfer:u.trackTransferFactory({environment:p}),transferAsset:c.transferAssetFactory({ajsContext:b,avalancheSendTx:f,environment:p,getCoreEthAddress:m,getAtomicUtxos:h,getUtxos:g,getWalletAddressesForChainAlias:_,getWalletChangeAddressForChainAlias:v}),type:e.ServiceType.AVALANCHE_CCT}}exports.createAvalancheCctService=f;
2
2
  //# sourceMappingURL=avalanche-cct-service.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"avalanche-cct-service.cjs","names":["getAvalancheApiUrl","Context","ServiceInitializationError","analyzeSupportFactory","estimateNativeFeeFactory","NotImplementedError","getBridgeableAssetsFactory","getMinimumTransferAmountFactory","getSupportedChainsFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/avalanche-cct/avalanche-cct-service.ts"],"sourcesContent":["import { Context } from '@avalabs/avalanchejs';\nimport { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { NotImplementedError, ServiceInitializationError } from '../../errors';\nimport type { AvalancheSendTxFunction, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n} from './types';\nimport type { Fetch } from '../../types/utility-types';\nimport { getAvalancheApiUrl } from './_utils';\n\nexport interface AvalancheCctServiceOptions {\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n fetch?: Fetch;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport async function createAvalancheCctService({\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: AvalancheCctServiceOptions): Promise<TransferService> {\n let avaxApiUrl: string;\n let ajsContext: Context.Context;\n\n try {\n avaxApiUrl = getAvalancheApiUrl(environment);\n ajsContext = await Context.getContextFromURI(avaxApiUrl);\n } catch (error) {\n throw new ServiceInitializationError('Failed to initialize Avalanche CCT context.', undefined, error);\n }\n\n return {\n analyzeSupport: analyzeSupportFactory({ environment }),\n estimateNativeFee: estimateNativeFeeFactory({ ajsContext, environment, getAtomicUtxos, getUtxos }),\n getAssets: async () => {\n throw new NotImplementedError();\n },\n getBridgeableAssets: getBridgeableAssetsFactory({ environment }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory(),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({ environment, getAtomicUtxos }),\n trackTransfer: trackTransferFactory({ environment }),\n transferAsset: transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n type: ServiceType.AVALANCHE_CCT,\n } satisfies TransferService;\n}\n"],"mappings":"ojBAkCA,eAAsB,EAA0B,CAC9C,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACuD,CACvD,IAAI,EACA,EAEJ,GAAI,CACF,EAAaA,EAAAA,mBAAmB,EAAY,CAC5C,EAAa,MAAMC,EAAAA,QAAQ,kBAAkB,EAAW,OACjD,EAAO,CACd,MAAM,IAAIC,EAAAA,2BAA2B,8CAA+C,IAAA,GAAW,EAAM,CAGvG,MAAO,CACL,eAAgBC,EAAAA,sBAAsB,CAAE,cAAa,CAAC,CACtD,kBAAmBC,EAAAA,yBAAyB,CAAE,aAAY,cAAa,iBAAgB,WAAU,CAAC,CAClG,UAAW,SAAY,CACrB,MAAM,IAAIC,EAAAA,qBAEZ,oBAAqBC,EAAAA,2BAA2B,CAAE,cAAa,CAAC,CAChE,yBAA0BC,EAAAA,iCAAiC,CAC3D,mBAAoBC,EAAAA,0BAA0B,CAAE,cAAa,CAAC,CAC9D,aAAcC,EAAAA,oBAAoB,CAAE,cAAa,iBAAgB,CAAC,CAClE,cAAeC,EAAAA,qBAAqB,CAAE,cAAa,CAAC,CACpD,cAAeC,EAAAA,qBAAqB,CAClC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,sCACD,CAAC,CACF,KAAMC,EAAAA,YAAY,cACnB"}
1
+ {"version":3,"file":"avalanche-cct-service.cjs","names":["getAvalancheApiUrl","Context","ServiceInitializationError","analyzeSupportFactory","estimateNativeFeeFactory","NotImplementedError","getBridgeableAssetsFactory","getMinimumTransferAmountFactory","getSupportedChainsFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/avalanche-cct/avalanche-cct-service.ts"],"sourcesContent":["import { Context } from '@avalabs/avalanchejs';\nimport { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { NotImplementedError, ServiceInitializationError } from '../../errors';\nimport type { AvalancheSendTxFunction, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n} from './types';\nimport type { Fetch } from '../../types/utility-types';\nimport { getAvalancheApiUrl } from './_utils';\n\nexport interface AvalancheCctServiceOptions {\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n fetch?: Fetch;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport async function createAvalancheCctService({\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: AvalancheCctServiceOptions): Promise<TransferService> {\n let avaxApiUrl: string;\n let ajsContext: Context.Context;\n\n try {\n avaxApiUrl = getAvalancheApiUrl(environment);\n ajsContext = await Context.getContextFromURI(avaxApiUrl);\n } catch (error) {\n throw new ServiceInitializationError('Failed to initialize Avalanche CCT context.', undefined, error);\n }\n\n return {\n analyzeSupport: analyzeSupportFactory({ environment }),\n estimateNativeFee: estimateNativeFeeFactory({ ajsContext, environment, getAtomicUtxos, getUtxos }),\n getAssets: async () => {\n throw new NotImplementedError();\n },\n getBridgeableAssets: getBridgeableAssetsFactory({ environment }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({ environment, getAtomicUtxos }),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({ environment, getAtomicUtxos }),\n trackTransfer: trackTransferFactory({ environment }),\n transferAsset: transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n type: ServiceType.AVALANCHE_CCT,\n } satisfies TransferService;\n}\n"],"mappings":"ojBAkCA,eAAsB,EAA0B,CAC9C,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACuD,CACvD,IAAI,EACA,EAEJ,GAAI,CACF,EAAaA,EAAAA,mBAAmB,EAAY,CAC5C,EAAa,MAAMC,EAAAA,QAAQ,kBAAkB,EAAW,OACjD,EAAO,CACd,MAAM,IAAIC,EAAAA,2BAA2B,8CAA+C,IAAA,GAAW,EAAM,CAGvG,MAAO,CACL,eAAgBC,EAAAA,sBAAsB,CAAE,cAAa,CAAC,CACtD,kBAAmBC,EAAAA,yBAAyB,CAAE,aAAY,cAAa,iBAAgB,WAAU,CAAC,CAClG,UAAW,SAAY,CACrB,MAAM,IAAIC,EAAAA,qBAEZ,oBAAqBC,EAAAA,2BAA2B,CAAE,cAAa,CAAC,CAChE,yBAA0BC,EAAAA,gCAAgC,CAAE,cAAa,iBAAgB,CAAC,CAC1F,mBAAoBC,EAAAA,0BAA0B,CAAE,cAAa,CAAC,CAC9D,aAAcC,EAAAA,oBAAoB,CAAE,cAAa,iBAAgB,CAAC,CAClE,cAAeC,EAAAA,qBAAqB,CAAE,cAAa,CAAC,CACpD,cAAeC,EAAAA,qBAAqB,CAClC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,sCACD,CAAC,CACF,KAAMC,EAAAA,YAAY,cACnB"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e}from"../../constants.js";import{NotImplementedError as t,ServiceInitializationError as n}from"../../errors.js";import{analyzeSupportFactory as r}from"./_handlers/analyze-support.js";import{getBridgeableAssetsFactory as i}from"./_handlers/get-bridgeable-assets.js";import{getMinimumTransferAmountFactory as a}from"./_handlers/get-minimum-transfer-amount.js";import{getSupportedChainsFactory as o}from"./_handlers/get-supported-chains.js";import{getAvalancheApiUrl as s}from"./_utils.js";import{streamQuotesFactory as c}from"./_handlers/stream-quotes.js";import{transferAssetFactory as l}from"./_handlers/transfer-asset.js";import{estimateNativeFeeFactory as u}from"./_handlers/estimate-native-fee.js";import{trackTransferFactory as d}from"./_handlers/track-transfer.js";import{Context as f}from"@avalabs/avalanchejs";async function p({avalancheSendTx:p,environment:m,getCoreEthAddress:h,getAtomicUtxos:g,getUtxos:_,getWalletAddressesForChainAlias:v,getWalletChangeAddressForChainAlias:y}){let b,x;try{b=s(m),x=await f.getContextFromURI(b)}catch(e){throw new n(`Failed to initialize Avalanche CCT context.`,void 0,e)}return{analyzeSupport:r({environment:m}),estimateNativeFee:u({ajsContext:x,environment:m,getAtomicUtxos:g,getUtxos:_}),getAssets:async()=>{throw new t},getBridgeableAssets:i({environment:m}),getMinimumTransferAmount:a(),getSupportedChains:o({environment:m}),streamQuotes:c({environment:m,getAtomicUtxos:g}),trackTransfer:d({environment:m}),transferAsset:l({ajsContext:x,avalancheSendTx:p,environment:m,getCoreEthAddress:h,getAtomicUtxos:g,getUtxos:_,getWalletAddressesForChainAlias:v,getWalletChangeAddressForChainAlias:y}),type:e.AVALANCHE_CCT}}export{p as createAvalancheCctService};
1
+ import{ServiceType as e}from"../../constants.js";import{NotImplementedError as t,ServiceInitializationError as n}from"../../errors.js";import{analyzeSupportFactory as r}from"./_handlers/analyze-support.js";import{getBridgeableAssetsFactory as i}from"./_handlers/get-bridgeable-assets.js";import{getAvalancheApiUrl as a}from"./_utils.js";import{getMinimumTransferAmountFactory as o}from"./_handlers/get-minimum-transfer-amount.js";import{getSupportedChainsFactory as s}from"./_handlers/get-supported-chains.js";import{streamQuotesFactory as c}from"./_handlers/stream-quotes.js";import{transferAssetFactory as l}from"./_handlers/transfer-asset.js";import{estimateNativeFeeFactory as u}from"./_handlers/estimate-native-fee.js";import{trackTransferFactory as d}from"./_handlers/track-transfer.js";import{Context as f}from"@avalabs/avalanchejs";async function p({avalancheSendTx:p,environment:m,getCoreEthAddress:h,getAtomicUtxos:g,getUtxos:_,getWalletAddressesForChainAlias:v,getWalletChangeAddressForChainAlias:y}){let b,x;try{b=a(m),x=await f.getContextFromURI(b)}catch(e){throw new n(`Failed to initialize Avalanche CCT context.`,void 0,e)}return{analyzeSupport:r({environment:m}),estimateNativeFee:u({ajsContext:x,environment:m,getAtomicUtxos:g,getUtxos:_}),getAssets:async()=>{throw new t},getBridgeableAssets:i({environment:m}),getMinimumTransferAmount:o({environment:m,getAtomicUtxos:g}),getSupportedChains:s({environment:m}),streamQuotes:c({environment:m,getAtomicUtxos:g}),trackTransfer:d({environment:m}),transferAsset:l({ajsContext:x,avalancheSendTx:p,environment:m,getCoreEthAddress:h,getAtomicUtxos:g,getUtxos:_,getWalletAddressesForChainAlias:v,getWalletChangeAddressForChainAlias:y}),type:e.AVALANCHE_CCT}}export{p as createAvalancheCctService};
2
2
  //# sourceMappingURL=avalanche-cct-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avalanche-cct-service.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/avalanche-cct-service.ts"],"sourcesContent":["import { Context } from '@avalabs/avalanchejs';\nimport { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { NotImplementedError, ServiceInitializationError } from '../../errors';\nimport type { AvalancheSendTxFunction, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n} from './types';\nimport type { Fetch } from '../../types/utility-types';\nimport { getAvalancheApiUrl } from './_utils';\n\nexport interface AvalancheCctServiceOptions {\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n fetch?: Fetch;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport async function createAvalancheCctService({\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: AvalancheCctServiceOptions): Promise<TransferService> {\n let avaxApiUrl: string;\n let ajsContext: Context.Context;\n\n try {\n avaxApiUrl = getAvalancheApiUrl(environment);\n ajsContext = await Context.getContextFromURI(avaxApiUrl);\n } catch (error) {\n throw new ServiceInitializationError('Failed to initialize Avalanche CCT context.', undefined, error);\n }\n\n return {\n analyzeSupport: analyzeSupportFactory({ environment }),\n estimateNativeFee: estimateNativeFeeFactory({ ajsContext, environment, getAtomicUtxos, getUtxos }),\n getAssets: async () => {\n throw new NotImplementedError();\n },\n getBridgeableAssets: getBridgeableAssetsFactory({ environment }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory(),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({ environment, getAtomicUtxos }),\n trackTransfer: trackTransferFactory({ environment }),\n transferAsset: transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n type: ServiceType.AVALANCHE_CCT,\n } satisfies TransferService;\n}\n"],"mappings":"w0BAkCA,eAAsB,EAA0B,CAC9C,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACuD,CACvD,IAAI,EACA,EAEJ,GAAI,CACF,EAAa,EAAmB,EAAY,CAC5C,EAAa,MAAM,EAAQ,kBAAkB,EAAW,OACjD,EAAO,CACd,MAAM,IAAI,EAA2B,8CAA+C,IAAA,GAAW,EAAM,CAGvG,MAAO,CACL,eAAgB,EAAsB,CAAE,cAAa,CAAC,CACtD,kBAAmB,EAAyB,CAAE,aAAY,cAAa,iBAAgB,WAAU,CAAC,CAClG,UAAW,SAAY,CACrB,MAAM,IAAI,GAEZ,oBAAqB,EAA2B,CAAE,cAAa,CAAC,CAChE,yBAA0B,GAAiC,CAC3D,mBAAoB,EAA0B,CAAE,cAAa,CAAC,CAC9D,aAAc,EAAoB,CAAE,cAAa,iBAAgB,CAAC,CAClE,cAAe,EAAqB,CAAE,cAAa,CAAC,CACpD,cAAe,EAAqB,CAClC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,sCACD,CAAC,CACF,KAAM,EAAY,cACnB"}
1
+ {"version":3,"file":"avalanche-cct-service.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/avalanche-cct-service.ts"],"sourcesContent":["import { Context } from '@avalabs/avalanchejs';\nimport { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { NotImplementedError, ServiceInitializationError } from '../../errors';\nimport type { AvalancheSendTxFunction, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n} from './types';\nimport type { Fetch } from '../../types/utility-types';\nimport { getAvalancheApiUrl } from './_utils';\n\nexport interface AvalancheCctServiceOptions {\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n fetch?: Fetch;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport async function createAvalancheCctService({\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: AvalancheCctServiceOptions): Promise<TransferService> {\n let avaxApiUrl: string;\n let ajsContext: Context.Context;\n\n try {\n avaxApiUrl = getAvalancheApiUrl(environment);\n ajsContext = await Context.getContextFromURI(avaxApiUrl);\n } catch (error) {\n throw new ServiceInitializationError('Failed to initialize Avalanche CCT context.', undefined, error);\n }\n\n return {\n analyzeSupport: analyzeSupportFactory({ environment }),\n estimateNativeFee: estimateNativeFeeFactory({ ajsContext, environment, getAtomicUtxos, getUtxos }),\n getAssets: async () => {\n throw new NotImplementedError();\n },\n getBridgeableAssets: getBridgeableAssetsFactory({ environment }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({ environment, getAtomicUtxos }),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({ environment, getAtomicUtxos }),\n trackTransfer: trackTransferFactory({ environment }),\n transferAsset: transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n type: ServiceType.AVALANCHE_CCT,\n } satisfies TransferService;\n}\n"],"mappings":"w0BAkCA,eAAsB,EAA0B,CAC9C,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACuD,CACvD,IAAI,EACA,EAEJ,GAAI,CACF,EAAa,EAAmB,EAAY,CAC5C,EAAa,MAAM,EAAQ,kBAAkB,EAAW,OACjD,EAAO,CACd,MAAM,IAAI,EAA2B,8CAA+C,IAAA,GAAW,EAAM,CAGvG,MAAO,CACL,eAAgB,EAAsB,CAAE,cAAa,CAAC,CACtD,kBAAmB,EAAyB,CAAE,aAAY,cAAa,iBAAgB,WAAU,CAAC,CAClG,UAAW,SAAY,CACrB,MAAM,IAAI,GAEZ,oBAAqB,EAA2B,CAAE,cAAa,CAAC,CAChE,yBAA0B,EAAgC,CAAE,cAAa,iBAAgB,CAAC,CAC1F,mBAAoB,EAA0B,CAAE,cAAa,CAAC,CAC9D,aAAc,EAAoB,CAAE,cAAa,iBAAgB,CAAC,CAClE,cAAe,EAAqB,CAAE,cAAa,CAAC,CACpD,cAAe,EAAqB,CAClC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,sCACD,CAAC,CACF,KAAM,EAAY,cACnB"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../errors.cjs`),t=require(`./_schema.cjs`),n=require(`../fetch-utilities.cjs`);function r(e){if(e)return{Authorization:`Bearer ${e}`}}async function i({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/chains`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.SupportedChainsResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function a({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/tokens/${s}/list`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{headers:r(a),fetch:o}),u=t.TokenListResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function o({apiBaseUrl:i,apiToken:a,fetch:o},s,{onDone:c,onError:l,onQuote:u,signal:d}){let f=`/quote`,p=n.combineUrlPathnames(i,f),m=[];try{for await(let i of n.fetchEventStream(p,{body:JSON.stringify(s),fetch:o,headers:r(a),signal:d})){let n=t.QuoteResponseSchema.safeParse(JSON.parse(i.data));if(!n.success){l(new e.ResponseValidationError(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?c():(u(n.data),m.push(n.data))}}catch(e){e instanceof Error?l(e):l(Error(`An unknown error occurred during the quote stream.`,{cause:e})),c()}return m}async function s({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/swap`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`}),u=t.SwapResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function c({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/partner`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.PartnerInfoResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function l({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/cross-chain/status/${s}`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{headers:r(a),fetch:o,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:c}),d=t.CrossChainStatusResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues,u);return d.data}async function u({apiBaseUrl:i,apiToken:a,fetch:o},{chainId:s,crossChainSwap:c,quoteId:l}){let u=`/spender-address?chainId=${s}&cross=${c?`true`:`false`}&uuid=${l}`,d=await n.fetchJson(n.combineUrlPathnames(i,u),{headers:r(a),fetch:o}),f=t.SpenderAddressResponseSchema.safeParse(d);if(!f.success)throw new e.ResponseValidationError(`Invalid response from Markr "${u}" endpoint.`,f.error.issues);return f.data}exports.markrGetCrossChainStatus=l,exports.markrGetInfoChains=i,exports.markrGetPartnerInfo=c,exports.markrGetSpenderAddress=u,exports.markrGetTokenList=a,exports.markrStreamQuote=o,exports.markrSwap=s;
1
+ const e=require(`../../errors.cjs`),t=require(`./_schema.cjs`),n=require(`../fetch-utilities.cjs`);function r(e){if(e)return{Authorization:`Bearer ${e}`}}async function i({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/chains`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.SupportedChainsResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function a({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/tokens/${s}/list`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{headers:r(a),fetch:o}),u=t.TokenListResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function o({apiBaseUrl:i,apiToken:a,fetch:o},s,{onDone:c,onError:l,onQuote:u,signal:d}){let f=`/quote`,p=n.combineUrlPathnames(i,f),m=[];try{for await(let i of n.fetchEventStream(p,{body:JSON.stringify(s),fetch:o,headers:r(a),signal:d})){let n=t.QuoteResponseSchema.safeParse(JSON.parse(i.data));if(!n.success){l(new e.ResponseValidationError(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?c():(u(n.data),m.push(n.data))}}catch(e){e instanceof Error?l(e):l(Error(`An unknown error occurred during the quote stream.`,{cause:e})),c()}return m}async function s({apiBaseUrl:i,apiToken:a,fetch:o},s){let c=`/swap`,l=await n.fetchJson(n.combineUrlPathnames(i,c),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`}),u=t.SwapResponseSchema.safeParse(l);if(!u.success)throw new e.ResponseValidationError(`Invalid response from Markr "${c}" endpoint.`,u.error.issues);return u.data}async function c({apiBaseUrl:i,apiToken:a,fetch:o}){let s=`/info/partner`,c=await n.fetchJson(n.combineUrlPathnames(i,s),{headers:r(a),fetch:o}),l=t.PartnerInfoResponseSchema.safeParse(c);if(!l.success)throw new e.ResponseValidationError(`Invalid response from Markr "${s}" endpoint.`,l.error.issues);return l.data}async function l({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/cross-chain/status/${s}`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{headers:r(a),fetch:o,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:c}),d=t.CrossChainStatusResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues,u);return d.data}async function u({apiBaseUrl:i,apiToken:a,fetch:o},{chainId:s,crossChainSwap:c,quoteId:l}){let u=`/spender-address?chainId=${s}&cross=${c?`true`:`false`}&uuid=${l}`,d=await n.fetchJson(n.combineUrlPathnames(i,u),{headers:r(a),fetch:o}),f=t.SpenderAddressResponseSchema.safeParse(d);if(!f.success)throw new e.ResponseValidationError(`Invalid response from Markr "${u}" endpoint.`,f.error.issues);return f.data}async function d({apiBaseUrl:i,apiToken:a,fetch:o},s,{signal:c}={}){let l=`/authorize`,u=await n.fetchJson(n.combineUrlPathnames(i,l),{body:JSON.stringify(s),fetch:o,headers:r(a),method:`POST`,signal:c}),d=t.MarkrAuthorizeResponseSchema.safeParse(u);if(!d.success)throw new e.ResponseValidationError(`Invalid response from Markr "${l}" endpoint.`,d.error.issues)}exports.markrGetCrossChainStatus=l,exports.markrGetInfoChains=i,exports.markrGetPartnerInfo=c,exports.markrGetSpenderAddress=u,exports.markrGetTokenList=a,exports.markrPostAuthorize=d,exports.markrStreamQuote=o,exports.markrSwap=s;
2
2
  //# sourceMappingURL=_api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_api.cjs","names":["fetchJson","combineUrlPathnames","SupportedChainsResponseSchema","ResponseValidationError","TokenListResponseSchema","fetchEventStream","QuoteResponseSchema","SwapResponseSchema","PartnerInfoResponseSchema","AbortedError","CrossChainStatusResponseSchema","SpenderAddressResponseSchema"],"sources":["../../../src/transfer-service/markr/_api.ts"],"sourcesContent":["import type { Address as SolanaAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport { AbortedError, ResponseValidationError } from '../../errors';\nimport { combineUrlPathnames, fetchEventStream, fetchJson } from '../fetch-utilities';\nimport {\n CrossChainStatusResponseSchema,\n PartnerInfoResponseSchema,\n QuoteResponseSchema,\n SpenderAddressResponseSchema,\n SupportedChainsResponseSchema,\n SwapResponseSchema,\n TokenListResponseSchema,\n type CrossChainStatusResponse,\n type PartnerInfoResponse,\n type QuoteResponseData,\n type SpenderAddressResponse,\n type SupportedChainsResponse,\n type SwapResponse,\n type TokenListResponse,\n} from './_schema';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface ApiOptions {\n apiBaseUrl: URL;\n apiToken?: string;\n fetch?: Fetch;\n}\n\nfunction getAuthHeaders(apiToken?: string): Record<string, string> | undefined {\n if (!apiToken) {\n return undefined;\n }\n\n return { Authorization: `Bearer ${apiToken}` };\n}\n\nexport async function markrGetInfoChains({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<SupportedChainsResponse> {\n const endpoint = '/info/chains';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SupportedChainsResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetTokenList(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n chainId: number,\n): Promise<TokenListResponse> {\n const endpoint = `/tokens/${chainId}/list`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = TokenListResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport interface MarkrStreamQuoteParams {\n amount: string;\n appId: string;\n chainId: number | Caip2ChainId;\n destinationChainId?: number | Caip2ChainId;\n slippage?: number;\n tokenIn: string;\n tokenInDecimals: number;\n tokenOut: string;\n tokenOutDecimals: number;\n /**\n * Required ONLY for cross-chain swaps involving EVM.\n *\n * EVM -> EVM (different chains)\n * EVM -> Solana\n * Solana -> EVM\n */\n userEvmAddress?: EvmAddress;\n /**\n * Required ONLY for cross-chain swaps involving Solana.\n *\n * Solana -> EVM\n * EVM -> Solana\n * Solana -> Solana\n */\n userSolanaAddress?: SolanaAddress;\n}\n\nexport interface MarkrStreamQuoteOptions {\n onDone: () => void;\n onError: (error: Error) => void;\n onQuote: (data: QuoteResponseData) => void;\n signal?: AbortSignal;\n}\n\nexport async function markrStreamQuote(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrStreamQuoteParams,\n { onDone, onError, onQuote, signal }: MarkrStreamQuoteOptions,\n): Promise<ReadonlyArray<QuoteResponseData>> {\n const endpoint = '/quote';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const quotes: QuoteResponseData[] = [];\n\n try {\n for await (const event of fetchEventStream(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n signal,\n })) {\n const parsedData = QuoteResponseSchema.safeParse(JSON.parse(event.data));\n\n if (!parsedData.success) {\n onError(\n new ResponseValidationError(\n `Invalid quote data received from Markr \"${endpoint}\" endpoint.`,\n parsedData.error.issues,\n ),\n );\n continue;\n }\n\n if (!('done' in parsedData.data)) {\n onQuote(parsedData.data);\n quotes.push(parsedData.data);\n } else {\n onDone();\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n onError(error);\n } else {\n onError(new Error('An unknown error occurred during the quote stream.', { cause: error }));\n }\n\n onDone();\n }\n\n return quotes;\n}\n\nexport interface MarkrGetSwapParams {\n appId: string;\n /** Input amount in token's smallest unit */\n amountIn: string;\n /** Return raw transaction data alongside wrapped data */\n debug?: boolean;\n /** Minimum expected output amount */\n minAmountOut: string;\n /** Input token contract address */\n tokenIn: string;\n /** Output token contract address */\n tokenOut: string;\n /** Solana wallet public key (required for Solana swaps) */\n userPublicKey?: string;\n /** Quote UUID from previous quote request */\n uuid: string;\n}\n\nexport async function markrSwap(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrGetSwapParams,\n): Promise<SwapResponse> {\n const endpoint = '/swap';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n });\n\n const parsed = SwapResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetPartnerInfo({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<PartnerInfoResponse> {\n const endpoint = '/info/partner';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = PartnerInfoResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetCrossChainStatus(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n sourceTxHash: string,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<CrossChainStatusResponse> {\n const endpoint = `/cross-chain/status/${sourceTxHash}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n headers: getAuthHeaders(apiToken),\n fetch: customFetch,\n retries: 10,\n retryOn(ctx) {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!['GET', 'HEAD', 'OPTIONS', 'TRACE'].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 // Retry on 404 requests since the endpoint may not return a result immediately after the source transaction is executed.\n if (status === 404 || status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n },\n signal,\n });\n\n const parsed = CrossChainStatusResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(\n `Invalid response from Markr \"${endpoint}\" endpoint.`,\n parsed.error.issues,\n rawJson,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * Returns the spender address (wrapped contract) that needs to be approved\n * for token swaps on the specified chain.\n *\n * Not applicable for Solana.\n */\nexport async function markrGetSpenderAddress(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n {\n chainId,\n crossChainSwap,\n quoteId,\n }: {\n chainId: number;\n crossChainSwap?: boolean;\n quoteId: string;\n },\n): Promise<SpenderAddressResponse> {\n const endpoint = `/spender-address?chainId=${chainId}&cross=${crossChainSwap ? 'true' : 'false'}&uuid=${quoteId}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SpenderAddressResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_api.cjs","names":["fetchJson","combineUrlPathnames","SupportedChainsResponseSchema","ResponseValidationError","TokenListResponseSchema","fetchEventStream","QuoteResponseSchema","SwapResponseSchema","PartnerInfoResponseSchema","AbortedError","CrossChainStatusResponseSchema","SpenderAddressResponseSchema","MarkrAuthorizeResponseSchema"],"sources":["../../../src/transfer-service/markr/_api.ts"],"sourcesContent":["import type { Address as SolanaAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport { AbortedError, ResponseValidationError } from '../../errors';\nimport { combineUrlPathnames, fetchEventStream, fetchJson } from '../fetch-utilities';\nimport {\n CrossChainStatusResponseSchema,\n MarkrAuthorizeResponseSchema,\n PartnerInfoResponseSchema,\n QuoteResponseSchema,\n SpenderAddressResponseSchema,\n SupportedChainsResponseSchema,\n SwapResponseSchema,\n TokenListResponseSchema,\n type CrossChainStatusResponse,\n type PartnerInfoResponse,\n type QuoteResponseData,\n type SpenderAddressResponse,\n type SupportedChainsResponse,\n type SwapResponse,\n type TokenListResponse,\n} from './_schema';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface ApiOptions {\n apiBaseUrl: URL;\n apiToken?: string;\n fetch?: Fetch;\n}\n\nfunction getAuthHeaders(apiToken?: string): Record<string, string> | undefined {\n if (!apiToken) {\n return undefined;\n }\n\n return { Authorization: `Bearer ${apiToken}` };\n}\n\nexport async function markrGetInfoChains({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<SupportedChainsResponse> {\n const endpoint = '/info/chains';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SupportedChainsResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetTokenList(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n chainId: number,\n): Promise<TokenListResponse> {\n const endpoint = `/tokens/${chainId}/list`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = TokenListResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport interface MarkrStreamQuoteParams {\n amount: string;\n appId: string;\n chainId: number | Caip2ChainId;\n destinationChainId?: number | Caip2ChainId;\n slippage?: number;\n tokenIn: string;\n tokenInDecimals: number;\n tokenOut: string;\n tokenOutDecimals: number;\n /**\n * Required ONLY for cross-chain swaps involving EVM.\n *\n * EVM -> EVM (different chains)\n * EVM -> Solana\n * Solana -> EVM\n */\n userEvmAddress?: EvmAddress;\n /**\n * Required ONLY for cross-chain swaps involving Solana.\n *\n * Solana -> EVM\n * EVM -> Solana\n * Solana -> Solana\n */\n userSolanaAddress?: SolanaAddress;\n}\n\nexport interface MarkrStreamQuoteOptions {\n onDone: () => void;\n onError: (error: Error) => void;\n onQuote: (data: QuoteResponseData) => void;\n signal?: AbortSignal;\n}\n\nexport async function markrStreamQuote(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrStreamQuoteParams,\n { onDone, onError, onQuote, signal }: MarkrStreamQuoteOptions,\n): Promise<ReadonlyArray<QuoteResponseData>> {\n const endpoint = '/quote';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const quotes: QuoteResponseData[] = [];\n\n try {\n for await (const event of fetchEventStream(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n signal,\n })) {\n const parsedData = QuoteResponseSchema.safeParse(JSON.parse(event.data));\n\n if (!parsedData.success) {\n onError(\n new ResponseValidationError(\n `Invalid quote data received from Markr \"${endpoint}\" endpoint.`,\n parsedData.error.issues,\n ),\n );\n continue;\n }\n\n if (!('done' in parsedData.data)) {\n onQuote(parsedData.data);\n quotes.push(parsedData.data);\n } else {\n onDone();\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n onError(error);\n } else {\n onError(new Error('An unknown error occurred during the quote stream.', { cause: error }));\n }\n\n onDone();\n }\n\n return quotes;\n}\n\nexport interface MarkrGetSwapParams {\n appId: string;\n /** Input amount in token's smallest unit */\n amountIn: string;\n /** Return raw transaction data alongside wrapped data */\n debug?: boolean;\n /** Minimum expected output amount */\n minAmountOut: string;\n /** Input token contract address */\n tokenIn: string;\n /** Output token contract address */\n tokenOut: string;\n /** Solana wallet public key (required for Solana swaps) */\n userPublicKey?: string;\n /** Quote UUID from previous quote request */\n uuid: string;\n}\n\nexport async function markrSwap(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrGetSwapParams,\n): Promise<SwapResponse> {\n const endpoint = '/swap';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n });\n\n const parsed = SwapResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetPartnerInfo({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<PartnerInfoResponse> {\n const endpoint = '/info/partner';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = PartnerInfoResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetCrossChainStatus(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n sourceTxHash: string,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<CrossChainStatusResponse> {\n const endpoint = `/cross-chain/status/${sourceTxHash}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n headers: getAuthHeaders(apiToken),\n fetch: customFetch,\n retries: 10,\n retryOn(ctx) {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!['GET', 'HEAD', 'OPTIONS', 'TRACE'].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 // Retry on 404 requests since the endpoint may not return a result immediately after the source transaction is executed.\n if (status === 404 || status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n },\n signal,\n });\n\n const parsed = CrossChainStatusResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(\n `Invalid response from Markr \"${endpoint}\" endpoint.`,\n parsed.error.issues,\n rawJson,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * Returns the spender address (wrapped contract) that needs to be approved\n * for token swaps on the specified chain.\n *\n * Not applicable for Solana.\n */\nexport async function markrGetSpenderAddress(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n {\n chainId,\n crossChainSwap,\n quoteId,\n }: {\n chainId: number;\n crossChainSwap?: boolean;\n quoteId: string;\n },\n): Promise<SpenderAddressResponse> {\n const endpoint = `/spender-address?chainId=${chainId}&cross=${crossChainSwap ? 'true' : 'false'}&uuid=${quoteId}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SpenderAddressResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\n// ---------------------------------------------------------------------------\n// Hyperliquid 2-phase withdrawal: nonce-mapping authorize\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy (`protocolVersion: 1`) authorize body — Markr rebuilds the upstream\n * Relay request from a fixed schema. Kept for back-compat; new integrations\n * should use {@link MarkrPostAuthorizeParamsV2}.\n *\n * **Caveat:** when Relay adds a required field (as it did with `depositor` in\n * v2), the rebuilt body silently omits it and the order is orphaned upstream.\n */\nexport interface MarkrPostAuthorizeParamsV1 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over the `RelayNonceMapping` typed data (`0x{r}{s}{v}`, 65 bytes hex). */\n readonly signature: `0x${string}`;\n /** EVM address of the signer. */\n readonly wallet: EvmAddress;\n /** Always `1337` (Hyperliquid). */\n readonly walletChainId: 1337;\n /** EIP-712 domain.chainId used in the signature — the wallet's active chain. */\n readonly signatureChainId: number;\n /**\n * Shared nonce — JSON number, matching Relay's upstream `/authorize` contract\n * and HL `/exchange`. HL nonces are millisecond timestamps, well under\n * `Number.MAX_SAFE_INTEGER`. Sending it as a string makes Relay reject the\n * payload (strict type validation), so we coerce here at the wire boundary.\n */\n readonly nonce: number;\n /** Relay request id (`0x{64hex}`). */\n readonly id: `0x${string}`;\n}\n\n/**\n * Pass-through (`protocolVersion: 2`) authorize body. The SDK forwards Relay's\n * `authorize.body` envelope from the `/swap` response **verbatim**. Markr only\n * normalizes `nonce` to a JSON number and defaults `referrer`; every other\n * field is untouched, so additive Relay schema changes don't break SDKs.\n */\nexport interface MarkrPostAuthorizeParamsV2 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over `swap.sign.value` using `swap.sign.domain` / `swap.sign.types`. */\n readonly signature: `0x${string}`;\n /** Relay's `/authorize` POST body, taken from `swap.authorize.body`. Forwarded verbatim. */\n readonly body: Record<string, unknown>;\n}\n\nexport type MarkrPostAuthorizeParams = MarkrPostAuthorizeParamsV1 | MarkrPostAuthorizeParamsV2;\n\n/**\n * Submit the user's signed nonce-mapping to Markr's `/authorize` endpoint.\n *\n * Markr proxies the request to Relay's upstream `/authorize`. Returns on any\n * 2xx; throws `HttpError` otherwise.\n */\nexport async function markrPostAuthorize(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrPostAuthorizeParams,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<void> {\n const endpoint = '/authorize';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n // `fetchJson` throws `HttpError` on non-2xx; the schema additionally rejects\n // upstream error envelopes that come back with a 200 (Relay sometimes does\n // this when authorize is rejected after HTTP success).\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n signal,\n });\n\n const parsed = MarkrAuthorizeResponseSchema.safeParse(rawJson);\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{AbortedError as e,ResponseValidationError as t}from"../../errors.js";import{CrossChainStatusResponseSchema as n,PartnerInfoResponseSchema as r,QuoteResponseSchema as i,SpenderAddressResponseSchema as a,SupportedChainsResponseSchema as o,SwapResponseSchema as s,TokenListResponseSchema as c}from"./_schema.js";import{combineUrlPathnames as l,fetchEventStream as u,fetchJson as d}from"../fetch-utilities.js";function f(e){if(e)return{Authorization:`Bearer ${e}`}}async function p({apiBaseUrl:e,apiToken:n,fetch:r}){let i=`/info/chains`,a=await d(l(e,i),{headers:f(n),fetch:r}),s=o.safeParse(a);if(!s.success)throw new t(`Invalid response from Markr "${i}" endpoint.`,s.error.issues);return s.data}async function m({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/tokens/${i}/list`,o=await d(l(e,a),{headers:f(n),fetch:r}),s=c.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function h({apiBaseUrl:e,apiToken:n,fetch:r},a,{onDone:o,onError:s,onQuote:c,signal:d}){let p=`/quote`,m=l(e,p),h=[];try{for await(let e of u(m,{body:JSON.stringify(a),fetch:r,headers:f(n),signal:d})){let n=i.safeParse(JSON.parse(e.data));if(!n.success){s(new t(`Invalid quote data received from Markr "${p}" endpoint.`,n.error.issues));continue}`done`in n.data?o():(c(n.data),h.push(n.data))}}catch(e){e instanceof Error?s(e):s(Error(`An unknown error occurred during the quote stream.`,{cause:e})),o()}return h}async function g({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/swap`,o=await d(l(e,a),{body:JSON.stringify(i),fetch:r,headers:f(n),method:`POST`}),c=s.safeParse(o);if(!c.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,c.error.issues);return c.data}async function _({apiBaseUrl:e,apiToken:n,fetch:i}){let a=`/info/partner`,o=await d(l(e,a),{headers:f(n),fetch:i}),s=r.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function v({apiBaseUrl:r,apiToken:i,fetch:a},o,{signal:s}={}){let c=`/cross-chain/status/${o}`,u=await d(l(r,c),{headers:f(i),fetch:a,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:s}),p=n.safeParse(u);if(!p.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,p.error.issues,u);return p.data}async function y({apiBaseUrl:e,apiToken:n,fetch:r},{chainId:i,crossChainSwap:o,quoteId:s}){let c=`/spender-address?chainId=${i}&cross=${o?`true`:`false`}&uuid=${s}`,u=await d(l(e,c),{headers:f(n),fetch:r}),p=a.safeParse(u);if(!p.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,p.error.issues);return p.data}export{v as markrGetCrossChainStatus,p as markrGetInfoChains,_ as markrGetPartnerInfo,y as markrGetSpenderAddress,m as markrGetTokenList,h as markrStreamQuote,g as markrSwap};
1
+ import{AbortedError as e,ResponseValidationError as t}from"../../errors.js";import{CrossChainStatusResponseSchema as n,MarkrAuthorizeResponseSchema as r,PartnerInfoResponseSchema as i,QuoteResponseSchema as a,SpenderAddressResponseSchema as o,SupportedChainsResponseSchema as s,SwapResponseSchema as c,TokenListResponseSchema as l}from"./_schema.js";import{combineUrlPathnames as u,fetchEventStream as d,fetchJson as f}from"../fetch-utilities.js";function p(e){if(e)return{Authorization:`Bearer ${e}`}}async function m({apiBaseUrl:e,apiToken:n,fetch:r}){let i=`/info/chains`,a=await f(u(e,i),{headers:p(n),fetch:r}),o=s.safeParse(a);if(!o.success)throw new t(`Invalid response from Markr "${i}" endpoint.`,o.error.issues);return o.data}async function h({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/tokens/${i}/list`,o=await f(u(e,a),{headers:p(n),fetch:r}),s=l.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function g({apiBaseUrl:e,apiToken:n,fetch:r},i,{onDone:o,onError:s,onQuote:c,signal:l}){let f=`/quote`,m=u(e,f),h=[];try{for await(let e of d(m,{body:JSON.stringify(i),fetch:r,headers:p(n),signal:l})){let n=a.safeParse(JSON.parse(e.data));if(!n.success){s(new t(`Invalid quote data received from Markr "${f}" endpoint.`,n.error.issues));continue}`done`in n.data?o():(c(n.data),h.push(n.data))}}catch(e){e instanceof Error?s(e):s(Error(`An unknown error occurred during the quote stream.`,{cause:e})),o()}return h}async function _({apiBaseUrl:e,apiToken:n,fetch:r},i){let a=`/swap`,o=await f(u(e,a),{body:JSON.stringify(i),fetch:r,headers:p(n),method:`POST`}),s=c.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function v({apiBaseUrl:e,apiToken:n,fetch:r}){let a=`/info/partner`,o=await f(u(e,a),{headers:p(n),fetch:r}),s=i.safeParse(o);if(!s.success)throw new t(`Invalid response from Markr "${a}" endpoint.`,s.error.issues);return s.data}async function y({apiBaseUrl:r,apiToken:i,fetch:a},o,{signal:s}={}){let c=`/cross-chain/status/${o}`,l=await f(u(r,c),{headers:p(i),fetch:a,retries:10,retryOn(t){let n=(t.init.method??`GET`).toUpperCase();if(![`GET`,`HEAD`,`OPTIONS`,`TRACE`].includes(n))return!1;if(t.error)return!(t.error instanceof e);let r=t.response?.status??0;return r===404||r===408||r===425||r===429||r>=500&&r<=599},signal:s}),d=n.safeParse(l);if(!d.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,d.error.issues,l);return d.data}async function b({apiBaseUrl:e,apiToken:n,fetch:r},{chainId:i,crossChainSwap:a,quoteId:s}){let c=`/spender-address?chainId=${i}&cross=${a?`true`:`false`}&uuid=${s}`,l=await f(u(e,c),{headers:p(n),fetch:r}),d=o.safeParse(l);if(!d.success)throw new t(`Invalid response from Markr "${c}" endpoint.`,d.error.issues);return d.data}async function x({apiBaseUrl:e,apiToken:n,fetch:i},a,{signal:o}={}){let s=`/authorize`,c=await f(u(e,s),{body:JSON.stringify(a),fetch:i,headers:p(n),method:`POST`,signal:o}),l=r.safeParse(c);if(!l.success)throw new t(`Invalid response from Markr "${s}" endpoint.`,l.error.issues)}export{y as markrGetCrossChainStatus,m as markrGetInfoChains,v as markrGetPartnerInfo,b as markrGetSpenderAddress,h as markrGetTokenList,x as markrPostAuthorize,g as markrStreamQuote,_ as markrSwap};
2
2
  //# sourceMappingURL=_api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_api.js","names":[],"sources":["../../../src/transfer-service/markr/_api.ts"],"sourcesContent":["import type { Address as SolanaAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport { AbortedError, ResponseValidationError } from '../../errors';\nimport { combineUrlPathnames, fetchEventStream, fetchJson } from '../fetch-utilities';\nimport {\n CrossChainStatusResponseSchema,\n PartnerInfoResponseSchema,\n QuoteResponseSchema,\n SpenderAddressResponseSchema,\n SupportedChainsResponseSchema,\n SwapResponseSchema,\n TokenListResponseSchema,\n type CrossChainStatusResponse,\n type PartnerInfoResponse,\n type QuoteResponseData,\n type SpenderAddressResponse,\n type SupportedChainsResponse,\n type SwapResponse,\n type TokenListResponse,\n} from './_schema';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface ApiOptions {\n apiBaseUrl: URL;\n apiToken?: string;\n fetch?: Fetch;\n}\n\nfunction getAuthHeaders(apiToken?: string): Record<string, string> | undefined {\n if (!apiToken) {\n return undefined;\n }\n\n return { Authorization: `Bearer ${apiToken}` };\n}\n\nexport async function markrGetInfoChains({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<SupportedChainsResponse> {\n const endpoint = '/info/chains';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SupportedChainsResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetTokenList(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n chainId: number,\n): Promise<TokenListResponse> {\n const endpoint = `/tokens/${chainId}/list`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = TokenListResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport interface MarkrStreamQuoteParams {\n amount: string;\n appId: string;\n chainId: number | Caip2ChainId;\n destinationChainId?: number | Caip2ChainId;\n slippage?: number;\n tokenIn: string;\n tokenInDecimals: number;\n tokenOut: string;\n tokenOutDecimals: number;\n /**\n * Required ONLY for cross-chain swaps involving EVM.\n *\n * EVM -> EVM (different chains)\n * EVM -> Solana\n * Solana -> EVM\n */\n userEvmAddress?: EvmAddress;\n /**\n * Required ONLY for cross-chain swaps involving Solana.\n *\n * Solana -> EVM\n * EVM -> Solana\n * Solana -> Solana\n */\n userSolanaAddress?: SolanaAddress;\n}\n\nexport interface MarkrStreamQuoteOptions {\n onDone: () => void;\n onError: (error: Error) => void;\n onQuote: (data: QuoteResponseData) => void;\n signal?: AbortSignal;\n}\n\nexport async function markrStreamQuote(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrStreamQuoteParams,\n { onDone, onError, onQuote, signal }: MarkrStreamQuoteOptions,\n): Promise<ReadonlyArray<QuoteResponseData>> {\n const endpoint = '/quote';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const quotes: QuoteResponseData[] = [];\n\n try {\n for await (const event of fetchEventStream(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n signal,\n })) {\n const parsedData = QuoteResponseSchema.safeParse(JSON.parse(event.data));\n\n if (!parsedData.success) {\n onError(\n new ResponseValidationError(\n `Invalid quote data received from Markr \"${endpoint}\" endpoint.`,\n parsedData.error.issues,\n ),\n );\n continue;\n }\n\n if (!('done' in parsedData.data)) {\n onQuote(parsedData.data);\n quotes.push(parsedData.data);\n } else {\n onDone();\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n onError(error);\n } else {\n onError(new Error('An unknown error occurred during the quote stream.', { cause: error }));\n }\n\n onDone();\n }\n\n return quotes;\n}\n\nexport interface MarkrGetSwapParams {\n appId: string;\n /** Input amount in token's smallest unit */\n amountIn: string;\n /** Return raw transaction data alongside wrapped data */\n debug?: boolean;\n /** Minimum expected output amount */\n minAmountOut: string;\n /** Input token contract address */\n tokenIn: string;\n /** Output token contract address */\n tokenOut: string;\n /** Solana wallet public key (required for Solana swaps) */\n userPublicKey?: string;\n /** Quote UUID from previous quote request */\n uuid: string;\n}\n\nexport async function markrSwap(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrGetSwapParams,\n): Promise<SwapResponse> {\n const endpoint = '/swap';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n });\n\n const parsed = SwapResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetPartnerInfo({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<PartnerInfoResponse> {\n const endpoint = '/info/partner';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = PartnerInfoResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetCrossChainStatus(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n sourceTxHash: string,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<CrossChainStatusResponse> {\n const endpoint = `/cross-chain/status/${sourceTxHash}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n headers: getAuthHeaders(apiToken),\n fetch: customFetch,\n retries: 10,\n retryOn(ctx) {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!['GET', 'HEAD', 'OPTIONS', 'TRACE'].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 // Retry on 404 requests since the endpoint may not return a result immediately after the source transaction is executed.\n if (status === 404 || status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n },\n signal,\n });\n\n const parsed = CrossChainStatusResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(\n `Invalid response from Markr \"${endpoint}\" endpoint.`,\n parsed.error.issues,\n rawJson,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * Returns the spender address (wrapped contract) that needs to be approved\n * for token swaps on the specified chain.\n *\n * Not applicable for Solana.\n */\nexport async function markrGetSpenderAddress(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n {\n chainId,\n crossChainSwap,\n quoteId,\n }: {\n chainId: number;\n crossChainSwap?: boolean;\n quoteId: string;\n },\n): Promise<SpenderAddressResponse> {\n const endpoint = `/spender-address?chainId=${chainId}&cross=${crossChainSwap ? 'true' : 'false'}&uuid=${quoteId}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SpenderAddressResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_api.js","names":[],"sources":["../../../src/transfer-service/markr/_api.ts"],"sourcesContent":["import type { Address as SolanaAddress } from '@solana/kit';\nimport type { Address as EvmAddress } from 'viem';\nimport { AbortedError, ResponseValidationError } from '../../errors';\nimport { combineUrlPathnames, fetchEventStream, fetchJson } from '../fetch-utilities';\nimport {\n CrossChainStatusResponseSchema,\n MarkrAuthorizeResponseSchema,\n PartnerInfoResponseSchema,\n QuoteResponseSchema,\n SpenderAddressResponseSchema,\n SupportedChainsResponseSchema,\n SwapResponseSchema,\n TokenListResponseSchema,\n type CrossChainStatusResponse,\n type PartnerInfoResponse,\n type QuoteResponseData,\n type SpenderAddressResponse,\n type SupportedChainsResponse,\n type SwapResponse,\n type TokenListResponse,\n} from './_schema';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface ApiOptions {\n apiBaseUrl: URL;\n apiToken?: string;\n fetch?: Fetch;\n}\n\nfunction getAuthHeaders(apiToken?: string): Record<string, string> | undefined {\n if (!apiToken) {\n return undefined;\n }\n\n return { Authorization: `Bearer ${apiToken}` };\n}\n\nexport async function markrGetInfoChains({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<SupportedChainsResponse> {\n const endpoint = '/info/chains';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SupportedChainsResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetTokenList(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n chainId: number,\n): Promise<TokenListResponse> {\n const endpoint = `/tokens/${chainId}/list`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = TokenListResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport interface MarkrStreamQuoteParams {\n amount: string;\n appId: string;\n chainId: number | Caip2ChainId;\n destinationChainId?: number | Caip2ChainId;\n slippage?: number;\n tokenIn: string;\n tokenInDecimals: number;\n tokenOut: string;\n tokenOutDecimals: number;\n /**\n * Required ONLY for cross-chain swaps involving EVM.\n *\n * EVM -> EVM (different chains)\n * EVM -> Solana\n * Solana -> EVM\n */\n userEvmAddress?: EvmAddress;\n /**\n * Required ONLY for cross-chain swaps involving Solana.\n *\n * Solana -> EVM\n * EVM -> Solana\n * Solana -> Solana\n */\n userSolanaAddress?: SolanaAddress;\n}\n\nexport interface MarkrStreamQuoteOptions {\n onDone: () => void;\n onError: (error: Error) => void;\n onQuote: (data: QuoteResponseData) => void;\n signal?: AbortSignal;\n}\n\nexport async function markrStreamQuote(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrStreamQuoteParams,\n { onDone, onError, onQuote, signal }: MarkrStreamQuoteOptions,\n): Promise<ReadonlyArray<QuoteResponseData>> {\n const endpoint = '/quote';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const quotes: QuoteResponseData[] = [];\n\n try {\n for await (const event of fetchEventStream(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n signal,\n })) {\n const parsedData = QuoteResponseSchema.safeParse(JSON.parse(event.data));\n\n if (!parsedData.success) {\n onError(\n new ResponseValidationError(\n `Invalid quote data received from Markr \"${endpoint}\" endpoint.`,\n parsedData.error.issues,\n ),\n );\n continue;\n }\n\n if (!('done' in parsedData.data)) {\n onQuote(parsedData.data);\n quotes.push(parsedData.data);\n } else {\n onDone();\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n onError(error);\n } else {\n onError(new Error('An unknown error occurred during the quote stream.', { cause: error }));\n }\n\n onDone();\n }\n\n return quotes;\n}\n\nexport interface MarkrGetSwapParams {\n appId: string;\n /** Input amount in token's smallest unit */\n amountIn: string;\n /** Return raw transaction data alongside wrapped data */\n debug?: boolean;\n /** Minimum expected output amount */\n minAmountOut: string;\n /** Input token contract address */\n tokenIn: string;\n /** Output token contract address */\n tokenOut: string;\n /** Solana wallet public key (required for Solana swaps) */\n userPublicKey?: string;\n /** Quote UUID from previous quote request */\n uuid: string;\n}\n\nexport async function markrSwap(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrGetSwapParams,\n): Promise<SwapResponse> {\n const endpoint = '/swap';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n });\n\n const parsed = SwapResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetPartnerInfo({\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n}: ApiOptions): Promise<PartnerInfoResponse> {\n const endpoint = '/info/partner';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = PartnerInfoResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\nexport async function markrGetCrossChainStatus(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n sourceTxHash: string,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<CrossChainStatusResponse> {\n const endpoint = `/cross-chain/status/${sourceTxHash}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, {\n headers: getAuthHeaders(apiToken),\n fetch: customFetch,\n retries: 10,\n retryOn(ctx) {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!['GET', 'HEAD', 'OPTIONS', 'TRACE'].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 // Retry on 404 requests since the endpoint may not return a result immediately after the source transaction is executed.\n if (status === 404 || status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n },\n signal,\n });\n\n const parsed = CrossChainStatusResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(\n `Invalid response from Markr \"${endpoint}\" endpoint.`,\n parsed.error.issues,\n rawJson,\n );\n }\n\n return parsed.data;\n}\n\n/**\n * Returns the spender address (wrapped contract) that needs to be approved\n * for token swaps on the specified chain.\n *\n * Not applicable for Solana.\n */\nexport async function markrGetSpenderAddress(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n {\n chainId,\n crossChainSwap,\n quoteId,\n }: {\n chainId: number;\n crossChainSwap?: boolean;\n quoteId: string;\n },\n): Promise<SpenderAddressResponse> {\n const endpoint = `/spender-address?chainId=${chainId}&cross=${crossChainSwap ? 'true' : 'false'}&uuid=${quoteId}`;\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n const rawJson = await fetchJson(url, { headers: getAuthHeaders(apiToken), fetch: customFetch });\n\n const parsed = SpenderAddressResponseSchema.safeParse(rawJson);\n\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n\n return parsed.data;\n}\n\n// ---------------------------------------------------------------------------\n// Hyperliquid 2-phase withdrawal: nonce-mapping authorize\n// ---------------------------------------------------------------------------\n\n/**\n * Legacy (`protocolVersion: 1`) authorize body — Markr rebuilds the upstream\n * Relay request from a fixed schema. Kept for back-compat; new integrations\n * should use {@link MarkrPostAuthorizeParamsV2}.\n *\n * **Caveat:** when Relay adds a required field (as it did with `depositor` in\n * v2), the rebuilt body silently omits it and the order is orphaned upstream.\n */\nexport interface MarkrPostAuthorizeParamsV1 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over the `RelayNonceMapping` typed data (`0x{r}{s}{v}`, 65 bytes hex). */\n readonly signature: `0x${string}`;\n /** EVM address of the signer. */\n readonly wallet: EvmAddress;\n /** Always `1337` (Hyperliquid). */\n readonly walletChainId: 1337;\n /** EIP-712 domain.chainId used in the signature — the wallet's active chain. */\n readonly signatureChainId: number;\n /**\n * Shared nonce — JSON number, matching Relay's upstream `/authorize` contract\n * and HL `/exchange`. HL nonces are millisecond timestamps, well under\n * `Number.MAX_SAFE_INTEGER`. Sending it as a string makes Relay reject the\n * payload (strict type validation), so we coerce here at the wire boundary.\n */\n readonly nonce: number;\n /** Relay request id (`0x{64hex}`). */\n readonly id: `0x${string}`;\n}\n\n/**\n * Pass-through (`protocolVersion: 2`) authorize body. The SDK forwards Relay's\n * `authorize.body` envelope from the `/swap` response **verbatim**. Markr only\n * normalizes `nonce` to a JSON number and defaults `referrer`; every other\n * field is untouched, so additive Relay schema changes don't break SDKs.\n */\nexport interface MarkrPostAuthorizeParamsV2 {\n /** Quote uuid — lets Markr correlate the authorize call with the cached Relay step. */\n readonly uuid: string;\n /** User's EIP-712 signature over `swap.sign.value` using `swap.sign.domain` / `swap.sign.types`. */\n readonly signature: `0x${string}`;\n /** Relay's `/authorize` POST body, taken from `swap.authorize.body`. Forwarded verbatim. */\n readonly body: Record<string, unknown>;\n}\n\nexport type MarkrPostAuthorizeParams = MarkrPostAuthorizeParamsV1 | MarkrPostAuthorizeParamsV2;\n\n/**\n * Submit the user's signed nonce-mapping to Markr's `/authorize` endpoint.\n *\n * Markr proxies the request to Relay's upstream `/authorize`. Returns on any\n * 2xx; throws `HttpError` otherwise.\n */\nexport async function markrPostAuthorize(\n { apiBaseUrl, apiToken, fetch: customFetch }: ApiOptions,\n params: MarkrPostAuthorizeParams,\n { signal }: { signal?: AbortSignal } = {},\n): Promise<void> {\n const endpoint = '/authorize';\n const url = combineUrlPathnames(apiBaseUrl, endpoint);\n\n // `fetchJson` throws `HttpError` on non-2xx; the schema additionally rejects\n // upstream error envelopes that come back with a 200 (Relay sometimes does\n // this when authorize is rejected after HTTP success).\n const rawJson = await fetchJson(url, {\n body: JSON.stringify(params),\n fetch: customFetch,\n headers: getAuthHeaders(apiToken),\n method: 'POST',\n signal,\n });\n\n const parsed = MarkrAuthorizeResponseSchema.safeParse(rawJson);\n if (!parsed.success) {\n throw new ResponseValidationError(`Invalid response from Markr \"${endpoint}\" endpoint.`, parsed.error.issues);\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../../../utils/solana.cjs`);let u=require(`viem`),d=require(`@solana/kit`);function f(t){return async(n,i)=>{if(r.isEvmNamespace(n.sourceChain.chainId))return await p(n,i,t);if(r.isSolanaNamespace(n.sourceChain.chainId))return await m(n,i,t);throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${n.sourceChain.chainId}`)}}async function p(r,l,{apiOptions:d,appId:f}){if(!(0,u.isAddress)(r.fromAddress))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${r.fromAddress}`);let p=n.getEvmClientForChain({chain:r.sourceChain}),m=s.assetToAddressString(r.assetIn,r.sourceChain.chainId);if(!(0,u.isAddress)(m))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let g=s.isTokenAddressNative(m),_=r.sourceChain.chainId.toLowerCase()!==r.targetChain.chainId.toLowerCase(),v=r.amountIn+s.getAdditiveSourceAssetFeeAmount(r),y=0n;if(!g){let n,{address:i}=await o.markrGetSpenderAddress(d,{chainId:t.caip2ToEip155ChainId(r.sourceChain.chainId),crossChainSwap:_,quoteId:r.id});try{n=await p.readContract({address:m,abi:u.erc20Abi,functionName:`allowance`,args:[r.fromAddress,i]})}catch(t){throw new e.SdkError(`Error during allowance check`,e.ErrorCode.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}n<v&&(y=await a.estimateGasWithRevert(p,{account:r.fromAddress,to:m,data:(0,u.encodeFunctionData)({abi:u.erc20Abi,functionName:`approve`,args:[i,v]})},u.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`))}let b=y>0n,x=s.calculateMarkrMinimumAmountOut({amountOut:r.amountOut,assetOut:r.assetOut,slippageBps:r.slippageBps}),S=await o.markrSwap(d,{amountIn:r.amountIn.toString(),appId:f,minAmountOut:x.toString(),tokenIn:m,tokenOut:s.assetToAddressString(r.assetOut,r.targetChain.chainId),uuid:r.id});if(!c.isEvmSwapResponse(S))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${S.chainType}.`});let C=0n;C=b?r.gasEstimate?r.gasEstimate:r.fees.filter(e=>e.type===`gas`&&e.chainId===r.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await h({crossChain:_,fromAddress:r.fromAddress,sourceClient:p,swap:S});let w=await i.estimateEvmFeesPerGas(p,r.sourceChain,l?.overrides?.feeRateTier),T=l?.overrides?.maxFeePerGas??w.maxFeePerGas,E=l?.overrides?.maxPriorityFeePerGas??w.maxPriorityFeePerGas,D=(C+y)*T;return{asset:r.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(D,l?.feeUnitsMarginBps),totalFeeWithoutMargin:D,meta:{approvalFee:b?y*T:void 0,maxFeePerGas:T,maxPriorityFeePerGas:E}}}async function m(t,r,{apiOptions:i,appId:a}){let u=s.assetToAddressString(t.assetIn,t.sourceChain.chainId);if(!(0,d.isAddress)(u))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let f=s.getAdditiveSourceNativeAssetFeeAmount(t),p=t.amountIn+f,m=s.calculateMarkrMinimumAmountOut({amountOut:t.amountOut,assetOut:t.assetOut,slippageBps:t.slippageBps}),h=await o.markrSwap(i,{amountIn:t.amountIn.toString(),appId:a,minAmountOut:m.toString(),tokenIn:u,tokenOut:s.assetToAddressString(t.assetOut,t.targetChain.chainId),userPublicKey:t.fromAddress,uuid:t.id});if(!c.isSolanaSwapResponse(h))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:g,priorityFeeLamports:_,...v}=await l.estimateSolanaFee(n.getSolanaRpcForChain({chain:t.sourceChain}),h.swapTransaction),y=v.feePayerBalanceDiffLamports-p;return{asset:t.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(y,r?.feeUnitsMarginBps),totalFeeWithoutMargin:y,meta:{...v,baseFee:g,priorityFee:_}}}async function h({crossChain:e,feeUnitsMarginBps:t,fromAddress:r,sourceClient:i,swap:o}){let c=await s.getMarkrSwapWrapperAbi(e);return n.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(i,{account:r,to:o.to,data:o.data,value:o.value},c,`Failed to estimate gas for Markr swap transaction.`),t)}exports._estimateGasFromSwapResponse=h,exports.estimateNativeFeeFactory=f;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../../../utils/solana.cjs`);let u=require(`viem`),d=require(`@solana/kit`);function f(t){return async(n,i)=>{if(r.isEvmNamespace(n.sourceChain.chainId))return await p(n,i,t);if(r.isSolanaNamespace(n.sourceChain.chainId))return await m(n,i,t);throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${n.sourceChain.chainId}`)}}async function p(r,l,{apiOptions:d,appId:f}){if(!(0,u.isAddress)(r.fromAddress))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${r.fromAddress}`);let p=n.getEvmClientForChain({chain:r.sourceChain}),m=s.assetToAddressString(r.assetIn,r.sourceChain.chainId);if(!(0,u.isAddress)(m))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let g=s.isTokenAddressNative(m),_=r.sourceChain.chainId.toLowerCase()!==r.targetChain.chainId.toLowerCase(),v=r.amountIn+s.getAdditiveSourceAssetFeeAmount(r),y=0n;if(!g){let n,{address:i}=await o.markrGetSpenderAddress(d,{chainId:t.caip2ToEip155ChainId(r.sourceChain.chainId),crossChainSwap:_,quoteId:r.id});try{n=await p.readContract({address:m,abi:u.erc20Abi,functionName:`allowance`,args:[r.fromAddress,i]})}catch(t){throw new e.SdkError(`Error during allowance check`,e.ErrorCode.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}n<v&&(y=await a.estimateGasWithRevert(p,{account:r.fromAddress,to:m,data:(0,u.encodeFunctionData)({abi:u.erc20Abi,functionName:`approve`,args:[i,v]})},u.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`))}let b=y>0n,x=s.calculateMarkrMinimumAmountOut({amountOut:r.amountOut,assetOut:r.assetOut,slippageBps:r.slippageBps}),S=await o.markrSwap(d,{amountIn:r.amountIn.toString(),appId:f,minAmountOut:x.toString(),tokenIn:m,tokenOut:s.assetToAddressString(r.assetOut,r.targetChain.chainId),uuid:r.id});if(!c.isEvmSwapResponse(S)){let t=c.isSolanaSwapResponse(S)?S.chainType:c.isHyperliquidWithdrawSwapResponse(S)?S.type:`unknown`;throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response variant "${t}".`})}let C=0n;C=b?r.gasEstimate?r.gasEstimate:r.fees.filter(e=>e.type===`gas`&&e.chainId===r.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await h({crossChain:_,fromAddress:r.fromAddress,sourceClient:p,swap:S});let w=await i.estimateEvmFeesPerGas(p,r.sourceChain,l?.overrides?.feeRateTier),T=l?.overrides?.maxFeePerGas??w.maxFeePerGas,E=l?.overrides?.maxPriorityFeePerGas??w.maxPriorityFeePerGas,D=(C+y)*T;return{asset:r.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(D,l?.feeUnitsMarginBps),totalFeeWithoutMargin:D,meta:{approvalFee:b?y*T:void 0,maxFeePerGas:T,maxPriorityFeePerGas:E}}}async function m(t,r,{apiOptions:i,appId:a}){let u=s.assetToAddressString(t.assetIn,t.sourceChain.chainId);if(!(0,d.isAddress)(u))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let f=s.getAdditiveSourceNativeAssetFeeAmount(t),p=t.amountIn+f,m=s.calculateMarkrMinimumAmountOut({amountOut:t.amountOut,assetOut:t.assetOut,slippageBps:t.slippageBps}),h=await o.markrSwap(i,{amountIn:t.amountIn.toString(),appId:a,minAmountOut:m.toString(),tokenIn:u,tokenOut:s.assetToAddressString(t.assetOut,t.targetChain.chainId),userPublicKey:t.fromAddress,uuid:t.id});if(!c.isSolanaSwapResponse(h))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:g,priorityFeeLamports:_,...v}=await l.estimateSolanaFee(n.getSolanaRpcForChain({chain:t.sourceChain}),h.swapTransaction),y=v.feePayerBalanceDiffLamports-p;return{asset:t.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(y,r?.feeUnitsMarginBps),totalFeeWithoutMargin:y,meta:{...v,baseFee:g,priorityFee:_}}}async function h({crossChain:e,feeUnitsMarginBps:t,fromAddress:r,sourceClient:i,swap:o}){let c=await s.getMarkrSwapWrapperAbi(e);return n.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(i,{account:r,to:o.to,data:o.data,value:o.value},c,`Failed to estimate gas for Markr swap transaction.`),t)}exports._estimateGasFromSwapResponse=h,exports.estimateNativeFeeFactory=f;
2
2
  //# sourceMappingURL=estimate-native-fee.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"estimate-native-fee.cjs","names":["isEvmNamespace","isSolanaNamespace","InvalidParamsError","ErrorReason","getEvmClientForChain","assetToAddressString","SdkError","ErrorCode","isTokenAddressNative","getAdditiveSourceAssetFeeAmount","markrGetSpenderAddress","caip2ToEip155ChainId","erc20Abi","estimateGasWithRevert","calculateMarkrMinimumAmountOut","markrSwap","isEvmSwapResponse","estimateEvmFeesPerGas","applyFeeUnitsBpsMargin","getAdditiveSourceNativeAssetFeeAmount","isSolanaSwapResponse","estimateSolanaFee","getSolanaRpcForChain","getMarkrSwapWrapperAbi"],"sources":["../../../../src/transfer-service/markr/_handlers/estimate-native-fee.ts"],"sourcesContent":["import { isAddress as isSolanaAddress } from '@solana/kit';\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress, isAddress as isEvmAddress } from 'viem';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { EstimateNativeFeeOptions, NativeFeeEstimate, TransferService } from '../../../types/service';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, getSolanaRpcForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n getAdditiveSourceAssetFeeAmount,\n getAdditiveSourceNativeAssetFeeAmount,\n getMarkrSwapWrapperAbi,\n isTokenAddressNative,\n} from '../_utils';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { estimateSolanaFee } from '../../../utils/solana';\n\n/**\n * This is just a fallback value used in the case that an\n * allowance approval is needed, and Markr didn't return us any gas estimate data.\n *\n * Just based on my review of some quotes, I think this is a reasonable estimate\n * left on the higher end.\n *\n * Assume this could need to change.\n */\nconst EVM_SWAP_FALLBACK_GAS_ESTIMATE = 700_000n;\n\nexport interface EstimateNativeFeeFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n}\n\nexport function estimateNativeFeeFactory(config: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n return async (quote, options) => {\n // Either the source chain is EVM or Solana, we need to call different functions that\n // calculate the native fee depending on the chain kind.\n\n if (isEvmNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeEvm(quote, options, config);\n }\n\n if (isSolanaNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeSolana(quote, options, config);\n }\n\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Unsupported source chain namespace for estimateNativeFee: ${quote.sourceChain.chainId}`,\n );\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeEvm(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n if (!isEvmAddress(quote.fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${quote.fromAddress}`);\n }\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isEvmAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid EVM address. Can not call estimateGas.`,\n });\n }\n\n const isAssetInNative = isTokenAddressNative(assetInAddressString);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n const allowanceAmount = quote.amountIn + getAdditiveSourceAssetFeeAmount(quote);\n\n let allowanceApprovalGas = 0n;\n if (!isAssetInNative) {\n // Check if approval is needed, and if so, calculate the gas cost for the approval.\n let allowance: bigint;\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n try {\n allowance = await sourceClient.readContract({\n address: assetInAddressString,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [quote.fromAddress, spenderAddress],\n });\n } catch (error) {\n throw new SdkError('Error during allowance check', ErrorCode.VIEM_ERROR, {\n cause: error,\n details: 'Failed to read ERC20 allowance for Markr spender.',\n });\n }\n\n const approvalNeeded = allowance < allowanceAmount;\n\n if (approvalNeeded) {\n allowanceApprovalGas = await estimateGasWithRevert(\n sourceClient,\n {\n account: quote.fromAddress,\n to: assetInAddressString,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, allowanceAmount],\n }),\n },\n erc20Abi,\n 'Failed to estimate gas for ERC20 approval transaction.',\n );\n }\n }\n\n const allowanceApprovalIsNeeded = allowanceApprovalGas > 0n;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${swap.chainType}.`,\n });\n }\n\n let gas = 0n;\n\n // If an approval is needed, we can't call `eth_estimateGas` on the\n // swap transaction because no actual allowance approval was performed yet,\n // so a gas estimation would fail due to needing allowance.\n //\n // So if an allowance approval is needed, we fall back to some other logic for\n // estimating the swap tx gas.\n if (allowanceApprovalIsNeeded) {\n // Attempt to use the Markr provided `gasEstimate` first if available.\n // Otherwise we attempt to get the gas from the `fees` component that are applicable\n // to the source chain. If neither of those are available, we fall back to a hardcoded value.\n if (quote.gasEstimate) {\n gas = quote.gasEstimate;\n } else {\n const sourceGasFee = quote.fees\n .filter((fee) => fee.type === 'gas' && fee.chainId === quote.sourceChain.chainId)\n .reduce((acc, fee) => acc + fee.amount, 0n);\n\n gas = sourceGasFee || EVM_SWAP_FALLBACK_GAS_ESTIMATE;\n }\n } else {\n gas = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress: quote.fromAddress,\n sourceClient,\n swap,\n });\n }\n\n const fees = await estimateEvmFeesPerGas(sourceClient, quote.sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFeeWithoutMargin = (gas + allowanceApprovalGas) * maxFeePerGas;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n approvalFee: allowanceApprovalIsNeeded ? allowanceApprovalGas * maxFeePerGas : undefined,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeSolana(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isSolanaAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid Solana address. Can not call estimateGas.`,\n });\n }\n\n const additiveNativeFee: bigint = getAdditiveSourceNativeAssetFeeAmount(quote);\n const totalInput: bigint = quote.amountIn + additiveNativeFee;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.',\n });\n }\n\n const rpc = getSolanaRpcForChain({ chain: quote.sourceChain });\n\n const { baseFeeLamports, priorityFeeLamports, ...rest } = await estimateSolanaFee(rpc, swap.swapTransaction);\n\n const totalFeeWithoutMargin = rest.feePayerBalanceDiffLamports - totalInput;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n ...rest,\n baseFee: baseFeeLamports,\n priorityFee: priorityFeeLamports,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateGasFromSwapResponse({\n crossChain,\n feeUnitsMarginBps,\n fromAddress,\n sourceClient,\n swap,\n}: {\n crossChain: boolean;\n feeUnitsMarginBps?: number;\n fromAddress: EvmAddress;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n swap: WrappedSwapTransactionResponse;\n}): Promise<bigint> {\n const markrAbi = await getMarkrSwapWrapperAbi(crossChain);\n\n // Use raw estimateGas — the calldata is pre-encoded and may target any\n // contract (Markr wrapper, deBridge, etc.). The ABI is only used for\n // best-effort error decoding on the failure path.\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n {\n account: fromAddress,\n to: swap.to,\n data: swap.data,\n value: swap.value,\n },\n markrAbi,\n 'Failed to estimate gas for Markr swap transaction.',\n );\n\n return applyFeeUnitsBpsMargin(gasEstimate, feeUnitsMarginBps);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"estimate-native-fee.cjs","names":["isEvmNamespace","isSolanaNamespace","InvalidParamsError","ErrorReason","getEvmClientForChain","assetToAddressString","SdkError","ErrorCode","isTokenAddressNative","getAdditiveSourceAssetFeeAmount","markrGetSpenderAddress","caip2ToEip155ChainId","erc20Abi","estimateGasWithRevert","calculateMarkrMinimumAmountOut","markrSwap","isEvmSwapResponse","isSolanaSwapResponse","isHyperliquidWithdrawSwapResponse","estimateEvmFeesPerGas","applyFeeUnitsBpsMargin","getAdditiveSourceNativeAssetFeeAmount","estimateSolanaFee","getSolanaRpcForChain","getMarkrSwapWrapperAbi"],"sources":["../../../../src/transfer-service/markr/_handlers/estimate-native-fee.ts"],"sourcesContent":["import { isAddress as isSolanaAddress } from '@solana/kit';\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress, isAddress as isEvmAddress } from 'viem';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { EstimateNativeFeeOptions, NativeFeeEstimate, TransferService } from '../../../types/service';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, getSolanaRpcForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n getAdditiveSourceAssetFeeAmount,\n getAdditiveSourceNativeAssetFeeAmount,\n getMarkrSwapWrapperAbi,\n isTokenAddressNative,\n} from '../_utils';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { isEvmSwapResponse, isHyperliquidWithdrawSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { estimateSolanaFee } from '../../../utils/solana';\n\n/**\n * This is just a fallback value used in the case that an\n * allowance approval is needed, and Markr didn't return us any gas estimate data.\n *\n * Just based on my review of some quotes, I think this is a reasonable estimate\n * left on the higher end.\n *\n * Assume this could need to change.\n */\nconst EVM_SWAP_FALLBACK_GAS_ESTIMATE = 700_000n;\n\nexport interface EstimateNativeFeeFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n}\n\nexport function estimateNativeFeeFactory(config: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n return async (quote, options) => {\n // Either the source chain is EVM or Solana, we need to call different functions that\n // calculate the native fee depending on the chain kind.\n\n if (isEvmNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeEvm(quote, options, config);\n }\n\n if (isSolanaNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeSolana(quote, options, config);\n }\n\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Unsupported source chain namespace for estimateNativeFee: ${quote.sourceChain.chainId}`,\n );\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeEvm(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n if (!isEvmAddress(quote.fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${quote.fromAddress}`);\n }\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isEvmAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid EVM address. Can not call estimateGas.`,\n });\n }\n\n const isAssetInNative = isTokenAddressNative(assetInAddressString);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n const allowanceAmount = quote.amountIn + getAdditiveSourceAssetFeeAmount(quote);\n\n let allowanceApprovalGas = 0n;\n if (!isAssetInNative) {\n // Check if approval is needed, and if so, calculate the gas cost for the approval.\n let allowance: bigint;\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n try {\n allowance = await sourceClient.readContract({\n address: assetInAddressString,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [quote.fromAddress, spenderAddress],\n });\n } catch (error) {\n throw new SdkError('Error during allowance check', ErrorCode.VIEM_ERROR, {\n cause: error,\n details: 'Failed to read ERC20 allowance for Markr spender.',\n });\n }\n\n const approvalNeeded = allowance < allowanceAmount;\n\n if (approvalNeeded) {\n allowanceApprovalGas = await estimateGasWithRevert(\n sourceClient,\n {\n account: quote.fromAddress,\n to: assetInAddressString,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, allowanceAmount],\n }),\n },\n erc20Abi,\n 'Failed to estimate gas for ERC20 approval transaction.',\n );\n }\n }\n\n const allowanceApprovalIsNeeded = allowanceApprovalGas > 0n;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n // Should hopefully never happen.\n const variantTag = isSolanaSwapResponse(swap)\n ? swap.chainType\n : isHyperliquidWithdrawSwapResponse(swap)\n ? swap.type\n : 'unknown';\n\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response variant \"${variantTag}\".`,\n });\n }\n\n let gas = 0n;\n\n // If an approval is needed, we can't call `eth_estimateGas` on the\n // swap transaction because no actual allowance approval was performed yet,\n // so a gas estimation would fail due to needing allowance.\n //\n // So if an allowance approval is needed, we fall back to some other logic for\n // estimating the swap tx gas.\n if (allowanceApprovalIsNeeded) {\n // Attempt to use the Markr provided `gasEstimate` first if available.\n // Otherwise we attempt to get the gas from the `fees` component that are applicable\n // to the source chain. If neither of those are available, we fall back to a hardcoded value.\n if (quote.gasEstimate) {\n gas = quote.gasEstimate;\n } else {\n const sourceGasFee = quote.fees\n .filter((fee) => fee.type === 'gas' && fee.chainId === quote.sourceChain.chainId)\n .reduce((acc, fee) => acc + fee.amount, 0n);\n\n gas = sourceGasFee || EVM_SWAP_FALLBACK_GAS_ESTIMATE;\n }\n } else {\n gas = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress: quote.fromAddress,\n sourceClient,\n swap,\n });\n }\n\n const fees = await estimateEvmFeesPerGas(sourceClient, quote.sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFeeWithoutMargin = (gas + allowanceApprovalGas) * maxFeePerGas;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n approvalFee: allowanceApprovalIsNeeded ? allowanceApprovalGas * maxFeePerGas : undefined,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeSolana(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isSolanaAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid Solana address. Can not call estimateGas.`,\n });\n }\n\n const additiveNativeFee: bigint = getAdditiveSourceNativeAssetFeeAmount(quote);\n const totalInput: bigint = quote.amountIn + additiveNativeFee;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.',\n });\n }\n\n const rpc = getSolanaRpcForChain({ chain: quote.sourceChain });\n\n const { baseFeeLamports, priorityFeeLamports, ...rest } = await estimateSolanaFee(rpc, swap.swapTransaction);\n\n const totalFeeWithoutMargin = rest.feePayerBalanceDiffLamports - totalInput;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n ...rest,\n baseFee: baseFeeLamports,\n priorityFee: priorityFeeLamports,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateGasFromSwapResponse({\n crossChain,\n feeUnitsMarginBps,\n fromAddress,\n sourceClient,\n swap,\n}: {\n crossChain: boolean;\n feeUnitsMarginBps?: number;\n fromAddress: EvmAddress;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n swap: WrappedSwapTransactionResponse;\n}): Promise<bigint> {\n const markrAbi = await getMarkrSwapWrapperAbi(crossChain);\n\n // Use raw estimateGas — the calldata is pre-encoded and may target any\n // contract (Markr wrapper, deBridge, etc.). The ABI is only used for\n // best-effort error decoding on the failure path.\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n {\n account: fromAddress,\n to: swap.to,\n data: swap.data,\n value: swap.value,\n },\n markrAbi,\n 'Failed to estimate gas for Markr swap transaction.',\n );\n\n return applyFeeUnitsBpsMargin(gasEstimate, feeUnitsMarginBps);\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e,ErrorReason as t,InvalidParamsError as n,SdkError as r}from"../../../errors.js";import{caip2ToEip155ChainId as i}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as a,getEvmClientForChain as o,getSolanaRpcForChain as s}from"../../_utils.js";import{isEvmNamespace as c,isSolanaNamespace as l}from"../../../_utils/chain.js";import{estimateEvmFeesPerGas as u}from"../../_evm-gas.js";import{estimateGasWithRevert as d}from"../../_evm-errors.js";import{markrGetSpenderAddress as f,markrSwap as p}from"../_api.js";import{assetToAddressString as m,calculateMarkrMinimumAmountOut as h,getAdditiveSourceAssetFeeAmount as g,getAdditiveSourceNativeAssetFeeAmount as _,getMarkrSwapWrapperAbi as v,isTokenAddressNative as y}from"../_utils.js";import{isEvmSwapResponse as b,isSolanaSwapResponse as x}from"../_type-guards.js";import{estimateSolanaFee as S}from"../../../utils/solana.js";import{encodeFunctionData as C,erc20Abi as w,isAddress as T}from"viem";import{isAddress as E}from"@solana/kit";function D(e){return async(r,i)=>{if(c(r.sourceChain.chainId))return await O(r,i,e);if(l(r.sourceChain.chainId))return await k(r,i,e);throw new n(t.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${r.sourceChain.chainId}`)}}async function O(s,c,{apiOptions:l,appId:_}){if(!T(s.fromAddress))throw new n(t.INVALID_PARAMS,`Invalid fromAddress: ${s.fromAddress}`);let v=o({chain:s.sourceChain}),x=m(s.assetIn,s.sourceChain.chainId);if(!T(x))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let S=y(x),E=s.sourceChain.chainId.toLowerCase()!==s.targetChain.chainId.toLowerCase(),D=s.amountIn+g(s),O=0n;if(!S){let t,{address:n}=await f(l,{chainId:i(s.sourceChain.chainId),crossChainSwap:E,quoteId:s.id});try{t=await v.readContract({address:x,abi:w,functionName:`allowance`,args:[s.fromAddress,n]})}catch(t){throw new r(`Error during allowance check`,e.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}t<D&&(O=await d(v,{account:s.fromAddress,to:x,data:C({abi:w,functionName:`approve`,args:[n,D]})},w,`Failed to estimate gas for ERC20 approval transaction.`))}let k=O>0n,j=h({amountOut:s.amountOut,assetOut:s.assetOut,slippageBps:s.slippageBps}),M=await p(l,{amountIn:s.amountIn.toString(),appId:_,minAmountOut:j.toString(),tokenIn:x,tokenOut:m(s.assetOut,s.targetChain.chainId),uuid:s.id});if(!b(M))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${M.chainType}.`});let N=0n;N=k?s.gasEstimate?s.gasEstimate:s.fees.filter(e=>e.type===`gas`&&e.chainId===s.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await A({crossChain:E,fromAddress:s.fromAddress,sourceClient:v,swap:M});let P=await u(v,s.sourceChain,c?.overrides?.feeRateTier),F=c?.overrides?.maxFeePerGas??P.maxFeePerGas,I=c?.overrides?.maxPriorityFeePerGas??P.maxPriorityFeePerGas,L=(N+O)*F;return{asset:s.sourceChain.networkToken,totalFee:a(L,c?.feeUnitsMarginBps),totalFeeWithoutMargin:L,meta:{approvalFee:k?O*F:void 0,maxFeePerGas:F,maxPriorityFeePerGas:I}}}async function k(n,i,{apiOptions:o,appId:c}){let l=m(n.assetIn,n.sourceChain.chainId);if(!E(l))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let u=_(n),d=n.amountIn+u,f=h({amountOut:n.amountOut,assetOut:n.assetOut,slippageBps:n.slippageBps}),g=await p(o,{amountIn:n.amountIn.toString(),appId:c,minAmountOut:f.toString(),tokenIn:l,tokenOut:m(n.assetOut,n.targetChain.chainId),userPublicKey:n.fromAddress,uuid:n.id});if(!x(g))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:v,priorityFeeLamports:y,...b}=await S(s({chain:n.sourceChain}),g.swapTransaction),C=b.feePayerBalanceDiffLamports-d;return{asset:n.sourceChain.networkToken,totalFee:a(C,i?.feeUnitsMarginBps),totalFeeWithoutMargin:C,meta:{...b,baseFee:v,priorityFee:y}}}async function A({crossChain:e,feeUnitsMarginBps:t,fromAddress:n,sourceClient:r,swap:i}){let o=await v(e);return a(await d(r,{account:n,to:i.to,data:i.data,value:i.value},o,`Failed to estimate gas for Markr swap transaction.`),t)}export{A as _estimateGasFromSwapResponse,D as estimateNativeFeeFactory};
1
+ import{ErrorCode as e,ErrorReason as t,InvalidParamsError as n,SdkError as r}from"../../../errors.js";import{caip2ToEip155ChainId as i}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as a,getEvmClientForChain as o,getSolanaRpcForChain as s}from"../../_utils.js";import{isEvmNamespace as c,isSolanaNamespace as l}from"../../../_utils/chain.js";import{estimateEvmFeesPerGas as u}from"../../_evm-gas.js";import{estimateGasWithRevert as d}from"../../_evm-errors.js";import{markrGetSpenderAddress as f,markrSwap as p}from"../_api.js";import{assetToAddressString as m,calculateMarkrMinimumAmountOut as h,getAdditiveSourceAssetFeeAmount as g,getAdditiveSourceNativeAssetFeeAmount as _,getMarkrSwapWrapperAbi as v,isTokenAddressNative as y}from"../_utils.js";import{isEvmSwapResponse as b,isHyperliquidWithdrawSwapResponse as x,isSolanaSwapResponse as S}from"../_type-guards.js";import{estimateSolanaFee as C}from"../../../utils/solana.js";import{encodeFunctionData as w,erc20Abi as T,isAddress as E}from"viem";import{isAddress as D}from"@solana/kit";function O(e){return async(r,i)=>{if(c(r.sourceChain.chainId))return await k(r,i,e);if(l(r.sourceChain.chainId))return await A(r,i,e);throw new n(t.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${r.sourceChain.chainId}`)}}async function k(s,c,{apiOptions:l,appId:_}){if(!E(s.fromAddress))throw new n(t.INVALID_PARAMS,`Invalid fromAddress: ${s.fromAddress}`);let v=o({chain:s.sourceChain}),C=m(s.assetIn,s.sourceChain.chainId);if(!E(C))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let D=y(C),O=s.sourceChain.chainId.toLowerCase()!==s.targetChain.chainId.toLowerCase(),k=s.amountIn+g(s),A=0n;if(!D){let t,{address:n}=await f(l,{chainId:i(s.sourceChain.chainId),crossChainSwap:O,quoteId:s.id});try{t=await v.readContract({address:C,abi:T,functionName:`allowance`,args:[s.fromAddress,n]})}catch(t){throw new r(`Error during allowance check`,e.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}t<k&&(A=await d(v,{account:s.fromAddress,to:C,data:w({abi:T,functionName:`approve`,args:[n,k]})},T,`Failed to estimate gas for ERC20 approval transaction.`))}let M=A>0n,N=h({amountOut:s.amountOut,assetOut:s.assetOut,slippageBps:s.slippageBps}),P=await p(l,{amountIn:s.amountIn.toString(),appId:_,minAmountOut:N.toString(),tokenIn:C,tokenOut:m(s.assetOut,s.targetChain.chainId),uuid:s.id});if(!b(P)){let n=S(P)?P.chainType:x(P)?P.type:`unknown`;throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response variant "${n}".`})}let F=0n;F=M?s.gasEstimate?s.gasEstimate:s.fees.filter(e=>e.type===`gas`&&e.chainId===s.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await j({crossChain:O,fromAddress:s.fromAddress,sourceClient:v,swap:P});let I=await u(v,s.sourceChain,c?.overrides?.feeRateTier),L=c?.overrides?.maxFeePerGas??I.maxFeePerGas,R=c?.overrides?.maxPriorityFeePerGas??I.maxPriorityFeePerGas,z=(F+A)*L;return{asset:s.sourceChain.networkToken,totalFee:a(z,c?.feeUnitsMarginBps),totalFeeWithoutMargin:z,meta:{approvalFee:M?A*L:void 0,maxFeePerGas:L,maxPriorityFeePerGas:R}}}async function A(n,i,{apiOptions:o,appId:c}){let l=m(n.assetIn,n.sourceChain.chainId);if(!D(l))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let u=_(n),d=n.amountIn+u,f=h({amountOut:n.amountOut,assetOut:n.assetOut,slippageBps:n.slippageBps}),g=await p(o,{amountIn:n.amountIn.toString(),appId:c,minAmountOut:f.toString(),tokenIn:l,tokenOut:m(n.assetOut,n.targetChain.chainId),userPublicKey:n.fromAddress,uuid:n.id});if(!S(g))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:v,priorityFeeLamports:y,...b}=await C(s({chain:n.sourceChain}),g.swapTransaction),x=b.feePayerBalanceDiffLamports-d;return{asset:n.sourceChain.networkToken,totalFee:a(x,i?.feeUnitsMarginBps),totalFeeWithoutMargin:x,meta:{...b,baseFee:v,priorityFee:y}}}async function j({crossChain:e,feeUnitsMarginBps:t,fromAddress:n,sourceClient:r,swap:i}){let o=await v(e);return a(await d(r,{account:n,to:i.to,data:i.data,value:i.value},o,`Failed to estimate gas for Markr swap transaction.`),t)}export{j as _estimateGasFromSwapResponse,O as estimateNativeFeeFactory};
2
2
  //# sourceMappingURL=estimate-native-fee.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"estimate-native-fee.js","names":["isEvmAddress","isSolanaAddress"],"sources":["../../../../src/transfer-service/markr/_handlers/estimate-native-fee.ts"],"sourcesContent":["import { isAddress as isSolanaAddress } from '@solana/kit';\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress, isAddress as isEvmAddress } from 'viem';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { EstimateNativeFeeOptions, NativeFeeEstimate, TransferService } from '../../../types/service';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, getSolanaRpcForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n getAdditiveSourceAssetFeeAmount,\n getAdditiveSourceNativeAssetFeeAmount,\n getMarkrSwapWrapperAbi,\n isTokenAddressNative,\n} from '../_utils';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { estimateSolanaFee } from '../../../utils/solana';\n\n/**\n * This is just a fallback value used in the case that an\n * allowance approval is needed, and Markr didn't return us any gas estimate data.\n *\n * Just based on my review of some quotes, I think this is a reasonable estimate\n * left on the higher end.\n *\n * Assume this could need to change.\n */\nconst EVM_SWAP_FALLBACK_GAS_ESTIMATE = 700_000n;\n\nexport interface EstimateNativeFeeFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n}\n\nexport function estimateNativeFeeFactory(config: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n return async (quote, options) => {\n // Either the source chain is EVM or Solana, we need to call different functions that\n // calculate the native fee depending on the chain kind.\n\n if (isEvmNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeEvm(quote, options, config);\n }\n\n if (isSolanaNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeSolana(quote, options, config);\n }\n\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Unsupported source chain namespace for estimateNativeFee: ${quote.sourceChain.chainId}`,\n );\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeEvm(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n if (!isEvmAddress(quote.fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${quote.fromAddress}`);\n }\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isEvmAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid EVM address. Can not call estimateGas.`,\n });\n }\n\n const isAssetInNative = isTokenAddressNative(assetInAddressString);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n const allowanceAmount = quote.amountIn + getAdditiveSourceAssetFeeAmount(quote);\n\n let allowanceApprovalGas = 0n;\n if (!isAssetInNative) {\n // Check if approval is needed, and if so, calculate the gas cost for the approval.\n let allowance: bigint;\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n try {\n allowance = await sourceClient.readContract({\n address: assetInAddressString,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [quote.fromAddress, spenderAddress],\n });\n } catch (error) {\n throw new SdkError('Error during allowance check', ErrorCode.VIEM_ERROR, {\n cause: error,\n details: 'Failed to read ERC20 allowance for Markr spender.',\n });\n }\n\n const approvalNeeded = allowance < allowanceAmount;\n\n if (approvalNeeded) {\n allowanceApprovalGas = await estimateGasWithRevert(\n sourceClient,\n {\n account: quote.fromAddress,\n to: assetInAddressString,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, allowanceAmount],\n }),\n },\n erc20Abi,\n 'Failed to estimate gas for ERC20 approval transaction.',\n );\n }\n }\n\n const allowanceApprovalIsNeeded = allowanceApprovalGas > 0n;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${swap.chainType}.`,\n });\n }\n\n let gas = 0n;\n\n // If an approval is needed, we can't call `eth_estimateGas` on the\n // swap transaction because no actual allowance approval was performed yet,\n // so a gas estimation would fail due to needing allowance.\n //\n // So if an allowance approval is needed, we fall back to some other logic for\n // estimating the swap tx gas.\n if (allowanceApprovalIsNeeded) {\n // Attempt to use the Markr provided `gasEstimate` first if available.\n // Otherwise we attempt to get the gas from the `fees` component that are applicable\n // to the source chain. If neither of those are available, we fall back to a hardcoded value.\n if (quote.gasEstimate) {\n gas = quote.gasEstimate;\n } else {\n const sourceGasFee = quote.fees\n .filter((fee) => fee.type === 'gas' && fee.chainId === quote.sourceChain.chainId)\n .reduce((acc, fee) => acc + fee.amount, 0n);\n\n gas = sourceGasFee || EVM_SWAP_FALLBACK_GAS_ESTIMATE;\n }\n } else {\n gas = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress: quote.fromAddress,\n sourceClient,\n swap,\n });\n }\n\n const fees = await estimateEvmFeesPerGas(sourceClient, quote.sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFeeWithoutMargin = (gas + allowanceApprovalGas) * maxFeePerGas;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n approvalFee: allowanceApprovalIsNeeded ? allowanceApprovalGas * maxFeePerGas : undefined,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeSolana(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isSolanaAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid Solana address. Can not call estimateGas.`,\n });\n }\n\n const additiveNativeFee: bigint = getAdditiveSourceNativeAssetFeeAmount(quote);\n const totalInput: bigint = quote.amountIn + additiveNativeFee;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.',\n });\n }\n\n const rpc = getSolanaRpcForChain({ chain: quote.sourceChain });\n\n const { baseFeeLamports, priorityFeeLamports, ...rest } = await estimateSolanaFee(rpc, swap.swapTransaction);\n\n const totalFeeWithoutMargin = rest.feePayerBalanceDiffLamports - totalInput;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n ...rest,\n baseFee: baseFeeLamports,\n priorityFee: priorityFeeLamports,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateGasFromSwapResponse({\n crossChain,\n feeUnitsMarginBps,\n fromAddress,\n sourceClient,\n swap,\n}: {\n crossChain: boolean;\n feeUnitsMarginBps?: number;\n fromAddress: EvmAddress;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n swap: WrappedSwapTransactionResponse;\n}): Promise<bigint> {\n const markrAbi = await getMarkrSwapWrapperAbi(crossChain);\n\n // Use raw estimateGas — the calldata is pre-encoded and may target any\n // contract (Markr wrapper, deBridge, etc.). The ABI is only used for\n // best-effort error decoding on the failure path.\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n {\n account: fromAddress,\n to: swap.to,\n data: swap.data,\n value: swap.value,\n },\n markrAbi,\n 'Failed to estimate gas for Markr swap transaction.',\n );\n\n return applyFeeUnitsBpsMargin(gasEstimate, feeUnitsMarginBps);\n}\n"],"mappings":"u/BAuCA,SAAgB,EAAyB,EAA8E,CACrH,OAAO,MAAO,EAAO,IAAY,CAI/B,GAAI,EAAe,EAAM,YAAY,QAAQ,CAC3C,OAAO,MAAM,EAAsB,EAAO,EAAS,EAAO,CAG5D,GAAI,EAAkB,EAAM,YAAY,QAAQ,CAC9C,OAAO,MAAM,EAAyB,EAAO,EAAS,EAAO,CAG/D,MAAM,IAAI,EACR,EAAY,eACZ,6DAA6D,EAAM,YAAY,UAChF,EAKL,eAAsB,EACpB,EACA,EACA,CAAE,aAAY,SACc,CAC5B,GAAI,CAACA,EAAa,EAAM,YAAY,CAClC,MAAM,IAAI,EAAmB,EAAY,eAAgB,wBAAwB,EAAM,cAAc,CAGvG,IAAM,EAAe,EAAqB,CAAE,MAAO,EAAM,YAAa,CAAC,CAEjE,EAAuB,EAAqB,EAAM,QAAS,EAAM,YAAY,QAAQ,CAE3F,GAAI,CAACA,EAAa,EAAqB,CACrC,MAAM,IAAI,EAAS,EAAY,eAAgB,EAAU,eAAgB,CACvE,QAAS,wEACV,CAAC,CAGJ,IAAM,EAAkB,EAAqB,EAAqB,CAC5D,EAAmB,EAAM,YAAY,QAAQ,aAAa,GAAK,EAAM,YAAY,QAAQ,aAAa,CACtG,EAAkB,EAAM,SAAW,EAAgC,EAAM,CAE3E,EAAuB,GAC3B,GAAI,CAAC,EAAiB,CAEpB,IAAI,EAEE,CAAE,QAAS,GAAmB,MAAM,EAAuB,EAAY,CAC3E,QAAS,EAAqB,EAAM,YAAY,QAAQ,CACxD,eAAgB,EAChB,QAAS,EAAM,GAChB,CAAC,CAEF,GAAI,CACF,EAAY,MAAM,EAAa,aAAa,CAC1C,QAAS,EACT,IAAK,EACL,aAAc,YACd,KAAM,CAAC,EAAM,YAAa,EAAe,CAC1C,CAAC,OACK,EAAO,CACd,MAAM,IAAI,EAAS,+BAAgC,EAAU,WAAY,CACvE,MAAO,EACP,QAAS,oDACV,CAAC,CAGmB,EAAY,IAGjC,EAAuB,MAAM,EAC3B,EACA,CACE,QAAS,EAAM,YACf,GAAI,EACJ,KAAM,EAAmB,CACvB,IAAK,EACL,aAAc,UACd,KAAM,CAAC,EAAgB,EAAgB,CACxC,CAAC,CACH,CACD,EACA,yDACD,EAIL,IAAM,EAA4B,EAAuB,GAEnD,EAAe,EAA+B,CAClD,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,YAAa,EAAM,YACpB,CAAC,CAEI,EAAO,MAAM,EAAU,EAAY,CACvC,SAAU,EAAM,SAAS,UAAU,CACnC,QACA,aAAc,EAAa,UAAU,CACrC,QAAS,EACT,SAAU,EAAqB,EAAM,SAAU,EAAM,YAAY,QAAQ,CACzE,KAAM,EAAM,GACb,CAAC,CAEF,GAAI,CAAC,EAAkB,EAAK,CAE1B,MAAM,IAAI,EAAS,EAAY,oBAAqB,EAAU,eAAgB,CAC5E,QAAS,gIAAgI,EAAK,UAAU,GACzJ,CAAC,CAGJ,IAAI,EAAM,GAQV,AAcE,EAdE,EAIE,EAAM,YACF,EAAM,YAES,EAAM,KACxB,OAAQ,GAAQ,EAAI,OAAS,OAAS,EAAI,UAAY,EAAM,YAAY,QAAQ,CAChF,QAAQ,EAAK,IAAQ,EAAM,EAAI,OAAQ,GAAG,EAEvB,QAGlB,MAAM,EAA6B,CACvC,WAAY,EACZ,YAAa,EAAM,YACnB,eACA,OACD,CAAC,CAGJ,IAAM,EAAO,MAAM,EAAsB,EAAc,EAAM,YAAa,GAAS,WAAW,YAAY,CAEpG,EAAe,GAAS,WAAW,cAAgB,EAAK,aACxD,EAAuB,GAAS,WAAW,sBAAwB,EAAK,qBAExE,GAAyB,EAAM,GAAwB,EAE7D,MAAO,CACL,MAAO,EAAM,YAAY,aACzB,SAAU,EAAuB,EAAuB,GAAS,kBAAkB,CACnF,wBACA,KAAM,CACJ,YAAa,EAA4B,EAAuB,EAAe,IAAA,GAC/E,eACA,uBACD,CACF,CAIH,eAAsB,EACpB,EACA,EACA,CAAE,aAAY,SACc,CAC5B,IAAM,EAAuB,EAAqB,EAAM,QAAS,EAAM,YAAY,QAAQ,CAE3F,GAAI,CAACC,EAAgB,EAAqB,CACxC,MAAM,IAAI,EAAS,EAAY,eAAgB,EAAU,eAAgB,CACvE,QAAS,2EACV,CAAC,CAGJ,IAAM,EAA4B,EAAsC,EAAM,CACxE,EAAqB,EAAM,SAAW,EAEtC,EAAe,EAA+B,CAClD,UAAW,EAAM,UACjB,SAAU,EAAM,SAChB,YAAa,EAAM,YACpB,CAAC,CAEI,EAAO,MAAM,EAAU,EAAY,CACvC,SAAU,EAAM,SAAS,UAAU,CACnC,QACA,aAAc,EAAa,UAAU,CACrC,QAAS,EACT,SAAU,EAAqB,EAAM,SAAU,EAAM,YAAY,QAAQ,CACzE,cAAe,EAAM,YACrB,KAAM,EAAM,GACb,CAAC,CAEF,GAAI,CAAC,EAAqB,EAAK,CAE7B,MAAM,IAAI,EAAS,EAAY,oBAAqB,EAAU,eAAgB,CAC5E,QAAS,qGACV,CAAC,CAKJ,GAAM,CAAE,kBAAiB,sBAAqB,GAAG,GAAS,MAAM,EAFpD,EAAqB,CAAE,MAAO,EAAM,YAAa,CAAC,CAEyB,EAAK,gBAAgB,CAEtG,EAAwB,EAAK,4BAA8B,EAEjE,MAAO,CACL,MAAO,EAAM,YAAY,aACzB,SAAU,EAAuB,EAAuB,GAAS,kBAAkB,CACnF,wBACA,KAAM,CACJ,GAAG,EACH,QAAS,EACT,YAAa,EACd,CACF,CAIH,eAAsB,EAA6B,CACjD,aACA,oBACA,cACA,eACA,QAOkB,CAClB,IAAM,EAAW,MAAM,EAAuB,EAAW,CAiBzD,OAAO,EAZa,MAAM,EACxB,EACA,CACE,QAAS,EACT,GAAI,EAAK,GACT,KAAM,EAAK,KACX,MAAO,EAAK,MACb,CACD,EACA,qDACD,CAE0C,EAAkB"}
1
+ {"version":3,"file":"estimate-native-fee.js","names":["isEvmAddress","isSolanaAddress"],"sources":["../../../../src/transfer-service/markr/_handlers/estimate-native-fee.ts"],"sourcesContent":["import { isAddress as isSolanaAddress } from '@solana/kit';\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress, isAddress as isEvmAddress } from 'viem';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { EstimateNativeFeeOptions, NativeFeeEstimate, TransferService } from '../../../types/service';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, getSolanaRpcForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { estimateGasWithRevert } from '../../_evm-errors';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n getAdditiveSourceAssetFeeAmount,\n getAdditiveSourceNativeAssetFeeAmount,\n getMarkrSwapWrapperAbi,\n isTokenAddressNative,\n} from '../_utils';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { isEvmSwapResponse, isHyperliquidWithdrawSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { estimateSolanaFee } from '../../../utils/solana';\n\n/**\n * This is just a fallback value used in the case that an\n * allowance approval is needed, and Markr didn't return us any gas estimate data.\n *\n * Just based on my review of some quotes, I think this is a reasonable estimate\n * left on the higher end.\n *\n * Assume this could need to change.\n */\nconst EVM_SWAP_FALLBACK_GAS_ESTIMATE = 700_000n;\n\nexport interface EstimateNativeFeeFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n}\n\nexport function estimateNativeFeeFactory(config: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n return async (quote, options) => {\n // Either the source chain is EVM or Solana, we need to call different functions that\n // calculate the native fee depending on the chain kind.\n\n if (isEvmNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeEvm(quote, options, config);\n }\n\n if (isSolanaNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeSolana(quote, options, config);\n }\n\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Unsupported source chain namespace for estimateNativeFee: ${quote.sourceChain.chainId}`,\n );\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeEvm(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n if (!isEvmAddress(quote.fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${quote.fromAddress}`);\n }\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isEvmAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid EVM address. Can not call estimateGas.`,\n });\n }\n\n const isAssetInNative = isTokenAddressNative(assetInAddressString);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n const allowanceAmount = quote.amountIn + getAdditiveSourceAssetFeeAmount(quote);\n\n let allowanceApprovalGas = 0n;\n if (!isAssetInNative) {\n // Check if approval is needed, and if so, calculate the gas cost for the approval.\n let allowance: bigint;\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n try {\n allowance = await sourceClient.readContract({\n address: assetInAddressString,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [quote.fromAddress, spenderAddress],\n });\n } catch (error) {\n throw new SdkError('Error during allowance check', ErrorCode.VIEM_ERROR, {\n cause: error,\n details: 'Failed to read ERC20 allowance for Markr spender.',\n });\n }\n\n const approvalNeeded = allowance < allowanceAmount;\n\n if (approvalNeeded) {\n allowanceApprovalGas = await estimateGasWithRevert(\n sourceClient,\n {\n account: quote.fromAddress,\n to: assetInAddressString,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, allowanceAmount],\n }),\n },\n erc20Abi,\n 'Failed to estimate gas for ERC20 approval transaction.',\n );\n }\n }\n\n const allowanceApprovalIsNeeded = allowanceApprovalGas > 0n;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n // Should hopefully never happen.\n const variantTag = isSolanaSwapResponse(swap)\n ? swap.chainType\n : isHyperliquidWithdrawSwapResponse(swap)\n ? swap.type\n : 'unknown';\n\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response variant \"${variantTag}\".`,\n });\n }\n\n let gas = 0n;\n\n // If an approval is needed, we can't call `eth_estimateGas` on the\n // swap transaction because no actual allowance approval was performed yet,\n // so a gas estimation would fail due to needing allowance.\n //\n // So if an allowance approval is needed, we fall back to some other logic for\n // estimating the swap tx gas.\n if (allowanceApprovalIsNeeded) {\n // Attempt to use the Markr provided `gasEstimate` first if available.\n // Otherwise we attempt to get the gas from the `fees` component that are applicable\n // to the source chain. If neither of those are available, we fall back to a hardcoded value.\n if (quote.gasEstimate) {\n gas = quote.gasEstimate;\n } else {\n const sourceGasFee = quote.fees\n .filter((fee) => fee.type === 'gas' && fee.chainId === quote.sourceChain.chainId)\n .reduce((acc, fee) => acc + fee.amount, 0n);\n\n gas = sourceGasFee || EVM_SWAP_FALLBACK_GAS_ESTIMATE;\n }\n } else {\n gas = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress: quote.fromAddress,\n sourceClient,\n swap,\n });\n }\n\n const fees = await estimateEvmFeesPerGas(sourceClient, quote.sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFeeWithoutMargin = (gas + allowanceApprovalGas) * maxFeePerGas;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n approvalFee: allowanceApprovalIsNeeded ? allowanceApprovalGas * maxFeePerGas : undefined,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeSolana(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isSolanaAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid Solana address. Can not call estimateGas.`,\n });\n }\n\n const additiveNativeFee: bigint = getAdditiveSourceNativeAssetFeeAmount(quote);\n const totalInput: bigint = quote.amountIn + additiveNativeFee;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.',\n });\n }\n\n const rpc = getSolanaRpcForChain({ chain: quote.sourceChain });\n\n const { baseFeeLamports, priorityFeeLamports, ...rest } = await estimateSolanaFee(rpc, swap.swapTransaction);\n\n const totalFeeWithoutMargin = rest.feePayerBalanceDiffLamports - totalInput;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: applyFeeUnitsBpsMargin(totalFeeWithoutMargin, options?.feeUnitsMarginBps),\n totalFeeWithoutMargin,\n meta: {\n ...rest,\n baseFee: baseFeeLamports,\n priorityFee: priorityFeeLamports,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateGasFromSwapResponse({\n crossChain,\n feeUnitsMarginBps,\n fromAddress,\n sourceClient,\n swap,\n}: {\n crossChain: boolean;\n feeUnitsMarginBps?: number;\n fromAddress: EvmAddress;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n swap: WrappedSwapTransactionResponse;\n}): Promise<bigint> {\n const markrAbi = await getMarkrSwapWrapperAbi(crossChain);\n\n // Use raw estimateGas — the calldata is pre-encoded and may target any\n // contract (Markr wrapper, deBridge, etc.). The ABI is only used for\n // best-effort error decoding on the failure path.\n const gasEstimate = await estimateGasWithRevert(\n sourceClient,\n {\n account: fromAddress,\n to: swap.to,\n data: swap.data,\n value: swap.value,\n },\n markrAbi,\n 'Failed to estimate gas for Markr swap transaction.',\n );\n\n return applyFeeUnitsBpsMargin(gasEstimate, feeUnitsMarginBps);\n}\n"],"mappings":"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"}