@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.
- package/.turbo/turbo-build.log +10 -10
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +25 -0
- package/CHANGELOG.md +12 -0
- package/README.md +137 -71
- package/dist/index.cjs +11 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +207 -34
- package/dist/index.d.ts +207 -34
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/jest.config.js +9 -0
- package/package.json +15 -9
- package/src/bridges/cctp/__mocks__/asset.mock.ts +15 -0
- package/src/bridges/cctp/__mocks__/bridge-transfer.mock.ts +48 -0
- package/src/bridges/cctp/__mocks__/chain.mocks.ts +31 -0
- package/src/bridges/cctp/__mocks__/config.mock.ts +42 -0
- package/src/bridges/cctp/abis/erc20.ts +117 -0
- package/src/bridges/cctp/abis/message-transmitter.ts +318 -0
- package/src/bridges/cctp/abis/token-router.ts +843 -0
- package/src/bridges/cctp/factory.test.ts +73 -0
- package/src/bridges/cctp/factory.ts +32 -0
- package/src/bridges/cctp/handlers/get-assets.test.ts +47 -0
- package/src/bridges/cctp/handlers/get-assets.ts +27 -0
- package/src/bridges/cctp/handlers/get-fees.test.ts +61 -0
- package/src/bridges/cctp/handlers/get-fees.ts +26 -0
- package/src/bridges/cctp/handlers/track-transfer.test.ts +775 -0
- package/src/bridges/cctp/handlers/track-transfer.ts +365 -0
- package/src/bridges/cctp/handlers/transfer-asset.test.ts +429 -0
- package/src/bridges/cctp/handlers/transfer-asset.ts +179 -0
- package/src/bridges/cctp/index.ts +1 -0
- package/src/bridges/cctp/types/chain.ts +4 -0
- package/src/bridges/cctp/types/config.ts +19 -0
- package/src/bridges/cctp/utils/config.test.ts +49 -0
- package/src/bridges/cctp/utils/config.ts +36 -0
- package/src/bridges/cctp/utils/transfer-data.test.ts +83 -0
- package/src/bridges/cctp/utils/transfer-data.ts +48 -0
- package/src/errors/bridge-error.ts +11 -0
- package/src/errors/bridge-initialization-error.ts +9 -0
- package/src/errors/bridge-unavailable-error.ts +9 -0
- package/src/errors/index.ts +4 -20
- package/src/errors/invalid-params-error.ts +9 -0
- package/src/index.ts +3 -1
- package/src/types/asset.ts +26 -0
- package/src/types/bridge.ts +63 -0
- package/src/types/chain.ts +10 -0
- package/src/types/config.ts +10 -0
- package/src/types/environment.ts +4 -0
- package/src/types/error.ts +19 -0
- package/src/types/index.ts +9 -0
- package/src/types/provider.ts +12 -0
- package/src/types/signer.ts +18 -0
- package/src/types/transfer.ts +35 -0
- package/src/unified-bridge-service.test.ts +208 -0
- package/src/unified-bridge-service.ts +90 -0
- package/src/utils/bridge-types.test.ts +103 -0
- package/src/utils/bridge-types.ts +32 -0
- package/src/utils/caip2.test.ts +44 -0
- package/src/utils/caip2.ts +41 -0
- package/src/utils/client.test.ts +97 -0
- package/src/utils/client.ts +44 -0
- package/src/utils/ensure-config.test.ts +43 -0
- package/src/utils/ensure-config.ts +12 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/network-fee.test.ts +24 -0
- package/src/utils/network-fee.ts +6 -0
- package/src/utils/retry-promise.test.ts +115 -0
- package/src/utils/retry-promise.ts +72 -0
- package/src/utils/wait.test.ts +33 -0
- package/src/utils/wait.ts +4 -0
- package/tsconfig.jest.json +7 -0
- package/tsconfig.json +2 -1
- package/src/bridge-service.ts +0 -18
- package/src/handlers/get-bridge-router.ts +0 -25
- package/src/handlers/submit-and-watch-bridge-transaction.ts +0 -1
- package/src/handlers/submit-bridge-transaction-step.ts +0 -22
package/dist/index.d.cts
CHANGED
|
@@ -1,36 +1,209 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
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:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
2
|
-
|
|
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:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 {
|
|
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
|