@instadapp/interop-x 0.0.0-dev.1abc1ca → 0.0.0-dev.1f933be

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 (78) hide show
  1. package/bin/interop-x +1 -1
  2. package/dist/package.json +10 -6
  3. package/dist/src/abi/index.js +2 -4
  4. package/dist/src/abi/interopXContract.json +391 -0
  5. package/dist/src/alias.js +10 -0
  6. package/dist/src/api/index.js +6 -3
  7. package/dist/src/config/index.js +11 -1
  8. package/dist/src/constants/addresses.js +3 -3
  9. package/dist/src/constants/index.js +0 -1
  10. package/dist/src/db/models/transaction.js +27 -9
  11. package/dist/src/gnosis/actions/index.js +9 -0
  12. package/dist/src/gnosis/actions/withdraw/index.js +41 -0
  13. package/dist/src/gnosis/index.js +20 -0
  14. package/dist/src/index.js +75 -24
  15. package/dist/src/net/peer/index.js +8 -3
  16. package/dist/src/net/pool/index.js +32 -9
  17. package/dist/src/net/protocol/dial/SignatureDialProtocol.js +10 -4
  18. package/dist/src/net/protocol/dial/TransactionStatusDialProtocol.js +30 -0
  19. package/dist/src/net/protocol/index.js +51 -1
  20. package/dist/src/tasks/AutoUpdateTask.js +70 -0
  21. package/dist/src/tasks/BaseTask.js +12 -4
  22. package/dist/src/tasks/InteropXContract/ProcessBridgeRequestEvents.js +147 -0
  23. package/dist/src/tasks/InteropXContract/SyncBridgeRequestEvents.js +78 -0
  24. package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +55 -0
  25. package/dist/src/tasks/index.js +12 -4
  26. package/dist/src/typechain/{InteropBridgeToken.js → InteropXContract.js} +0 -0
  27. package/dist/src/typechain/factories/InteropXContract__factory.js +526 -0
  28. package/dist/src/typechain/factories/index.js +3 -5
  29. package/dist/src/typechain/index.js +3 -5
  30. package/dist/src/utils/index.js +69 -38
  31. package/package.json +10 -6
  32. package/patches/@ethersproject+properties+5.6.0.patch +13 -0
  33. package/src/abi/index.ts +2 -4
  34. package/src/abi/interopXContract.json +391 -0
  35. package/src/alias.ts +6 -0
  36. package/src/api/index.ts +5 -2
  37. package/src/config/index.ts +11 -1
  38. package/src/constants/addresses.ts +3 -3
  39. package/src/constants/index.ts +0 -1
  40. package/src/db/models/transaction.ts +59 -21
  41. package/src/gnosis/actions/index.ts +5 -0
  42. package/src/gnosis/actions/withdraw/index.ts +56 -0
  43. package/src/gnosis/index.ts +19 -0
  44. package/src/index.ts +96 -26
  45. package/src/net/peer/index.ts +9 -7
  46. package/src/net/pool/index.ts +41 -11
  47. package/src/net/protocol/dial/SignatureDialProtocol.ts +12 -6
  48. package/src/net/protocol/dial/TransactionStatusDialProtocol.ts +33 -0
  49. package/src/net/protocol/index.ts +67 -1
  50. package/src/tasks/AutoUpdateTask.ts +82 -0
  51. package/src/tasks/BaseTask.ts +14 -4
  52. package/src/tasks/InteropXContract/ProcessBridgeRequestEvents.ts +211 -0
  53. package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +116 -0
  54. package/src/tasks/Transactions/SyncTransactionStatusTask.ts +67 -0
  55. package/src/tasks/index.ts +19 -5
  56. package/src/typechain/InteropXContract.ts +524 -0
  57. package/src/typechain/factories/InteropXContract__factory.ts +533 -0
  58. package/src/typechain/factories/index.ts +1 -2
  59. package/src/typechain/index.ts +2 -4
  60. package/src/utils/index.ts +109 -54
  61. package/tsconfig.json +7 -2
  62. package/dist/src/abi/interopBridgeToken.json +0 -286
  63. package/dist/src/abi/interopXGateway.json +0 -184
  64. package/dist/src/constants/itokens.js +0 -13
  65. package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +0 -140
  66. package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -75
  67. package/dist/src/typechain/InteropXGateway.js +0 -2
  68. package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -459
  69. package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
  70. package/src/abi/interopBridgeToken.json +0 -286
  71. package/src/abi/interopXGateway.json +0 -184
  72. package/src/constants/itokens.ts +0 -10
  73. package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -232
  74. package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -126
  75. package/src/typechain/InteropBridgeToken.ts +0 -686
  76. package/src/typechain/InteropXGateway.ts +0 -407
  77. package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -466
  78. package/src/typechain/factories/InteropXGateway__factory.ts +0 -272
@@ -3,20 +3,27 @@
3
3
  */
4
4
  import axios from 'axios'
5
5
  import axiosRetry from "axios-retry";
6
- import { addresses, itokens, tokens } from '@/constants';
6
+ import { addresses } from '@/constants';
7
7
  import { ChainId } from '@/types'
8
8
  import { ethers } from 'ethers';
9
- import { encodeMulti, MetaTransaction, OperationType } from 'ethers-multisend';
10
- import { Transaction } from '@/db';
11
- import config from '@/config';
12
- import abi from '@/abi';
13
- import { InteropBridgeToken } from '@/typechain';
14
-
9
+ import { GnosisSafe } from '@/typechain';
15
10
  export const http = axios.create();
16
11
 
17
12
  axiosRetry(http, { retries: 3, retryDelay: axiosRetry.exponentialDelay });
18
13
 
19
14
 
15
+ export function shortenHash(hash: string, length: number = 4) {
16
+ if (!hash) return;
17
+
18
+ if (hash.length < 12) return hash;
19
+
20
+ const beginningChars = hash.startsWith("0x") ? length + 2 : length;
21
+
22
+ const shortened = hash.substr(0, beginningChars) + "…" + hash.substr(-length);
23
+
24
+ return shortened;
25
+ }
26
+
20
27
  export function short(buffer: Buffer): string {
21
28
  return buffer.toString('hex').slice(0, 8) + '...'
22
29
  }
@@ -76,11 +83,11 @@ export const signGnosisSafeTx = async ({
76
83
  export const getRpcProviderUrl = (chainId: ChainId) => {
77
84
  switch (chainId) {
78
85
  case 1:
79
- return 'https://rpc.instadapp.io/mainnet';
86
+ return 'https://rpc.ankr.com/eth';
80
87
  case 137:
81
- return 'https://rpc.instadapp.io/polygon';
88
+ return 'https://rpc.ankr.com/polygon';
82
89
  case 43114:
83
- return 'https://rpc.instadapp.io/avalanche';
90
+ return 'https://rpc.ankr.com/avalanche';
84
91
  default:
85
92
  throw new Error(`Unknown chainId: ${chainId}`);
86
93
  }
@@ -124,62 +131,110 @@ export const asyncCallWithTimeout = async <T>(asyncPromise: Promise<T>, timeout:
124
131
  }
125
132
 
126
133
 
127
- export const generateInteropTransactionHash = (data: { action: string, submitTransactionHash: string, sourceChainId: string | number, targetChainId: string | number }) => {
128
- return ethers.utils.solidityKeccak256(['string', 'string', 'string', 'string'], [
134
+ export const generateInteropTransactionHash = (data: { action: string, bridger: string, requestTransactionHash: string, sourceChainId: string | number, targetChainId: string | number }) => {
135
+ return ethers.utils.solidityKeccak256(['string', 'string', 'string', 'string', 'string'], [
129
136
  String(data.action),
130
- String(data.submitTransactionHash),
137
+ String(data.bridger),
138
+ String(data.requestTransactionHash),
131
139
  String(data.sourceChainId),
132
140
  String(data.targetChainId),
133
141
  ]);
134
142
  }
135
143
 
136
- export const buildDataForTransaction = async (transaction: Transaction, type?: 'source' | 'target') => {
137
- type = type || transaction.sourceStatus === 'pending' ? 'source' : 'target';
138
-
139
- const transactions: MetaTransaction[] = [];
140
-
141
- if(transaction.action != 'deposit') {
142
- throw new Error('Invalid action');
144
+ export function getContract<TContract extends ethers.Contract>(address: string, contractInterface: ethers.ContractInterface | any, signerOrProvider?: ethers.Signer | ethers.providers.Provider) {
145
+ if (!ethers.utils.getAddress(address) || address === ethers.constants.AddressZero) {
146
+ throw Error(`Invalid 'address' parameter '${address}'.`)
143
147
  }
144
148
 
145
- if (transaction.action === 'deposit' && transaction.sourceStatus === 'pending') {
146
- throw Error('Cannot build data for pending deposit transaction');
147
- }
149
+ const contract = new ethers.Contract(
150
+ address,
151
+ contractInterface,
152
+ signerOrProvider
153
+ ) as TContract
148
154
 
149
- if (!transaction.submitEvent) {
150
- throw Error('Cannot build data for transaction without submitEvent');
151
- }
155
+ // Make sure the contract properties is writable
156
+ const desc = Object.getOwnPropertyDescriptor(contract, 'functions');
152
157
 
153
-
154
- const token = tokens[transaction.sourceChainId].find(token => token.address.toLowerCase() === transaction.submitEvent.token.toLowerCase());
155
-
156
- if (!token) {
157
- throw Error('Cannot build data for transaction without token');
158
+ if (!desc || desc.writable !== true) {
159
+ return contract
158
160
  }
159
161
 
160
- const itoken = itokens[transaction.targetChainId].find(itoken => token.symbol.toLowerCase() === token.symbol.toLowerCase());
162
+ return new Proxy(contract, {
163
+ get(target, prop, receiver) {
164
+ const value = Reflect.get(target, prop, receiver);
165
+
166
+ if (typeof value === 'function' && (contract.functions.hasOwnProperty(prop) || ['queryFilter'].includes(String(prop)))) {
167
+ return async (...args: any[]) => {
168
+ try {
169
+ return await value.bind(contract)(...args);
170
+ } catch (error) {
171
+ throw new Error(`Error calling "${String(prop)}" on "${address}": ${error.reason || error.message}`)
172
+ }
173
+ }
174
+ }
175
+
176
+
177
+ if (typeof value === 'object' && ['populateTransaction', 'estimateGas', 'functions', 'callStatic'].includes(String(prop))) {
178
+ const parentProp = String(prop);
179
+
180
+ return new Proxy(value, {
181
+ get(target, prop, receiver) {
182
+ const value = Reflect.get(target, prop, receiver);
183
+
184
+ if (typeof value === 'function') {
185
+ return async (...args: any[]) => {
186
+ try {
187
+ return await value.bind(contract)(...args);
188
+ } catch (error) {
189
+ throw new Error(`Error calling "${String(prop)}" using "${parentProp}" on "${address}": ${error.reason || error.message}`)
190
+ }
191
+ }
192
+ }
193
+ }
194
+ })
195
+ }
196
+
197
+ return value;
198
+ },
199
+ });
200
+ }
161
201
 
162
- if (!itoken) {
163
- throw Error('Cannot build data for transaction without itoken');
202
+ export const generateGnosisTransaction = async (transactionData: any, safeContract: GnosisSafe) => {
203
+ console.log(transactionData);
204
+
205
+ let isExecuted = await safeContract.dataHashes(
206
+ await safeContract.getTransactionHash(
207
+ transactionData.to,
208
+ transactionData.value,
209
+ transactionData.data,
210
+ transactionData.operation,
211
+ transactionData.safeTxGas,
212
+ transactionData.baseGas,
213
+ transactionData.gasPrice,
214
+ transactionData.gasToken,
215
+ transactionData.refundReceiver,
216
+ transactionData.nonce
217
+ )
218
+ )
219
+
220
+ while (isExecuted == 1) {
221
+ transactionData.safeTxGas = ethers.BigNumber.from(String(transactionData.safeTxGas)).add(1).toString()
222
+
223
+ isExecuted = await safeContract.dataHashes(
224
+ await safeContract.getTransactionHash(
225
+ transactionData.to,
226
+ transactionData.value,
227
+ transactionData.data,
228
+ transactionData.operation,
229
+ transactionData.safeTxGas,
230
+ transactionData.baseGas,
231
+ transactionData.gasPrice,
232
+ transactionData.gasToken,
233
+ transactionData.refundReceiver,
234
+ transactionData.nonce
235
+ )
236
+ )
164
237
  }
165
238
 
166
- const targetChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(transaction.targetChainId as ChainId));
167
- const targetWallet = new ethers.Wallet(config.privateKey, targetChainProvider);
168
- const interopBridgeContract = new ethers.Contract(itoken.address, abi.interopBridgeToken, targetWallet) as InteropBridgeToken;
169
-
170
- const { data } = await interopBridgeContract.populateTransaction.mint(
171
- transaction.submitEvent.to,
172
- transaction.submitEvent.amount,
173
- transaction.sourceChainId,
174
- transaction.sourceTransactionHash,
175
- );
176
-
177
- transactions.push({
178
- to: itoken.address,
179
- data: data!,
180
- value: '0',
181
- operation: OperationType.Call,
182
- });
183
-
184
- return encodeMulti(transactions).data
185
- }
239
+ return transactionData
240
+ }
package/tsconfig.json CHANGED
@@ -16,8 +16,13 @@
16
16
  "noEmit": false,
17
17
  "outDir": "dist",
18
18
  "baseUrl": "src",
19
- "paths": {
20
- "@/*" : ["./*" ]
19
+ "paths": {
20
+ "@/*": [
21
+ "*"
22
+ ],
23
+ "@": [
24
+ "/"
25
+ ]
21
26
  },
22
27
  "typeRoots": [
23
28
  "./node_modules/@types",
@@ -1,286 +0,0 @@
1
- [
2
- {
3
- "inputs": [
4
- { "internalType": "address", "name": "__owner", "type": "address" }
5
- ],
6
- "stateMutability": "nonpayable",
7
- "type": "constructor"
8
- },
9
- {
10
- "anonymous": false,
11
- "inputs": [
12
- {
13
- "indexed": true,
14
- "internalType": "address",
15
- "name": "owner",
16
- "type": "address"
17
- },
18
- {
19
- "indexed": true,
20
- "internalType": "address",
21
- "name": "spender",
22
- "type": "address"
23
- },
24
- {
25
- "indexed": false,
26
- "internalType": "uint256",
27
- "name": "value",
28
- "type": "uint256"
29
- }
30
- ],
31
- "name": "Approval",
32
- "type": "event"
33
- },
34
- {
35
- "anonymous": false,
36
- "inputs": [
37
- {
38
- "indexed": true,
39
- "internalType": "address",
40
- "name": "to",
41
- "type": "address"
42
- },
43
- {
44
- "indexed": false,
45
- "internalType": "uint256",
46
- "name": "amount",
47
- "type": "uint256"
48
- },
49
- {
50
- "indexed": true,
51
- "internalType": "uint256",
52
- "name": "chainId",
53
- "type": "uint256"
54
- }
55
- ],
56
- "name": "Burn",
57
- "type": "event"
58
- },
59
- {
60
- "anonymous": false,
61
- "inputs": [
62
- {
63
- "indexed": true,
64
- "internalType": "address",
65
- "name": "to",
66
- "type": "address"
67
- },
68
- {
69
- "indexed": false,
70
- "internalType": "uint256",
71
- "name": "amount",
72
- "type": "uint256"
73
- },
74
- {
75
- "indexed": true,
76
- "internalType": "uint256",
77
- "name": "chainId",
78
- "type": "uint256"
79
- },
80
- {
81
- "indexed": true,
82
- "internalType": "bytes32",
83
- "name": "transactionHash",
84
- "type": "bytes32"
85
- }
86
- ],
87
- "name": "Mint",
88
- "type": "event"
89
- },
90
- {
91
- "anonymous": false,
92
- "inputs": [
93
- {
94
- "indexed": true,
95
- "internalType": "address",
96
- "name": "previousOwner",
97
- "type": "address"
98
- },
99
- {
100
- "indexed": true,
101
- "internalType": "address",
102
- "name": "newOwner",
103
- "type": "address"
104
- }
105
- ],
106
- "name": "OwnershipTransferred",
107
- "type": "event"
108
- },
109
- {
110
- "anonymous": false,
111
- "inputs": [
112
- {
113
- "indexed": true,
114
- "internalType": "address",
115
- "name": "from",
116
- "type": "address"
117
- },
118
- {
119
- "indexed": true,
120
- "internalType": "address",
121
- "name": "to",
122
- "type": "address"
123
- },
124
- {
125
- "indexed": false,
126
- "internalType": "uint256",
127
- "name": "value",
128
- "type": "uint256"
129
- }
130
- ],
131
- "name": "Transfer",
132
- "type": "event"
133
- },
134
- {
135
- "inputs": [
136
- { "internalType": "address", "name": "owner", "type": "address" },
137
- { "internalType": "address", "name": "spender", "type": "address" }
138
- ],
139
- "name": "allowance",
140
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
141
- "stateMutability": "view",
142
- "type": "function"
143
- },
144
- {
145
- "inputs": [
146
- { "internalType": "address", "name": "spender", "type": "address" },
147
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
148
- ],
149
- "name": "approve",
150
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
151
- "stateMutability": "nonpayable",
152
- "type": "function"
153
- },
154
- {
155
- "inputs": [
156
- { "internalType": "address", "name": "account", "type": "address" }
157
- ],
158
- "name": "balanceOf",
159
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
160
- "stateMutability": "view",
161
- "type": "function"
162
- },
163
- {
164
- "inputs": [
165
- { "internalType": "address", "name": "to", "type": "address" },
166
- { "internalType": "uint256", "name": "amount", "type": "uint256" },
167
- { "internalType": "uint256", "name": "chainId", "type": "uint256" }
168
- ],
169
- "name": "burn",
170
- "outputs": [],
171
- "stateMutability": "nonpayable",
172
- "type": "function"
173
- },
174
- {
175
- "inputs": [],
176
- "name": "decimals",
177
- "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
178
- "stateMutability": "view",
179
- "type": "function"
180
- },
181
- {
182
- "inputs": [
183
- { "internalType": "address", "name": "spender", "type": "address" },
184
- {
185
- "internalType": "uint256",
186
- "name": "subtractedValue",
187
- "type": "uint256"
188
- }
189
- ],
190
- "name": "decreaseAllowance",
191
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
192
- "stateMutability": "nonpayable",
193
- "type": "function"
194
- },
195
- {
196
- "inputs": [
197
- { "internalType": "address", "name": "spender", "type": "address" },
198
- { "internalType": "uint256", "name": "addedValue", "type": "uint256" }
199
- ],
200
- "name": "increaseAllowance",
201
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
202
- "stateMutability": "nonpayable",
203
- "type": "function"
204
- },
205
- {
206
- "inputs": [
207
- { "internalType": "address", "name": "to", "type": "address" },
208
- { "internalType": "uint256", "name": "amount", "type": "uint256" },
209
- { "internalType": "uint256", "name": "chainId", "type": "uint256" },
210
- {
211
- "internalType": "bytes32",
212
- "name": "transactionHash",
213
- "type": "bytes32"
214
- }
215
- ],
216
- "name": "mint",
217
- "outputs": [],
218
- "stateMutability": "nonpayable",
219
- "type": "function"
220
- },
221
- {
222
- "inputs": [],
223
- "name": "name",
224
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
225
- "stateMutability": "view",
226
- "type": "function"
227
- },
228
- {
229
- "inputs": [],
230
- "name": "owner",
231
- "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
232
- "stateMutability": "view",
233
- "type": "function"
234
- },
235
- {
236
- "inputs": [],
237
- "name": "renounceOwnership",
238
- "outputs": [],
239
- "stateMutability": "nonpayable",
240
- "type": "function"
241
- },
242
- {
243
- "inputs": [],
244
- "name": "symbol",
245
- "outputs": [{ "internalType": "string", "name": "", "type": "string" }],
246
- "stateMutability": "view",
247
- "type": "function"
248
- },
249
- {
250
- "inputs": [],
251
- "name": "totalSupply",
252
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
253
- "stateMutability": "view",
254
- "type": "function"
255
- },
256
- {
257
- "inputs": [
258
- { "internalType": "address", "name": "to", "type": "address" },
259
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
260
- ],
261
- "name": "transfer",
262
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
263
- "stateMutability": "nonpayable",
264
- "type": "function"
265
- },
266
- {
267
- "inputs": [
268
- { "internalType": "address", "name": "from", "type": "address" },
269
- { "internalType": "address", "name": "to", "type": "address" },
270
- { "internalType": "uint256", "name": "amount", "type": "uint256" }
271
- ],
272
- "name": "transferFrom",
273
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
274
- "stateMutability": "nonpayable",
275
- "type": "function"
276
- },
277
- {
278
- "inputs": [
279
- { "internalType": "address", "name": "newOwner", "type": "address" }
280
- ],
281
- "name": "transferOwnership",
282
- "outputs": [],
283
- "stateMutability": "nonpayable",
284
- "type": "function"
285
- }
286
- ]