@instadapp/interop-x 0.0.0-dev.7738003 → 0.0.0-dev.7913ed9
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/dist/package.json +4 -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/gnosis/actions/aaveV2/index.js +11 -0
- package/dist/src/gnosis/actions/aaveV2/source.js +73 -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 +180 -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 +58 -30
- package/package.json +4 -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/gnosis/actions/aaveV2/index.ts +9 -0
- package/src/gnosis/actions/aaveV2/source.ts +118 -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 +270 -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,20 @@
|
|
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";
|
12
|
+
import Web3EthAbi from "web3-eth-abi";
|
11
13
|
|
12
14
|
export const http = axios.create();
|
13
15
|
|
14
16
|
axiosRetry(http, { retries: 3, retryDelay: axiosRetry.exponentialDelay });
|
15
17
|
|
16
|
-
|
17
18
|
export function shortenHash(hash: string, length: number = 4) {
|
18
19
|
if (!hash) return;
|
19
20
|
|
@@ -27,22 +28,25 @@ export function shortenHash(hash: string, length: number = 4) {
|
|
27
28
|
}
|
28
29
|
|
29
30
|
export function short(buffer: Buffer): string {
|
30
|
-
return buffer.toString(
|
31
|
+
return buffer.toString("hex").slice(0, 8) + "...";
|
31
32
|
}
|
32
33
|
|
33
|
-
export const signGnosisSafeTx = async (
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
34
|
+
export const signGnosisSafeTx = async (
|
35
|
+
{
|
36
|
+
to,
|
37
|
+
data = null as any,
|
38
|
+
value = "0",
|
39
|
+
operation = "1",
|
40
|
+
baseGas = "0",
|
41
|
+
gasPrice = "0",
|
42
|
+
gasToken = "0x0000000000000000000000000000000000000000",
|
43
|
+
refundReceiver = "0x0000000000000000000000000000000000000000",
|
44
|
+
safeTxGas = "79668" as string | number,
|
45
|
+
nonce = "0",
|
46
|
+
chainId = 137 as ChainId,
|
47
|
+
},
|
48
|
+
{ signer }
|
49
|
+
) => {
|
46
50
|
const gnosisSafe = addresses[chainId].gnosisSafe;
|
47
51
|
|
48
52
|
const domain = {
|
@@ -52,16 +56,16 @@ export const signGnosisSafeTx = async ({
|
|
52
56
|
|
53
57
|
const types = {
|
54
58
|
SafeTx: [
|
55
|
-
{ type:
|
56
|
-
{ type:
|
57
|
-
{ type:
|
58
|
-
{ type:
|
59
|
-
{ type:
|
60
|
-
{ type:
|
61
|
-
{ type:
|
62
|
-
{ type:
|
63
|
-
{ type:
|
64
|
-
{ type:
|
59
|
+
{ type: "address", name: "to" },
|
60
|
+
{ type: "uint256", name: "value" },
|
61
|
+
{ type: "bytes", name: "data" },
|
62
|
+
{ type: "uint8", name: "operation" },
|
63
|
+
{ type: "uint256", name: "safeTxGas" },
|
64
|
+
{ type: "uint256", name: "baseGas" },
|
65
|
+
{ type: "uint256", name: "gasPrice" },
|
66
|
+
{ type: "address", name: "gasToken" },
|
67
|
+
{ type: "address", name: "refundReceiver" },
|
68
|
+
{ type: "uint256", name: "nonce" },
|
65
69
|
],
|
66
70
|
};
|
67
71
|
|
@@ -79,21 +83,21 @@ export const signGnosisSafeTx = async ({
|
|
79
83
|
value,
|
80
84
|
};
|
81
85
|
|
82
|
-
return await signer._signTypedData(domain, types, message)
|
86
|
+
return await signer._signTypedData(domain, types, message);
|
83
87
|
};
|
84
88
|
|
85
89
|
export const getRpcProviderUrl = (chainId: ChainId) => {
|
86
90
|
switch (chainId) {
|
87
91
|
case 1:
|
88
|
-
return
|
92
|
+
return "https://rpc.ankr.com/eth";
|
89
93
|
case 137:
|
90
|
-
return
|
94
|
+
return "https://rpc.ankr.com/polygon";
|
91
95
|
case 43114:
|
92
|
-
return
|
96
|
+
return "https://rpc.ankr.com/avalanche";
|
93
97
|
default:
|
94
98
|
throw new Error(`Unknown chainId: ${chainId}`);
|
95
99
|
}
|
96
|
-
}
|
100
|
+
};
|
97
101
|
|
98
102
|
export interface Signature {
|
99
103
|
signer: string;
|
@@ -116,36 +120,40 @@ export const buildSignatureBytes = (signatures: Signature[]): string => {
|
|
116
120
|
* Call an async function with a maximum time limit (in milliseconds) for the timeout
|
117
121
|
* Resolved promise for async function call, or an error if time limit reached
|
118
122
|
*/
|
119
|
-
export const asyncCallWithTimeout = async <T>(
|
123
|
+
export const asyncCallWithTimeout = async <T>(
|
124
|
+
asyncPromise: Promise<T>,
|
125
|
+
timeout: number
|
126
|
+
) => {
|
120
127
|
let timeoutHandle;
|
121
128
|
|
122
129
|
const timeoutPromise = new Promise((_resolve, reject) => {
|
123
130
|
timeoutHandle = setTimeout(
|
124
|
-
() => reject(new Error(
|
131
|
+
() => reject(new Error("Async call timeout limit reached")),
|
125
132
|
timeout
|
126
133
|
);
|
127
134
|
});
|
128
135
|
|
129
|
-
return Promise.race([asyncPromise, timeoutPromise]).then(result => {
|
136
|
+
return Promise.race([asyncPromise, timeoutPromise]).then((result) => {
|
130
137
|
clearTimeout(timeoutHandle);
|
131
138
|
return result;
|
132
|
-
}) as Promise<T
|
133
|
-
}
|
134
|
-
|
139
|
+
}) as Promise<T>;
|
140
|
+
};
|
135
141
|
|
136
142
|
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
|
143
|
+
actionId: string;
|
144
|
+
vnonce: string;
|
145
|
+
sourceSender: string;
|
146
|
+
sourceChainId: string | number;
|
147
|
+
sourceDsaId: string;
|
148
|
+
targetChainId: string | number;
|
149
|
+
targetDsaId: string;
|
144
150
|
};
|
145
151
|
|
146
|
-
export const generateInteropTransactionHash = (
|
152
|
+
export const generateInteropTransactionHash = (
|
153
|
+
data: GenerateInteropTransactionHashParam
|
154
|
+
) => {
|
147
155
|
return ethers.utils.solidityKeccak256(
|
148
|
-
Array.from({ length
|
156
|
+
Array.from({ length: 7 }, () => "string"),
|
149
157
|
[
|
150
158
|
String(data.actionId),
|
151
159
|
String(data.vnonce),
|
@@ -154,9 +162,9 @@ export const generateInteropTransactionHash = (data: GenerateInteropTransactionH
|
|
154
162
|
String(data.sourceDsaId),
|
155
163
|
String(data.targetChainId),
|
156
164
|
String(data.targetDsaId),
|
157
|
-
]
|
158
|
-
|
159
|
-
|
165
|
+
]
|
166
|
+
);
|
167
|
+
};
|
160
168
|
|
161
169
|
export class ContractError extends Error {
|
162
170
|
method: string;
|
@@ -164,76 +172,109 @@ export class ContractError extends Error {
|
|
164
172
|
args: any[];
|
165
173
|
}
|
166
174
|
|
167
|
-
export function getContract<TContract extends ethers.Contract>(
|
168
|
-
|
169
|
-
|
175
|
+
export function getContract<TContract extends ethers.Contract>(
|
176
|
+
address: string,
|
177
|
+
contractInterface: ethers.ContractInterface | any,
|
178
|
+
signerOrProvider?: ethers.Signer | ethers.providers.Provider
|
179
|
+
) {
|
180
|
+
if (
|
181
|
+
!ethers.utils.getAddress(address) ||
|
182
|
+
address === ethers.constants.AddressZero
|
183
|
+
) {
|
184
|
+
throw Error(`Invalid 'address' parameter '${address}'.`);
|
170
185
|
}
|
171
186
|
|
172
187
|
const contract = new ethers.Contract(
|
173
188
|
address,
|
174
189
|
contractInterface,
|
175
190
|
signerOrProvider
|
176
|
-
) as TContract
|
191
|
+
) as TContract;
|
177
192
|
|
178
193
|
// Make sure the contract properties is writable
|
179
|
-
const desc = Object.getOwnPropertyDescriptor(contract,
|
194
|
+
const desc = Object.getOwnPropertyDescriptor(contract, "functions");
|
180
195
|
|
181
196
|
if (!desc || desc.writable !== true) {
|
182
|
-
return contract
|
197
|
+
return contract;
|
183
198
|
}
|
184
199
|
|
185
200
|
return new Proxy(contract, {
|
186
201
|
get(target, prop, receiver) {
|
187
202
|
const value = Reflect.get(target, prop, receiver);
|
188
203
|
|
189
|
-
if (
|
204
|
+
if (
|
205
|
+
typeof value === "function" &&
|
206
|
+
(contract.functions.hasOwnProperty(prop) ||
|
207
|
+
["queryFilter"].includes(String(prop)))
|
208
|
+
) {
|
190
209
|
let isConstant = false;
|
191
210
|
|
192
211
|
try {
|
193
|
-
isConstant = contract.interface.getFunction(String(prop)).constant
|
194
|
-
} catch (error) {
|
195
|
-
}
|
212
|
+
isConstant = contract.interface.getFunction(String(prop)).constant;
|
213
|
+
} catch (error) {}
|
196
214
|
|
197
215
|
return async (...args: any[]) => {
|
198
216
|
try {
|
199
|
-
return await retry(
|
217
|
+
return await retry(
|
218
|
+
async () => await value.bind(contract)(...args),
|
219
|
+
{ retries: isConstant ? 1 : 3 }
|
220
|
+
);
|
200
221
|
} catch (error) {
|
201
|
-
const err = new ContractError(
|
222
|
+
const err = new ContractError(
|
223
|
+
`Error calling "${String(prop)}" on "${address}": ${
|
224
|
+
error.reason || error.message
|
225
|
+
}`
|
226
|
+
);
|
202
227
|
|
203
|
-
err.method = String(prop)
|
204
|
-
err.address = address
|
205
|
-
err.args = [...args]
|
228
|
+
err.method = String(prop);
|
229
|
+
err.address = address;
|
230
|
+
err.args = [...args];
|
206
231
|
|
207
|
-
throw err
|
232
|
+
throw err;
|
208
233
|
}
|
209
|
-
}
|
234
|
+
};
|
210
235
|
}
|
211
236
|
|
212
|
-
|
213
|
-
|
237
|
+
if (
|
238
|
+
typeof value === "object" &&
|
239
|
+
[
|
240
|
+
"populateTransaction",
|
241
|
+
"estimateGas",
|
242
|
+
"functions",
|
243
|
+
"callStatic",
|
244
|
+
].includes(String(prop))
|
245
|
+
) {
|
214
246
|
const parentProp = String(prop);
|
215
247
|
|
216
248
|
return new Proxy(value, {
|
217
249
|
get(target, prop, receiver) {
|
218
250
|
const value = Reflect.get(target, prop, receiver);
|
219
251
|
|
220
|
-
if (typeof value ===
|
252
|
+
if (typeof value === "function") {
|
221
253
|
return async (...args: any[]) => {
|
222
254
|
try {
|
223
|
-
return await retry(
|
255
|
+
return await retry(
|
256
|
+
async () => await value.bind(contract)(...args),
|
257
|
+
{ retries: parentProp === "callStatic" ? 3 : 1 }
|
258
|
+
);
|
224
259
|
} catch (error) {
|
225
|
-
const err = new ContractError(
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
260
|
+
const err = new ContractError(
|
261
|
+
`Error calling "${String(
|
262
|
+
prop
|
263
|
+
)}" using "${parentProp}" on "${address}": ${
|
264
|
+
error.reason || error.message
|
265
|
+
}`
|
266
|
+
);
|
267
|
+
|
268
|
+
err.method = String(prop);
|
269
|
+
err.address = address;
|
270
|
+
err.args = [...args];
|
271
|
+
|
272
|
+
throw err;
|
232
273
|
}
|
233
|
-
}
|
274
|
+
};
|
234
275
|
}
|
235
|
-
}
|
236
|
-
})
|
276
|
+
},
|
277
|
+
});
|
237
278
|
}
|
238
279
|
|
239
280
|
return value;
|
@@ -241,7 +282,10 @@ export function getContract<TContract extends ethers.Contract>(address: string,
|
|
241
282
|
});
|
242
283
|
}
|
243
284
|
|
244
|
-
export const generateGnosisTransaction = async (
|
285
|
+
export const generateGnosisTransaction = async (
|
286
|
+
transactionData: any,
|
287
|
+
safeContract: GnosisSafe
|
288
|
+
) => {
|
245
289
|
console.log(transactionData);
|
246
290
|
|
247
291
|
let isExecuted = await safeContract.dataHashes(
|
@@ -257,10 +301,14 @@ export const generateGnosisTransaction = async (transactionData: any, safeContra
|
|
257
301
|
transactionData.refundReceiver,
|
258
302
|
transactionData.nonce
|
259
303
|
)
|
260
|
-
)
|
304
|
+
);
|
261
305
|
|
262
306
|
while (isExecuted == 1) {
|
263
|
-
transactionData.safeTxGas = ethers.BigNumber.from(
|
307
|
+
transactionData.safeTxGas = ethers.BigNumber.from(
|
308
|
+
String(transactionData.safeTxGas)
|
309
|
+
)
|
310
|
+
.add(1)
|
311
|
+
.toString();
|
264
312
|
|
265
313
|
isExecuted = await safeContract.dataHashes(
|
266
314
|
await safeContract.getTransactionHash(
|
@@ -275,15 +323,43 @@ export const generateGnosisTransaction = async (transactionData: any, safeContra
|
|
275
323
|
transactionData.refundReceiver,
|
276
324
|
transactionData.nonce
|
277
325
|
)
|
278
|
-
)
|
326
|
+
);
|
279
327
|
}
|
280
328
|
|
281
|
-
return transactionData
|
282
|
-
}
|
329
|
+
return transactionData;
|
330
|
+
};
|
283
331
|
|
284
332
|
export class LiquidityError extends Error {
|
285
333
|
constructor(message?: string) {
|
286
|
-
super(message ||
|
334
|
+
super(message || "Not enough liquidity");
|
287
335
|
Object.setPrototypeOf(this, new.target.prototype);
|
288
336
|
}
|
289
|
-
}
|
337
|
+
}
|
338
|
+
|
339
|
+
export const encodeConnectorMethod = (params: {
|
340
|
+
connector: string;
|
341
|
+
method: string;
|
342
|
+
args: string[];
|
343
|
+
}) => {
|
344
|
+
const connectorInterface = getInterface(
|
345
|
+
connectors.versions[2][params.connector],
|
346
|
+
params.method
|
347
|
+
);
|
348
|
+
|
349
|
+
if (!connectorInterface)
|
350
|
+
throw new Error(`ConnectorInterface '${params.method}' not found`);
|
351
|
+
|
352
|
+
//@ts-ignore
|
353
|
+
return Web3EthAbi.encodeFunctionCall(connectorInterface, 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
|
-
}
|