@avalabs/bridge-unified 2.1.1 → 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.
- package/LICENSE +9 -0
- package/README.md +40 -24
- package/dist/index.cjs +8 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -36
- package/dist/index.d.ts +11 -36
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +7 -3
- package/.turbo/turbo-build.log +0 -22
- package/.turbo/turbo-lint.log +0 -4
- package/.turbo/turbo-test.log +0 -26
- package/CHANGELOG.md +0 -37
- package/jest.config.js +0 -9
- package/src/bridges/cctp/__mocks__/asset.mock.ts +0 -15
- package/src/bridges/cctp/__mocks__/bridge-transfer.mock.ts +0 -48
- package/src/bridges/cctp/__mocks__/chain.mocks.ts +0 -33
- package/src/bridges/cctp/__mocks__/config.mock.ts +0 -45
- package/src/bridges/cctp/abis/erc20.ts +0 -117
- package/src/bridges/cctp/abis/message-transmitter.ts +0 -318
- package/src/bridges/cctp/abis/token-router.ts +0 -843
- package/src/bridges/cctp/factory.test.ts +0 -73
- package/src/bridges/cctp/factory.ts +0 -36
- package/src/bridges/cctp/handlers/estimate-gas.test.ts +0 -110
- package/src/bridges/cctp/handlers/estimate-gas.ts +0 -58
- package/src/bridges/cctp/handlers/get-assets.test.ts +0 -47
- package/src/bridges/cctp/handlers/get-assets.ts +0 -27
- package/src/bridges/cctp/handlers/get-fees.test.ts +0 -61
- package/src/bridges/cctp/handlers/get-fees.ts +0 -26
- package/src/bridges/cctp/handlers/track-transfer.test.ts +0 -779
- package/src/bridges/cctp/handlers/track-transfer.ts +0 -365
- package/src/bridges/cctp/handlers/transfer-asset.test.ts +0 -429
- package/src/bridges/cctp/handlers/transfer-asset.ts +0 -179
- package/src/bridges/cctp/index.ts +0 -1
- package/src/bridges/cctp/types/chain.ts +0 -9
- package/src/bridges/cctp/types/config.ts +0 -20
- package/src/bridges/cctp/utils/build-tx.ts +0 -30
- package/src/bridges/cctp/utils/config.test.ts +0 -49
- package/src/bridges/cctp/utils/config.ts +0 -36
- package/src/bridges/cctp/utils/transfer-data.test.ts +0 -83
- package/src/bridges/cctp/utils/transfer-data.ts +0 -48
- package/src/errors/bridge-error.ts +0 -11
- package/src/errors/bridge-initialization-error.ts +0 -9
- package/src/errors/bridge-unavailable-error.ts +0 -9
- package/src/errors/index.ts +0 -4
- package/src/errors/invalid-params-error.ts +0 -9
- package/src/index.ts +0 -3
- package/src/types/asset.ts +0 -26
- package/src/types/bridge.ts +0 -64
- package/src/types/chain.ts +0 -10
- package/src/types/config.ts +0 -10
- package/src/types/environment.ts +0 -4
- package/src/types/error.ts +0 -19
- package/src/types/index.ts +0 -9
- package/src/types/provider.ts +0 -12
- package/src/types/signer.ts +0 -18
- package/src/types/transfer.ts +0 -35
- package/src/unified-bridge-service.test.ts +0 -209
- package/src/unified-bridge-service.ts +0 -97
- package/src/utils/bridge-types.test.ts +0 -103
- package/src/utils/bridge-types.ts +0 -32
- package/src/utils/caip2.test.ts +0 -44
- package/src/utils/caip2.ts +0 -41
- package/src/utils/client.test.ts +0 -97
- package/src/utils/client.ts +0 -44
- package/src/utils/ensure-config.test.ts +0 -43
- package/src/utils/ensure-config.ts +0 -12
- package/src/utils/index.ts +0 -2
- package/src/utils/network-fee.test.ts +0 -24
- package/src/utils/network-fee.ts +0 -6
- package/src/utils/retry-promise.test.ts +0 -115
- package/src/utils/retry-promise.ts +0 -72
- package/src/utils/wait.test.ts +0 -33
- package/src/utils/wait.ts +0 -4
- package/tsconfig.jest.json +0 -7
- package/tsconfig.json +0 -9
- 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
|
-
|
|
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
|
|
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
|
-
###
|
|
81
|
+
### getEnabledBridgeServices(environment, disabledBridgeTypes);
|
|
77
82
|
|
|
78
|
-
|
|
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[]
|
|
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 =
|
|
9
|
-
exports.BridgeType =
|
|
10
|
-
exports.Environment =
|
|
11
|
-
exports.ErrorCode =
|
|
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 =
|
|
15
|
-
exports.createUnifiedBridgeService =
|
|
14
|
+
exports.caip2 = M;
|
|
15
|
+
exports.createUnifiedBridgeService = _n;
|
|
16
|
+
exports.getEnabledBridgeServices = Pe;
|
|
16
17
|
//# sourceMappingURL=out.js.map
|
|
17
18
|
//# sourceMappingURL=index.cjs.map
|