@instadapp/interop-x 0.0.0-dev.285d847 → 0.0.0-dev.28f049d
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 +5 -4
- package/dist/src/abi/index.js +2 -4
- package/dist/src/abi/interopXContract.json +391 -0
- package/dist/src/alias.js +10 -0
- package/dist/src/api/index.js +6 -3
- package/dist/src/config/index.js +10 -1
- package/dist/src/constants/addresses.js +3 -3
- package/dist/src/constants/index.js +0 -1
- package/dist/src/db/models/transaction.js +27 -9
- package/dist/src/gnosis/actions/index.js +9 -0
- package/dist/src/gnosis/actions/withdraw/index.js +41 -0
- package/dist/src/gnosis/index.js +20 -0
- package/dist/src/index.js +38 -23
- package/dist/src/net/peer/index.js +2 -1
- package/dist/src/net/pool/index.js +7 -2
- package/dist/src/net/protocol/dial/SignatureDialProtocol.js +3 -8
- package/dist/src/net/protocol/dial/TransactionStatusDialProtocol.js +30 -0
- package/dist/src/net/protocol/index.js +26 -5
- package/dist/src/tasks/AutoUpdateTask.js +42 -16
- package/dist/src/tasks/BaseTask.js +11 -3
- package/dist/src/tasks/{InteropXGateway/ProcessDepositEvents.js → InteropXContract/ProcessBridgeRequestEvents.js} +42 -46
- package/dist/src/tasks/InteropXContract/SyncBridgeRequestEvents.js +78 -0
- package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +55 -0
- package/dist/src/tasks/index.js +8 -17
- package/dist/src/typechain/{InteropBridgeToken.js → InteropXContract.js} +0 -0
- package/dist/src/typechain/factories/InteropXContract__factory.js +526 -0
- package/dist/src/typechain/factories/index.js +3 -5
- package/dist/src/typechain/index.js +3 -5
- package/dist/src/utils/index.js +27 -87
- package/package.json +5 -4
- package/src/abi/index.ts +2 -4
- package/src/abi/interopXContract.json +391 -0
- package/src/alias.ts +6 -0
- package/src/api/index.ts +5 -2
- package/src/config/index.ts +9 -1
- package/src/constants/addresses.ts +3 -3
- package/src/constants/index.ts +0 -1
- package/src/db/models/transaction.ts +59 -21
- package/src/gnosis/actions/index.ts +5 -0
- package/src/gnosis/actions/withdraw/index.ts +56 -0
- package/src/gnosis/index.ts +19 -0
- package/src/index.ts +52 -25
- package/src/net/peer/index.ts +2 -1
- package/src/net/pool/index.ts +7 -3
- package/src/net/protocol/dial/SignatureDialProtocol.ts +5 -11
- package/src/net/protocol/dial/TransactionStatusDialProtocol.ts +33 -0
- package/src/net/protocol/index.ts +28 -6
- package/src/tasks/AutoUpdateTask.ts +48 -20
- package/src/tasks/BaseTask.ts +13 -3
- package/src/tasks/{InteropBridge/ProcessWithdrawEvents.ts → InteropXContract/ProcessBridgeRequestEvents.ts} +66 -91
- package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +116 -0
- package/src/tasks/Transactions/SyncTransactionStatusTask.ts +67 -0
- package/src/tasks/index.ts +10 -18
- package/src/typechain/InteropXContract.ts +524 -0
- package/src/typechain/factories/InteropXContract__factory.ts +533 -0
- package/src/typechain/factories/index.ts +1 -2
- package/src/typechain/index.ts +2 -4
- package/src/utils/index.ts +61 -128
- package/tsconfig.json +7 -2
- package/dist/src/abi/interopBridgeToken.json +0 -286
- package/dist/src/abi/interopXGateway.json +0 -184
- package/dist/src/constants/itokens.js +0 -13
- package/dist/src/tasks/InteropBridge/ProcessWithdrawEvents.js +0 -147
- package/dist/src/tasks/InteropBridge/SyncWithdrawEvents.js +0 -70
- package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -75
- package/dist/src/typechain/InteropXGateway.js +0 -2
- package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -459
- package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
- package/src/abi/interopBridgeToken.json +0 -286
- package/src/abi/interopXGateway.json +0 -184
- package/src/constants/itokens.ts +0 -10
- package/src/tasks/InteropBridge/SyncWithdrawEvents.ts +0 -121
- package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -245
- package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -126
- package/src/typechain/InteropBridgeToken.ts +0 -686
- package/src/typechain/InteropXGateway.ts +0 -407
- package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -466
- package/src/typechain/factories/InteropXGateway__factory.ts +0 -272
@@ -1,13 +1,16 @@
|
|
1
1
|
import { BaseTask } from "./BaseTask";
|
2
2
|
import Logger from '@/logger';
|
3
|
-
import
|
4
|
-
import {
|
5
|
-
import { spawn } from 'child_process';
|
3
|
+
import spawnAsync from 'await-spawn';
|
4
|
+
import { spawn } from 'child_process'
|
6
5
|
import config from "@/config";
|
6
|
+
import wait from "waait";
|
7
|
+
import packageJson from "../../package.json";
|
8
|
+
|
7
9
|
const currentVersion = packageJson.version;
|
10
|
+
const tag = config.staging ? 'dev' : 'latest';
|
8
11
|
|
9
12
|
class AutoUpdateTask extends BaseTask {
|
10
|
-
pollIntervalMs: number = 60 * 1000
|
13
|
+
pollIntervalMs: number = 60 * 10 * 1000
|
11
14
|
|
12
15
|
constructor() {
|
13
16
|
super({
|
@@ -15,16 +18,32 @@ class AutoUpdateTask extends BaseTask {
|
|
15
18
|
})
|
16
19
|
}
|
17
20
|
|
18
|
-
|
19
21
|
prePollHandler(): boolean {
|
20
22
|
return config.autoUpdate && !config.isLeadNode();
|
21
23
|
}
|
22
24
|
|
23
|
-
async
|
25
|
+
async getInstalledVersion() {
|
26
|
+
try {
|
27
|
+
const stdout = await spawnAsync('npm', ['-g', 'ls', '--depth=0', '--json'])
|
28
|
+
return JSON.parse(stdout.toString()).dependencies[packageJson.name].version
|
29
|
+
} catch (error) {
|
30
|
+
this.logger.error(error)
|
31
|
+
return currentVersion
|
32
|
+
}
|
33
|
+
}
|
24
34
|
|
25
|
-
|
35
|
+
async getLatestVersion() {
|
36
|
+
try {
|
37
|
+
const stdout = await spawnAsync('npm', ['view', `${packageJson.name}@${tag}`, 'version'])
|
38
|
+
return stdout.toString().trim()
|
39
|
+
} catch (error) {
|
40
|
+
this.logger.error(error)
|
41
|
+
return currentVersion
|
42
|
+
}
|
43
|
+
}
|
26
44
|
|
27
|
-
|
45
|
+
async pollHandler() {
|
46
|
+
const version = await this.getLatestVersion()
|
28
47
|
|
29
48
|
if (version === currentVersion) {
|
30
49
|
return;
|
@@ -32,22 +51,31 @@ class AutoUpdateTask extends BaseTask {
|
|
32
51
|
|
33
52
|
this.logger.warn(`New version ${version} available.`)
|
34
53
|
|
54
|
+
this.logger.info('Updating...')
|
35
55
|
|
36
|
-
|
56
|
+
await spawnAsync('npm', ['-g', 'install', `@instadapp/interop-x@${tag}`, '-f']);
|
37
57
|
|
38
|
-
|
39
|
-
this.logger.warn(`Installed version ${version}`)
|
40
|
-
this.logger.warn(`Restarting...`)
|
58
|
+
await wait(5000)
|
41
59
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
stdio: "inherit"
|
47
|
-
});
|
60
|
+
if (version !== await this.getInstalledVersion()) {
|
61
|
+
this.logger.warn(`failed to install ${version}, retrying in 5 minutes`)
|
62
|
+
return;
|
63
|
+
}
|
48
64
|
|
49
|
-
|
50
|
-
|
65
|
+
this.logger.warn(`Installed version ${version}`)
|
66
|
+
this.logger.warn(`Restarting...`)
|
67
|
+
|
68
|
+
|
69
|
+
// TODO: its restarting in the bg, but it should be in the fg
|
70
|
+
const subprocess = spawn(process.argv[0], process.argv.slice(1), {
|
71
|
+
cwd: process.cwd(),
|
72
|
+
stdio: "inherit",
|
73
|
+
// shell: process.env.SHELL,
|
74
|
+
});
|
75
|
+
|
76
|
+
subprocess.unref();
|
77
|
+
|
78
|
+
process.exit()
|
51
79
|
}
|
52
80
|
}
|
53
81
|
|
package/src/tasks/BaseTask.ts
CHANGED
@@ -19,6 +19,7 @@ export class BaseTask extends EventEmitter implements IBaseTask {
|
|
19
19
|
started: boolean = false
|
20
20
|
pollIntervalMs: number = 10 * 1000
|
21
21
|
leadNodeOnly: boolean = false
|
22
|
+
exceptLeadNode: boolean = false
|
22
23
|
|
23
24
|
public constructor({ logger }: { logger?: Logger }) {
|
24
25
|
super()
|
@@ -45,11 +46,20 @@ export class BaseTask extends EventEmitter implements IBaseTask {
|
|
45
46
|
}
|
46
47
|
|
47
48
|
prePollHandler(): boolean {
|
48
|
-
if
|
49
|
-
|
49
|
+
if(config.isMaintenanceMode()){
|
50
|
+
this.logger.warn('Maintenance mode is enabled. Skipping task.')
|
51
|
+
return false
|
50
52
|
}
|
51
53
|
|
52
|
-
|
54
|
+
if (this.exceptLeadNode) {
|
55
|
+
return !config.isLeadNode();
|
56
|
+
}
|
57
|
+
|
58
|
+
if (this.leadNodeOnly) {
|
59
|
+
return config.isLeadNode()
|
60
|
+
}
|
61
|
+
|
62
|
+
return true
|
53
63
|
}
|
54
64
|
|
55
65
|
async pollHandler() {
|
@@ -1,66 +1,33 @@
|
|
1
1
|
import { BaseTask } from "../BaseTask";
|
2
2
|
import Logger from '@/logger';
|
3
|
-
import {
|
3
|
+
import { ethers, Wallet } from "ethers";
|
4
4
|
import abi from "@/abi";
|
5
5
|
import { Transaction } from "@/db";
|
6
|
-
import {
|
6
|
+
import { buildSignatureBytes, generateGnosisTransaction, generateInteropTransactionHash, getContract, getRpcProviderUrl, Signature } from "@/utils";
|
7
7
|
import { addresses } from "@/constants";
|
8
|
+
import { Op } from "sequelize";
|
8
9
|
import { ChainId } from "@/types";
|
9
10
|
import config from "@/config";
|
10
|
-
import { GnosisSafe,
|
11
|
-
import { Op } from "sequelize";
|
11
|
+
import { GnosisSafe, InteropXContract } from "@/typechain";
|
12
12
|
import wait from "waait";
|
13
|
+
import { buildGnosisAction } from "@/gnosis";
|
13
14
|
import { peerPool, protocol } from "@/net";
|
14
15
|
import { LogDescription } from "ethers/lib/utils";
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
let isExecuted = await safeContract.dataHashes(
|
20
|
-
await safeContract.getTransactionHash(
|
21
|
-
transactionData.to,
|
22
|
-
transactionData.value,
|
23
|
-
transactionData.data,
|
24
|
-
transactionData.operation,
|
25
|
-
transactionData.safeTxGas,
|
26
|
-
transactionData.baseGas,
|
27
|
-
transactionData.gasPrice,
|
28
|
-
transactionData.gasToken,
|
29
|
-
transactionData.refundReceiver,
|
30
|
-
transactionData.nonce
|
31
|
-
)
|
32
|
-
)
|
33
|
-
|
34
|
-
while (isExecuted == 1) {
|
35
|
-
transactionData.safeTxGas = BigNumber.from(String(transactionData.safeTxGas)).add(1).toString()
|
36
|
-
|
37
|
-
isExecuted = await safeContract.dataHashes(
|
38
|
-
await safeContract.getTransactionHash(
|
39
|
-
transactionData.to,
|
40
|
-
transactionData.value,
|
41
|
-
transactionData.data,
|
42
|
-
transactionData.operation,
|
43
|
-
transactionData.safeTxGas,
|
44
|
-
transactionData.baseGas,
|
45
|
-
transactionData.gasPrice,
|
46
|
-
transactionData.gasToken,
|
47
|
-
transactionData.refundReceiver,
|
48
|
-
transactionData.nonce
|
49
|
-
)
|
50
|
-
)
|
51
|
-
}
|
52
|
-
|
53
|
-
return transactionData
|
54
|
-
}
|
55
|
-
|
56
|
-
class ProcessWithdrawEvents extends BaseTask {
|
17
|
+
class ProccessBridgeRequestEvents extends BaseTask {
|
18
|
+
contractAddress: string;
|
19
|
+
safeContractAddress: string;
|
57
20
|
provider: ethers.providers.JsonRpcProvider;
|
21
|
+
contract: InteropXContract;
|
22
|
+
safeContract: GnosisSafe;
|
58
23
|
chainId: ChainId;
|
59
|
-
|
24
|
+
sourceWallet: Wallet;
|
25
|
+
|
26
|
+
leadNodeOnly: boolean = true;
|
60
27
|
|
61
28
|
constructor({ chainId }: { chainId: ChainId }) {
|
62
29
|
super({
|
63
|
-
logger: new Logger("
|
30
|
+
logger: new Logger("InteropXContract::ProccessBridgeRequestEvents"),
|
64
31
|
})
|
65
32
|
this.chainId = chainId;
|
66
33
|
}
|
@@ -71,13 +38,11 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
71
38
|
const transaction = await Transaction.findOne({
|
72
39
|
where: {
|
73
40
|
status: 'pending',
|
74
|
-
sourceStatus: '
|
75
|
-
targetStatus: 'uninitialised',
|
76
|
-
action: 'withdraw',
|
41
|
+
sourceStatus: 'uninitialised',
|
77
42
|
sourceCreatedAt: {
|
78
43
|
[Op.gte]: new Date(Date.now() - 12 * 60 * 60 * 1000),
|
79
44
|
},
|
80
|
-
|
45
|
+
sourceDelayUntil: {
|
81
46
|
[Op.or]: {
|
82
47
|
[Op.is]: null,
|
83
48
|
[Op.lt]: new Date(),
|
@@ -95,52 +60,53 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
95
60
|
}
|
96
61
|
|
97
62
|
console.log(`Processing transaction ${transaction.transactionHash}`);
|
98
|
-
|
63
|
+
|
99
64
|
transaction.targetStatus = 'pending';
|
100
65
|
await transaction.save();
|
101
66
|
|
102
|
-
|
103
|
-
|
104
|
-
const targetChainProvider = new ethers.providers.JsonRpcProvider(
|
105
|
-
getRpcProviderUrl(transaction.targetChainId as ChainId)
|
106
|
-
);
|
67
|
+
const ownersThreshold = await this.safeContract.getThreshold();
|
68
|
+
await wait(10000);
|
107
69
|
|
108
|
-
const targetWallet = new ethers.Wallet(config.privateKey!, targetChainProvider);
|
109
70
|
|
110
|
-
|
71
|
+
let data, logs = [];
|
111
72
|
|
73
|
+
try {
|
74
|
+
({ data, logs } = await buildGnosisAction(transaction));
|
112
75
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
76
|
+
} catch (error) {
|
77
|
+
console.log(error);
|
78
|
+
transaction.sourceStatus = 'failed';
|
79
|
+
transaction.sourceErrors = [error.message];
|
80
|
+
transaction.targetStatus = 'failed';
|
118
81
|
|
119
|
-
|
120
|
-
|
82
|
+
transaction.status = 'failed'
|
83
|
+
await transaction.save();
|
84
|
+
protocol.sendTransaction(transaction)
|
85
|
+
return;
|
86
|
+
}
|
121
87
|
|
122
88
|
let gnosisTx = await generateGnosisTransaction({
|
123
89
|
baseGas: "0",
|
124
|
-
data
|
90
|
+
data,
|
125
91
|
gasPrice: "0",
|
126
92
|
gasToken: "0x0000000000000000000000000000000000000000",
|
127
93
|
nonce: '0',
|
128
94
|
operation: "1",
|
129
95
|
refundReceiver: "0x0000000000000000000000000000000000000000",
|
130
|
-
safeAddress:
|
96
|
+
safeAddress: this.safeContractAddress,
|
131
97
|
safeTxGas: "79668",
|
132
|
-
to: addresses[transaction.
|
98
|
+
to: addresses[transaction.sourceChainId].multisend,
|
133
99
|
value: "0",
|
134
|
-
}, safeContract);
|
100
|
+
}, this.safeContract);
|
135
101
|
|
136
|
-
const owners = await safeContract.getOwners().then(owners => owners.map(owner => owner.toLowerCase()));
|
102
|
+
const owners = await this.safeContract.getOwners().then(owners => owners.map(owner => owner.toLowerCase()));
|
137
103
|
|
138
104
|
const ownerPeerIds = peerPool.activePeers.filter(peer => owners.includes(peer.publicAddress.toLowerCase())).map(peer => peer.id)
|
139
105
|
|
140
106
|
console.log(`Collecting signatures for execution ${transaction.transactionHash}`)
|
141
107
|
|
142
108
|
console.log(ownerPeerIds);
|
143
|
-
|
109
|
+
|
144
110
|
const signatures = await protocol.requestSignatures({
|
145
111
|
type: 'source',
|
146
112
|
transactionHash: transaction.transactionHash,
|
@@ -155,18 +121,17 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
155
121
|
|
156
122
|
if (validSignatures.length === 0 || ownersThreshold.gt(validSignatures.length)) {
|
157
123
|
await transaction.save();
|
158
|
-
transaction.
|
159
|
-
transaction.
|
124
|
+
transaction.sourceDelayUntil = new Date(Date.now() + 30 * 1000);
|
125
|
+
transaction.sourceStatus = 'uninitialised'
|
160
126
|
|
161
127
|
await transaction.save();
|
162
128
|
const errorMessage = signatures.find(s => !!s.error)?.error;
|
163
129
|
throw new Error(`Not enough signatures` + (errorMessage ? `: ${errorMessage}` : ''));
|
164
130
|
}
|
165
131
|
|
166
|
-
|
167
132
|
console.log(`Executing transaction for execution ${transaction.transactionHash}`)
|
168
133
|
|
169
|
-
const { data: txData } = await safeContract.populateTransaction.execTransaction(
|
134
|
+
const { data: txData } = await this.safeContract.populateTransaction.execTransaction(
|
170
135
|
gnosisTx.to,
|
171
136
|
gnosisTx.value,
|
172
137
|
gnosisTx.data,
|
@@ -179,18 +144,10 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
179
144
|
buildSignatureBytes(validSignatures)
|
180
145
|
);
|
181
146
|
|
182
|
-
|
183
|
-
from:
|
184
|
-
gasPrice: BigNumber.from(120 * 10 ** 9)
|
185
|
-
to:
|
186
|
-
data: txData,
|
187
|
-
})
|
188
|
-
|
189
|
-
|
190
|
-
const txSent = await targetWallet.sendTransaction({
|
191
|
-
from: targetWallet.address,
|
192
|
-
gasPrice: BigNumber.from(120 * 10 ** 9),
|
193
|
-
to: safeAddress,
|
147
|
+
const txSent = await this.sourceWallet.sendTransaction({
|
148
|
+
from: this.sourceWallet.address,
|
149
|
+
gasPrice: ethers.BigNumber.from(120 * 10 ** 9),
|
150
|
+
to: this.safeContractAddress,
|
194
151
|
data: txData,
|
195
152
|
})
|
196
153
|
|
@@ -200,7 +157,7 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
200
157
|
|
201
158
|
receipt.logs.forEach((log) => {
|
202
159
|
try {
|
203
|
-
parsedLogs.push(safeContract.interface.parseLog(log));
|
160
|
+
parsedLogs.push(this.safeContract.interface.parseLog(log));
|
204
161
|
} catch (e) { }
|
205
162
|
});
|
206
163
|
|
@@ -208,6 +165,7 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
208
165
|
console.log('ExecutionSuccess')
|
209
166
|
transaction.targetStatus = 'success'
|
210
167
|
transaction.targetTransactionHash = txSent.hash
|
168
|
+
transaction.targetLogs = logs;
|
211
169
|
transaction.status = 'success'
|
212
170
|
await transaction.save();
|
213
171
|
} else {
|
@@ -217,17 +175,34 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
217
175
|
transaction.status = 'failed'
|
218
176
|
await transaction.save();
|
219
177
|
}
|
178
|
+
|
179
|
+
protocol.sendTransaction(transaction)
|
220
180
|
}
|
221
181
|
|
222
182
|
async start(): Promise<void> {
|
223
|
-
this.
|
183
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
224
184
|
|
225
185
|
this.provider = new ethers.providers.JsonRpcProvider(
|
226
186
|
getRpcProviderUrl(this.chainId)
|
227
187
|
);
|
228
188
|
|
189
|
+
this.sourceWallet = new ethers.Wallet(config.privateKey!, this.provider);
|
190
|
+
|
191
|
+
this.contract = getContract<InteropXContract>(
|
192
|
+
this.contractAddress,
|
193
|
+
abi.interopXContract,
|
194
|
+
this.sourceWallet
|
195
|
+
);
|
196
|
+
|
197
|
+
this.safeContractAddress = addresses[this.chainId].gnosisSafe;
|
198
|
+
this.safeContract = getContract<GnosisSafe>(
|
199
|
+
this.safeContractAddress,
|
200
|
+
abi.gnosisSafe,
|
201
|
+
this.sourceWallet
|
202
|
+
);
|
203
|
+
|
229
204
|
await super.start()
|
230
205
|
}
|
231
206
|
}
|
232
207
|
|
233
|
-
export default
|
208
|
+
export default ProccessBridgeRequestEvents;
|
@@ -0,0 +1,116 @@
|
|
1
|
+
import { BaseTask } from "../BaseTask";
|
2
|
+
import Logger from '@/logger';
|
3
|
+
import { ethers } from "ethers";
|
4
|
+
import abi from "@/abi";
|
5
|
+
import { Transaction } from "@/db";
|
6
|
+
import { generateInteropTransactionHash, getContract, getRpcProviderUrl } from "@/utils";
|
7
|
+
import { addresses } from "@/constants";
|
8
|
+
import { ChainId } from "@/types";
|
9
|
+
import config from "@/config";
|
10
|
+
import { InteropXContract } from "@/typechain";
|
11
|
+
|
12
|
+
class SyncBridgeRequestEvents extends BaseTask {
|
13
|
+
contractAddress: string;
|
14
|
+
provider: ethers.providers.JsonRpcProvider;
|
15
|
+
contract: InteropXContract;
|
16
|
+
chainId: ChainId;
|
17
|
+
|
18
|
+
constructor({ chainId }: { chainId: ChainId }) {
|
19
|
+
super({
|
20
|
+
logger: new Logger("InteropXContract::SyncBridgeRequestEvents"),
|
21
|
+
})
|
22
|
+
this.chainId = chainId;
|
23
|
+
}
|
24
|
+
|
25
|
+
async pollHandler() {
|
26
|
+
const currentBlock = await this.provider.getBlockNumber();
|
27
|
+
|
28
|
+
const events = await this.contract.queryFilter(
|
29
|
+
this.contract.filters.LogBridgeRequest(),
|
30
|
+
currentBlock - 2000,
|
31
|
+
currentBlock,
|
32
|
+
);
|
33
|
+
|
34
|
+
let processedEvents = 0;
|
35
|
+
|
36
|
+
for (const event of events) {
|
37
|
+
|
38
|
+
try {
|
39
|
+
if (!event.args) {
|
40
|
+
continue;
|
41
|
+
}
|
42
|
+
|
43
|
+
const { bridger, position, sourceChainId, targetChainId, metadata } = event.args;
|
44
|
+
|
45
|
+
const uniqueIdentifier = {
|
46
|
+
action: 'withdraw', //todo
|
47
|
+
bridger,
|
48
|
+
requestTransactionHash: event.transactionHash,
|
49
|
+
sourceChainId: sourceChainId.toNumber(),
|
50
|
+
targetChainId: targetChainId.toNumber(),
|
51
|
+
}
|
52
|
+
|
53
|
+
let transactionHash = generateInteropTransactionHash(uniqueIdentifier);
|
54
|
+
|
55
|
+
const transaction = await Transaction.findOne({ where: { transactionHash } });
|
56
|
+
|
57
|
+
if (transaction) {
|
58
|
+
return;
|
59
|
+
}
|
60
|
+
|
61
|
+
await Transaction.create({
|
62
|
+
transactionHash,
|
63
|
+
...uniqueIdentifier,
|
64
|
+
position,
|
65
|
+
metadata,
|
66
|
+
requestBlockNumber: event.blockNumber,
|
67
|
+
requestEvent: {
|
68
|
+
bridger,
|
69
|
+
position: {
|
70
|
+
withdraw: position.withdraw.map((v) => ({
|
71
|
+
sourceToken: v.sourceToken,
|
72
|
+
targetToken: v.targetToken,
|
73
|
+
amount: v.amount.toString()
|
74
|
+
})),
|
75
|
+
supply: position.supply.map((v) => ({
|
76
|
+
sourceToken: v.sourceToken,
|
77
|
+
targetToken: v.targetToken,
|
78
|
+
amount: v.amount.toString()
|
79
|
+
})),
|
80
|
+
},
|
81
|
+
sourceChainId: sourceChainId.toNumber(),
|
82
|
+
targetChainId: targetChainId.toNumber(),
|
83
|
+
metadata,
|
84
|
+
}
|
85
|
+
})
|
86
|
+
|
87
|
+
this.logger.info(
|
88
|
+
`New bridge request received: ${transactionHash} `
|
89
|
+
);
|
90
|
+
} catch (error) {
|
91
|
+
this.logger.error(error);
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
if (processedEvents > 0)
|
96
|
+
this.logger.info(`${processedEvents} events processed`);
|
97
|
+
}
|
98
|
+
|
99
|
+
async start(): Promise<void> {
|
100
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
101
|
+
|
102
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
103
|
+
getRpcProviderUrl(this.chainId)
|
104
|
+
);
|
105
|
+
|
106
|
+
this.contract = getContract<InteropXContract>(
|
107
|
+
this.contractAddress,
|
108
|
+
abi.interopXContract,
|
109
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
110
|
+
);
|
111
|
+
|
112
|
+
await super.start()
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
export default SyncBridgeRequestEvents;
|
@@ -0,0 +1,67 @@
|
|
1
|
+
import { BaseTask } from "../BaseTask";
|
2
|
+
import Logger from '@/logger';
|
3
|
+
import config from "@/config";
|
4
|
+
import { peerPool, protocol } from "@/net";
|
5
|
+
import { Transaction } from "@/db";
|
6
|
+
import { Op } from "sequelize";
|
7
|
+
|
8
|
+
class SyncTransactionStatusTask extends BaseTask {
|
9
|
+
pollIntervalMs: number = 60 * 1000
|
10
|
+
exceptLeadNode: boolean = true;
|
11
|
+
|
12
|
+
constructor() {
|
13
|
+
super({
|
14
|
+
logger: new Logger("SyncTransactionStatusTask"),
|
15
|
+
})
|
16
|
+
}
|
17
|
+
|
18
|
+
async pollHandler() {
|
19
|
+
// if transaction is pending for more than 1 hour, check lead node for status
|
20
|
+
const leadNode = peerPool.getLeadPeer();
|
21
|
+
|
22
|
+
if (!leadNode) {
|
23
|
+
return;
|
24
|
+
}
|
25
|
+
|
26
|
+
const transaction = await Transaction.findOne({
|
27
|
+
where: {
|
28
|
+
status: 'pending',
|
29
|
+
sourceCreatedAt: {
|
30
|
+
[Op.gte]: new Date(Date.now() - 60 * 60 * 1000),
|
31
|
+
},
|
32
|
+
}
|
33
|
+
})
|
34
|
+
|
35
|
+
if (!transaction) {
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
|
39
|
+
this.logger.info(`Requesting transaction status for ${transaction.transactionHash}`)
|
40
|
+
|
41
|
+
const transactionStatus = await protocol.requestTransactionStatus(transaction.transactionHash, leadNode.id);
|
42
|
+
|
43
|
+
if (!transactionStatus) {
|
44
|
+
return;
|
45
|
+
}
|
46
|
+
|
47
|
+
this.logger.info(`Received transaction status for ${transaction.transactionHash}`)
|
48
|
+
|
49
|
+
transaction.sourceStatus = transactionStatus.sourceStatus
|
50
|
+
transaction.sourceTransactionHash = transactionStatus.sourceTransactionHash
|
51
|
+
transaction.sourceErrors = transactionStatus.sourceErrors
|
52
|
+
transaction.sourceLogs = transactionStatus.sourceLogs
|
53
|
+
|
54
|
+
transaction.targetStatus = transactionStatus.targetStatus
|
55
|
+
transaction.targetTransactionHash = transactionStatus.targetTransactionHash
|
56
|
+
transaction.targetErrors = transactionStatus.targetErrors
|
57
|
+
transaction.targetLogs = transactionStatus.targetLogs
|
58
|
+
|
59
|
+
transaction.status = transactionStatus.status
|
60
|
+
|
61
|
+
await transaction.save()
|
62
|
+
|
63
|
+
this.logger.info(`Updated transaction status for ${transaction.transactionHash}`)
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
export default SyncTransactionStatusTask;
|
package/src/tasks/index.ts
CHANGED
@@ -1,32 +1,24 @@
|
|
1
1
|
import { BaseTask } from "./BaseTask";
|
2
|
-
import
|
3
|
-
import InteropXGatewaySyncDepositEvents from "./InteropXGateway/SyncDepositEvents";
|
2
|
+
import SyncTransactionStatusTask from "./Transactions/SyncTransactionStatusTask";
|
4
3
|
|
5
|
-
import InteropBridgeSyncWithdrawEvents from "./InteropBridge/SyncWithdrawEvents";
|
6
|
-
import InteropBridgeProcessWithdrawEvents from "./InteropBridge/ProcessWithdrawEvents";
|
7
4
|
import AutoUpdateTask from "./AutoUpdateTask";
|
8
5
|
|
6
|
+
import SyncBridgeRequestEvents from "./InteropXContract/SyncBridgeRequestEvents";
|
7
|
+
import ProccessBridgeRequestEvents from "./InteropXContract/ProcessBridgeRequestEvents";
|
8
|
+
|
9
9
|
export class Tasks {
|
10
10
|
|
11
11
|
tasks: BaseTask[] = [
|
12
|
+
// new SyncTransactionStatusTask(),
|
12
13
|
new AutoUpdateTask(),
|
13
14
|
|
14
|
-
|
15
|
-
chainId: 43114
|
16
|
-
}),
|
17
|
-
|
18
|
-
new InteropXGatewayProcessDepositEvents({
|
19
|
-
chainId: 43114
|
20
|
-
}),
|
15
|
+
// InteropXContract
|
21
16
|
|
22
|
-
new
|
23
|
-
|
24
|
-
itokenAddress: '0xEab02fe1F016eE3e4106c1C6aad35FeEe657268E',
|
25
|
-
}),
|
17
|
+
new SyncBridgeRequestEvents({ chainId: 137 }),
|
18
|
+
new SyncBridgeRequestEvents({ chainId: 43114 }),
|
26
19
|
|
27
|
-
new
|
28
|
-
|
29
|
-
})
|
20
|
+
new ProccessBridgeRequestEvents({ chainId: 137 }),
|
21
|
+
new ProccessBridgeRequestEvents({ chainId: 43114 }),
|
30
22
|
];
|
31
23
|
|
32
24
|
async start() {
|