@avalabs/bridge-unified 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +40 -24
  3. package/dist/index.cjs +8 -7
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +11 -36
  6. package/dist/index.d.ts +11 -36
  7. package/dist/index.js +3 -3
  8. package/dist/index.js.map +1 -1
  9. package/package.json +6 -2
  10. package/.turbo/turbo-build.log +0 -22
  11. package/.turbo/turbo-lint.log +0 -4
  12. package/.turbo/turbo-test.log +0 -26
  13. package/CHANGELOG.md +0 -31
  14. package/jest.config.js +0 -9
  15. package/src/bridges/cctp/__mocks__/asset.mock.ts +0 -15
  16. package/src/bridges/cctp/__mocks__/bridge-transfer.mock.ts +0 -48
  17. package/src/bridges/cctp/__mocks__/chain.mocks.ts +0 -33
  18. package/src/bridges/cctp/__mocks__/config.mock.ts +0 -45
  19. package/src/bridges/cctp/abis/erc20.ts +0 -117
  20. package/src/bridges/cctp/abis/message-transmitter.ts +0 -318
  21. package/src/bridges/cctp/abis/token-router.ts +0 -843
  22. package/src/bridges/cctp/factory.test.ts +0 -73
  23. package/src/bridges/cctp/factory.ts +0 -36
  24. package/src/bridges/cctp/handlers/estimate-gas.test.ts +0 -110
  25. package/src/bridges/cctp/handlers/estimate-gas.ts +0 -58
  26. package/src/bridges/cctp/handlers/get-assets.test.ts +0 -47
  27. package/src/bridges/cctp/handlers/get-assets.ts +0 -27
  28. package/src/bridges/cctp/handlers/get-fees.test.ts +0 -61
  29. package/src/bridges/cctp/handlers/get-fees.ts +0 -26
  30. package/src/bridges/cctp/handlers/track-transfer.test.ts +0 -779
  31. package/src/bridges/cctp/handlers/track-transfer.ts +0 -365
  32. package/src/bridges/cctp/handlers/transfer-asset.test.ts +0 -429
  33. package/src/bridges/cctp/handlers/transfer-asset.ts +0 -179
  34. package/src/bridges/cctp/index.ts +0 -1
  35. package/src/bridges/cctp/types/chain.ts +0 -9
  36. package/src/bridges/cctp/types/config.ts +0 -20
  37. package/src/bridges/cctp/utils/build-tx.ts +0 -30
  38. package/src/bridges/cctp/utils/config.test.ts +0 -49
  39. package/src/bridges/cctp/utils/config.ts +0 -36
  40. package/src/bridges/cctp/utils/transfer-data.test.ts +0 -83
  41. package/src/bridges/cctp/utils/transfer-data.ts +0 -48
  42. package/src/errors/bridge-error.ts +0 -11
  43. package/src/errors/bridge-initialization-error.ts +0 -9
  44. package/src/errors/bridge-unavailable-error.ts +0 -9
  45. package/src/errors/index.ts +0 -4
  46. package/src/errors/invalid-params-error.ts +0 -9
  47. package/src/index.ts +0 -3
  48. package/src/types/asset.ts +0 -26
  49. package/src/types/bridge.ts +0 -64
  50. package/src/types/chain.ts +0 -10
  51. package/src/types/config.ts +0 -10
  52. package/src/types/environment.ts +0 -4
  53. package/src/types/error.ts +0 -19
  54. package/src/types/index.ts +0 -9
  55. package/src/types/provider.ts +0 -12
  56. package/src/types/signer.ts +0 -18
  57. package/src/types/transfer.ts +0 -35
  58. package/src/unified-bridge-service.test.ts +0 -209
  59. package/src/unified-bridge-service.ts +0 -97
  60. package/src/utils/bridge-types.test.ts +0 -103
  61. package/src/utils/bridge-types.ts +0 -32
  62. package/src/utils/caip2.test.ts +0 -44
  63. package/src/utils/caip2.ts +0 -41
  64. package/src/utils/client.test.ts +0 -97
  65. package/src/utils/client.ts +0 -44
  66. package/src/utils/ensure-config.test.ts +0 -43
  67. package/src/utils/ensure-config.ts +0 -12
  68. package/src/utils/index.ts +0 -2
  69. package/src/utils/network-fee.test.ts +0 -24
  70. package/src/utils/network-fee.ts +0 -6
  71. package/src/utils/retry-promise.test.ts +0 -115
  72. package/src/utils/retry-promise.ts +0 -72
  73. package/src/utils/wait.test.ts +0 -33
  74. package/src/utils/wait.ts +0 -4
  75. package/tsconfig.jest.json +0 -7
  76. package/tsconfig.json +0 -9
  77. package/tsup.config.ts +0 -4
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
@@ -37,16 +37,21 @@ Future bridges we plan to support:
37
37
  ## Usage
38
38
 
39
39
  ```js
40
- import { createUnifiedBridgeService, Environment, BridgeTransfer } from '@avalabs/bridge-unified';
40
+ import { createUnifiedBridgeService, getEnabledBridgeServices, Environment, BridgeTransfer } from '@avalabs/bridge-unified';
41
41
 
42
- // create a new service for an environment
42
+ const environment = Environment.TEST;
43
+ // use all available bridges
44
+ const disabledBridgeTypes = []
45
+
46
+ // fetch all available bridge services
47
+ const enabledBridgeServices = await getEnabledBridgeServices(environment, disabledBridgeTypes);
48
+
49
+ // create a new service for a given environment and list of bridge services
43
50
  const unifiedService = createUnifiedBridgeService({
44
- environment: Environment.TEST,
51
+ environment,
52
+ enabledBridgeServices
45
53
  });
46
54
 
47
- // init the service, fetch and setup its configs
48
- await unifiedService.init();
49
-
50
55
  // get the list of supported assets, grouped by caip2 (https://chainagnostic.org/CAIPs/caip-2) chain IDs
51
56
  const assets = await unifiedService.getAssets()
52
57
 
@@ -73,9 +78,11 @@ const finalizedBridgeTransfer = await result
73
78
 
74
79
  ## API
75
80
 
76
- ### createUnifiedBridgeService({ environment, disabledBridgeTypes? })
81
+ ### getEnabledBridgeServices(environment, disabledBridgeTypes);
77
82
 
78
- Returns a new `unifiedBridgeService` for the given `environment`, using all supported bridge integrations by default. Individual bridges can be turned off via the `disabledBridgeTypes` array.
83
+ Type: `(environment: Environment, disabledBridgeTypes: BridgeType[]) => Promise<BridgeServicesMap>`
84
+
85
+ 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.
79
86
 
80
87
  #### environment
81
88
 
@@ -85,10 +92,20 @@ Defines if the bridge service should use `testnet` or `mainnet`.
85
92
 
86
93
  #### disabledBridgeTypes
87
94
 
88
- Type: `BridgeType[] | undefined`
95
+ Type: `BridgeType[]`
89
96
 
90
97
  Disables the integration of the provided `BridgeType`s.
91
98
 
99
+ #### enabledBridgeServices
100
+
101
+ Type: `BridgeServicesMap` => `Map<BridgeType, BridgeService>`
102
+
103
+ This includes all the bridge services which were initialized successfully, to pass to `createUnifiedBridgeService`.
104
+
105
+ ### createUnifiedBridgeService({ environment, enabledBridgeServices })
106
+
107
+ Returns a new `unifiedBridgeService` for the given `environment` and `enabledBridgeServices` map.
108
+
92
109
  ### unifiedBridgeService
93
110
 
94
111
  Contains all the required properties and methods to prepare, initiate or track a bridge transfer.
@@ -97,28 +114,15 @@ Automatically picks the right (enabled) bridge integration to use based on the p
97
114
  ```js
98
115
  {
99
116
  environment, // the provided Environment during initialization
100
- bridges, // the list of enabled bridge integrations
101
- init,
102
- updateConfigs,
103
117
  getAssets,
104
118
  getFees,
119
+ estimateGas,
120
+ canTransferAsset,
105
121
  transferAsset,
106
122
  trackTransfer,
107
123
  }
108
124
  ```
109
125
 
110
- #### init
111
-
112
- Type: `() => Promise<void>`
113
-
114
- Initializes the unified service by attempting to fetch the configurations of the enabled bridges.
115
-
116
- #### updateConfigs
117
-
118
- Type: `() => Promise<void>`
119
-
120
- Attempts to fetch the configurations of the enabled bridges.
121
-
122
126
  #### getAssets
123
127
 
124
128
  Type: `() => Promise<ChainAssetMap>`
@@ -131,6 +135,18 @@ Type: `(params: FeeParams) => Promise<AssetFeeMap>`
131
135
 
132
136
  Calculates and returns the bridge fees in `tokenAddress` - `amount` pairs for a given bridge transfer.
133
137
 
138
+ #### estimateGas
139
+
140
+ Type: `(params: TransferParams) => Promise<bigint>`
141
+
142
+ Estimates the gas cost of a specific transfer.
143
+
144
+ #### canTransferAsset
145
+
146
+ Type: `(asset: BridgeAsset, targetChainId: string) => boolean`
147
+
148
+ Indicates whether the unified bridge supports transferring a specific asset to a specific target chain.
149
+
134
150
  #### transferAsset
135
151
 
136
152
  Type: `(params: TransferParams) => Promise<BridgeTransfer>`
package/dist/index.cjs CHANGED
@@ -3,15 +3,16 @@
3
3
  var viem = require('viem');
4
4
  var lodash = require('lodash');
5
5
 
6
- var H=(r=>(r.NATIVE="native",r.ERC20="erc20",r))(H||{});var D=(t=>(t.CCTP="cctp",t))(D||{}),V=(r=>(r.AllowanceApproval="allowance-approval",r.TokensTransfer="tokens-transfer",r))(V||{});var G=(r=>(r.PROD="production",r.TEST="test",r))(G||{});var E=(n=>(n[n.BRIDGE_NOT_AVAILABLE=5001]="BRIDGE_NOT_AVAILABLE",n[n.INITIALIZATION_FAILED=5002]="INITIALIZATION_FAILED",n[n.INVALID_PARAMS=5003]="INVALID_PARAMS",n[n.TIMEOUT=5004]="TIMEOUT",n[n.TRANSACTION_REVERTED=5005]="TRANSACTION_REVERTED",n))(E||{}),w=(o=>(o.UNKNOWN="UNKNOWN",o.CONFIG_NOT_AVAILABLE="CONFIG_NOT_AVAILABLE",o.INVALID_PARAMS="INVALID_PARAMS",o.IDENTICAL_CHAINS_PROVIDED="IDENTICAL_CHAINS_PROVIDED",o.INCORRECT_AMOUNT_PROVIDED="INCORRECT_AMOUNT_PROVIDED",o.INCORRECT_ADDRESS_PROVIDED="INCORRECT_ADDRESS_PROVIDED",o.CHAIN_NOT_SUPPORTED="CHAIN_NOT_SUPPORTED",o.ASSET_NOT_SUPPORTED="ASSET_NOT_SUPPORTED",o.CONFIRMATION_COUNT_UNKNOWN="CONFIRMATION_COUNT_UNKNOWN",o))(w||{});var x=class extends Error{constructor(r,a,d){super(r);this.code=a;this.details=d;}};var B=class extends x{constructor(t="UNKNOWN",r){super(t,5001,r),this.name="BridgeUnavailableError";}};var k=class extends x{constructor(t="UNKNOWN",r){super(t,5002,r),this.name="BridgeInitializationError";}};var y=class extends x{constructor(t="INVALID_PARAMS",r){super(t,5003,r),this.name="InvalidParamsError";}};var de={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"},K=async e=>{try{return (await(await fetch(de[e])).json()).map(a=>({...a,chainId:`eip155:${a.chainId}`}))}catch(t){throw new k("CONFIG_NOT_AVAILABLE",`Error while fetching CCTP config: ${t.message}`)}},F=e=>{switch(e){case"eip155:43114":case"eip155:43113":return 1e3;default:return 2e4}};async function $(e){await e.ensureHasConfig();let t=e.config.map(r=>r.chainId);return e.config.reduce((r,a)=>(r[a.chainId]=a.tokens.map(d=>({...d,type:"erc20",destinations:t.reduce((n,s)=>(a.chainId!==s&&(n[s]||(n[s]=[]),n[s]?.push("cctp")),n),{})})),r),{})}var ce="^[-a-z0-9]{3,8}$",me="^[-_a-zA-Z0-9]{1,50}$",q=":",le=e=>{let[t,r]=e.split(q);if(!t||!r)throw new Error("Invalid identifier provided.");if(!new RegExp(ce).test(t))throw new Error("Invalid namespace provided.");if(!new RegExp(me).test(r))throw new Error("Invalid reference provided.");return {namespace:t,reference:r}},fe=({namespace:e,reference:t})=>`${e}${q}${t}`,O={toJSON:le,toString:fe};var Ce=e=>{let{reference:t}=O.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,provider:t})=>{let r=Ce(e),a=t?viem.custom(t):viem.http(e.rpcUrl,{batch:!0,retryCount:0});return viem.createWalletClient({chain:r,transport:a}).extend(viem.publicActions)};var I=[{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 _=({sourceChain:e,targetChain:t,amount:r,asset:a},d)=>{if(e.chainId===t.chainId)throw new y("IDENTICAL_CHAINS_PROVIDED");if(r<=0n)throw new y("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");let n=d.find(o=>o.chainId===e.chainId);if(!n)throw new y("CHAIN_NOT_SUPPORTED",`Not supported on source chain "${e.chainId}"`);let s=d.find(o=>o.chainId===t.chainId);if(!s)throw new y("CHAIN_NOT_SUPPORTED",`Not supported on target chain "${t.chainId}"`);let c=n.tokens.find(o=>o.symbol===a.symbol),f=s.tokens.find(o=>o.symbol===a.symbol);if(!c||!f)throw new y("ASSET_NOT_SUPPORTED");return {sourceChainData:n,targetChainData:s,burnToken:c,mintToken:f}};async function W(e,t){await e.ensureHasConfig();let{sourceChain:r,targetChain:a,asset:d,amount:n,provider:s}=t,{sourceChainData:c,targetChainData:f,burnToken:o}=_({sourceChain:r,targetChain:a,asset:d,amount:n},e.config),i=await h({chain:r,provider:s}).readContract({address:c.tokenRouterAddress,abi:I,functionName:"calculateFee",args:[n,f.domain]});return {[o.address]:i}}var P=[{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"}];function z({amount:e,burnToken:t,targetChainData:r,toAddress:a}){return viem.encodeFunctionData({abi:I,functionName:"transferTokens",args:[e,r.domain,a,t.address]})}function X({amount:e,sourceChainData:t}){return viem.encodeFunctionData({abi:P,functionName:"approve",args:[t.tokenRouterAddress,e]})}var be=async(e,t)=>{let{sourceChain:r,targetChain:a,asset:d,amount:n,fromAddress:s,toAddress:c,sourceProvider:f,onStepChange:o,sign:p}=t,i=c??s;if(!viem.isAddress(s)||!viem.isAddress(i))throw new y("INCORRECT_ADDRESS_PROVIDED");let{sourceChainData:u,targetChainData:T,burnToken:m}=_({sourceChain:r,targetChain:a,asset:d,amount:n},e.config),l=h({chain:r,provider:f}),b=await l.readContract({address:m.address,abi:P,functionName:"allowance",args:[s,u.tokenRouterAddress]})<n,N=b?2:1;if(b)if(o?.({currentSignature:1,currentSignatureReason:"allowance-approval",requiredSignatures:N}),p){let g=X({amount:n,sourceChainData:u}),A=await p({from:s,to:m.address,data:g},R=>l.sendRawTransaction({serializedTransaction:R}));await l.waitForTransactionReceipt({hash:A,pollingInterval:1e3});}else {let{request:g}=await l.simulateContract({account:s,address:m.address,abi:P,functionName:"approve",args:[u.tokenRouterAddress,n]}),A=await l.writeContract(g);await l.waitForTransactionReceipt({hash:A,pollingInterval:1e3});}if(o?.({currentSignature:b?2:1,currentSignatureReason:"tokens-transfer",requiredSignatures:N}),p){let g=z({amount:n,burnToken:m,targetChainData:T,toAddress:i});return p({from:s,to:u.tokenRouterAddress,data:g},A=>l.sendRawTransaction({serializedTransaction:A}))}else {let{request:g}=await l.simulateContract({account:s,address:u.tokenRouterAddress,abi:I,functionName:"transferTokens",args:[n,T.domain,i,m.address]});return l.writeContract(g)}},he=async e=>{try{return await e.getBlockNumber()}catch{return}};async function Z(e,t,r){await e.ensureHasConfig();let{minimumConfirmations:a}=e.config.find(i=>i.chainId===t.sourceChain.chainId)??{},{minimumConfirmations:d}=e.config.find(i=>i.chainId===t.targetChain.chainId)??{};if(!a||!d)throw new y("CONFIRMATION_COUNT_UNKNOWN");let n=await e.getFees({...t,provider:t.sourceProvider}),s=(t.asset.address&&n[t.asset.address])??0n,c=await be(e,t),f=Date.now(),o=h({chain:t.targetChain,provider:t.targetProvider}),p=await he(o);return {type:e.type,environment:r,fromAddress:t.fromAddress,toAddress:t.toAddress??t.fromAddress,amount:t.amount,amountDecimals:t.asset.decimals,symbol:t.asset.symbol,bridgeFee:s,sourceChain:t.sourceChain,sourceStartedAt:f,sourceTxHash:c,sourceConfirmationCount:0,requiredSourceConfirmationCount:a,targetChain:t.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:d,startBlockNumber:p}}async function Y(e){if(!e.config&&(await e.updateConfig(),!e.config))throw new k("CONFIG_NOT_AVAILABLE")}var M=(e,t)=>e.gasPrice&&BigInt(e.gasPrice*t.gasUsed);var L=async e=>new Promise(t=>{setTimeout(t,e);});var U=({promise:e,delay:t,startAfter:r})=>{let a=!1,d=!1,n=0,s,c,f=i=>{s&&a&&(a=!1,s(i));},o=()=>{d=!0,c&&a&&(a=!1,c("cancelled"));};return {result:new Promise((i,u)=>{a=!0,s=i,c=u;let T=async()=>{if(!(!a||d)){try{if(await e(f),!a||d)return;await L(t);}catch(m){console.error(m.message),n+=1,await L(2**n*t);}await T();}};r?setTimeout(T,r):T();}),cancel:o}};var te=1e3*60*60*3,ee=1024n,ne=5e3,C=(e,t,r)=>{Object.assign(e,Object.fromEntries(Object.entries(t).filter(([,a])=>a!==void 0))),r({...e});},ve=async(e,t)=>{let{sourceProvider:r,targetProvider:a,updateListener:d,bridgeTransfer:n}=t,s=h({chain:n.sourceChain,provider:r}),c=e.find(u=>u.chainId===n.sourceChain.chainId),f=h({chain:n.targetChain,provider:a}),o=e.find(u=>u.chainId===n.targetChain.chainId),p={...n};if(!c||!o)throw new y("CHAIN_NOT_SUPPORTED");return U({promise:async u=>{if(p.completedAt||p.metadata?.nonce)return u(p);if(p.sourceStartedAt+te<=Date.now())return C(p,{completedAt:Date.now(),errorCode:5004},d),u(p);let T=await s.getTransactionReceipt({hash:p.sourceTxHash});if(!p.sourceNetworkFee){let A=await s.getTransaction({hash:p.sourceTxHash}),R=M(A,T);R&&C(p,{sourceNetworkFee:R},d);}if(T.status==="reverted")return C(p,{completedAt:Date.now(),errorCode:5005},d),u(p);let m=await s.getTransactionConfirmations({hash:p.sourceTxHash}),l=m>p.sourceConfirmationCount,v=m>=p.requiredSourceConfirmationCount;if(l){let A={};A.sourceConfirmationCount=Number(m),v||(A.startBlockNumber=await f.getBlockNumber()),C(p,A,d);}if(!v)return;p.startBlockNumber||C(p,{startBlockNumber:await f.getBlockNumber()},d);let b=T.logs.find(A=>A.address.toLowerCase()===c.tokenRouterAddress.toLowerCase()?viem.decodeEventLog({abi:I,...A}).eventName==="TransferTokens":!1);if(!b)throw new y("INVALID_PARAMS",`unable to find a TransferTokens event in source transaction "${p.sourceTxHash}"`);let g=viem.decodeEventLog({abi:I,eventName:"TransferTokens",...b}).args.nonce;return C(p,{targetStartedAt:Date.now(),metadata:{nonce:g}},d),u(p)},delay:F(c.chainId),startAfter:ne})},we=async(e,t)=>{let{targetProvider:r,updateListener:a,bridgeTransfer:d}=t,n={...d};if(!d.completedAt&&!d.metadata?.nonce)throw new y("INVALID_PARAMS","nonce is missing");if(!d.startBlockNumber)throw new y("INVALID_PARAMS","startBlockNumber is missing");let s=h({chain:d.targetChain,provider:r}),c=e.find(o=>o.chainId===d.targetChain.chainId);if(!c)throw new y("INVALID_PARAMS",`unknown target chain "${d.targetChain.chainId}"`);return U({promise:async o=>{if(n.completedAt)return o(n);if(!n.startBlockNumber)return C(n,{completedAt:Date.now(),errorCode:5003},a),o(n);if(n.sourceStartedAt+te<=Date.now())return C(n,{completedAt:Date.now(),errorCode:5004},a),o(n);if(!n.targetTxHash){let m=await s.getBlockNumber(),l=n.startBlockNumber-ee,v=l>=0n?l:"earliest",b=n.startBlockNumber+ee,N=b<m?b:"latest",g=await s.getLogs({address:c.messageTransmitterAddress,event:{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"}]},args:{nonce:n.metadata.nonce},fromBlock:v,toBlock:N});if(g[0]?.transactionHash)C(n,{targetTxHash:g[0].transactionHash},a);else {C(n,{startBlockNumber:m},a);return}}let p=await s.getTransactionReceipt({hash:n.targetTxHash});if(!n.targetNetworkFee){let m=await s.getTransaction({hash:n.targetTxHash}),l=M(m,p);l&&C(n,{targetNetworkFee:l},a);}if(p.status==="reverted")return C(n,{completedAt:Date.now(),errorCode:5005},a),o(n);let i=await s.getTransactionConfirmations({hash:n.targetTxHash}),u=i>n.targetConfirmationCount,T=i>=n.requiredTargetConfirmationCount;if(u&&C(n,{targetConfirmationCount:Number(i)},a),!!T)return C(n,{completedAt:Date.now()},a),o(n)},delay:F(c.chainId),startAfter:ne})};function re(e,t){let r,a=()=>{r?.();};return {result:(async()=>{await e.ensureHasConfig();let{sourceProvider:n,targetProvider:s,updateListener:c,bridgeTransfer:f}=t,{result:o,cancel:p}=await ve(e.config,{sourceProvider:n,targetProvider:s,updateListener:c,bridgeTransfer:f});r=p;let i=await o,{result:u,cancel:T}=await we(e.config,{sourceProvider:n,targetProvider:s,updateListener:c,bridgeTransfer:i});return r=T,u})(),cancel:a}}var Ie=60000n,se=175000n,Ne=60000n,ie=215000n;async function oe(e,t){await e.ensureHasConfig();let{sourceChain:r,targetChain:a,asset:d,amount:n,fromAddress:s,toAddress:c,sourceProvider:f}=t,o=c??s;if(!viem.isAddress(s)||!viem.isAddress(o))throw new y("INCORRECT_ADDRESS_PROVIDED");let{sourceChainData:p,burnToken:i}=_({sourceChain:r,targetChain:a,asset:d,amount:n},e.config),T=await h({chain:r,provider:f}).readContract({address:i.address,abi:P,functionName:"allowance",args:[s,p.tokenRouterAddress]}),m=p.domain===1;return T>=n?m?ie:se:m?Ne+ie:Ie+se}var pe=e=>({type:"cctp",config:null,updateConfig:async function(){this.config=await K(e);},ensureHasConfig:async function(){return Y(this)},estimateGas:function(t){return oe(this,t)},getAssets:async function(){return $(this)},getFees:async function(t){return W(this,t)},transferAsset:async function(t){return Z(this,t,e)},trackTransfer:function(t){return re(this,t)}});var xe=new Map([["cctp",pe]]),ue=(e,t)=>new Map([...xe].filter(([r])=>!t?.includes(r)).map(([r,a])=>[r,a(e)])),S=(e,t,r)=>{let a=t.destinations[r]?.find(d=>e.has(d));if(!a)throw new B;return {type:a,bridge:e.get(a)}};var Sn=({environment:e,disabledBridgeTypes:t})=>{let r=ue(e,t),a=async()=>{await Promise.allSettled(Array.from(r).map(([,i])=>i.updateConfig()));};return {environment:e,bridges:r,init:async()=>{await a();},updateConfigs:a,getAssets:async()=>(await Promise.all(Array.from(r).map(([,u])=>u.getAssets()))).reduce((u,T)=>{for(let[m,l]of Object.entries(T)){let v=u[m];if(v)for(let b of l){let N=v.findIndex(({symbol:g})=>g===b.symbol);N===-1?v.push(b):lodash.mergeWith(v[N],b,(g,A)=>{if(lodash.isArray(g))return [...new Set(g.concat(A))]});}else u[m]=l;}return u},{}),getFees:async i=>{let{bridge:u}=S(r,i.asset,i.targetChain.chainId);return u.getFees(i)},estimateGas:async i=>{let{bridge:u}=S(r,i.asset,i.targetChain.chainId);return u.estimateGas(i)},canTransferAsset:(i,u)=>{try{return S(r,i,u),!0}catch{return !1}},transferAsset:async i=>{let{bridge:u}=S(r,i.asset,i.targetChain.chainId);return u.transferAsset(i)},trackTransfer:i=>{let u=r.get(i.bridgeTransfer.type);if(!u)throw new B;return u.trackTransfer(i)}}};
6
+ var H=(r=>(r.NATIVE="native",r.ERC20="erc20",r))(H||{});var E=(e=>(e.CCTP="cctp",e))(E||{}),G=(r=>(r.AllowanceApproval="allowance-approval",r.TokensTransfer="tokens-transfer",r))(G||{});var K=(r=>(r.PROD="production",r.TEST="test",r))(K||{});var B=(t=>(t[t.BRIDGE_NOT_AVAILABLE=5001]="BRIDGE_NOT_AVAILABLE",t[t.INITIALIZATION_FAILED=5002]="INITIALIZATION_FAILED",t[t.INVALID_PARAMS=5003]="INVALID_PARAMS",t[t.TIMEOUT=5004]="TIMEOUT",t[t.TRANSACTION_REVERTED=5005]="TRANSACTION_REVERTED",t))(B||{}),w=(a=>(a.UNKNOWN="UNKNOWN",a.CONFIG_NOT_AVAILABLE="CONFIG_NOT_AVAILABLE",a.INVALID_PARAMS="INVALID_PARAMS",a.IDENTICAL_CHAINS_PROVIDED="IDENTICAL_CHAINS_PROVIDED",a.INCORRECT_AMOUNT_PROVIDED="INCORRECT_AMOUNT_PROVIDED",a.INCORRECT_ADDRESS_PROVIDED="INCORRECT_ADDRESS_PROVIDED",a.CHAIN_NOT_SUPPORTED="CHAIN_NOT_SUPPORTED",a.ASSET_NOT_SUPPORTED="ASSET_NOT_SUPPORTED",a.CONFIRMATION_COUNT_UNKNOWN="CONFIRMATION_COUNT_UNKNOWN",a))(w||{});async function $(n){let e=n.map(r=>r.chainId);return n.reduce((r,s)=>(r[s.chainId]=s.tokens.map(i=>({...i,type:"erc20",destinations:e.reduce((t,o)=>(s.chainId!==o&&(t[o]||(t[o]=[]),t[o]?.push("cctp")),t),{})})),r),{})}var ue="^[-a-z0-9]{3,8}$",de="^[-_a-zA-Z0-9]{1,50}$",q=":",me=n=>{let[e,r]=n.split(q);if(!e||!r)throw new Error("Invalid identifier provided.");if(!new RegExp(ue).test(e))throw new Error("Invalid namespace provided.");if(!new RegExp(de).test(r))throw new Error("Invalid reference provided.");return {namespace:e,reference:r}},ce=({namespace:n,reference:e})=>`${n}${q}${e}`,M={toJSON:me,toString:ce};var ge=n=>{let{reference:e}=M.toJSON(n.chainId);return {id:Number(e),name:n.chainName,nativeCurrency:{decimals:n.networkToken.decimals,symbol:n.networkToken.symbol,name:n.networkToken.name},network:n.chainName,rpcUrls:{default:{http:[n.rpcUrl]},public:{http:[n.rpcUrl]}},...n.utilityAddresses?.multicall&&{contracts:{multicall3:{address:n.utilityAddresses.multicall}}}}},b=({chain:n,provider:e})=>{let r=ge(n),s=e?viem.custom(e):viem.http(n.rpcUrl,{batch:!0,retryCount:0});return viem.createWalletClient({chain:r,transport:s}).extend(viem.publicActions)};var v=[{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 x=class extends Error{constructor(r,s,i){super(r);this.code=s;this.details=i;}};var k=class extends x{constructor(e="UNKNOWN",r){super(e,5001,r),this.name="BridgeUnavailableError";}};var S=class extends x{constructor(e="UNKNOWN",r){super(e,5002,r),this.name="BridgeInitializationError";}};var T=class extends x{constructor(e="INVALID_PARAMS",r){super(e,5003,r),this.name="InvalidParamsError";}};var R=({sourceChain:n,targetChain:e,amount:r,asset:s},i)=>{if(n.chainId===e.chainId)throw new T("IDENTICAL_CHAINS_PROVIDED");if(r<=0n)throw new T("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");let t=i.find(a=>a.chainId===n.chainId);if(!t)throw new T("CHAIN_NOT_SUPPORTED",`Not supported on source chain "${n.chainId}"`);let o=i.find(a=>a.chainId===e.chainId);if(!o)throw new T("CHAIN_NOT_SUPPORTED",`Not supported on target chain "${e.chainId}"`);let d=t.tokens.find(a=>a.symbol===s.symbol),u=o.tokens.find(a=>a.symbol===s.symbol);if(!d||!u)throw new T("ASSET_NOT_SUPPORTED");return {sourceChainData:t,targetChainData:o,burnToken:d,mintToken:u}};async function F(n,e){let{sourceChain:r,targetChain:s,asset:i,amount:t,provider:o}=e,{sourceChainData:d,targetChainData:u,burnToken:a}=R({sourceChain:r,targetChain:s,asset:i,amount:t},n),m=await b({chain:r,provider:o}).readContract({address:d.tokenRouterAddress,abi:v,functionName:"calculateFee",args:[t,u.domain]});return {[a.address]:m}}var N=[{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"}];function j({amount:n,burnToken:e,targetChainData:r,toAddress:s}){return viem.encodeFunctionData({abi:v,functionName:"transferTokens",args:[n,r.domain,s,e.address]})}function X({amount:n,sourceChainData:e}){return viem.encodeFunctionData({abi:N,functionName:"approve",args:[e.tokenRouterAddress,n]})}var Ae=async(n,e)=>{let{sourceChain:r,targetChain:s,asset:i,amount:t,fromAddress:o,toAddress:d,sourceProvider:u,onStepChange:a,sign:p}=e,m=d??o;if(!viem.isAddress(o)||!viem.isAddress(m))throw new T("INCORRECT_ADDRESS_PROVIDED");let{sourceChainData:c,targetChainData:y,burnToken:l}=R({sourceChain:r,targetChain:s,asset:i,amount:t},n),f=b({chain:r,provider:u}),C=await f.readContract({address:l.address,abi:N,functionName:"allowance",args:[o,c.tokenRouterAddress]})<t,_=C?2:1;if(C)if(a?.({currentSignature:1,currentSignatureReason:"allowance-approval",requiredSignatures:_}),p){let g=X({amount:t,sourceChainData:c}),I=await p({from:o,to:l.address,data:g},pe=>f.sendRawTransaction({serializedTransaction:pe}));await f.waitForTransactionReceipt({hash:I,pollingInterval:1e3});}else {let{request:g}=await f.simulateContract({account:o,address:l.address,abi:N,functionName:"approve",args:[c.tokenRouterAddress,t]}),I=await f.writeContract(g);await f.waitForTransactionReceipt({hash:I,pollingInterval:1e3});}if(a?.({currentSignature:C?2:1,currentSignatureReason:"tokens-transfer",requiredSignatures:_}),p){let g=j({amount:t,burnToken:l,targetChainData:y,toAddress:m});return p({from:o,to:c.tokenRouterAddress,data:g},I=>f.sendRawTransaction({serializedTransaction:I}))}let{request:P}=await f.simulateContract({account:o,address:c.tokenRouterAddress,abi:v,functionName:"transferTokens",args:[t,y.domain,m,l.address]});return f.writeContract(P)},Ce=async n=>{try{return await n.getBlockNumber()}catch{return}};async function J(n,e,r){let{minimumConfirmations:s}=n.find(m=>m.chainId===e.sourceChain.chainId)??{},{minimumConfirmations:i}=n.find(m=>m.chainId===e.targetChain.chainId)??{};if(!s||!i)throw new T("CONFIRMATION_COUNT_UNKNOWN");let t=await F(n,{...e,provider:e.sourceProvider}),o=(e.asset.address&&t[e.asset.address])??0n,d=await Ae(n,e),u=Date.now(),a=b({chain:e.targetChain,provider:e.targetProvider}),p=await Ce(a);return {type:"cctp",environment:r,fromAddress:e.fromAddress,toAddress:e.toAddress??e.fromAddress,amount:e.amount,amountDecimals:e.asset.decimals,symbol:e.asset.symbol,bridgeFee:o,sourceChain:e.sourceChain,sourceStartedAt:u,sourceTxHash:d,sourceConfirmationCount:0,requiredSourceConfirmationCount:s,targetChain:e.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:i,startBlockNumber:p}}var O=(n,e)=>n.gasPrice&&BigInt(n.gasPrice*e.gasUsed);var L=async n=>new Promise(e=>{setTimeout(e,n);});var U=({promise:n,delay:e,startAfter:r})=>{let s=!1,i=!1,t=0,o,d,u=m=>{o&&s&&(s=!1,o(m));},a=()=>{i=!0,d&&s&&(s=!1,d("cancelled"));};return {result:new Promise((m,c)=>{s=!0,o=m,d=c;let y=async()=>{if(!(!s||i)){try{if(await n(u),!s||i)return;await L(e);}catch(l){console.error(l.message),t+=1,await L(2**t*e);}await y();}};r?setTimeout(y,r):y();}),cancel:a}};var be={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"},Z=async n=>{try{return (await(await fetch(be[n])).json()).map(s=>({...s,chainId:`eip155:${s.chainId}`}))}catch(e){throw new S("CONFIG_NOT_AVAILABLE",`Error while fetching CCTP config: ${e.message}`)}},V=n=>{switch(n){case"eip155:43114":case"eip155:43113":return 1e3;default:return 2e4}};var ee=1e3*60*60*3,Q=1024n,te=5e3,A=(n,e,r)=>{Object.assign(n,Object.fromEntries(Object.entries(e).filter(([,s])=>s!==void 0))),r({...n});},he=async(n,e)=>{let{sourceProvider:r,targetProvider:s,updateListener:i,bridgeTransfer:t}=e,o=b({chain:t.sourceChain,provider:r}),d=n.find(c=>c.chainId===t.sourceChain.chainId),u=b({chain:t.targetChain,provider:s}),a=n.find(c=>c.chainId===t.targetChain.chainId),p={...t};if(!d||!a)throw new T("CHAIN_NOT_SUPPORTED");return U({promise:async c=>{if(p.completedAt||p.metadata?.nonce)return c(p);if(p.sourceStartedAt+ee<=Date.now())return A(p,{completedAt:Date.now(),errorCode:5004},i),c(p);let y=await o.getTransactionReceipt({hash:p.sourceTxHash});if(!p.sourceNetworkFee){let g=await o.getTransaction({hash:p.sourceTxHash}),I=O(g,y);I&&A(p,{sourceNetworkFee:I},i);}if(y.status==="reverted")return A(p,{completedAt:Date.now(),errorCode:5005},i),c(p);let l=await o.getTransactionConfirmations({hash:p.sourceTxHash}),f=l>p.sourceConfirmationCount,h=l>=p.requiredSourceConfirmationCount;if(f){let g={};g.sourceConfirmationCount=Number(l),h||(g.startBlockNumber=await u.getBlockNumber()),A(p,g,i);}if(!h)return;p.startBlockNumber||A(p,{startBlockNumber:await u.getBlockNumber()},i);let C=y.logs.find(g=>g.address.toLowerCase()===d.tokenRouterAddress.toLowerCase()?viem.decodeEventLog({abi:v,...g}).eventName==="TransferTokens":!1);if(!C)throw new T("INVALID_PARAMS",`unable to find a TransferTokens event in source transaction "${p.sourceTxHash}"`);let P=viem.decodeEventLog({abi:v,eventName:"TransferTokens",...C}).args.nonce;return A(p,{targetStartedAt:Date.now(),metadata:{nonce:P}},i),c(p)},delay:V(d.chainId),startAfter:te})},Ie=async(n,e)=>{let{targetProvider:r,updateListener:s,bridgeTransfer:i}=e,t={...i};if(!i.completedAt&&!i.metadata?.nonce)throw new T("INVALID_PARAMS","nonce is missing");if(!i.startBlockNumber)throw new T("INVALID_PARAMS","startBlockNumber is missing");let o=b({chain:i.targetChain,provider:r}),d=n.find(a=>a.chainId===i.targetChain.chainId);if(!d)throw new T("INVALID_PARAMS",`unknown target chain "${i.targetChain.chainId}"`);return U({promise:async a=>{if(t.completedAt)return a(t);if(!t.startBlockNumber)return A(t,{completedAt:Date.now(),errorCode:5003},s),a(t);if(t.sourceStartedAt+ee<=Date.now())return A(t,{completedAt:Date.now(),errorCode:5004},s),a(t);if(!t.targetTxHash){let l=await o.getBlockNumber(),f=t.startBlockNumber-Q,h=f>=0n?f:"earliest",C=t.startBlockNumber+Q,_=C<l?C:"latest",P=await o.getLogs({address:d.messageTransmitterAddress,event:{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"}]},args:{nonce:t.metadata?.nonce},fromBlock:h,toBlock:_});if(P[0]?.transactionHash)A(t,{targetTxHash:P[0].transactionHash},s);else {A(t,{startBlockNumber:l},s);return}}let p=await o.getTransactionReceipt({hash:t.targetTxHash});if(!t.targetNetworkFee){let l=await o.getTransaction({hash:t.targetTxHash}),f=O(l,p);f&&A(t,{targetNetworkFee:f},s);}if(p.status==="reverted")return A(t,{completedAt:Date.now(),errorCode:5005},s),a(t);let m=await o.getTransactionConfirmations({hash:t.targetTxHash}),c=m>t.targetConfirmationCount,y=m>=t.requiredTargetConfirmationCount;if(c&&A(t,{targetConfirmationCount:Number(m)},s),!!y)return A(t,{completedAt:Date.now()},s),a(t)},delay:V(d.chainId),startAfter:te})};function ne(n,e){let r,s=()=>{r?.();};return {result:(async()=>{let{sourceProvider:t,targetProvider:o,updateListener:d,bridgeTransfer:u}=e,{result:a,cancel:p}=await he(n,{sourceProvider:t,targetProvider:o,updateListener:d,bridgeTransfer:u});r=p;let m=await a,{result:c,cancel:y}=await Ie(n,{sourceProvider:t,targetProvider:o,updateListener:d,bridgeTransfer:m});return r=y,c})(),cancel:s}}var we=60000n,ae=175000n,ve=60000n,se=215000n;async function ie(n,e){let{sourceChain:r,targetChain:s,asset:i,amount:t,fromAddress:o,toAddress:d,sourceProvider:u}=e,a=d??o;if(!viem.isAddress(o)||!viem.isAddress(a))throw new T("INCORRECT_ADDRESS_PROVIDED");let{sourceChainData:p,burnToken:m}=R({sourceChain:r,targetChain:s,asset:i,amount:t},n),y=await b({chain:r,provider:u}).readContract({address:m.address,abi:N,functionName:"allowance",args:[o,p.tokenRouterAddress]}),l=p.domain===1;return y>=t?l?se:ae:l?ve+se:we+ae}var oe=async n=>{let e=await Z(n);return {type:"cctp",estimateGas:r=>ie(e,r),getAssets:()=>$(e),getFees:r=>F(e,r),transferAsset:r=>J(e,r,n),trackTransfer:r=>ne(e,r)}};var Ne=new Map([["cctp",oe]]),Pe=async(n,e)=>{let r=[...Ne].filter(([i])=>!e.includes(i)),s=await Promise.allSettled(r.map(async([i,t])=>[i,await t(n)]));return new Map(lodash.compact(s.map(i=>i.status==="fulfilled"?i.value:void 0)))},D=(n,e,r)=>{let s=e.destinations[r];for(let i of s??[]){let t=n.get(i);if(t)return {bridge:t,type:i}}throw new k};var _n=({environment:n,enabledBridgeServices:e})=>({environment:n,getAssets:async()=>(await Promise.all(Array.from(e).map(([,a])=>a.getAssets()))).reduce((a,p)=>{for(let[m,c]of Object.entries(p)){let y=a[m];if(y)for(let l of c){let f=y.findIndex(({symbol:h})=>h===l.symbol);f===-1?y.push(l):lodash.mergeWith(y[f],l,(h,C)=>{if(lodash.isArray(h))return [...new Set(h.concat(C))]});}else a[m]=c;}return a},{}),getFees:async u=>{let{bridge:a}=D(e,u.asset,u.targetChain.chainId);return a.getFees(u)},estimateGas:async u=>{let{bridge:a}=D(e,u.asset,u.targetChain.chainId);return a.estimateGas(u)},canTransferAsset:(u,a)=>{try{return D(e,u,a),!0}catch{return !1}},transferAsset:async u=>{let{bridge:a}=D(e,u.asset,u.targetChain.chainId);return a.transferAsset(u)},trackTransfer:u=>{let a=e.get(u.bridgeTransfer.type);if(!a)throw new k;return a.trackTransfer(u)}});
7
7
 
8
- exports.BridgeSignatureReason = V;
9
- exports.BridgeType = D;
10
- exports.Environment = G;
11
- exports.ErrorCode = E;
8
+ exports.BridgeSignatureReason = G;
9
+ exports.BridgeType = E;
10
+ exports.Environment = K;
11
+ exports.ErrorCode = B;
12
12
  exports.ErrorReason = w;
13
13
  exports.TokenType = H;
14
- exports.caip2 = O;
15
- exports.createUnifiedBridgeService = Sn;
14
+ exports.caip2 = M;
15
+ exports.createUnifiedBridgeService = _n;
16
+ exports.getEnabledBridgeServices = Pe;
16
17
  //# sourceMappingURL=out.js.map
17
18
  //# sourceMappingURL=index.cjs.map