@avalabs/fusion-sdk 0.7.0 → 0.9.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 (69) hide show
  1. package/dist/mod.cjs +1 -1
  2. package/dist/mod.d.cts +2 -2
  3. package/dist/mod.d.ts +2 -2
  4. package/dist/mod.js +1 -1
  5. package/dist/transfer-manager.cjs +1 -1
  6. package/dist/transfer-manager.cjs.map +1 -1
  7. package/dist/transfer-manager.js +1 -1
  8. package/dist/transfer-manager.js.map +1 -1
  9. package/dist/transfer-service/_tracking-utilities.cjs +1 -1
  10. package/dist/transfer-service/_tracking-utilities.cjs.map +1 -1
  11. package/dist/transfer-service/_tracking-utilities.js +1 -1
  12. package/dist/transfer-service/_tracking-utilities.js.map +1 -1
  13. package/dist/transfer-service/_utils.cjs +1 -1
  14. package/dist/transfer-service/_utils.cjs.map +1 -1
  15. package/dist/transfer-service/_utils.js +1 -1
  16. package/dist/transfer-service/_utils.js.map +1 -1
  17. package/dist/transfer-service/_warden-config-schema.cjs.map +1 -1
  18. package/dist/transfer-service/_warden-config-schema.js.map +1 -1
  19. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs +1 -1
  20. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs.map +1 -1
  21. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js +1 -1
  22. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js.map +1 -1
  23. package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs +1 -1
  24. package/dist/transfer-service/avalanche-evm/_utils/get-config.js +1 -1
  25. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs +1 -1
  26. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs.map +1 -1
  27. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js +1 -1
  28. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js.map +1 -1
  29. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +1 -1
  30. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +1 -1
  31. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +1 -1
  32. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -1
  33. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +1 -1
  34. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -1
  35. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +1 -1
  36. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +1 -1
  37. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +1 -1
  38. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -1
  39. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +1 -1
  40. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.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/stream-quotes.cjs +1 -1
  46. package/dist/transfer-service/markr/_handlers/stream-quotes.js +1 -1
  47. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
  48. package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -1
  49. package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
  50. package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -1
  51. package/dist/transfer-service/markr/_schema.cjs +1 -1
  52. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  53. package/dist/transfer-service/markr/_schema.js +1 -1
  54. package/dist/transfer-service/markr/_schema.js.map +1 -1
  55. package/dist/transfer-service/markr/_utils.cjs +1 -1
  56. package/dist/transfer-service/markr/_utils.js +1 -1
  57. package/dist/types/transfer-manager.d.cts +0 -12
  58. package/dist/types/transfer-manager.d.ts +0 -12
  59. package/dist/types/transfer.d.cts +24 -5
  60. package/dist/types/transfer.d.ts +24 -5
  61. package/dist/utils/transfer-utils.cjs +1 -1
  62. package/dist/utils/transfer-utils.cjs.map +1 -1
  63. package/dist/utils/transfer-utils.js +1 -1
  64. package/dist/utils/transfer-utils.js.map +1 -1
  65. package/package.json +3 -3
  66. package/dist/_utils/merge-assets.cjs +0 -2
  67. package/dist/_utils/merge-assets.cjs.map +0 -1
  68. package/dist/_utils/merge-assets.js +0 -2
  69. package/dist/_utils/merge-assets.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"_warden-config-schema.cjs","names":["z","Blockchain","EvmAddressSchema","BtcAddressSchema"],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Unified Asset Transfer service.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
1
+ {"version":3,"file":"_warden-config-schema.cjs","names":["z","Blockchain","EvmAddressSchema","BtcAddressSchema"],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Fusion SDK services.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"_warden-config-schema.js","names":[],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Unified Asset Transfer service.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
1
+ {"version":3,"file":"_warden-config-schema.js","names":[],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Fusion SDK services.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils/transfer-data.cjs`);let r=require(`viem`);function i({config:n}){return({transfer:i,updateListener:s})=>{let c=new AbortController,l=()=>{c.abort()};if(i.status===`completed`||i.status===`failed`)return{cancel:l,result:Promise.resolve(i)};let{txHash:u}=i.source;if(!(0,r.isHash)(u)){let t={...i,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return s(t),{cancel:l,result:Promise.resolve(t)}}let d=t.getEvmClientForChain({chain:i.sourceChain}),f=t.getEvmClientForChain({chain:i.targetChain}),p=structuredClone(i);return{cancel:l,result:(async()=>{for(;!c.signal.aborted;)switch(p.status){case`source-pending`:p=await a({currentTransfer:p,signal:c.signal,sourceClient:d}),s(p);break;case`target-pending`:p=await o({assetIn:p.sourceAsset,currentTransfer:p,evmConfig:n,signal:c.signal,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId,targetClient:f}),s(p);break;default:return p}return p})()}}}async function a({currentTransfer:n,signal:i,sourceClient:a}){let{confirmationCount:o,requiredConfirmationCount:s,txHash:c}=n.source;if(!(0,r.isHash)(c))return{...n,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};if(o>=s)return{...n,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let r=await t.awaitOrAbort(a.waitForTransactionReceipt({confirmations:Math.min(o+1,s),hash:c}),i);if(r.status===`aborted`)return n;let l=r.value;if(l.status===`reverted`)return{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};let u=await a.getTransactionConfirmations({transactionReceipt:l}).then(e=>Number(e)).catch(()=>o+1);return u<s?{...n,source:{...n.source,confirmationCount:u}}:{...n,source:{...n.source,confirmationCount:u},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}}}catch(e){return{...n,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`}}}async function o({assetIn:i,currentTransfer:a,evmConfig:o,signal:l,sourceChainId:u,targetChainId:d,targetClient:f}){let p=a.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(p.confirmationCount>=p.requiredConfirmationCount)return{...a,status:`completed`,completedAtMs:Date.now()};if(!p.txHash){let{ethToAva:t,target:{token:{address:r}}}=n.getTransferData({assetIn:i,sourceChainId:u,targetChainId:d},o),l=t?await s({contractAddress:r,sourceTxHash:a.source.txHash,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber}):await c({contractAddress:r,evmConfig:o,fromAddress:a.fromAddress,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber});return l?{...a,target:{...p,txHash:l}}:{...a,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Target transaction hash could not be found`,failedAtMs:Date.now(),status:`failed`}}if(!(0,r.isHash)(p.txHash))return{...a,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};try{let n=await t.awaitOrAbort(f.waitForTransactionReceipt({confirmations:p.requiredConfirmationCount,hash:p.txHash}),l);if(n.status===`aborted`)return a;let r=n.value;return r.status===`reverted`?{...a,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`}:{...a,completedAtMs:Date.now(),status:`completed`,target:{...p,confirmationCount:await f.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>p.requiredConfirmationCount)}}}catch(e){return{...a,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`}}}async function s({contractAddress:e,sourceTxHash:t,targetClient:n,targetStartBlockNumber:r}){if(r===void 0)return null;let i=(await n.getLogs({address:e,event:{inputs:[{indexed:!1,name:`to`,type:`address`},{indexed:!1,name:`amount`,type:`uint256`},{indexed:!1,name:`feeAddress`,type:`address`},{indexed:!1,name:`feeAmount`,type:`uint256`},{indexed:!1,name:`originTxId`,type:`bytes32`}],name:`Mint`,type:`event`},fromBlock:r,toBlock:`latest`})).find(e=>e.args.originTxId===t);return i?i.transactionHash:null}async function c({contractAddress:e,evmConfig:t,fromAddress:n,targetClient:i,targetStartBlockNumber:a}){if(a===void 0||!(0,r.isAddress)(n))return null;let o=(await i.getLogs({address:e,args:{dst:n,src:t.walletAddresses.ethereum},event:{inputs:[{indexed:!0,name:`src`,type:`address`},{indexed:!0,name:`dst`,type:`address`},{indexed:!1,name:`wad`,type:`uint256`}],name:`Transfer`,type:`event`},fromBlock:a,toBlock:`latest`})).at(0);return o?o.transactionHash:null}exports.trackTransferFactory=i;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils/transfer-data.cjs`);let r=require(`viem`);function i({config:n}){return({transfer:i,updateListener:s})=>{let c=new AbortController,l=()=>{c.abort()};if(i.status===`completed`||i.status===`failed`)return{cancel:l,result:Promise.resolve(i)};let{txHash:u}=i.source;if(!(0,r.isHash)(u)){let t={...i,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return s(t),{cancel:l,result:Promise.resolve(t)}}let d=t.getEvmClientForChain({chain:i.sourceChain}),f=t.getEvmClientForChain({chain:i.targetChain}),p=structuredClone(i);return{cancel:l,result:(async()=>{for(;!c.signal.aborted;)switch(p.status){case`source-pending`:p=await a({currentTransfer:p,signal:c.signal,sourceClient:d}),s(p);break;case`target-pending`:p=await o({assetIn:p.sourceAsset,currentTransfer:p,evmConfig:n,signal:c.signal,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId,targetClient:f}),s(p);break;default:return p}return p})()}}}async function a({currentTransfer:n,signal:i,sourceClient:a}){let{confirmationCount:o,requiredConfirmationCount:s,txHash:c}=n.source;if(!(0,r.isHash)(c))return{...n,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(o>=s)return{...n,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let r=await t.awaitOrAbort(a.waitForTransactionReceipt({confirmations:Math.min(o+1,s),hash:c}),i);if(r.status===`aborted`)return n;let l=r.value;if(l.status===`reverted`)return{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};let u=await a.getTransactionConfirmations({transactionReceipt:l}).then(e=>Number(e)).catch(()=>o+1);return u<s?{...n,source:{...n.source,confirmationCount:u}}:{...n,source:{...n.source,confirmationCount:u},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}}}catch{return n}}async function o({assetIn:i,currentTransfer:a,evmConfig:o,signal:l,sourceChainId:u,targetChainId:d,targetClient:f}){let p=a.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(p.confirmationCount>=p.requiredConfirmationCount)return{...a,status:`completed`,completedAtMs:Date.now()};if(!p.txHash){let{ethToAva:e,target:{token:{address:t}}}=n.getTransferData({assetIn:i,sourceChainId:u,targetChainId:d},o),r=e?await s({contractAddress:t,sourceTxHash:a.source.txHash,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber}):await c({contractAddress:t,evmConfig:o,fromAddress:a.fromAddress,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber});return r?{...a,target:{...p,txHash:r}}:a}if(!(0,r.isHash)(p.txHash))return{...a,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let n=await t.awaitOrAbort(f.waitForTransactionReceipt({confirmations:p.requiredConfirmationCount,hash:p.txHash}),l);if(n.status===`aborted`)return a;let r=n.value;return r.status===`reverted`?{...a,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Target transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:{...a,completedAtMs:Date.now(),status:`completed`,target:{...p,confirmationCount:await f.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>p.requiredConfirmationCount)}}}catch{return a}}async function s({contractAddress:e,sourceTxHash:t,targetClient:n,targetStartBlockNumber:r}){if(r===void 0)return null;let i=(await n.getLogs({address:e,event:{inputs:[{indexed:!1,name:`to`,type:`address`},{indexed:!1,name:`amount`,type:`uint256`},{indexed:!1,name:`feeAddress`,type:`address`},{indexed:!1,name:`feeAmount`,type:`uint256`},{indexed:!1,name:`originTxId`,type:`bytes32`}],name:`Mint`,type:`event`},fromBlock:r,toBlock:`latest`})).find(e=>e.args.originTxId===t);return i?i.transactionHash:null}async function c({contractAddress:e,evmConfig:t,fromAddress:n,targetClient:i,targetStartBlockNumber:a}){if(a===void 0||!(0,r.isAddress)(n))return null;let o=(await i.getLogs({address:e,args:{dst:n,src:t.walletAddresses.ethereum},event:{inputs:[{indexed:!0,name:`src`,type:`address`},{indexed:!0,name:`dst`,type:`address`},{indexed:!1,name:`wad`,type:`uint256`}],name:`Transfer`,type:`event`},fromBlock:a,toBlock:`latest`})).at(0);return o?o.transactionHash:null}exports.trackTransferFactory=i;
2
2
  //# sourceMappingURL=track-transfer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-transfer.cjs","names":["ErrorCode","getEvmClientForChain","awaitOrAbort","getErrorCodeForViemError","getTransferData"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getErrorCodeForViemError, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n updateListener(currentTransfer);\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const targetTxHash = ethToAva\n ? await _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : await _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n });\n\n if (!targetTxHash) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Target transaction hash could not be found',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n const foundLog = logs.at(0); // TODO: Is this correct? Original code was using -1. But we want \"oldest\" log right? ie the closest to the \"fromBlock\"?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"track-transfer.cjs","names":["ErrorCode","getEvmClientForChain","awaitOrAbort","getTransferData"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n updateListener(currentTransfer);\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const targetTxHash = ethToAva\n ? await _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : await _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n });\n\n if (!targetTxHash) {\n return currentTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Target transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n const foundLog = logs.at(0); // TODO: Is this correct? Original code was using -1. But we want \"oldest\" log right? ie the closest to the \"fromBlock\"?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e}from"../../../errors.js";import{awaitOrAbort as t,getErrorCodeForViemError as n,getEvmClientForChain as r}from"../../_utils.js";import{getTransferData as i}from"../_utils/transfer-data.js";import{isAddress as a,isHash as o}from"viem";function s({config:t}){return({transfer:n,updateListener:i})=>{let a=new AbortController,s=()=>{a.abort()};if(n.status===`completed`||n.status===`failed`)return{cancel:s,result:Promise.resolve(n)};let{txHash:u}=n.source;if(!o(u)){let t={...n,errorCode:e.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return i(t),{cancel:s,result:Promise.resolve(t)}}let d=r({chain:n.sourceChain}),f=r({chain:n.targetChain}),p=structuredClone(n);return{cancel:s,result:(async()=>{for(;!a.signal.aborted;)switch(p.status){case`source-pending`:p=await c({currentTransfer:p,signal:a.signal,sourceClient:d}),i(p);break;case`target-pending`:p=await l({assetIn:p.sourceAsset,currentTransfer:p,evmConfig:t,signal:a.signal,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId,targetClient:f}),i(p);break;default:return p}return p})()}}}async function c({currentTransfer:r,signal:i,sourceClient:a}){let{confirmationCount:s,requiredConfirmationCount:c,txHash:l}=r.source;if(!o(l))return{...r,errorCode:e.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};if(s>=c)return{...r,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let n=await t(a.waitForTransactionReceipt({confirmations:Math.min(s+1,c),hash:l}),i);if(n.status===`aborted`)return r;let o=n.value;if(o.status===`reverted`)return{...r,errorCode:e.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};let u=await a.getTransactionConfirmations({transactionReceipt:o}).then(e=>Number(e)).catch(()=>s+1);return u<c?{...r,source:{...r.source,confirmationCount:u}}:{...r,source:{...r.source,confirmationCount:u},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}}}catch(e){return{...r,errorCode:n(e),failedAtMs:Date.now(),status:`failed`}}}async function l({assetIn:r,currentTransfer:a,evmConfig:s,signal:c,sourceChainId:l,targetChainId:f,targetClient:p}){let m=a.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(m.confirmationCount>=m.requiredConfirmationCount)return{...a,status:`completed`,completedAtMs:Date.now()};if(!m.txHash){let{ethToAva:t,target:{token:{address:n}}}=i({assetIn:r,sourceChainId:l,targetChainId:f},s),o=t?await u({contractAddress:n,sourceTxHash:a.source.txHash,targetClient:p,targetStartBlockNumber:a.source.targetStartBlockNumber}):await d({contractAddress:n,evmConfig:s,fromAddress:a.fromAddress,targetClient:p,targetStartBlockNumber:a.source.targetStartBlockNumber});return o?{...a,target:{...m,txHash:o}}:{...a,errorCode:e.UNKNOWN,errorReason:`Target transaction hash could not be found`,failedAtMs:Date.now(),status:`failed`}}if(!o(m.txHash))return{...a,errorCode:e.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};try{let n=await t(p.waitForTransactionReceipt({confirmations:m.requiredConfirmationCount,hash:m.txHash}),c);if(n.status===`aborted`)return a;let r=n.value;return r.status===`reverted`?{...a,errorCode:e.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`}:{...a,completedAtMs:Date.now(),status:`completed`,target:{...m,confirmationCount:await p.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>m.requiredConfirmationCount)}}}catch(e){return{...a,errorCode:n(e),failedAtMs:Date.now(),status:`failed`}}}async function u({contractAddress:e,sourceTxHash:t,targetClient:n,targetStartBlockNumber:r}){if(r===void 0)return null;let i=(await n.getLogs({address:e,event:{inputs:[{indexed:!1,name:`to`,type:`address`},{indexed:!1,name:`amount`,type:`uint256`},{indexed:!1,name:`feeAddress`,type:`address`},{indexed:!1,name:`feeAmount`,type:`uint256`},{indexed:!1,name:`originTxId`,type:`bytes32`}],name:`Mint`,type:`event`},fromBlock:r,toBlock:`latest`})).find(e=>e.args.originTxId===t);return i?i.transactionHash:null}async function d({contractAddress:e,evmConfig:t,fromAddress:n,targetClient:r,targetStartBlockNumber:i}){if(i===void 0||!a(n))return null;let o=(await r.getLogs({address:e,args:{dst:n,src:t.walletAddresses.ethereum},event:{inputs:[{indexed:!0,name:`src`,type:`address`},{indexed:!0,name:`dst`,type:`address`},{indexed:!1,name:`wad`,type:`uint256`}],name:`Transfer`,type:`event`},fromBlock:i,toBlock:`latest`})).at(0);return o?o.transactionHash:null}export{s as trackTransferFactory};
1
+ import{ErrorCode as e}from"../../../errors.js";import{awaitOrAbort as t,getEvmClientForChain as n}from"../../_utils.js";import{getTransferData as r}from"../_utils/transfer-data.js";import{isAddress as i,isHash as a}from"viem";function o({config:t}){return({transfer:r,updateListener:i})=>{let o=new AbortController,l=()=>{o.abort()};if(r.status===`completed`||r.status===`failed`)return{cancel:l,result:Promise.resolve(r)};let{txHash:u}=r.source;if(!a(u)){let t={...r,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return i(t),{cancel:l,result:Promise.resolve(t)}}let d=n({chain:r.sourceChain}),f=n({chain:r.targetChain}),p=structuredClone(r);return{cancel:l,result:(async()=>{for(;!o.signal.aborted;)switch(p.status){case`source-pending`:p=await s({currentTransfer:p,signal:o.signal,sourceClient:d}),i(p);break;case`target-pending`:p=await c({assetIn:p.sourceAsset,currentTransfer:p,evmConfig:t,signal:o.signal,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId,targetClient:f}),i(p);break;default:return p}return p})()}}}async function s({currentTransfer:n,signal:r,sourceClient:i}){let{confirmationCount:o,requiredConfirmationCount:s,txHash:c}=n.source;if(!a(c))return{...n,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(o>=s)return{...n,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let a=await t(i.waitForTransactionReceipt({confirmations:Math.min(o+1,s),hash:c}),r);if(a.status===`aborted`)return n;let l=a.value;if(l.status===`reverted`)return{...n,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};let u=await i.getTransactionConfirmations({transactionReceipt:l}).then(e=>Number(e)).catch(()=>o+1);return u<s?{...n,source:{...n.source,confirmationCount:u}}:{...n,source:{...n.source,confirmationCount:u},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}}}catch{return n}}async function c({assetIn:n,currentTransfer:i,evmConfig:o,signal:s,sourceChainId:c,targetChainId:d,targetClient:f}){let p=i.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(p.confirmationCount>=p.requiredConfirmationCount)return{...i,status:`completed`,completedAtMs:Date.now()};if(!p.txHash){let{ethToAva:e,target:{token:{address:t}}}=r({assetIn:n,sourceChainId:c,targetChainId:d},o),a=e?await l({contractAddress:t,sourceTxHash:i.source.txHash,targetClient:f,targetStartBlockNumber:i.source.targetStartBlockNumber}):await u({contractAddress:t,evmConfig:o,fromAddress:i.fromAddress,targetClient:f,targetStartBlockNumber:i.source.targetStartBlockNumber});return a?{...i,target:{...p,txHash:a}}:i}if(!a(p.txHash))return{...i,errorCode:e.INVALID_PARAMS,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let n=await t(f.waitForTransactionReceipt({confirmations:p.requiredConfirmationCount,hash:p.txHash}),s);if(n.status===`aborted`)return i;let r=n.value;return r.status===`reverted`?{...i,errorCode:e.TRANSACTION_REVERTED,errorReason:`Target transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:{...i,completedAtMs:Date.now(),status:`completed`,target:{...p,confirmationCount:await f.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>p.requiredConfirmationCount)}}}catch{return i}}async function l({contractAddress:e,sourceTxHash:t,targetClient:n,targetStartBlockNumber:r}){if(r===void 0)return null;let i=(await n.getLogs({address:e,event:{inputs:[{indexed:!1,name:`to`,type:`address`},{indexed:!1,name:`amount`,type:`uint256`},{indexed:!1,name:`feeAddress`,type:`address`},{indexed:!1,name:`feeAmount`,type:`uint256`},{indexed:!1,name:`originTxId`,type:`bytes32`}],name:`Mint`,type:`event`},fromBlock:r,toBlock:`latest`})).find(e=>e.args.originTxId===t);return i?i.transactionHash:null}async function u({contractAddress:e,evmConfig:t,fromAddress:n,targetClient:r,targetStartBlockNumber:a}){if(a===void 0||!i(n))return null;let o=(await r.getLogs({address:e,args:{dst:n,src:t.walletAddresses.ethereum},event:{inputs:[{indexed:!0,name:`src`,type:`address`},{indexed:!0,name:`dst`,type:`address`},{indexed:!1,name:`wad`,type:`uint256`}],name:`Transfer`,type:`event`},fromBlock:a,toBlock:`latest`})).at(0);return o?o.transactionHash:null}export{o as trackTransferFactory};
2
2
  //# sourceMappingURL=track-transfer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"track-transfer.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getErrorCodeForViemError, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n updateListener(currentTransfer);\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const targetTxHash = ethToAva\n ? await _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : await _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n });\n\n if (!targetTxHash) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Target transaction hash could not be found',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n const foundLog = logs.at(0); // TODO: Is this correct? Original code was using -1. But we want \"oldest\" log right? ie the closest to the \"fromBlock\"?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"track-transfer.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n updateListener(currentTransfer);\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const targetTxHash = ethToAva\n ? await _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : await _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n });\n\n if (!targetTxHash) {\n return currentTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Target transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n const foundLog = logs.at(0); // TODO: Is this correct? Original code was using -1. But we want \"oldest\" log right? ie the closest to the \"fromBlock\"?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/evm-address.cjs`),r=require(`./fee.cjs`),i=require(`../../_warden-config.cjs`);async function a(e){return o(await i.getWardenConfig(e),e)}function o(i,a){let o=i.critical.assets,{ethereum:s,avalanche:c}=i.critical.networks;if(s===void 0||c===void 0)throw new t.ServiceInitializationError(t.ErrorReason.WARDEN_CONFIG_MISSING_NETWORK,`Critical networks info is missing from wardenConfig`);let l=i.critical.walletAddresses.avalanche,u=i.critical.walletAddresses.ethereum;if(!l||!u)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`Wallet address is missing from the critical config.`);let d=Object.entries(o).reduce((t,[a,o])=>{let l=n.formatEvmAddress(o.nativeContractAddress),u={type:e.TokenType.ERC20,address:l,name:o.tokenName,symbol:a,decimals:o.denomination},d=i.nonCritical.wrapFeeApproximation[a];return t[l]={chainId:`eip155:${s}`,token:u,target:{chainId:`eip155:${c}`,tokenAddress:n.formatEvmAddress(o.wrappedContractAddress)},wrapFeeApproximation:r.isDynamicFee(d)?d:d?BigInt(d):void 0},t},{}),f=Object.values(d).find(e=>e.token.symbol===`WETH`);if(!f)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`WETH info is missing from config`);let p=Object.entries(o).reduce((t,[a,o])=>{let l=n.formatEvmAddress(o.wrappedContractAddress),u={type:e.TokenType.ERC20,address:l,name:o.tokenName,symbol:`${a}.e`,decimals:o.denomination},d=i.nonCritical.unwrapFeeApproximation[a];return t[l]={chainId:`eip155:${c}`,token:u,target:{chainId:`eip155:${s}`,tokenAddress:n.formatEvmAddress(o.nativeContractAddress)},unwrapFeeApproximation:r.isDynamicFee(d)?d:d?BigInt(d):void 0},t},{}),m=p[f.target.tokenAddress];if(!m)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`WETH.e info is missing from config`);let h=i.nonCritical.minimumConfirmations.avalanche,g=i.nonCritical.minimumConfirmations.ethereum;if(!h||!g)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`Minimum confirmation info is missing`);return{addressBlocklist:i.critical.addressBlocklist,ethereumTokens:d,avalancheTokens:p,minimumConfirmations:{avalanche:h,ethereum:g},environment:a,walletAddresses:{avalanche:l,ethereum:u},nativeTokenConfig:{ethereumToken:f,avalancheToken:m}}}exports.getConfig=a;
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`./fee.cjs`),r=require(`../../../utils/evm-address.cjs`),i=require(`../../_warden-config.cjs`);async function a(e){return o(await i.getWardenConfig(e),e)}function o(i,a){let o=i.critical.assets,{ethereum:s,avalanche:c}=i.critical.networks;if(s===void 0||c===void 0)throw new t.ServiceInitializationError(t.ErrorReason.WARDEN_CONFIG_MISSING_NETWORK,`Critical networks info is missing from wardenConfig`);let l=i.critical.walletAddresses.avalanche,u=i.critical.walletAddresses.ethereum;if(!l||!u)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`Wallet address is missing from the critical config.`);let d=Object.entries(o).reduce((t,[a,o])=>{let l=r.formatEvmAddress(o.nativeContractAddress),u={type:e.TokenType.ERC20,address:l,name:o.tokenName,symbol:a,decimals:o.denomination},d=i.nonCritical.wrapFeeApproximation[a];return t[l]={chainId:`eip155:${s}`,token:u,target:{chainId:`eip155:${c}`,tokenAddress:r.formatEvmAddress(o.wrappedContractAddress)},wrapFeeApproximation:n.isDynamicFee(d)?d:d?BigInt(d):void 0},t},{}),f=Object.values(d).find(e=>e.token.symbol===`WETH`);if(!f)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`WETH info is missing from config`);let p=Object.entries(o).reduce((t,[a,o])=>{let l=r.formatEvmAddress(o.wrappedContractAddress),u={type:e.TokenType.ERC20,address:l,name:o.tokenName,symbol:`${a}.e`,decimals:o.denomination},d=i.nonCritical.unwrapFeeApproximation[a];return t[l]={chainId:`eip155:${c}`,token:u,target:{chainId:`eip155:${s}`,tokenAddress:r.formatEvmAddress(o.nativeContractAddress)},unwrapFeeApproximation:n.isDynamicFee(d)?d:d?BigInt(d):void 0},t},{}),m=p[f.target.tokenAddress];if(!m)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`WETH.e info is missing from config`);let h=i.nonCritical.minimumConfirmations.avalanche,g=i.nonCritical.minimumConfirmations.ethereum;if(!h||!g)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`Minimum confirmation info is missing`);return{addressBlocklist:i.critical.addressBlocklist,ethereumTokens:d,avalancheTokens:p,minimumConfirmations:{avalanche:h,ethereum:g},environment:a,walletAddresses:{avalanche:l,ethereum:u},nativeTokenConfig:{ethereumToken:f,avalancheToken:m}}}exports.getConfig=a;
2
2
  //# sourceMappingURL=get-config.cjs.map
@@ -1,2 +1,2 @@
1
- import{TokenType as e}from"../../../constants.js";import{ErrorReason as t,ServiceInitializationError as n}from"../../../errors.js";import{formatEvmAddress as r}from"../../../utils/evm-address.js";import{isDynamicFee as i}from"./fee.js";import{getWardenConfig as a}from"../../_warden-config.js";async function o(e){return s(await a(e),e)}function s(a,o){let s=a.critical.assets,{ethereum:c,avalanche:l}=a.critical.networks;if(c===void 0||l===void 0)throw new n(t.WARDEN_CONFIG_MISSING_NETWORK,`Critical networks info is missing from wardenConfig`);let u=a.critical.walletAddresses.avalanche,d=a.critical.walletAddresses.ethereum;if(!u||!d)throw new n(t.CONFIG_NOT_AVAILABLE,`Wallet address is missing from the critical config.`);let f=Object.entries(s).reduce((t,[n,o])=>{let s=r(o.nativeContractAddress),u={type:e.ERC20,address:s,name:o.tokenName,symbol:n,decimals:o.denomination},d=a.nonCritical.wrapFeeApproximation[n];return t[s]={chainId:`eip155:${c}`,token:u,target:{chainId:`eip155:${l}`,tokenAddress:r(o.wrappedContractAddress)},wrapFeeApproximation:i(d)?d:d?BigInt(d):void 0},t},{}),p=Object.values(f).find(e=>e.token.symbol===`WETH`);if(!p)throw new n(t.CONFIG_NOT_AVAILABLE,`WETH info is missing from config`);let m=Object.entries(s).reduce((t,[n,o])=>{let s=r(o.wrappedContractAddress),u={type:e.ERC20,address:s,name:o.tokenName,symbol:`${n}.e`,decimals:o.denomination},d=a.nonCritical.unwrapFeeApproximation[n];return t[s]={chainId:`eip155:${l}`,token:u,target:{chainId:`eip155:${c}`,tokenAddress:r(o.nativeContractAddress)},unwrapFeeApproximation:i(d)?d:d?BigInt(d):void 0},t},{}),h=m[p.target.tokenAddress];if(!h)throw new n(t.CONFIG_NOT_AVAILABLE,`WETH.e info is missing from config`);let g=a.nonCritical.minimumConfirmations.avalanche,_=a.nonCritical.minimumConfirmations.ethereum;if(!g||!_)throw new n(t.CONFIG_NOT_AVAILABLE,`Minimum confirmation info is missing`);return{addressBlocklist:a.critical.addressBlocklist,ethereumTokens:f,avalancheTokens:m,minimumConfirmations:{avalanche:g,ethereum:_},environment:o,walletAddresses:{avalanche:u,ethereum:d},nativeTokenConfig:{ethereumToken:p,avalancheToken:h}}}export{o as getConfig};
1
+ import{TokenType as e}from"../../../constants.js";import{ErrorReason as t,ServiceInitializationError as n}from"../../../errors.js";import{isDynamicFee as r}from"./fee.js";import{formatEvmAddress as i}from"../../../utils/evm-address.js";import{getWardenConfig as a}from"../../_warden-config.js";async function o(e){return s(await a(e),e)}function s(a,o){let s=a.critical.assets,{ethereum:c,avalanche:l}=a.critical.networks;if(c===void 0||l===void 0)throw new n(t.WARDEN_CONFIG_MISSING_NETWORK,`Critical networks info is missing from wardenConfig`);let u=a.critical.walletAddresses.avalanche,d=a.critical.walletAddresses.ethereum;if(!u||!d)throw new n(t.CONFIG_NOT_AVAILABLE,`Wallet address is missing from the critical config.`);let f=Object.entries(s).reduce((t,[n,o])=>{let s=i(o.nativeContractAddress),u={type:e.ERC20,address:s,name:o.tokenName,symbol:n,decimals:o.denomination},d=a.nonCritical.wrapFeeApproximation[n];return t[s]={chainId:`eip155:${c}`,token:u,target:{chainId:`eip155:${l}`,tokenAddress:i(o.wrappedContractAddress)},wrapFeeApproximation:r(d)?d:d?BigInt(d):void 0},t},{}),p=Object.values(f).find(e=>e.token.symbol===`WETH`);if(!p)throw new n(t.CONFIG_NOT_AVAILABLE,`WETH info is missing from config`);let m=Object.entries(s).reduce((t,[n,o])=>{let s=i(o.wrappedContractAddress),u={type:e.ERC20,address:s,name:o.tokenName,symbol:`${n}.e`,decimals:o.denomination},d=a.nonCritical.unwrapFeeApproximation[n];return t[s]={chainId:`eip155:${l}`,token:u,target:{chainId:`eip155:${c}`,tokenAddress:i(o.nativeContractAddress)},unwrapFeeApproximation:r(d)?d:d?BigInt(d):void 0},t},{}),h=m[p.target.tokenAddress];if(!h)throw new n(t.CONFIG_NOT_AVAILABLE,`WETH.e info is missing from config`);let g=a.nonCritical.minimumConfirmations.avalanche,_=a.nonCritical.minimumConfirmations.ethereum;if(!g||!_)throw new n(t.CONFIG_NOT_AVAILABLE,`Minimum confirmation info is missing`);return{addressBlocklist:a.critical.addressBlocklist,ethereumTokens:f,avalancheTokens:m,minimumConfirmations:{avalanche:g,ethereum:_},environment:o,walletAddresses:{avalanche:u,ethereum:d},nativeTokenConfig:{ethereumToken:p,avalancheToken:h}}}export{o as getConfig};
2
2
  //# sourceMappingURL=get-config.js.map
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../type-guards.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`./validations.cjs`),i=require(`../_constants.cjs`);let a=require(`viem`);const o=e=>({source:e.nativeTokenConfig.ethereumToken,target:e.nativeTokenConfig.avalancheToken,ethToAva:!0}),s=(e,t)=>(0,a.isAddressEqual)(e.address,t.address),c=(n,r)=>{if(!t.isErc20Asset(r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Wrong token type: ${r.type}`);let i=n.ethereumTokens[r.address];if(!i||!s(i.token,r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to find matching ethereum token in config: ${r.symbol}`);let a=n.avalancheTokens[i.target.tokenAddress];if(!a)throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to get avalanche token in config: ${r.symbol}`);return{source:i,target:a,ethToAva:!0}},l=(n,r)=>{if(!t.isErc20Asset(r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Wrong token type: ${r.type}`);let i=n.avalancheTokens[r.address];if(!i||!s(i.token,r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to find matching avalanche token in config: ${r.symbol}`);let a=n.ethereumTokens[i.target.tokenAddress];if(!a)throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to get ethereum token in config: ${r.symbol}`);return{source:i,target:a,ethToAva:!1}},u=({assetIn:a,sourceChainId:s,targetChainId:u},d)=>{if(s===u)throw new e.InvalidParamsError(e.ErrorReason.IDENTICAL_CHAINS_PROVIDED,`SourceChain and TargetChain need to be different network. But found the same chainId: ${s}`);if(!r.isValidChainCombination(s,u))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`SourceChain and TargetChain combination is not correct or the chains provided are not supported`);return t.isNativeAsset(a)&&a.symbol===i.ETH_TOKEN.symbol&&n.isCaip2EthereumChainId(s)?o(d):n.isCaip2EthereumChainId(s)?c(d,a):l(d,a)};exports.getTransferData=u;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../type-guards.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`./validations.cjs`),i=require(`../_constants.cjs`);let a=require(`viem`);const o=e=>({source:e.nativeTokenConfig.ethereumToken,target:e.nativeTokenConfig.avalancheToken,ethToAva:!0}),s=(e,t)=>(0,a.isAddressEqual)(e.address,t.address),c=(n,r)=>{if(!t.isErc20Asset(r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Wrong token type: ${r.type}`);let i=n.ethereumTokens[r.address.toLowerCase()];if(!i||!s(i.token,r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to find matching ethereum token in config: ${r.symbol}`);let a=n.avalancheTokens[i.target.tokenAddress];if(!a)throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to get avalanche token in config: ${r.symbol}`);return{source:i,target:a,ethToAva:!0}},l=(n,r)=>{if(!t.isErc20Asset(r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Wrong token type: ${r.type}`);let i=n.avalancheTokens[r.address.toLowerCase()];if(!i||!s(i.token,r))throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to find matching avalanche token in config: ${r.symbol}`);let a=n.ethereumTokens[i.target.tokenAddress];if(!a)throw new e.InvalidParamsError(e.ErrorReason.ASSET_NOT_SUPPORTED,`Unable to get ethereum token in config: ${r.symbol}`);return{source:i,target:a,ethToAva:!1}},u=({assetIn:a,sourceChainId:s,targetChainId:u},d)=>{if(s===u)throw new e.InvalidParamsError(e.ErrorReason.IDENTICAL_CHAINS_PROVIDED,`SourceChain and TargetChain need to be different network. But found the same chainId: ${s}`);if(!r.isValidChainCombination(s,u))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`SourceChain and TargetChain combination is not correct or the chains provided are not supported`);return t.isNativeAsset(a)&&a.symbol===i.ETH_TOKEN.symbol&&n.isCaip2EthereumChainId(s)?o(d):n.isCaip2EthereumChainId(s)?c(d,a):l(d,a)};exports.getTransferData=u;
2
2
  //# sourceMappingURL=transfer-data.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-data.cjs","names":["isErc20Asset","InvalidParamsError","ErrorReason","isValidChainCombination","isNativeAsset","ETH_TOKEN","isCaip2EthereumChainId"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/transfer-data.ts"],"sourcesContent":["import type { AvaToEthTransferData, EthToAvaTransferData, EvmConfig, TransferData } from '../_types';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isErc20Asset, isNativeAsset } from '../../../type-guards';\nimport type { Asset, Erc20Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { isCaip2EthereumChainId } from '../../../_utils/chain';\nimport { ETH_TOKEN } from '../_constants';\nimport { isAddressEqual } from 'viem';\nimport { isValidChainCombination } from './validations';\n\nconst ethHandler = (config: EvmConfig) => {\n return {\n source: config.nativeTokenConfig.ethereumToken,\n target: config.nativeTokenConfig.avalancheToken,\n ethToAva: true,\n };\n};\n\nconst assetsMatch = (a: Erc20Asset, b: Erc20Asset) => {\n return isAddressEqual(a.address, b.address);\n};\n\nconst prepEthToAvaTransferData = (config: EvmConfig, asset: Asset): EthToAvaTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const ethToken = config.ethereumTokens[asset.address];\n if (!ethToken || !assetsMatch(ethToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching ethereum token in config: ${asset.symbol}`,\n );\n }\n\n const avaToken = config.avalancheTokens[ethToken.target.tokenAddress];\n\n if (!avaToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get avalanche token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: ethToken,\n target: avaToken,\n ethToAva: true,\n };\n};\n\nconst prepAvaToEthTransferData = (config: EvmConfig, asset: Asset): AvaToEthTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const avaToken = config.avalancheTokens[asset.address];\n if (!avaToken || !assetsMatch(avaToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching avalanche token in config: ${asset.symbol}`,\n );\n }\n\n const ethToken = config.ethereumTokens[avaToken.target.tokenAddress];\n\n if (!ethToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get ethereum token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: avaToken,\n target: ethToken,\n ethToAva: false,\n };\n};\n\nexport const getTransferData = (\n {\n assetIn,\n sourceChainId,\n targetChainId,\n }: {\n assetIn: Asset;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n },\n config: EvmConfig,\n): TransferData => {\n if (sourceChainId === targetChainId) {\n throw new InvalidParamsError(\n ErrorReason.IDENTICAL_CHAINS_PROVIDED,\n `SourceChain and TargetChain need to be different network. But found the same chainId: ${sourceChainId}`,\n );\n }\n\n if (!isValidChainCombination(sourceChainId, targetChainId)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `SourceChain and TargetChain combination is not correct or the chains provided are not supported`,\n );\n }\n\n if (isNativeAsset(assetIn) && assetIn.symbol === ETH_TOKEN.symbol && isCaip2EthereumChainId(sourceChainId)) {\n return ethHandler(config);\n }\n\n if (isCaip2EthereumChainId(sourceChainId)) {\n return prepEthToAvaTransferData(config, assetIn);\n } else {\n return prepAvaToEthTransferData(config, assetIn);\n }\n};\n"],"mappings":"2PAUA,MAAM,EAAc,IACX,CACL,OAAQ,EAAO,kBAAkB,cACjC,OAAQ,EAAO,kBAAkB,eACjC,SAAU,GACX,EAGG,GAAe,EAAe,KAClC,EAAA,EAAA,gBAAsB,EAAE,QAAS,EAAE,QAAQ,CAGvC,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAACA,EAAAA,aAAa,EAAM,CACtB,MAAM,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,eAAe,EAAM,SAC7C,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,qDAAqD,EAAM,SAC5D,CAGH,IAAM,EAAW,EAAO,gBAAgB,EAAS,OAAO,cAExD,GAAI,CAAC,EACH,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,4CAA4C,EAAM,SACnD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGG,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAACF,EAAAA,aAAa,EAAM,CACtB,MAAM,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,gBAAgB,EAAM,SAC9C,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,sDAAsD,EAAM,SAC7D,CAGH,IAAM,EAAW,EAAO,eAAe,EAAS,OAAO,cAEvD,GAAI,CAAC,EACH,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,2CAA2C,EAAM,SAClD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGU,GACX,CACE,UACA,gBACA,iBAMF,IACiB,CACjB,GAAI,IAAkB,EACpB,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,0BACZ,yFAAyF,IAC1F,CAGH,GAAI,CAACC,EAAAA,wBAAwB,EAAe,EAAc,CACxD,MAAM,IAAIF,EAAAA,mBACRC,EAAAA,YAAY,eACZ,kGACD,CAUD,OAPEE,EAAAA,cAAc,EAAQ,EAAI,EAAQ,SAAWC,EAAAA,UAAU,QAAUC,EAAAA,uBAAuB,EAAc,CACjG,EAAW,EAAO,CAGvBA,EAAAA,uBAAuB,EAAc,CAChC,EAAyB,EAAQ,EAAQ,CAEzC,EAAyB,EAAQ,EAAQ"}
1
+ {"version":3,"file":"transfer-data.cjs","names":["isErc20Asset","InvalidParamsError","ErrorReason","isValidChainCombination","isNativeAsset","ETH_TOKEN","isCaip2EthereumChainId"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/transfer-data.ts"],"sourcesContent":["import type { AvaToEthTransferData, EthToAvaTransferData, EvmConfig, TransferData } from '../_types';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isErc20Asset, isNativeAsset } from '../../../type-guards';\nimport type { Asset, Erc20Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { isCaip2EthereumChainId } from '../../../_utils/chain';\nimport { ETH_TOKEN } from '../_constants';\nimport { isAddressEqual } from 'viem';\nimport { isValidChainCombination } from './validations';\n\nconst ethHandler = (config: EvmConfig) => {\n return {\n source: config.nativeTokenConfig.ethereumToken,\n target: config.nativeTokenConfig.avalancheToken,\n ethToAva: true,\n };\n};\n\nconst assetsMatch = (a: Erc20Asset, b: Erc20Asset) => {\n return isAddressEqual(a.address, b.address);\n};\n\nconst prepEthToAvaTransferData = (config: EvmConfig, asset: Asset): EthToAvaTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const ethToken = config.ethereumTokens[asset.address.toLowerCase()];\n if (!ethToken || !assetsMatch(ethToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching ethereum token in config: ${asset.symbol}`,\n );\n }\n\n const avaToken = config.avalancheTokens[ethToken.target.tokenAddress];\n\n if (!avaToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get avalanche token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: ethToken,\n target: avaToken,\n ethToAva: true,\n };\n};\n\nconst prepAvaToEthTransferData = (config: EvmConfig, asset: Asset): AvaToEthTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const avaToken = config.avalancheTokens[asset.address.toLowerCase()];\n if (!avaToken || !assetsMatch(avaToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching avalanche token in config: ${asset.symbol}`,\n );\n }\n\n const ethToken = config.ethereumTokens[avaToken.target.tokenAddress];\n\n if (!ethToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get ethereum token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: avaToken,\n target: ethToken,\n ethToAva: false,\n };\n};\n\nexport const getTransferData = (\n {\n assetIn,\n sourceChainId,\n targetChainId,\n }: {\n assetIn: Asset;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n },\n config: EvmConfig,\n): TransferData => {\n if (sourceChainId === targetChainId) {\n throw new InvalidParamsError(\n ErrorReason.IDENTICAL_CHAINS_PROVIDED,\n `SourceChain and TargetChain need to be different network. But found the same chainId: ${sourceChainId}`,\n );\n }\n\n if (!isValidChainCombination(sourceChainId, targetChainId)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `SourceChain and TargetChain combination is not correct or the chains provided are not supported`,\n );\n }\n\n if (isNativeAsset(assetIn) && assetIn.symbol === ETH_TOKEN.symbol && isCaip2EthereumChainId(sourceChainId)) {\n return ethHandler(config);\n }\n\n if (isCaip2EthereumChainId(sourceChainId)) {\n return prepEthToAvaTransferData(config, assetIn);\n } else {\n return prepAvaToEthTransferData(config, assetIn);\n }\n};\n"],"mappings":"2PAUA,MAAM,EAAc,IACX,CACL,OAAQ,EAAO,kBAAkB,cACjC,OAAQ,EAAO,kBAAkB,eACjC,SAAU,GACX,EAGG,GAAe,EAAe,KAClC,EAAA,EAAA,gBAAsB,EAAE,QAAS,EAAE,QAAQ,CAGvC,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAACA,EAAAA,aAAa,EAAM,CACtB,MAAM,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,eAAe,EAAM,QAAQ,aAAa,EAClE,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,qDAAqD,EAAM,SAC5D,CAGH,IAAM,EAAW,EAAO,gBAAgB,EAAS,OAAO,cAExD,GAAI,CAAC,EACH,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,4CAA4C,EAAM,SACnD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGG,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAACF,EAAAA,aAAa,EAAM,CACtB,MAAM,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,gBAAgB,EAAM,QAAQ,aAAa,EACnE,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,sDAAsD,EAAM,SAC7D,CAGH,IAAM,EAAW,EAAO,eAAe,EAAS,OAAO,cAEvD,GAAI,CAAC,EACH,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,oBACZ,2CAA2C,EAAM,SAClD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGU,GACX,CACE,UACA,gBACA,iBAMF,IACiB,CACjB,GAAI,IAAkB,EACpB,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,0BACZ,yFAAyF,IAC1F,CAGH,GAAI,CAACC,EAAAA,wBAAwB,EAAe,EAAc,CACxD,MAAM,IAAIF,EAAAA,mBACRC,EAAAA,YAAY,eACZ,kGACD,CAUD,OAPEE,EAAAA,cAAc,EAAQ,EAAI,EAAQ,SAAWC,EAAAA,UAAU,QAAUC,EAAAA,uBAAuB,EAAc,CACjG,EAAW,EAAO,CAGvBA,EAAAA,uBAAuB,EAAc,CAChC,EAAyB,EAAQ,EAAQ,CAEzC,EAAyB,EAAQ,EAAQ"}
@@ -1,2 +1,2 @@
1
- import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{isErc20Asset as n,isNativeAsset as r}from"../../../type-guards.js";import{isCaip2EthereumChainId as i}from"../../../_utils/chain.js";import{isValidChainCombination as a}from"./validations.js";import{ETH_TOKEN as o}from"../_constants.js";import{isAddressEqual as s}from"viem";const c=e=>({source:e.nativeTokenConfig.ethereumToken,target:e.nativeTokenConfig.avalancheToken,ethToAva:!0}),l=(e,t)=>s(e.address,t.address),u=(r,i)=>{if(!n(i))throw new t(e.ASSET_NOT_SUPPORTED,`Wrong token type: ${i.type}`);let a=r.ethereumTokens[i.address];if(!a||!l(a.token,i))throw new t(e.ASSET_NOT_SUPPORTED,`Unable to find matching ethereum token in config: ${i.symbol}`);let o=r.avalancheTokens[a.target.tokenAddress];if(!o)throw new t(e.ASSET_NOT_SUPPORTED,`Unable to get avalanche token in config: ${i.symbol}`);return{source:a,target:o,ethToAva:!0}},d=(r,i)=>{if(!n(i))throw new t(e.ASSET_NOT_SUPPORTED,`Wrong token type: ${i.type}`);let a=r.avalancheTokens[i.address];if(!a||!l(a.token,i))throw new t(e.ASSET_NOT_SUPPORTED,`Unable to find matching avalanche token in config: ${i.symbol}`);let o=r.ethereumTokens[a.target.tokenAddress];if(!o)throw new t(e.ASSET_NOT_SUPPORTED,`Unable to get ethereum token in config: ${i.symbol}`);return{source:a,target:o,ethToAva:!1}},f=({assetIn:n,sourceChainId:s,targetChainId:l},f)=>{if(s===l)throw new t(e.IDENTICAL_CHAINS_PROVIDED,`SourceChain and TargetChain need to be different network. But found the same chainId: ${s}`);if(!a(s,l))throw new t(e.INVALID_PARAMS,`SourceChain and TargetChain combination is not correct or the chains provided are not supported`);return r(n)&&n.symbol===o.symbol&&i(s)?c(f):i(s)?u(f,n):d(f,n)};export{f as getTransferData};
1
+ import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{isErc20Asset as n,isNativeAsset as r}from"../../../type-guards.js";import{isCaip2EthereumChainId as i}from"../../../_utils/chain.js";import{isValidChainCombination as a}from"./validations.js";import{ETH_TOKEN as o}from"../_constants.js";import{isAddressEqual as s}from"viem";const c=e=>({source:e.nativeTokenConfig.ethereumToken,target:e.nativeTokenConfig.avalancheToken,ethToAva:!0}),l=(e,t)=>s(e.address,t.address),u=(r,i)=>{if(!n(i))throw new t(e.ASSET_NOT_SUPPORTED,`Wrong token type: ${i.type}`);let a=r.ethereumTokens[i.address.toLowerCase()];if(!a||!l(a.token,i))throw new t(e.ASSET_NOT_SUPPORTED,`Unable to find matching ethereum token in config: ${i.symbol}`);let o=r.avalancheTokens[a.target.tokenAddress];if(!o)throw new t(e.ASSET_NOT_SUPPORTED,`Unable to get avalanche token in config: ${i.symbol}`);return{source:a,target:o,ethToAva:!0}},d=(r,i)=>{if(!n(i))throw new t(e.ASSET_NOT_SUPPORTED,`Wrong token type: ${i.type}`);let a=r.avalancheTokens[i.address.toLowerCase()];if(!a||!l(a.token,i))throw new t(e.ASSET_NOT_SUPPORTED,`Unable to find matching avalanche token in config: ${i.symbol}`);let o=r.ethereumTokens[a.target.tokenAddress];if(!o)throw new t(e.ASSET_NOT_SUPPORTED,`Unable to get ethereum token in config: ${i.symbol}`);return{source:a,target:o,ethToAva:!1}},f=({assetIn:n,sourceChainId:s,targetChainId:l},f)=>{if(s===l)throw new t(e.IDENTICAL_CHAINS_PROVIDED,`SourceChain and TargetChain need to be different network. But found the same chainId: ${s}`);if(!a(s,l))throw new t(e.INVALID_PARAMS,`SourceChain and TargetChain combination is not correct or the chains provided are not supported`);return r(n)&&n.symbol===o.symbol&&i(s)?c(f):i(s)?u(f,n):d(f,n)};export{f as getTransferData};
2
2
  //# sourceMappingURL=transfer-data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-data.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/transfer-data.ts"],"sourcesContent":["import type { AvaToEthTransferData, EthToAvaTransferData, EvmConfig, TransferData } from '../_types';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isErc20Asset, isNativeAsset } from '../../../type-guards';\nimport type { Asset, Erc20Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { isCaip2EthereumChainId } from '../../../_utils/chain';\nimport { ETH_TOKEN } from '../_constants';\nimport { isAddressEqual } from 'viem';\nimport { isValidChainCombination } from './validations';\n\nconst ethHandler = (config: EvmConfig) => {\n return {\n source: config.nativeTokenConfig.ethereumToken,\n target: config.nativeTokenConfig.avalancheToken,\n ethToAva: true,\n };\n};\n\nconst assetsMatch = (a: Erc20Asset, b: Erc20Asset) => {\n return isAddressEqual(a.address, b.address);\n};\n\nconst prepEthToAvaTransferData = (config: EvmConfig, asset: Asset): EthToAvaTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const ethToken = config.ethereumTokens[asset.address];\n if (!ethToken || !assetsMatch(ethToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching ethereum token in config: ${asset.symbol}`,\n );\n }\n\n const avaToken = config.avalancheTokens[ethToken.target.tokenAddress];\n\n if (!avaToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get avalanche token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: ethToken,\n target: avaToken,\n ethToAva: true,\n };\n};\n\nconst prepAvaToEthTransferData = (config: EvmConfig, asset: Asset): AvaToEthTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const avaToken = config.avalancheTokens[asset.address];\n if (!avaToken || !assetsMatch(avaToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching avalanche token in config: ${asset.symbol}`,\n );\n }\n\n const ethToken = config.ethereumTokens[avaToken.target.tokenAddress];\n\n if (!ethToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get ethereum token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: avaToken,\n target: ethToken,\n ethToAva: false,\n };\n};\n\nexport const getTransferData = (\n {\n assetIn,\n sourceChainId,\n targetChainId,\n }: {\n assetIn: Asset;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n },\n config: EvmConfig,\n): TransferData => {\n if (sourceChainId === targetChainId) {\n throw new InvalidParamsError(\n ErrorReason.IDENTICAL_CHAINS_PROVIDED,\n `SourceChain and TargetChain need to be different network. But found the same chainId: ${sourceChainId}`,\n );\n }\n\n if (!isValidChainCombination(sourceChainId, targetChainId)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `SourceChain and TargetChain combination is not correct or the chains provided are not supported`,\n );\n }\n\n if (isNativeAsset(assetIn) && assetIn.symbol === ETH_TOKEN.symbol && isCaip2EthereumChainId(sourceChainId)) {\n return ethHandler(config);\n }\n\n if (isCaip2EthereumChainId(sourceChainId)) {\n return prepEthToAvaTransferData(config, assetIn);\n } else {\n return prepAvaToEthTransferData(config, assetIn);\n }\n};\n"],"mappings":"mWAUA,MAAM,EAAc,IACX,CACL,OAAQ,EAAO,kBAAkB,cACjC,OAAQ,EAAO,kBAAkB,eACjC,SAAU,GACX,EAGG,GAAe,EAAe,IAC3B,EAAe,EAAE,QAAS,EAAE,QAAQ,CAGvC,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAAC,EAAa,EAAM,CACtB,MAAM,IAAI,EAAmB,EAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,eAAe,EAAM,SAC7C,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAI,EACR,EAAY,oBACZ,qDAAqD,EAAM,SAC5D,CAGH,IAAM,EAAW,EAAO,gBAAgB,EAAS,OAAO,cAExD,GAAI,CAAC,EACH,MAAM,IAAI,EACR,EAAY,oBACZ,4CAA4C,EAAM,SACnD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGG,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAAC,EAAa,EAAM,CACtB,MAAM,IAAI,EAAmB,EAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,gBAAgB,EAAM,SAC9C,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAI,EACR,EAAY,oBACZ,sDAAsD,EAAM,SAC7D,CAGH,IAAM,EAAW,EAAO,eAAe,EAAS,OAAO,cAEvD,GAAI,CAAC,EACH,MAAM,IAAI,EACR,EAAY,oBACZ,2CAA2C,EAAM,SAClD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGU,GACX,CACE,UACA,gBACA,iBAMF,IACiB,CACjB,GAAI,IAAkB,EACpB,MAAM,IAAI,EACR,EAAY,0BACZ,yFAAyF,IAC1F,CAGH,GAAI,CAAC,EAAwB,EAAe,EAAc,CACxD,MAAM,IAAI,EACR,EAAY,eACZ,kGACD,CAUD,OAPE,EAAc,EAAQ,EAAI,EAAQ,SAAW,EAAU,QAAU,EAAuB,EAAc,CACjG,EAAW,EAAO,CAGvB,EAAuB,EAAc,CAChC,EAAyB,EAAQ,EAAQ,CAEzC,EAAyB,EAAQ,EAAQ"}
1
+ {"version":3,"file":"transfer-data.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/transfer-data.ts"],"sourcesContent":["import type { AvaToEthTransferData, EthToAvaTransferData, EvmConfig, TransferData } from '../_types';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isErc20Asset, isNativeAsset } from '../../../type-guards';\nimport type { Asset, Erc20Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { isCaip2EthereumChainId } from '../../../_utils/chain';\nimport { ETH_TOKEN } from '../_constants';\nimport { isAddressEqual } from 'viem';\nimport { isValidChainCombination } from './validations';\n\nconst ethHandler = (config: EvmConfig) => {\n return {\n source: config.nativeTokenConfig.ethereumToken,\n target: config.nativeTokenConfig.avalancheToken,\n ethToAva: true,\n };\n};\n\nconst assetsMatch = (a: Erc20Asset, b: Erc20Asset) => {\n return isAddressEqual(a.address, b.address);\n};\n\nconst prepEthToAvaTransferData = (config: EvmConfig, asset: Asset): EthToAvaTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const ethToken = config.ethereumTokens[asset.address.toLowerCase()];\n if (!ethToken || !assetsMatch(ethToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching ethereum token in config: ${asset.symbol}`,\n );\n }\n\n const avaToken = config.avalancheTokens[ethToken.target.tokenAddress];\n\n if (!avaToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get avalanche token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: ethToken,\n target: avaToken,\n ethToAva: true,\n };\n};\n\nconst prepAvaToEthTransferData = (config: EvmConfig, asset: Asset): AvaToEthTransferData => {\n if (!isErc20Asset(asset)) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED, `Wrong token type: ${asset.type}`);\n }\n const avaToken = config.avalancheTokens[asset.address.toLowerCase()];\n if (!avaToken || !assetsMatch(avaToken.token, asset)) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to find matching avalanche token in config: ${asset.symbol}`,\n );\n }\n\n const ethToken = config.ethereumTokens[avaToken.target.tokenAddress];\n\n if (!ethToken) {\n throw new InvalidParamsError(\n ErrorReason.ASSET_NOT_SUPPORTED,\n `Unable to get ethereum token in config: ${asset.symbol}`,\n );\n }\n\n return {\n source: avaToken,\n target: ethToken,\n ethToAva: false,\n };\n};\n\nexport const getTransferData = (\n {\n assetIn,\n sourceChainId,\n targetChainId,\n }: {\n assetIn: Asset;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n },\n config: EvmConfig,\n): TransferData => {\n if (sourceChainId === targetChainId) {\n throw new InvalidParamsError(\n ErrorReason.IDENTICAL_CHAINS_PROVIDED,\n `SourceChain and TargetChain need to be different network. But found the same chainId: ${sourceChainId}`,\n );\n }\n\n if (!isValidChainCombination(sourceChainId, targetChainId)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `SourceChain and TargetChain combination is not correct or the chains provided are not supported`,\n );\n }\n\n if (isNativeAsset(assetIn) && assetIn.symbol === ETH_TOKEN.symbol && isCaip2EthereumChainId(sourceChainId)) {\n return ethHandler(config);\n }\n\n if (isCaip2EthereumChainId(sourceChainId)) {\n return prepEthToAvaTransferData(config, assetIn);\n } else {\n return prepAvaToEthTransferData(config, assetIn);\n }\n};\n"],"mappings":"mWAUA,MAAM,EAAc,IACX,CACL,OAAQ,EAAO,kBAAkB,cACjC,OAAQ,EAAO,kBAAkB,eACjC,SAAU,GACX,EAGG,GAAe,EAAe,IAC3B,EAAe,EAAE,QAAS,EAAE,QAAQ,CAGvC,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAAC,EAAa,EAAM,CACtB,MAAM,IAAI,EAAmB,EAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,eAAe,EAAM,QAAQ,aAAa,EAClE,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAI,EACR,EAAY,oBACZ,qDAAqD,EAAM,SAC5D,CAGH,IAAM,EAAW,EAAO,gBAAgB,EAAS,OAAO,cAExD,GAAI,CAAC,EACH,MAAM,IAAI,EACR,EAAY,oBACZ,4CAA4C,EAAM,SACnD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGG,GAA4B,EAAmB,IAAuC,CAC1F,GAAI,CAAC,EAAa,EAAM,CACtB,MAAM,IAAI,EAAmB,EAAY,oBAAqB,qBAAqB,EAAM,OAAO,CAElG,IAAM,EAAW,EAAO,gBAAgB,EAAM,QAAQ,aAAa,EACnE,GAAI,CAAC,GAAY,CAAC,EAAY,EAAS,MAAO,EAAM,CAClD,MAAM,IAAI,EACR,EAAY,oBACZ,sDAAsD,EAAM,SAC7D,CAGH,IAAM,EAAW,EAAO,eAAe,EAAS,OAAO,cAEvD,GAAI,CAAC,EACH,MAAM,IAAI,EACR,EAAY,oBACZ,2CAA2C,EAAM,SAClD,CAGH,MAAO,CACL,OAAQ,EACR,OAAQ,EACR,SAAU,GACX,EAGU,GACX,CACE,UACA,gBACA,iBAMF,IACiB,CACjB,GAAI,IAAkB,EACpB,MAAM,IAAI,EACR,EAAY,0BACZ,yFAAyF,IAC1F,CAGH,GAAI,CAAC,EAAwB,EAAe,EAAc,CACxD,MAAM,IAAI,EACR,EAAY,eACZ,kGACD,CAUD,OAPE,EAAc,EAAQ,EAAI,EAAQ,SAAW,EAAU,QAAU,EAAuB,EAAc,CACjG,EAAW,EAAO,CAGvB,EAAuB,EAAc,CAChC,EAAyB,EAAQ,EAAQ,CAEzC,EAAyB,EAAQ,EAAQ"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/evm-address.cjs`),r=require(`../../../../utils/bitcoin-address.cjs`),i=require(`../../../../utils/quote-fees.cjs`),a=require(`./analyze-support.cjs`),o=require(`./get-minimum-transfer-amount.cjs`);function s({config:s}){let c=a.analyzeSupportFactory({config:s});return(a,l)=>{let u=new AbortController,d=()=>{u.abort()};return!c({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!r.isBech32AddressInNetwork(a.fromAddress,s.sourceChain===e.BitcoinChainIds.MAINNET)||!n.isEvmAddress(a.toAddress)?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),l(`done`)),{cancel:d}):((async()=>{let n=o.getMinimumTransferAmount();if(a.amount<n){u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),l(`done`));return}let r={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:a.amount,amountOut:a.amount-s.mintingFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:s.mintingFee,chainId:a.sourceChain.chainId,token:i.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTC_TO_BTCB,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};u.signal.aborted||(l(`quote`,r),l(`done`))})().catch(e=>{u.signal.aborted||(l(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),l(`done`))}),{cancel:d})}}exports.streamQuotesFactory=s;
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/bitcoin-address.cjs`),r=require(`../../../../utils/quote-fees.cjs`),i=require(`../../../../utils/evm-address.cjs`),a=require(`./analyze-support.cjs`),o=require(`./get-minimum-transfer-amount.cjs`);function s({config:s}){let c=a.analyzeSupportFactory({config:s});return(a,l)=>{let u=new AbortController,d=()=>{u.abort()};return!c({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!n.isBech32AddressInNetwork(a.fromAddress,s.sourceChain===e.BitcoinChainIds.MAINNET)||!i.isEvmAddress(a.toAddress)?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),l(`done`)),{cancel:d}):((async()=>{let n=o.getMinimumTransferAmount();if(a.amount<n){u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),l(`done`));return}let i={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:a.amount,amountOut:a.amount-s.mintingFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:s.mintingFee,chainId:a.sourceChain.chainId,token:r.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTC_TO_BTCB,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};u.signal.aborted||(l(`quote`,i),l(`done`))})().catch(e=>{u.signal.aborted||(l(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),l(`done`))}),{cancel:d})}}exports.streamQuotesFactory=s;
2
2
  //# sourceMappingURL=stream-quotes.cjs.map
@@ -1,2 +1,2 @@
1
- import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isEvmAddress as o}from"../../../../utils/evm-address.js";import{isBech32AddressInNetwork as s}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as c}from"../../../../utils/quote-fees.js";import{analyzeSupportFactory as l}from"./analyze-support.js";import{getMinimumTransferAmount as u}from"./get-minimum-transfer-amount.js";function d({config:d}){let f=l({config:d});return(l,p)=>{let m=new AbortController,h=()=>{m.abort()};return!f({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!s(l.fromAddress,d.sourceChain===e.MAINNET)||!o(l.toAddress)?(m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),p(`done`)),{cancel:h}):((async()=>{let e=u();if(l.amount<e){m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),p(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:l.amount,amountOut:l.amount-d.mintingFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:d.mintingFee,chainId:l.sourceChain.chainId,token:c(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTC_TO_BTCB,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};m.signal.aborted||(p(`quote`,n),p(`done`))})().catch(e=>{m.signal.aborted||(p(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),p(`done`))}),{cancel:h})}}export{d as streamQuotesFactory};
1
+ import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isBech32AddressInNetwork as o}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as s}from"../../../../utils/quote-fees.js";import{isEvmAddress as c}from"../../../../utils/evm-address.js";import{analyzeSupportFactory as l}from"./analyze-support.js";import{getMinimumTransferAmount as u}from"./get-minimum-transfer-amount.js";function d({config:d}){let f=l({config:d});return(l,p)=>{let m=new AbortController,h=()=>{m.abort()};return!f({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!o(l.fromAddress,d.sourceChain===e.MAINNET)||!c(l.toAddress)?(m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),p(`done`)),{cancel:h}):((async()=>{let e=u();if(l.amount<e){m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),p(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:l.amount,amountOut:l.amount-d.mintingFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:d.mintingFee,chainId:l.sourceChain.chainId,token:s(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTC_TO_BTCB,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};m.signal.aborted||(p(`quote`,n),p(`done`))})().catch(e=>{m.signal.aborted||(p(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),p(`done`))}),{cancel:h})}}export{d as streamQuotesFactory};
2
2
  //# sourceMappingURL=stream-quotes.js.map
@@ -1,2 +1,2 @@
1
- require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../errors.cjs`),t=require(`../../../_utils.cjs`),n=require(`../../constants.cjs`),r=require(`../../_utils/metadata.cjs`);let i=require(`viem`),a=require(`@lombard.finance/sdk`);function o({bitcoinFunctions:e,config:n}){return({transfer:r,updateListener:i})=>{let a=new AbortController,o=()=>{a.abort()};return r.status===`completed`||r.status===`failed`?{cancel:o,result:Promise.resolve(r)}:{cancel:o,result:(async()=>{let o=structuredClone(r),l=t.getEvmClientForChain({chain:r.targetChain});for(;!a.signal.aborted;){let r=o.status;switch(o.status){case`source-pending`:o=await s({bitcoinFunctions:e,currentTransfer:o,signal:a.signal}),a.signal.aborted||i(o);break;case`source-completed`:case`target-pending`:o=await c({config:n,currentTransfer:o,signal:a.signal,targetClient:l}),a.signal.aborted||i(o);break;default:return o}o.status===r&&await t.waitForTimeoutOrAbort({timeoutMs:3e4,signal:a.signal})}return o})()}}}async function s({bitcoinFunctions:e,currentTransfer:n,signal:r}){let i=await t.awaitOrAbort(e.getTransaction(n.source.txHash),r);if(i.status===`aborted`)return n;let{confirmations:a}=i.value;return a<n.source.requiredConfirmationCount?{...n,source:{...n.source,confirmationCount:a}}:{...n,source:{...n.source,confirmationCount:a},status:`source-completed`}}async function c({config:o,currentTransfer:s,signal:c,targetClient:l}){switch(s.status){case`source-completed`:{let i=await t.awaitOrAbort((0,a.getDepositsByAddress)({address:s.toAddress,env:o.env}),c);if(i.status===`aborted`)return s;let l=i.value.find(e=>e.txHash.toLowerCase()===s.source.txHash.toLowerCase());if(!l)return s;let{needsNotarizationUpdate:u,needsSessionStateUpdate:d}=r.getMetadataUpdates(s.metadata,l.notarizationStatus,l.sessionState);return u||d?{...s,metadata:{...s.metadata,...u&&{notarizationStatus:l.notarizationStatus},...d&&{sessionState:l.sessionState}}}:r.isDepositFailed(l)?{...s,errorCode:e.ErrorCode.NOTARIZATION_FAILED,failedAtMs:Date.now(),status:`failed`}:l.claimTxHash?{...s,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:n.EVM_CONFIRMATION_COUNT,startedAtMs:Date.now(),txHash:l.claimTxHash}}:s}default:{if(!s.target?.txHash)return{...s,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Missing target transaction hash`,failedAtMs:Date.now(),status:`failed`};let{confirmationCount:n,requiredConfirmationCount:r,txHash:a}=s.target;if(!(0,i.isHash)(a))return{...s,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let i=await t.awaitOrAbort(l.waitForTransactionReceipt({confirmations:Math.min(n+1,r),hash:a}),c);if(i.status===`aborted`)return s;let o=i.value;if(o.status===`reverted`)return{...s,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};let u=await l.getTransactionConfirmations({transactionReceipt:o}).then(e=>Number(e)).catch(()=>n+1);return u<r?{...s,target:{...s.target,confirmationCount:u}}:{...s,completedAtMs:Date.now(),status:`completed`,target:{...s.target,confirmationCount:u}}}catch(e){return{...s,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`}}}}}exports.trackTransferFactory=o;
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../errors.cjs`),t=require(`../../../_utils.cjs`),n=require(`../../constants.cjs`),r=require(`../../_utils/metadata.cjs`);let i=require(`viem`),a=require(`@lombard.finance/sdk`);function o({bitcoinFunctions:e,config:n}){return({transfer:r,updateListener:i})=>{let a=new AbortController,o=()=>{a.abort()};return r.status===`completed`||r.status===`failed`?{cancel:o,result:Promise.resolve(r)}:{cancel:o,result:(async()=>{let o=structuredClone(r),l=t.getEvmClientForChain({chain:r.targetChain});for(;!a.signal.aborted;){let r=o.status;switch(o.status){case`source-pending`:o=await s({bitcoinFunctions:e,currentTransfer:o,signal:a.signal}),a.signal.aborted||i(o);break;case`source-completed`:case`target-pending`:o=await c({config:n,currentTransfer:o,signal:a.signal,targetClient:l}),a.signal.aborted||i(o);break;default:return o}o.status===r&&await t.waitForTimeoutOrAbort({timeoutMs:3e4,signal:a.signal})}return o})()}}}async function s({bitcoinFunctions:e,currentTransfer:n,signal:r}){try{let i=await t.awaitOrAbort(e.getTransaction(n.source.txHash),r);if(i.status===`aborted`)return n;let{confirmations:a}=i.value;return a<n.source.requiredConfirmationCount?{...n,source:{...n.source,confirmationCount:a}}:{...n,source:{...n.source,confirmationCount:a},status:`source-completed`}}catch{return n}}async function c({config:o,currentTransfer:s,signal:c,targetClient:l}){switch(s.status){case`source-completed`:try{let i=await t.awaitOrAbort((0,a.getDepositsByAddress)({address:s.toAddress,env:o.env}),c);if(i.status===`aborted`)return s;let l=i.value.find(e=>e.txHash.toLowerCase()===s.source.txHash.toLowerCase());if(!l)return s;let{needsNotarizationUpdate:u,needsSessionStateUpdate:d}=r.getMetadataUpdates(s.metadata,l.notarizationStatus,l.sessionState);return u||d?{...s,metadata:{...s.metadata,...u&&{notarizationStatus:l.notarizationStatus},...d&&{sessionState:l.sessionState}}}:r.isDepositFailed(l)?{...s,errorCode:e.ErrorCode.NOTARIZATION_FAILED,errorReason:`Deposit notarization failed`,failedAtMs:Date.now(),status:`failed`}:l.claimTxHash?{...s,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:n.EVM_CONFIRMATION_COUNT,startedAtMs:Date.now(),txHash:l.claimTxHash}}:s}catch{return s}default:{if(!s.target?.txHash)return{...s,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Missing target transaction hash`,failedAtMs:Date.now(),status:`failed`};let{confirmationCount:n,requiredConfirmationCount:r,txHash:a}=s.target;if(!(0,i.isHash)(a))return{...s,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let i=await t.awaitOrAbort(l.waitForTransactionReceipt({confirmations:Math.min(n+1,r),hash:a}),c);if(i.status===`aborted`)return s;let o=i.value;if(o.status===`reverted`)return{...s,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Target transaction was reverted`,failedAtMs:Date.now(),status:`failed`};let u=await l.getTransactionConfirmations({transactionReceipt:o}).then(e=>Number(e)).catch(()=>n+1);return u<r?{...s,target:{...s.target,confirmationCount:u}}:{...s,completedAtMs:Date.now(),status:`completed`,target:{...s.target,confirmationCount:u}}}catch{return s}}}}exports.trackTransferFactory=o;
2
2
  //# sourceMappingURL=track-transfer.cjs.map