@avalabs/bridge-unified 0.0.0-unified-bridge-init-20230824160802 → 0.0.0-utxo-scripts-20241121165155

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 ADDED
@@ -0,0 +1,9 @@
1
+ Copyright (C) 2021, Ava Labs, Inc. All rights reserved.
2
+
3
+ Subject to the limited license below (**”License””), you may not, and you may not permit anyone else to, copy, reproduce, aggregate, republish, download, post, distribute, license, sublicense, reverse engineer, modify, or create derivative works based on this software (collectively, **“Software”**).
4
+
5
+ You are hereby granted a limited, non-exclusive, non-sublicensable and non-transferable license to download and use the Software as-is solely (i) for use in connection with the Avalanche Public Blockchain platform, having a NetworkID of 1 (Mainnet) or 5 (Fuji), and associated blockchains, comprised exclusively of the Avalanche X-Chain, C-Chain, P-Chain and any subnets linked to the P-Chain (**“Avalanche Authorized Platform”**) or (ii) for non-production, testing or research purposes without any commercial application within the Avalanche ecosystem (**“Non-Commercial Use”**); provided that, in each case, you may not use or allow use of the Software (a) in connection with any forks of the Avalanche Authorized Platform, (b) in any manner not operationally connected to the Avalanche Authorized Platform other than for Non-Commercial Use, or (c) to the extent the number of monthly active users or the number of total installs of any software that uses the Software across all versions thereof exceeds 10,000 at any time. You may not modify or alter the Software in any way.
6
+
7
+ You hereby acknowledge and agree to the terms set forth at www.avalabs.org/important-notice.
8
+
9
+ **TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED ON AN “AS IS” BASIS, AND AVA LABS EXPRESSLY DISCLAIMS AND EXCLUDES ALL REPRESENTATIONS, WARRANTIES AND OTHER TERMS AND CONDITIONS, WHETHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION BY OPERATION OF LAW OR BY CUSTOM, STATUTE OR OTHERWISE, AND INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTY, TERM, OR CONDITION OF NON-INFRINGEMENT, MERCHANTABILITY, TITLE, OR FITNESS FOR PARTICULAR PURPOSE. YOU USE THE SOFTWARE AT YOUR OWN RISK. AVA LABS EXPRESSLY DISCLAIMS ALL LIABILITY (INCLUDING FOR ALL DIRECT, CONSEQUENTIAL OR OTHER DAMAGES OR LOSSES) RELATED TO ANY USE OF THE SOFTWARE.**
package/README.md CHANGED
@@ -16,11 +16,11 @@ The bridging ecosystem is complex. There are often multiple tools that can be us
16
16
 
17
17
  These are the bridges we currently support:
18
18
 
19
- - **Avalanche Bridge** - is capable of transferring a fixed list of tokens between Ethereum and Avalanche C-Chain. See the `@avalabs/bridge-avalanche` package.
20
- - **CCTP** - preferred for brdiging USDC between Ethereum and Avalanche C-Chain. See the `@avalabs/bridge-cctp` package.
19
+ - **CCTP** - preferred for bridging USDC between Ethereum and Avalanche C-Chain. See the `bridges/cctp` folder.
21
20
 
22
21
  Future bridges we plan to support:
23
22
 
23
+ - **Avalanche Bridge** - is capable of transferring a fixed list of tokens between Ethereum and Avalanche C-Chain.
24
24
  - **Teleporter** - for moving tokens between subnets.
25
25
  - **Cross-Chain Transfer** - for moving tokens between the three Avalanche Primary Network chains (X-Chain, C-Chain, and P-Chain).
26
26
 
@@ -34,6 +34,209 @@ Future bridges we plan to support:
34
34
  pnpm add @avalabs/bridge-unified
35
35
  ```
36
36
 
37
- ## How it works
37
+ ## Usage
38
38
 
39
- TODO: Explain details of this api.
39
+ ```js
40
+ import { createUnifiedBridgeService, getEnabledBridgeServices, Environment, BridgeTransfer } from '@avalabs/bridge-unified';
41
+
42
+ const environment = Environment.TEST;
43
+ const evmSigner: EvmSigner = {
44
+ sign: async ({ data, from, to, value }) => {
45
+ return await window.ethereum.request({
46
+ method: 'eth_sendTransaction,',
47
+ params:{
48
+ account: from,
49
+ data: data ?? undefined,
50
+ from,
51
+ to: to ?? null,
52
+ chain: undefined,
53
+ value
54
+ }
55
+ });
56
+ },
57
+ };
58
+
59
+ const btcSigner: BtcSigner = {
60
+ sign: async ({ inputs, outputs }) => {
61
+ return await window.ethereum.request({
62
+ method: 'bitcoin_signTransaction',
63
+ params: { inputs, outputs },
64
+ });
65
+ },
66
+ };
67
+
68
+ const cctpInitializer: EvmBridgeInitializer = {
69
+ type: BridgeType.CCTP,
70
+ signer: evmSigner,
71
+ };
72
+ const icttErc20Initializer: EvmBridgeInitializer = {
73
+ type: BridgeType.ICTT_ERC20_ERC20,
74
+ signer: evmSigner,
75
+ };
76
+ const avalancheEvmInitializer: EvmBridgeInitializer = {
77
+ type: BridgeType.AVALANCHE_EVM,
78
+ signer: evmSigner,
79
+ };
80
+ const avalancheBtcInitializer: AvaToBtcBridgeInitializer = {
81
+ type: BridgeType.AVALANCHE_AVA_BTC,
82
+ signer: evmSigner,
83
+ bitcoinFunctions: bitcoinProvider as BitcoinFunctions,
84
+ };
85
+ const bitcoinAvaInitializer: BtcToAvaBridgeInitializer = {
86
+ type: BridgeType.AVALANCHE_BTC_AVA,
87
+ signer: btcSigner,
88
+ bitcoinFunctions: bitcoinProvider as BitcoinFunctions,
89
+ };
90
+
91
+ // use all available bridges
92
+ const enabledBridgeInitializers: BridgeInitializer[] = [
93
+ cctpInitializer,
94
+ icttErc20Initializer,
95
+ avalancheEvmInitializer,
96
+ avalancheBtcInitializer,
97
+ bitcoinAvaInitializer,
98
+ ]
99
+
100
+ // fetch all available bridge services
101
+ const enabledBridgeServices = await getEnabledBridgeServices(environment, disabledBridgeTypes);
102
+
103
+ // create a new service for a given environment and list of bridge services
104
+ const unifiedService = createUnifiedBridgeService({
105
+ environment,
106
+ enabledBridgeServices
107
+ });
108
+
109
+ // get the list of supported assets, grouped by caip2 (https://chainagnostic.org/CAIPs/caip-2) chain IDs
110
+ const assets = await unifiedService.getAssets()
111
+
112
+ // get the bridge fee(s) of the provided transfer
113
+ const fees = await unifiedService.getFees({...})
114
+
115
+ // start a new bridge transfer and store its state
116
+ const bridgeTransfer = await unifiedService.transferAsset({...})
117
+
118
+ // create an update listener for tracking
119
+ const updateListener = (transfer: BridgeTransfer) => {
120
+ console.log(transfer)
121
+ }
122
+
123
+ // start tracking the transfer's state. whenever the state changes, it will call the provided `updateListener`
124
+ const { cancel, result } = await unifiedService.trackTransfer({bridgeTransfer, updateListener, ...})
125
+
126
+ // immediately stops tracking and rejects the tracker's promise
127
+ // cancel()
128
+
129
+ // wait for the transfer to finish and get its final state
130
+ const finalizedBridgeTransfer = await result
131
+ ```
132
+
133
+ ## API
134
+
135
+ ### getEnabledBridgeServices(environment, enabledBridgeInitializers);
136
+
137
+ Type: `(environment: Environment, enabledBridgeInitializers: BridgeInitializer[]) => Promise<BridgeServicesMap>`
138
+
139
+ Returns all available bridge services for a given environment (excluding disabledBridgeTypes). Any bridge service which fails to initialize will be absent from this returned value.
140
+
141
+ #### environment
142
+
143
+ Type: `Environment`
144
+
145
+ Defines if the bridge service should use `testnet` or `mainnet`.
146
+
147
+ #### enabledBridgeInitializers
148
+
149
+ Type: `BridgeInitializer[]`
150
+
151
+ Enables the integration of the provided `BridgeType`s based on each `BridgeInitializer`.
152
+
153
+ #### enabledBridgeServices
154
+
155
+ Type: `BridgeServicesMap` => `Map<BridgeType, BridgeService>`
156
+
157
+ This includes all the bridge services which were initialized successfully, to pass to `createUnifiedBridgeService`.
158
+
159
+ ### createUnifiedBridgeService({ environment, enabledBridgeServices })
160
+
161
+ Returns a new `unifiedBridgeService` for the given `environment` and `enabledBridgeServices` map.
162
+
163
+ ### unifiedBridgeService
164
+
165
+ Contains all the required properties and methods to prepare, initiate or track a bridge transfer.
166
+ Automatically picks the right (enabled) bridge integration to use based on the provided params.
167
+
168
+ ```js
169
+ {
170
+ environment, // the provided Environment during initialization
171
+ getAssets,
172
+ getFees,
173
+ estimateGas,
174
+ canTransferAsset,
175
+ transferAsset,
176
+ trackTransfer,
177
+ }
178
+ ```
179
+
180
+ #### getAssets
181
+
182
+ Type: `() => Promise<ChainAssetMap>`
183
+
184
+ Returns the aggregated list of assets supported by the enabled bridges grouped by [caip2](https://chainagnostic.org/CAIPs/caip-2) chain IDs.
185
+
186
+ #### getFees
187
+
188
+ Type: `(params: FeeParams) => Promise<AssetFeeMap>`
189
+
190
+ Calculates and returns the bridge fees in `tokenAddress` - `amount` pairs for a given bridge transfer.
191
+
192
+ #### estimateGas
193
+
194
+ Type: `(params: TransferParams) => Promise<bigint>`
195
+
196
+ Estimates the gas cost of a specific transfer.
197
+
198
+ #### getMinimumTransferAmount
199
+
200
+ Type: `(params: FeeParams) => Promise<bigint>`
201
+
202
+ Calculates and returns the minimum transfer amount for a given bridge transfer.
203
+
204
+ #### transferAsset
205
+
206
+ Type: `(params: TransferParams) => Promise<BridgeTransfer>`
207
+
208
+ Starts a new bridge transfer, executing every required step in a single call.
209
+ Transactions signing is done by a custom `sign` callback. The custom `sign` implementation may use their own solution or the default `dispatch` callback to submit the transaction to the network.
210
+ Returns a `BridgeTransfer` containing all the (known) initial values such as: environment, addresses, amount, fee, transaction hash, required and actual block confirmation counts, etc.
211
+
212
+ Notes about TransferParams:
213
+ fromAddress: The address where the bridge amount is from.
214
+
215
+ toAddress: The address where the bridge amount is going to end up.
216
+
217
+ For example, A user has an account with AddressC and AddressBtc.
218
+ The user wants to bridge some funds from Ethereum to Avalanche using the same address. FromAddress and toAddress will be both AddressC.
219
+
220
+ The user wants to bridge some funds from Bitcoin to Avalanche.
221
+ FromAddress is AddressBtc and toAddress is AddressC.
222
+
223
+ Some bridges allows you to bridge the tokens to a different address. (CCTP and ICTT ERC20).
224
+ In this case, fromAddress is the address of the token is getting bridged from. And toAddress is the address which is going to receive the bridged funds.
225
+
226
+ #### trackTransfer
227
+
228
+ Type: `(params: TrackingParams) => ({cancel, result})`
229
+
230
+ Tracks the given `BridgeTransfer`'s progress and invokes the provided listener callback whenever a change happens.
231
+
232
+ ###### cancel
233
+
234
+ Type: `() => void`
235
+
236
+ If it's still pending, rejects the tracker's promise (`result`) immediately and breaks its loop under the hood.
237
+
238
+ ###### result
239
+
240
+ Type: `Promise<BridgeTransfer>`
241
+
242
+ Resolves with the finalized `BridgeTransfer` (if not canceled before).
package/dist/index.cjs CHANGED
@@ -1,7 +1,43 @@
1
1
  'use strict';
2
2
 
3
- var o=class extends Error{constructor(s,a){super(s);this.code=a;this.code=a;}},e=class extends o{constructor(t="Not implemented"){super(t,5001),this.name="NotImplementedError";}};var n=async r=>{throw new e};var i=r=>{throw new e};var m=async({address:r,chainIds:t})=>{throw new e};var O=r=>({planBridgeJourney:i,executeBridgeJourneyStep:n,checkForPendingBridgeJourney:m});
3
+ var lodash = require('lodash');
4
+ var viem = require('viem');
5
+ var zod = require('zod');
6
+ var base = require('@scure/base');
7
+ var sha256 = require('@noble/hashes/sha256');
8
+ var utils = require('@noble/hashes/utils');
9
+ var ri = require('coinselect');
4
10
 
5
- exports.createUnifiedBridgeService = O;
11
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
+
13
+ var ri__default = /*#__PURE__*/_interopDefault(ri);
14
+
15
+ var j=(r=>(r.NATIVE="native",r.ERC20="erc20",r))(j||{}),U=e=>e.type==="erc20",ce=e=>e.type==="native";var B=(s=>(s.AVALANCHE_EVM="avalanche-evm",s.AVALANCHE_BTC_AVA="avalanche-btc-ava",s.AVALANCHE_AVA_BTC="avalanche-ava-btc",s.CCTP="cctp",s.ICTT_ERC20_ERC20="ictt-erc20-erc20",s))(B||{}),Ni=["avalanche-ava-btc","avalanche-btc-ava"],yr=["avalanche-evm","cctp","ictt-erc20-erc20"],Ri=e=>yr.includes(e.type),dt=e=>e.type==="avalanche-ava-btc",ut=e=>e.type==="avalanche-btc-ava",de=(n=>(n.AllowanceApproval="allowance-approval",n.TokensTransfer="tokens-transfer",n.WrapToken="wrap-token",n))(de||{});var ne=(r=>(r.FUJI="eip155:43113",r.MAINNET="eip155:43114",r))(ne||{}),Re=(r=>(r.MAINNET="eip155:1",r.SEPOLIA="eip155:11155111",r))(Re||{}),re=(r=>(r.MAINNET="bip122:000000000019d6689c085ae165831e93",r.TESTNET="bip122:000000000933ea01ad0ee984209779ba",r))(re||{}),Di={chainId:"eip155:43113",chainName:"Avalanche Fuji",rpcUrl:"https://api.avax-test.network/ext/bc/C/rpc",networkToken:{type:"native",name:"AVAX",symbol:"AVAX",decimals:18}},_i={chainId:"eip155:43114",chainName:"Avalanche Mainnet",rpcUrl:"https://api.avax.network/ext/bc/C/rpc",networkToken:{type:"native",name:"AVAX",symbol:"AVAX",decimals:18}},Fi={chainId:"eip155:11155111",chainName:"Ethereum Sepolia",rpcUrl:"https://proxy-api.avax.network/proxy/infura/sepolia",networkToken:{type:"native",name:"ETH",symbol:"ETH",decimals:18}},Mi={chainId:"eip155:1",chainName:"Ethereum Mainnet",rpcUrl:"https://proxy-api.avax.network/proxy/infura/mainnet",networkToken:{type:"native",name:"ETH",symbol:"ETH",decimals:18}},Oi={chainId:"bip122:000000000933ea01ad0ee984209779ba",chainName:"Bitcoin Testnet",rpcUrl:"",networkToken:{type:"native",name:"Bitcoin",symbol:"BTC",decimals:8}},Hi={chainId:"bip122:000000000019d6689c085ae165831e93",chainName:"Bitcoin Mainnet",rpcUrl:"",networkToken:{type:"native",name:"Bitcoin",symbol:"BTC",decimals:8}};var ae=(i=>(i.DEV="dev",i.PROD="production",i.STAGING="staging",i.TEST="test",i))(ae||{});var z=(s=>(s[s.BRIDGE_NOT_AVAILABLE=5001]="BRIDGE_NOT_AVAILABLE",s[s.INITIALIZATION_FAILED=5002]="INITIALIZATION_FAILED",s[s.INVALID_PARAMS=5003]="INVALID_PARAMS",s[s.TIMEOUT=5004]="TIMEOUT",s[s.TRANSACTION_REVERTED=5005]="TRANSACTION_REVERTED",s))(z||{}),I=(A=>(A.ASSET_NOT_SUPPORTED="ASSET_NOT_SUPPORTED",A.CHAIN_NOT_SUPPORTED="CHAIN_NOT_SUPPORTED",A.CONFIG_NOT_AVAILABLE="CONFIG_NOT_AVAILABLE",A.CONFIRMATION_COUNT_UNKNOWN="CONFIRMATION_COUNT_UNKNOWN",A.ENVIRONMENT_NOT_SUPPORTED="ENVIRONMENT_NOT_SUPPORTED",A.IDENTICAL_CHAINS_PROVIDED="IDENTICAL_CHAINS_PROVIDED",A.INCORRECT_ADDRESS_PROVIDED="INCORRECT_ADDRESS_PROVIDED",A.INCORRECT_AMOUNT_PROVIDED="INCORRECT_AMOUNT_PROVIDED",A.INCORRECT_HASH_PROVIDED="INCORRECT_HASH_PROVIDED",A.INCORRECT_PROVIDER_PROVIDED="INCORRECT_PROVIDER_PROVIDED",A.INCORRECT_SIGNER_PROVIDED="INCORRECT_SIGNER_PROVIDED",A.INCORRECT_TXHASH_PROVIDED="INCORRECT_TXHASH_PROVIDED",A.INVALID_PARAMS="INVALID_PARAMS",A.UNKNOWN="UNKNOWN",A.VULNERABLE_TOKEN_APPROVAL_ADDRESS="VULNERABLE_TOKEN_APPROVAL_ADDRESS",A.WARDEN_CONFIG_MISMATCH="WARDEN_CONFIG_MISMATCH",A.WARDEN_CONFIG_MISSING_NETWORK="WARDEN_CONFIG_MISSING_NETWORK",A.ADDRESS_IS_BLOCKED="ADDRESS_IS_BLOCKED",A))(I||{});function yt(e){let t=e.map(r=>r.chainId);return e.reduce((r,n)=>(r[n.chainId]=n.tokens.map(i=>({...i,type:"erc20",destinations:t.reduce((s,o)=>(n.chainId!==o&&(s[o]||(s[o]=[]),s[o]?.push("cctp")),s),{})})),r),{})}var lr="^[-a-z0-9]{3,8}$",fr="^[-_a-zA-Z0-9]{1,50}$",lt=":",Tr=e=>{let[t,r]=e.split(lt);if(!t||!r)throw new Error("Invalid identifier provided.");if(!new RegExp(lr).test(t))throw new Error("Invalid namespace provided.");if(!new RegExp(fr).test(r))throw new Error("Invalid reference provided.");return {namespace:t,reference:r}},gr=({namespace:e,reference:t})=>`${e}${lt}${t}`,Ar=({namespace:e,reference:t})=>{if(e!=="eip155")throw new Error("Invalid namespace provided.");let r=Number(t);if(isNaN(r))throw new Error("Invalid reference provided.");return `0x${r.toString(16)}`},b={toJSON:Tr,toString:gr,toEip155HexChainId:Ar};var br=e=>{let{reference:t}=b.toJSON(e.chainId);return {id:Number(t),name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},network:e.chainName,rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses?.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}},h=({chain:e})=>{let t=br(e),r=viem.http(e.rpcUrl,{batch:!0,retryCount:0});return viem.createWalletClient({chain:t,transport:r}).extend(viem.publicActions)};var ie=[{inputs:[{internalType:"address",name:"circleTokenMessenger_",type:"address"},{internalType:"address",name:"burnToken_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"AlreadyAdmin",type:"error"},{inputs:[],name:"AlreadyFeeCollector",type:"error"},{inputs:[],name:"AlreadySupportedBurnToken",type:"error"},{inputs:[],name:"AmountLessThanFee",type:"error"},{inputs:[],name:"BalanceNotIncreased",type:"error"},{inputs:[],name:"CannotRemoveLastAdmin",type:"error"},{inputs:[],name:"FeePercentageGreaterThanMax",type:"error"},{inputs:[],name:"InvalidAdminAddress",type:"error"},{inputs:[],name:"InvalidFeeCollector",type:"error"},{inputs:[],name:"InvalidMintRecipientAddress",type:"error"},{inputs:[],name:"InvalidTokenAddress",type:"error"},{inputs:[],name:"InvalidTokenMessengerAddress",type:"error"},{inputs:[],name:"MaxFeeLessThanMinFee",type:"error"},{inputs:[],name:"NotAdmin",type:"error"},{inputs:[],name:"NotFeeCollector",type:"error"},{inputs:[],name:"UnSupportedBurnToken",type:"error"},{inputs:[],name:"UnsupportedDomain",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"BurnTokenAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"BurnTokenRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"feeCollector",type:"address"}],name:"FeeCollectorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"feeCollector",type:"address"}],name:"FeeCollectorRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint32",name:"domain",type:"uint32"},{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],indexed:!1,internalType:"struct FeeCalculator.FeeConfiguration",name:"feeConfiguration",type:"tuple"}],name:"FeeConfigurationUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"account",type:"address"}],name:"Paused",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint64",name:"nonce",type:"uint64"},{indexed:!1,internalType:"address",name:"burnToken",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"depositor",type:"address"},{indexed:!1,internalType:"address",name:"mintRecipient",type:"address"},{indexed:!1,internalType:"uint32",name:"destinationDomain",type:"uint32"},{indexed:!1,internalType:"uint256",name:"totalFee",type:"uint256"}],name:"TransferTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"account",type:"address"}],name:"Unpaused",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"addAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"feeCollector",type:"address"}],name:"addFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"addSupportedBurnToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint32",name:"destinationDomain",type:"uint32"}],name:"calculateFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"circleTokenMessenger",outputs:[{internalType:"contract ICircleTokenMessenger",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"circleTokenMessengerAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"collectFees",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"getFeeAmounts",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getFeeConfiguration",outputs:[{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],internalType:"struct FeeCalculator.FeeConfiguration",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getFeePercentage",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getMaxFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getMinFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getTxnFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isFeeCollector",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"isSupportedBurnToken",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"isSupportedDomain",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"pause",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"paused",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"removeAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"feeCollector",type:"address"}],name:"removeFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"removeSupportedBurnToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"},{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],internalType:"struct FeeCalculator.FeeConfiguration",name:"feeConfiguration",type:"tuple"}],name:"setFeeConfiguration",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"supportedBurnTokens",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint32",name:"destinationDomain",type:"uint32"},{internalType:"address",name:"mintRecipient",type:"address"},{internalType:"address",name:"burnToken",type:"address"}],name:"transferTokens",outputs:[{internalType:"uint64",name:"nonce",type:"uint64"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"unpause",outputs:[],stateMutability:"nonpayable",type:"function"}];var q=class extends Error{constructor(r,n,i){super(r);this.code=n;this.details=i;}};var Se=class extends q{constructor(t="UNKNOWN",r){super(t,5001,r),this.name="BridgeUnavailableError";}};var w=class extends q{constructor(t="UNKNOWN",r){super(t,5002,r),this.name="BridgeInitializationError";}};var f=class extends q{constructor(t="INVALID_PARAMS",r){super(t,5003,r),this.name="InvalidParamsError";}};var M=({sourceChain:e,targetChain:t,amount:r,asset:n},i)=>{if(e.chainId===t.chainId)throw new f("IDENTICAL_CHAINS_PROVIDED");if(r<=0n)throw new f("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");let s=i.find(p=>p.chainId===e.chainId);if(!s)throw new f("CHAIN_NOT_SUPPORTED",`Not supported on source chain "${e.chainId}"`);let o=i.find(p=>p.chainId===t.chainId);if(!o)throw new f("CHAIN_NOT_SUPPORTED",`Not supported on target chain "${t.chainId}"`);let a=s.tokens.find(p=>p.symbol===n.symbol),m=o.tokens.find(p=>p.symbol===n.symbol);if(!a||!m)throw new f("ASSET_NOT_SUPPORTED");return {sourceChainData:s,targetChainData:o,burnToken:a,mintToken:m}};async function $(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s}=t,{sourceChainData:o,targetChainData:a,burnToken:m}=M({sourceChain:r,targetChain:n,asset:i,amount:s},e),c=await h({chain:r}).readContract({address:o.tokenRouterAddress,abi:ie,functionName:"calculateFee",args:[s,a.domain]});return {[o.chainId]:{[m.address]:c}}}var R=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"feeAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"feeAmount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"originTxId",type:"bytes32"}],name:"Mint",type:"event"}];function Tt({amount:e,burnToken:t,targetChainData:r,toAddress:n}){return viem.encodeFunctionData({abi:ie,functionName:"transferTokens",args:[e,r.domain,n,t.address]})}function gt({amount:e,sourceChainData:t}){return viem.encodeFunctionData({abi:R,functionName:"approve",args:[t.tokenRouterAddress,e]})}var vr=async(e,t,r)=>{let{sourceChain:n,targetChain:i,asset:s,amount:o,fromAddress:a,toAddress:m,onStepChange:p,gasSettings:c}=t,{sourceChainData:d,targetChainData:u,burnToken:y}=M({sourceChain:n,targetChain:i,asset:s,amount:o},e),T=h({chain:n}),C=await T.readContract({address:y.address,abi:R,functionName:"allowance",args:[a,d.tokenRouterAddress]})<o,v=C?2:1;if(C){let S={currentSignature:1,currentSignatureReason:"allowance-approval",requiredSignatures:v};p?.(S);let F=gt({amount:o,sourceChainData:d}),he=await r.sign({from:a,to:y.address,data:F,...c?{maxFeePerGas:c.price,maxPriorityFeePerGas:c.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(n.chainId))},ur=>T.sendRawTransaction({serializedTransaction:ur}),S);await T.waitForTransactionReceipt({hash:he,pollingInterval:1e3});}let A={currentSignature:C?2:1,currentSignatureReason:"tokens-transfer",requiredSignatures:v};p?.(A);let x=Tt({amount:o,burnToken:y,targetChainData:u,toAddress:m});return r.sign({from:a,to:d.tokenRouterAddress,data:x,...c?{maxFeePerGas:c.price,maxPriorityFeePerGas:c.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(n.chainId))},S=>T.sendRawTransaction({serializedTransaction:S}),A)},Ir=async e=>{try{return await e.getBlockNumber()}catch{return}};async function At(e,t,r,n){let{minimumConfirmations:i}=e.find(u=>u.chainId===t.sourceChain.chainId)??{},{minimumConfirmations:s}=e.find(u=>u.chainId===t.targetChain.chainId)??{};if(!i||!s)throw new f("CONFIRMATION_COUNT_UNKNOWN");let o=await $(e,{asset:t.asset,amount:t.amount,sourceChain:t.sourceChain,targetChain:t.targetChain}),a=U(t.asset)?o[t.sourceChain.chainId]?.[t.asset.address]??0n:0n,m=await vr(e,t,n),p=Date.now(),c=h({chain:t.targetChain}),d=await Ir(c);return {type:"cctp",environment:r,fromAddress:t.fromAddress,toAddress:t.toAddress??t.fromAddress,amount:t.amount,asset:t.asset,bridgeFee:a,sourceChain:t.sourceChain,sourceStartedAt:p,sourceTxHash:m,sourceConfirmationCount:0,sourceRequiredConfirmationCount:i,targetChain:t.targetChain,targetConfirmationCount:0,targetRequiredConfirmationCount:s,targetStartBlockNumber:d}}var Ke=async e=>new Promise(t=>{setTimeout(t,e);});var D=({promise:e,delay:t,startAfter:r})=>{let n=!1,i=!1,s=0,o,a,m=d=>{o&&n&&(n=!1,o(d));},p=()=>{i=!0,a&&n&&(n=!1,a("cancelled"));};return {result:new Promise((d,u)=>{n=!0,o=d,a=u;let y=async()=>{if(!(!n||i)){try{if(await e(m),!n||i)return;await Ke(t);}catch(T){console.error(T.message),s+=1,await Ke(2**s*t);}await y();}};r?setTimeout(y,r):y();}),cancel:p}};var Ee=(r=>(r[r.Ethereum=0]="Ethereum",r[r.Avalanche=1]="Avalanche",r))(Ee||{});var X=zod.z.string().refine(e=>viem.isAddress(e),e=>({message:`Invalid EVM address '${e}'`})).transform(e=>e);var Br=zod.z.object({address:X,name:zod.z.string(),symbol:zod.z.string(),decimals:zod.z.number().positive()}),wr=zod.z.coerce.string().transform((e,t)=>{let r=e.startsWith("eip155:")?e:`eip155:${e}`;try{let n=b.toJSON(r);return b.toString(n)}catch{return t.addIssue({code:zod.z.ZodIssueCode.custom,message:"Invalid chain id, neither numeric nor caip2 compliant"}),zod.z.NEVER}}),Nr=zod.z.object({chainId:wr,domain:zod.z.nativeEnum(Ee),tokenRouterAddress:X,messageTransmitterAddress:X,tokens:zod.z.array(Br),minimumConfirmations:zod.z.number().positive()}),Ct=zod.z.array(Nr);var Rr=e=>e==="production"||e==="test",Sr={test:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.test.json",production:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.json"},ht=async e=>{if(!Rr(e))throw new w("ENVIRONMENT_NOT_SUPPORTED",`CCTP does not support ${e} environment`);try{let r=await(await fetch(Sr[e])).json();return Ct.parse(r)}catch(t){throw new w("CONFIG_NOT_AVAILABLE",`Error while fetching CCTP config: ${t.message}`)}},Je=e=>{switch(e){case"eip155:43114":case"eip155:43113":return 1e3;default:return 2e4}};var E=(e,t,r)=>{let n=lodash.omitBy(t,lodash.isNil),i={...lodash.cloneDeep(e),...lodash.cloneDeep(n)};return r(i),i},_r=1e3*60*60*3,Fr=1024n,Mr=5e3,k={trackingLimitMs:_r,maxBlocks:Fr,initialDelayMs:Mr};var K=(e,t)=>e.gasPrice&&BigInt(e.gasPrice*t.gasUsed);var se=({targetClient:e,sourceClient:t,getMetadata:r,checkMetadata:n,trackingParams:{bridgeTransfer:i,updateListener:s},trackingConfig:{trackingLimitMs:o}})=>{let a=lodash.cloneDeep(i);return async p=>{if(a.completedAt||n(a.metadata))return p(a);if(a.sourceStartedAt+o<=Date.now())return a=E(a,{completedAt:Date.now(),errorCode:5004},s),p(a);if(!viem.isHash(a.sourceTxHash))return;let c=await t.getTransactionReceipt({hash:a.sourceTxHash});if(a.sourceNetworkFee===void 0){let g=await t.getTransaction({hash:a.sourceTxHash}),C=K(g,c);C&&(a=E(a,{sourceNetworkFee:C},s));}if(c.status==="reverted")return a=E(a,{completedAt:Date.now(),errorCode:5005},s),p(a);if(!viem.isHash(a.sourceTxHash))return;let d=await t.getTransactionConfirmations({hash:a.sourceTxHash}),u=d>a.sourceConfirmationCount,y=d>=a.sourceRequiredConfirmationCount;if(u){let g={};g.sourceConfirmationCount=Number(d),y||(g.targetStartBlockNumber=await e.getBlockNumber()),a=E(a,g,s);}if(!y)return;a.targetStartBlockNumber||(a=E(a,{targetStartBlockNumber:await e.getBlockNumber()},s));let T=r(c);return a=E(a,{targetStartedAt:Date.now(),metadata:T},s),p(a)}};var oe=({targetClient:e,getTargetTxHash:t,checkMetadata:r,trackingParams:{bridgeTransfer:n,updateListener:i},trackingConfig:{trackingLimitMs:s,maxBlocks:o}})=>{if(!n.completedAt&&!r(n.metadata))throw new f("INVALID_PARAMS","metadata is missing");if(!n.targetStartBlockNumber)throw new f("INVALID_PARAMS","targetStartBlockNumber is missing");let a=lodash.cloneDeep(n);return async p=>{if(a.completedAt)return p(a);if(a.sourceStartedAt+s<=Date.now())return a=E(a,{completedAt:Date.now(),errorCode:5004},i),p(a);if(!a.targetStartBlockNumber)throw new Error("unreachable");if(!a.targetTxHash){let g=await e.getBlockNumber(),C=a.targetStartBlockNumber-o,v=C>=0n?C:"earliest",A=a.targetStartBlockNumber+o,x=A<g?A:"latest",S=await t({fromBlock:v,toBlock:x,metadata:a.metadata});if(S)a=E(a,{targetTxHash:S},i);else {a=E(a,{targetStartBlockNumber:g},i);return}}if(lodash.isNil(a.targetTxHash)||!viem.isHash(a.targetTxHash))return;let d=await e.getTransactionReceipt({hash:a.targetTxHash});if(!a.targetNetworkFee){let g=await e.getTransaction({hash:a.targetTxHash}),C=K(g,d);C&&(a=E(a,{targetNetworkFee:C},i));}if(d.status==="reverted")return a=E(a,{completedAt:Date.now(),errorCode:5005},i),p(a);if(lodash.isNil(a.targetTxHash)||!viem.isHash(a.targetTxHash))return;let u=await e.getTransactionConfirmations({hash:a.targetTxHash}),y=u>a.targetConfirmationCount,T=u>=a.targetRequiredConfirmationCount;if(y&&(a=E(a,{targetConfirmationCount:Number(u)},i)),!!T)return a=E(a,{completedAt:Date.now()},i),p(a)}};var Ze=e=>lodash.isObject(e)&&typeof e.nonce=="bigint",xt=({sourceChainData:e})=>r=>{let n=r.logs.find(o=>o.address.toLowerCase()===e.tokenRouterAddress.toLowerCase()?viem.decodeEventLog({abi:ie,...o}).eventName==="TransferTokens":!1);if(!n)throw new f("INVALID_PARAMS",`unable to find a TransferTokens event in source transaction "${r.transactionHash}"`);return {nonce:viem.decodeEventLog({abi:ie,eventName:"TransferTokens",...n}).args.nonce}},Lr={name:"MessageReceived",type:"event",inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"uint32",name:"sourceDomain",type:"uint32"},{indexed:!0,internalType:"uint64",name:"nonce",type:"uint64"},{indexed:!1,internalType:"bytes32",name:"sender",type:"bytes32"},{indexed:!1,internalType:"bytes",name:"messageBody",type:"bytes"}]},Bt=({targetClient:e,transferData:{targetChainData:t}})=>async({fromBlock:n,toBlock:i,metadata:s})=>(await e.getLogs({address:t.messageTransmitterAddress,event:Lr,args:{nonce:s?.nonce},fromBlock:n,toBlock:i}))[0]?.transactionHash;var Gr=async(e,t)=>{let{bridgeTransfer:r}=t,{asset:n,amount:i,sourceChain:s,targetChain:o}=r,a=M({sourceChain:s,targetChain:o,asset:n,amount:i},e),{sourceChainData:m}=a,p=h({chain:s}),c=h({chain:o}),d=xt(a),u=se({sourceClient:p,targetClient:c,getMetadata:d,checkMetadata:Ze,trackingParams:t,trackingConfig:k});return D({promise:u,delay:Je(m.chainId),startAfter:k.initialDelayMs})},Ur=async(e,t)=>{let{bridgeTransfer:r}=t,{asset:n,amount:i,sourceChain:s,targetChain:o}=r,a=h({chain:o}),m=M({sourceChain:s,targetChain:o,asset:n,amount:i},e),p=Bt({targetClient:a,transferData:m}),c=oe({targetClient:a,getTargetTxHash:p,checkMetadata:Ze,trackingParams:t,trackingConfig:k});return D({promise:c,delay:Je(m.targetChainData.chainId),startAfter:k.initialDelayMs})};function Nt(e,t){if(!viem.isHash(t.bridgeTransfer.sourceTxHash)||t.bridgeTransfer.targetTxHash&&!viem.isHash(t.bridgeTransfer.targetTxHash))throw new f("INCORRECT_TXHASH_PROVIDED");let r,n=()=>{r?.();};return {result:(async()=>{let{updateListener:s,bridgeTransfer:o}=t,{result:a,cancel:m}=await Gr(e,{updateListener:s,bridgeTransfer:o});r=m;let p=await a,{result:c,cancel:d}=await Ur(e,{updateListener:s,bridgeTransfer:p});return r=d,c})(),cancel:n}}var zr=60000n,Rt=175000n,Wr=60000n,St=215000n;async function Pt(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s,fromAddress:o}=t,{sourceChainData:a,burnToken:m}=M({sourceChain:r,targetChain:n,asset:i,amount:s},e),c=await h({chain:r}).readContract({address:m.address,abi:R,functionName:"allowance",args:[o,a.tokenRouterAddress]}),d=a.domain===1;return c>=s?d?St:Rt:d?Wr+St:zr+Rt}async function Dt(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s}=t,{burnToken:o}=M({sourceChain:r,targetChain:n,asset:i,amount:s},e);return (await $(e,t))[r.chainId]?.[o.address]??1n}async function _t(e,t){let{mintToken:r,burnToken:n}=M(t,e),i={...r,type:"erc20"},s=await $(e,t);return {asset:i,amount:t.amount-(s[t.sourceChain.chainId]?.[n.address]??0n)}}var _="0x0000000000000000000000000000000000000000";function Ft(e,t){for(let r of e){if(r.chainId!==t.chainId)continue;let n=t.tokenTransfers.find(({symbol:d})=>r.tokens.some(({symbol:u})=>u===d));if(!n)continue;let i=r.domain===1,s=t.chainId==="eip155:43113"||t.chainId==="eip155:11155111",o=s?"eip155:11155111":"eip155:1",a=s?"eip155:43113":"eip155:43114";if(viem.isAddressEqual(t.to,r.tokenRouterAddress)||viem.isAddressEqual(n.to,r.tokenRouterAddress))return {isBridgeTx:!0,bridgeType:"cctp",sourceChainId:t.chainId,targetChainId:i?o:a};let p=viem.isAddressEqual(t.from,r.messageTransmitterAddress),c=viem.isAddressEqual(n.from,_);if(p||c)return {isBridgeTx:!0,bridgeType:"cctp",sourceChainId:i?o:a,targetChainId:t.chainId}}return {isBridgeTx:!1}}var Qe=e=>{let{fromAddress:t,toAddress:r}=e;if(!viem.isAddress(t)||!viem.isAddress(r))throw new f("INCORRECT_ADDRESS_PROVIDED");return {fromAddress:t,toAddress:r}};function ue(e){let{chainId:t,from:r,to:n,tokenTransfers:i}=e,{fromAddress:s,toAddress:o}=Qe({fromAddress:r,toAddress:n}),a=i.map(m=>{let{from:p,to:c,symbol:d}=m;if(!p||!viem.isAddress(p)||!c||!viem.isAddress(c))throw new f("INCORRECT_ADDRESS_PROVIDED");return {from:p,to:c,symbol:d}});return {chainId:t,from:s,to:o,tokenTransfers:a}}var W=({fromAddress:e,...t})=>{if(!viem.isAddress(e))throw new f("INCORRECT_ADDRESS_PROVIDED");return {fromAddress:e,...t}},ye=({fromAddress:e,toAddress:t,...r})=>{let{fromAddress:n,toAddress:i}=Qe({fromAddress:e,toAddress:t});return {fromAddress:n,toAddress:i,...r}};var Ot=async(e,t)=>{let r=await ht(e);return {type:"cctp",analyzeTx:n=>{try{return Ft(r,ue(n))}catch{return {isBridgeTx:!1}}},estimateGas:n=>Pt(r,W(n)),estimateReceiveAmount:n=>_t(r,W(n)),getAssets:()=>yt(r),getFees:n=>$(r,n),transferAsset:n=>At(r,ye(n),e,t),trackTransfer:n=>Nt(r,n),getMinimumTransferAmount:n=>Dt(r,n)}};var jr=({sourceChain:e,targetChain:t,asset:r},n)=>{let i=n.find(a=>a.homeChain.chainId===e.chainId),s=i?.erc20Bridges.find(a=>a.baseToken.address===r.address&&a.remotes.some(({remoteChain:m})=>m.chainId===t.chainId)),o=s?.remotes.find(a=>a.remoteChain.chainId===t.chainId);return {chainBridgeConfig:i,tokenHomeConfig:s,tokenRemoteConfig:o}},qr=({sourceChain:e,targetChain:t,asset:r},n)=>{let i=n.find(a=>a.homeChain.chainId===t.chainId),s=i?.erc20Bridges.find(a=>a.remotes.find(m=>m.tokenRemoteAddress===r.address&&m.remoteChain.chainId===e.chainId)),o=s?.remotes.find(a=>a.tokenRemoteAddress===r.address&&a.remoteChain.chainId===e.chainId);return {chainBridgeConfig:i,tokenHomeConfig:s,tokenRemoteConfig:o}},O=({sourceChain:e,targetChain:t,amount:r,asset:n},i)=>{if(e.chainId===t.chainId)throw new f("IDENTICAL_CHAINS_PROVIDED");if(r<=0n)throw new f("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");if(!U(n))throw new f("ASSET_NOT_SUPPORTED","Only ERC20 assets supported");let s=jr({sourceChain:e,targetChain:t,asset:n},i),o=qr({sourceChain:e,targetChain:t,asset:n},i);if(s.chainBridgeConfig&&s.tokenHomeConfig&&s.tokenRemoteConfig){let{chainBridgeConfig:a,tokenHomeConfig:m,tokenRemoteConfig:p}=s;return {homeToRemote:!0,chainBridgeConfig:a,tokenHomeConfig:m,tokenRemoteConfig:p}}if(o.chainBridgeConfig&&o.tokenHomeConfig&&o.tokenRemoteConfig){let{chainBridgeConfig:a,tokenHomeConfig:m,tokenRemoteConfig:p}=o;return {homeToRemote:!1,chainBridgeConfig:a,tokenHomeConfig:m,tokenRemoteConfig:p}}throw new f("ASSET_NOT_SUPPORTED","No Home->Remote or Remote->Home route exists for this asset")};var $r=60000n,Ht=215000n,Vt=async(e,t)=>{let{sourceChain:r,targetChain:n,asset:i,amount:s,fromAddress:o}=t,{tokenHomeConfig:a,homeToRemote:m,tokenRemoteConfig:p}=O({sourceChain:r,targetChain:n,asset:i,amount:s},e);return await h({chain:r}).readContract({address:m?a.baseToken.address:p.tokenRemoteAddress,abi:R,functionName:"allowance",args:[o,m?a.tokenHomeAddress:p.tokenRemoteAddress]})>=s?Ht:$r+Ht};var Lt=e=>{let t=e.reduce((n,i)=>(n[i.homeChain.chainId]=i.erc20Bridges.map(s=>({...s.baseToken,destinations:s.remotes.reduce((o,a)=>(o[a.remoteChain.chainId]=["ictt-erc20-erc20"],o),{})})),n),{}),r=e.reduce((n,i)=>{for(let s of i.erc20Bridges)for(let o of s.remotes){let a=n[o.remoteChain.chainId]??[];n[o.remoteChain.chainId]=[...a,{...s.baseToken,address:o.tokenRemoteAddress,destinations:{[i.homeChain.chainId]:["ictt-erc20-erc20"]}}];}return n},{});return {...t,...r}};async function le(e,t){return O(t,e),{}}var be=[{type:"constructor",inputs:[{name:"teleporterRegistryAddress",type:"address",internalType:"address"},{name:"teleporterManager",type:"address",internalType:"address"},{name:"tokenAddress_",type:"address",internalType:"address"},{name:"tokenDecimals_",type:"uint8",internalType:"uint8"}],stateMutability:"nonpayable"},{type:"function",name:"addCollateral",inputs:[{name:"remoteBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"remoteTokenTransferrerAddress",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"blockchainID",inputs:[],outputs:[{name:"",type:"bytes32",internalType:"bytes32"}],stateMutability:"view"},{type:"function",name:"getMinTeleporterVersion",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"isTeleporterAddressPaused",inputs:[{name:"teleporterAddress",type:"address",internalType:"address"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{type:"function",name:"owner",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{type:"function",name:"pauseTeleporterAddress",inputs:[{name:"teleporterAddress",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"receiveTeleporterMessage",inputs:[{name:"sourceBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"originSenderAddress",type:"address",internalType:"address"},{name:"message",type:"bytes",internalType:"bytes"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"registeredRemotes",inputs:[{name:"remoteBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"remoteTokenTransferrerAddress",type:"address",internalType:"address"}],outputs:[{name:"registered",type:"bool",internalType:"bool"},{name:"collateralNeeded",type:"uint256",internalType:"uint256"},{name:"tokenMultiplier",type:"uint256",internalType:"uint256"},{name:"multiplyOnRemote",type:"bool",internalType:"bool"}],stateMutability:"view"},{type:"function",name:"renounceOwnership",inputs:[],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"send",inputs:[{name:"input",type:"tuple",internalType:"struct SendTokensInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"}]},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"sendAndCall",inputs:[{name:"input",type:"tuple",internalType:"struct SendAndCallInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipientContract",type:"address",internalType:"address"},{name:"recipientPayload",type:"bytes",internalType:"bytes"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"recipientGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"},{name:"fallbackRecipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"}]},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"teleporterRegistry",inputs:[],outputs:[{name:"",type:"address",internalType:"contract TeleporterRegistry"}],stateMutability:"view"},{type:"function",name:"token",inputs:[],outputs:[{name:"",type:"address",internalType:"contract IERC20"}],stateMutability:"view"},{type:"function",name:"tokenAddress",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{type:"function",name:"tokenDecimals",inputs:[],outputs:[{name:"",type:"uint8",internalType:"uint8"}],stateMutability:"view"},{type:"function",name:"transferOwnership",inputs:[{name:"newOwner",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"transferredBalances",inputs:[{name:"remoteBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"remoteTokenTransferrerAddress",type:"address",internalType:"address"}],outputs:[{name:"balance",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"unpauseTeleporterAddress",inputs:[{name:"teleporterAddress",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"updateMinTeleporterVersion",inputs:[{name:"version",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"event",name:"CallFailed",inputs:[{name:"recipientContract",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"CallSucceeded",inputs:[{name:"recipientContract",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"CollateralAdded",inputs:[{name:"remoteBlockchainID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"remoteTokenTransferrerAddress",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"},{name:"remaining",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"MinTeleporterVersionUpdated",inputs:[{name:"oldMinTeleporterVersion",type:"uint256",indexed:!0,internalType:"uint256"},{name:"newMinTeleporterVersion",type:"uint256",indexed:!0,internalType:"uint256"}],anonymous:!1},{type:"event",name:"OwnershipTransferred",inputs:[{name:"previousOwner",type:"address",indexed:!0,internalType:"address"},{name:"newOwner",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{type:"event",name:"RemoteRegistered",inputs:[{name:"remoteBlockchainID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"remoteTokenTransferrerAddress",type:"address",indexed:!0,internalType:"address"},{name:"initialCollateralNeeded",type:"uint256",indexed:!1,internalType:"uint256"},{name:"tokenDecimals",type:"uint8",indexed:!1,internalType:"uint8"}],anonymous:!1},{type:"event",name:"TeleporterAddressPaused",inputs:[{name:"teleporterAddress",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{type:"event",name:"TeleporterAddressUnpaused",inputs:[{name:"teleporterAddress",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{type:"event",name:"TokensAndCallRouted",inputs:[{name:"teleporterMessageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"input",type:"tuple",indexed:!1,internalType:"struct SendAndCallInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipientContract",type:"address",internalType:"address"},{name:"recipientPayload",type:"bytes",internalType:"bytes"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"recipientGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"},{name:"fallbackRecipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"}]},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"TokensAndCallSent",inputs:[{name:"teleporterMessageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"sender",type:"address",indexed:!0,internalType:"address"},{name:"input",type:"tuple",indexed:!1,internalType:"struct SendAndCallInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipientContract",type:"address",internalType:"address"},{name:"recipientPayload",type:"bytes",internalType:"bytes"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"recipientGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"},{name:"fallbackRecipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"}]},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"TokensRouted",inputs:[{name:"teleporterMessageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"input",type:"tuple",indexed:!1,internalType:"struct SendTokensInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"}]},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"TokensSent",inputs:[{name:"teleporterMessageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"sender",type:"address",indexed:!0,internalType:"address"},{name:"input",type:"tuple",indexed:!1,internalType:"struct SendTokensInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"}]},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"TokensWithdrawn",inputs:[{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1}];var ve=[{type:"constructor",inputs:[{name:"settings",type:"tuple",internalType:"struct TokenRemoteSettings",components:[{name:"teleporterRegistryAddress",type:"address",internalType:"address"},{name:"teleporterManager",type:"address",internalType:"address"},{name:"tokenHomeBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"tokenHomeAddress",type:"address",internalType:"address"},{name:"tokenHomeDecimals",type:"uint8",internalType:"uint8"}]},{name:"tokenName",type:"string",internalType:"string"},{name:"tokenSymbol",type:"string",internalType:"string"},{name:"tokenDecimals_",type:"uint8",internalType:"uint8"}],stateMutability:"nonpayable"},{type:"function",name:"MULTI_HOP_CALL_GAS_PER_WORD",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"MULTI_HOP_CALL_REQUIRED_GAS",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"MULTI_HOP_SEND_REQUIRED_GAS",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"REGISTER_REMOTE_REQUIRED_GAS",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"allowance",inputs:[{name:"owner",type:"address",internalType:"address"},{name:"spender",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"approve",inputs:[{name:"spender",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"nonpayable"},{type:"function",name:"balanceOf",inputs:[{name:"account",type:"address",internalType:"address"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"blockchainID",inputs:[],outputs:[{name:"",type:"bytes32",internalType:"bytes32"}],stateMutability:"view"},{type:"function",name:"calculateNumWords",inputs:[{name:"payloadSize",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"pure"},{type:"function",name:"decimals",inputs:[],outputs:[{name:"",type:"uint8",internalType:"uint8"}],stateMutability:"view"},{type:"function",name:"decreaseAllowance",inputs:[{name:"spender",type:"address",internalType:"address"},{name:"subtractedValue",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"nonpayable"},{type:"function",name:"getMinTeleporterVersion",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"homeTokenDecimals",inputs:[],outputs:[{name:"",type:"uint8",internalType:"uint8"}],stateMutability:"view"},{type:"function",name:"increaseAllowance",inputs:[{name:"spender",type:"address",internalType:"address"},{name:"addedValue",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"nonpayable"},{type:"function",name:"initialReserveImbalance",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"isCollateralized",inputs:[],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{type:"function",name:"isRegistered",inputs:[],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{type:"function",name:"isTeleporterAddressPaused",inputs:[{name:"teleporterAddress",type:"address",internalType:"address"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{type:"function",name:"multiplyOnRemote",inputs:[],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"view"},{type:"function",name:"name",inputs:[],outputs:[{name:"",type:"string",internalType:"string"}],stateMutability:"view"},{type:"function",name:"owner",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{type:"function",name:"pauseTeleporterAddress",inputs:[{name:"teleporterAddress",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"receiveTeleporterMessage",inputs:[{name:"sourceBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"originSenderAddress",type:"address",internalType:"address"},{name:"message",type:"bytes",internalType:"bytes"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"registerWithHome",inputs:[{name:"feeInfo",type:"tuple",internalType:"struct TeleporterFeeInfo",components:[{name:"feeTokenAddress",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}]}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"renounceOwnership",inputs:[],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"send",inputs:[{name:"input",type:"tuple",internalType:"struct SendTokensInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"}]},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"sendAndCall",inputs:[{name:"input",type:"tuple",internalType:"struct SendAndCallInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipientContract",type:"address",internalType:"address"},{name:"recipientPayload",type:"bytes",internalType:"bytes"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"recipientGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"},{name:"fallbackRecipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"}]},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"symbol",inputs:[],outputs:[{name:"",type:"string",internalType:"string"}],stateMutability:"view"},{type:"function",name:"teleporterRegistry",inputs:[],outputs:[{name:"",type:"address",internalType:"contract TeleporterRegistry"}],stateMutability:"view"},{type:"function",name:"tokenDecimals",inputs:[],outputs:[{name:"",type:"uint8",internalType:"uint8"}],stateMutability:"view"},{type:"function",name:"tokenHomeAddress",inputs:[],outputs:[{name:"",type:"address",internalType:"address"}],stateMutability:"view"},{type:"function",name:"tokenHomeBlockchainID",inputs:[],outputs:[{name:"",type:"bytes32",internalType:"bytes32"}],stateMutability:"view"},{type:"function",name:"tokenMultiplier",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"totalSupply",inputs:[],outputs:[{name:"",type:"uint256",internalType:"uint256"}],stateMutability:"view"},{type:"function",name:"transfer",inputs:[{name:"to",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"nonpayable"},{type:"function",name:"transferFrom",inputs:[{name:"from",type:"address",internalType:"address"},{name:"to",type:"address",internalType:"address"},{name:"amount",type:"uint256",internalType:"uint256"}],outputs:[{name:"",type:"bool",internalType:"bool"}],stateMutability:"nonpayable"},{type:"function",name:"transferOwnership",inputs:[{name:"newOwner",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"unpauseTeleporterAddress",inputs:[{name:"teleporterAddress",type:"address",internalType:"address"}],outputs:[],stateMutability:"nonpayable"},{type:"function",name:"updateMinTeleporterVersion",inputs:[{name:"version",type:"uint256",internalType:"uint256"}],outputs:[],stateMutability:"nonpayable"},{type:"event",name:"Approval",inputs:[{name:"owner",type:"address",indexed:!0,internalType:"address"},{name:"spender",type:"address",indexed:!0,internalType:"address"},{name:"value",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"CallFailed",inputs:[{name:"recipientContract",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"CallSucceeded",inputs:[{name:"recipientContract",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"MinTeleporterVersionUpdated",inputs:[{name:"oldMinTeleporterVersion",type:"uint256",indexed:!0,internalType:"uint256"},{name:"newMinTeleporterVersion",type:"uint256",indexed:!0,internalType:"uint256"}],anonymous:!1},{type:"event",name:"OwnershipTransferred",inputs:[{name:"previousOwner",type:"address",indexed:!0,internalType:"address"},{name:"newOwner",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{type:"event",name:"TeleporterAddressPaused",inputs:[{name:"teleporterAddress",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{type:"event",name:"TeleporterAddressUnpaused",inputs:[{name:"teleporterAddress",type:"address",indexed:!0,internalType:"address"}],anonymous:!1},{type:"event",name:"TokensAndCallSent",inputs:[{name:"teleporterMessageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"sender",type:"address",indexed:!0,internalType:"address"},{name:"input",type:"tuple",indexed:!1,internalType:"struct SendAndCallInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipientContract",type:"address",internalType:"address"},{name:"recipientPayload",type:"bytes",internalType:"bytes"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"recipientGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"},{name:"fallbackRecipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"}]},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"TokensSent",inputs:[{name:"teleporterMessageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"sender",type:"address",indexed:!0,internalType:"address"},{name:"input",type:"tuple",indexed:!1,internalType:"struct SendTokensInput",components:[{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationTokenTransferrerAddress",type:"address",internalType:"address"},{name:"recipient",type:"address",internalType:"address"},{name:"primaryFeeTokenAddress",type:"address",internalType:"address"},{name:"primaryFee",type:"uint256",internalType:"uint256"},{name:"secondaryFee",type:"uint256",internalType:"uint256"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"multiHopFallback",type:"address",internalType:"address"}]},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"TokensWithdrawn",inputs:[{name:"recipient",type:"address",indexed:!0,internalType:"address"},{name:"amount",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1},{type:"event",name:"Transfer",inputs:[{name:"from",type:"address",indexed:!0,internalType:"address"},{name:"to",type:"address",indexed:!0,internalType:"address"},{name:"value",type:"uint256",indexed:!1,internalType:"uint256"}],anonymous:!1}];var Xr=85000n,Ut=({homeToRemote:e,amount:t,destinationBlockchainID:r,destinationTokenTransferrerAddress:n,recipient:i})=>viem.encodeFunctionData({abi:e?be:ve,functionName:"send",args:[{destinationBlockchainID:r,destinationTokenTransferrerAddress:n,recipient:i,primaryFeeTokenAddress:_,primaryFee:0n,secondaryFee:0n,requiredGasLimit:Xr,multiHopFallback:_},t]});function zt({amount:e,address:t}){return viem.encodeFunctionData({abi:R,functionName:"approve",args:[t,e]})}var Kr=async({params:{onStepChange:e,amount:t,fromAddress:r,sourceChain:n,toAddress:i,gasSettings:s},transferData:o,isAllowanceApprovalRequired:a,requiredSignatures:m,signer:p})=>{let{tokenRemoteConfig:c,tokenHomeConfig:d,homeToRemote:u,chainBridgeConfig:y}=o,T=h({chain:n});if(a){let x={currentSignature:1,currentSignatureReason:"allowance-approval",requiredSignatures:m};e?.(x);let S=zt({amount:t,address:u?d.tokenHomeAddress:c.tokenRemoteAddress}),F=await p.sign({from:r,to:u?o.tokenHomeConfig.baseToken.address:c.tokenRemoteAddress,data:S,...s?{maxFeePerGas:s.price,maxPriorityFeePerGas:s.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(n.chainId))},he=>T.sendRawTransaction({serializedTransaction:he}),x);await T.waitForTransactionReceipt({hash:F,pollingInterval:1e3});}let g={currentSignature:a?2:1,currentSignatureReason:"tokens-transfer",requiredSignatures:m};e?.(g);let C=u?c.remoteChain.blockchainId:y.homeChain.blockchainId,v=u?c.tokenRemoteAddress:d.tokenHomeAddress,A=Ut({amount:t,recipient:i,destinationBlockchainID:C,destinationTokenTransferrerAddress:v,homeToRemote:u});return p.sign({from:r,to:u?d.tokenHomeAddress:c.tokenRemoteAddress,data:A,...s?{maxFeePerGas:s.price,maxPriorityFeePerGas:s.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(n.chainId))},x=>T.sendRawTransaction({serializedTransaction:x}),g)},Jr=async({params:e,transferData:t,signer:r})=>{let{sourceChain:n,fromAddress:i,amount:s}=e,o=h({chain:n}),{homeToRemote:a,tokenHomeConfig:m,tokenRemoteConfig:p}=t,d=await o.readContract({address:a?m.baseToken.address:p.tokenRemoteAddress,abi:R,functionName:"allowance",args:[i,a?m.tokenHomeAddress:p.tokenRemoteAddress]})<s;return Kr({params:e,transferData:t,isAllowanceApprovalRequired:d,requiredSignatures:d?2:1,signer:r})},Zr=async(e,t,r)=>{let{sourceChain:n,targetChain:i,asset:s,amount:o}=t,a=O({sourceChain:n,targetChain:i,asset:s,amount:o},e);return Jr({params:t,transferData:a,signer:r})},Qr=async e=>{try{return await e.getBlockNumber()}catch{return}};async function Wt(e,t,r,n){let i=await le(e,{asset:t.asset,amount:t.amount,sourceChain:t.sourceChain,targetChain:t.targetChain}),s=U(t.asset)?i[t.targetChain.chainId]?.[t.asset.address]??0n:0n,o=await Zr(e,t,n),a=Date.now(),m=h({chain:t.targetChain}),p=await Qr(m);return {type:"ictt-erc20-erc20",environment:r,fromAddress:t.fromAddress,toAddress:t.toAddress,amount:t.amount,asset:t.asset,bridgeFee:s,sourceChain:t.sourceChain,sourceStartedAt:a,sourceTxHash:o,sourceConfirmationCount:0,sourceRequiredConfirmationCount:1,targetChain:t.targetChain,targetConfirmationCount:0,targetRequiredConfirmationCount:1,targetStartBlockNumber:p}}var qt=({transferData:{homeToRemote:e,tokenHomeConfig:t,tokenRemoteConfig:r}})=>n=>{let i=e?t.tokenHomeAddress:r.tokenRemoteAddress,s=e?be:ve,o="TokensSent",a=n.logs.find(c=>c.address.toLowerCase()===i.toLowerCase()?viem.decodeEventLog({abi:s,...c}).eventName===o:!1);if(!a)throw new f("INVALID_PARAMS",`unable to find a TokensSent event in source transaction "${n.transactionHash}"`);return {teleporterMessageID:viem.decodeEventLog({abi:s,eventName:o,...a}).args.teleporterMessageID}},ta={name:"ReceiveCrossChainMessage",type:"event",inputs:[{name:"messageID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"sourceBlockchainID",type:"bytes32",indexed:!0,internalType:"bytes32"},{name:"deliverer",type:"address",indexed:!0,internalType:"address"},{name:"rewardRedeemer",type:"address",indexed:!1,internalType:"address"},{name:"message",type:"tuple",indexed:!1,internalType:"struct TeleporterMessage",components:[{name:"messageNonce",type:"uint256",internalType:"uint256"},{name:"originSenderAddress",type:"address",internalType:"address"},{name:"destinationBlockchainID",type:"bytes32",internalType:"bytes32"},{name:"destinationAddress",type:"address",internalType:"address"},{name:"requiredGasLimit",type:"uint256",internalType:"uint256"},{name:"allowedRelayerAddresses",type:"address[]",internalType:"address[]"},{name:"receipts",type:"tuple[]",internalType:"struct TeleporterMessageReceipt[]",components:[{name:"receivedMessageNonce",type:"uint256",internalType:"uint256"},{name:"relayerRewardAddress",type:"address",internalType:"address"}]},{name:"message",type:"bytes",internalType:"bytes"}]}]},$t=({toAddress:e,transferData:{tokenHomeConfig:t,homeToRemote:r,tokenRemoteConfig:n},targetClient:i})=>async({fromBlock:s,toBlock:o,metadata:a})=>{if(!_e(a))throw new f("INVALID_PARAMS");let p=(await i.getLogs({address:t.teleporterAddress,event:ta,args:{messageID:a.teleporterMessageID},fromBlock:s,toBlock:o})).at(-1);if(lodash.isNil(p))return;let c=p.transactionHash,d=await i.getTransactionReceipt({hash:c}),u=r?ve:be,y=r?n.tokenRemoteAddress:t.tokenHomeAddress,T=d.logs.find(C=>C.address.toLowerCase()===y.toLowerCase()?viem.decodeEventLog({abi:u,...C}).eventName==="TokensWithdrawn":!1);if(lodash.isNil(T))return;if(viem.decodeEventLog({abi:u,eventName:"TokensWithdrawn",...T}).args.recipient.toLowerCase()===e.toLowerCase())return c},_e=e=>lodash.isObject(e)&&viem.isHex(e.teleporterMessageID);var na=async(e,t)=>{let{bridgeTransfer:r}=t,{asset:n,amount:i,sourceChain:s,targetChain:o}=r,a=O({sourceChain:s,targetChain:o,asset:n,amount:i},e),m=h({chain:r.sourceChain}),p=h({chain:r.targetChain}),c=qt({transferData:a}),d=se({sourceClient:m,targetClient:p,getMetadata:c,checkMetadata:_e,trackingParams:t,trackingConfig:k});return D({promise:d,delay:2e3,startAfter:k.initialDelayMs})},ra=async(e,t)=>{let{bridgeTransfer:r}=t,{targetChain:n,sourceChain:i,asset:s,amount:o,toAddress:a}=r,m=O({sourceChain:i,targetChain:n,asset:s,amount:o},e),p=h({chain:r.targetChain}),c=$t({transferData:m,targetClient:p,toAddress:a}),d=oe({targetClient:p,getTargetTxHash:c,checkMetadata:_e,trackingParams:t,trackingConfig:k});return D({promise:d,delay:2e3,startAfter:k.initialDelayMs})};function Xt(e,t){let r,n=()=>{r?.();};return {result:(async()=>{let{updateListener:s}=t,{result:o,cancel:a}=await na(e,t);r=a;let m=await o,{result:p,cancel:c}=await ra(e,{updateListener:s,bridgeTransfer:m});return r=c,p})(),cancel:n}}async function Kt(e,t){return O(t,e),1n}var et={encode(e){return base.base58.encode(utils.concatBytes(e,sha256.sha256(e).subarray(-4)))},decode(e){return base.base58.decode(e).subarray(0,-4)}};var sa=zod.z.object({subnetName:zod.z.string(),subnetID:zod.z.string(),blockchainID:zod.z.string(),chainID:zod.z.number(),network:zod.z.string()}),Zt=zod.z.array(sa),oa=zod.z.object({PKey:zod.z.string(),SKey:zod.z.string(),orgID:zod.z.string(),bridgeID:zod.z.string(),tokenAddress:X,tokenSymbol:zod.z.string(),tokenName:zod.z.string(),tokenDecimals:zod.z.number(),tokenHomeAddress:X,tokenHomeChainID:zod.z.number(),tokenRemoteAddress:X,tokenRemoteChainID:zod.z.number(),network:zod.z.string(),isRegisteredInBridgeApp:zod.z.enum(["Y","N"]),createdAt:zod.z.number(),updatedAt:zod.z.number()}),Qt=zod.z.array(oa);var Yt="0x253b2784c75e510dD0fF1da844684a1aC0aa5fcf",en={test:"https://ac-gateway-staging-us-east-1.avacloud-test.io/v1/bridge-app",production:"https://ac-gateway-production-us-east-1.avacloud.io/v1/bridge-app"},tn={chainID:43114,blockchainID:"2q9e4r6Mu3U68nU1fYjgbR6JvwrRx36CohpAX5UQxse55x1Q5"},nn={chainID:43113,blockchainID:"yH8D7ThNJkxmtkuv2jgBa4P1Rn3Qpr4pPr7QYNfcdoS6k6HWp"};var tt=async e=>await(await fetch(e)).json();var ma=e=>e==="production"||e==="test",pa=e=>e.status==="fulfilled",ca=async(e,t)=>{let r=await tt(`${e}/chains`);return [t==="production"?tn:nn,...Zt.parse(r)]},da=async(e,t)=>(await Promise.allSettled(t.map(async n=>{let i=await tt(`${e}/chains/${n.chainID}/bridges`);return Qt.parse(i)}))).filter(pa).flatMap(n=>n.value),an=async e=>{if(!ma(e))throw new w("ENVIRONMENT_NOT_SUPPORTED",`ICTT does not support ${e} environment`);try{let t=en[e],r=await ca(t,e),n=await da(t,r),i=[];return n.forEach(s=>{let o=r.find(({chainID:y})=>y===s.tokenHomeChainID);if(!o)return;let a=i.find(({homeChain:y})=>y.chainId===b.toString({namespace:"eip155",reference:String(o.chainID)}));a||(a={homeChain:{chainId:b.toString({namespace:"eip155",reference:String(o.chainID)}),blockchainId:viem.toHex(et.decode(o.blockchainID))},erc20Bridges:[]},i.push(a));let m=a.erc20Bridges.find(({tokenHomeAddress:y})=>y===s.tokenHomeAddress);m||(m={baseToken:{address:s.tokenAddress,decimals:s.tokenDecimals,name:s.tokenName||s.tokenSymbol,symbol:s.tokenSymbol,type:"erc20"},remotes:[],teleporterAddress:Yt,tokenHomeAddress:s.tokenHomeAddress,tokenHomeDecimals:s.tokenDecimals},a.erc20Bridges.push(m));let p=r.find(({chainID:y})=>y===s.tokenRemoteChainID);if(!p)return;let c=viem.toHex(et.decode(p.blockchainID)),d=b.toString({namespace:"eip155",reference:String(s.tokenRemoteChainID)});m.remotes.find(({tokenRemoteAddress:y,remoteChain:{chainId:T}})=>y===s.tokenRemoteAddress&&T===d)||m.remotes.push({remoteChain:{chainId:d,blockchainId:c},tokenRemoteAddress:s.tokenRemoteAddress});}),i.map(s=>({...s,erc20Bridges:s.erc20Bridges.filter(o=>o.remotes.length>0)})).filter(s=>s.erc20Bridges.length>0)}catch(t){throw new w("CONFIG_NOT_AVAILABLE",`Error while fetching ICTT-ERC20-ERC20 config: ${t.message}`)}};var sn=async(e,t)=>{let{homeToRemote:r,tokenHomeConfig:{baseToken:n},tokenRemoteConfig:{tokenRemoteAddress:i}}=O(t,e),s={...n,address:r?i:n.address},o=await le(e,t);return {amount:t.amount-(o[t.targetChain.chainId]?.[n.address]??0n),asset:s}};function on(e,t){for(let r of e)for(let n of r.erc20Bridges){let i=t.tokenTransfers.find(({symbol:p})=>p===n.baseToken.symbol);if(!i)continue;let s=viem.isAddressEqual(n.teleporterAddress,t.to),o=viem.isAddressEqual(t.from,n.tokenHomeAddress)||viem.isAddressEqual(i.from,n.tokenHomeAddress),a=viem.isAddressEqual(t.from,_)||viem.isAddressEqual(i.from,_);if(s&&(o||a))return {isBridgeTx:!0,sourceChainId:n.remotes.length===1?n.remotes[0].remoteChain.chainId:void 0,targetChainId:t.chainId,bridgeType:"ictt-erc20-erc20"};if(viem.isAddressEqual(t.to,n.tokenHomeAddress)||viem.isAddressEqual(i.to,n.tokenHomeAddress))return {isBridgeTx:!0,sourceChainId:t.chainId,targetChainId:n.remotes.length===1?n.remotes[0].remoteChain.chainId:void 0,bridgeType:"ictt-erc20-erc20"}}return {isBridgeTx:!1}}var mn=async(e,t)=>{let r=await an(e);return {type:"ictt-erc20-erc20",analyzeTx:n=>{try{return on(r,ue(n))}catch{return {isBridgeTx:!1}}},estimateGas:n=>Vt(r,W(n)),estimateReceiveAmount:n=>sn(r,W(n)),getAssets:()=>Lt(r),getFees:n=>le(r,n),getMinimumTransferAmount:n=>Kt(r,n),transferAsset:n=>Wt(r,ye(n),e,t),trackTransfer:n=>Xt(r,n)}};var fe=[{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"src",type:"address"},{indexed:!0,internalType:"address",name:"guy",type:"address"},{indexed:!1,internalType:"uint256",name:"wad",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"dst",type:"address"},{indexed:!1,internalType:"uint256",name:"wad",type:"uint256"}],name:"Deposit",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"src",type:"address"},{indexed:!0,internalType:"address",name:"dst",type:"address"},{indexed:!1,internalType:"uint256",name:"wad",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"src",type:"address"},{indexed:!1,internalType:"uint256",name:"wad",type:"uint256"}],name:"Withdrawal",type:"event"},{payable:!0,stateMutability:"payable",type:"fallback"},{constant:!0,inputs:[{internalType:"address",name:"",type:"address"},{internalType:"address",name:"",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{internalType:"address",name:"guy",type:"address"},{internalType:"uint256",name:"wad",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[],name:"deposit",outputs:[],payable:!0,stateMutability:"payable",type:"function"},{constant:!0,inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"wad",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{internalType:"address",name:"src",type:"address"},{internalType:"address",name:"dst",type:"address"},{internalType:"uint256",name:"wad",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{internalType:"uint256",name:"wad",type:"uint256"}],name:"withdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{internalType:"uint256",name:"value",type:"uint256"},{internalType:"uint256",name:"chain_id",type:"uint256"}],name:"unwrap",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{internalType:"address",name:"token",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"swap",outputs:[{internalType:"bool",name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{internalType:"address",name:"",type:"address"}],name:"swapSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"}];var Fe=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"guy",type:"address"},{name:"wad",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"src",type:"address"},{name:"dst",type:"address"},{name:"wad",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[{name:"wad",type:"uint256"}],name:"withdraw",outputs:[],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"",type:"address"}],name:"balanceOf",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"dst",type:"address"},{name:"wad",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!1,inputs:[],name:"deposit",outputs:[],payable:!0,stateMutability:"payable",type:"function"},{constant:!0,inputs:[{name:"",type:"address"},{name:"",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"src",type:"address"},{indexed:!0,name:"guy",type:"address"},{indexed:!1,name:"wad",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"src",type:"address"},{indexed:!0,name:"dst",type:"address"},{indexed:!1,name:"wad",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"dst",type:"address"},{indexed:!1,name:"wad",type:"uint256"}],name:"Deposit",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"src",type:"address"},{indexed:!1,name:"wad",type:"uint256"}],name:"Withdrawal",type:"event"}];function ya(e){return e.toLowerCase().startsWith("tb1")||e.toLowerCase().startsWith("bc1")}function nt(e){if(!ya(e))return !1;try{return base.bech32.decode(e),!0}catch{return !1}}function Ie(e,t){return nt(e)?e.toLowerCase().startsWith(t?"bc":"tb"):!1}var ke=zod.z.string().refine(e=>viem.isAddress(e),e=>({message:`Invalid EVM address '${e}'`})).transform(e=>e),fa=zod.z.string().refine(e=>nt(e),e=>({message:`Invalid BTC address '${e}'`})),xe=(i=>(i.AVALANCHE="avalanche",i.ETHEREUM="ethereum",i.BITCOIN="bitcoin",i.UNKNOWN="",i))(xe||{}),Te=zod.z.nativeEnum(xe),Ta=zod.z.object({tokenName:zod.z.string(),nativeNetwork:Te,denomination:zod.z.number()}),ga=Ta.extend({nativeContractAddress:ke,wrappedContractAddress:ke,wrappedNetwork:Te}),pn=zod.z.object({disableFrontend:zod.z.boolean(),addressBlocklist:zod.z.array(zod.z.string())}),cn=pn.extend({assets:zod.z.record(zod.z.string(),ga),networks:zod.z.record(Te,zod.z.union([zod.z.number(),zod.z.undefined()])),walletAddresses:zod.z.record(Te,ke)}),dn=zod.z.object({minimumConfirmations:zod.z.record(Te,zod.z.optional(zod.z.number()))}),Aa=dn.extend({unwrapFeeApproximation:zod.z.record(zod.z.string(),zod.z.string()),wrapFeeApproximation:zod.z.record(zod.z.string(),zod.z.string())}),Me=zod.z.object({minimumFeeAmount:zod.z.string(),maximumFeeAmount:zod.z.string(),feePercentage:zod.z.number(),feePercentageDecimals:zod.z.number()}),Ca=dn.extend({unwrapFeeApproximation:zod.z.record(zod.z.string(),Me),wrapFeeApproximation:zod.z.record(zod.z.string(),Me)}),ha=zod.z.object({critical:cn,nonCritical:Aa}),Ea=zod.z.object({critical:cn,nonCritical:Ca}),ba=zod.z.object({tokenName:zod.z.string(),bech32AddressPrefix:zod.z.union([zod.z.literal("tb"),zod.z.literal("bc")]),wrappedContractAddress:ke,wrappedNetwork:Te}),va=pn.extend({addressBlocklist:zod.z.array(zod.z.string()),avalancheChainId:zod.z.number(),bitcoinAssets:zod.z.record(zod.z.string(),ba),walletAddresses:zod.z.object({btc:fa,avalanche:ke})}),Ia=zod.z.object({dustThreshold:zod.z.number(),wrapFeeEstimate:zod.z.object({minimumFeeAmount:zod.z.string(),maximumFeeAmount:zod.z.string(),feePercentage:zod.z.number(),feePercentageDecimals:zod.z.number()}),unwrapFeeEstimate:zod.z.object({bridgeToll:zod.z.object({minimumFeeAmount:zod.z.string(),maximumFeeAmount:zod.z.string(),feePercentage:zod.z.number(),feePercentageDecimals:zod.z.number()}),estimatedTxFee:zod.z.object({constAmount:zod.z.number(),numeratorPerSat:zod.z.number(),denominatorPerSat:zod.z.number()})})}),ka=zod.z.object({wrapFeeAmount:zod.z.number(),constUnwrapFeeAmount:zod.z.number(),unwrapFeeNumerator:zod.z.number(),unwrapFeeDenominator:zod.z.number(),dustThreshold:zod.z.number()}),xa=zod.z.object({minimumConfirmations:zod.z.number(),minimumOnboardSize:zod.z.number(),currentBridgeFeeEstimate:zod.z.union([Ia,ka])}),Ba=zod.z.object({networkInfo:zod.z.record(zod.z.string(),xa)}),un=zod.z.object({criticalBitcoin:va,nonCriticalBitcoin:Ba}),wa=zod.z.intersection(Ea,un),Na=zod.z.intersection(ha,un),yn=zod.z.union([wa,Na]);var Ra=e=>"eip155:1"===e||"eip155:11155111"===e,rt=e=>Ra(e.chainId);var Be=e=>"eip155:43113"===e||"eip155:43114"===e,He=e=>Be(e.chainId);var Ve=e=>e==="bip122:000000000019d6689c085ae165831e93"||e==="bip122:000000000933ea01ad0ee984209779ba";var ln=e=>e==="eip155:1"||e==="eip155:43114"||e==="bip122:000000000019d6689c085ae165831e93",Le=e=>!ln(e),J=e=>ln(e.chainId);var we={type:"native",name:"Ether",symbol:"ETH",decimals:18};var ge=({destinations:e,...t})=>t;var Pa=e=>({source:e.nativeTokenConfig.ethereumToken,target:e.nativeTokenConfig.avalancheToken,ethToAva:!0}),fn=(e,t)=>{if(!U(t))throw new f("ASSET_NOT_SUPPORTED",`Wrong token type: ${t.type}`);return lodash.isEqual(e,ge(t))},Da=(e,t)=>{if(!U(t))throw new f("ASSET_NOT_SUPPORTED",`Wrong token type: ${t.type}`);let r=e.ethereumTokens[t.address];if(!r||!fn(r.token,t))throw new f("ASSET_NOT_SUPPORTED",`Unable to find matching ethereum token in config: ${t.symbol}`);let n=e.avalancheTokens[r.target.tokenAddress];if(!n)throw new f("ASSET_NOT_SUPPORTED",`Unable to get avalanche token in config: ${t.symbol}`);return {source:r,target:n,ethToAva:!0}},_a=(e,t)=>{if(!U(t))throw new f("ASSET_NOT_SUPPORTED",`Wrong token type: ${t.type}`);let r=e.avalancheTokens[t.address];if(!r||!fn(r.token,t))throw new f("ASSET_NOT_SUPPORTED",`Unable to find matching avalanche token in config: ${t.symbol}`);let n=e.ethereumTokens[r.target.tokenAddress];if(!n)throw new f("ASSET_NOT_SUPPORTED",`Unable to get ethereum token in config: ${t.symbol}`);return {source:r,target:n,ethToAva:!1}},Fa=(e,t)=>{let{reference:r}=b.toJSON(e.chainId),{reference:n}=b.toJSON(t.chainId);return [{source:1,target:43114},{source:43114,target:1},{source:11155111,target:43113},{source:43113,target:11155111}].some(({source:s,target:o})=>s.toString()===r&&o.toString()===n)},V=({sourceChain:e,targetChain:t,amount:r,asset:n},i)=>{if(e.chainId===t.chainId)throw new f("IDENTICAL_CHAINS_PROVIDED",`SourceChain and TargetChain need to be different network. But found the same chainId: ${e.chainId}`);if(!Fa(e,t))throw new f("INVALID_PARAMS","SourceChain and TargetChain combination is not correct or the chains provided are not supported");if(r<=0n)throw new f("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");return ce(n)&&n.symbol===we.symbol&&rt(e)?Pa(i):rt(e)?Da(i,n):_a(i,n)};async function Tn(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s,fromAddress:o}=t;if(!viem.isAddress(o))throw new f("INVALID_PARAMS",`Invalid fromAddress: ${o}`);let a=e.walletAddresses.ethereum,{source:m,ethToAva:p}=V({sourceChain:r,targetChain:n,asset:i,amount:s},e),c=h({chain:r}),d=0n;if(ce(i)&&p){d+=await c.estimateContractGas({address:m.token.address,abi:Fe,functionName:"deposit",account:o});try{d+=await c.estimateContractGas({address:m.token.address,abi:R,functionName:"transfer",account:o,args:[a,s]});}catch{let u=viem.encodeFunctionData({abi:R,functionName:"transfer",args:[a,s]});d+=await c.estimateGas({data:u,account:o,to:a,value:s});}}else d=await c.estimateContractGas({address:m.token.address,abi:p?R:fe,functionName:p?"transfer":"unwrap",account:o,args:p?[a,s]:[s,0]});return d}var pe=e=>{try{return Me.parse(e),!0}catch{return !1}};var Ha=(e,{max:t,min:r})=>e>t?t:e<r?r:e,Ae=(e,t)=>{let{minimumFeeAmount:r,maximumFeeAmount:n,feePercentage:i,feePercentageDecimals:s}=t,o=BigInt(r),a=BigInt(n),m=i/10**s/100,p=Number(e)*m,c=BigInt(Math.ceil(p));return Ha(c,{min:o,max:a})};async function Z(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s}=t,{source:o,target:a,ethToAva:m}=V({sourceChain:r,targetChain:n,asset:i,amount:s},e),p=m?o.wrapFeeApproximation:o.unwrapFeeApproximation;if(pe(p)){let d=Ae(s,p);return {[a.chainId]:{[a.token.address]:d}}}let c=p??0n;return {[a.chainId]:{[a.token.address]:c}}}async function gn(e,t){let{target:r}=V(t,e),n=await Z(e,t);return {asset:r.token,amount:t.amount-(n[r.chainId]?.[r.token.address]??0n)}}function An(e){let t=Object.values(e.ethereumTokens).reduce((s,o)=>{if(o.token.symbol==="USDC")return s;let a=o.chainId,m=o.target.chainId,p={...o.token,destinations:{[m]:["avalanche-evm"]}},c=s[a]??[];return c.push(p),s[a]=c,s},{}),r=Object.values(e.avalancheTokens).reduce((s,o)=>{let a=o.chainId,m=o.target.chainId,p={...o.token,destinations:{[m]:["avalanche-evm"]}},c=s[a]??[];return c.push(p),s[a]=c,s},t),n="eip155:1";r[n]&&r[n].push({...we,destinations:{["eip155:43114"]:["avalanche-evm"]}});let i="eip155:11155111";return r[i]&&r[i].push({...we,destinations:{["eip155:43113"]:["avalanche-evm"]}}),r}var Cn=3n;async function Ge(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s}=t,{source:o,target:a,ethToAva:m}=V({sourceChain:r,targetChain:n,asset:i,amount:s},e),p=m?o.wrapFeeApproximation:o.unwrapFeeApproximation;if(pe(p)){let u=p.minimumFeeAmount;return BigInt(u)*Cn}let d=(await Z(e,t))[a.chainId]?.[a.token.address];if(d===void 0)throw new f("INVALID_PARAMS",`Unable to get static fee for ${i.symbol}`);return d*Cn}var Ue=()=>e=>({transactionHash:e.transactionHash}),hn=({params:{bridgeTransfer:{fromAddress:e}},transferData:{target:t,ethToAva:r},targetClient:n,config:i})=>async({fromBlock:s,toBlock:o,metadata:a})=>{if(!s)return;let m=t.token.address,p=r?_:i.walletAddresses.ethereum,c=r?void 0:{src:p,dst:e},d=r?{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"}:{inputs:[{indexed:!0,name:"src",type:"address"},{indexed:!0,name:"dst",type:"address"},{indexed:!1,name:"wad",type:"uint256"}],name:"Transfer",type:"event"},u=await n.getLogs({address:m,event:d,args:c,fromBlock:s,toBlock:o}),y=r?u.find(T=>at(T)&&T.args.originTxId===a?.transactionHash):u.at(-1);if(!lodash.isNil(y))return y.transactionHash},at=e=>Ua(e)?Object.keys(e.args).includes("originTxId"):!1,Ua=e=>Object.keys(e).includes("args"),Ne=e=>lodash.isObject(e)&&viem.isHex(e.transactionHash);var za=async(e,t)=>{let{bridgeTransfer:r}=t,{targetChain:n,sourceChain:i,asset:s,amount:o}=r,a=V({sourceChain:i,targetChain:n,asset:s,amount:o},e),m=h({chain:r.targetChain}),p=hn({params:t,transferData:a,targetClient:m,config:e}),c=oe({targetClient:m,getTargetTxHash:p,checkMetadata:Ne,trackingParams:t,trackingConfig:k});return D({promise:c,delay:1e3*30,startAfter:k.initialDelayMs})},Wa=async e=>{let{sourceChain:t,targetChain:r}=e.bridgeTransfer,n=h({chain:t}),i=h({chain:r}),s=Ue(),o=se({sourceClient:n,targetClient:i,getMetadata:s,checkMetadata:Ne,trackingParams:e,trackingConfig:k});return D({promise:o,delay:1e3*30,startAfter:k.initialDelayMs})};function En(e,t){let r,n=()=>{r?.();};return {result:(async()=>{let{bridgeTransfer:s,updateListener:o}=t,{result:a,cancel:m}=await Wa({bridgeTransfer:s,updateListener:o});r=m;let p=await a,{result:c,cancel:d}=await za(e,{updateListener:o,bridgeTransfer:p});return r=d,c})(),cancel:n}}var ze=async({amount:e,source:t,sourceChain:r,fromAddress:n,sign:i,onStepChange:s,gasSettings:o})=>{let a=h({chain:r}),m={currentSignature:1,currentSignatureReason:"tokens-transfer",requiredSignatures:1};s?.(m);let p=viem.encodeFunctionData({abi:fe,functionName:"unwrap",args:[e,0n]}),c=await i({from:n,to:t.token.address,data:p,...o?{maxFeePerGas:o.price,maxPriorityFeePerGas:o.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(r.chainId))},d=>a.sendRawTransaction({serializedTransaction:d}),m);return await a.waitForTransactionReceipt({hash:c,pollingInterval:1e3}),c};var bn={ethereum:"0x6b7a87899490EcE95443e979cA9485CBE7E71522",avalanche:"0x9b17bAADf0f21F03e35249e0e59723F34994F806"},qa=async({amount:e,config:t,source:r,sourceChain:n,fromAddress:i,sign:s,onStepChange:o,gasSettings:a})=>{let m=t.walletAddresses.ethereum,p=h({chain:n}),c={currentSignature:1,currentSignatureReason:"tokens-transfer",requiredSignatures:1};o?.(c);let d=viem.encodeFunctionData({abi:R,functionName:"transfer",args:[m,e]}),u=await s({from:i,to:r.token.address,data:d,...a?{maxFeePerGas:a.price,maxPriorityFeePerGas:a.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(n.chainId))},y=>p.sendRawTransaction({serializedTransaction:y}),c);return await p.waitForTransactionReceipt({hash:u,pollingInterval:1e3}),u},$a=async({config:e,fromAddress:t,sourceChain:r,targetChain:n})=>{if(e.environment!=="production"&&!J(r)&&!J(n))return !1;let i=e.nativeTokenConfig.ethereumToken,s=e.nativeTokenConfig.avalancheToken;try{return await h({chain:r}).readContract({address:i.token.address,abi:R,functionName:"allowance",args:[t,bn.ethereum]})!==0n?!0:await h({chain:n}).readContract({address:s.token.address,abi:R,functionName:"allowance",args:[t,bn.avalanche]})!==0n}catch{return !1}},Xa=async({amount:e,config:t,fromAddress:r,source:n,sourceChain:i,targetChain:s,sign:o,onStepChange:a,gasSettings:m})=>{let p=t.walletAddresses.ethereum,c=h({chain:i});if(!He(s))throw new f("INVALID_PARAMS","Invalid chain combinations");if(await $a({config:t,fromAddress:r,sourceChain:i,targetChain:s}))throw new f("VULNERABLE_TOKEN_APPROVAL_ADDRESS","Address has vulnerable token approvals");let u={currentSignature:1,currentSignatureReason:"wrap-token",requiredSignatures:2};a?.(u);let y=viem.encodeFunctionData({abi:Fe,functionName:"deposit"}),T=await o({from:r,to:n.token.address,value:e,data:y,...m?{maxFeePerGas:m.price,maxPriorityFeePerGas:m.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(i.chainId))},A=>c.sendRawTransaction({serializedTransaction:A}),u);await c.waitForTransactionReceipt({hash:T,pollingInterval:1e3});let g={currentSignature:2,currentSignatureReason:"tokens-transfer",requiredSignatures:2};a?.(g);let C=viem.encodeFunctionData({abi:R,functionName:"transfer",args:[p,e]}),v=await o({from:r,to:n.token.address,data:C,...m?{maxFeePerGas:m.price,maxPriorityFeePerGas:m.tip}:null,chainId:b.toEip155HexChainId(b.toJSON(i.chainId))},A=>c.sendRawTransaction({serializedTransaction:A}),g);return await c.waitForTransactionReceipt({hash:v,pollingInterval:1e3}),v},vn=async({amount:e,asset:t,config:r,fromAddress:n,source:i,sourceChain:s,targetChain:o,sign:a,onStepChange:m,gasSettings:p})=>ce(t)?Xa({amount:e,config:r,fromAddress:n,source:i,sourceChain:s,targetChain:o,sign:a,onStepChange:m,gasSettings:p}):qa({amount:e,config:r,source:i,sourceChain:s,fromAddress:n,sign:a,onStepChange:m,gasSettings:p});var Ce=(e,t)=>{let r=t.map(i=>i.toLowerCase()),n=e.find(i=>r.includes(i.toLowerCase()));if(n)throw new f("ADDRESS_IS_BLOCKED",n)};async function In(e,t,r){let{sourceChain:n,targetChain:i,asset:s,amount:o,fromAddress:a,toAddress:m,onStepChange:p,gasSettings:c}=t;if(a!==m)throw new f("INVALID_PARAMS","fromAddress and toAddress do not match");Ce([a,m],e.addressBlocklist);let d=await Z(e,{asset:s,amount:o,sourceChain:n,targetChain:i}),{source:u,target:y,ethToAva:T}=V({sourceChain:n,targetChain:i,asset:s,amount:o},e),g=await Ge(e,{asset:s,amount:o,sourceChain:n,targetChain:i});if(o<g)throw new f("INVALID_PARAMS",`Minimum transfer amount is ${g.toString()}`);let C=He(n)?e.minimumConfirmations.avalanche:e.minimumConfirmations.ethereum,v=d[y.chainId]?.[y.token.address]??0n,A;T?A=await vn({amount:o,asset:s,config:e,fromAddress:a,source:u,sourceChain:n,targetChain:i,sign:r.sign,onStepChange:p,gasSettings:c}):A=await ze({amount:o,fromAddress:a,source:u,sourceChain:n,sign:r.sign,onStepChange:p,gasSettings:c});let x=Date.now(),S=h({chain:t.targetChain}),F;try{F=await S.getBlockNumber();}catch(he){console.error(he);}return {type:"avalanche-evm",environment:e.environment,fromAddress:t.fromAddress,toAddress:t.toAddress,amount:t.amount,asset:s,bridgeFee:v,sourceChain:t.sourceChain,sourceStartedAt:x,sourceTxHash:A,sourceConfirmationCount:0,sourceRequiredConfirmationCount:C,targetChain:t.targetChain,targetConfirmationCount:0,targetRequiredConfirmationCount:1,targetStartBlockNumber:F}}var kn=(e,t)=>{let r=e.critical.assets,{ethereum:n,avalanche:i}=e.critical.networks;if(n===void 0||i===void 0)throw new w("WARDEN_CONFIG_MISSING_NETWORK","Critical networks info is missing from wardenConfig");let s=e.critical.walletAddresses.avalanche,o=e.critical.walletAddresses.ethereum;if(!s||!o)throw new w("CONFIG_NOT_AVAILABLE","Wallet address is missing from the critical config.");let a=Object.entries(r).reduce((T,[g,C])=>{let v={type:"erc20",address:C.nativeContractAddress,name:C.tokenName,symbol:g,decimals:C.denomination},A=e.nonCritical.wrapFeeApproximation[g];return T[C.nativeContractAddress]={chainId:`eip155:${n}`,token:v,target:{chainId:`eip155:${i}`,tokenAddress:C.wrappedContractAddress},wrapFeeApproximation:pe(A)?A:A?BigInt(A):void 0},T},{}),m=Object.values(a).find(T=>T.token.symbol==="WETH");if(!m)throw new w("CONFIG_NOT_AVAILABLE","WETH info is missing from config");let p=Object.entries(r).reduce((T,[g,C])=>{let v={type:"erc20",address:C.wrappedContractAddress,name:C.tokenName,symbol:`${g}.e`,decimals:C.denomination},A=e.nonCritical.unwrapFeeApproximation[g];return T[C.wrappedContractAddress]={chainId:`eip155:${i}`,token:v,target:{chainId:`eip155:${n}`,tokenAddress:C.nativeContractAddress},unwrapFeeApproximation:pe(A)?A:A?BigInt(A):void 0},T},{}),c=p[m.target.tokenAddress];if(!c)throw new w("CONFIG_NOT_AVAILABLE","WETH.e info is missing from config");let d=e.nonCritical.minimumConfirmations.avalanche,u=e.nonCritical.minimumConfirmations.ethereum;if(!d||!u)throw new w("CONFIG_NOT_AVAILABLE","Minimum confirmation info is missing");return {addressBlocklist:e.critical.addressBlocklist,ethereumTokens:a,avalancheTokens:p,minimumConfirmations:{avalanche:d,ethereum:u},environment:t,walletAddresses:{avalanche:s,ethereum:o},nativeTokenConfig:{ethereumToken:m,avalancheToken:c}}};var xn={environment:"dev",tokenInfoUrl:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.test.json",configMismatchThreshold:1,wardenConfigURLs:["https://warden1-avax-dev-storage.s3.amazonaws.com/bridge_settings.json","https://warden2-avax-dev-storage.s3.amazonaws.com/bridge_settings.json","https://warden3-avax-dev-storage.s3.amazonaws.com/bridge_settings.json"],disabledTokensOnNetwork:{avalanche:[],ethereum:["FAU"]}},Bn={...xn,environment:"staging"},wn={...Bn,environment:"test",configMismatchThreshold:2,wardenConfigURLs:["https://ava-warden-bucket.s3.eu-central-1.amazonaws.com/bridge_settings.json","https://ava-warden-testnet.s3.us-west-1.amazonaws.com/bridge_settings.json","https://avalabs-testnet-cce1-testnet-warden-bucket.s3.ca-central-1.amazonaws.com/bridge_settings.json","https://avalabs-warden-test-blob.s3.amazonaws.com/bridge_settings.json","https://avawarden.s3.amazonaws.com/bridge_settings.json","https://blob-storage-testnet.warden-avascan.info/bridge_settings.json","https://chainstack-ava-warden-testnet.s3.us-west-2.amazonaws.com/bridge_settings.json","https://s3.amazonaws.com/warden-mgmt-prod-testnet.blockdaemon.com/bridge_settings.json"]},Ka={...wn,environment:"production",tokenInfoUrl:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.json",wardenConfigURLs:["https://ava-warden-bucket-prod.s3.eu-central-1.amazonaws.com/bridge_settings.json","https://ava-warden-mainnet.s3.us-west-1.amazonaws.com/bridge_settings.json","https://avalabs-mainnet-cce1-mainnet-warden-bucket.s3.ca-central-1.amazonaws.com/bridge_settings.json","https://avawarden-prod.s3.amazonaws.com/bridge_settings.json","https://blob-storage-mainnet.warden-avascan.info/bridge_settings.json","https://chainstack-ava-warden-mainnet.s3.us-west-2.amazonaws.com/bridge_settings.json","https://s3.amazonaws.com/warden-mgmt-prod-mainnet.blockdaemon.com/bridge_settings.json","https://warden-avax-storage.s3.amazonaws.com/bridge_settings.json"],disabledTokensOnNetwork:{avalanche:[],ethereum:["CRV"]}},Ja={production:Ka,staging:Bn,test:wn,dev:xn},We=e=>Ja[e];var ei=async e=>{let t=[];e.forEach(i=>t.push(fetch(i)));let r=await Promise.allSettled(t),n=[];for(let i of r)if(!(i.status==="rejected"||!i.value||!i.value.ok))try{let s=await i.value.json(),o=yn.parse(s);n.push(o);}catch(s){console.error(s);}return n},ti=e=>e.map(t=>{if(t.critical.disableFrontend)throw new w("CONFIG_NOT_AVAILABLE","Disable frontend");let r=e.reduce((n,i)=>n+(lodash.isEqual(t.critical,i.critical)?1:0),0);return {config:t,count:r}}),je=lodash.memoize(async e=>{let t=e.wardenConfigURLs,r=await ei(t),n=ti(r),i=lodash.maxBy(n,s=>s.count);if(!i||i.count<e.wardenConfigURLs.length-e.configMismatchThreshold)throw new w("WARDEN_CONFIG_MISMATCH","Warden config mismatch");return i.config});var Nn=async e=>{let t=We(e),r=await je(t);return kn(r,e)};function Rn(e,t){let r="eip155:43113"===t.chainId||"eip155:11155111"===t.chainId,n=r?"eip155:43113":"eip155:43114",i=r?"eip155:11155111":"eip155:1";return viem.isAddressEqual(t.from,e.walletAddresses.ethereum)||viem.isAddressEqual(t.to,e.walletAddresses.avalanche)?{isBridgeTx:!0,sourceChainId:n,targetChainId:i,bridgeType:"avalanche-evm"}:viem.isAddressEqual(t.from,e.walletAddresses.avalanche)||viem.isAddressEqual(t.to,e.walletAddresses.ethereum)?{isBridgeTx:!0,sourceChainId:i,targetChainId:n,bridgeType:"avalanche-evm"}:{isBridgeTx:!1}}var Sn=async(e,t)=>{let r=await Nn(e);return {type:"avalanche-evm",analyzeTx:n=>{try{return Rn(r,ue(n))}catch{return {isBridgeTx:!1}}},estimateGas:n=>Tn(r,W(n)),estimateReceiveAmount:n=>gn(r,W(n)),getAssets:()=>An(r),getFees:n=>Z(r,n),transferAsset:n=>In(r,ye(n),t),trackTransfer:n=>En(r,n),getMinimumTransferAmount:n=>Ge(r,n)}};var st=e=>"wrapFeeEstimate"in e,Q=e=>"wrapFeeEstimate"in e||"unwrapFeeEstimate"in e;var Pn=(e,t)=>{let r=e.criticalBitcoin,n=r.bitcoinAssets.btc;if(!n)throw new w("CONFIG_NOT_AVAILABLE","Bitcoin asset info is missing from config");let i=e.nonCriticalBitcoin.networkInfo.btc;if(!i)throw new w("CONFIG_NOT_AVAILABLE","Bitcoin network info was not found.");let s=i.currentBridgeFeeEstimate,o=st(s)?{wrapFeeEstimate:s.wrapFeeEstimate}:{wrapFeeAmount:s.wrapFeeAmount},a=n.bech32AddressPrefix==="bc"?"bip122:000000000019d6689c085ae165831e93":"bip122:000000000933ea01ad0ee984209779ba",m={chainId:a,token:{name:n.tokenName,symbol:"BTC",decimals:8,type:"native"},target:{networkId:`eip155:${r.avalancheChainId}`,tokenAddress:n.wrappedContractAddress},bridgeFeeEstimate:o},p=st(s)?{unwrapFeeEstimate:s.unwrapFeeEstimate}:{constUnwrapFeeAmount:s.constUnwrapFeeAmount,unwrapFeeNumerator:s.unwrapFeeNumerator,unwrapFeeDenominator:s.unwrapFeeDenominator},c={chainId:`eip155:${r.avalancheChainId}`,token:{name:n.tokenName,symbol:"BTC.b",decimals:8,type:"erc20",address:n.wrappedContractAddress},target:{networkId:a},bridgeFeeEstimate:p};return {addressBlocklist:e.criticalBitcoin.addressBlocklist,environment:t,dustThreshold:s.dustThreshold,minimumOnboardSize:i.minimumOnboardSize,minimumConfirmations:{bitcoin:i.minimumConfirmations,avalanche:e.nonCritical.minimumConfirmations.avalanche??1},nativeTokenConfig:{bitcoinToken:m,avalancheToken:c},walletAddresses:{bitcoin:r.walletAddresses.btc,avalanche:r.walletAddresses.avalanche}}};var $e=async e=>{try{let t=We(e),r=await je(t);return Pn(r,e)}catch{throw new w("CONFIG_NOT_AVAILABLE")}};function _n(e,t){let{chainId:r,from:n,to:i,tokenTransfers:s}=t,o=Be(r),a=Ve(r);if(!o&&!a)return {isBridgeTx:!1};let m=Le(r),p=m?"eip155:43113":"eip155:43114",c=m?"bip122:000000000933ea01ad0ee984209779ba":"bip122:000000000019d6689c085ae165831e93",d=a&&lodash.isEqual(i.toLowerCase(),e.walletAddresses.bitcoin.toLowerCase())&&s.some(y=>y.symbol==="BTC");return o&&lodash.isEqual(n,e.walletAddresses.avalanche)&&s.some(y=>y.symbol==="BTC.b"&&y.from===_)||d?{isBridgeTx:!0,sourceChainId:c,targetChainId:p,bridgeType:"avalanche-btc-ava"}:{isBridgeTx:!1}}var Fn=zod.z.object({txHash:zod.z.string(),txHex:zod.z.optional(zod.z.string()),index:zod.z.number(),value:zod.z.number(),script:zod.z.string(),blockHeight:zod.z.number(),confirmations:zod.z.number()}),Mn=zod.z.array(Fn);Fn.extend({script:zod.z.optional(zod.z.string())});var ni=zod.z.object({address:zod.z.string(),value:zod.z.number()}),On=zod.z.array(ni);function ai(e){let t=[];return e.filter(r=>{let n=r.txHash+r.index.toString();return t.includes(n)?!1:(t.push(n),!0)})}async function Xe(e,t,r,n,i,s){let o=ai(i),a=[{address:e,value:Number(r)}],{inputs:m,outputs:p,fee:c}=ri__default.default(o,a,n);if(typeof c!="number")throw new f("UNKNOWN","Unable to choose utxo properly");if(!m||!p||!p.length)return {fee:c};let d=await s.getScriptsForUtxos(m),u=Mn.parse(d),y=[p[0]],T=p[1];T&&y.push({address:t,value:T.value});let g=On.parse(y);return {inputs:u,outputs:g,fee:c}}var si=(e,t)=>[{source:"bip122:000000000019d6689c085ae165831e93",target:"eip155:43114"},{source:"bip122:000000000933ea01ad0ee984209779ba",target:"eip155:43113"}].some(({source:n,target:i})=>n===e.chainId&&i===t.chainId),oi=(e,t)=>lodash.isEqual(e,ge(t)),L=(e,t)=>{let{sourceChain:r,targetChain:n,amount:i,asset:s}=e;if(!si(r,n))throw new f("INVALID_PARAMS","SourceChain and TargetChain combination is not valid");if(i<=0n)throw new f("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");let o=t.nativeTokenConfig.bitcoinToken;if(!oi(o.token,s))throw new f("ASSET_NOT_SUPPORTED","Incorrect Asset was provided");return {source:o,target:t.nativeTokenConfig.avalancheToken,btcToAva:!0}};async function Hn(e,t,r){let{fromAddress:n,sourceChain:i,targetChain:s,asset:o,amount:a}=t;L({sourceChain:i,targetChain:s,asset:o,amount:a},e);let m=e.walletAddresses.bitcoin,p=1,{utxos:c}=await r.getUtxoBalance(n,!1),{fee:d}=await Xe(m,n,a,p,c,r);return BigInt(d)}async function Y(e,t){let{sourceChain:r,targetChain:n,amount:i,asset:s}=t,{source:o,target:a}=L({sourceChain:r,targetChain:n,amount:i,asset:s},e);if(Q(o.bridgeFeeEstimate)){let m=Ae(i,o.bridgeFeeEstimate.wrapFeeEstimate);return {[a.chainId]:{[a.token.address]:m}}}return {[a.chainId]:{[a.token.address]:BigInt(o.bridgeFeeEstimate.wrapFeeAmount)}}}async function Vn(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s}=t,{target:o}=L({sourceChain:r,targetChain:n,asset:i,amount:s},e),a=await Y(e,t);return {asset:o.token,amount:t.amount-(a[o.chainId]?.[o.token.address]??0n)}}function Ln(e){let t=e.nativeTokenConfig.bitcoinToken,r={...t.token,destinations:{[t.target.networkId]:["avalanche-btc-ava"]}};return {[t.chainId]:[r]}}async function Gn(e,t){let{sourceChain:r,targetChain:n,amount:i,asset:s}=t,o=L({sourceChain:r,targetChain:n,amount:i,asset:s},e),a=await mi(e,t,o),m=e.minimumOnboardSize;return BigInt(Math.max(a*4,m))}async function mi(e,t,{source:r,target:n}){if(Q(r.bridgeFeeEstimate))return Number(r.bridgeFeeEstimate.wrapFeeEstimate.minimumFeeAmount);{let i=await Y(e,t);return Number(i[n.chainId]?.[n.token.address])}}var Un=({targetClient:e,checkMetadata:t,trackingParams:{bridgeTransfer:r,updateListener:n},trackingConfig:{trackingLimitMs:i},bitcoinFunctions:s})=>{let o=lodash.cloneDeep(r);return async m=>{let{sourceTxHash:p}=r;if(o.completedAt||t(o.metadata))return m(o);if(o.sourceStartedAt+i<=Date.now())return o=E(o,{completedAt:Date.now(),errorCode:5004},n),m(o);let{confirmations:c,fees:d}=await s.getTransaction(p);if(!o.sourceNetworkFee){let T=BigInt(Math.ceil(d));o=E(o,{sourceNetworkFee:T},n);}let u=c>o.sourceConfirmationCount,y=c>=o.sourceRequiredConfirmationCount;if(u){let T={};T.sourceConfirmationCount=Number(c),y||(T.targetStartBlockNumber=await e.getBlockNumber()),o=E(o,T,n);}if(y)return o.targetStartBlockNumber||(o=E(o,{targetStartBlockNumber:await e.getBlockNumber()},n)),o=E(o,{targetStartedAt:Date.now(),metadata:{transactionHash:p}},n),m(o)}};var jn=({targetClient:e,getTargetTxHash:t,checkMetadata:r,trackingParams:{bridgeTransfer:n,updateListener:i},trackingConfig:{trackingLimitMs:s,maxBlocks:o}})=>{if(!n.completedAt&&!r(n.metadata))throw new f("INVALID_PARAMS","metadata is missing");if(!n.targetStartBlockNumber)throw new f("INVALID_PARAMS","targetStartBlockNumber is missing");let a=lodash.cloneDeep(n);return async p=>{if(a.completedAt)return p(a);if(a.sourceStartedAt+s<=Date.now())return a=E(a,{completedAt:Date.now(),errorCode:5004},i),p(a);if(!a.targetStartBlockNumber)throw new Error("unreachable");if(!a.targetTxHash){let T=await e.getBlockNumber(),g=a.targetStartBlockNumber-o,C=g>=0n?g:"earliest",v=a.targetStartBlockNumber+o,A=v<T?v:"latest",x=await t({fromBlock:C,toBlock:A,metadata:a.metadata});if(x)a=E(a,{targetTxHash:x},i);else {a=E(a,{targetStartBlockNumber:T},i);return}}if(lodash.isNil(a.targetTxHash)||!viem.isHash(a.targetTxHash))return;let c=await e.getTransactionReceipt({hash:a.targetTxHash});if(!a.targetNetworkFee){let T=await e.getTransaction({hash:a.targetTxHash}),g=K(T,c);g&&(a=E(a,{targetNetworkFee:g},i));}if(c.status==="reverted")return a=E(a,{completedAt:Date.now(),errorCode:5005},i),p(a);if(lodash.isNil(a.targetTxHash)||!viem.isHash(a.targetTxHash))return;let d=await e.getTransactionConfirmations({hash:a.targetTxHash}),u=d>a.targetConfirmationCount,y=d>=a.targetRequiredConfirmationCount;if(u&&(a=E(a,{targetConfirmationCount:Number(d)},i)),!!y)return a=E(a,{completedAt:Date.now()},i),p(a)}};var ot=e=>lodash.isObject(e)&&!!e.transactionHash,qn=({transferData:{target:e},targetClient:t})=>async({fromBlock:r,toBlock:n,metadata:i})=>{if(!r)return;let s=e.token.address,o={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"},{indexed:!1,name:"originOutputIndex",type:"uint256"}],name:"Mint",type:"event"},m=(await t.getLogs({address:s,event:o,fromBlock:r,toBlock:n})).find(p=>at(p)&&p.args.originTxId===`0x${i?.transactionHash}`);if(!lodash.isNil(m))return m.transactionHash};var yi=async(e,t)=>{let{targetChain:r}=e.bridgeTransfer,n=h({chain:r}),i=Un({targetClient:n,trackingParams:e,trackingConfig:k,checkMetadata:ot,bitcoinFunctions:t});return D({promise:i,delay:1e3*60,startAfter:k.initialDelayMs})},li=async(e,t)=>{let{bridgeTransfer:r}=e,n=h({chain:r.targetChain}),i=qn({transferData:t,targetClient:n}),s=jn({targetClient:n,getTargetTxHash:i,checkMetadata:ot,trackingParams:e,trackingConfig:k});return D({promise:s,delay:2e3,startAfter:k.initialDelayMs})};function $n(e,t,r){let n,i=()=>{n?.();};return {result:(async()=>{let{bridgeTransfer:o}=t,{targetChain:a,sourceChain:m,asset:p,amount:c}=o,d=L({sourceChain:m,targetChain:a,asset:p,amount:c},e),{result:u,cancel:y}=await yi(t,r);n=y;let T=await u,{result:g,cancel:C}=await li({...t,bridgeTransfer:T},d);return n=C,g})(),cancel:i}}var Xn=async({config:e,amount:t,fromAddress:r,sign:n,onStepChange:i,bitcoinFunctions:s,gasSettings:o})=>{let a=o?Number(o.price):void 0,{low:m,high:p}=a?{low:a,high:a}:await s.getFeeRates(),c=e.environment==="production"?p:m,{utxos:d}=await s.getUtxoBalance(r,!1),u=e.walletAddresses.bitcoin,{inputs:y,outputs:T}=await Xe(u,r,t,c,d,s);if(!y||!T)throw new f("INVALID_PARAMS","Unable to create transaction");let g={currentSignature:1,currentSignatureReason:"tokens-transfer",requiredSignatures:1};return i?.(g),await n({inputs:y,outputs:T},s.issueRawTx,g)};async function Kn(e,t,r,n){let{fromAddress:i,toAddress:s,sourceChain:o,targetChain:a,asset:m,amount:p,onStepChange:c,gasSettings:d}=t;Ce([i,s],e.addressBlocklist);let{target:u}=L({sourceChain:o,targetChain:a,asset:m,amount:p},e),y=Date.now(),g=(await Y(e,{asset:m,amount:p,sourceChain:o,targetChain:a}))[u.chainId]?.[u.token.address]??0n,C=e.minimumConfirmations.bitcoin,v=await Xn({config:e,amount:p,sign:r.sign,onStepChange:c,fromAddress:i,bitcoinFunctions:n,gasSettings:d}),A=h({chain:a}),x;try{x=await A.getBlockNumber();}catch(F){console.error(F);}return {type:"avalanche-btc-ava",environment:e.environment,fromAddress:i,toAddress:s,amount:t.amount,asset:m,bridgeFee:g,sourceChain:o,sourceStartedAt:y,sourceTxHash:v,sourceConfirmationCount:0,sourceRequiredConfirmationCount:C,targetChain:t.targetChain,targetConfirmationCount:0,targetRequiredConfirmationCount:1,targetStartBlockNumber:x}}var Jn=({fromAddress:e,toAddress:t,sourceChain:r,...n})=>{if(!viem.isAddress(t))throw new f("INCORRECT_ADDRESS_PROVIDED","Invalid toAddress was provided");let i=J(r);if(!Ie(e,i))throw new f("INCORRECT_ADDRESS_PROVIDED","Invalid fromAddress was provided: Make sure it is Btc Address from correct environment");return {fromAddress:e,toAddress:t,sourceChain:r,...n}},mt=({fromAddress:e,sourceChain:t,...r})=>{let n=J(t);if(!Ie(e,n))throw new f("INCORRECT_ADDRESS_PROVIDED","Invalid fromAddress was provided: Make sure it is Btc Address from correct environment");return {fromAddress:e,sourceChain:t,...r}};var Zn=async(e,t,r)=>{let n=await $e(e);return {type:"avalanche-btc-ava",analyzeTx:i=>_n(n,i),estimateGas:i=>Hn(n,mt(i),r),estimateReceiveAmount:i=>Vn(n,mt(i)),getAssets:()=>Ln(n),getFees:i=>Y(n,i),transferAsset:i=>Kn(n,Jn(i),t,r),trackTransfer:i=>$n(n,i,r),getMinimumTransferAmount:i=>Gn(n,i)}};function Yn(e,t){let{chainId:r,from:n,to:i,tokenTransfers:s}=t,o=Be(r),a=Ve(r);if(!o&&!a)return {isBridgeTx:!1};let m=Le(r),p=m?"eip155:43113":"eip155:43114",c=m?"bip122:000000000933ea01ad0ee984209779ba":"bip122:000000000019d6689c085ae165831e93",d=o&&lodash.isEqual(i.toLowerCase(),e.nativeTokenConfig.avalancheToken.token.address.toLowerCase())&&s.some(y=>y.to?.toLowerCase()===_.toLowerCase()&&y.symbol==="BTC.b"),u=a&&lodash.isEqual(n.toLowerCase(),e.walletAddresses.bitcoin.toLowerCase())&&s.some(y=>y.symbol==="BTC");return d||u?{isBridgeTx:!0,sourceChainId:p,targetChainId:c,bridgeType:"avalanche-ava-btc"}:{isBridgeTx:!1}}var gi=(e,t)=>[{source:"eip155:43114",target:"bip122:000000000019d6689c085ae165831e93"},{source:"eip155:43113",target:"bip122:000000000933ea01ad0ee984209779ba"}].some(({source:n,target:i})=>n===e.chainId&&i===t.chainId),Ai=(e,t)=>lodash.isEqual(e,ge(t)),G=(e,t)=>{let{sourceChain:r,targetChain:n,amount:i,asset:s}=e;if(!gi(r,n))throw new f("INVALID_PARAMS","SourceChain and TargetChain combination is not valid");if(i<=0n)throw new f("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");let o=t.nativeTokenConfig.avalancheToken;if(!Ai(o.token,s))throw new f("ASSET_NOT_SUPPORTED","Incorrect Asset was provided");return {source:o,target:t.nativeTokenConfig.bitcoinToken,btcToAva:!1}};async function er(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s,fromAddress:o}=t,{source:a}=G({sourceChain:r,targetChain:n,asset:i,amount:s},e);return await h({chain:r}).estimateContractGas({address:a.token.address,abi:fe,functionName:"unwrap",account:o,args:[s,0]})}async function ee(e,t){let{sourceChain:r,targetChain:n,amount:i,asset:s}=t,{source:o}=G({sourceChain:r,targetChain:n,amount:i,asset:s},e);if(Q(o.bridgeFeeEstimate)){let{constAmount:a,numeratorPerSat:m,denominatorPerSat:p}=o.bridgeFeeEstimate.unwrapFeeEstimate.estimatedTxFee,c=a+m/p*Number(i),d=Ae(i,o.bridgeFeeEstimate.unwrapFeeEstimate.bridgeToll),u=BigInt(Math.ceil(c))+d;return {[n.chainId]:{NATIVE:BigInt(u)}}}else {let{constUnwrapFeeAmount:a,unwrapFeeNumerator:m,unwrapFeeDenominator:p}=o.bridgeFeeEstimate,c=a+m/p*Number(i),d=BigInt(Math.ceil(c));return {[n.chainId]:{NATIVE:BigInt(d)}}}}async function tr(e,t){let{sourceChain:r,targetChain:n,asset:i,amount:s}=t,{target:o}=G({sourceChain:r,targetChain:n,asset:i,amount:s},e),a=await ee(e,{sourceChain:r,targetChain:n,amount:s,asset:i});return {asset:o.token,amount:t.amount-(a[o.chainId]?.NATIVE??0n)}}function nr(e){let t=e.nativeTokenConfig.avalancheToken,r={...t.token,destinations:{[t.target.networkId]:["avalanche-ava-btc"]}};return {[t.chainId]:[r]}}async function rr(e,t){let{sourceChain:r,targetChain:n,amount:i,asset:s}=t,o=G({sourceChain:r,targetChain:n,amount:i,asset:s},e),a=await Ci(e,t,o),m=e.dustThreshold;return BigInt(Math.ceil((a+m)*2))}async function Ci(e,t,{source:r}){if(Q(r.bridgeFeeEstimate)){let{constAmount:n,numeratorPerSat:i,denominatorPerSat:s}=r.bridgeFeeEstimate.unwrapFeeEstimate.estimatedTxFee,o=n+i/s*Number(t.amount);return Number(r.bridgeFeeEstimate.unwrapFeeEstimate.bridgeToll.minimumFeeAmount)+o}else {let n=await ee(e,t);return Number(n[t.targetChain.chainId]?.NATIVE)}}var ir=({sourceClient:e,getMetadata:t,checkMetadata:r,trackingParams:{bridgeTransfer:n,updateListener:i},trackingConfig:{trackingLimitMs:s},bitcoinFunctions:o})=>{let a=lodash.cloneDeep(n);return async p=>{if(a.completedAt||r(a.metadata))return p(a);if(a.sourceStartedAt+s<=Date.now())return a=E(a,{completedAt:Date.now(),errorCode:5004},i),p(a);if(!viem.isHash(a.sourceTxHash))return;let c=await e.getTransactionReceipt({hash:a.sourceTxHash});if(!a.sourceNetworkFee){let g=await e.getTransaction({hash:a.sourceTxHash}),C=K(g,c);C&&(a=E(a,{sourceNetworkFee:C},i));}if(c.status==="reverted")return a=E(a,{completedAt:Date.now(),errorCode:5005},i),p(a);if(!viem.isHash(a.sourceTxHash))return;let d=await e.getTransactionConfirmations({hash:a.sourceTxHash}),u=d>a.sourceConfirmationCount,y=d>=a.sourceRequiredConfirmationCount;if(u){let g={};g.sourceConfirmationCount=Number(d),y||(g.targetStartBlockNumber=BigInt(await o.getChainHeight())),a=E(a,g,i);}if(!y)return;a.targetStartBlockNumber||(a=E(a,{targetStartBlockNumber:BigInt(await o.getChainHeight())},i));let T=t(c);return a=E(a,{targetStartedAt:Date.now(),metadata:T},i),p(a)}};var sr=({trackingParams:{bridgeTransfer:e,updateListener:t},trackingConfig:{trackingLimitMs:r},config:n,bitcoinFunctions:i})=>{let{toAddress:s,targetStartBlockNumber:o,amount:a}=e;if(!e.targetStartBlockNumber)throw new f("INVALID_PARAMS","targetStartBlockNumber is missing");let m=lodash.cloneDeep(e);return async c=>{if(m.completedAt)return c(m);if(m.sourceStartedAt+r<=Date.now())return m=E(m,{completedAt:Date.now(),errorCode:5004},t),c(m);if(!m.targetStartBlockNumber)throw new Error("unreachable");let d;if(!m.targetTxHash){let{confirmed:y,unconfirmed:T}=await i.getUTXOs(s,!1),C=[...y.filter(v=>!o||v.blockHeight>=o).sort((v,A)=>v.blockHeight-A.blockHeight),...T];for(let v of C){if(d=await i.getTransaction(v.txHash),!d)return;if(d.addresses.includes(n.walletAddresses.bitcoin)){m=E(m,{targetTxHash:d.hash,targetNetworkFee:BigInt(d.fees),targetConfirmationCount:d.confirmations},t);let x=d.outputs.find(F=>F.addresses?.length===1&&F.addresses[0]===s),S=x&&BigInt(Math.ceil(Number(a)-x.value));S&&(m=E(m,{bridgeFee:S},t));break}}if(!m.targetTxHash)return}if(d||(d=await i.getTransaction(m.targetTxHash)),!d)return;if(d.confirmations>=m.targetRequiredConfirmationCount)return m=E(m,{completedAt:Date.now(),targetConfirmationCount:d.confirmations},t),c(m)}};var bi=async(e,t)=>{let{sourceChain:r}=e.bridgeTransfer,n=h({chain:r}),i=Ue(),s=ir({sourceClient:n,getMetadata:i,checkMetadata:Ne,trackingParams:e,trackingConfig:k,bitcoinFunctions:t});return D({promise:s,delay:2e3,startAfter:k.initialDelayMs})},vi=async(e,t,r)=>{let n=sr({trackingParams:t,trackingConfig:k,config:e,bitcoinFunctions:r});return D({promise:n,delay:1e3*60,startAfter:k.initialDelayMs})};function or(e,t,r){let n,i=()=>{n?.();};return {result:(async()=>{let{bridgeTransfer:o}=t,{targetChain:a,sourceChain:m,asset:p,amount:c}=o;G({sourceChain:m,targetChain:a,asset:p,amount:c},e);let{result:d,cancel:u}=await bi(t,r);n=u;let y=await d,{result:T,cancel:g}=await vi(e,{...t,bridgeTransfer:y},r);return n=g,T})(),cancel:i}}async function mr(e,t,r,n){let{sourceChain:i,targetChain:s,asset:o,amount:a,fromAddress:m,toAddress:p,onStepChange:c,gasSettings:d}=t;Ce([m,p],e.addressBlocklist);let{source:u}=G({sourceChain:i,targetChain:s,asset:o,amount:a},e),y=Date.now(),g=(await ee(e,{asset:o,amount:a,sourceChain:i,targetChain:s}))[s.chainId]?.NATIVE??0n,C=e.minimumConfirmations.avalanche,v=await ze({amount:a,source:u,sourceChain:i,fromAddress:m,sign:r.sign,onStepChange:c,gasSettings:d}),A=BigInt(await n.getChainHeight());return {type:"avalanche-ava-btc",environment:e.environment,fromAddress:m,toAddress:p,amount:t.amount,asset:o,bridgeFee:g,sourceChain:i,sourceStartedAt:y,sourceTxHash:v,sourceConfirmationCount:0,sourceRequiredConfirmationCount:C,targetChain:t.targetChain,targetConfirmationCount:0,targetRequiredConfirmationCount:1,targetStartBlockNumber:A}}var cr=({fromAddress:e,toAddress:t,targetChain:r,...n})=>{if(!viem.isAddress(e))throw new f("INCORRECT_ADDRESS_PROVIDED","Invalid fromAddress was provided");let i=J(r);if(!Ie(t,i))throw new f("INCORRECT_ADDRESS_PROVIDED","Invalid toAddress was provided: Make sure it is Btc Address from correct environment");return {fromAddress:e,toAddress:t,targetChain:r,...n}},pt=({fromAddress:e,targetChain:t,...r})=>{if(!viem.isAddress(e))throw new f("INCORRECT_ADDRESS_PROVIDED","Invalid fromAddress was provided");return {fromAddress:e,targetChain:t,...r}};var dr=async(e,t,r)=>{let n=await $e(e);return {type:"avalanche-ava-btc",analyzeTx:i=>Yn(n,i),estimateGas:i=>er(n,pt(i)),estimateReceiveAmount:i=>tr(n,pt(i)),getAssets:()=>nr(n),getFees:i=>ee(n,i),transferAsset:i=>mr(n,cr(i),t,r),trackTransfer:i=>or(n,i,r),getMinimumTransferAmount:i=>rr(n,i)}};var ct={"avalanche-btc-ava":Zn,"avalanche-ava-btc":dr,"avalanche-evm":Sn,cctp:Ot,"ictt-erc20-erc20":mn},ki=async(e,t)=>{let r=await Promise.allSettled(t.map(async n=>{if(dt(n)){let s=ct[n.type];return [n.type,await s(e,n.signer,n.bitcoinFunctions)]}if(ut(n)){let s=ct[n.type];return [n.type,await s(e,n.signer,n.bitcoinFunctions)]}let i=ct[n.type];return [n.type,await i(e,n.signer)]}));return new Map(lodash.compact(r.map(n=>n.status==="fulfilled"?n.value:void 0)))},te=(e,t,r)=>{let n=t.destinations[r];for(let i of n??[]){let s=e.get(i);if(s)return {bridge:s,type:i}}throw new Se};var oT=({environment:e,enabledBridgeServices:t})=>({canTransferAsset:(u,y)=>{try{return te(t,u,y),!0}catch{return !1}},environment:e,estimateGas:async u=>{let{bridge:y}=te(t,u.asset,u.targetChain.chainId);return y.estimateGas(u)},estimateReceiveAmount:async u=>{let{bridge:y}=te(t,u.asset,u.targetChain.chainId);return y.estimateReceiveAmount(u)},getAssets:()=>Array.from(t.values()).map(y=>y.getAssets()).reduce((y,T)=>{for(let[g,C]of Object.entries(T)){let v=y[g];if(v)for(let A of C){let x=v.findIndex(({symbol:S})=>S===A.symbol);x===-1?v.push(A):lodash.mergeWith(v[x],A,(S,F)=>{if(lodash.isArray(S))return [...new Set(S.concat(F))]});}else y[g]=C;}return y},{}),getFees:async u=>{let{bridge:y}=te(t,u.asset,u.targetChain.chainId);return y.getFees(u)},analyzeTx:u=>{let y=["avalanche-evm","ictt-erc20-erc20","cctp"].map(T=>t.get(T)).filter(T=>!!T);for(let T of y){let g=T.analyzeTx(u);if(g.isBridgeTx)return g}return {isBridgeTx:!1}},getMinimumTransferAmount:async u=>{let{bridge:y}=te(t,u.asset,u.targetChain.chainId);return y.getMinimumTransferAmount(u)},trackTransfer:u=>{let{bridge:y}=te(t,u.bridgeTransfer.asset,u.bridgeTransfer.targetChain.chainId);return y.trackTransfer(u)},transferAsset:async u=>{let{bridge:y}=te(t,u.asset,u.targetChain.chainId);return y.transferAsset(u)}});
16
+
17
+ exports.AVALANCHE_FUJI_CHAIN = Di;
18
+ exports.AVALANCHE_MAINNET_CHAIN = _i;
19
+ exports.AvalancheChainIds = ne;
20
+ exports.BITCOIN_MAINNET_CHAIN = Hi;
21
+ exports.BITCOIN_TESTNET_CHAIN = Oi;
22
+ exports.BTC_BRIDGE_TYPES = Ni;
23
+ exports.BitcoinChainIds = re;
24
+ exports.BridgeSignatureReason = de;
25
+ exports.BridgeType = B;
26
+ exports.ETHEREUM_MAINNET_CHAIN = Mi;
27
+ exports.ETHEREUM_SEPOLIA_CHAIN = Fi;
28
+ exports.EVM_BRIDGE_TYPES = yr;
29
+ exports.Environment = ae;
30
+ exports.ErrorCode = z;
31
+ exports.ErrorReason = I;
32
+ exports.EthereumChainIds = Re;
33
+ exports.TokenType = j;
34
+ exports.caip2 = b;
35
+ exports.createUnifiedBridgeService = oT;
36
+ exports.getEnabledBridgeServices = ki;
37
+ exports.isAvaToBtcBridgeInitializer = dt;
38
+ exports.isBtcToAvaBridgeInitializer = ut;
39
+ exports.isErc20Asset = U;
40
+ exports.isEvmBridgeInitializer = Ri;
41
+ exports.isNativeAsset = ce;
6
42
  //# sourceMappingURL=out.js.map
7
43
  //# sourceMappingURL=index.cjs.map