@instadapp/interop-x 0.0.0-dev.dc4f10a → 0.0.0-dev.de23e71
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 +6 -5
- package/dist/src/abi/interopBridgeToken.json +21 -9
- package/dist/src/abi/interopXGateway.json +11 -11
- package/dist/src/alias.js +10 -0
- package/dist/src/api/index.js +6 -3
- package/dist/src/config/index.js +11 -1
- package/dist/src/constants/addresses.js +1 -1
- package/dist/src/constants/itokens.js +1 -1
- package/dist/src/db/models/transaction.js +8 -0
- package/dist/src/gnosis/actions/deposit.js +48 -0
- package/dist/src/gnosis/actions/index.js +11 -0
- package/dist/src/gnosis/actions/withdraw.js +50 -0
- package/dist/src/gnosis/index.js +20 -0
- package/dist/src/index.js +72 -23
- package/dist/src/net/peer/index.js +2 -1
- package/dist/src/net/pool/index.js +18 -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 +51 -1
- package/dist/src/tasks/AutoUpdateTask.js +70 -0
- package/dist/src/tasks/BaseTask.js +11 -3
- package/dist/src/tasks/InteropBridge/ProcessWithdrawEvents.js +19 -4
- package/dist/src/tasks/InteropBridge/{SyncWithdrawEvents.js → SyncBurnEvents.js} +10 -9
- package/dist/src/tasks/InteropBridge/SyncMintEvents.js +67 -0
- package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +19 -2
- package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +2 -3
- package/dist/src/tasks/InteropXGateway/SyncWithdrawtEvents.js +72 -0
- package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +55 -0
- package/dist/src/tasks/index.js +19 -4
- package/dist/src/typechain/factories/InteropBridgeToken__factory.js +23 -11
- package/dist/src/typechain/factories/InteropXGateway__factory.js +14 -14
- package/dist/src/utils/index.js +19 -85
- package/package.json +6 -5
- package/src/abi/interopBridgeToken.json +21 -9
- package/src/abi/interopXGateway.json +11 -11
- package/src/alias.ts +6 -0
- package/src/api/index.ts +5 -2
- package/src/config/index.ts +11 -1
- package/src/constants/addresses.ts +1 -1
- package/src/constants/itokens.ts +1 -1
- package/src/db/models/transaction.ts +10 -0
- package/src/gnosis/actions/deposit.ts +63 -0
- package/src/gnosis/actions/index.ts +7 -0
- package/src/gnosis/actions/withdraw.ts +67 -0
- package/src/gnosis/index.ts +19 -0
- package/src/index.ts +93 -25
- package/src/net/peer/index.ts +2 -1
- package/src/net/pool/index.ts +25 -5
- package/src/net/protocol/dial/SignatureDialProtocol.ts +5 -11
- package/src/net/protocol/dial/TransactionStatusDialProtocol.ts +33 -0
- package/src/net/protocol/index.ts +67 -1
- package/src/tasks/AutoUpdateTask.ts +82 -0
- package/src/tasks/BaseTask.ts +13 -3
- package/src/tasks/InteropBridge/ProcessWithdrawEvents.ts +26 -18
- package/src/tasks/InteropBridge/{SyncWithdrawEvents.ts → SyncBurnEvents.ts} +13 -15
- package/src/tasks/InteropBridge/SyncMintEvents.ts +99 -0
- package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +26 -7
- package/src/tasks/InteropXGateway/SyncDepositEvents.ts +2 -4
- package/src/tasks/InteropXGateway/SyncWithdrawtEvents.ts +105 -0
- package/src/tasks/Transactions/SyncTransactionStatusTask.ts +67 -0
- package/src/tasks/index.ts +28 -4
- package/src/typechain/InteropBridgeToken.ts +23 -17
- package/src/typechain/InteropXGateway.ts +13 -13
- package/src/typechain/factories/InteropBridgeToken__factory.ts +23 -11
- package/src/typechain/factories/InteropXGateway__factory.ts +14 -14
- package/src/utils/index.ts +22 -125
- package/tsconfig.json +7 -2
@@ -3,19 +3,20 @@ import Logger from '@/logger';
|
|
3
3
|
import { BigNumber, ethers } from "ethers";
|
4
4
|
import abi from "@/abi";
|
5
5
|
import { Transaction } from "@/db";
|
6
|
-
import {
|
6
|
+
import { buildSignatureBytes, getContract, getRpcProviderUrl, Signature } from "@/utils";
|
7
7
|
import { addresses } from "@/constants";
|
8
8
|
import { ChainId } from "@/types";
|
9
9
|
import config from "@/config";
|
10
|
-
import { GnosisSafe
|
10
|
+
import { GnosisSafe } from "@/typechain";
|
11
11
|
import { Op } from "sequelize";
|
12
12
|
import wait from "waait";
|
13
13
|
import { peerPool, protocol } from "@/net";
|
14
14
|
import { LogDescription } from "ethers/lib/utils";
|
15
|
+
import { buildGnosisAction } from "@/gnosis";
|
15
16
|
|
16
17
|
const generateGnosisTransaction = async (transactionData: any, safeContract: GnosisSafe) => {
|
17
18
|
console.log(transactionData);
|
18
|
-
|
19
|
+
|
19
20
|
let isExecuted = await safeContract.dataHashes(
|
20
21
|
await safeContract.getTransactionHash(
|
21
22
|
transactionData.to,
|
@@ -54,9 +55,7 @@ const generateGnosisTransaction = async (transactionData: any, safeContract: Gno
|
|
54
55
|
}
|
55
56
|
|
56
57
|
class ProcessWithdrawEvents extends BaseTask {
|
57
|
-
contractAddress: string;
|
58
58
|
provider: ethers.providers.JsonRpcProvider;
|
59
|
-
contract: InteropXGateway;
|
60
59
|
chainId: ChainId;
|
61
60
|
leadNodeOnly = true
|
62
61
|
|
@@ -97,7 +96,7 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
97
96
|
}
|
98
97
|
|
99
98
|
console.log(`Processing transaction ${transaction.transactionHash}`);
|
100
|
-
|
99
|
+
|
101
100
|
transaction.targetStatus = 'pending';
|
102
101
|
await transaction.save();
|
103
102
|
|
@@ -121,9 +120,23 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
121
120
|
const ownersThreshold = await safeContract.getThreshold();
|
122
121
|
await wait(10000);
|
123
122
|
|
123
|
+
let data, logs = [];
|
124
|
+
|
125
|
+
try {
|
126
|
+
({ data, logs } = await buildGnosisAction(transaction));
|
127
|
+
} catch (error) {
|
128
|
+
console.log(error);
|
129
|
+
transaction.targetStatus = 'failed';
|
130
|
+
transaction.targetErrors = [error.message];
|
131
|
+
transaction.status = 'failed'
|
132
|
+
await transaction.save();
|
133
|
+
protocol.sendTransaction(transaction)
|
134
|
+
return;
|
135
|
+
}
|
136
|
+
|
124
137
|
let gnosisTx = await generateGnosisTransaction({
|
125
138
|
baseGas: "0",
|
126
|
-
data
|
139
|
+
data,
|
127
140
|
gasPrice: "0",
|
128
141
|
gasToken: "0x0000000000000000000000000000000000000000",
|
129
142
|
nonce: '0',
|
@@ -142,7 +155,7 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
142
155
|
console.log(`Collecting signatures for execution ${transaction.transactionHash}`)
|
143
156
|
|
144
157
|
console.log(ownerPeerIds);
|
145
|
-
|
158
|
+
|
146
159
|
const signatures = await protocol.requestSignatures({
|
147
160
|
type: 'source',
|
148
161
|
transactionHash: transaction.transactionHash,
|
@@ -209,31 +222,26 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
209
222
|
if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
|
210
223
|
console.log('ExecutionSuccess')
|
211
224
|
transaction.targetStatus = 'success'
|
225
|
+
transaction.targetTransactionHash = txSent.hash
|
226
|
+
transaction.targetLogs = logs
|
212
227
|
transaction.status = 'success'
|
213
228
|
await transaction.save();
|
214
229
|
} else {
|
215
230
|
console.log('ExecutionFailure')
|
216
231
|
transaction.targetStatus = 'failed'
|
232
|
+
transaction.targetTransactionHash = txSent.hash
|
217
233
|
transaction.status = 'failed'
|
218
234
|
await transaction.save();
|
219
235
|
}
|
236
|
+
|
237
|
+
protocol.sendTransaction(transaction)
|
220
238
|
}
|
221
239
|
|
222
240
|
async start(): Promise<void> {
|
223
|
-
this.logger.info(`Starting execution watcher on interop chain`);
|
224
|
-
|
225
|
-
this.contractAddress = addresses[this.chainId].interopXGateway;
|
226
|
-
|
227
241
|
this.provider = new ethers.providers.JsonRpcProvider(
|
228
242
|
getRpcProviderUrl(this.chainId)
|
229
243
|
);
|
230
244
|
|
231
|
-
this.contract = getContract<InteropXGateway>(
|
232
|
-
this.contractAddress,
|
233
|
-
abi.interopXGateway,
|
234
|
-
new ethers.Wallet(config.privateKey!, this.provider)
|
235
|
-
);
|
236
|
-
|
237
245
|
await super.start()
|
238
246
|
}
|
239
247
|
}
|
@@ -8,7 +8,7 @@ import { ChainId } from "@/types";
|
|
8
8
|
import config from "@/config";
|
9
9
|
import { InteropBridgeToken } from "@/typechain";
|
10
10
|
|
11
|
-
class
|
11
|
+
class SyncBurnEvents extends BaseTask {
|
12
12
|
contractAddress: string;
|
13
13
|
provider: ethers.providers.JsonRpcProvider;
|
14
14
|
contract: InteropBridgeToken;
|
@@ -17,7 +17,7 @@ class SyncWithdrawEvents extends BaseTask {
|
|
17
17
|
|
18
18
|
constructor({ chainId, itokenAddress }: { chainId: ChainId, itokenAddress: string }) {
|
19
19
|
super({
|
20
|
-
logger: new Logger("InteropBridgeToken::
|
20
|
+
logger: new Logger("InteropBridgeToken::SyncBurnEvents"),
|
21
21
|
})
|
22
22
|
this.chainId = chainId;
|
23
23
|
this.itokenAddress = itokenAddress;
|
@@ -41,13 +41,13 @@ class SyncWithdrawEvents extends BaseTask {
|
|
41
41
|
continue;
|
42
42
|
}
|
43
43
|
|
44
|
-
const { to, amount,
|
44
|
+
const { to, amount, sourceChainId, targetChainId } = event.args;
|
45
45
|
|
46
46
|
const uniqueIdentifier = {
|
47
47
|
action: 'withdraw',
|
48
48
|
submitTransactionHash: event.transactionHash,
|
49
|
-
sourceChainId:
|
50
|
-
targetChainId:
|
49
|
+
sourceChainId: sourceChainId,
|
50
|
+
targetChainId: targetChainId,
|
51
51
|
}
|
52
52
|
|
53
53
|
if (await Transaction.findOne({ where: uniqueIdentifier })) {
|
@@ -62,7 +62,6 @@ class SyncWithdrawEvents extends BaseTask {
|
|
62
62
|
from: tx.from,
|
63
63
|
to,
|
64
64
|
|
65
|
-
|
66
65
|
submitTransactionHash: event.transactionHash,
|
67
66
|
submitBlockNumber: event.blockNumber,
|
68
67
|
|
@@ -70,21 +69,22 @@ class SyncWithdrawEvents extends BaseTask {
|
|
70
69
|
sourceTransactionHash: event.transactionHash,
|
71
70
|
sourceBlockNumber: event.blockNumber,
|
72
71
|
sourceStatus: "success",
|
73
|
-
|
74
72
|
targetStatus: "uninitialised",
|
75
73
|
|
76
74
|
submitEvent: {
|
77
|
-
to,
|
75
|
+
to,
|
78
76
|
amount: amount.toString(),
|
79
77
|
itoken: this.itokenAddress,
|
80
|
-
|
78
|
+
sourceChainId: sourceChainId,
|
79
|
+
targetChainId: targetChainId,
|
81
80
|
},
|
82
81
|
|
83
82
|
sourceEvent: {
|
84
|
-
to,
|
85
|
-
amount: amount.toString(),
|
83
|
+
to,
|
84
|
+
amount: amount.toString(),
|
86
85
|
itoken: this.itokenAddress,
|
87
|
-
|
86
|
+
sourceChainId: sourceChainId,
|
87
|
+
targetChainId: targetChainId,
|
88
88
|
},
|
89
89
|
status: "pending",
|
90
90
|
})
|
@@ -102,8 +102,6 @@ class SyncWithdrawEvents extends BaseTask {
|
|
102
102
|
}
|
103
103
|
|
104
104
|
async start(): Promise<void> {
|
105
|
-
this.logger.info(`Starting execution watcher on interop chain`);
|
106
|
-
|
107
105
|
this.provider = new ethers.providers.JsonRpcProvider(
|
108
106
|
getRpcProviderUrl(this.chainId)
|
109
107
|
);
|
@@ -118,4 +116,4 @@ class SyncWithdrawEvents extends BaseTask {
|
|
118
116
|
}
|
119
117
|
}
|
120
118
|
|
121
|
-
export default
|
119
|
+
export default SyncBurnEvents;
|
@@ -0,0 +1,99 @@
|
|
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 { getContract, getRpcProviderUrl } from "@/utils";
|
7
|
+
import { ChainId } from "@/types";
|
8
|
+
import config from "@/config";
|
9
|
+
import { InteropBridgeToken } from "@/typechain";
|
10
|
+
|
11
|
+
class SyncMintEvents extends BaseTask {
|
12
|
+
contractAddress: string;
|
13
|
+
provider: ethers.providers.JsonRpcProvider;
|
14
|
+
contract: InteropBridgeToken;
|
15
|
+
chainId: ChainId;
|
16
|
+
itokenAddress: string;
|
17
|
+
|
18
|
+
constructor({ chainId, itokenAddress }: { chainId: ChainId, itokenAddress: string }) {
|
19
|
+
super({
|
20
|
+
logger: new Logger("InteropBridgeToken::SyncMintEvents"),
|
21
|
+
})
|
22
|
+
this.chainId = chainId;
|
23
|
+
this.itokenAddress = itokenAddress;
|
24
|
+
}
|
25
|
+
|
26
|
+
async pollHandler() {
|
27
|
+
const currentBlock = await this.provider.getBlockNumber();
|
28
|
+
|
29
|
+
const events = await this.contract.queryFilter(
|
30
|
+
this.contract.filters.Mint(),
|
31
|
+
currentBlock - 500,
|
32
|
+
currentBlock,
|
33
|
+
);
|
34
|
+
|
35
|
+
for (const event of events) {
|
36
|
+
|
37
|
+
try {
|
38
|
+
if (!event.args) {
|
39
|
+
continue;
|
40
|
+
}
|
41
|
+
|
42
|
+
const { sourceChainId, targetChainId, amount, to, submitTransactionHash } = event.args;
|
43
|
+
|
44
|
+
const uniqueIdentifier = {
|
45
|
+
action: 'deposit',
|
46
|
+
submitTransactionHash: submitTransactionHash,
|
47
|
+
sourceChainId: sourceChainId,
|
48
|
+
targetChainId: targetChainId,
|
49
|
+
|
50
|
+
targetEvent: null
|
51
|
+
}
|
52
|
+
|
53
|
+
const transaction = await Transaction.findOne({ where: uniqueIdentifier });
|
54
|
+
|
55
|
+
if(! transaction){
|
56
|
+
return;
|
57
|
+
}
|
58
|
+
|
59
|
+
const tx = await event.getTransaction()
|
60
|
+
|
61
|
+
transaction.targetStatus = 'success'
|
62
|
+
transaction.targetErrors = []
|
63
|
+
transaction.targetTransactionHash = tx.hash
|
64
|
+
transaction.targetEvent = {
|
65
|
+
sourceChainId,
|
66
|
+
targetChainId,
|
67
|
+
amount: amount.toString(),
|
68
|
+
to,
|
69
|
+
submitTransactionHash
|
70
|
+
}
|
71
|
+
transaction.status = 'success'
|
72
|
+
|
73
|
+
await transaction.save()
|
74
|
+
|
75
|
+
this.logger.info(
|
76
|
+
`Mint confirmation received: ${transaction.transactionHash} `
|
77
|
+
);
|
78
|
+
} catch (error) {
|
79
|
+
this.logger.error(error);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
async start(): Promise<void> {
|
85
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
86
|
+
getRpcProviderUrl(this.chainId)
|
87
|
+
);
|
88
|
+
|
89
|
+
this.contract = getContract<InteropBridgeToken>(
|
90
|
+
this.itokenAddress,
|
91
|
+
abi.interopBridgeToken,
|
92
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
93
|
+
);
|
94
|
+
|
95
|
+
await super.start()
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
export default SyncMintEvents;
|
@@ -3,7 +3,7 @@ import Logger from '@/logger';
|
|
3
3
|
import { BigNumber, ethers } from "ethers";
|
4
4
|
import abi from "@/abi";
|
5
5
|
import { Transaction } from "@/db";
|
6
|
-
import {
|
6
|
+
import { buildSignatureBytes, getContract, getRpcProviderUrl, Signature } from "@/utils";
|
7
7
|
import { addresses } from "@/constants";
|
8
8
|
import { ChainId } from "@/types";
|
9
9
|
import config from "@/config";
|
@@ -12,10 +12,11 @@ import { Op } from "sequelize";
|
|
12
12
|
import wait from "waait";
|
13
13
|
import { peerPool, protocol } from "@/net";
|
14
14
|
import { LogDescription } from "ethers/lib/utils";
|
15
|
+
import { buildGnosisAction } from "@/gnosis";
|
15
16
|
|
16
17
|
const generateGnosisTransaction = async (transactionData: any, safeContract: GnosisSafe) => {
|
17
18
|
console.log(transactionData);
|
18
|
-
|
19
|
+
|
19
20
|
let isExecuted = await safeContract.dataHashes(
|
20
21
|
await safeContract.getTransactionHash(
|
21
22
|
transactionData.to,
|
@@ -97,7 +98,7 @@ class ProcessDepositEvents extends BaseTask {
|
|
97
98
|
}
|
98
99
|
|
99
100
|
console.log(`Processing transaction ${transaction.transactionHash}`);
|
100
|
-
|
101
|
+
|
101
102
|
transaction.targetStatus = 'pending';
|
102
103
|
await transaction.save();
|
103
104
|
|
@@ -121,9 +122,24 @@ class ProcessDepositEvents extends BaseTask {
|
|
121
122
|
const ownersThreshold = await safeContract.getThreshold();
|
122
123
|
await wait(10000);
|
123
124
|
|
125
|
+
let data, logs = [];
|
126
|
+
|
127
|
+
try {
|
128
|
+
({ data, logs } = await buildGnosisAction(transaction));
|
129
|
+
|
130
|
+
} catch (error) {
|
131
|
+
console.log(error);
|
132
|
+
transaction.targetStatus = 'failed';
|
133
|
+
transaction.targetErrors = [error.message];
|
134
|
+
transaction.status = 'failed'
|
135
|
+
await transaction.save();
|
136
|
+
protocol.sendTransaction(transaction)
|
137
|
+
return;
|
138
|
+
}
|
139
|
+
|
124
140
|
let gnosisTx = await generateGnosisTransaction({
|
125
141
|
baseGas: "0",
|
126
|
-
data
|
142
|
+
data,
|
127
143
|
gasPrice: "0",
|
128
144
|
gasToken: "0x0000000000000000000000000000000000000000",
|
129
145
|
nonce: '0',
|
@@ -142,7 +158,7 @@ class ProcessDepositEvents extends BaseTask {
|
|
142
158
|
console.log(`Collecting signatures for execution ${transaction.transactionHash}`)
|
143
159
|
|
144
160
|
console.log(ownerPeerIds);
|
145
|
-
|
161
|
+
|
146
162
|
const signatures = await protocol.requestSignatures({
|
147
163
|
type: 'source',
|
148
164
|
transactionHash: transaction.transactionHash,
|
@@ -209,19 +225,22 @@ class ProcessDepositEvents extends BaseTask {
|
|
209
225
|
if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
|
210
226
|
console.log('ExecutionSuccess')
|
211
227
|
transaction.targetStatus = 'success'
|
228
|
+
transaction.targetTransactionHash = txSent.hash
|
229
|
+
transaction.targetLogs = logs;
|
212
230
|
transaction.status = 'success'
|
213
231
|
await transaction.save();
|
214
232
|
} else {
|
215
233
|
console.log('ExecutionFailure')
|
216
234
|
transaction.targetStatus = 'failed'
|
235
|
+
transaction.targetTransactionHash = txSent.hash
|
217
236
|
transaction.status = 'failed'
|
218
237
|
await transaction.save();
|
219
238
|
}
|
239
|
+
|
240
|
+
protocol.sendTransaction(transaction)
|
220
241
|
}
|
221
242
|
|
222
243
|
async start(): Promise<void> {
|
223
|
-
this.logger.info(`Starting execution watcher on interop chain`);
|
224
|
-
|
225
244
|
this.contractAddress = addresses[this.chainId].interopXGateway;
|
226
245
|
|
227
246
|
this.provider = new ethers.providers.JsonRpcProvider(
|
@@ -45,8 +45,8 @@ class SyncDepositEvents extends BaseTask {
|
|
45
45
|
const uniqueIdentifier = {
|
46
46
|
action: 'deposit',
|
47
47
|
submitTransactionHash: event.transactionHash,
|
48
|
-
sourceChainId: sourceChainId
|
49
|
-
targetChainId: targetChainId
|
48
|
+
sourceChainId: sourceChainId,
|
49
|
+
targetChainId: targetChainId,
|
50
50
|
}
|
51
51
|
|
52
52
|
if (await Transaction.findOne({ where: uniqueIdentifier })) {
|
@@ -105,8 +105,6 @@ class SyncDepositEvents extends BaseTask {
|
|
105
105
|
}
|
106
106
|
|
107
107
|
async start(): Promise<void> {
|
108
|
-
this.logger.info(`Starting execution watcher on interop chain`);
|
109
|
-
|
110
108
|
this.contractAddress = addresses[this.chainId].interopXGateway;
|
111
109
|
|
112
110
|
this.provider = new ethers.providers.JsonRpcProvider(
|
@@ -0,0 +1,105 @@
|
|
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 { getContract, getRpcProviderUrl } from "@/utils";
|
7
|
+
import { addresses } from "@/constants";
|
8
|
+
import { ChainId } from "@/types";
|
9
|
+
import config from "@/config";
|
10
|
+
import { InteropXGateway } from "@/typechain";
|
11
|
+
|
12
|
+
class SyncWithdrawEvents extends BaseTask {
|
13
|
+
contractAddress: string;
|
14
|
+
provider: ethers.providers.JsonRpcProvider;
|
15
|
+
contract: InteropXGateway;
|
16
|
+
chainId: ChainId;
|
17
|
+
|
18
|
+
constructor({ chainId }: { chainId: ChainId }) {
|
19
|
+
super({
|
20
|
+
logger: new Logger("InteropXGateway::SyncWithdrawEvents"),
|
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.LogGatewayWithdraw(),
|
30
|
+
currentBlock - 500,
|
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 { user, token, amount, sourceChainId, targetChainId, transactionHash } = event.args;
|
44
|
+
|
45
|
+
const uniqueIdentifier = {
|
46
|
+
action: 'withdraw',
|
47
|
+
submitTransactionHash: transactionHash,
|
48
|
+
sourceChainId: sourceChainId,
|
49
|
+
targetChainId: targetChainId,
|
50
|
+
|
51
|
+
targetEvent: null
|
52
|
+
}
|
53
|
+
const transaction = await Transaction.findOne({ where: uniqueIdentifier });
|
54
|
+
|
55
|
+
if (!transaction) {
|
56
|
+
return;
|
57
|
+
}
|
58
|
+
|
59
|
+
const tx = await event.getTransaction()
|
60
|
+
|
61
|
+
transaction.targetStatus = 'success'
|
62
|
+
transaction.targetErrors = []
|
63
|
+
transaction.targetTransactionHash = tx.hash
|
64
|
+
transaction.targetEvent = {
|
65
|
+
user,
|
66
|
+
token,
|
67
|
+
amount: amount.toString(),
|
68
|
+
sourceChainId,
|
69
|
+
targetChainId,
|
70
|
+
transactionHash,
|
71
|
+
}
|
72
|
+
transaction.status = 'success'
|
73
|
+
|
74
|
+
await transaction.save()
|
75
|
+
|
76
|
+
this.logger.info(
|
77
|
+
`Witdraw confirmation received: ${transaction.transactionHash} `
|
78
|
+
);
|
79
|
+
} catch (error) {
|
80
|
+
this.logger.error(error);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
if (processedEvents > 0)
|
85
|
+
this.logger.info(`${processedEvents} events processed`);
|
86
|
+
}
|
87
|
+
|
88
|
+
async start(): Promise<void> {
|
89
|
+
this.contractAddress = addresses[this.chainId].interopXGateway;
|
90
|
+
|
91
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
92
|
+
getRpcProviderUrl(this.chainId)
|
93
|
+
);
|
94
|
+
|
95
|
+
this.contract = getContract<InteropXGateway>(
|
96
|
+
this.contractAddress,
|
97
|
+
abi.interopXGateway,
|
98
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
99
|
+
);
|
100
|
+
|
101
|
+
await super.start()
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
export default SyncWithdrawEvents;
|
@@ -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,13 +1,24 @@
|
|
1
1
|
import { BaseTask } from "./BaseTask";
|
2
2
|
import InteropXGatewayProcessDepositEvents from "./InteropXGateway/ProcessDepositEvents";
|
3
3
|
import InteropXGatewaySyncDepositEvents from "./InteropXGateway/SyncDepositEvents";
|
4
|
+
import InteropXGatewaySyncWithdrawEvents from "./InteropXGateway/SyncWithdrawtEvents";
|
4
5
|
|
5
|
-
import InteropBridgeSyncWithdrawEvents from "./InteropBridge/SyncWithdrawEvents";
|
6
6
|
import InteropBridgeProcessWithdrawEvents from "./InteropBridge/ProcessWithdrawEvents";
|
7
|
+
import InteropBridgeSyncBurnEvents from "./InteropBridge/SyncBurnEvents";
|
8
|
+
import InteropBridgeSyncMintEvents from "./InteropBridge/SyncMintEvents";
|
9
|
+
|
10
|
+
import SyncTransactionStatusTask from "./Transactions/SyncTransactionStatusTask";
|
11
|
+
|
12
|
+
import AutoUpdateTask from "./AutoUpdateTask";
|
7
13
|
|
8
14
|
export class Tasks {
|
9
15
|
|
10
16
|
tasks: BaseTask[] = [
|
17
|
+
new SyncTransactionStatusTask(),
|
18
|
+
new AutoUpdateTask(),
|
19
|
+
|
20
|
+
// InteropXGateway
|
21
|
+
|
11
22
|
new InteropXGatewaySyncDepositEvents({
|
12
23
|
chainId: 43114
|
13
24
|
}),
|
@@ -16,13 +27,26 @@ export class Tasks {
|
|
16
27
|
chainId: 43114
|
17
28
|
}),
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
|
31
|
+
new InteropXGatewaySyncWithdrawEvents({
|
32
|
+
chainId: 43114
|
22
33
|
}),
|
23
34
|
|
35
|
+
|
36
|
+
// InteropBridge
|
37
|
+
|
24
38
|
new InteropBridgeProcessWithdrawEvents({
|
25
39
|
chainId: 137,
|
40
|
+
}),
|
41
|
+
|
42
|
+
new InteropBridgeSyncMintEvents({
|
43
|
+
chainId: 137,
|
44
|
+
itokenAddress: '0x62c0045f3277e7067cacad3c8038eeabb1bd92d1',
|
45
|
+
}),
|
46
|
+
|
47
|
+
new InteropBridgeSyncBurnEvents({
|
48
|
+
chainId: 137,
|
49
|
+
itokenAddress: '0x62c0045f3277e7067cacad3c8038eeabb1bd92d1',
|
26
50
|
})
|
27
51
|
];
|
28
52
|
|