@avalabs/bridge-unified 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.turbo/turbo-build.log +10 -10
  2. package/.turbo/turbo-lint.log +1 -1
  3. package/.turbo/turbo-test.log +25 -0
  4. package/CHANGELOG.md +12 -0
  5. package/README.md +137 -71
  6. package/dist/index.cjs +11 -3
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +207 -34
  9. package/dist/index.d.ts +207 -34
  10. package/dist/index.js +4 -3
  11. package/dist/index.js.map +1 -1
  12. package/jest.config.js +9 -0
  13. package/package.json +15 -9
  14. package/src/bridges/cctp/__mocks__/asset.mock.ts +15 -0
  15. package/src/bridges/cctp/__mocks__/bridge-transfer.mock.ts +48 -0
  16. package/src/bridges/cctp/__mocks__/chain.mocks.ts +31 -0
  17. package/src/bridges/cctp/__mocks__/config.mock.ts +42 -0
  18. package/src/bridges/cctp/abis/erc20.ts +117 -0
  19. package/src/bridges/cctp/abis/message-transmitter.ts +318 -0
  20. package/src/bridges/cctp/abis/token-router.ts +843 -0
  21. package/src/bridges/cctp/factory.test.ts +73 -0
  22. package/src/bridges/cctp/factory.ts +32 -0
  23. package/src/bridges/cctp/handlers/get-assets.test.ts +47 -0
  24. package/src/bridges/cctp/handlers/get-assets.ts +27 -0
  25. package/src/bridges/cctp/handlers/get-fees.test.ts +61 -0
  26. package/src/bridges/cctp/handlers/get-fees.ts +26 -0
  27. package/src/bridges/cctp/handlers/track-transfer.test.ts +775 -0
  28. package/src/bridges/cctp/handlers/track-transfer.ts +365 -0
  29. package/src/bridges/cctp/handlers/transfer-asset.test.ts +429 -0
  30. package/src/bridges/cctp/handlers/transfer-asset.ts +179 -0
  31. package/src/bridges/cctp/index.ts +1 -0
  32. package/src/bridges/cctp/types/chain.ts +4 -0
  33. package/src/bridges/cctp/types/config.ts +19 -0
  34. package/src/bridges/cctp/utils/config.test.ts +49 -0
  35. package/src/bridges/cctp/utils/config.ts +36 -0
  36. package/src/bridges/cctp/utils/transfer-data.test.ts +83 -0
  37. package/src/bridges/cctp/utils/transfer-data.ts +48 -0
  38. package/src/errors/bridge-error.ts +11 -0
  39. package/src/errors/bridge-initialization-error.ts +9 -0
  40. package/src/errors/bridge-unavailable-error.ts +9 -0
  41. package/src/errors/index.ts +4 -20
  42. package/src/errors/invalid-params-error.ts +9 -0
  43. package/src/index.ts +3 -1
  44. package/src/types/asset.ts +26 -0
  45. package/src/types/bridge.ts +63 -0
  46. package/src/types/chain.ts +10 -0
  47. package/src/types/config.ts +10 -0
  48. package/src/types/environment.ts +4 -0
  49. package/src/types/error.ts +19 -0
  50. package/src/types/index.ts +9 -0
  51. package/src/types/provider.ts +12 -0
  52. package/src/types/signer.ts +18 -0
  53. package/src/types/transfer.ts +35 -0
  54. package/src/unified-bridge-service.test.ts +208 -0
  55. package/src/unified-bridge-service.ts +90 -0
  56. package/src/utils/bridge-types.test.ts +103 -0
  57. package/src/utils/bridge-types.ts +32 -0
  58. package/src/utils/caip2.test.ts +44 -0
  59. package/src/utils/caip2.ts +41 -0
  60. package/src/utils/client.test.ts +97 -0
  61. package/src/utils/client.ts +44 -0
  62. package/src/utils/ensure-config.test.ts +43 -0
  63. package/src/utils/ensure-config.ts +12 -0
  64. package/src/utils/index.ts +2 -0
  65. package/src/utils/network-fee.test.ts +24 -0
  66. package/src/utils/network-fee.ts +6 -0
  67. package/src/utils/retry-promise.test.ts +115 -0
  68. package/src/utils/retry-promise.ts +72 -0
  69. package/src/utils/wait.test.ts +33 -0
  70. package/src/utils/wait.ts +4 -0
  71. package/tsconfig.jest.json +7 -0
  72. package/tsconfig.json +2 -1
  73. package/src/bridge-service.ts +0 -18
  74. package/src/handlers/get-bridge-router.ts +0 -25
  75. package/src/handlers/submit-and-watch-bridge-transaction.ts +0 -1
  76. package/src/handlers/submit-bridge-transaction-step.ts +0 -22
package/dist/index.d.cts CHANGED
@@ -1,36 +1,209 @@
1
- import * as _internal_bridge_shared from '@internal/bridge-shared';
2
- import { Environment, MaybePromise, NativeToken } from '@internal/bridge-shared';
1
+ import { Address } from 'viem';
2
+
3
+ type Chain = {
4
+ chainName: string;
5
+ chainId: string;
6
+ rpcUrl: string;
7
+ utilityAddresses?: {
8
+ multicall: Address;
9
+ };
10
+ networkToken: Asset;
11
+ };
12
+
13
+ type Token = {
14
+ address: Address;
15
+ name: string;
16
+ symbol: string;
17
+ decimals: number;
18
+ };
19
+ type ChainData = {
20
+ chainId: string;
21
+ domain: number;
22
+ tokenRouterAddress: Address;
23
+ messageTransmitterAddress: Address;
24
+ tokens: Token[];
25
+ minimumConfirmations: number;
26
+ };
27
+ type Config = ChainData[];
28
+
29
+ declare enum Environment {
30
+ PROD = "production",
31
+ TEST = "test"
32
+ }
3
33
 
4
34
  type BridgeServiceConfig = {
5
- environment: `${Environment}`;
6
- getChainNativeAsset: ({ evmChainId }: {
7
- evmChainId: string;
8
- }) => MaybePromise<NativeToken>;
9
- getChainErc20Asset: ({ evmChainId, address }: {
10
- evmChainId: string;
11
- address: string;
12
- }) => MaybePromise<NativeToken>;
13
- };
14
- declare const createBridgeService: (_options: BridgeServiceConfig) => {
15
- getBridgeRouter: (_params: {
16
- fromChainId: string;
17
- toChainId: string;
18
- fromToken: _internal_bridge_shared.Token;
19
- }) => {
20
- fromChainId: string;
21
- toChainId: string;
22
- bridgePlatform: _internal_bridge_shared.BridgePlatform;
23
- fromToken: _internal_bridge_shared.Token;
24
- toToken: _internal_bridge_shared.Token;
25
- }[];
26
- submitBridgeTransactionStep: (_params: {
27
- fromChainId: string;
28
- toChainId: string;
29
- fromAddress: `0x${string}`;
30
- token: _internal_bridge_shared.Token;
31
- amount: string;
32
- }) => Promise<never>;
33
- submitAndWatchBridgeTransaction: () => void;
34
- };
35
-
36
- export { BridgeServiceConfig, createBridgeService };
35
+ environment: Environment;
36
+ disabledBridgeTypes?: BridgeType[];
37
+ };
38
+ type BridgeConfig = Config;
39
+
40
+ type RequestArguments = {
41
+ method: string;
42
+ params?: unknown[] | Record<string | number, unknown>;
43
+ };
44
+ type Provider = {
45
+ /**
46
+ * EIP-1193 compatible request method
47
+ * https://eips.ethereum.org/EIPS/eip-1193#request-1
48
+ */
49
+ request: (args: RequestArguments) => Promise<unknown>;
50
+ };
51
+
52
+ type Hex = `0x${string}`;
53
+ type TransactionRequest = {
54
+ type?: number | null;
55
+ data?: Hex | null;
56
+ from: Hex;
57
+ gas?: bigint;
58
+ nonce?: number;
59
+ to?: Hex | null;
60
+ value?: bigint;
61
+ gasPrice?: bigint | null;
62
+ gasLimit?: bigint | null;
63
+ maxPriorityFeePerGas?: bigint | null;
64
+ maxFeePerGas?: bigint | null;
65
+ };
66
+ type Dispatch = (signedTxHash: Hex) => Promise<Hex>;
67
+ type Signer = (data: TransactionRequest, dispatch: Dispatch) => Promise<Hex>;
68
+
69
+ declare enum ErrorCode {
70
+ BRIDGE_NOT_AVAILABLE = 5001,
71
+ INITIALIZATION_FAILED = 5002,
72
+ INVALID_PARAMS = 5003,
73
+ TIMEOUT = 5004,
74
+ TRANSACTION_REVERTED = 5005
75
+ }
76
+ declare enum ErrorReason {
77
+ UNKNOWN = "UNKNOWN",
78
+ CONFIG_NOT_AVAILABLE = "CONFIG_NOT_AVAILABLE",
79
+ INVALID_PARAMS = "INVALID_PARAMS",
80
+ IDENTICAL_CHAINS_PROVIDED = "IDENTICAL_CHAINS_PROVIDED",
81
+ INCORRECT_AMOUNT_PROVIDED = "INCORRECT_AMOUNT_PROVIDED",
82
+ INCORRECT_ADDRESS_PROVIDED = "INCORRECT_ADDRESS_PROVIDED",
83
+ CHAIN_NOT_SUPPORTED = "CHAIN_NOT_SUPPORTED",
84
+ ASSET_NOT_SUPPORTED = "ASSET_NOT_SUPPORTED",
85
+ CONFIRMATION_COUNT_UNKNOWN = "CONFIRMATION_COUNT_UNKNOWN"
86
+ }
87
+
88
+ type BridgeTransfer = {
89
+ type: BridgeType;
90
+ environment: Environment;
91
+ fromAddress: string;
92
+ toAddress: string;
93
+ amount: bigint;
94
+ amountDecimals: number;
95
+ symbol: string;
96
+ completedAt?: number;
97
+ errorCode?: ErrorCode;
98
+ bridgeFee: bigint;
99
+ sourceChain: Chain;
100
+ sourceStartedAt: number;
101
+ sourceTxHash: string;
102
+ sourceNetworkFee?: bigint;
103
+ sourceConfirmationCount: number;
104
+ requiredSourceConfirmationCount: number;
105
+ targetChain: Chain;
106
+ targetStartedAt?: number;
107
+ targetTxHash?: string;
108
+ targetNetworkFee?: bigint;
109
+ targetConfirmationCount: number;
110
+ requiredTargetConfirmationCount: number;
111
+ startBlockNumber?: bigint;
112
+ metadata?: Record<string, unknown>;
113
+ };
114
+
115
+ declare enum BridgeType {
116
+ CCTP = "cctp"
117
+ }
118
+ type FeeParams = {
119
+ asset: BridgeAsset;
120
+ amount: bigint;
121
+ sourceChain: Chain;
122
+ targetChain: Chain;
123
+ provider?: Provider;
124
+ };
125
+ declare enum BridgeSignatureReason {
126
+ AllowanceApproval = "allowance-approval",
127
+ TokensTransfer = "tokens-transfer"
128
+ }
129
+ type BridgeStepDetails = {
130
+ currentSignature: number;
131
+ requiredSignatures: number;
132
+ currentSignatureReason: BridgeSignatureReason;
133
+ };
134
+ type TransferParams = {
135
+ asset: BridgeAsset;
136
+ amount: bigint;
137
+ fromAddress: string;
138
+ toAddress?: string;
139
+ sourceChain: Chain;
140
+ targetChain: Chain;
141
+ sourceProvider?: Provider;
142
+ targetProvider?: Provider;
143
+ onStepChange?: (stepDetails: BridgeStepDetails) => void;
144
+ sign?: Signer;
145
+ };
146
+ type TrackingParams = {
147
+ bridgeTransfer: BridgeTransfer;
148
+ sourceProvider?: Provider;
149
+ targetProvider?: Provider;
150
+ updateListener: (transfer: BridgeTransfer) => void;
151
+ };
152
+ type BridgeService = {
153
+ type: BridgeType;
154
+ config: BridgeConfig | null;
155
+ ensureHasConfig: () => Promise<void>;
156
+ updateConfig: () => Promise<void>;
157
+ getAssets: () => Promise<ChainAssetMap>;
158
+ getFees: (params: FeeParams) => Promise<AssetFeeMap>;
159
+ transferAsset: (params: TransferParams) => Promise<BridgeTransfer>;
160
+ trackTransfer: (transfer: TrackingParams) => {
161
+ cancel: () => void;
162
+ result: Promise<BridgeTransfer>;
163
+ };
164
+ };
165
+ type BridgeServiceFactory = (environment: Environment) => BridgeService;
166
+
167
+ declare enum TokenType {
168
+ NATIVE = "native",
169
+ ERC20 = "erc20"
170
+ }
171
+ type Asset = {
172
+ type: TokenType;
173
+ address?: Address;
174
+ name: string;
175
+ symbol: string;
176
+ decimals: number;
177
+ };
178
+ type DestinationInfo = Record<string, BridgeType[]>;
179
+ type BridgeAsset = Asset & {
180
+ destinations: DestinationInfo;
181
+ };
182
+ type ChainAssetMap = Record<string, BridgeAsset[]>;
183
+ type AssetFeeMap = Record<Address, bigint>;
184
+
185
+ declare const createUnifiedBridgeService: ({ environment, disabledBridgeTypes }: BridgeServiceConfig) => {
186
+ environment: Environment;
187
+ bridges: Map<BridgeType, BridgeService>;
188
+ init: () => Promise<void>;
189
+ updateConfigs: () => Promise<void>;
190
+ getAssets: () => Promise<ChainAssetMap>;
191
+ getFees: (params: FeeParams) => Promise<AssetFeeMap>;
192
+ canTransferAsset: (asset: BridgeAsset, targetChainId: string) => boolean;
193
+ transferAsset: (params: TransferParams) => Promise<BridgeTransfer>;
194
+ trackTransfer: (params: TrackingParams) => {
195
+ cancel: () => void;
196
+ result: Promise<BridgeTransfer>;
197
+ };
198
+ };
199
+
200
+ type Caip2ChainId = {
201
+ namespace: string;
202
+ reference: string;
203
+ };
204
+ declare const _default: {
205
+ toJSON: (identifier: string) => Caip2ChainId;
206
+ toString: ({ namespace, reference }: Caip2ChainId) => string;
207
+ };
208
+
209
+ export { Asset, AssetFeeMap, BridgeAsset, BridgeConfig, BridgeService, BridgeServiceConfig, BridgeServiceFactory, BridgeSignatureReason, BridgeStepDetails, BridgeTransfer, BridgeType, Chain, ChainAssetMap, DestinationInfo, Dispatch, Environment, ErrorCode, ErrorReason, FeeParams, Hex, Provider, Signer, TokenType, TrackingParams, TransactionRequest, TransferParams, _default as caip2, createUnifiedBridgeService };
package/dist/index.d.ts CHANGED
@@ -1,36 +1,209 @@
1
- import * as _internal_bridge_shared from '@internal/bridge-shared';
2
- import { Environment, MaybePromise, NativeToken } from '@internal/bridge-shared';
1
+ import { Address } from 'viem';
2
+
3
+ type Chain = {
4
+ chainName: string;
5
+ chainId: string;
6
+ rpcUrl: string;
7
+ utilityAddresses?: {
8
+ multicall: Address;
9
+ };
10
+ networkToken: Asset;
11
+ };
12
+
13
+ type Token = {
14
+ address: Address;
15
+ name: string;
16
+ symbol: string;
17
+ decimals: number;
18
+ };
19
+ type ChainData = {
20
+ chainId: string;
21
+ domain: number;
22
+ tokenRouterAddress: Address;
23
+ messageTransmitterAddress: Address;
24
+ tokens: Token[];
25
+ minimumConfirmations: number;
26
+ };
27
+ type Config = ChainData[];
28
+
29
+ declare enum Environment {
30
+ PROD = "production",
31
+ TEST = "test"
32
+ }
3
33
 
4
34
  type BridgeServiceConfig = {
5
- environment: `${Environment}`;
6
- getChainNativeAsset: ({ evmChainId }: {
7
- evmChainId: string;
8
- }) => MaybePromise<NativeToken>;
9
- getChainErc20Asset: ({ evmChainId, address }: {
10
- evmChainId: string;
11
- address: string;
12
- }) => MaybePromise<NativeToken>;
13
- };
14
- declare const createBridgeService: (_options: BridgeServiceConfig) => {
15
- getBridgeRouter: (_params: {
16
- fromChainId: string;
17
- toChainId: string;
18
- fromToken: _internal_bridge_shared.Token;
19
- }) => {
20
- fromChainId: string;
21
- toChainId: string;
22
- bridgePlatform: _internal_bridge_shared.BridgePlatform;
23
- fromToken: _internal_bridge_shared.Token;
24
- toToken: _internal_bridge_shared.Token;
25
- }[];
26
- submitBridgeTransactionStep: (_params: {
27
- fromChainId: string;
28
- toChainId: string;
29
- fromAddress: `0x${string}`;
30
- token: _internal_bridge_shared.Token;
31
- amount: string;
32
- }) => Promise<never>;
33
- submitAndWatchBridgeTransaction: () => void;
34
- };
35
-
36
- export { BridgeServiceConfig, createBridgeService };
35
+ environment: Environment;
36
+ disabledBridgeTypes?: BridgeType[];
37
+ };
38
+ type BridgeConfig = Config;
39
+
40
+ type RequestArguments = {
41
+ method: string;
42
+ params?: unknown[] | Record<string | number, unknown>;
43
+ };
44
+ type Provider = {
45
+ /**
46
+ * EIP-1193 compatible request method
47
+ * https://eips.ethereum.org/EIPS/eip-1193#request-1
48
+ */
49
+ request: (args: RequestArguments) => Promise<unknown>;
50
+ };
51
+
52
+ type Hex = `0x${string}`;
53
+ type TransactionRequest = {
54
+ type?: number | null;
55
+ data?: Hex | null;
56
+ from: Hex;
57
+ gas?: bigint;
58
+ nonce?: number;
59
+ to?: Hex | null;
60
+ value?: bigint;
61
+ gasPrice?: bigint | null;
62
+ gasLimit?: bigint | null;
63
+ maxPriorityFeePerGas?: bigint | null;
64
+ maxFeePerGas?: bigint | null;
65
+ };
66
+ type Dispatch = (signedTxHash: Hex) => Promise<Hex>;
67
+ type Signer = (data: TransactionRequest, dispatch: Dispatch) => Promise<Hex>;
68
+
69
+ declare enum ErrorCode {
70
+ BRIDGE_NOT_AVAILABLE = 5001,
71
+ INITIALIZATION_FAILED = 5002,
72
+ INVALID_PARAMS = 5003,
73
+ TIMEOUT = 5004,
74
+ TRANSACTION_REVERTED = 5005
75
+ }
76
+ declare enum ErrorReason {
77
+ UNKNOWN = "UNKNOWN",
78
+ CONFIG_NOT_AVAILABLE = "CONFIG_NOT_AVAILABLE",
79
+ INVALID_PARAMS = "INVALID_PARAMS",
80
+ IDENTICAL_CHAINS_PROVIDED = "IDENTICAL_CHAINS_PROVIDED",
81
+ INCORRECT_AMOUNT_PROVIDED = "INCORRECT_AMOUNT_PROVIDED",
82
+ INCORRECT_ADDRESS_PROVIDED = "INCORRECT_ADDRESS_PROVIDED",
83
+ CHAIN_NOT_SUPPORTED = "CHAIN_NOT_SUPPORTED",
84
+ ASSET_NOT_SUPPORTED = "ASSET_NOT_SUPPORTED",
85
+ CONFIRMATION_COUNT_UNKNOWN = "CONFIRMATION_COUNT_UNKNOWN"
86
+ }
87
+
88
+ type BridgeTransfer = {
89
+ type: BridgeType;
90
+ environment: Environment;
91
+ fromAddress: string;
92
+ toAddress: string;
93
+ amount: bigint;
94
+ amountDecimals: number;
95
+ symbol: string;
96
+ completedAt?: number;
97
+ errorCode?: ErrorCode;
98
+ bridgeFee: bigint;
99
+ sourceChain: Chain;
100
+ sourceStartedAt: number;
101
+ sourceTxHash: string;
102
+ sourceNetworkFee?: bigint;
103
+ sourceConfirmationCount: number;
104
+ requiredSourceConfirmationCount: number;
105
+ targetChain: Chain;
106
+ targetStartedAt?: number;
107
+ targetTxHash?: string;
108
+ targetNetworkFee?: bigint;
109
+ targetConfirmationCount: number;
110
+ requiredTargetConfirmationCount: number;
111
+ startBlockNumber?: bigint;
112
+ metadata?: Record<string, unknown>;
113
+ };
114
+
115
+ declare enum BridgeType {
116
+ CCTP = "cctp"
117
+ }
118
+ type FeeParams = {
119
+ asset: BridgeAsset;
120
+ amount: bigint;
121
+ sourceChain: Chain;
122
+ targetChain: Chain;
123
+ provider?: Provider;
124
+ };
125
+ declare enum BridgeSignatureReason {
126
+ AllowanceApproval = "allowance-approval",
127
+ TokensTransfer = "tokens-transfer"
128
+ }
129
+ type BridgeStepDetails = {
130
+ currentSignature: number;
131
+ requiredSignatures: number;
132
+ currentSignatureReason: BridgeSignatureReason;
133
+ };
134
+ type TransferParams = {
135
+ asset: BridgeAsset;
136
+ amount: bigint;
137
+ fromAddress: string;
138
+ toAddress?: string;
139
+ sourceChain: Chain;
140
+ targetChain: Chain;
141
+ sourceProvider?: Provider;
142
+ targetProvider?: Provider;
143
+ onStepChange?: (stepDetails: BridgeStepDetails) => void;
144
+ sign?: Signer;
145
+ };
146
+ type TrackingParams = {
147
+ bridgeTransfer: BridgeTransfer;
148
+ sourceProvider?: Provider;
149
+ targetProvider?: Provider;
150
+ updateListener: (transfer: BridgeTransfer) => void;
151
+ };
152
+ type BridgeService = {
153
+ type: BridgeType;
154
+ config: BridgeConfig | null;
155
+ ensureHasConfig: () => Promise<void>;
156
+ updateConfig: () => Promise<void>;
157
+ getAssets: () => Promise<ChainAssetMap>;
158
+ getFees: (params: FeeParams) => Promise<AssetFeeMap>;
159
+ transferAsset: (params: TransferParams) => Promise<BridgeTransfer>;
160
+ trackTransfer: (transfer: TrackingParams) => {
161
+ cancel: () => void;
162
+ result: Promise<BridgeTransfer>;
163
+ };
164
+ };
165
+ type BridgeServiceFactory = (environment: Environment) => BridgeService;
166
+
167
+ declare enum TokenType {
168
+ NATIVE = "native",
169
+ ERC20 = "erc20"
170
+ }
171
+ type Asset = {
172
+ type: TokenType;
173
+ address?: Address;
174
+ name: string;
175
+ symbol: string;
176
+ decimals: number;
177
+ };
178
+ type DestinationInfo = Record<string, BridgeType[]>;
179
+ type BridgeAsset = Asset & {
180
+ destinations: DestinationInfo;
181
+ };
182
+ type ChainAssetMap = Record<string, BridgeAsset[]>;
183
+ type AssetFeeMap = Record<Address, bigint>;
184
+
185
+ declare const createUnifiedBridgeService: ({ environment, disabledBridgeTypes }: BridgeServiceConfig) => {
186
+ environment: Environment;
187
+ bridges: Map<BridgeType, BridgeService>;
188
+ init: () => Promise<void>;
189
+ updateConfigs: () => Promise<void>;
190
+ getAssets: () => Promise<ChainAssetMap>;
191
+ getFees: (params: FeeParams) => Promise<AssetFeeMap>;
192
+ canTransferAsset: (asset: BridgeAsset, targetChainId: string) => boolean;
193
+ transferAsset: (params: TransferParams) => Promise<BridgeTransfer>;
194
+ trackTransfer: (params: TrackingParams) => {
195
+ cancel: () => void;
196
+ result: Promise<BridgeTransfer>;
197
+ };
198
+ };
199
+
200
+ type Caip2ChainId = {
201
+ namespace: string;
202
+ reference: string;
203
+ };
204
+ declare const _default: {
205
+ toJSON: (identifier: string) => Caip2ChainId;
206
+ toString: ({ namespace, reference }: Caip2ChainId) => string;
207
+ };
208
+
209
+ export { Asset, AssetFeeMap, BridgeAsset, BridgeConfig, BridgeService, BridgeServiceConfig, BridgeServiceFactory, BridgeSignatureReason, BridgeStepDetails, BridgeTransfer, BridgeType, Chain, ChainAssetMap, DestinationInfo, Dispatch, Environment, ErrorCode, ErrorReason, FeeParams, Hex, Provider, Signer, TokenType, TrackingParams, TransactionRequest, TransferParams, _default as caip2, createUnifiedBridgeService };
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
- import 'viem';
1
+ import { custom, http, createWalletClient, publicActions, isAddress, encodeFunctionData, decodeEventLog } from 'viem';
2
+ import { mergeWith, isArray } from 'lodash';
2
3
 
3
- var t=class extends Error{constructor(a,m){super(a);this.code=m;this.code=m;}},e=class extends t{constructor(o="Not implemented"){super(o,5001),this.name="NotImplementedError";}};var n=async r=>{throw new e};var i=r=>{throw new e};var s=()=>{};var v=r=>({getBridgeRouter:i,submitBridgeTransactionStep:n,submitAndWatchBridgeTransaction:s});
4
+ var H=(r=>(r.NATIVE="native",r.ERC20="erc20",r))(H||{});var E=(t=>(t.CCTP="cctp",t))(E||{}),V=(r=>(r.AllowanceApproval="allowance-approval",r.TokensTransfer="tokens-transfer",r))(V||{});var K=(r=>(r.PROD="production",r.TEST="test",r))(K||{});var R=(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))(R||{}),w=(i=>(i.UNKNOWN="UNKNOWN",i.CONFIG_NOT_AVAILABLE="CONFIG_NOT_AVAILABLE",i.INVALID_PARAMS="INVALID_PARAMS",i.IDENTICAL_CHAINS_PROVIDED="IDENTICAL_CHAINS_PROVIDED",i.INCORRECT_AMOUNT_PROVIDED="INCORRECT_AMOUNT_PROVIDED",i.INCORRECT_ADDRESS_PROVIDED="INCORRECT_ADDRESS_PROVIDED",i.CHAIN_NOT_SUPPORTED="CHAIN_NOT_SUPPORTED",i.ASSET_NOT_SUPPORTED="ASSET_NOT_SUPPORTED",i.CONFIRMATION_COUNT_UNKNOWN="CONFIRMATION_COUNT_UNKNOWN",i))(w||{});var N=class extends Error{constructor(r,a,p){super(r);this.code=a;this.details=p;}};var P=class extends N{constructor(t="UNKNOWN",r){super(t,5001,r),this.name="BridgeUnavailableError";}};var B=class extends N{constructor(t="UNKNOWN",r){super(t,5002,r),this.name="BridgeInitializationError";}};var T=class extends N{constructor(t="INVALID_PARAMS",r){super(t,5003,r),this.name="InvalidParamsError";}};var ae={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"},q=async e=>{try{return (await(await fetch(ae[e])).json()).map(a=>({...a,chainId:`eip155:${a.chainId}`}))}catch(t){throw new B("CONFIG_NOT_AVAILABLE",`Error while fetching CCTP config: ${t.message}`)}},M=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(p=>({...p,type:"erc20",destinations:t.reduce((n,o)=>(a.chainId!==o&&(n[o]||(n[o]=[]),n[o]?.push("cctp")),n),{})})),r),{})}var se="^[-a-z0-9]{3,8}$",ie="^[-_a-zA-Z0-9]{1,50}$",G=":",oe=e=>{let[t,r]=e.split(G);if(!t||!r)throw new Error("Invalid identifier provided.");if(!new RegExp(se).test(t))throw new Error("Invalid namespace provided.");if(!new RegExp(ie).test(r))throw new Error("Invalid reference provided.");return {namespace:t,reference:r}},pe=({namespace:e,reference:t})=>`${e}${G}${t}`,S={toJSON:oe,toString:pe};var le=e=>{let{reference:t}=S.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}}}}},I=({chain:e,provider:t})=>{let r=le(e),a=t?custom(t):http(e.rpcUrl,{batch:!0,retryCount:0});return createWalletClient({chain:r,transport:a}).extend(publicActions)};var x=[{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},p)=>{if(e.chainId===t.chainId)throw new T("IDENTICAL_CHAINS_PROVIDED");if(r<=0n)throw new T("INCORRECT_AMOUNT_PROVIDED","Amount must be greater than zero");let n=p.find(i=>i.chainId===e.chainId);if(!n)throw new T("CHAIN_NOT_SUPPORTED",`Not supported on source chain "${e.chainId}"`);let o=p.find(i=>i.chainId===t.chainId);if(!o)throw new T("CHAIN_NOT_SUPPORTED",`Not supported on target chain "${t.chainId}"`);let d=n.tokens.find(i=>i.symbol===a.symbol),y=o.tokens.find(i=>i.symbol===a.symbol);if(!d||!y)throw new T("ASSET_NOT_SUPPORTED");return {sourceChainData:n,targetChainData:o,burnToken:d,mintToken:y}};async function W(e,t){await e.ensureHasConfig();let{sourceChain:r,targetChain:a,asset:p,amount:n,provider:o}=t,{sourceChainData:d,targetChainData:y,burnToken:i}=_({sourceChain:r,targetChain:a,asset:p,amount:n},e.config),u=await I({chain:r,provider:o}).readContract({address:d.tokenRouterAddress,abi:x,functionName:"calculateFee",args:[n,y.domain]});return {[i.address]:u}}var D=[{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"}];var ye=async(e,t)=>{let{sourceChain:r,targetChain:a,asset:p,amount:n,fromAddress:o,toAddress:d,sourceProvider:y,onStepChange:i,sign:s}=t,u=d??o;if(!isAddress(o)||!isAddress(u))throw new T("INCORRECT_ADDRESS_PROVIDED");let{sourceChainData:c,targetChainData:f,burnToken:l}=_({sourceChain:r,targetChain:a,asset:p,amount:n},e.config),m=I({chain:r,provider:y}),b=await m.readContract({address:l.address,abi:D,functionName:"allowance",args:[o,c.tokenRouterAddress]})<n,h=b?2:1;if(b)if(i?.({currentSignature:1,currentSignatureReason:"allowance-approval",requiredSignatures:h}),s){let g=encodeFunctionData({abi:D,functionName:"approve",args:[c.tokenRouterAddress,n]}),A=await s({from:o,to:l.address,data:g},k=>m.sendRawTransaction({serializedTransaction:k}));await m.waitForTransactionReceipt({hash:A,pollingInterval:1e3});}else {let{request:g}=await m.simulateContract({account:o,address:l.address,abi:D,functionName:"approve",args:[c.tokenRouterAddress,n]}),A=await m.writeContract(g);await m.waitForTransactionReceipt({hash:A,pollingInterval:1e3});}if(i?.({currentSignature:b?2:1,currentSignatureReason:"tokens-transfer",requiredSignatures:h}),s){let g=encodeFunctionData({abi:x,functionName:"transferTokens",args:[n,f.domain,u,l.address]});return s({from:o,to:c.tokenRouterAddress,data:g},A=>m.sendRawTransaction({serializedTransaction:A}))}else {let{request:g}=await m.simulateContract({account:o,address:c.tokenRouterAddress,abi:x,functionName:"transferTokens",args:[n,f.domain,u,l.address]});return m.writeContract(g)}},fe=async e=>{try{return await e.getBlockNumber()}catch{return}};async function J(e,t,r){await e.ensureHasConfig();let{minimumConfirmations:a}=e.config.find(u=>u.chainId===t.sourceChain.chainId)??{},{minimumConfirmations:p}=e.config.find(u=>u.chainId===t.targetChain.chainId)??{};if(!a||!p)throw new T("CONFIRMATION_COUNT_UNKNOWN");let n=await e.getFees({...t,provider:t.sourceProvider}),o=(t.asset.address&&n[t.asset.address])??0n,d=await ye(e,t),y=Date.now(),i=I({chain:t.targetChain,provider:t.targetProvider}),s=await fe(i);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:o,sourceChain:t.sourceChain,sourceStartedAt:y,sourceTxHash:d,sourceConfirmationCount:0,requiredSourceConfirmationCount:a,targetChain:t.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:p,startBlockNumber:s}}async function Z(e){if(!e.config&&(await e.updateConfig(),!e.config))throw new B("CONFIG_NOT_AVAILABLE")}var O=(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,p=!1,n=0,o,d,y=u=>{o&&a&&(a=!1,o(u));},i=()=>{p=!0,d&&a&&(a=!1,d("cancelled"));};return {result:new Promise((u,c)=>{a=!0,o=u,d=c;let f=async()=>{if(!(!a||p)){try{if(await e(y),!a||p)return;await L(t);}catch(l){console.error(l.message),n+=1,await L(2**n*t);}await f();}};r?setTimeout(f,r):f();}),cancel:i}};var Q=1e3*60*60*3,Y=1024n,ee=5e3,C=(e,t,r)=>{Object.assign(e,Object.fromEntries(Object.entries(t).filter(([,a])=>a!==void 0))),r({...e});},Te=async(e,t)=>{let{sourceProvider:r,targetProvider:a,updateListener:p,bridgeTransfer:n}=t,o=I({chain:n.sourceChain,provider:r}),d=e.find(c=>c.chainId===n.sourceChain.chainId),y=I({chain:n.targetChain,provider:a}),i=e.find(c=>c.chainId===n.targetChain.chainId),s={...n};if(!d||!i)throw new T("CHAIN_NOT_SUPPORTED");return U({promise:async c=>{if(s.completedAt||s.metadata?.nonce)return c(s);if(s.sourceStartedAt+Q<=Date.now())return C(s,{completedAt:Date.now(),errorCode:5004},p),c(s);let f=await o.getTransactionReceipt({hash:s.sourceTxHash});if(!s.sourceNetworkFee){let A=await o.getTransaction({hash:s.sourceTxHash}),k=O(A,f);k&&C(s,{sourceNetworkFee:k},p);}if(f.status==="reverted")return C(s,{completedAt:Date.now(),errorCode:5005},p),c(s);let l=await o.getTransactionConfirmations({hash:s.sourceTxHash}),m=l>s.sourceConfirmationCount,v=l>=s.requiredSourceConfirmationCount;if(m){let A={};A.sourceConfirmationCount=Number(l),v||(A.startBlockNumber=await y.getBlockNumber()),C(s,A,p);}if(!v)return;s.startBlockNumber||C(s,{startBlockNumber:await y.getBlockNumber()},p);let b=f.logs.find(A=>A.address===d.tokenRouterAddress?decodeEventLog({abi:x,...A}).eventName==="TransferTokens":!1);if(!b)throw new T("INVALID_PARAMS",`unable to find a TransferTokens event in source transaction "${s.sourceTxHash}"`);let g=decodeEventLog({abi:x,eventName:"TransferTokens",...b}).args.nonce;return C(s,{targetStartedAt:Date.now(),metadata:{nonce:g}},p),c(s)},delay:M(d.chainId),startAfter:ee})},ge=async(e,t)=>{let{targetProvider:r,updateListener:a,bridgeTransfer:p}=t,n={...p};if(!p.completedAt&&!p.metadata?.nonce)throw new T("INVALID_PARAMS","nonce is missing");if(!p.startBlockNumber)throw new T("INVALID_PARAMS","startBlockNumber is missing");let o=I({chain:p.targetChain,provider:r}),d=e.find(i=>i.chainId===p.targetChain.chainId);if(!d)throw new T("INVALID_PARAMS",`unknown target chain "${p.targetChain.chainId}"`);return U({promise:async i=>{if(n.completedAt)return i(n);if(!n.startBlockNumber)return C(n,{completedAt:Date.now(),errorCode:5003},a),i(n);if(n.sourceStartedAt+Q<=Date.now())return C(n,{completedAt:Date.now(),errorCode:5004},a),i(n);if(!n.targetTxHash){let l=await o.getBlockNumber(),m=n.startBlockNumber-Y,v=m>=0n?m:"earliest",b=n.startBlockNumber+Y,h=b<l?b:"latest",g=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:n.metadata.nonce},fromBlock:v,toBlock:h});if(g[0]?.transactionHash)C(n,{targetTxHash:g[0].transactionHash},a);else {C(n,{startBlockNumber:l},a);return}}let s=await o.getTransactionReceipt({hash:n.targetTxHash});if(!n.targetNetworkFee){let l=await o.getTransaction({hash:n.targetTxHash}),m=O(l,s);m&&C(n,{targetNetworkFee:m},a);}if(s.status==="reverted")return C(n,{completedAt:Date.now(),errorCode:5005},a),i(n);let u=await o.getTransactionConfirmations({hash:n.targetTxHash}),c=u>n.targetConfirmationCount,f=u>=n.requiredTargetConfirmationCount;if(c&&C(n,{targetConfirmationCount:Number(u)},a),!!f)return C(n,{completedAt:Date.now()},a),i(n)},delay:M(d.chainId),startAfter:ee})};function te(e,t){let r,a=()=>{r?.();};return {result:(async()=>{await e.ensureHasConfig();let{sourceProvider:n,targetProvider:o,updateListener:d,bridgeTransfer:y}=t,{result:i,cancel:s}=await Te(e.config,{sourceProvider:n,targetProvider:o,updateListener:d,bridgeTransfer:y});r=s;let u=await i,{result:c,cancel:f}=await ge(e.config,{sourceProvider:n,targetProvider:o,updateListener:d,bridgeTransfer:u});return r=f,c})(),cancel:a}}var ne=e=>({type:"cctp",config:null,updateConfig:async function(){this.config=await q(e);},ensureHasConfig:async function(){return Z(this)},getAssets:async function(){return $(this)},getFees:async function(t){return W(this,t)},transferAsset:async function(t){return J(this,t,e)},trackTransfer:function(t){return te(this,t)}});var Ae=new Map([["cctp",ne]]),re=(e,t)=>new Map([...Ae].filter(([r])=>!t?.includes(r)).map(([r,a])=>[r,a(e)])),F=(e,t,r)=>{let a=t.destinations[r]?.find(p=>e.has(p));if(!a)throw new P;return {type:a,bridge:e.get(a)}};var dn=({environment:e,disabledBridgeTypes:t})=>{let r=re(e,t),a=async()=>{await Promise.allSettled(Array.from(r).map(([,s])=>s.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,c)=>{for(let[f,l]of Object.entries(c)){let m=u[f];if(m)for(let v of l){let b=m.findIndex(({symbol:h})=>h===v.symbol);b===-1?m.push(v):mergeWith(m[b],v,(h,g)=>{if(isArray(h))return [...new Set(h.concat(g))]});}else u[f]=l;}return u},{}),getFees:async s=>{let{bridge:u}=F(r,s.asset,s.targetChain.chainId);return u.getFees(s)},canTransferAsset:(s,u)=>{try{return F(r,s,u),!0}catch{return !1}},transferAsset:async s=>{let{bridge:u}=F(r,s.asset,s.targetChain.chainId);return u.transferAsset(s)},trackTransfer:s=>{let u=r.get(s.bridgeTransfer.type);if(!u)throw new P;return u.trackTransfer(s)}}};
4
5
 
5
- export { v as createBridgeService };
6
+ export { V as BridgeSignatureReason, E as BridgeType, K as Environment, R as ErrorCode, w as ErrorReason, H as TokenType, S as caip2, dn as createUnifiedBridgeService };
6
7
  //# sourceMappingURL=out.js.map
7
8
  //# sourceMappingURL=index.js.map