@instadapp/interop-x 0.0.0-dev.a9cd1d2 → 0.0.0-dev.acc4865
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/.github/workflows/ci.yml +19 -0
- package/dist/package.json +3 -2
- package/dist/src/abi/connectors/index.js +36 -0
- package/dist/src/abi/connectors/v1/aave.js +148 -0
- package/dist/src/abi/connectors/v1/aave_claim.js +4 -0
- package/dist/src/abi/connectors/v1/aave_migrate.js +109 -0
- package/dist/src/abi/connectors/v1/aave_polygon_migrate.js +110 -0
- package/dist/src/abi/connectors/v1/aave_stake.js +4 -0
- package/dist/src/abi/connectors/v1/aave_v1_import.js +54 -0
- package/dist/src/abi/connectors/v1/aave_v2.js +230 -0
- package/dist/src/abi/connectors/v1/aave_v2_import.js +59 -0
- package/dist/src/abi/connectors/v1/authority.js +100 -0
- package/dist/src/abi/connectors/v1/basic.js +136 -0
- package/dist/src/abi/connectors/v1/chi.js +36 -0
- package/dist/src/abi/connectors/v1/comp.js +4 -0
- package/dist/src/abi/connectors/v1/compound.js +4 -0
- package/dist/src/abi/connectors/v1/compoundImport.js +69 -0
- package/dist/src/abi/connectors/v1/compoundImport_v2.js +4 -0
- package/dist/src/abi/connectors/v1/compound_old.js +448 -0
- package/dist/src/abi/connectors/v1/curve.js +140 -0
- package/dist/src/abi/connectors/v1/curve_claim.js +63 -0
- package/dist/src/abi/connectors/v1/curve_gauge.js +158 -0
- package/dist/src/abi/connectors/v1/curve_sbtc.js +140 -0
- package/dist/src/abi/connectors/v1/curve_susd.js +140 -0
- package/dist/src/abi/connectors/v1/curve_three.js +79 -0
- package/dist/src/abi/connectors/v1/curve_y.js +140 -0
- package/dist/src/abi/connectors/v1/dsa_migrate_v1_to_v2.js +4 -0
- package/dist/src/abi/connectors/v1/dydx.js +148 -0
- package/dist/src/abi/connectors/v1/dydx_flash.js +52 -0
- package/dist/src/abi/connectors/v1/fee.js +50 -0
- package/dist/src/abi/connectors/v1/gelato.js +1138 -0
- package/dist/src/abi/connectors/v1/index.js +58 -0
- package/dist/src/abi/connectors/v1/instapool.js +439 -0
- package/dist/src/abi/connectors/v1/instapool_v2.js +126 -0
- package/dist/src/abi/connectors/v1/kyber.js +117 -0
- package/dist/src/abi/connectors/v1/maker.js +480 -0
- package/dist/src/abi/connectors/v1/maker_old.js +300 -0
- package/dist/src/abi/connectors/v1/math.js +43 -0
- package/dist/src/abi/connectors/v1/migrate.js +46 -0
- package/dist/src/abi/connectors/v1/oasis.js +198 -0
- package/dist/src/abi/connectors/v1/oneInch.js +160 -0
- package/dist/src/abi/connectors/v1/polygon_bridge.js +4 -0
- package/dist/src/abi/connectors/v1/refinance.js +4 -0
- package/dist/src/abi/connectors/v1/staking.js +220 -0
- package/dist/src/abi/connectors/v1/swerve.js +179 -0
- package/dist/src/abi/connectors/v1/uniswap.js +297 -0
- package/dist/src/abi/connectors/v2/1INCH-A.js +4 -0
- package/dist/src/abi/connectors/v2/1INCH-B.js +4 -0
- package/dist/src/abi/connectors/v2/AAVE-CLAIM-A.js +4 -0
- package/dist/src/abi/connectors/v2/AAVE-CLAIM-B.js +166 -0
- package/dist/src/abi/connectors/v2/AAVE-STAKE-A.js +4 -0
- package/dist/src/abi/connectors/v2/AAVE-V1-A.js +130 -0
- package/dist/src/abi/connectors/v2/AAVE-V1-IMPORT-A.js +4 -0
- package/dist/src/abi/connectors/v2/AAVE-V2-A.js +230 -0
- package/dist/src/abi/connectors/v2/AAVE-V2-IMPORT-A.js +4 -0
- package/dist/src/abi/connectors/v2/AAVE-V2-IMPORT-B.js +225 -0
- package/dist/src/abi/connectors/v2/AUTHORITY-A.js +100 -0
- package/dist/src/abi/connectors/v2/B-COMPOUND-A.js +4 -0
- package/dist/src/abi/connectors/v2/B-LIQUITY-A.js +4 -0
- package/dist/src/abi/connectors/v2/B-MAKERDAO-A.js +4 -0
- package/dist/src/abi/connectors/v2/BASIC-A.js +136 -0
- package/dist/src/abi/connectors/v2/BASIC-B.js +4 -0
- package/dist/src/abi/connectors/v2/BASIC-C.js +4 -0
- package/dist/src/abi/connectors/v2/COMP-A.js +4 -0
- package/dist/src/abi/connectors/v2/COMPOUND-A.js +4 -0
- package/dist/src/abi/connectors/v2/COMPOUND-IMPORT-A.js +4 -0
- package/dist/src/abi/connectors/v2/COMPOUND-IMPORT-B.js +195 -0
- package/dist/src/abi/connectors/v2/G-UNISWAP-A.js +4 -0
- package/dist/src/abi/connectors/v2/GELATO-AAVE-A.js +4 -0
- package/dist/src/abi/connectors/v2/INST-A.js +4 -0
- package/dist/src/abi/connectors/v2/INST-LM-A.js +4 -0
- package/dist/src/abi/connectors/v2/INST-STAKING-A.js +4 -0
- package/dist/src/abi/connectors/v2/INST-STAKING-B.js +4 -0
- package/dist/src/abi/connectors/v2/INSTAPOOL-A.js +4 -0
- package/dist/src/abi/connectors/v2/LIQUITY-A.js +4 -0
- package/dist/src/abi/connectors/v2/MAKERDAO-A.js +4 -0
- package/dist/src/abi/connectors/v2/MAKERDAO-CLAIM-A.js +136 -0
- package/dist/src/abi/connectors/v2/PARASWAP-A.js +4 -0
- package/dist/src/abi/connectors/v2/POLYGON-BRIDGE-A.js +4 -0
- package/dist/src/abi/connectors/v2/REFINANCE-A.js +4 -0
- package/dist/src/abi/connectors/v2/REFLEXER-A.js +4 -0
- package/dist/src/abi/connectors/v2/STAKE-ERC20-A.js +4 -0
- package/dist/src/abi/connectors/v2/UNISWAP-A.js +297 -0
- package/dist/src/abi/connectors/v2/UNISWAP-V2-A.js +4 -0
- package/dist/src/abi/connectors/v2/UNISWAP-V3-A.js +4 -0
- package/dist/src/abi/connectors/v2/UNISWAP-V3-STAKE-A.js +4 -0
- package/dist/src/abi/connectors/v2/WETH-A.js +4 -0
- package/dist/src/abi/connectors/v2/YEARN-VAULT-A.js +4 -0
- package/dist/src/abi/connectors/v2/index.js +89 -0
- package/dist/src/abi/index.js +2 -0
- package/dist/src/constants/addresses.js +2 -0
- package/dist/src/constants/blockConfirmations.js +8 -0
- package/dist/src/constants/index.js +1 -0
- package/dist/src/db/models/transaction.js +2 -2
- package/dist/src/gnosis/actions/aaveV2/index.js +11 -0
- package/dist/src/gnosis/actions/aaveV2/source.js +62 -0
- package/dist/src/gnosis/actions/aaveV2/target.js +8 -0
- package/dist/src/gnosis/actions/index.js +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/net/protocol/dial/SignatureDialProtocol.js +2 -2
- package/dist/src/tasks/InteropX/ProcessSubmitSubmitEvents.js +168 -0
- package/dist/src/tasks/InteropX/SyncLogSubmitEvents.js +5 -3
- package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +4 -3
- package/dist/src/tasks/index.js +5 -0
- package/dist/src/utils/index.js +57 -30
- package/package.json +3 -2
- package/src/abi/connectors/index.ts +14 -0
- package/src/abi/connectors/v1/aave.ts +147 -0
- package/src/abi/connectors/v1/aave_claim.ts +3 -0
- package/src/abi/connectors/v1/aave_migrate.ts +108 -0
- package/src/abi/connectors/v1/aave_polygon_migrate.ts +109 -0
- package/src/abi/connectors/v1/aave_stake.ts +3 -0
- package/src/abi/connectors/v1/aave_v1_import.ts +53 -0
- package/src/abi/connectors/v1/aave_v2.ts +229 -0
- package/src/abi/connectors/v1/aave_v2_import.ts +58 -0
- package/src/abi/connectors/v1/authority.ts +99 -0
- package/src/abi/connectors/v1/basic.ts +135 -0
- package/src/abi/connectors/v1/chi.ts +35 -0
- package/src/abi/connectors/v1/comp.ts +3 -0
- package/src/abi/connectors/v1/compound.ts +3 -0
- package/src/abi/connectors/v1/compoundImport.ts +68 -0
- package/src/abi/connectors/v1/compoundImport_v2.ts +3 -0
- package/src/abi/connectors/v1/compound_old.ts +447 -0
- package/src/abi/connectors/v1/curve.ts +139 -0
- package/src/abi/connectors/v1/curve_claim.ts +62 -0
- package/src/abi/connectors/v1/curve_gauge.ts +157 -0
- package/src/abi/connectors/v1/curve_sbtc.ts +139 -0
- package/src/abi/connectors/v1/curve_susd.ts +139 -0
- package/src/abi/connectors/v1/curve_three.ts +78 -0
- package/src/abi/connectors/v1/curve_y.ts +139 -0
- package/src/abi/connectors/v1/dsa_migrate_v1_to_v2.ts +3 -0
- package/src/abi/connectors/v1/dydx.ts +147 -0
- package/src/abi/connectors/v1/dydx_flash.ts +51 -0
- package/src/abi/connectors/v1/fee.ts +49 -0
- package/src/abi/connectors/v1/gelato.ts +1137 -0
- package/src/abi/connectors/v1/index.ts +42 -0
- package/src/abi/connectors/v1/instapool.ts +438 -0
- package/src/abi/connectors/v1/instapool_v2.ts +125 -0
- package/src/abi/connectors/v1/kyber.ts +116 -0
- package/src/abi/connectors/v1/maker.ts +479 -0
- package/src/abi/connectors/v1/maker_old.ts +299 -0
- package/src/abi/connectors/v1/math.ts +42 -0
- package/src/abi/connectors/v1/migrate.ts +45 -0
- package/src/abi/connectors/v1/oasis.ts +197 -0
- package/src/abi/connectors/v1/oneInch.ts +159 -0
- package/src/abi/connectors/v1/polygon_bridge.ts +3 -0
- package/src/abi/connectors/v1/refinance.ts +3 -0
- package/src/abi/connectors/v1/staking.ts +219 -0
- package/src/abi/connectors/v1/swerve.ts +178 -0
- package/src/abi/connectors/v1/uniswap.ts +297 -0
- package/src/abi/connectors/v2/1INCH-A.ts +3 -0
- package/src/abi/connectors/v2/1INCH-B.ts +3 -0
- package/src/abi/connectors/v2/AAVE-CLAIM-A.ts +3 -0
- package/src/abi/connectors/v2/AAVE-CLAIM-B.ts +165 -0
- package/src/abi/connectors/v2/AAVE-STAKE-A.ts +3 -0
- package/src/abi/connectors/v2/AAVE-V1-A.ts +130 -0
- package/src/abi/connectors/v2/AAVE-V1-IMPORT-A.ts +3 -0
- package/src/abi/connectors/v2/AAVE-V2-A.ts +229 -0
- package/src/abi/connectors/v2/AAVE-V2-IMPORT-A.ts +3 -0
- package/src/abi/connectors/v2/AAVE-V2-IMPORT-B.ts +224 -0
- package/src/abi/connectors/v2/AUTHORITY-A.ts +99 -0
- package/src/abi/connectors/v2/B-COMPOUND-A.ts +3 -0
- package/src/abi/connectors/v2/B-LIQUITY-A.ts +3 -0
- package/src/abi/connectors/v2/B-MAKERDAO-A.ts +3 -0
- package/src/abi/connectors/v2/BASIC-A.ts +135 -0
- package/src/abi/connectors/v2/BASIC-B.ts +3 -0
- package/src/abi/connectors/v2/BASIC-C.ts +3 -0
- package/src/abi/connectors/v2/COMP-A.ts +3 -0
- package/src/abi/connectors/v2/COMPOUND-A.ts +3 -0
- package/src/abi/connectors/v2/COMPOUND-IMPORT-A.ts +3 -0
- package/src/abi/connectors/v2/COMPOUND-IMPORT-B.ts +194 -0
- package/src/abi/connectors/v2/G-UNISWAP-A.ts +3 -0
- package/src/abi/connectors/v2/GELATO-AAVE-A.ts +3 -0
- package/src/abi/connectors/v2/INST-A.ts +3 -0
- package/src/abi/connectors/v2/INST-LM-A.ts +3 -0
- package/src/abi/connectors/v2/INST-STAKING-A.ts +3 -0
- package/src/abi/connectors/v2/INST-STAKING-B.ts +3 -0
- package/src/abi/connectors/v2/INSTAPOOL-A.ts +3 -0
- package/src/abi/connectors/v2/LIQUITY-A.ts +3 -0
- package/src/abi/connectors/v2/MAKERDAO-A.ts +3 -0
- package/src/abi/connectors/v2/MAKERDAO-CLAIM-A.ts +135 -0
- package/src/abi/connectors/v2/PARASWAP-A.ts +3 -0
- package/src/abi/connectors/v2/POLYGON-BRIDGE-A.ts +3 -0
- package/src/abi/connectors/v2/REFINANCE-A.ts +3 -0
- package/src/abi/connectors/v2/REFLEXER-A.ts +3 -0
- package/src/abi/connectors/v2/STAKE-ERC20-A.ts +3 -0
- package/src/abi/connectors/v2/UNISWAP-A.ts +297 -0
- package/src/abi/connectors/v2/UNISWAP-V2-A.ts +3 -0
- package/src/abi/connectors/v2/UNISWAP-V3-A.ts +3 -0
- package/src/abi/connectors/v2/UNISWAP-V3-STAKE-A.ts +3 -0
- package/src/abi/connectors/v2/WETH-A.ts +3 -0
- package/src/abi/connectors/v2/YEARN-VAULT-A.ts +3 -0
- package/src/abi/connectors/v2/index.ts +87 -0
- package/src/abi/index.ts +6 -4
- package/src/constants/addresses.ts +3 -1
- package/src/constants/blockConfirmations.ts +5 -0
- package/src/constants/index.ts +1 -0
- package/src/db/models/transaction.ts +2 -2
- package/src/gnosis/actions/aaveV2/index.ts +9 -0
- package/src/gnosis/actions/aaveV2/source.ts +104 -0
- package/src/gnosis/actions/aaveV2/target.ts +13 -0
- package/src/gnosis/actions/index.ts +2 -2
- package/src/net/protocol/dial/SignatureDialProtocol.ts +3 -2
- package/src/tasks/InteropX/ProcessSubmitSubmitEvents.ts +252 -0
- package/src/tasks/InteropX/SyncLogSubmitEvents.ts +118 -116
- package/src/tasks/Transactions/SyncTransactionStatusTask.ts +4 -3
- package/src/tasks/index.ts +6 -1
- package/src/utils/index.ts +169 -93
- package/dist/src/gnosis/actions/withdraw/index.js +0 -114
- package/src/gnosis/actions/withdraw/index.ts +0 -155
package/src/utils/index.ts
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
/**
|
2
2
|
* @module util
|
3
3
|
*/
|
4
|
-
import axios from
|
4
|
+
import axios from "axios";
|
5
5
|
import axiosRetry from "axios-retry";
|
6
|
-
import { addresses } from
|
7
|
-
import { ChainId } from
|
8
|
-
import { ethers } from
|
9
|
-
import { GnosisSafe } from
|
10
|
-
import retry from
|
6
|
+
import { addresses } from "@/constants";
|
7
|
+
import { ChainId } from "@/types";
|
8
|
+
import { ethers } from "ethers";
|
9
|
+
import { GnosisSafe } from "@/typechain";
|
10
|
+
import retry from "async-retry";
|
11
|
+
import { connectors } from "@/abi/connectors";
|
11
12
|
|
12
13
|
export const http = axios.create();
|
13
14
|
|
14
15
|
axiosRetry(http, { retries: 3, retryDelay: axiosRetry.exponentialDelay });
|
15
16
|
|
16
|
-
|
17
17
|
export function shortenHash(hash: string, length: number = 4) {
|
18
18
|
if (!hash) return;
|
19
19
|
|
@@ -27,22 +27,25 @@ export function shortenHash(hash: string, length: number = 4) {
|
|
27
27
|
}
|
28
28
|
|
29
29
|
export function short(buffer: Buffer): string {
|
30
|
-
return buffer.toString(
|
30
|
+
return buffer.toString("hex").slice(0, 8) + "...";
|
31
31
|
}
|
32
32
|
|
33
|
-
export const signGnosisSafeTx = async (
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
33
|
+
export const signGnosisSafeTx = async (
|
34
|
+
{
|
35
|
+
to,
|
36
|
+
data = null as any,
|
37
|
+
value = "0",
|
38
|
+
operation = "1",
|
39
|
+
baseGas = "0",
|
40
|
+
gasPrice = "0",
|
41
|
+
gasToken = "0x0000000000000000000000000000000000000000",
|
42
|
+
refundReceiver = "0x0000000000000000000000000000000000000000",
|
43
|
+
safeTxGas = "79668" as string | number,
|
44
|
+
nonce = "0",
|
45
|
+
chainId = 137 as ChainId,
|
46
|
+
},
|
47
|
+
{ signer }
|
48
|
+
) => {
|
46
49
|
const gnosisSafe = addresses[chainId].gnosisSafe;
|
47
50
|
|
48
51
|
const domain = {
|
@@ -52,16 +55,16 @@ export const signGnosisSafeTx = async ({
|
|
52
55
|
|
53
56
|
const types = {
|
54
57
|
SafeTx: [
|
55
|
-
{ type:
|
56
|
-
{ type:
|
57
|
-
{ type:
|
58
|
-
{ type:
|
59
|
-
{ type:
|
60
|
-
{ type:
|
61
|
-
{ type:
|
62
|
-
{ type:
|
63
|
-
{ type:
|
64
|
-
{ type:
|
58
|
+
{ type: "address", name: "to" },
|
59
|
+
{ type: "uint256", name: "value" },
|
60
|
+
{ type: "bytes", name: "data" },
|
61
|
+
{ type: "uint8", name: "operation" },
|
62
|
+
{ type: "uint256", name: "safeTxGas" },
|
63
|
+
{ type: "uint256", name: "baseGas" },
|
64
|
+
{ type: "uint256", name: "gasPrice" },
|
65
|
+
{ type: "address", name: "gasToken" },
|
66
|
+
{ type: "address", name: "refundReceiver" },
|
67
|
+
{ type: "uint256", name: "nonce" },
|
65
68
|
],
|
66
69
|
};
|
67
70
|
|
@@ -79,21 +82,21 @@ export const signGnosisSafeTx = async ({
|
|
79
82
|
value,
|
80
83
|
};
|
81
84
|
|
82
|
-
return await signer._signTypedData(domain, types, message)
|
85
|
+
return await signer._signTypedData(domain, types, message);
|
83
86
|
};
|
84
87
|
|
85
88
|
export const getRpcProviderUrl = (chainId: ChainId) => {
|
86
89
|
switch (chainId) {
|
87
90
|
case 1:
|
88
|
-
return
|
91
|
+
return "https://rpc.ankr.com/eth";
|
89
92
|
case 137:
|
90
|
-
return
|
93
|
+
return "https://rpc.ankr.com/polygon";
|
91
94
|
case 43114:
|
92
|
-
return
|
95
|
+
return "https://rpc.ankr.com/avalanche";
|
93
96
|
default:
|
94
97
|
throw new Error(`Unknown chainId: ${chainId}`);
|
95
98
|
}
|
96
|
-
}
|
99
|
+
};
|
97
100
|
|
98
101
|
export interface Signature {
|
99
102
|
signer: string;
|
@@ -116,36 +119,40 @@ export const buildSignatureBytes = (signatures: Signature[]): string => {
|
|
116
119
|
* Call an async function with a maximum time limit (in milliseconds) for the timeout
|
117
120
|
* Resolved promise for async function call, or an error if time limit reached
|
118
121
|
*/
|
119
|
-
export const asyncCallWithTimeout = async <T>(
|
122
|
+
export const asyncCallWithTimeout = async <T>(
|
123
|
+
asyncPromise: Promise<T>,
|
124
|
+
timeout: number
|
125
|
+
) => {
|
120
126
|
let timeoutHandle;
|
121
127
|
|
122
128
|
const timeoutPromise = new Promise((_resolve, reject) => {
|
123
129
|
timeoutHandle = setTimeout(
|
124
|
-
() => reject(new Error(
|
130
|
+
() => reject(new Error("Async call timeout limit reached")),
|
125
131
|
timeout
|
126
132
|
);
|
127
133
|
});
|
128
134
|
|
129
|
-
return Promise.race([asyncPromise, timeoutPromise]).then(result => {
|
135
|
+
return Promise.race([asyncPromise, timeoutPromise]).then((result) => {
|
130
136
|
clearTimeout(timeoutHandle);
|
131
137
|
return result;
|
132
|
-
}) as Promise<T
|
133
|
-
}
|
134
|
-
|
138
|
+
}) as Promise<T>;
|
139
|
+
};
|
135
140
|
|
136
141
|
type GenerateInteropTransactionHashParam = {
|
137
|
-
actionId: string
|
138
|
-
vnonce: string
|
139
|
-
sourceSender: string
|
140
|
-
sourceChainId: string | number
|
141
|
-
sourceDsaId: string
|
142
|
-
targetChainId: string | number
|
143
|
-
targetDsaId: string
|
142
|
+
actionId: string;
|
143
|
+
vnonce: string;
|
144
|
+
sourceSender: string;
|
145
|
+
sourceChainId: string | number;
|
146
|
+
sourceDsaId: string;
|
147
|
+
targetChainId: string | number;
|
148
|
+
targetDsaId: string;
|
144
149
|
};
|
145
150
|
|
146
|
-
export const generateInteropTransactionHash = (
|
151
|
+
export const generateInteropTransactionHash = (
|
152
|
+
data: GenerateInteropTransactionHashParam
|
153
|
+
) => {
|
147
154
|
return ethers.utils.solidityKeccak256(
|
148
|
-
Array.from(
|
155
|
+
Array.from({ length: 7 }, () => "string"),
|
149
156
|
[
|
150
157
|
String(data.actionId),
|
151
158
|
String(data.vnonce),
|
@@ -154,9 +161,9 @@ export const generateInteropTransactionHash = (data: GenerateInteropTransactionH
|
|
154
161
|
String(data.sourceDsaId),
|
155
162
|
String(data.targetChainId),
|
156
163
|
String(data.targetDsaId),
|
157
|
-
]
|
158
|
-
|
159
|
-
|
164
|
+
]
|
165
|
+
);
|
166
|
+
};
|
160
167
|
|
161
168
|
export class ContractError extends Error {
|
162
169
|
method: string;
|
@@ -164,76 +171,109 @@ export class ContractError extends Error {
|
|
164
171
|
args: any[];
|
165
172
|
}
|
166
173
|
|
167
|
-
export function getContract<TContract extends ethers.Contract>(
|
168
|
-
|
169
|
-
|
174
|
+
export function getContract<TContract extends ethers.Contract>(
|
175
|
+
address: string,
|
176
|
+
contractInterface: ethers.ContractInterface | any,
|
177
|
+
signerOrProvider?: ethers.Signer | ethers.providers.Provider
|
178
|
+
) {
|
179
|
+
if (
|
180
|
+
!ethers.utils.getAddress(address) ||
|
181
|
+
address === ethers.constants.AddressZero
|
182
|
+
) {
|
183
|
+
throw Error(`Invalid 'address' parameter '${address}'.`);
|
170
184
|
}
|
171
185
|
|
172
186
|
const contract = new ethers.Contract(
|
173
187
|
address,
|
174
188
|
contractInterface,
|
175
189
|
signerOrProvider
|
176
|
-
) as TContract
|
190
|
+
) as TContract;
|
177
191
|
|
178
192
|
// Make sure the contract properties is writable
|
179
|
-
const desc = Object.getOwnPropertyDescriptor(contract,
|
193
|
+
const desc = Object.getOwnPropertyDescriptor(contract, "functions");
|
180
194
|
|
181
195
|
if (!desc || desc.writable !== true) {
|
182
|
-
return contract
|
196
|
+
return contract;
|
183
197
|
}
|
184
198
|
|
185
199
|
return new Proxy(contract, {
|
186
200
|
get(target, prop, receiver) {
|
187
201
|
const value = Reflect.get(target, prop, receiver);
|
188
202
|
|
189
|
-
if (
|
203
|
+
if (
|
204
|
+
typeof value === "function" &&
|
205
|
+
(contract.functions.hasOwnProperty(prop) ||
|
206
|
+
["queryFilter"].includes(String(prop)))
|
207
|
+
) {
|
190
208
|
let isConstant = false;
|
191
209
|
|
192
210
|
try {
|
193
|
-
isConstant = contract.interface.getFunction(String(prop)).constant
|
194
|
-
} catch (error) {
|
195
|
-
}
|
211
|
+
isConstant = contract.interface.getFunction(String(prop)).constant;
|
212
|
+
} catch (error) {}
|
196
213
|
|
197
214
|
return async (...args: any[]) => {
|
198
215
|
try {
|
199
|
-
return await retry(
|
216
|
+
return await retry(
|
217
|
+
async () => await value.bind(contract)(...args),
|
218
|
+
{ retries: isConstant ? 1 : 3 }
|
219
|
+
);
|
200
220
|
} catch (error) {
|
201
|
-
const err = new ContractError(
|
221
|
+
const err = new ContractError(
|
222
|
+
`Error calling "${String(prop)}" on "${address}": ${
|
223
|
+
error.reason || error.message
|
224
|
+
}`
|
225
|
+
);
|
202
226
|
|
203
|
-
err.method = String(prop)
|
204
|
-
err.address = address
|
205
|
-
err.args = [...args]
|
227
|
+
err.method = String(prop);
|
228
|
+
err.address = address;
|
229
|
+
err.args = [...args];
|
206
230
|
|
207
|
-
throw err
|
231
|
+
throw err;
|
208
232
|
}
|
209
|
-
}
|
233
|
+
};
|
210
234
|
}
|
211
235
|
|
212
|
-
|
213
|
-
|
236
|
+
if (
|
237
|
+
typeof value === "object" &&
|
238
|
+
[
|
239
|
+
"populateTransaction",
|
240
|
+
"estimateGas",
|
241
|
+
"functions",
|
242
|
+
"callStatic",
|
243
|
+
].includes(String(prop))
|
244
|
+
) {
|
214
245
|
const parentProp = String(prop);
|
215
246
|
|
216
247
|
return new Proxy(value, {
|
217
248
|
get(target, prop, receiver) {
|
218
249
|
const value = Reflect.get(target, prop, receiver);
|
219
250
|
|
220
|
-
if (typeof value ===
|
251
|
+
if (typeof value === "function") {
|
221
252
|
return async (...args: any[]) => {
|
222
253
|
try {
|
223
|
-
return await retry(
|
254
|
+
return await retry(
|
255
|
+
async () => await value.bind(contract)(...args),
|
256
|
+
{ retries: parentProp === "callStatic" ? 3 : 1 }
|
257
|
+
);
|
224
258
|
} catch (error) {
|
225
|
-
const err = new ContractError(
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
259
|
+
const err = new ContractError(
|
260
|
+
`Error calling "${String(
|
261
|
+
prop
|
262
|
+
)}" using "${parentProp}" on "${address}": ${
|
263
|
+
error.reason || error.message
|
264
|
+
}`
|
265
|
+
);
|
266
|
+
|
267
|
+
err.method = String(prop);
|
268
|
+
err.address = address;
|
269
|
+
err.args = [...args];
|
270
|
+
|
271
|
+
throw err;
|
232
272
|
}
|
233
|
-
}
|
273
|
+
};
|
234
274
|
}
|
235
|
-
}
|
236
|
-
})
|
275
|
+
},
|
276
|
+
});
|
237
277
|
}
|
238
278
|
|
239
279
|
return value;
|
@@ -241,7 +281,10 @@ export function getContract<TContract extends ethers.Contract>(address: string,
|
|
241
281
|
});
|
242
282
|
}
|
243
283
|
|
244
|
-
export const generateGnosisTransaction = async (
|
284
|
+
export const generateGnosisTransaction = async (
|
285
|
+
transactionData: any,
|
286
|
+
safeContract: GnosisSafe
|
287
|
+
) => {
|
245
288
|
console.log(transactionData);
|
246
289
|
|
247
290
|
let isExecuted = await safeContract.dataHashes(
|
@@ -257,10 +300,14 @@ export const generateGnosisTransaction = async (transactionData: any, safeContra
|
|
257
300
|
transactionData.refundReceiver,
|
258
301
|
transactionData.nonce
|
259
302
|
)
|
260
|
-
)
|
303
|
+
);
|
261
304
|
|
262
305
|
while (isExecuted == 1) {
|
263
|
-
transactionData.safeTxGas = ethers.BigNumber.from(
|
306
|
+
transactionData.safeTxGas = ethers.BigNumber.from(
|
307
|
+
String(transactionData.safeTxGas)
|
308
|
+
)
|
309
|
+
.add(1)
|
310
|
+
.toString();
|
264
311
|
|
265
312
|
isExecuted = await safeContract.dataHashes(
|
266
313
|
await safeContract.getTransactionHash(
|
@@ -275,15 +322,44 @@ export const generateGnosisTransaction = async (transactionData: any, safeContra
|
|
275
322
|
transactionData.refundReceiver,
|
276
323
|
transactionData.nonce
|
277
324
|
)
|
278
|
-
)
|
325
|
+
);
|
279
326
|
}
|
280
327
|
|
281
|
-
return transactionData
|
282
|
-
}
|
328
|
+
return transactionData;
|
329
|
+
};
|
283
330
|
|
284
331
|
export class LiquidityError extends Error {
|
285
332
|
constructor(message?: string) {
|
286
|
-
super(message ||
|
333
|
+
super(message || "Not enough liquidity");
|
287
334
|
Object.setPrototypeOf(this, new.target.prototype);
|
288
335
|
}
|
289
|
-
}
|
336
|
+
}
|
337
|
+
|
338
|
+
export const encodeConnectorMethod = (params: {
|
339
|
+
connector: string;
|
340
|
+
method: string;
|
341
|
+
args: string[];
|
342
|
+
}) => {
|
343
|
+
const connectorInterface = getInterface(
|
344
|
+
connectors.versions[2][params.connector],
|
345
|
+
params.method
|
346
|
+
);
|
347
|
+
|
348
|
+
if (!connectorInterface)
|
349
|
+
throw new Error(`ConnectorInterface '${params.method}' not found`);
|
350
|
+
|
351
|
+
const iface = new ethers.utils.Interface(connectorInterface);
|
352
|
+
|
353
|
+
return iface.encodeFunctionData(params.method, params.args);
|
354
|
+
};
|
355
|
+
|
356
|
+
const getInterface = (abiItems: any[], method: string) => {
|
357
|
+
const abiItem = abiItems.find((abiItem) => abiItem.name === method);
|
358
|
+
|
359
|
+
if (!abiItem) {
|
360
|
+
console.error(`${method} is an invalid method.`);
|
361
|
+
return;
|
362
|
+
}
|
363
|
+
|
364
|
+
return abiItem;
|
365
|
+
};
|
@@ -1,114 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
// const getBridgeAmounts = async (user: string, tokens: string[], chainId: ChainId) => {
|
4
|
-
// const sourceChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(chainId));
|
5
|
-
// const sourceWallet = new ethers.Wallet(config.privateKey, sourceChainProvider);
|
6
|
-
// const contractAddress = addresses[chainId].interopX;
|
7
|
-
// const contract = getContract<InteropX>(contractAddress, abi.interopX, sourceWallet);
|
8
|
-
// const data = await contract.getBridgeAmounts(user, tokens);
|
9
|
-
// return data.map((item, index) => ({
|
10
|
-
// token: tokens[index],
|
11
|
-
// deposit: item.deposit,
|
12
|
-
// withdraw: item.withdraw,
|
13
|
-
// }))
|
14
|
-
// }
|
15
|
-
async function default_1(transaction, type) {
|
16
|
-
const transactions = [];
|
17
|
-
const logs = [];
|
18
|
-
// if (transaction.actionId !== 'withdraw') {
|
19
|
-
// throw new Error(`Invalid action: ${transaction.actionId}`)
|
20
|
-
// }
|
21
|
-
// if (type !== 'source') {
|
22
|
-
// throw new Error(`[WIP] Type not supported: ${type}`)
|
23
|
-
// }
|
24
|
-
// if (transaction.sourceStatus === 'pending') {
|
25
|
-
// throw Error('Source transaction already processesing')
|
26
|
-
// }
|
27
|
-
// if (transaction.sourceStatus === 'pending') {
|
28
|
-
// throw Error('Source transaction already processed')
|
29
|
-
// }
|
30
|
-
// if (!transaction.requestEvent) {
|
31
|
-
// throw Error('Something went wrong, source transaction has no request event')
|
32
|
-
// }
|
33
|
-
// const { actionId, bridger, position, sourceChainId, targetChainId, metadata } = transaction.requestEvent;
|
34
|
-
// const sourceChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(sourceChainId as ChainId));
|
35
|
-
// const sourceWallet = new ethers.Wallet(config.privateKey, sourceChainProvider);
|
36
|
-
// const contractAddress = addresses[sourceChainId].interopX;
|
37
|
-
// const contract = getContract<InteropX>(contractAddress, abi.interopX, sourceWallet);
|
38
|
-
// const sourceToken = tokens[sourceChainId].find(t => t.address.toLowerCase() === position.withdraw[0].sourceToken.toLowerCase());
|
39
|
-
// if (!sourceToken) {
|
40
|
-
// throw Error('Source token not found')
|
41
|
-
// }
|
42
|
-
// const targetToken = tokens[targetChainId].find(t => t.address.toLowerCase() === position.withdraw[0].targetToken.toLowerCase());
|
43
|
-
// if (!targetToken) {
|
44
|
-
// throw Error('Target token not found')
|
45
|
-
// }
|
46
|
-
// if (!sourceToken.aliases.some(alias => targetToken.aliases.includes(alias))) {
|
47
|
-
// throw Error('Source and target token must be the same')
|
48
|
-
// }
|
49
|
-
// const networks: ChainId[] = [137, 43114];
|
50
|
-
// const networkUserData = {}
|
51
|
-
// for (const network of networks) {
|
52
|
-
// networkUserData[network] = await getBridgeAmounts(bridger, tokens[network].map(t => t.address), network)
|
53
|
-
// }
|
54
|
-
// for (const tokenSymbol of ["dai", "usdc", "usdt", "eth", "wbtc"]) {
|
55
|
-
// let totalDeposit = BigNumber.from(0)
|
56
|
-
// let totalWithdraw = BigNumber.from(0)
|
57
|
-
// for (const network of networks) {
|
58
|
-
// // on avax might we have 2 usdc/usdt tokens
|
59
|
-
// const matchedTokens = tokens[network].filter(t => t.aliases.includes(tokenSymbol));
|
60
|
-
// for (const matchedToken of matchedTokens) {
|
61
|
-
// const data = networkUserData[network].find(t => t.token.toLowerCase() === matchedToken.address.toLowerCase());
|
62
|
-
// if (data) {
|
63
|
-
// totalDeposit = totalDeposit.add(data.deposit)
|
64
|
-
// totalWithdraw = totalWithdraw.add(data.withdraw)
|
65
|
-
// }
|
66
|
-
// }
|
67
|
-
// // on Mainent add weth too
|
68
|
-
// if (tokenSymbol === "eth" && network === 1) {
|
69
|
-
// const weth = tokens[1].find(t => t.symbol === 'WETH');
|
70
|
-
// if (weth) {
|
71
|
-
// const data = networkUserData[1].find(t => t.token.toLowerCase() === weth.address.toLowerCase());
|
72
|
-
// if (data) {
|
73
|
-
// totalDeposit = totalDeposit.add(data.deposit)
|
74
|
-
// totalWithdraw = totalWithdraw.add(data.withdraw)
|
75
|
-
// }
|
76
|
-
// }
|
77
|
-
// }
|
78
|
-
// }
|
79
|
-
// if (totalWithdraw.gt(totalDeposit)) {
|
80
|
-
// throw Error(`if withdraw > deposit, user has debt and we can't process the withdraw and reject it`)
|
81
|
-
// }
|
82
|
-
// if (totalWithdraw.lt(totalDeposit)) {
|
83
|
-
// throw Error('Something went wrong')
|
84
|
-
// }
|
85
|
-
// }
|
86
|
-
// let balance = BigNumber.from(0);
|
87
|
-
// if (position.withdraw[0].sourceToken.toLowerCase() === '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'.toLowerCase()) {
|
88
|
-
// balance = await sourceChainProvider.getBalance(bridger);
|
89
|
-
// } else {
|
90
|
-
// const erc20 = getContract<Erc20>(position.withdraw[0].sourceToken, abi.erc20, sourceChainProvider);
|
91
|
-
// balance = await erc20.balanceOf(addresses[sourceChainId].gnosisSafe);
|
92
|
-
// }
|
93
|
-
// if (balance.lt(position.withdraw[0].amount)) {
|
94
|
-
// throw new LiquidityError()
|
95
|
-
// }
|
96
|
-
// const { data } = await contract.populateTransaction.withdrawRequested(
|
97
|
-
// actionId,
|
98
|
-
// bridger,
|
99
|
-
// position.withdraw[0].sourceToken,
|
100
|
-
// position.withdraw[0].targetToken,
|
101
|
-
// position.withdraw[0].amount,
|
102
|
-
// targetChainId,
|
103
|
-
// transaction.requestTransactionHash,
|
104
|
-
// metadata,
|
105
|
-
// );
|
106
|
-
// transactions.push({
|
107
|
-
// to: contractAddress,
|
108
|
-
// data: data!,
|
109
|
-
// value: '0',
|
110
|
-
// operation: OperationType.Call,
|
111
|
-
// });
|
112
|
-
return { transactions, logs };
|
113
|
-
}
|
114
|
-
exports.default = default_1;
|
@@ -1,155 +0,0 @@
|
|
1
|
-
import abi from "@/abi";
|
2
|
-
import config from "@/config";
|
3
|
-
import { addresses, tokens } from "@/constants";
|
4
|
-
import { Transaction } from "@/db";
|
5
|
-
import { Erc20, InteropX } from "@/typechain";
|
6
|
-
import { ChainId } from "@/types";
|
7
|
-
import { getContract, getRpcProviderUrl, LiquidityError } from "@/utils";
|
8
|
-
import { BigNumber, ethers } from "ethers";
|
9
|
-
import { MetaTransaction, OperationType } from "ethers-multisend";
|
10
|
-
|
11
|
-
|
12
|
-
// const getBridgeAmounts = async (user: string, tokens: string[], chainId: ChainId) => {
|
13
|
-
// const sourceChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(chainId));
|
14
|
-
// const sourceWallet = new ethers.Wallet(config.privateKey, sourceChainProvider);
|
15
|
-
// const contractAddress = addresses[chainId].interopX;
|
16
|
-
// const contract = getContract<InteropX>(contractAddress, abi.interopX, sourceWallet);
|
17
|
-
// const data = await contract.getBridgeAmounts(user, tokens);
|
18
|
-
|
19
|
-
|
20
|
-
// return data.map((item, index) => ({
|
21
|
-
// token: tokens[index],
|
22
|
-
// deposit: item.deposit,
|
23
|
-
// withdraw: item.withdraw,
|
24
|
-
// }))
|
25
|
-
// }
|
26
|
-
|
27
|
-
export default async function (transaction: Transaction, type: 'source' | 'target') {
|
28
|
-
const transactions: MetaTransaction[] = [];
|
29
|
-
const logs: any[] = [];
|
30
|
-
|
31
|
-
// if (transaction.actionId !== 'withdraw') {
|
32
|
-
// throw new Error(`Invalid action: ${transaction.actionId}`)
|
33
|
-
// }
|
34
|
-
|
35
|
-
// if (type !== 'source') {
|
36
|
-
// throw new Error(`[WIP] Type not supported: ${type}`)
|
37
|
-
// }
|
38
|
-
|
39
|
-
// if (transaction.sourceStatus === 'pending') {
|
40
|
-
// throw Error('Source transaction already processesing')
|
41
|
-
// }
|
42
|
-
|
43
|
-
// if (transaction.sourceStatus === 'pending') {
|
44
|
-
// throw Error('Source transaction already processed')
|
45
|
-
// }
|
46
|
-
|
47
|
-
// if (!transaction.requestEvent) {
|
48
|
-
// throw Error('Something went wrong, source transaction has no request event')
|
49
|
-
// }
|
50
|
-
|
51
|
-
// const { actionId, bridger, position, sourceChainId, targetChainId, metadata } = transaction.requestEvent;
|
52
|
-
|
53
|
-
// const sourceChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(sourceChainId as ChainId));
|
54
|
-
// const sourceWallet = new ethers.Wallet(config.privateKey, sourceChainProvider);
|
55
|
-
// const contractAddress = addresses[sourceChainId].interopX;
|
56
|
-
// const contract = getContract<InteropX>(contractAddress, abi.interopX, sourceWallet);
|
57
|
-
|
58
|
-
// const sourceToken = tokens[sourceChainId].find(t => t.address.toLowerCase() === position.withdraw[0].sourceToken.toLowerCase());
|
59
|
-
|
60
|
-
// if (!sourceToken) {
|
61
|
-
// throw Error('Source token not found')
|
62
|
-
// }
|
63
|
-
|
64
|
-
// const targetToken = tokens[targetChainId].find(t => t.address.toLowerCase() === position.withdraw[0].targetToken.toLowerCase());
|
65
|
-
|
66
|
-
// if (!targetToken) {
|
67
|
-
// throw Error('Target token not found')
|
68
|
-
// }
|
69
|
-
|
70
|
-
// if (!sourceToken.aliases.some(alias => targetToken.aliases.includes(alias))) {
|
71
|
-
// throw Error('Source and target token must be the same')
|
72
|
-
// }
|
73
|
-
|
74
|
-
// const networks: ChainId[] = [137, 43114];
|
75
|
-
// const networkUserData = {}
|
76
|
-
// for (const network of networks) {
|
77
|
-
// networkUserData[network] = await getBridgeAmounts(bridger, tokens[network].map(t => t.address), network)
|
78
|
-
// }
|
79
|
-
|
80
|
-
// for (const tokenSymbol of ["dai", "usdc", "usdt", "eth", "wbtc"]) {
|
81
|
-
// let totalDeposit = BigNumber.from(0)
|
82
|
-
// let totalWithdraw = BigNumber.from(0)
|
83
|
-
|
84
|
-
// for (const network of networks) {
|
85
|
-
// // on avax might we have 2 usdc/usdt tokens
|
86
|
-
// const matchedTokens = tokens[network].filter(t => t.aliases.includes(tokenSymbol));
|
87
|
-
|
88
|
-
// for (const matchedToken of matchedTokens) {
|
89
|
-
// const data = networkUserData[network].find(t => t.token.toLowerCase() === matchedToken.address.toLowerCase());
|
90
|
-
|
91
|
-
// if (data) {
|
92
|
-
// totalDeposit = totalDeposit.add(data.deposit)
|
93
|
-
// totalWithdraw = totalWithdraw.add(data.withdraw)
|
94
|
-
// }
|
95
|
-
// }
|
96
|
-
|
97
|
-
// // on Mainent add weth too
|
98
|
-
// if (tokenSymbol === "eth" && network === 1) {
|
99
|
-
// const weth = tokens[1].find(t => t.symbol === 'WETH');
|
100
|
-
|
101
|
-
// if (weth) {
|
102
|
-
// const data = networkUserData[1].find(t => t.token.toLowerCase() === weth.address.toLowerCase());
|
103
|
-
|
104
|
-
// if (data) {
|
105
|
-
// totalDeposit = totalDeposit.add(data.deposit)
|
106
|
-
// totalWithdraw = totalWithdraw.add(data.withdraw)
|
107
|
-
// }
|
108
|
-
// }
|
109
|
-
// }
|
110
|
-
// }
|
111
|
-
|
112
|
-
// if (totalWithdraw.gt(totalDeposit)) {
|
113
|
-
// throw Error(`if withdraw > deposit, user has debt and we can't process the withdraw and reject it`)
|
114
|
-
// }
|
115
|
-
|
116
|
-
// if (totalWithdraw.lt(totalDeposit)) {
|
117
|
-
// throw Error('Something went wrong')
|
118
|
-
// }
|
119
|
-
// }
|
120
|
-
|
121
|
-
// let balance = BigNumber.from(0);
|
122
|
-
|
123
|
-
// if (position.withdraw[0].sourceToken.toLowerCase() === '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'.toLowerCase()) {
|
124
|
-
// balance = await sourceChainProvider.getBalance(bridger);
|
125
|
-
|
126
|
-
// } else {
|
127
|
-
// const erc20 = getContract<Erc20>(position.withdraw[0].sourceToken, abi.erc20, sourceChainProvider);
|
128
|
-
// balance = await erc20.balanceOf(addresses[sourceChainId].gnosisSafe);
|
129
|
-
// }
|
130
|
-
|
131
|
-
// if (balance.lt(position.withdraw[0].amount)) {
|
132
|
-
// throw new LiquidityError()
|
133
|
-
// }
|
134
|
-
|
135
|
-
|
136
|
-
// const { data } = await contract.populateTransaction.withdrawRequested(
|
137
|
-
// actionId,
|
138
|
-
// bridger,
|
139
|
-
// position.withdraw[0].sourceToken,
|
140
|
-
// position.withdraw[0].targetToken,
|
141
|
-
// position.withdraw[0].amount,
|
142
|
-
// targetChainId,
|
143
|
-
// transaction.requestTransactionHash,
|
144
|
-
// metadata,
|
145
|
-
// );
|
146
|
-
|
147
|
-
// transactions.push({
|
148
|
-
// to: contractAddress,
|
149
|
-
// data: data!,
|
150
|
-
// value: '0',
|
151
|
-
// operation: OperationType.Call,
|
152
|
-
// });
|
153
|
-
|
154
|
-
return { transactions, logs }
|
155
|
-
}
|