@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.
Files changed (77) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +40 -24
  3. package/dist/index.cjs +8 -7
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.d.cts +11 -36
  6. package/dist/index.d.ts +11 -36
  7. package/dist/index.js +3 -3
  8. package/dist/index.js.map +1 -1
  9. package/package.json +7 -3
  10. package/.turbo/turbo-build.log +0 -22
  11. package/.turbo/turbo-lint.log +0 -4
  12. package/.turbo/turbo-test.log +0 -26
  13. package/CHANGELOG.md +0 -37
  14. package/jest.config.js +0 -9
  15. package/src/bridges/cctp/__mocks__/asset.mock.ts +0 -15
  16. package/src/bridges/cctp/__mocks__/bridge-transfer.mock.ts +0 -48
  17. package/src/bridges/cctp/__mocks__/chain.mocks.ts +0 -33
  18. package/src/bridges/cctp/__mocks__/config.mock.ts +0 -45
  19. package/src/bridges/cctp/abis/erc20.ts +0 -117
  20. package/src/bridges/cctp/abis/message-transmitter.ts +0 -318
  21. package/src/bridges/cctp/abis/token-router.ts +0 -843
  22. package/src/bridges/cctp/factory.test.ts +0 -73
  23. package/src/bridges/cctp/factory.ts +0 -36
  24. package/src/bridges/cctp/handlers/estimate-gas.test.ts +0 -110
  25. package/src/bridges/cctp/handlers/estimate-gas.ts +0 -58
  26. package/src/bridges/cctp/handlers/get-assets.test.ts +0 -47
  27. package/src/bridges/cctp/handlers/get-assets.ts +0 -27
  28. package/src/bridges/cctp/handlers/get-fees.test.ts +0 -61
  29. package/src/bridges/cctp/handlers/get-fees.ts +0 -26
  30. package/src/bridges/cctp/handlers/track-transfer.test.ts +0 -779
  31. package/src/bridges/cctp/handlers/track-transfer.ts +0 -365
  32. package/src/bridges/cctp/handlers/transfer-asset.test.ts +0 -429
  33. package/src/bridges/cctp/handlers/transfer-asset.ts +0 -179
  34. package/src/bridges/cctp/index.ts +0 -1
  35. package/src/bridges/cctp/types/chain.ts +0 -9
  36. package/src/bridges/cctp/types/config.ts +0 -20
  37. package/src/bridges/cctp/utils/build-tx.ts +0 -30
  38. package/src/bridges/cctp/utils/config.test.ts +0 -49
  39. package/src/bridges/cctp/utils/config.ts +0 -36
  40. package/src/bridges/cctp/utils/transfer-data.test.ts +0 -83
  41. package/src/bridges/cctp/utils/transfer-data.ts +0 -48
  42. package/src/errors/bridge-error.ts +0 -11
  43. package/src/errors/bridge-initialization-error.ts +0 -9
  44. package/src/errors/bridge-unavailable-error.ts +0 -9
  45. package/src/errors/index.ts +0 -4
  46. package/src/errors/invalid-params-error.ts +0 -9
  47. package/src/index.ts +0 -3
  48. package/src/types/asset.ts +0 -26
  49. package/src/types/bridge.ts +0 -64
  50. package/src/types/chain.ts +0 -10
  51. package/src/types/config.ts +0 -10
  52. package/src/types/environment.ts +0 -4
  53. package/src/types/error.ts +0 -19
  54. package/src/types/index.ts +0 -9
  55. package/src/types/provider.ts +0 -12
  56. package/src/types/signer.ts +0 -18
  57. package/src/types/transfer.ts +0 -35
  58. package/src/unified-bridge-service.test.ts +0 -209
  59. package/src/unified-bridge-service.ts +0 -97
  60. package/src/utils/bridge-types.test.ts +0 -103
  61. package/src/utils/bridge-types.ts +0 -32
  62. package/src/utils/caip2.test.ts +0 -44
  63. package/src/utils/caip2.ts +0 -41
  64. package/src/utils/client.test.ts +0 -97
  65. package/src/utils/client.ts +0 -44
  66. package/src/utils/ensure-config.test.ts +0 -43
  67. package/src/utils/ensure-config.ts +0 -12
  68. package/src/utils/index.ts +0 -2
  69. package/src/utils/network-fee.test.ts +0 -24
  70. package/src/utils/network-fee.ts +0 -6
  71. package/src/utils/retry-promise.test.ts +0 -115
  72. package/src/utils/retry-promise.ts +0 -72
  73. package/src/utils/wait.test.ts +0 -33
  74. package/src/utils/wait.ts +0 -4
  75. package/tsconfig.jest.json +0 -7
  76. package/tsconfig.json +0 -9
  77. package/tsup.config.ts +0 -4
@@ -1,43 +0,0 @@
1
- import { BridgeInitializationError } from '../errors';
2
- import { ErrorReason, type BridgeConfig, type BridgeService } from '../types';
3
- import { ensureHasConfig } from './ensure-config';
4
-
5
- describe('ensure-config', () => {
6
- it('throws if it fails to update the config', async () => {
7
- const bridgeMock = {
8
- updateConfig: jest.fn(),
9
- } as unknown as BridgeService;
10
-
11
- await expect(ensureHasConfig(bridgeMock)).rejects.toThrow(
12
- new BridgeInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE),
13
- );
14
- expect(bridgeMock.updateConfig).toHaveBeenCalledTimes(1);
15
- });
16
-
17
- it('updates the config correctly', async () => {
18
- const config = { foo: 'bar' } as unknown as BridgeConfig;
19
- const bridgeMock = {
20
- updateConfig: jest.fn().mockImplementation(() => {
21
- bridgeMock.config = config;
22
- }),
23
- } as unknown as BridgeService;
24
-
25
- expect(bridgeMock.config).toBeUndefined();
26
- await expect(ensureHasConfig(bridgeMock)).resolves.toBeUndefined();
27
- expect(bridgeMock.config).toStrictEqual(config);
28
- expect(bridgeMock.updateConfig).toHaveBeenCalledTimes(1);
29
- });
30
-
31
- it('does nothing if bridge already has config', async () => {
32
- const config = { foo: 'bar' } as unknown as BridgeConfig;
33
- const bridgeMock = {
34
- config,
35
- updateConfig: jest.fn(),
36
- } as unknown as BridgeService;
37
-
38
- expect(bridgeMock.config).toStrictEqual(config);
39
- await expect(ensureHasConfig(bridgeMock)).resolves.toBeUndefined();
40
- expect(bridgeMock.config).toStrictEqual(config);
41
- expect(bridgeMock.updateConfig).not.toHaveBeenCalled();
42
- });
43
- });
@@ -1,12 +0,0 @@
1
- import { BridgeInitializationError } from '../errors';
2
- import { ErrorReason, type BridgeService } from '../types';
3
-
4
- export async function ensureHasConfig(bridge: BridgeService) {
5
- if (!bridge.config) {
6
- await bridge.updateConfig();
7
-
8
- if (!bridge.config) {
9
- throw new BridgeInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE);
10
- }
11
- }
12
- }
@@ -1,2 +0,0 @@
1
- export * from './bridge-types';
2
- export { default as caip2 } from './caip2';
@@ -1,24 +0,0 @@
1
- import type { Transaction, TransactionReceipt } from 'viem';
2
- import { getNetworkFeeEVM } from './network-fee';
3
-
4
- describe('network-fee', () => {
5
- describe('getNetworkFeeEVM', () => {
6
- const transactionMock = {
7
- gasPrice: 50,
8
- } as unknown as Transaction;
9
-
10
- const receiptMock = {
11
- gasUsed: 100,
12
- } as unknown as TransactionReceipt;
13
-
14
- it('returns undefined if gasPrice is missing', () => {
15
- const networkFee = getNetworkFeeEVM({} as Transaction, receiptMock);
16
- expect(networkFee).toBeUndefined();
17
- });
18
-
19
- it('returns the correct network fee', () => {
20
- const networkFee = getNetworkFeeEVM(transactionMock, receiptMock);
21
- expect(networkFee).toEqual(5000n);
22
- });
23
- });
24
- });
@@ -1,6 +0,0 @@
1
- import { type Transaction, type TransactionReceipt } from 'viem';
2
-
3
- // returns the network fee for EVM transaction in wei (10**-18)
4
- export const getNetworkFeeEVM = (transaction: Transaction, receipt: TransactionReceipt) => {
5
- return transaction.gasPrice && BigInt(transaction.gasPrice * receipt.gasUsed);
6
- };
@@ -1,115 +0,0 @@
1
- import { noop } from 'lodash';
2
- import { retryPromise } from './retry-promise';
3
-
4
- describe('retry-promise', () => {
5
- const delay = 5000;
6
- const promiseMock = jest.fn();
7
-
8
- beforeEach(() => {
9
- jest.resetAllMocks();
10
- jest.useFakeTimers();
11
- });
12
-
13
- it('rejects when cancelled', (done) => {
14
- const test = async () => {
15
- promiseMock.mockResolvedValue(undefined);
16
-
17
- const { result, cancel } = retryPromise({ promise: promiseMock, delay });
18
-
19
- for (let i = 1; i <= 5; i++) {
20
- expect(promiseMock).toHaveBeenCalledTimes(i);
21
- await jest.advanceTimersByTimeAsync(delay);
22
- }
23
-
24
- result.catch((err) => {
25
- expect(err).toBe('cancelled');
26
- done();
27
- });
28
-
29
- cancel();
30
- };
31
-
32
- test();
33
- });
34
-
35
- it('delays execution when `startAfter` is provided', (done) => {
36
- const test = async () => {
37
- const response = { foo: 'bar' };
38
- const startAfter = 3000;
39
-
40
- promiseMock
41
- .mockResolvedValueOnce(undefined)
42
- .mockResolvedValueOnce(undefined)
43
- .mockImplementationOnce(async (done) => {
44
- done(response);
45
- });
46
-
47
- const { result } = retryPromise({ promise: promiseMock, delay, startAfter });
48
- expect(promiseMock).not.toHaveBeenCalled();
49
-
50
- // initial delay
51
- await jest.advanceTimersByTimeAsync(startAfter);
52
- expect(promiseMock).toHaveBeenCalledTimes(1);
53
-
54
- // normal execution
55
- await jest.advanceTimersByTimeAsync(delay);
56
- expect(promiseMock).toHaveBeenCalledTimes(2);
57
-
58
- await jest.advanceTimersByTimeAsync(delay);
59
- expect(promiseMock).toHaveBeenCalledTimes(3);
60
-
61
- result.then((res) => {
62
- expect(res).toStrictEqual(response);
63
- done();
64
- });
65
- };
66
-
67
- test();
68
- });
69
-
70
- it('uses exponential backoff after errors and resolves correctly', (done) => {
71
- const test = async () => {
72
- const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(noop);
73
- const response = { foo: 'bar' };
74
-
75
- promiseMock
76
- .mockResolvedValueOnce(undefined)
77
- .mockRejectedValueOnce(new Error('error 1'))
78
- .mockRejectedValueOnce(new Error('error 2'))
79
- .mockRejectedValueOnce(new Error('error 3'))
80
- .mockResolvedValueOnce(undefined)
81
- .mockImplementationOnce(async (done) => {
82
- done(response);
83
- });
84
-
85
- const { result } = retryPromise({ promise: promiseMock, delay });
86
- expect(promiseMock).toHaveBeenCalledTimes(1);
87
-
88
- // error 1
89
- await jest.advanceTimersByTimeAsync(delay);
90
- expect(promiseMock).toHaveBeenCalledTimes(2);
91
- expect(consoleErrorSpy).toHaveBeenNthCalledWith(1, 'error 1');
92
- // error 2
93
- await jest.advanceTimersByTimeAsync(2 * delay);
94
- expect(promiseMock).toHaveBeenCalledTimes(3);
95
- expect(consoleErrorSpy).toHaveBeenNthCalledWith(2, 'error 2');
96
- // error 3
97
- await jest.advanceTimersByTimeAsync(4 * delay);
98
- expect(promiseMock).toHaveBeenCalledTimes(4);
99
- expect(consoleErrorSpy).toHaveBeenNthCalledWith(3, 'error 3');
100
-
101
- await jest.advanceTimersByTimeAsync(8 * delay);
102
- expect(promiseMock).toHaveBeenCalledTimes(5);
103
-
104
- await jest.advanceTimersByTimeAsync(delay);
105
- expect(promiseMock).toHaveBeenCalledTimes(6);
106
-
107
- result.then((res) => {
108
- expect(res).toStrictEqual(response);
109
- done();
110
- });
111
- };
112
-
113
- test();
114
- });
115
- });
@@ -1,72 +0,0 @@
1
- import { wait } from './wait';
2
-
3
- export type Done<T> = (data: T) => void;
4
-
5
- type Params<T> = {
6
- promise: (done: Done<T>) => Promise<unknown>;
7
- delay: number;
8
- startAfter?: number;
9
- };
10
-
11
- export const retryPromise = <T>({ promise, delay, startAfter }: Params<T>) => {
12
- let isRunning = false;
13
- let isCancelled = false;
14
- let errorCount: number = 0;
15
- let resolve: ((data: T) => void) | undefined = undefined;
16
- let reject: ((reason?: string) => void) | undefined = undefined;
17
-
18
- const done = (data: T) => {
19
- if (resolve && isRunning) {
20
- isRunning = false;
21
- resolve(data);
22
- }
23
- };
24
-
25
- const cancel = () => {
26
- isCancelled = true;
27
-
28
- if (reject && isRunning) {
29
- isRunning = false;
30
- reject('cancelled');
31
- }
32
- };
33
-
34
- const result = new Promise<T>((res, rej) => {
35
- isRunning = true;
36
- resolve = res;
37
- reject = rej;
38
-
39
- const execute = async (): Promise<void> => {
40
- if (!isRunning || isCancelled) {
41
- return;
42
- }
43
-
44
- try {
45
- await promise(done);
46
-
47
- if (!isRunning || isCancelled) {
48
- return;
49
- }
50
-
51
- await wait(delay);
52
- } catch (err) {
53
- console.error((err as Error).message);
54
- errorCount += 1;
55
- await wait(2 ** errorCount * delay);
56
- }
57
-
58
- await execute();
59
- };
60
-
61
- if (startAfter) {
62
- setTimeout(execute, startAfter);
63
- } else {
64
- execute();
65
- }
66
- });
67
-
68
- return {
69
- result,
70
- cancel,
71
- };
72
- };
@@ -1,33 +0,0 @@
1
- import { wait } from './wait';
2
-
3
- describe('wait', () => {
4
- const delay = 5000;
5
-
6
- beforeEach(() => {
7
- jest.useFakeTimers();
8
- });
9
-
10
- afterAll(() => {
11
- jest.useRealTimers();
12
- });
13
-
14
- it('delays the execution correctly', (done) => {
15
- const test = async () => {
16
- const testFn = jest.fn();
17
- const promiseFn = async () => {
18
- await wait(delay);
19
- testFn();
20
- };
21
-
22
- const promise = promiseFn();
23
- expect(testFn).not.toHaveBeenCalled();
24
-
25
- await jest.advanceTimersByTimeAsync(delay);
26
-
27
- expect(testFn).toHaveBeenCalledTimes(1);
28
- promise.then(done);
29
- };
30
-
31
- test();
32
- });
33
- });
package/src/utils/wait.ts DELETED
@@ -1,4 +0,0 @@
1
- export const wait = async (time: number) =>
2
- new Promise((res) => {
3
- setTimeout(res, time);
4
- });
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "verbatimModuleSyntax": false,
5
- "esModuleInterop": true
6
- }
7
- }
package/tsconfig.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "@internal/tsconfig/tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "paths": { "abitype": ["./node_modules/abitype"] },
6
- "incremental": false // Need to turn off because of tsup dts
7
- },
8
- "include": ["src", "src/types"]
9
- }
package/tsup.config.ts DELETED
@@ -1,4 +0,0 @@
1
- import { defineConfig } from 'tsup';
2
- import { baseConfig } from '@internal/tsup-config';
3
-
4
- export default defineConfig(baseConfig);