@avalabs/fusion-sdk 0.1.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.
- package/LICENSE +9 -0
- package/README.md +264 -0
- package/dist/_utils/chain.cjs +2 -0
- package/dist/_utils/chain.cjs.map +1 -0
- package/dist/_utils/chain.js +2 -0
- package/dist/_utils/chain.js.map +1 -0
- package/dist/_utils/math.cjs +2 -0
- package/dist/_utils/math.cjs.map +1 -0
- package/dist/_utils/math.js +2 -0
- package/dist/_utils/math.js.map +1 -0
- package/dist/_utils/merge-assets.cjs +2 -0
- package/dist/_utils/merge-assets.cjs.map +1 -0
- package/dist/_utils/merge-assets.js +2 -0
- package/dist/_utils/merge-assets.js.map +1 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/constants.cjs +2 -0
- package/dist/constants.cjs.map +1 -0
- package/dist/constants.d.cts +102 -0
- package/dist/constants.d.ts +102 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +115 -0
- package/dist/errors.d.ts +115 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/mod.cjs +1 -0
- package/dist/mod.d.cts +19 -0
- package/dist/mod.d.ts +19 -0
- package/dist/mod.js +1 -0
- package/dist/quoter/_utils.cjs +2 -0
- package/dist/quoter/_utils.cjs.map +1 -0
- package/dist/quoter/_utils.js +2 -0
- package/dist/quoter/_utils.js.map +1 -0
- package/dist/quoter/constants.cjs +2 -0
- package/dist/quoter/constants.cjs.map +1 -0
- package/dist/quoter/constants.js +2 -0
- package/dist/quoter/constants.js.map +1 -0
- package/dist/quoter/quoter.cjs +2 -0
- package/dist/quoter/quoter.cjs.map +1 -0
- package/dist/quoter/quoter.d.cts +31 -0
- package/dist/quoter/quoter.d.ts +34 -0
- package/dist/quoter/quoter.js +2 -0
- package/dist/quoter/quoter.js.map +1 -0
- package/dist/transfer-manager.cjs +2 -0
- package/dist/transfer-manager.cjs.map +1 -0
- package/dist/transfer-manager.d.cts +17 -0
- package/dist/transfer-manager.d.ts +17 -0
- package/dist/transfer-manager.js +2 -0
- package/dist/transfer-manager.js.map +1 -0
- package/dist/transfer-service/_abis.cjs +2 -0
- package/dist/transfer-service/_abis.cjs.map +1 -0
- package/dist/transfer-service/_abis.js +2 -0
- package/dist/transfer-service/_abis.js.map +1 -0
- package/dist/transfer-service/_evm-gas.cjs +2 -0
- package/dist/transfer-service/_evm-gas.cjs.map +1 -0
- package/dist/transfer-service/_evm-gas.js +2 -0
- package/dist/transfer-service/_evm-gas.js.map +1 -0
- package/dist/transfer-service/_tracking-utilities.cjs +2 -0
- package/dist/transfer-service/_tracking-utilities.cjs.map +1 -0
- package/dist/transfer-service/_tracking-utilities.js +2 -0
- package/dist/transfer-service/_tracking-utilities.js.map +1 -0
- package/dist/transfer-service/_transfer-utilities.cjs +2 -0
- package/dist/transfer-service/_transfer-utilities.cjs.map +1 -0
- package/dist/transfer-service/_transfer-utilities.js +2 -0
- package/dist/transfer-service/_transfer-utilities.js.map +1 -0
- package/dist/transfer-service/_utils.cjs +2 -0
- package/dist/transfer-service/_utils.cjs.map +1 -0
- package/dist/transfer-service/_utils.js +2 -0
- package/dist/transfer-service/_utils.js.map +1 -0
- package/dist/transfer-service/_warden-config-schema.cjs +2 -0
- package/dist/transfer-service/_warden-config-schema.cjs.map +1 -0
- package/dist/transfer-service/_warden-config-schema.js +2 -0
- package/dist/transfer-service/_warden-config-schema.js.map +1 -0
- package/dist/transfer-service/_warden-config.cjs +2 -0
- package/dist/transfer-service/_warden-config.cjs.map +1 -0
- package/dist/transfer-service/_warden-config.js +2 -0
- package/dist/transfer-service/_warden-config.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_constants.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_constants.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_constants.js +2 -0
- package/dist/transfer-service/avalanche-evm/_constants.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/fee.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/fee.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/fee.js +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/fee.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/get-config.js +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/get-config.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/unwrap.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/unwrap.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/unwrap.js +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/unwrap.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/validations.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/validations.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/validations.js +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/validations.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/_utils/wrap.js +2 -0
- package/dist/transfer-service/avalanche-evm/_utils/wrap.js.map +1 -0
- package/dist/transfer-service/avalanche-evm/avalanche-evm-service.cjs +2 -0
- package/dist/transfer-service/avalanche-evm/avalanche-evm-service.cjs.map +1 -0
- package/dist/transfer-service/avalanche-evm/avalanche-evm-service.js +2 -0
- package/dist/transfer-service/avalanche-evm/avalanche-evm-service.js.map +1 -0
- package/dist/transfer-service/fetch-utilities.cjs +4 -0
- package/dist/transfer-service/fetch-utilities.cjs.map +1 -0
- package/dist/transfer-service/fetch-utilities.js +4 -0
- package/dist/transfer-service/fetch-utilities.js.map +1 -0
- package/dist/transfer-service/lombard/_schema.cjs +2 -0
- package/dist/transfer-service/lombard/_schema.cjs.map +1 -0
- package/dist/transfer-service/lombard/_schema.js +2 -0
- package/dist/transfer-service/lombard/_schema.js.map +1 -0
- package/dist/transfer-service/lombard/_utils/asset.cjs +2 -0
- package/dist/transfer-service/lombard/_utils/asset.cjs.map +1 -0
- package/dist/transfer-service/lombard/_utils/asset.js +2 -0
- package/dist/transfer-service/lombard/_utils/asset.js.map +1 -0
- package/dist/transfer-service/lombard/_utils/chain.cjs +2 -0
- package/dist/transfer-service/lombard/_utils/chain.cjs.map +1 -0
- package/dist/transfer-service/lombard/_utils/chain.js +2 -0
- package/dist/transfer-service/lombard/_utils/chain.js.map +1 -0
- package/dist/transfer-service/lombard/_utils/fee.cjs +2 -0
- package/dist/transfer-service/lombard/_utils/fee.cjs.map +1 -0
- package/dist/transfer-service/lombard/_utils/fee.js +2 -0
- package/dist/transfer-service/lombard/_utils/fee.js.map +1 -0
- package/dist/transfer-service/lombard/_utils/metadata.cjs +2 -0
- package/dist/transfer-service/lombard/_utils/metadata.cjs.map +1 -0
- package/dist/transfer-service/lombard/_utils/metadata.js +2 -0
- package/dist/transfer-service/lombard/_utils/metadata.js.map +1 -0
- package/dist/transfer-service/lombard/_utils/utxo.cjs +2 -0
- package/dist/transfer-service/lombard/_utils/utxo.cjs.map +1 -0
- package/dist/transfer-service/lombard/_utils/utxo.js +2 -0
- package/dist/transfer-service/lombard/_utils/utxo.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb-service.cjs +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb-service.cjs.map +1 -0
- package/dist/transfer-service/lombard/btc-to-btcb-service.js +2 -0
- package/dist/transfer-service/lombard/btc-to-btcb-service.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc-service.cjs +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc-service.cjs.map +1 -0
- package/dist/transfer-service/lombard/btcb-to-btc-service.js +2 -0
- package/dist/transfer-service/lombard/btcb-to-btc-service.js.map +1 -0
- package/dist/transfer-service/lombard/constants.cjs +2 -0
- package/dist/transfer-service/lombard/constants.cjs.map +1 -0
- package/dist/transfer-service/lombard/constants.js +2 -0
- package/dist/transfer-service/lombard/constants.js.map +1 -0
- package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs +2 -0
- package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs.map +1 -0
- package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js +2 -0
- package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js.map +1 -0
- package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs +2 -0
- package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs.map +1 -0
- package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js +2 -0
- package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js.map +1 -0
- package/dist/transfer-service/markr/_api.cjs +2 -0
- package/dist/transfer-service/markr/_api.cjs.map +1 -0
- package/dist/transfer-service/markr/_api.js +2 -0
- package/dist/transfer-service/markr/_api.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/markr/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/get-assets.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/get-assets.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/get-assets.js +2 -0
- package/dist/transfer-service/markr/_handlers/get-assets.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/markr/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/markr/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/markr/_schema.cjs +2 -0
- package/dist/transfer-service/markr/_schema.cjs.map +1 -0
- package/dist/transfer-service/markr/_schema.js +2 -0
- package/dist/transfer-service/markr/_schema.js.map +1 -0
- package/dist/transfer-service/markr/_type-guards.cjs +2 -0
- package/dist/transfer-service/markr/_type-guards.cjs.map +1 -0
- package/dist/transfer-service/markr/_type-guards.js +2 -0
- package/dist/transfer-service/markr/_type-guards.js.map +1 -0
- package/dist/transfer-service/markr/_utils.cjs +2 -0
- package/dist/transfer-service/markr/_utils.cjs.map +1 -0
- package/dist/transfer-service/markr/_utils.js +2 -0
- package/dist/transfer-service/markr/_utils.js.map +1 -0
- package/dist/transfer-service/markr/constants.cjs +2 -0
- package/dist/transfer-service/markr/constants.cjs.map +1 -0
- package/dist/transfer-service/markr/constants.js +2 -0
- package/dist/transfer-service/markr/constants.js.map +1 -0
- package/dist/transfer-service/markr/markr-service.cjs +2 -0
- package/dist/transfer-service/markr/markr-service.cjs.map +1 -0
- package/dist/transfer-service/markr/markr-service.js +2 -0
- package/dist/transfer-service/markr/markr-service.js.map +1 -0
- package/dist/transfer-service/service-schemas.cjs +2 -0
- package/dist/transfer-service/service-schemas.cjs.map +1 -0
- package/dist/transfer-service/service-schemas.js +2 -0
- package/dist/transfer-service/service-schemas.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_utils.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/_utils.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/_utils.js +2 -0
- package/dist/transfer-service/wrap-unwrap/_utils.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/constants.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/constants.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/constants.js +2 -0
- package/dist/transfer-service/wrap-unwrap/constants.js.map +1 -0
- package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs +2 -0
- package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs.map +1 -0
- package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js +2 -0
- package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js.map +1 -0
- package/dist/type-guards.cjs +2 -0
- package/dist/type-guards.cjs.map +1 -0
- package/dist/type-guards.d.cts +16 -0
- package/dist/type-guards.d.ts +16 -0
- package/dist/type-guards.js +2 -0
- package/dist/type-guards.js.map +1 -0
- package/dist/types/asset.d.cts +61 -0
- package/dist/types/asset.d.ts +61 -0
- package/dist/types/bitcoin.d.cts +66 -0
- package/dist/types/bitcoin.d.ts +66 -0
- package/dist/types/caip.d.cts +30 -0
- package/dist/types/caip.d.ts +30 -0
- package/dist/types/chain.d.cts +17 -0
- package/dist/types/chain.d.ts +17 -0
- package/dist/types/fee.d.cts +13 -0
- package/dist/types/fee.d.ts +13 -0
- package/dist/types/quote.d.cts +140 -0
- package/dist/types/quote.d.ts +140 -0
- package/dist/types/service.d.cts +224 -0
- package/dist/types/service.d.ts +224 -0
- package/dist/types/signer.d.cts +50 -0
- package/dist/types/signer.d.ts +50 -0
- package/dist/types/transfer-manager.d.cts +115 -0
- package/dist/types/transfer-manager.d.ts +115 -0
- package/dist/types/transfer.d.cts +107 -0
- package/dist/types/transfer.d.ts +107 -0
- package/dist/types/utility-types.d.cts +21 -0
- package/dist/types/utility-types.d.ts +21 -0
- package/dist/utils/bitcoin-address.cjs +2 -0
- package/dist/utils/bitcoin-address.cjs.map +1 -0
- package/dist/utils/bitcoin-address.js +2 -0
- package/dist/utils/bitcoin-address.js.map +1 -0
- package/dist/utils/caip.cjs +2 -0
- package/dist/utils/caip.cjs.map +1 -0
- package/dist/utils/caip.d.cts +49 -0
- package/dist/utils/caip.d.ts +49 -0
- package/dist/utils/caip.js +2 -0
- package/dist/utils/caip.js.map +1 -0
- package/dist/utils/evm-address.cjs +2 -0
- package/dist/utils/evm-address.cjs.map +1 -0
- package/dist/utils/evm-address.js +2 -0
- package/dist/utils/evm-address.js.map +1 -0
- package/dist/utils/quote-fees.cjs +2 -0
- package/dist/utils/quote-fees.cjs.map +1 -0
- package/dist/utils/quote-fees.js +2 -0
- package/dist/utils/quote-fees.js.map +1 -0
- package/dist/utils/sol-address.cjs +2 -0
- package/dist/utils/sol-address.cjs.map +1 -0
- package/dist/utils/sol-address.js +2 -0
- package/dist/utils/sol-address.js.map +1 -0
- package/dist/utils/solana-transaction.d.cts +15 -0
- package/dist/utils/solana-transaction.d.ts +17 -0
- package/dist/utils/transfer-utils.cjs +2 -0
- package/dist/utils/transfer-utils.cjs.map +1 -0
- package/dist/utils/transfer-utils.d.cts +8 -0
- package/dist/utils/transfer-utils.d.ts +8 -0
- package/dist/utils/transfer-utils.js +2 -0
- package/dist/utils/transfer-utils.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=track-transfer.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../_utils/validations.cjs`),i=require(`../../_utils.cjs`),a=require(`../_utils/transfer-data.cjs`),o=require(`./get-minimum-transfer-amount.cjs`),s=require(`../_utils/unwrap.cjs`),c=require(`../_utils/wrap.cjs`);let l=require(`viem`);function u({config:u,evmSigner:d,feeEstimationMultiplier:f}){return async({gasSettings:p,onStepChange:m,quote:h})=>{if(!(0,l.isAddress)(h.fromAddress)||!(0,l.isAddress)(h.toAddress))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");r.validateTransferAddressesOrThrow(h.fromAddress,h.toAddress),r.validateTransferAddressesNotBlockedOrThrow([h.fromAddress,h.toAddress],u.addressBlocklist),r.validateChainCombinationOrThrow(h.sourceChain.chainId,h.targetChain.chainId);let g=await o.getMinimumTransferAmountFactory({config:u,feeEstimationMultiplier:f})({sourceAsset:h.assetIn,sourceChainId:h.sourceChain.chainId,targetAsset:h.assetOut,targetChainId:h.targetChain.chainId});if(h.amountIn<g)throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${g.toString()}`);let{ethToAva:_,source:v}=a.getTransferData({assetIn:h.assetIn,sourceChainId:h.sourceChain.chainId,targetChainId:h.targetChain.chainId},u),y=Date.now(),b,x,S=i.getEvmClientForChain({chain:h.targetChain}),C;try{C=await S.getBlockNumber()}catch{}_?[b,x]=await c.transferAssetFromEthToAva({amountIn:h.amountIn,assetIn:h.assetIn,evmConfig:u,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,targetChain:h.targetChain,gasSettings:p,onStepChange:m,quote:h}):[b,x]=await s.transferAssetFromAvaToEth({amountIn:h.amountIn,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,gasSettings:p,onStepChange:m,quote:h});let w=n.isAvalancheChain(h.sourceChain)?u.minimumConfirmations.avalanche:u.minimumConfirmations.ethereum;return x.status===`reverted`?{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,errorCode:t.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:w,startedAtMs:y,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`failed`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}:{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:w,startedAtMs:y,targetStartBlockNumber:C,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`source-pending`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}}}exports.transferAssetFactory=u;
|
|
2
|
+
//# sourceMappingURL=transfer-asset.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-asset.cjs","names":["InvalidParamsError","ErrorReason","getMinimumTransferAmountFactory","getTransferData","getEvmClientForChain","transferAssetFromEthToAva","transferAssetFromAvaToEth","isAvalancheChain","ErrorCode","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/transfer-asset.ts"],"sourcesContent":["import { isAddress as isEvmAddress, type Hex, type TransactionReceipt } from 'viem';\nimport type { EvmConfig } from '../_types';\nimport { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { EvmSigner } from '../../../types/signer';\nimport type { FailedTransfer, SourcePendingTransfer } from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport {\n validateChainCombinationOrThrow,\n validateTransferAddressesNotBlockedOrThrow,\n validateTransferAddressesOrThrow,\n} from '../_utils/validations';\nimport { getMinimumTransferAmountFactory } from './get-minimum-transfer-amount';\nimport { getTransferData } from '../_utils/transfer-data';\nimport { getEvmClientForChain } from '../../_utils';\nimport { isAvalancheChain } from '../../../_utils/chain';\nimport { transferAssetFromAvaToEth } from '../_utils/unwrap';\nimport { transferAssetFromEthToAva } from '../_utils/wrap';\n\nexport interface TransferAssetFactoryConfig {\n config: EvmConfig;\n evmSigner: EvmSigner;\n feeEstimationMultiplier: bigint;\n}\n\nexport function transferAssetFactory({\n config,\n evmSigner,\n feeEstimationMultiplier,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ gasSettings, onStepChange, quote }) => {\n // 1. Addresses must be EVM and valid.\n if (!isEvmAddress(quote.fromAddress) || !isEvmAddress(quote.toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n '`fromAddress` and `toAddress` must be valid EVM addresses.',\n );\n }\n\n // 2. Validate quote addresses are identical\n // Avalanche EVM bridge requires fromAddress and toAddress to be the same.\n validateTransferAddressesOrThrow(quote.fromAddress, quote.toAddress);\n\n // 3. Ensure addresses are not blocklisted\n validateTransferAddressesNotBlockedOrThrow([quote.fromAddress, quote.toAddress], config.addressBlocklist);\n\n // 4. Validate chain combination is supported\n validateChainCombinationOrThrow(quote.sourceChain.chainId, quote.targetChain.chainId);\n\n // 5. Amount must be greater than minimum transfer amount\n const minimumAmount = await getMinimumTransferAmountFactory({ config, feeEstimationMultiplier })({\n sourceAsset: quote.assetIn,\n sourceChainId: quote.sourceChain.chainId,\n targetAsset: quote.assetOut,\n targetChainId: quote.targetChain.chainId,\n });\n\n if (quote.amountIn < minimumAmount) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}`,\n );\n }\n\n // 6. Proceed with transfer\n const { ethToAva, source } = getTransferData(\n {\n assetIn: quote.assetIn,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n },\n config,\n );\n\n const sourceStartedAtMs = Date.now();\n let txHash: Hex;\n let sourceReceipt: TransactionReceipt;\n const targetClient = getEvmClientForChain({ chain: quote.targetChain });\n let targetStartBlockNumber: bigint | undefined;\n\n // Grab the target start block number for tracking BEFORE the transfer is initiated to avoid race conditions\n try {\n targetStartBlockNumber = await targetClient.getBlockNumber();\n } catch {\n // TODO: Add logger?\n }\n\n if (ethToAva) {\n // Wrap asset (Ethereum -> Avalanche)\n [txHash, sourceReceipt] = await transferAssetFromEthToAva({\n amountIn: quote.amountIn,\n assetIn: quote.assetIn,\n evmConfig: config,\n fromAddress: quote.fromAddress,\n sign: evmSigner.sign,\n source,\n sourceChain: quote.sourceChain,\n targetChain: quote.targetChain,\n gasSettings,\n onStepChange,\n quote,\n });\n } else {\n // Unwrap asset (Avalanche -> Ethereum)\n [txHash, sourceReceipt] = await transferAssetFromAvaToEth({\n amountIn: quote.amountIn,\n fromAddress: quote.fromAddress,\n sign: evmSigner.sign,\n source,\n sourceChain: quote.sourceChain,\n gasSettings,\n onStepChange,\n quote,\n });\n }\n\n const sourceRequiredConfirmationCount = isAvalancheChain(quote.sourceChain)\n ? config.minimumConfirmations.avalanche\n : config.minimumConfirmations.ethereum;\n\n if (sourceReceipt.status === 'reverted') {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: sourceRequiredConfirmationCount,\n startedAtMs: sourceStartedAtMs,\n txHash,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.AVALANCHE_EVM,\n } satisfies FailedTransfer;\n }\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 1, // This is 1 because of the receipt confirmation done in the transfer functions\n requiredConfirmationCount: sourceRequiredConfirmationCount,\n startedAtMs: sourceStartedAtMs,\n targetStartBlockNumber,\n txHash,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.AVALANCHE_EVM,\n } satisfies SourcePendingTransfer;\n };\n}\n"],"mappings":"0ZAyBA,SAAgB,EAAqB,CACnC,SACA,YACA,2BAC+D,CAC/D,OAAO,MAAO,CAAE,cAAa,eAAc,WAAY,CAErD,GAAI,EAAA,EAAA,EAAA,WAAc,EAAM,YAAY,EAAI,EAAA,EAAA,EAAA,WAAc,EAAM,UAAU,CACpE,MAAM,IAAIA,EAAAA,mBACRC,EAAAA,YAAY,eACZ,6DACD,CAKH,EAAA,iCAAiC,EAAM,YAAa,EAAM,UAAU,CAGpE,EAAA,2CAA2C,CAAC,EAAM,YAAa,EAAM,UAAU,CAAE,EAAO,iBAAiB,CAGzG,EAAA,gCAAgC,EAAM,YAAY,QAAS,EAAM,YAAY,QAAQ,CAGrF,IAAM,EAAgB,MAAMC,EAAAA,gCAAgC,CAAE,SAAQ,0BAAyB,CAAC,CAAC,CAC/F,YAAa,EAAM,QACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,SACnB,cAAe,EAAM,YAAY,QAClC,CAAC,CAEF,GAAI,EAAM,SAAW,EACnB,MAAM,IAAIF,EAAAA,mBACRC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,GACpF,CAIH,GAAM,CAAE,WAAU,UAAWE,EAAAA,gBAC3B,CACE,QAAS,EAAM,QACf,cAAe,EAAM,YAAY,QACjC,cAAe,EAAM,YAAY,QAClC,CACD,EACD,CAEK,EAAoB,KAAK,KAAK,CAChC,EACA,EACE,EAAeC,EAAAA,qBAAqB,CAAE,MAAO,EAAM,YAAa,CAAC,CACnE,EAGJ,GAAI,CACF,EAAyB,MAAM,EAAa,gBAAgB,MACtD,EAIJ,EAEF,CAAC,EAAQ,GAAiB,MAAMC,EAAAA,0BAA0B,CACxD,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,UAAW,EACX,YAAa,EAAM,YACnB,KAAM,EAAU,KAChB,SACA,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,cACA,eACA,QACD,CAAC,CAGF,CAAC,EAAQ,GAAiB,MAAMC,EAAAA,0BAA0B,CACxD,SAAU,EAAM,SAChB,YAAa,EAAM,YACnB,KAAM,EAAU,KAChB,SACA,YAAa,EAAM,YACnB,cACA,eACA,QACD,CAAC,CAGJ,IAAM,EAAkCC,EAAAA,iBAAiB,EAAM,YAAY,CACvE,EAAO,qBAAqB,UAC5B,EAAO,qBAAqB,SA6BhC,OA3BI,EAAc,SAAW,WACpB,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAO,YACpB,UAAWC,EAAAA,UAAU,qBACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,SACD,CACD,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAMC,EAAAA,YAAY,cACnB,CAGI,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAO,YACpB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,yBACA,SACD,CACD,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,iBACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAMA,EAAAA,YAAY,cACnB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r}from"../../../errors.js";import{isAvalancheChain as i}from"../../../_utils/chain.js";import{validateChainCombinationOrThrow as a,validateTransferAddressesNotBlockedOrThrow as o,validateTransferAddressesOrThrow as s}from"../_utils/validations.js";import{getEvmClientForChain as c}from"../../_utils.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{getMinimumTransferAmountFactory as u}from"./get-minimum-transfer-amount.js";import{transferAssetFromAvaToEth as d}from"../_utils/unwrap.js";import{transferAssetFromEthToAva as f}from"../_utils/wrap.js";import{isAddress as p}from"viem";function m({config:m,evmSigner:h,feeEstimationMultiplier:g}){return async({gasSettings:_,onStepChange:v,quote:y})=>{if(!p(y.fromAddress)||!p(y.toAddress))throw new r(n.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");s(y.fromAddress,y.toAddress),o([y.fromAddress,y.toAddress],m.addressBlocklist),a(y.sourceChain.chainId,y.targetChain.chainId);let b=await u({config:m,feeEstimationMultiplier:g})({sourceAsset:y.assetIn,sourceChainId:y.sourceChain.chainId,targetAsset:y.assetOut,targetChainId:y.targetChain.chainId});if(y.amountIn<b)throw new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${b.toString()}`);let{ethToAva:x,source:S}=l({assetIn:y.assetIn,sourceChainId:y.sourceChain.chainId,targetChainId:y.targetChain.chainId},m),C=Date.now(),w,T,E=c({chain:y.targetChain}),D;try{D=await E.getBlockNumber()}catch{}x?[w,T]=await f({amountIn:y.amountIn,assetIn:y.assetIn,evmConfig:m,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,targetChain:y.targetChain,gasSettings:_,onStepChange:v,quote:y}):[w,T]=await d({amountIn:y.amountIn,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,gasSettings:_,onStepChange:v,quote:y});let O=i(y.sourceChain)?m.minimumConfirmations.avalanche:m.minimumConfirmations.ethereum;return T.status===`reverted`?{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,errorCode:t.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:O,startedAtMs:C,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`failed`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}:{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:O,startedAtMs:C,targetStartBlockNumber:D,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`source-pending`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}}}export{m as transferAssetFactory};
|
|
2
|
+
//# sourceMappingURL=transfer-asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-asset.js","names":["isEvmAddress"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/transfer-asset.ts"],"sourcesContent":["import { isAddress as isEvmAddress, type Hex, type TransactionReceipt } from 'viem';\nimport type { EvmConfig } from '../_types';\nimport { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { EvmSigner } from '../../../types/signer';\nimport type { FailedTransfer, SourcePendingTransfer } from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport {\n validateChainCombinationOrThrow,\n validateTransferAddressesNotBlockedOrThrow,\n validateTransferAddressesOrThrow,\n} from '../_utils/validations';\nimport { getMinimumTransferAmountFactory } from './get-minimum-transfer-amount';\nimport { getTransferData } from '../_utils/transfer-data';\nimport { getEvmClientForChain } from '../../_utils';\nimport { isAvalancheChain } from '../../../_utils/chain';\nimport { transferAssetFromAvaToEth } from '../_utils/unwrap';\nimport { transferAssetFromEthToAva } from '../_utils/wrap';\n\nexport interface TransferAssetFactoryConfig {\n config: EvmConfig;\n evmSigner: EvmSigner;\n feeEstimationMultiplier: bigint;\n}\n\nexport function transferAssetFactory({\n config,\n evmSigner,\n feeEstimationMultiplier,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ gasSettings, onStepChange, quote }) => {\n // 1. Addresses must be EVM and valid.\n if (!isEvmAddress(quote.fromAddress) || !isEvmAddress(quote.toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n '`fromAddress` and `toAddress` must be valid EVM addresses.',\n );\n }\n\n // 2. Validate quote addresses are identical\n // Avalanche EVM bridge requires fromAddress and toAddress to be the same.\n validateTransferAddressesOrThrow(quote.fromAddress, quote.toAddress);\n\n // 3. Ensure addresses are not blocklisted\n validateTransferAddressesNotBlockedOrThrow([quote.fromAddress, quote.toAddress], config.addressBlocklist);\n\n // 4. Validate chain combination is supported\n validateChainCombinationOrThrow(quote.sourceChain.chainId, quote.targetChain.chainId);\n\n // 5. Amount must be greater than minimum transfer amount\n const minimumAmount = await getMinimumTransferAmountFactory({ config, feeEstimationMultiplier })({\n sourceAsset: quote.assetIn,\n sourceChainId: quote.sourceChain.chainId,\n targetAsset: quote.assetOut,\n targetChainId: quote.targetChain.chainId,\n });\n\n if (quote.amountIn < minimumAmount) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}`,\n );\n }\n\n // 6. Proceed with transfer\n const { ethToAva, source } = getTransferData(\n {\n assetIn: quote.assetIn,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n },\n config,\n );\n\n const sourceStartedAtMs = Date.now();\n let txHash: Hex;\n let sourceReceipt: TransactionReceipt;\n const targetClient = getEvmClientForChain({ chain: quote.targetChain });\n let targetStartBlockNumber: bigint | undefined;\n\n // Grab the target start block number for tracking BEFORE the transfer is initiated to avoid race conditions\n try {\n targetStartBlockNumber = await targetClient.getBlockNumber();\n } catch {\n // TODO: Add logger?\n }\n\n if (ethToAva) {\n // Wrap asset (Ethereum -> Avalanche)\n [txHash, sourceReceipt] = await transferAssetFromEthToAva({\n amountIn: quote.amountIn,\n assetIn: quote.assetIn,\n evmConfig: config,\n fromAddress: quote.fromAddress,\n sign: evmSigner.sign,\n source,\n sourceChain: quote.sourceChain,\n targetChain: quote.targetChain,\n gasSettings,\n onStepChange,\n quote,\n });\n } else {\n // Unwrap asset (Avalanche -> Ethereum)\n [txHash, sourceReceipt] = await transferAssetFromAvaToEth({\n amountIn: quote.amountIn,\n fromAddress: quote.fromAddress,\n sign: evmSigner.sign,\n source,\n sourceChain: quote.sourceChain,\n gasSettings,\n onStepChange,\n quote,\n });\n }\n\n const sourceRequiredConfirmationCount = isAvalancheChain(quote.sourceChain)\n ? config.minimumConfirmations.avalanche\n : config.minimumConfirmations.ethereum;\n\n if (sourceReceipt.status === 'reverted') {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: sourceRequiredConfirmationCount,\n startedAtMs: sourceStartedAtMs,\n txHash,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.AVALANCHE_EVM,\n } satisfies FailedTransfer;\n }\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 1, // This is 1 because of the receipt confirmation done in the transfer functions\n requiredConfirmationCount: sourceRequiredConfirmationCount,\n startedAtMs: sourceStartedAtMs,\n targetStartBlockNumber,\n txHash,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.AVALANCHE_EVM,\n } satisfies SourcePendingTransfer;\n };\n}\n"],"mappings":"+sBAyBA,SAAgB,EAAqB,CACnC,SACA,YACA,2BAC+D,CAC/D,OAAO,MAAO,CAAE,cAAa,eAAc,WAAY,CAErD,GAAI,CAACA,EAAa,EAAM,YAAY,EAAI,CAACA,EAAa,EAAM,UAAU,CACpE,MAAM,IAAI,EACR,EAAY,eACZ,6DACD,CAKH,EAAiC,EAAM,YAAa,EAAM,UAAU,CAGpE,EAA2C,CAAC,EAAM,YAAa,EAAM,UAAU,CAAE,EAAO,iBAAiB,CAGzG,EAAgC,EAAM,YAAY,QAAS,EAAM,YAAY,QAAQ,CAGrF,IAAM,EAAgB,MAAM,EAAgC,CAAE,SAAQ,0BAAyB,CAAC,CAAC,CAC/F,YAAa,EAAM,QACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,SACnB,cAAe,EAAM,YAAY,QAClC,CAAC,CAEF,GAAI,EAAM,SAAW,EACnB,MAAM,IAAI,EACR,EAAY,eACZ,2DAA2D,EAAc,UAAU,GACpF,CAIH,GAAM,CAAE,WAAU,UAAW,EAC3B,CACE,QAAS,EAAM,QACf,cAAe,EAAM,YAAY,QACjC,cAAe,EAAM,YAAY,QAClC,CACD,EACD,CAEK,EAAoB,KAAK,KAAK,CAChC,EACA,EACE,EAAe,EAAqB,CAAE,MAAO,EAAM,YAAa,CAAC,CACnE,EAGJ,GAAI,CACF,EAAyB,MAAM,EAAa,gBAAgB,MACtD,EAIJ,EAEF,CAAC,EAAQ,GAAiB,MAAM,EAA0B,CACxD,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,UAAW,EACX,YAAa,EAAM,YACnB,KAAM,EAAU,KAChB,SACA,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,cACA,eACA,QACD,CAAC,CAGF,CAAC,EAAQ,GAAiB,MAAM,EAA0B,CACxD,SAAU,EAAM,SAChB,YAAa,EAAM,YACnB,KAAM,EAAU,KAChB,SACA,YAAa,EAAM,YACnB,cACA,eACA,QACD,CAAC,CAGJ,IAAM,EAAkC,EAAiB,EAAM,YAAY,CACvE,EAAO,qBAAqB,UAC5B,EAAO,qBAAqB,SA6BhC,OA3BI,EAAc,SAAW,WACpB,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAO,YACpB,UAAW,EAAU,qBACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,SACD,CACD,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAY,cACnB,CAGI,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAO,YACpB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,yBACA,SACD,CACD,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,iBACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAY,cACnB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../../errors.cjs`),t=require(`./transfer-data.cjs`),n=require(`../../_warden-config-schema.cjs`);function r(e){try{return n.DynamicFeeEstimation.parse(e),!0}catch{return!1}}const i=(e,{max:t,min:n})=>e>t?t:e<n?n:e;function a(e,t){let n=10n**BigInt(t.feePercentageDecimals);return i(e*BigInt(t.feePercentage)/(n*100n),{max:t.maximumFeeAmount,min:t.minimumFeeAmount})}function o({amountIn:n,evmConfig:i,sourceAsset:o,sourceChainId:s,targetChainId:c}){if(n<=0n)throw new e.InvalidParamsError(e.ErrorReason.INCORRECT_AMOUNT_PROVIDED,`Amount must be greater than zero`);let{ethToAva:l,source:u}=t.getTransferData({assetIn:o,sourceChainId:s,targetChainId:c},i),d=l?u.wrapFeeApproximation:u.unwrapFeeApproximation;return r(d)?[a(n,d),d.feePercentage,d.feePercentageDecimals]:[d??0n,0,0]}exports.getFee=o,exports.isDynamicFee=r;
|
|
2
|
+
//# sourceMappingURL=fee.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee.cjs","names":["InvalidParamsError","ErrorReason","getTransferData"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/fee.ts"],"sourcesContent":["import { DynamicFeeEstimation } from '../../_warden-config-schema';\nimport type { EvmConfig, FeeApproximation } from '../_types';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getTransferData } from './transfer-data';\n\nexport function isDynamicFee(\n feeApproximation: FeeApproximation | string | bigint | undefined,\n): feeApproximation is FeeApproximation {\n try {\n DynamicFeeEstimation.parse(feeApproximation);\n return true;\n } catch {\n return false;\n }\n}\n\nconst capped = (value: bigint, { max, min }: { max: bigint; min: bigint }): bigint => {\n if (value > max) {\n return max;\n }\n if (value < min) {\n return min;\n }\n return value;\n};\n\n/**\n * Calculates the fee amount for Avalanche Bridge transactions\n * based on the provided fee approximation parameters.\n *\n * Fee is calculated by applying the fee percentage to the amount, then capping it between\n * the minimum and maximum fee amounts specified in the fee approximation.\n *\n * Fees are rounded up to the nearest whole number.\n */\nexport function getDynamicFeeAmount(amount: bigint, feeApproximation: FeeApproximation): bigint {\n const percentageBase = 10n ** BigInt(feeApproximation.feePercentageDecimals);\n const feeNumerator = amount * BigInt(feeApproximation.feePercentage);\n const feeDenominator = percentageBase * 100n;\n\n const fee = feeNumerator / feeDenominator;\n\n return capped(fee, {\n max: feeApproximation.maximumFeeAmount,\n min: feeApproximation.minimumFeeAmount,\n });\n}\n\n/**\n * Get the fee amount, fee percentage, and fee percentage decimals for an Avalanche Bridge transfer.\n */\nexport function getFee({\n amountIn,\n evmConfig,\n sourceAsset,\n sourceChainId,\n targetChainId,\n}: {\n amountIn: bigint;\n evmConfig: EvmConfig;\n sourceAsset: Asset;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n}): [feeAmount: bigint, feePercentage: number, feePercentageDecimals: number] {\n if (amountIn <= 0n) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_AMOUNT_PROVIDED, 'Amount must be greater than zero');\n }\n\n const { ethToAva, source } = getTransferData({ assetIn: sourceAsset, sourceChainId, targetChainId }, evmConfig);\n\n const feeApproximation = ethToAva ? source.wrapFeeApproximation : source.unwrapFeeApproximation;\n\n if (isDynamicFee(feeApproximation)) {\n const fee = getDynamicFeeAmount(amountIn, feeApproximation);\n\n return [fee, feeApproximation.feePercentage, feeApproximation.feePercentageDecimals];\n }\n\n const fee = feeApproximation ?? 0n;\n\n // Handle better? Or remove if no static config.\n return [fee, 0, 0];\n}\n"],"mappings":"qHAOA,SAAgB,EACd,EACsC,CACtC,GAAI,CAEF,OADA,EAAA,qBAAqB,MAAM,EAAiB,CACrC,QACD,CACN,MAAO,IAIX,MAAM,GAAU,EAAe,CAAE,MAAK,SAChC,EAAQ,EACH,EAEL,EAAQ,EACH,EAEF,EAYT,SAAgB,EAAoB,EAAgB,EAA4C,CAC9F,IAAM,EAAiB,KAAO,OAAO,EAAiB,sBAAsB,CAM5E,OAAO,EALc,EAAS,OAAO,EAAiB,cAAc,EAC7C,EAAiB,MAIrB,CACjB,IAAK,EAAiB,iBACtB,IAAK,EAAiB,iBACvB,CAAC,CAMJ,SAAgB,EAAO,CACrB,WACA,YACA,cACA,gBACA,iBAO4E,CAC5E,GAAI,GAAY,GACd,MAAM,IAAIA,EAAAA,mBAAmBC,EAAAA,YAAY,0BAA2B,mCAAmC,CAGzG,GAAM,CAAE,WAAU,UAAWC,EAAAA,gBAAgB,CAAE,QAAS,EAAa,gBAAe,gBAAe,CAAE,EAAU,CAEzG,EAAmB,EAAW,EAAO,qBAAuB,EAAO,uBAWzE,OATI,EAAa,EAAiB,CAGzB,CAFK,EAAoB,EAAU,EAAiB,CAE9C,EAAiB,cAAe,EAAiB,sBAAsB,CAM/E,CAHK,GAAoB,GAGnB,EAAG,EAAE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{getTransferData as n}from"./transfer-data.js";import{DynamicFeeEstimation as r}from"../../_warden-config-schema.js";function i(e){try{return r.parse(e),!0}catch{return!1}}const a=(e,{max:t,min:n})=>e>t?t:e<n?n:e;function o(e,t){let n=10n**BigInt(t.feePercentageDecimals);return a(e*BigInt(t.feePercentage)/(n*100n),{max:t.maximumFeeAmount,min:t.minimumFeeAmount})}function s({amountIn:r,evmConfig:a,sourceAsset:s,sourceChainId:c,targetChainId:l}){if(r<=0n)throw new t(e.INCORRECT_AMOUNT_PROVIDED,`Amount must be greater than zero`);let{ethToAva:u,source:d}=n({assetIn:s,sourceChainId:c,targetChainId:l},a),f=u?d.wrapFeeApproximation:d.unwrapFeeApproximation;return i(f)?[o(r,f),f.feePercentage,f.feePercentageDecimals]:[f??0n,0,0]}export{s as getFee,i as isDynamicFee};
|
|
2
|
+
//# sourceMappingURL=fee.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/fee.ts"],"sourcesContent":["import { DynamicFeeEstimation } from '../../_warden-config-schema';\nimport type { EvmConfig, FeeApproximation } from '../_types';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getTransferData } from './transfer-data';\n\nexport function isDynamicFee(\n feeApproximation: FeeApproximation | string | bigint | undefined,\n): feeApproximation is FeeApproximation {\n try {\n DynamicFeeEstimation.parse(feeApproximation);\n return true;\n } catch {\n return false;\n }\n}\n\nconst capped = (value: bigint, { max, min }: { max: bigint; min: bigint }): bigint => {\n if (value > max) {\n return max;\n }\n if (value < min) {\n return min;\n }\n return value;\n};\n\n/**\n * Calculates the fee amount for Avalanche Bridge transactions\n * based on the provided fee approximation parameters.\n *\n * Fee is calculated by applying the fee percentage to the amount, then capping it between\n * the minimum and maximum fee amounts specified in the fee approximation.\n *\n * Fees are rounded up to the nearest whole number.\n */\nexport function getDynamicFeeAmount(amount: bigint, feeApproximation: FeeApproximation): bigint {\n const percentageBase = 10n ** BigInt(feeApproximation.feePercentageDecimals);\n const feeNumerator = amount * BigInt(feeApproximation.feePercentage);\n const feeDenominator = percentageBase * 100n;\n\n const fee = feeNumerator / feeDenominator;\n\n return capped(fee, {\n max: feeApproximation.maximumFeeAmount,\n min: feeApproximation.minimumFeeAmount,\n });\n}\n\n/**\n * Get the fee amount, fee percentage, and fee percentage decimals for an Avalanche Bridge transfer.\n */\nexport function getFee({\n amountIn,\n evmConfig,\n sourceAsset,\n sourceChainId,\n targetChainId,\n}: {\n amountIn: bigint;\n evmConfig: EvmConfig;\n sourceAsset: Asset;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n}): [feeAmount: bigint, feePercentage: number, feePercentageDecimals: number] {\n if (amountIn <= 0n) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_AMOUNT_PROVIDED, 'Amount must be greater than zero');\n }\n\n const { ethToAva, source } = getTransferData({ assetIn: sourceAsset, sourceChainId, targetChainId }, evmConfig);\n\n const feeApproximation = ethToAva ? source.wrapFeeApproximation : source.unwrapFeeApproximation;\n\n if (isDynamicFee(feeApproximation)) {\n const fee = getDynamicFeeAmount(amountIn, feeApproximation);\n\n return [fee, feeApproximation.feePercentage, feeApproximation.feePercentageDecimals];\n }\n\n const fee = feeApproximation ?? 0n;\n\n // Handle better? Or remove if no static config.\n return [fee, 0, 0];\n}\n"],"mappings":"oMAOA,SAAgB,EACd,EACsC,CACtC,GAAI,CAEF,OADA,EAAqB,MAAM,EAAiB,CACrC,QACD,CACN,MAAO,IAIX,MAAM,GAAU,EAAe,CAAE,MAAK,SAChC,EAAQ,EACH,EAEL,EAAQ,EACH,EAEF,EAYT,SAAgB,EAAoB,EAAgB,EAA4C,CAC9F,IAAM,EAAiB,KAAO,OAAO,EAAiB,sBAAsB,CAM5E,OAAO,EALc,EAAS,OAAO,EAAiB,cAAc,EAC7C,EAAiB,MAIrB,CACjB,IAAK,EAAiB,iBACtB,IAAK,EAAiB,iBACvB,CAAC,CAMJ,SAAgB,EAAO,CACrB,WACA,YACA,cACA,gBACA,iBAO4E,CAC5E,GAAI,GAAY,GACd,MAAM,IAAI,EAAmB,EAAY,0BAA2B,mCAAmC,CAGzG,GAAM,CAAE,WAAU,UAAW,EAAgB,CAAE,QAAS,EAAa,gBAAe,gBAAe,CAAE,EAAU,CAEzG,EAAmB,EAAW,EAAO,qBAAuB,EAAO,uBAWzE,OATI,EAAa,EAAiB,CAGzB,CAFK,EAAoB,EAAU,EAAiB,CAE9C,EAAiB,cAAe,EAAiB,sBAAsB,CAM/E,CAHK,GAAoB,GAGnB,EAAG,EAAE"}
|
|
@@ -0,0 +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;
|
|
2
|
+
//# sourceMappingURL=get-config.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-config.cjs","names":["getWardenConfig","ServiceInitializationError","ErrorReason","formatEvmAddress","TokenType","isDynamicFee"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/get-config.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport type { Environment } from '../../../constants';\nimport { ErrorReason, ServiceInitializationError } from '../../../errors';\nimport type { Erc20Asset } from '../../../types/asset';\nimport { formatEvmAddress } from '../../../utils/evm-address';\nimport { getWardenConfig, type WardenConfig } from '../../_warden-config';\nimport type { AvalancheTokens, EthereumTokens, EvmConfig } from '../_types';\nimport { isDynamicFee } from './fee';\n\nexport async function getConfig(environment: Environment): Promise<EvmConfig> {\n const wardenConfig = await getWardenConfig(environment);\n\n return convertToConfig(wardenConfig, environment);\n}\n\nexport function convertToConfig(wardenConfig: WardenConfig, environment: Environment): EvmConfig {\n const wardenTokenList = wardenConfig.critical.assets;\n // Chain IDs for ethereum and avalanche\n const { ethereum, avalanche } = wardenConfig.critical.networks;\n\n if (ethereum === undefined || avalanche === undefined) {\n throw new ServiceInitializationError(\n ErrorReason.WARDEN_CONFIG_MISSING_NETWORK,\n 'Critical networks info is missing from wardenConfig',\n );\n }\n\n // If the wallet addresses are missing, we cannot perform bridge.\n const avalancheWalletAddress = wardenConfig.critical.walletAddresses.avalanche;\n const ethereumWalletAddress = wardenConfig.critical.walletAddresses.ethereum;\n\n if (!avalancheWalletAddress || !ethereumWalletAddress) {\n throw new ServiceInitializationError(\n ErrorReason.CONFIG_NOT_AVAILABLE,\n 'Wallet address is missing from the critical config.',\n );\n }\n\n // EVM tokens from Ethereum\n const homeTokens = Object.entries(wardenTokenList).reduce((assetList, [symbol, wardenAsset]) => {\n const nativeContractAddress = formatEvmAddress(wardenAsset.nativeContractAddress);\n\n const nativeNetworkToken = {\n type: TokenType.ERC20,\n address: nativeContractAddress,\n name: wardenAsset.tokenName,\n symbol: symbol,\n decimals: wardenAsset.denomination,\n } satisfies Erc20Asset;\n\n const wrapFee = wardenConfig.nonCritical.wrapFeeApproximation[symbol];\n\n assetList[nativeContractAddress] = {\n chainId: `eip155:${ethereum}`,\n token: nativeNetworkToken,\n target: {\n chainId: `eip155:${avalanche}`,\n tokenAddress: formatEvmAddress(wardenAsset.wrappedContractAddress),\n },\n wrapFeeApproximation: isDynamicFee(wrapFee) ? wrapFee : wrapFee ? BigInt(wrapFee) : undefined,\n };\n\n return assetList;\n }, {} as EthereumTokens);\n\n const wethHomeToken = Object.values(homeTokens).find((homeToken) => homeToken.token.symbol === 'WETH');\n\n if (!wethHomeToken) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'WETH info is missing from config');\n }\n\n // EVM wrapped tokens from Avalanche\n const avaTokens = Object.entries(wardenTokenList).reduce((assetList, [symbol, wardenAsset]) => {\n const wrappedContractAddress = formatEvmAddress(wardenAsset.wrappedContractAddress);\n\n const avaNetworkToken = {\n type: TokenType.ERC20,\n address: wrappedContractAddress,\n name: wardenAsset.tokenName,\n symbol: `${symbol}.e`,\n decimals: wardenAsset.denomination,\n } satisfies Erc20Asset;\n\n const unwrapFee = wardenConfig.nonCritical.unwrapFeeApproximation[symbol];\n\n assetList[wrappedContractAddress] = {\n chainId: `eip155:${avalanche}`,\n token: avaNetworkToken,\n target: {\n chainId: `eip155:${ethereum}`,\n tokenAddress: formatEvmAddress(wardenAsset.nativeContractAddress),\n },\n unwrapFeeApproximation: isDynamicFee(unwrapFee) ? unwrapFee : unwrapFee ? BigInt(unwrapFee) : undefined,\n };\n\n return assetList;\n }, {} as AvalancheTokens);\n\n const wethAvaToken = avaTokens[wethHomeToken.target.tokenAddress];\n\n if (!wethAvaToken) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'WETH.e info is missing from config');\n }\n\n const avalancheMinimumConfirmation = wardenConfig.nonCritical.minimumConfirmations.avalanche;\n const ethereumMinimumConfirmation = wardenConfig.nonCritical.minimumConfirmations.ethereum;\n\n if (!avalancheMinimumConfirmation || !ethereumMinimumConfirmation) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'Minimum confirmation info is missing');\n }\n\n const evmConfig: EvmConfig = {\n addressBlocklist: wardenConfig.critical.addressBlocklist,\n ethereumTokens: homeTokens,\n avalancheTokens: avaTokens,\n minimumConfirmations: {\n avalanche: avalancheMinimumConfirmation,\n ethereum: ethereumMinimumConfirmation,\n },\n environment,\n walletAddresses: {\n avalanche: avalancheWalletAddress,\n ethereum: ethereumWalletAddress,\n },\n nativeTokenConfig: {\n ethereumToken: wethHomeToken,\n avalancheToken: wethAvaToken,\n },\n };\n\n return evmConfig;\n}\n"],"mappings":"oLASA,eAAsB,EAAU,EAA8C,CAG5E,OAAO,EAFc,MAAMA,EAAAA,gBAAgB,EAAY,CAElB,EAAY,CAGnD,SAAgB,EAAgB,EAA4B,EAAqC,CAC/F,IAAM,EAAkB,EAAa,SAAS,OAExC,CAAE,WAAU,aAAc,EAAa,SAAS,SAEtD,GAAI,IAAa,IAAA,IAAa,IAAc,IAAA,GAC1C,MAAM,IAAIC,EAAAA,2BACRC,EAAAA,YAAY,8BACZ,sDACD,CAIH,IAAM,EAAyB,EAAa,SAAS,gBAAgB,UAC/D,EAAwB,EAAa,SAAS,gBAAgB,SAEpE,GAAI,CAAC,GAA0B,CAAC,EAC9B,MAAM,IAAID,EAAAA,2BACRC,EAAAA,YAAY,qBACZ,sDACD,CAIH,IAAM,EAAa,OAAO,QAAQ,EAAgB,CAAC,QAAQ,EAAW,CAAC,EAAQ,KAAiB,CAC9F,IAAM,EAAwBC,EAAAA,iBAAiB,EAAY,sBAAsB,CAE3E,EAAqB,CACzB,KAAMC,EAAAA,UAAU,MAChB,QAAS,EACT,KAAM,EAAY,UACV,SACR,SAAU,EAAY,aACvB,CAEK,EAAU,EAAa,YAAY,qBAAqB,GAY9D,MAVA,GAAU,GAAyB,CACjC,QAAS,UAAU,IACnB,MAAO,EACP,OAAQ,CACN,QAAS,UAAU,IACnB,aAAcD,EAAAA,iBAAiB,EAAY,uBAAuB,CACnE,CACD,qBAAsBE,EAAAA,aAAa,EAAQ,CAAG,EAAU,EAAU,OAAO,EAAQ,CAAG,IAAA,GACrF,CAEM,GACN,EAAE,CAAmB,CAElB,EAAgB,OAAO,OAAO,EAAW,CAAC,KAAM,GAAc,EAAU,MAAM,SAAW,OAAO,CAEtG,GAAI,CAAC,EACH,MAAM,IAAIJ,EAAAA,2BAA2BC,EAAAA,YAAY,qBAAsB,mCAAmC,CAI5G,IAAM,EAAY,OAAO,QAAQ,EAAgB,CAAC,QAAQ,EAAW,CAAC,EAAQ,KAAiB,CAC7F,IAAM,EAAyBC,EAAAA,iBAAiB,EAAY,uBAAuB,CAE7E,EAAkB,CACtB,KAAMC,EAAAA,UAAU,MAChB,QAAS,EACT,KAAM,EAAY,UAClB,OAAQ,GAAG,EAAO,IAClB,SAAU,EAAY,aACvB,CAEK,EAAY,EAAa,YAAY,uBAAuB,GAYlE,MAVA,GAAU,GAA0B,CAClC,QAAS,UAAU,IACnB,MAAO,EACP,OAAQ,CACN,QAAS,UAAU,IACnB,aAAcD,EAAAA,iBAAiB,EAAY,sBAAsB,CAClE,CACD,uBAAwBE,EAAAA,aAAa,EAAU,CAAG,EAAY,EAAY,OAAO,EAAU,CAAG,IAAA,GAC/F,CAEM,GACN,EAAE,CAAoB,CAEnB,EAAe,EAAU,EAAc,OAAO,cAEpD,GAAI,CAAC,EACH,MAAM,IAAIJ,EAAAA,2BAA2BC,EAAAA,YAAY,qBAAsB,qCAAqC,CAG9G,IAAM,EAA+B,EAAa,YAAY,qBAAqB,UAC7E,EAA8B,EAAa,YAAY,qBAAqB,SAElF,GAAI,CAAC,GAAgC,CAAC,EACpC,MAAM,IAAID,EAAAA,2BAA2BC,EAAAA,YAAY,qBAAsB,uCAAuC,CAsBhH,MAnB6B,CAC3B,iBAAkB,EAAa,SAAS,iBACxC,eAAgB,EAChB,gBAAiB,EACjB,qBAAsB,CACpB,UAAW,EACX,SAAU,EACX,CACD,cACA,gBAAiB,CACf,UAAW,EACX,SAAU,EACX,CACD,kBAAmB,CACjB,cAAe,EACf,eAAgB,EACjB,CACF"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=get-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-config.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/get-config.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport type { Environment } from '../../../constants';\nimport { ErrorReason, ServiceInitializationError } from '../../../errors';\nimport type { Erc20Asset } from '../../../types/asset';\nimport { formatEvmAddress } from '../../../utils/evm-address';\nimport { getWardenConfig, type WardenConfig } from '../../_warden-config';\nimport type { AvalancheTokens, EthereumTokens, EvmConfig } from '../_types';\nimport { isDynamicFee } from './fee';\n\nexport async function getConfig(environment: Environment): Promise<EvmConfig> {\n const wardenConfig = await getWardenConfig(environment);\n\n return convertToConfig(wardenConfig, environment);\n}\n\nexport function convertToConfig(wardenConfig: WardenConfig, environment: Environment): EvmConfig {\n const wardenTokenList = wardenConfig.critical.assets;\n // Chain IDs for ethereum and avalanche\n const { ethereum, avalanche } = wardenConfig.critical.networks;\n\n if (ethereum === undefined || avalanche === undefined) {\n throw new ServiceInitializationError(\n ErrorReason.WARDEN_CONFIG_MISSING_NETWORK,\n 'Critical networks info is missing from wardenConfig',\n );\n }\n\n // If the wallet addresses are missing, we cannot perform bridge.\n const avalancheWalletAddress = wardenConfig.critical.walletAddresses.avalanche;\n const ethereumWalletAddress = wardenConfig.critical.walletAddresses.ethereum;\n\n if (!avalancheWalletAddress || !ethereumWalletAddress) {\n throw new ServiceInitializationError(\n ErrorReason.CONFIG_NOT_AVAILABLE,\n 'Wallet address is missing from the critical config.',\n );\n }\n\n // EVM tokens from Ethereum\n const homeTokens = Object.entries(wardenTokenList).reduce((assetList, [symbol, wardenAsset]) => {\n const nativeContractAddress = formatEvmAddress(wardenAsset.nativeContractAddress);\n\n const nativeNetworkToken = {\n type: TokenType.ERC20,\n address: nativeContractAddress,\n name: wardenAsset.tokenName,\n symbol: symbol,\n decimals: wardenAsset.denomination,\n } satisfies Erc20Asset;\n\n const wrapFee = wardenConfig.nonCritical.wrapFeeApproximation[symbol];\n\n assetList[nativeContractAddress] = {\n chainId: `eip155:${ethereum}`,\n token: nativeNetworkToken,\n target: {\n chainId: `eip155:${avalanche}`,\n tokenAddress: formatEvmAddress(wardenAsset.wrappedContractAddress),\n },\n wrapFeeApproximation: isDynamicFee(wrapFee) ? wrapFee : wrapFee ? BigInt(wrapFee) : undefined,\n };\n\n return assetList;\n }, {} as EthereumTokens);\n\n const wethHomeToken = Object.values(homeTokens).find((homeToken) => homeToken.token.symbol === 'WETH');\n\n if (!wethHomeToken) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'WETH info is missing from config');\n }\n\n // EVM wrapped tokens from Avalanche\n const avaTokens = Object.entries(wardenTokenList).reduce((assetList, [symbol, wardenAsset]) => {\n const wrappedContractAddress = formatEvmAddress(wardenAsset.wrappedContractAddress);\n\n const avaNetworkToken = {\n type: TokenType.ERC20,\n address: wrappedContractAddress,\n name: wardenAsset.tokenName,\n symbol: `${symbol}.e`,\n decimals: wardenAsset.denomination,\n } satisfies Erc20Asset;\n\n const unwrapFee = wardenConfig.nonCritical.unwrapFeeApproximation[symbol];\n\n assetList[wrappedContractAddress] = {\n chainId: `eip155:${avalanche}`,\n token: avaNetworkToken,\n target: {\n chainId: `eip155:${ethereum}`,\n tokenAddress: formatEvmAddress(wardenAsset.nativeContractAddress),\n },\n unwrapFeeApproximation: isDynamicFee(unwrapFee) ? unwrapFee : unwrapFee ? BigInt(unwrapFee) : undefined,\n };\n\n return assetList;\n }, {} as AvalancheTokens);\n\n const wethAvaToken = avaTokens[wethHomeToken.target.tokenAddress];\n\n if (!wethAvaToken) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'WETH.e info is missing from config');\n }\n\n const avalancheMinimumConfirmation = wardenConfig.nonCritical.minimumConfirmations.avalanche;\n const ethereumMinimumConfirmation = wardenConfig.nonCritical.minimumConfirmations.ethereum;\n\n if (!avalancheMinimumConfirmation || !ethereumMinimumConfirmation) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'Minimum confirmation info is missing');\n }\n\n const evmConfig: EvmConfig = {\n addressBlocklist: wardenConfig.critical.addressBlocklist,\n ethereumTokens: homeTokens,\n avalancheTokens: avaTokens,\n minimumConfirmations: {\n avalanche: avalancheMinimumConfirmation,\n ethereum: ethereumMinimumConfirmation,\n },\n environment,\n walletAddresses: {\n avalanche: avalancheWalletAddress,\n ethereum: ethereumWalletAddress,\n },\n nativeTokenConfig: {\n ethereumToken: wethHomeToken,\n avalancheToken: wethAvaToken,\n },\n };\n\n return evmConfig;\n}\n"],"mappings":"sSASA,eAAsB,EAAU,EAA8C,CAG5E,OAAO,EAFc,MAAM,EAAgB,EAAY,CAElB,EAAY,CAGnD,SAAgB,EAAgB,EAA4B,EAAqC,CAC/F,IAAM,EAAkB,EAAa,SAAS,OAExC,CAAE,WAAU,aAAc,EAAa,SAAS,SAEtD,GAAI,IAAa,IAAA,IAAa,IAAc,IAAA,GAC1C,MAAM,IAAI,EACR,EAAY,8BACZ,sDACD,CAIH,IAAM,EAAyB,EAAa,SAAS,gBAAgB,UAC/D,EAAwB,EAAa,SAAS,gBAAgB,SAEpE,GAAI,CAAC,GAA0B,CAAC,EAC9B,MAAM,IAAI,EACR,EAAY,qBACZ,sDACD,CAIH,IAAM,EAAa,OAAO,QAAQ,EAAgB,CAAC,QAAQ,EAAW,CAAC,EAAQ,KAAiB,CAC9F,IAAM,EAAwB,EAAiB,EAAY,sBAAsB,CAE3E,EAAqB,CACzB,KAAM,EAAU,MAChB,QAAS,EACT,KAAM,EAAY,UACV,SACR,SAAU,EAAY,aACvB,CAEK,EAAU,EAAa,YAAY,qBAAqB,GAY9D,MAVA,GAAU,GAAyB,CACjC,QAAS,UAAU,IACnB,MAAO,EACP,OAAQ,CACN,QAAS,UAAU,IACnB,aAAc,EAAiB,EAAY,uBAAuB,CACnE,CACD,qBAAsB,EAAa,EAAQ,CAAG,EAAU,EAAU,OAAO,EAAQ,CAAG,IAAA,GACrF,CAEM,GACN,EAAE,CAAmB,CAElB,EAAgB,OAAO,OAAO,EAAW,CAAC,KAAM,GAAc,EAAU,MAAM,SAAW,OAAO,CAEtG,GAAI,CAAC,EACH,MAAM,IAAI,EAA2B,EAAY,qBAAsB,mCAAmC,CAI5G,IAAM,EAAY,OAAO,QAAQ,EAAgB,CAAC,QAAQ,EAAW,CAAC,EAAQ,KAAiB,CAC7F,IAAM,EAAyB,EAAiB,EAAY,uBAAuB,CAE7E,EAAkB,CACtB,KAAM,EAAU,MAChB,QAAS,EACT,KAAM,EAAY,UAClB,OAAQ,GAAG,EAAO,IAClB,SAAU,EAAY,aACvB,CAEK,EAAY,EAAa,YAAY,uBAAuB,GAYlE,MAVA,GAAU,GAA0B,CAClC,QAAS,UAAU,IACnB,MAAO,EACP,OAAQ,CACN,QAAS,UAAU,IACnB,aAAc,EAAiB,EAAY,sBAAsB,CAClE,CACD,uBAAwB,EAAa,EAAU,CAAG,EAAY,EAAY,OAAO,EAAU,CAAG,IAAA,GAC/F,CAEM,GACN,EAAE,CAAoB,CAEnB,EAAe,EAAU,EAAc,OAAO,cAEpD,GAAI,CAAC,EACH,MAAM,IAAI,EAA2B,EAAY,qBAAsB,qCAAqC,CAG9G,IAAM,EAA+B,EAAa,YAAY,qBAAqB,UAC7E,EAA8B,EAAa,YAAY,qBAAqB,SAElF,GAAI,CAAC,GAAgC,CAAC,EACpC,MAAM,IAAI,EAA2B,EAAY,qBAAsB,uCAAuC,CAsBhH,MAnB6B,CAC3B,iBAAkB,EAAa,SAAS,iBACxC,eAAgB,EAChB,gBAAiB,EACjB,qBAAsB,CACpB,UAAW,EACX,SAAU,EACX,CACD,cACA,gBAAiB,CACf,UAAW,EACX,SAAU,EACX,CACD,kBAAmB,CACjB,cAAe,EACf,eAAgB,EACjB,CACF"}
|
|
@@ -0,0 +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;
|
|
2
|
+
//# sourceMappingURL=transfer-data.cjs.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=transfer-data.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../_utils.cjs`),r=require(`../../_abis.cjs`);let i=require(`viem`);async function a({amountIn:a,fromAddress:o,gasSettings:s,onStepChange:c,quote:l,sign:u,source:d,sourceChain:f}){let p=n.getEvmClientForChain({chain:f}),m={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:l,requiredSignatures:1};c?.(m);let h=(0,i.encodeFunctionData)({abi:r.WAVAX_ABI,functionName:`unwrap`,args:[a,0n]}),g=await u({chainId:t.caip2ToEip155HexChainId(f.chainId),data:h,from:o,to:d.token.address,...s?.maxFeePerGas===void 0?null:{maxFeePerGas:s.maxFeePerGas,maxPriorityFeePerGas:s.maxPriorityFeePerGas}},e=>p.sendRawTransaction({serializedTransaction:e}),m);return[g,await p.waitForTransactionReceipt({hash:g})]}exports.transferAssetFromAvaToEth=a;
|
|
2
|
+
//# sourceMappingURL=unwrap.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unwrap.cjs","names":["getEvmClientForChain","TransferSignatureReason","WAVAX_ABI","caip2ToEip155HexChainId"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/unwrap.ts"],"sourcesContent":["import { encodeFunctionData, type Address as EvmAddress, type Hex, type TransactionReceipt } from 'viem';\nimport { TransferSignatureReason } from '../../../constants';\nimport type { Chain } from '../../../types/chain';\nimport type { EvmSign } from '../../../types/signer';\nimport type { GasSettings } from '../../../types/service';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport type { TokenData } from '../_types';\nimport { getEvmClientForChain } from '../../_utils';\nimport { WAVAX_ABI } from '../../_abis';\nimport { caip2ToEip155HexChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\n\nexport async function transferAssetFromAvaToEth({\n amountIn,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n}: {\n amountIn: bigint;\n fromAddress: EvmAddress;\n gasSettings?: GasSettings;\n onStepChange?: (stepDetails: TransferStepDetails) => void;\n quote: Quote;\n sign: EvmSign;\n source: TokenData;\n sourceChain: Chain;\n}): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n const client = getEvmClientForChain({ chain: sourceChain });\n\n const transferStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(transferStep);\n\n const data = encodeFunctionData({\n abi: WAVAX_ABI,\n functionName: 'unwrap',\n // Passing 0n instead of actual chain ID since we get\n // unsupported chain ID error when we pass the valid ID.\n args: [amountIn, 0n],\n });\n\n const txHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data,\n from: fromAddress,\n to: source.token.address,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n const txReceipt = await client.waitForTransactionReceipt({ hash: txHash });\n\n return [txHash, txReceipt];\n}\n"],"mappings":"mNAYA,eAAsB,EAA0B,CAC9C,WACA,cACA,cACA,eACA,QACA,OACA,SACA,eAUwD,CACxD,IAAM,EAASA,EAAAA,qBAAqB,CAAE,MAAO,EAAa,CAAC,CAErD,EAAoC,CACxC,iBAAkB,EAClB,uBAAwBC,EAAAA,wBAAwB,eAChD,QACA,mBAAoB,EACrB,CAED,IAAe,EAAa,CAE5B,IAAM,GAAA,EAAA,EAAA,oBAA0B,CAC9B,IAAKC,EAAAA,UACL,aAAc,SAGd,KAAM,CAAC,EAAU,GAAG,CACrB,CAAC,CAEI,EAAS,MAAM,EACnB,CACE,QAASC,EAAAA,wBAAwB,EAAY,QAAQ,CACrD,OACA,KAAM,EACN,GAAI,EAAO,MAAM,QAEjB,GAAI,GAAa,eAAiB,IAAA,GAK9B,KAJA,CACE,aAAc,EAAY,aAC1B,qBAAsB,EAAY,qBACnC,CAEN,CACA,GAAiB,EAAO,mBAAmB,CAAE,sBAAuB,EAAc,CAAC,CACpF,EACD,CAID,MAAO,CAAC,EAFU,MAAM,EAAO,0BAA0B,CAAE,KAAM,EAAQ,CAAC,CAEhD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{TransferSignatureReason as e}from"../../../constants.js";import{caip2ToEip155HexChainId as t}from"../../../utils/caip.js";import{getEvmClientForChain as n}from"../../_utils.js";import{WAVAX_ABI as r}from"../../_abis.js";import{encodeFunctionData as i}from"viem";async function a({amountIn:a,fromAddress:o,gasSettings:s,onStepChange:c,quote:l,sign:u,source:d,sourceChain:f}){let p=n({chain:f}),m={currentSignature:1,currentSignatureReason:e.TokensTransfer,quote:l,requiredSignatures:1};c?.(m);let h=i({abi:r,functionName:`unwrap`,args:[a,0n]}),g=await u({chainId:t(f.chainId),data:h,from:o,to:d.token.address,...s?.maxFeePerGas===void 0?null:{maxFeePerGas:s.maxFeePerGas,maxPriorityFeePerGas:s.maxPriorityFeePerGas}},e=>p.sendRawTransaction({serializedTransaction:e}),m);return[g,await p.waitForTransactionReceipt({hash:g})]}export{a as transferAssetFromAvaToEth};
|
|
2
|
+
//# sourceMappingURL=unwrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unwrap.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/unwrap.ts"],"sourcesContent":["import { encodeFunctionData, type Address as EvmAddress, type Hex, type TransactionReceipt } from 'viem';\nimport { TransferSignatureReason } from '../../../constants';\nimport type { Chain } from '../../../types/chain';\nimport type { EvmSign } from '../../../types/signer';\nimport type { GasSettings } from '../../../types/service';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport type { TokenData } from '../_types';\nimport { getEvmClientForChain } from '../../_utils';\nimport { WAVAX_ABI } from '../../_abis';\nimport { caip2ToEip155HexChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\n\nexport async function transferAssetFromAvaToEth({\n amountIn,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n}: {\n amountIn: bigint;\n fromAddress: EvmAddress;\n gasSettings?: GasSettings;\n onStepChange?: (stepDetails: TransferStepDetails) => void;\n quote: Quote;\n sign: EvmSign;\n source: TokenData;\n sourceChain: Chain;\n}): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n const client = getEvmClientForChain({ chain: sourceChain });\n\n const transferStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(transferStep);\n\n const data = encodeFunctionData({\n abi: WAVAX_ABI,\n functionName: 'unwrap',\n // Passing 0n instead of actual chain ID since we get\n // unsupported chain ID error when we pass the valid ID.\n args: [amountIn, 0n],\n });\n\n const txHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data,\n from: fromAddress,\n to: source.token.address,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n const txReceipt = await client.waitForTransactionReceipt({ hash: txHash });\n\n return [txHash, txReceipt];\n}\n"],"mappings":"6QAYA,eAAsB,EAA0B,CAC9C,WACA,cACA,cACA,eACA,QACA,OACA,SACA,eAUwD,CACxD,IAAM,EAAS,EAAqB,CAAE,MAAO,EAAa,CAAC,CAErD,EAAoC,CACxC,iBAAkB,EAClB,uBAAwB,EAAwB,eAChD,QACA,mBAAoB,EACrB,CAED,IAAe,EAAa,CAE5B,IAAM,EAAO,EAAmB,CAC9B,IAAK,EACL,aAAc,SAGd,KAAM,CAAC,EAAU,GAAG,CACrB,CAAC,CAEI,EAAS,MAAM,EACnB,CACE,QAAS,EAAwB,EAAY,QAAQ,CACrD,OACA,KAAM,EACN,GAAI,EAAO,MAAM,QAEjB,GAAI,GAAa,eAAiB,IAAA,GAK9B,KAJA,CACE,aAAc,EAAY,aAC1B,qBAAsB,EAAY,qBACnC,CAEN,CACA,GAAiB,EAAO,mBAAmB,CAAE,sBAAuB,EAAc,CAAC,CACpF,EACD,CAID,MAAO,CAAC,EAFU,MAAM,EAAO,0BAA0B,CAAE,KAAM,EAAQ,CAAC,CAEhD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`);let r=require(`viem`);function i(t,r){let{reference:i}=n.splitCaip2ChainId(t),{reference:a}=n.splitCaip2ChainId(r);return[{source:e.EvmChainId.ETHEREUM_HOMESTEAD,target:e.EvmChainId.AVALANCHE_MAINNET},{source:e.EvmChainId.AVALANCHE_MAINNET,target:e.EvmChainId.ETHEREUM_HOMESTEAD},{source:e.EvmChainId.ETHEREUM_TEST_SEPOLIA,target:e.EvmChainId.AVALANCHE_TESTNET},{source:e.EvmChainId.AVALANCHE_TESTNET,target:e.EvmChainId.ETHEREUM_TEST_SEPOLIA}].some(({source:e,target:t})=>e.toString()===i&&t.toString()===a)}function a(e,n){if(!i(e,n))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`SourceChain and TargetChain combination is not correct or the chains provided are not supported`)}function o(e,n){if(!(0,r.isAddressEqual)(e,n))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`'fromAddress' and 'toAddress' do not match. Avalanche EVM Bridge only supports transfers to the same address on both chains.`)}function s(e,n){let r=n.map(e=>e.toLowerCase()),i=e.find(e=>r.includes(e.toLowerCase()));if(i)throw new t.InvalidParamsError(t.ErrorReason.ADDRESS_IS_BLOCKED,i)}exports.isValidChainCombination=i,exports.validateChainCombinationOrThrow=a,exports.validateTransferAddressesNotBlockedOrThrow=s,exports.validateTransferAddressesOrThrow=o;
|
|
2
|
+
//# sourceMappingURL=validations.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validations.cjs","names":["splitCaip2ChainId","EvmChainId","InvalidParamsError","ErrorReason"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/validations.ts"],"sourcesContent":["import { EvmChainId } from '../../../constants';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { splitCaip2ChainId } from '../../../utils/caip';\nimport { type Address as EvmAddress, isAddressEqual } from 'viem';\n\n/**\n * Validates the provided source and target chain combination\n * is supported by the Avalanche EVM transfer service.\n *\n * Supported routes:\n * - Ethereum Mainnet <-> Avalanche Mainnet\n * - Ethereum Sepolia Testnet <-> Avalanche Fuji Testnet\n *\n * @return boolean indicating if the chain combination is valid\n */\nexport function isValidChainCombination(sourceChainId: Caip2ChainId, targetChainId: Caip2ChainId): boolean {\n const { reference: sourceChainIdReference } = splitCaip2ChainId(sourceChainId);\n const { reference: targetChainIdReference } = splitCaip2ChainId(targetChainId);\n\n const validRoutes = [\n { source: EvmChainId.ETHEREUM_HOMESTEAD, target: EvmChainId.AVALANCHE_MAINNET },\n { source: EvmChainId.AVALANCHE_MAINNET, target: EvmChainId.ETHEREUM_HOMESTEAD },\n { source: EvmChainId.ETHEREUM_TEST_SEPOLIA, target: EvmChainId.AVALANCHE_TESTNET },\n { source: EvmChainId.AVALANCHE_TESTNET, target: EvmChainId.ETHEREUM_TEST_SEPOLIA },\n ];\n return validRoutes.some(\n ({ source, target }) =>\n source.toString() === sourceChainIdReference && target.toString() === targetChainIdReference,\n );\n}\n\n/**\n * Validates the provided source and target chain combination\n * is supported by the Avalanche EVM transfer service.\n *\n * @throws InvalidParamsError if the chain combination is invalid\n */\nexport function validateChainCombinationOrThrow(sourceChainId: Caip2ChainId, targetChainId: Caip2ChainId): void {\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\n/**\n * Validates that the fromAddress and toAddress are valid Ethereum addresses\n * and that they match, as required by the Avalanche EVM Bridge.\n *\n * @throws InvalidParamsError if any validation fails\n */\nexport function validateTransferAddressesOrThrow(fromAddress: EvmAddress, toAddress: EvmAddress): void {\n if (!isAddressEqual(fromAddress, toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `'fromAddress' and 'toAddress' do not match. Avalanche EVM Bridge only supports transfers to the same address on both chains.`,\n );\n }\n}\n\n/**\n * Validates that none of the provided addresses are in the blocked addresses list.\n *\n * @throws InvalidParamsError if any address is blocked\n */\nexport function validateTransferAddressesNotBlockedOrThrow(\n addresses: readonly string[],\n blockedAddresses: readonly string[],\n): void {\n const normalizedBlockedAddresses = blockedAddresses.map((address) => address.toLowerCase());\n const blockedAddress = addresses.find((address) => normalizedBlockedAddresses.includes(address.toLowerCase()));\n\n if (blockedAddress) {\n throw new InvalidParamsError(ErrorReason.ADDRESS_IS_BLOCKED, blockedAddress);\n }\n}\n"],"mappings":"yLAgBA,SAAgB,EAAwB,EAA6B,EAAsC,CACzG,GAAM,CAAE,UAAW,GAA2BA,EAAAA,kBAAkB,EAAc,CACxE,CAAE,UAAW,GAA2BA,EAAAA,kBAAkB,EAAc,CAQ9E,MANoB,CAClB,CAAE,OAAQC,EAAAA,WAAW,mBAAoB,OAAQA,EAAAA,WAAW,kBAAmB,CAC/E,CAAE,OAAQA,EAAAA,WAAW,kBAAmB,OAAQA,EAAAA,WAAW,mBAAoB,CAC/E,CAAE,OAAQA,EAAAA,WAAW,sBAAuB,OAAQA,EAAAA,WAAW,kBAAmB,CAClF,CAAE,OAAQA,EAAAA,WAAW,kBAAmB,OAAQA,EAAAA,WAAW,sBAAuB,CACnF,CACkB,MAChB,CAAE,SAAQ,YACT,EAAO,UAAU,GAAK,GAA0B,EAAO,UAAU,GAAK,EACzE,CASH,SAAgB,EAAgC,EAA6B,EAAmC,CAC9G,GAAI,CAAC,EAAwB,EAAe,EAAc,CACxD,MAAM,IAAIC,EAAAA,mBACRC,EAAAA,YAAY,eACZ,kGACD,CAUL,SAAgB,EAAiC,EAAyB,EAA6B,CACrG,GAAI,EAAA,EAAA,EAAA,gBAAgB,EAAa,EAAU,CACzC,MAAM,IAAID,EAAAA,mBACRC,EAAAA,YAAY,eACZ,+HACD,CASL,SAAgB,EACd,EACA,EACM,CACN,IAAM,EAA6B,EAAiB,IAAK,GAAY,EAAQ,aAAa,CAAC,CACrF,EAAiB,EAAU,KAAM,GAAY,EAA2B,SAAS,EAAQ,aAAa,CAAC,CAAC,CAE9G,GAAI,EACF,MAAM,IAAID,EAAAA,mBAAmBC,EAAAA,YAAY,mBAAoB,EAAe"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{EvmChainId as e}from"../../../constants.js";import{ErrorReason as t,InvalidParamsError as n}from"../../../errors.js";import{splitCaip2ChainId as r}from"../../../utils/caip.js";import{isAddressEqual as i}from"viem";function a(t,n){let{reference:i}=r(t),{reference:a}=r(n);return[{source:e.ETHEREUM_HOMESTEAD,target:e.AVALANCHE_MAINNET},{source:e.AVALANCHE_MAINNET,target:e.ETHEREUM_HOMESTEAD},{source:e.ETHEREUM_TEST_SEPOLIA,target:e.AVALANCHE_TESTNET},{source:e.AVALANCHE_TESTNET,target:e.ETHEREUM_TEST_SEPOLIA}].some(({source:e,target:t})=>e.toString()===i&&t.toString()===a)}function o(e,r){if(!a(e,r))throw new n(t.INVALID_PARAMS,`SourceChain and TargetChain combination is not correct or the chains provided are not supported`)}function s(e,r){if(!i(e,r))throw new n(t.INVALID_PARAMS,`'fromAddress' and 'toAddress' do not match. Avalanche EVM Bridge only supports transfers to the same address on both chains.`)}function c(e,r){let i=r.map(e=>e.toLowerCase()),a=e.find(e=>i.includes(e.toLowerCase()));if(a)throw new n(t.ADDRESS_IS_BLOCKED,a)}export{a as isValidChainCombination,o as validateChainCombinationOrThrow,c as validateTransferAddressesNotBlockedOrThrow,s as validateTransferAddressesOrThrow};
|
|
2
|
+
//# sourceMappingURL=validations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validations.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/validations.ts"],"sourcesContent":["import { EvmChainId } from '../../../constants';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { splitCaip2ChainId } from '../../../utils/caip';\nimport { type Address as EvmAddress, isAddressEqual } from 'viem';\n\n/**\n * Validates the provided source and target chain combination\n * is supported by the Avalanche EVM transfer service.\n *\n * Supported routes:\n * - Ethereum Mainnet <-> Avalanche Mainnet\n * - Ethereum Sepolia Testnet <-> Avalanche Fuji Testnet\n *\n * @return boolean indicating if the chain combination is valid\n */\nexport function isValidChainCombination(sourceChainId: Caip2ChainId, targetChainId: Caip2ChainId): boolean {\n const { reference: sourceChainIdReference } = splitCaip2ChainId(sourceChainId);\n const { reference: targetChainIdReference } = splitCaip2ChainId(targetChainId);\n\n const validRoutes = [\n { source: EvmChainId.ETHEREUM_HOMESTEAD, target: EvmChainId.AVALANCHE_MAINNET },\n { source: EvmChainId.AVALANCHE_MAINNET, target: EvmChainId.ETHEREUM_HOMESTEAD },\n { source: EvmChainId.ETHEREUM_TEST_SEPOLIA, target: EvmChainId.AVALANCHE_TESTNET },\n { source: EvmChainId.AVALANCHE_TESTNET, target: EvmChainId.ETHEREUM_TEST_SEPOLIA },\n ];\n return validRoutes.some(\n ({ source, target }) =>\n source.toString() === sourceChainIdReference && target.toString() === targetChainIdReference,\n );\n}\n\n/**\n * Validates the provided source and target chain combination\n * is supported by the Avalanche EVM transfer service.\n *\n * @throws InvalidParamsError if the chain combination is invalid\n */\nexport function validateChainCombinationOrThrow(sourceChainId: Caip2ChainId, targetChainId: Caip2ChainId): void {\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\n/**\n * Validates that the fromAddress and toAddress are valid Ethereum addresses\n * and that they match, as required by the Avalanche EVM Bridge.\n *\n * @throws InvalidParamsError if any validation fails\n */\nexport function validateTransferAddressesOrThrow(fromAddress: EvmAddress, toAddress: EvmAddress): void {\n if (!isAddressEqual(fromAddress, toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `'fromAddress' and 'toAddress' do not match. Avalanche EVM Bridge only supports transfers to the same address on both chains.`,\n );\n }\n}\n\n/**\n * Validates that none of the provided addresses are in the blocked addresses list.\n *\n * @throws InvalidParamsError if any address is blocked\n */\nexport function validateTransferAddressesNotBlockedOrThrow(\n addresses: readonly string[],\n blockedAddresses: readonly string[],\n): void {\n const normalizedBlockedAddresses = blockedAddresses.map((address) => address.toLowerCase());\n const blockedAddress = addresses.find((address) => normalizedBlockedAddresses.includes(address.toLowerCase()));\n\n if (blockedAddress) {\n throw new InvalidParamsError(ErrorReason.ADDRESS_IS_BLOCKED, blockedAddress);\n }\n}\n"],"mappings":"6NAgBA,SAAgB,EAAwB,EAA6B,EAAsC,CACzG,GAAM,CAAE,UAAW,GAA2B,EAAkB,EAAc,CACxE,CAAE,UAAW,GAA2B,EAAkB,EAAc,CAQ9E,MANoB,CAClB,CAAE,OAAQ,EAAW,mBAAoB,OAAQ,EAAW,kBAAmB,CAC/E,CAAE,OAAQ,EAAW,kBAAmB,OAAQ,EAAW,mBAAoB,CAC/E,CAAE,OAAQ,EAAW,sBAAuB,OAAQ,EAAW,kBAAmB,CAClF,CAAE,OAAQ,EAAW,kBAAmB,OAAQ,EAAW,sBAAuB,CACnF,CACkB,MAChB,CAAE,SAAQ,YACT,EAAO,UAAU,GAAK,GAA0B,EAAO,UAAU,GAAK,EACzE,CASH,SAAgB,EAAgC,EAA6B,EAAmC,CAC9G,GAAI,CAAC,EAAwB,EAAe,EAAc,CACxD,MAAM,IAAI,EACR,EAAY,eACZ,kGACD,CAUL,SAAgB,EAAiC,EAAyB,EAA6B,CACrG,GAAI,CAAC,EAAe,EAAa,EAAU,CACzC,MAAM,IAAI,EACR,EAAY,eACZ,+HACD,CASL,SAAgB,EACd,EACA,EACM,CACN,IAAM,EAA6B,EAAiB,IAAK,GAAY,EAAQ,aAAa,CAAC,CACrF,EAAiB,EAAU,KAAM,GAAY,EAA2B,SAAS,EAAQ,aAAa,CAAC,CAAC,CAE9G,GAAI,EACF,MAAM,IAAI,EAAmB,EAAY,mBAAoB,EAAe"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../type-guards.cjs`),r=require(`../../../utils/caip.cjs`),i=require(`../../../_utils/chain.cjs`),a=require(`../../_utils.cjs`),o=require(`../../_abis.cjs`);let s=require(`viem`);async function c({amountIn:e,assetIn:t,evmConfig:r,fromAddress:i,gasSettings:a,onStepChange:o,quote:s,sign:c,source:u,sourceChain:d,targetChain:p}){return n.isNativeAsset(t)?f({amountIn:e,evmConfig:r,fromAddress:i,source:u,sourceChain:d,targetChain:p,quote:s,sign:c,onStepChange:o,gasSettings:a}):l({amountIn:e,evmConfig:r,source:u,sourceChain:d,quote:s,fromAddress:i,sign:c,onStepChange:o,gasSettings:a})}async function l({amountIn:t,evmConfig:n,fromAddress:i,gasSettings:o,onStepChange:c,quote:l,sign:u,source:d,sourceChain:f}){let p=n.walletAddresses.ethereum,m=a.getEvmClientForChain({chain:f}),h={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:l,requiredSignatures:1};c?.(h);let g=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[p,t]}),_=await u({chainId:r.caip2ToEip155HexChainId(f.chainId),data:g,from:i,to:d.token.address,...o?.maxFeePerGas===void 0?null:{maxFeePerGas:o.maxFeePerGas,maxPriorityFeePerGas:o.maxPriorityFeePerGas}},e=>m.sendRawTransaction({serializedTransaction:e}),h);return[_,await m.waitForTransactionReceipt({hash:_})]}const u={[e.Blockchain.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.Blockchain.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function d({evmConfig:t,fromAddress:n,sourceChain:r,targetChain:o}){if(!(t.environment===e.Environment.PROD&&i.isMainnetChain(r)&&i.isMainnetChain(o)))return!1;let c=t.nativeTokenConfig.ethereumToken,l=t.nativeTokenConfig.avalancheToken;try{return await a.getEvmClientForChain({chain:r}).readContract({address:c.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.ETHEREUM]]})>0n?!0:await a.getEvmClientForChain({chain:o}).readContract({address:l.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.AVALANCHE]]})>0n}catch{return!1}}async function f({amountIn:n,evmConfig:c,fromAddress:l,gasSettings:u,onStepChange:f,quote:p,sign:m,source:h,sourceChain:g,targetChain:_}){let v=c.walletAddresses.ethereum,y=a.getEvmClientForChain({chain:g});if(!i.isAvalancheChain(_))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await d({evmConfig:c,fromAddress:l,sourceChain:g,targetChain:_}))throw new t.InvalidParamsError(t.ErrorReason.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.WrapToken,quote:p,requiredSignatures:2};f?.(b);let x=(0,s.encodeFunctionData)({abi:o.WETH_ABI,functionName:`deposit`}),S=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:x,from:l,to:h.token.address,value:n,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),b),C=await y.waitForTransactionReceipt({hash:S});if(C.status===`reverted`)return[S,C];let w={currentSignature:2,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:2};f?.(w);let T=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[v,n]}),E=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:T,from:l,to:h.token.address,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),w);return[E,await y.waitForTransactionReceipt({hash:E})]}exports.transferAssetFromEthToAva=c;
|
|
2
|
+
//# sourceMappingURL=wrap.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.cjs","names":["isNativeAsset","getEvmClientForChain","TransferSignatureReason","ERC20_ABI","caip2ToEip155HexChainId","Blockchain","Environment","isMainnetChain","isAvalancheChain","InvalidParamsError","ErrorReason","WETH_ABI"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/wrap.ts"],"sourcesContent":["import {\n encodeFunctionData,\n erc20Abi as ERC20_ABI,\n type Address as EvmAddress,\n type Hex,\n type TransactionReceipt,\n} from 'viem';\nimport { Blockchain, Environment, TransferSignatureReason } from '../../../constants';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isNativeAsset } from '../../../type-guards';\nimport type { Asset } from '../../../types/asset';\nimport type { Chain } from '../../../types/chain';\nimport type { EvmSign } from '../../../types/signer';\nimport type { GasSettings } from '../../../types/service';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport type { EvmConfig, TokenData } from '../_types';\nimport { getEvmClientForChain } from '../../_utils';\nimport { caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { isAvalancheChain, isMainnetChain } from '../../../_utils/chain';\nimport { WETH_ABI } from '../../_abis';\nimport type { Quote } from '../../../types/quote';\n\ninterface BaseParameters {\n amountIn: bigint;\n evmConfig: EvmConfig;\n fromAddress: EvmAddress;\n gasSettings?: GasSettings;\n onStepChange?: (stepDetails: TransferStepDetails) => void;\n quote: Quote;\n sign: EvmSign;\n source: TokenData;\n sourceChain: Chain;\n}\n\nexport interface TransferAssetFromEthToAvaParameters extends BaseParameters {\n assetIn: Asset;\n targetChain: Chain;\n}\n\nexport async function transferAssetFromEthToAva({\n amountIn,\n assetIn,\n evmConfig,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n targetChain,\n}: TransferAssetFromEthToAvaParameters): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n if (isNativeAsset(assetIn)) {\n return wrapNativeAsset({\n amountIn,\n evmConfig,\n fromAddress,\n source,\n sourceChain,\n targetChain,\n quote,\n sign,\n onStepChange,\n gasSettings,\n });\n }\n\n return wrapErc20Asset({\n amountIn,\n evmConfig,\n source,\n sourceChain,\n quote,\n fromAddress,\n sign,\n onStepChange,\n gasSettings,\n });\n}\n\nasync function wrapErc20Asset({\n amountIn,\n evmConfig,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n}: BaseParameters): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n const ethereumWalletAddress = evmConfig.walletAddresses.ethereum;\n\n const client = getEvmClientForChain({ chain: sourceChain });\n\n const transferStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(transferStep);\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [ethereumWalletAddress, amountIn],\n });\n\n const txHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data,\n from: fromAddress,\n to: source.token.address,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n const txReceipt = await client.waitForTransactionReceipt({ hash: txHash });\n\n return [txHash, txReceipt];\n}\n\ntype VulnerableRouters = {\n [Blockchain.ETHEREUM]: EvmAddress;\n [Blockchain.AVALANCHE]: EvmAddress;\n};\nexport const VulnerableRouterAddresses: Readonly<VulnerableRouters> = {\n [Blockchain.ETHEREUM]: '0x6b7a87899490EcE95443e979cA9485CBE7E71522',\n [Blockchain.AVALANCHE]: '0x9b17bAADf0f21F03e35249e0e59723F34994F806',\n} as const;\n\n/**\n * Checks if the address has token approvals for addresses involved in the\n * multichain incident:\n * https://medium.com/multichainorg/action-required-critical-vulnerability-for-six-tokens-6b3cbd22bfc0\n *\n * Due to the approval, attackers can drain the assets from the users account\n * immediately after a transaction like wrapping ETH or transferring the asset\n * across the bridge.\n */\nasync function hasAddressVulnerableMultichainApproval({\n evmConfig,\n fromAddress,\n sourceChain,\n targetChain,\n}: {\n evmConfig: EvmConfig;\n fromAddress: EvmAddress;\n sourceChain: Chain; // Should be Ethereum\n targetChain: Chain; // Should be Avalanche\n}): Promise<boolean> {\n if (!(evmConfig.environment === Environment.PROD && isMainnetChain(sourceChain) && isMainnetChain(targetChain))) {\n return false;\n }\n\n const ethWethConfig = evmConfig.nativeTokenConfig.ethereumToken;\n const avaWethConfig = evmConfig.nativeTokenConfig.avalancheToken;\n\n try {\n const ethClient = getEvmClientForChain({ chain: sourceChain });\n const ethWethAllowance = await ethClient.readContract({\n address: ethWethConfig.token.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, VulnerableRouterAddresses[Blockchain.ETHEREUM]],\n });\n\n if (ethWethAllowance > 0n) {\n return true;\n }\n\n const avaClient = getEvmClientForChain({ chain: targetChain });\n const avaWethAllowance = await avaClient.readContract({\n address: avaWethConfig.token.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, VulnerableRouterAddresses[Blockchain.AVALANCHE]],\n });\n\n return avaWethAllowance > 0n;\n } catch {\n return false;\n }\n}\n\nasync function wrapNativeAsset({\n amountIn,\n evmConfig,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n targetChain,\n}: BaseParameters & { targetChain: Chain }): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n const ethereumWalletAddress = evmConfig.walletAddresses.ethereum;\n\n const client = getEvmClientForChain({ chain: sourceChain });\n\n if (!isAvalancheChain(targetChain)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid chain combinations for wrapping native asset');\n }\n\n // Checks if the address has token approvals for addresses involved in the multi-chain incident\n const isAddressVulnerable = await hasAddressVulnerableMultichainApproval({\n evmConfig,\n fromAddress,\n sourceChain,\n targetChain,\n });\n\n if (isAddressVulnerable) {\n throw new InvalidParamsError(\n ErrorReason.VULNERABLE_TOKEN_APPROVAL_ADDRESS,\n 'The fromAddress has token approvals for addresses involved in the multichain incident. ' +\n 'Please revoke the approvals before proceeding with the transfer.',\n );\n }\n\n const wrapStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.WrapToken,\n quote,\n requiredSignatures: 2,\n };\n onStepChange?.(wrapStep);\n\n const wrapData = encodeFunctionData({\n abi: WETH_ABI,\n functionName: 'deposit',\n });\n\n const wrapTxHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data: wrapData,\n from: fromAddress,\n to: source.token.address,\n value: amountIn,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n wrapStep,\n );\n\n const wrapTxReceipt = await client.waitForTransactionReceipt({ hash: wrapTxHash });\n\n // Early return if wrap transaction reverted.\n if (wrapTxReceipt.status === 'reverted') {\n return [wrapTxHash, wrapTxReceipt];\n }\n\n const transferStep: TransferStepDetails = {\n currentSignature: 2,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 2,\n };\n onStepChange?.(transferStep);\n\n const transferData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [ethereumWalletAddress, amountIn],\n });\n\n const txHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data: transferData,\n from: fromAddress,\n to: source.token.address,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n const txReceipt = await client.waitForTransactionReceipt({ hash: txHash });\n\n return [txHash, txReceipt];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Blockchain as e,Environment as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorReason as r,InvalidParamsError as i}from"../../../errors.js";import{isNativeAsset as a}from"../../../type-guards.js";import{caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{isAvalancheChain as s,isMainnetChain as c}from"../../../_utils/chain.js";import{getEvmClientForChain as l}from"../../_utils.js";import{WETH_ABI as u}from"../../_abis.js";import{encodeFunctionData as d,erc20Abi as f}from"viem";async function p({amountIn:e,assetIn:t,evmConfig:n,fromAddress:r,gasSettings:i,onStepChange:o,quote:s,sign:c,source:l,sourceChain:u,targetChain:d}){return a(t)?_({amountIn:e,evmConfig:n,fromAddress:r,source:l,sourceChain:u,targetChain:d,quote:s,sign:c,onStepChange:o,gasSettings:i}):m({amountIn:e,evmConfig:n,source:l,sourceChain:u,quote:s,fromAddress:r,sign:c,onStepChange:o,gasSettings:i})}async function m({amountIn:e,evmConfig:t,fromAddress:r,gasSettings:i,onStepChange:a,quote:s,sign:c,source:u,sourceChain:p}){let m=t.walletAddresses.ethereum,h=l({chain:p}),g={currentSignature:1,currentSignatureReason:n.TokensTransfer,quote:s,requiredSignatures:1};a?.(g);let _=d({abi:f,functionName:`transfer`,args:[m,e]}),v=await c({chainId:o(p.chainId),data:_,from:r,to:u.token.address,...i?.maxFeePerGas===void 0?null:{maxFeePerGas:i.maxFeePerGas,maxPriorityFeePerGas:i.maxPriorityFeePerGas}},e=>h.sendRawTransaction({serializedTransaction:e}),g);return[v,await h.waitForTransactionReceipt({hash:v})]}const h={[e.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function g({evmConfig:n,fromAddress:r,sourceChain:i,targetChain:a}){if(!(n.environment===t.PROD&&c(i)&&c(a)))return!1;let o=n.nativeTokenConfig.ethereumToken,s=n.nativeTokenConfig.avalancheToken;try{return await l({chain:i}).readContract({address:o.token.address,abi:f,functionName:`allowance`,args:[r,h[e.ETHEREUM]]})>0n?!0:await l({chain:a}).readContract({address:s.token.address,abi:f,functionName:`allowance`,args:[r,h[e.AVALANCHE]]})>0n}catch{return!1}}async function _({amountIn:e,evmConfig:t,fromAddress:a,gasSettings:c,onStepChange:p,quote:m,sign:h,source:_,sourceChain:v,targetChain:y}){let b=t.walletAddresses.ethereum,x=l({chain:v});if(!s(y))throw new i(r.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await g({evmConfig:t,fromAddress:a,sourceChain:v,targetChain:y}))throw new i(r.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let S={currentSignature:1,currentSignatureReason:n.WrapToken,quote:m,requiredSignatures:2};p?.(S);let C=d({abi:u,functionName:`deposit`}),w=await h({chainId:o(v.chainId),data:C,from:a,to:_.token.address,value:e,...c?.maxFeePerGas===void 0?null:{maxFeePerGas:c.maxFeePerGas,maxPriorityFeePerGas:c.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),S),T=await x.waitForTransactionReceipt({hash:w});if(T.status===`reverted`)return[w,T];let E={currentSignature:2,currentSignatureReason:n.TokensTransfer,quote:m,requiredSignatures:2};p?.(E);let D=d({abi:f,functionName:`transfer`,args:[b,e]}),O=await h({chainId:o(v.chainId),data:D,from:a,to:_.token.address,...c?.maxFeePerGas===void 0?null:{maxFeePerGas:c.maxFeePerGas,maxPriorityFeePerGas:c.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),E);return[O,await x.waitForTransactionReceipt({hash:O})]}export{p as transferAssetFromEthToAva};
|
|
2
|
+
//# sourceMappingURL=wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.js","names":["ERC20_ABI"],"sources":["../../../../src/transfer-service/avalanche-evm/_utils/wrap.ts"],"sourcesContent":["import {\n encodeFunctionData,\n erc20Abi as ERC20_ABI,\n type Address as EvmAddress,\n type Hex,\n type TransactionReceipt,\n} from 'viem';\nimport { Blockchain, Environment, TransferSignatureReason } from '../../../constants';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isNativeAsset } from '../../../type-guards';\nimport type { Asset } from '../../../types/asset';\nimport type { Chain } from '../../../types/chain';\nimport type { EvmSign } from '../../../types/signer';\nimport type { GasSettings } from '../../../types/service';\nimport type { TransferStepDetails } from '../../../types/transfer';\nimport type { EvmConfig, TokenData } from '../_types';\nimport { getEvmClientForChain } from '../../_utils';\nimport { caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { isAvalancheChain, isMainnetChain } from '../../../_utils/chain';\nimport { WETH_ABI } from '../../_abis';\nimport type { Quote } from '../../../types/quote';\n\ninterface BaseParameters {\n amountIn: bigint;\n evmConfig: EvmConfig;\n fromAddress: EvmAddress;\n gasSettings?: GasSettings;\n onStepChange?: (stepDetails: TransferStepDetails) => void;\n quote: Quote;\n sign: EvmSign;\n source: TokenData;\n sourceChain: Chain;\n}\n\nexport interface TransferAssetFromEthToAvaParameters extends BaseParameters {\n assetIn: Asset;\n targetChain: Chain;\n}\n\nexport async function transferAssetFromEthToAva({\n amountIn,\n assetIn,\n evmConfig,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n targetChain,\n}: TransferAssetFromEthToAvaParameters): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n if (isNativeAsset(assetIn)) {\n return wrapNativeAsset({\n amountIn,\n evmConfig,\n fromAddress,\n source,\n sourceChain,\n targetChain,\n quote,\n sign,\n onStepChange,\n gasSettings,\n });\n }\n\n return wrapErc20Asset({\n amountIn,\n evmConfig,\n source,\n sourceChain,\n quote,\n fromAddress,\n sign,\n onStepChange,\n gasSettings,\n });\n}\n\nasync function wrapErc20Asset({\n amountIn,\n evmConfig,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n}: BaseParameters): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n const ethereumWalletAddress = evmConfig.walletAddresses.ethereum;\n\n const client = getEvmClientForChain({ chain: sourceChain });\n\n const transferStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(transferStep);\n\n const data = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [ethereumWalletAddress, amountIn],\n });\n\n const txHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data,\n from: fromAddress,\n to: source.token.address,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n const txReceipt = await client.waitForTransactionReceipt({ hash: txHash });\n\n return [txHash, txReceipt];\n}\n\ntype VulnerableRouters = {\n [Blockchain.ETHEREUM]: EvmAddress;\n [Blockchain.AVALANCHE]: EvmAddress;\n};\nexport const VulnerableRouterAddresses: Readonly<VulnerableRouters> = {\n [Blockchain.ETHEREUM]: '0x6b7a87899490EcE95443e979cA9485CBE7E71522',\n [Blockchain.AVALANCHE]: '0x9b17bAADf0f21F03e35249e0e59723F34994F806',\n} as const;\n\n/**\n * Checks if the address has token approvals for addresses involved in the\n * multichain incident:\n * https://medium.com/multichainorg/action-required-critical-vulnerability-for-six-tokens-6b3cbd22bfc0\n *\n * Due to the approval, attackers can drain the assets from the users account\n * immediately after a transaction like wrapping ETH or transferring the asset\n * across the bridge.\n */\nasync function hasAddressVulnerableMultichainApproval({\n evmConfig,\n fromAddress,\n sourceChain,\n targetChain,\n}: {\n evmConfig: EvmConfig;\n fromAddress: EvmAddress;\n sourceChain: Chain; // Should be Ethereum\n targetChain: Chain; // Should be Avalanche\n}): Promise<boolean> {\n if (!(evmConfig.environment === Environment.PROD && isMainnetChain(sourceChain) && isMainnetChain(targetChain))) {\n return false;\n }\n\n const ethWethConfig = evmConfig.nativeTokenConfig.ethereumToken;\n const avaWethConfig = evmConfig.nativeTokenConfig.avalancheToken;\n\n try {\n const ethClient = getEvmClientForChain({ chain: sourceChain });\n const ethWethAllowance = await ethClient.readContract({\n address: ethWethConfig.token.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, VulnerableRouterAddresses[Blockchain.ETHEREUM]],\n });\n\n if (ethWethAllowance > 0n) {\n return true;\n }\n\n const avaClient = getEvmClientForChain({ chain: targetChain });\n const avaWethAllowance = await avaClient.readContract({\n address: avaWethConfig.token.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, VulnerableRouterAddresses[Blockchain.AVALANCHE]],\n });\n\n return avaWethAllowance > 0n;\n } catch {\n return false;\n }\n}\n\nasync function wrapNativeAsset({\n amountIn,\n evmConfig,\n fromAddress,\n gasSettings,\n onStepChange,\n quote,\n sign,\n source,\n sourceChain,\n targetChain,\n}: BaseParameters & { targetChain: Chain }): Promise<[txHash: Hex, txReceipt: TransactionReceipt]> {\n const ethereumWalletAddress = evmConfig.walletAddresses.ethereum;\n\n const client = getEvmClientForChain({ chain: sourceChain });\n\n if (!isAvalancheChain(targetChain)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid chain combinations for wrapping native asset');\n }\n\n // Checks if the address has token approvals for addresses involved in the multi-chain incident\n const isAddressVulnerable = await hasAddressVulnerableMultichainApproval({\n evmConfig,\n fromAddress,\n sourceChain,\n targetChain,\n });\n\n if (isAddressVulnerable) {\n throw new InvalidParamsError(\n ErrorReason.VULNERABLE_TOKEN_APPROVAL_ADDRESS,\n 'The fromAddress has token approvals for addresses involved in the multichain incident. ' +\n 'Please revoke the approvals before proceeding with the transfer.',\n );\n }\n\n const wrapStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.WrapToken,\n quote,\n requiredSignatures: 2,\n };\n onStepChange?.(wrapStep);\n\n const wrapData = encodeFunctionData({\n abi: WETH_ABI,\n functionName: 'deposit',\n });\n\n const wrapTxHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data: wrapData,\n from: fromAddress,\n to: source.token.address,\n value: amountIn,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n wrapStep,\n );\n\n const wrapTxReceipt = await client.waitForTransactionReceipt({ hash: wrapTxHash });\n\n // Early return if wrap transaction reverted.\n if (wrapTxReceipt.status === 'reverted') {\n return [wrapTxHash, wrapTxReceipt];\n }\n\n const transferStep: TransferStepDetails = {\n currentSignature: 2,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 2,\n };\n onStepChange?.(transferStep);\n\n const transferData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [ethereumWalletAddress, amountIn],\n });\n\n const txHash = await sign(\n {\n chainId: caip2ToEip155HexChainId(sourceChain.chainId),\n data: transferData,\n from: fromAddress,\n to: source.token.address,\n // Only include maxFeePerGas and maxPriorityFeePerGas if gasSettings.maxFeePerGas is defined\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n const txReceipt = await client.waitForTransactionReceipt({ hash: txHash });\n\n return [txHash, txReceipt];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../constants.cjs`),t=require(`./_handlers/analyze-support.cjs`),n=require(`./_constants.cjs`),r=require(`./_handlers/estimate-native-fee.cjs`),i=require(`./_handlers/get-assets.cjs`),a=require(`./_handlers/get-minimum-transfer-amount.cjs`),o=require(`./_handlers/get-supported-chains.cjs`),s=require(`./_handlers/stream-quotes.cjs`),c=require(`./_handlers/track-transfer.cjs`),l=require(`./_handlers/transfer-asset.cjs`),u=require(`./_utils/get-config.cjs`);async function d({environment:d,evmSigner:f,feeEstimationMultiplier:p=n.DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER}){let m=await u.getConfig(d),h=await i.getAssetsFactory({avalancheTokens:m.avalancheTokens,ethereumTokens:m.ethereumTokens,nativeTokenConfig:m.nativeTokenConfig})();return{analyzeSupport:t.analyzeSupportFactory({serviceAssets:h}),estimateNativeFee:r.estimateNativeFeeFactory({config:m}),getAssets:async()=>h,getMinimumTransferAmount:a.getMinimumTransferAmountFactory({config:m,feeEstimationMultiplier:p}),getSupportedChains:o.getSupportedChainsFactory({environment:d}),streamQuotes:s.streamQuotesFactory({config:m,feeEstimationMultiplier:p,serviceAssets:h}),trackTransfer:c.trackTransferFactory({config:m}),transferAsset:l.transferAssetFactory({config:m,evmSigner:f,feeEstimationMultiplier:p}),type:e.ServiceType.AVALANCHE_EVM}}exports.createAvalancheEvmService=d;
|
|
2
|
+
//# sourceMappingURL=avalanche-evm-service.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avalanche-evm-service.cjs","names":["DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER","getConfig","getAssetsFactory","analyzeSupportFactory","estimateNativeFeeFactory","getMinimumTransferAmountFactory","getSupportedChainsFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/avalanche-evm/avalanche-evm-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { EvmSigner } from '../../types/signer';\nimport type { TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getConfig } from './_utils/get-config';\nimport { DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER } from './_constants';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface AvalancheEvmServiceOptions {\n environment: Environment;\n evmSigner: EvmSigner;\n /**\n * A multiplier for fee estimations used in minimum transfer amount calculations.\n * This multiplier is not used for `getFees` calls, only for `getMinimumTransferAmount`.\n *\n * @default 3n\n */\n feeEstimationMultiplier?: bigint;\n fetch?: Fetch;\n}\n\nexport async function createAvalancheEvmService({\n environment,\n evmSigner,\n feeEstimationMultiplier = DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER,\n}: AvalancheEvmServiceOptions): Promise<TransferService> {\n const config = await getConfig(environment);\n const serviceAssets = await getAssetsFactory({\n avalancheTokens: config.avalancheTokens,\n ethereumTokens: config.ethereumTokens,\n nativeTokenConfig: config.nativeTokenConfig,\n })();\n\n return {\n analyzeSupport: analyzeSupportFactory({ serviceAssets }),\n estimateNativeFee: estimateNativeFeeFactory({ config }),\n getAssets: async () => serviceAssets,\n getMinimumTransferAmount: getMinimumTransferAmountFactory({ config, feeEstimationMultiplier }),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n }),\n trackTransfer: trackTransferFactory({ config }),\n transferAsset: transferAssetFactory({ config, evmSigner, feeEstimationMultiplier }),\n type: ServiceType.AVALANCHE_EVM,\n } satisfies TransferService;\n}\n"],"mappings":"8dA6BA,eAAsB,EAA0B,CAC9C,cACA,YACA,0BAA0BA,EAAAA,iDAC6B,CACvD,IAAM,EAAS,MAAMC,EAAAA,UAAU,EAAY,CACrC,EAAgB,MAAMC,EAAAA,iBAAiB,CAC3C,gBAAiB,EAAO,gBACxB,eAAgB,EAAO,eACvB,kBAAmB,EAAO,kBAC3B,CAAC,EAAE,CAEJ,MAAO,CACL,eAAgBC,EAAAA,sBAAsB,CAAE,gBAAe,CAAC,CACxD,kBAAmBC,EAAAA,yBAAyB,CAAE,SAAQ,CAAC,CACvD,UAAW,SAAY,EACvB,yBAA0BC,EAAAA,gCAAgC,CAAE,SAAQ,0BAAyB,CAAC,CAC9F,mBAAoBC,EAAAA,0BAA0B,CAAE,cAAa,CAAC,CAC9D,aAAcC,EAAAA,oBAAoB,CAChC,SACA,0BACA,gBACD,CAAC,CACF,cAAeC,EAAAA,qBAAqB,CAAE,SAAQ,CAAC,CAC/C,cAAeC,EAAAA,qBAAqB,CAAE,SAAQ,YAAW,0BAAyB,CAAC,CACnF,KAAMC,EAAAA,YAAY,cACnB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ServiceType as e}from"../../constants.js";import{analyzeSupportFactory as t}from"./_handlers/analyze-support.js";import{DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER as n}from"./_constants.js";import{estimateNativeFeeFactory as r}from"./_handlers/estimate-native-fee.js";import{getAssetsFactory as i}from"./_handlers/get-assets.js";import{getMinimumTransferAmountFactory as a}from"./_handlers/get-minimum-transfer-amount.js";import{getSupportedChainsFactory as o}from"./_handlers/get-supported-chains.js";import{streamQuotesFactory as s}from"./_handlers/stream-quotes.js";import{trackTransferFactory as c}from"./_handlers/track-transfer.js";import{transferAssetFactory as l}from"./_handlers/transfer-asset.js";import{getConfig as u}from"./_utils/get-config.js";async function d({environment:d,evmSigner:f,feeEstimationMultiplier:p=n}){let m=await u(d),h=await i({avalancheTokens:m.avalancheTokens,ethereumTokens:m.ethereumTokens,nativeTokenConfig:m.nativeTokenConfig})();return{analyzeSupport:t({serviceAssets:h}),estimateNativeFee:r({config:m}),getAssets:async()=>h,getMinimumTransferAmount:a({config:m,feeEstimationMultiplier:p}),getSupportedChains:o({environment:d}),streamQuotes:s({config:m,feeEstimationMultiplier:p,serviceAssets:h}),trackTransfer:c({config:m}),transferAsset:l({config:m,evmSigner:f,feeEstimationMultiplier:p}),type:e.AVALANCHE_EVM}}export{d as createAvalancheEvmService};
|
|
2
|
+
//# sourceMappingURL=avalanche-evm-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avalanche-evm-service.js","names":[],"sources":["../../../src/transfer-service/avalanche-evm/avalanche-evm-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { EvmSigner } from '../../types/signer';\nimport type { TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getConfig } from './_utils/get-config';\nimport { DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER } from './_constants';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface AvalancheEvmServiceOptions {\n environment: Environment;\n evmSigner: EvmSigner;\n /**\n * A multiplier for fee estimations used in minimum transfer amount calculations.\n * This multiplier is not used for `getFees` calls, only for `getMinimumTransferAmount`.\n *\n * @default 3n\n */\n feeEstimationMultiplier?: bigint;\n fetch?: Fetch;\n}\n\nexport async function createAvalancheEvmService({\n environment,\n evmSigner,\n feeEstimationMultiplier = DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER,\n}: AvalancheEvmServiceOptions): Promise<TransferService> {\n const config = await getConfig(environment);\n const serviceAssets = await getAssetsFactory({\n avalancheTokens: config.avalancheTokens,\n ethereumTokens: config.ethereumTokens,\n nativeTokenConfig: config.nativeTokenConfig,\n })();\n\n return {\n analyzeSupport: analyzeSupportFactory({ serviceAssets }),\n estimateNativeFee: estimateNativeFeeFactory({ config }),\n getAssets: async () => serviceAssets,\n getMinimumTransferAmount: getMinimumTransferAmountFactory({ config, feeEstimationMultiplier }),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n }),\n trackTransfer: trackTransferFactory({ config }),\n transferAsset: transferAssetFactory({ config, evmSigner, feeEstimationMultiplier }),\n type: ServiceType.AVALANCHE_EVM,\n } satisfies TransferService;\n}\n"],"mappings":"kwBA6BA,eAAsB,EAA0B,CAC9C,cACA,YACA,0BAA0B,GAC6B,CACvD,IAAM,EAAS,MAAM,EAAU,EAAY,CACrC,EAAgB,MAAM,EAAiB,CAC3C,gBAAiB,EAAO,gBACxB,eAAgB,EAAO,eACvB,kBAAmB,EAAO,kBAC3B,CAAC,EAAE,CAEJ,MAAO,CACL,eAAgB,EAAsB,CAAE,gBAAe,CAAC,CACxD,kBAAmB,EAAyB,CAAE,SAAQ,CAAC,CACvD,UAAW,SAAY,EACvB,yBAA0B,EAAgC,CAAE,SAAQ,0BAAyB,CAAC,CAC9F,mBAAoB,EAA0B,CAAE,cAAa,CAAC,CAC9D,aAAc,EAAoB,CAChC,SACA,0BACA,gBACD,CAAC,CACF,cAAe,EAAqB,CAAE,SAAQ,CAAC,CAC/C,cAAe,EAAqB,CAAE,SAAQ,YAAW,0BAAyB,CAAC,CACnF,KAAM,EAAY,cACnB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const e=require(`../errors.cjs`),t=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];async function n(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e.AbortedError)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e.AbortedError);n.addEventListener(`abort`,o)}})}function r(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function i(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function a(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function o(t,n){let r=new AbortController,i,a=!1,o=()=>{r.abort(t?.reason??new e.AbortedError)};return t&&(t.aborted?r.abort(t.reason??new e.AbortedError):t.addEventListener(`abort`,o)),n&&n>0&&(i=setTimeout(()=>{a=!0,r.abort(new e.TimeoutError)},n)),{cleanup:()=>{t&&t.removeEventListener(`abort`,o),i&&clearTimeout(i)},signal:r.signal,timedOut:()=>a}}function s(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):i(e,r?.backoff))}async function c(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function l(i,l={},u={}){let{fetch:d,retries:f=3,retryMethods:p=t,retryOn:m=e=>a(e,p)}=u,h=d??globalThis.fetch,g;for(let t=0;t<=f;t++){let{cleanup:a,signal:d,timedOut:p}=o(u.signal,u.timeoutMs);try{let o=await h(i,{...l,signal:d});if(o.ok)return a(),o;let p={attempt:t,init:l,input:i,response:o};if(!await m(p)||t===f){let t;try{t=await c(o)}catch{}throw a(),new e.HttpError(`HTTP ${o.status} ${o.statusText}`,o,t)}let g=r(o.headers.get(`retry-after`)),_=s(t,p,g,u);a(),await n(_,u.signal);continue}catch(r){a(),g=r;let o=e.isAbortedError(r),c={attempt:t,error:r,init:l,input:i};if(!(!o&&await m(c))||t===f)throw p()?new e.TimeoutError:o?new e.AbortedError(r.message??`Aborted`):r;await n(s(t,c,null,u),u.signal);continue}}throw g??Error(`Unknown fetch error.`)}function u(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
|
|
2
|
+
`:``)+i;break;case`event`:e.event=i;break;case`id`:e.id=i;break;case`retry`:{let t=Number(i);if(Number.isFinite(t)){e.retry=Math.floor(t);break}}}return null}}async function d(t,n={}){let r={Accept:n.accept??`application/json`,...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await l(t,{method:o,headers:r,body:i},n);if(!s.headers.get(`content-type`)?.includes(`application/json`))throw new e.HttpError(`Expected application/json response.`,s,await s.text());return await s.json()}function f(e,t){let n=e.pathname,r=n.endsWith(`/`)&&t.startsWith(`/`)?n+t.slice(1):!n.endsWith(`/`)&&!t.startsWith(`/`)?n+`/`+t:n+t;return new URL(r,e)}async function*p(t,n={}){let r={Accept:n.accept??(n.sse===!1?`*/*`:`text/event-stream`),...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await l(t,{body:i,headers:r,method:o},n);if(!s.body)throw new e.HttpError(`Response body is not a readable stream.`,s);let c=s.body.getReader(),d=new TextDecoder,f=u(),p=``;try{for(;;){let{done:e,value:t}=await c.read();if(e)break;p+=d.decode(t,{stream:!0});let r;for(;(r=p.indexOf(`
|
|
3
|
+
`))>=0;){let e=p.slice(0,r);if(p=p.slice(r+1),n.sse===!1)e.length&&(yield e);else{let t=f(e);t&&(yield t)}}}n.sse===!1&&p.length&&(yield p)}finally{try{c.releaseLock()}catch{}}}exports.combineUrlPathnames=f,exports.fetchEventStream=p,exports.fetchJson=d;
|
|
4
|
+
//# sourceMappingURL=fetch-utilities.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-utilities.cjs","names":["AbortedError","TimeoutError","HttpError","isAbortedError"],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\nexport async function _wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await _wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await _wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{AbortedError as e,HttpError as t,TimeoutError as n,isAbortedError as r}from"../errors.js";const i=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];async function a(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e);n.addEventListener(`abort`,o)}})}function o(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function s(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function c(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function l(t,r){let i=new AbortController,a,o=!1,s=()=>{i.abort(t?.reason??new e)};return t&&(t.aborted?i.abort(t.reason??new e):t.addEventListener(`abort`,s)),r&&r>0&&(a=setTimeout(()=>{o=!0,i.abort(new n)},r)),{cleanup:()=>{t&&t.removeEventListener(`abort`,s),a&&clearTimeout(a)},signal:i.signal,timedOut:()=>o}}function u(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):s(e,r?.backoff))}async function d(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function f(s,f={},p={}){let{fetch:m,retries:h=3,retryMethods:g=i,retryOn:_=e=>c(e,g)}=p,v=m??globalThis.fetch,y;for(let i=0;i<=h;i++){let{cleanup:c,signal:m,timedOut:g}=l(p.signal,p.timeoutMs);try{let e=await v(s,{...f,signal:m});if(e.ok)return c(),e;let n={attempt:i,init:f,input:s,response:e};if(!await _(n)||i===h){let n;try{n=await d(e)}catch{}throw c(),new t(`HTTP ${e.status} ${e.statusText}`,e,n)}let r=o(e.headers.get(`retry-after`)),l=u(i,n,r,p);c(),await a(l,p.signal);continue}catch(t){c(),y=t;let o=r(t),l={attempt:i,error:t,init:f,input:s};if(!(!o&&await _(l))||i===h)throw g()?new n:o?new e(t.message??`Aborted`):t;await a(u(i,l,null,p),p.signal);continue}}throw y??Error(`Unknown fetch error.`)}function p(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
|
|
2
|
+
`:``)+i;break;case`event`:e.event=i;break;case`id`:e.id=i;break;case`retry`:{let t=Number(i);if(Number.isFinite(t)){e.retry=Math.floor(t);break}}}return null}}async function m(e,n={}){let r={Accept:n.accept??`application/json`,...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await f(e,{method:o,headers:r,body:i},n);if(!s.headers.get(`content-type`)?.includes(`application/json`))throw new t(`Expected application/json response.`,s,await s.text());return await s.json()}function h(e,t){let n=e.pathname,r=n.endsWith(`/`)&&t.startsWith(`/`)?n+t.slice(1):!n.endsWith(`/`)&&!t.startsWith(`/`)?n+`/`+t:n+t;return new URL(r,e)}async function*g(e,n={}){let r={Accept:n.accept??(n.sse===!1?`*/*`:`text/event-stream`),...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await f(e,{body:i,headers:r,method:o},n);if(!s.body)throw new t(`Response body is not a readable stream.`,s);let c=s.body.getReader(),l=new TextDecoder,u=p(),d=``;try{for(;;){let{done:e,value:t}=await c.read();if(e)break;d+=l.decode(t,{stream:!0});let r;for(;(r=d.indexOf(`
|
|
3
|
+
`))>=0;){let e=d.slice(0,r);if(d=d.slice(r+1),n.sse===!1)e.length&&(yield e);else{let t=u(e);t&&(yield t)}}}n.sse===!1&&d.length&&(yield d)}finally{try{c.releaseLock()}catch{}}}export{h as combineUrlPathnames,g as fetchEventStream,m as fetchJson};
|
|
4
|
+
//# sourceMappingURL=fetch-utilities.js.map
|