@instadapp/interop-x 0.0.0-dev.b70f25f → 0.0.0-dev.bfeca30
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 +14 -13
- package/dist/src/abi/index.js +2 -4
- package/dist/src/abi/interopXContract.json +454 -0
- package/dist/src/alias.js +10 -0
- package/dist/src/api/index.js +3 -0
- 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/constants/tokens.js +31 -1
- package/dist/src/db/models/transaction.js +27 -11
- package/dist/src/gnosis/actions/index.js +9 -0
- package/dist/src/gnosis/actions/withdraw/index.js +55 -0
- package/dist/src/gnosis/index.js +20 -0
- package/dist/src/index.js +34 -22
- package/dist/src/net/protocol/dial/SignatureDialProtocol.js +9 -10
- package/dist/src/net/protocol/dial/{SignatureDialProtocol.1.js → TransactionStatusDialProtocol.js} +2 -0
- package/dist/src/net/protocol/index.js +17 -7
- package/dist/src/tasks/AutoUpdateTask.js +34 -12
- package/dist/src/tasks/BaseTask.js +4 -0
- package/dist/src/tasks/{InteropXGateway/ProcessDepositEvents.js → InteropXContract/ProcessBridgeRequestEvents.js} +54 -51
- package/dist/src/tasks/InteropXContract/SyncBridgeCommittedEvents.js +92 -0
- package/dist/src/tasks/InteropXContract/SyncBridgeRequestEvents.js +78 -0
- package/dist/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.js +90 -0
- package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +2 -0
- package/dist/src/tasks/index.js +16 -19
- package/dist/src/typechain/{InteropBridgeToken.js → InteropXContract.js} +0 -0
- package/dist/src/typechain/factories/InteropXContract__factory.js +635 -0
- package/dist/src/typechain/factories/index.js +3 -5
- package/dist/src/typechain/index.js +3 -5
- package/dist/src/utils/index.js +37 -89
- package/package.json +14 -13
- package/src/abi/index.ts +2 -4
- package/src/abi/interopXContract.json +454 -0
- package/src/alias.ts +6 -0
- package/src/api/index.ts +3 -0
- package/src/config/index.ts +9 -1
- package/src/constants/addresses.ts +3 -3
- package/src/constants/index.ts +0 -1
- package/src/constants/tokens.ts +32 -2
- package/src/db/models/transaction.ts +76 -27
- package/src/gnosis/actions/index.ts +5 -0
- package/src/gnosis/actions/withdraw/index.ts +77 -0
- package/src/gnosis/index.ts +19 -0
- package/src/index.ts +47 -26
- package/src/net/protocol/dial/SignatureDialProtocol.ts +11 -13
- package/src/net/protocol/dial/{SignatureDialProtocol.1.ts → TransactionStatusDialProtocol.ts} +3 -1
- package/src/net/protocol/index.ts +17 -7
- package/src/tasks/AutoUpdateTask.ts +36 -15
- package/src/tasks/BaseTask.ts +5 -0
- package/src/tasks/{InteropBridge/ProcessWithdrawEvents.ts → InteropXContract/ProcessBridgeRequestEvents.ts} +79 -94
- package/src/tasks/InteropXContract/SyncBridgeCommittedEvents.ts +124 -0
- package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +115 -0
- package/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.ts +121 -0
- package/src/tasks/Transactions/SyncTransactionStatusTask.ts +2 -0
- package/src/tasks/index.ts +21 -20
- package/src/typechain/InteropXContract.ts +680 -0
- package/src/typechain/factories/InteropXContract__factory.ts +642 -0
- package/src/typechain/factories/index.ts +1 -2
- package/src/typechain/index.ts +2 -4
- package/src/utils/index.ts +75 -126
- 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 -146
- package/dist/src/tasks/InteropBridge/SyncWithdrawEvents.js +0 -69
- package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -74
- 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 -119
- package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -243
- package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -124
- 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,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,19 +38,17 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
71
38
|
const transaction = await Transaction.findOne({
|
72
39
|
where: {
|
73
40
|
status: 'pending',
|
74
|
-
sourceStatus: '
|
75
|
-
|
76
|
-
action: 'withdraw',
|
77
|
-
sourceCreatedAt: {
|
41
|
+
sourceStatus: 'uninitialised',
|
42
|
+
createdAt: {
|
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(),
|
84
49
|
}
|
85
50
|
},
|
86
|
-
|
51
|
+
requestBlockNumber: {
|
87
52
|
[Op.lt]: blockNumber - 12,
|
88
53
|
},
|
89
54
|
sourceChainId: this.chainId,
|
@@ -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, 'source'));
|
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,20 +144,15 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
179
144
|
buildSignatureBytes(validSignatures)
|
180
145
|
);
|
181
146
|
|
182
|
-
|
183
|
-
from:
|
184
|
-
gasPrice: BigNumber.from(120 * 10 ** 9)
|
185
|
-
to:
|
147
|
+
const txSent = await this.sourceWallet.sendTransaction({
|
148
|
+
from: this.sourceWallet.address,
|
149
|
+
gasPrice: ethers.BigNumber.from(120 * 10 ** 9),
|
150
|
+
to: this.safeContractAddress,
|
186
151
|
data: txData,
|
187
152
|
})
|
188
153
|
|
154
|
+
console.log(txSent);
|
189
155
|
|
190
|
-
const txSent = await targetWallet.sendTransaction({
|
191
|
-
from: targetWallet.address,
|
192
|
-
gasPrice: BigNumber.from(120 * 10 ** 9),
|
193
|
-
to: safeAddress,
|
194
|
-
data: txData,
|
195
|
-
})
|
196
156
|
|
197
157
|
const receipt = await txSent.wait();
|
198
158
|
|
@@ -200,32 +160,57 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
200
160
|
|
201
161
|
receipt.logs.forEach((log) => {
|
202
162
|
try {
|
203
|
-
parsedLogs.push(safeContract.interface.parseLog(log));
|
163
|
+
parsedLogs.push(this.safeContract.interface.parseLog(log));
|
204
164
|
} catch (e) { }
|
205
165
|
});
|
206
166
|
|
207
167
|
if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
|
208
168
|
console.log('ExecutionSuccess')
|
209
|
-
transaction.
|
210
|
-
|
169
|
+
transaction.sourceStatus = 'success'
|
170
|
+
if (txSent.blockNumber)
|
171
|
+
transaction.sourceBlockNumber = txSent.blockNumber;
|
172
|
+
transaction.sourceTransactionHash = txSent.hash
|
173
|
+
transaction.sourceLogs = logs;
|
211
174
|
transaction.status = 'success'
|
212
175
|
await transaction.save();
|
213
176
|
} else {
|
214
177
|
console.log('ExecutionFailure')
|
215
|
-
transaction.
|
216
|
-
|
178
|
+
transaction.sourceStatus = 'failed'
|
179
|
+
if (txSent.blockNumber)
|
180
|
+
transaction.sourceBlockNumber = txSent.blockNumber;
|
181
|
+
transaction.sourceTransactionHash = txSent.hash
|
182
|
+
transaction.sourceTransactionHash = txSent.hash
|
217
183
|
transaction.status = 'failed'
|
218
184
|
await transaction.save();
|
219
185
|
}
|
186
|
+
|
187
|
+
protocol.sendTransaction(transaction)
|
220
188
|
}
|
221
189
|
|
222
190
|
async start(): Promise<void> {
|
191
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
192
|
+
|
223
193
|
this.provider = new ethers.providers.JsonRpcProvider(
|
224
194
|
getRpcProviderUrl(this.chainId)
|
225
195
|
);
|
226
196
|
|
197
|
+
this.sourceWallet = new ethers.Wallet(config.privateKey!, this.provider);
|
198
|
+
|
199
|
+
this.contract = getContract<InteropXContract>(
|
200
|
+
this.contractAddress,
|
201
|
+
abi.interopXContract,
|
202
|
+
this.sourceWallet
|
203
|
+
);
|
204
|
+
|
205
|
+
this.safeContractAddress = addresses[this.chainId].gnosisSafe;
|
206
|
+
this.safeContract = getContract<GnosisSafe>(
|
207
|
+
this.safeContractAddress,
|
208
|
+
abi.gnosisSafe,
|
209
|
+
this.sourceWallet
|
210
|
+
);
|
211
|
+
|
227
212
|
await super.start()
|
228
213
|
}
|
229
214
|
}
|
230
215
|
|
231
|
-
export default
|
216
|
+
export default ProccessBridgeRequestEvents;
|
@@ -0,0 +1,124 @@
|
|
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
|
+
import { Op } from "sequelize";
|
12
|
+
|
13
|
+
class SyncBridgeCommittedEvents extends BaseTask {
|
14
|
+
contractAddress: string;
|
15
|
+
provider: ethers.providers.JsonRpcProvider;
|
16
|
+
contract: InteropXContract;
|
17
|
+
chainId: ChainId;
|
18
|
+
|
19
|
+
constructor({ chainId }: { chainId: ChainId }) {
|
20
|
+
super({
|
21
|
+
logger: new Logger("InteropXContract::SyncBridgeCommittedEvents"),
|
22
|
+
})
|
23
|
+
this.chainId = chainId;
|
24
|
+
}
|
25
|
+
|
26
|
+
async pollHandler() {
|
27
|
+
const currentBlock = await this.provider.getBlockNumber();
|
28
|
+
|
29
|
+
const events = await this.contract.queryFilter(
|
30
|
+
this.contract.filters.LogBridgeCommitted(),
|
31
|
+
currentBlock - 2000,
|
32
|
+
currentBlock,
|
33
|
+
);
|
34
|
+
|
35
|
+
let processedEvents = 0;
|
36
|
+
|
37
|
+
for (const event of events) {
|
38
|
+
|
39
|
+
try {
|
40
|
+
if (!event.args) {
|
41
|
+
continue;
|
42
|
+
}
|
43
|
+
|
44
|
+
const { actionId, bridger, position, sourceChainId, targetChainId, requestTransactionHash, metadata } = event.args;
|
45
|
+
|
46
|
+
const uniqueIdentifier = {
|
47
|
+
actionId,
|
48
|
+
bridger,
|
49
|
+
requestTransactionHash,
|
50
|
+
sourceChainId: sourceChainId,
|
51
|
+
targetChainId: targetChainId,
|
52
|
+
}
|
53
|
+
|
54
|
+
let transactionHash = generateInteropTransactionHash(uniqueIdentifier);
|
55
|
+
|
56
|
+
const transaction = await Transaction.findOne({
|
57
|
+
where: {
|
58
|
+
transactionHash,
|
59
|
+
committedEvent: {
|
60
|
+
[Op.eq]: null,
|
61
|
+
}
|
62
|
+
}
|
63
|
+
});
|
64
|
+
|
65
|
+
if (!transaction) {
|
66
|
+
continue;
|
67
|
+
}
|
68
|
+
transaction.targetStatus = 'success'
|
69
|
+
transaction.targetBlockNumber = event.blockNumber;
|
70
|
+
transaction.targetTransactionHash = event.transactionHash
|
71
|
+
transaction.committedEvent = {
|
72
|
+
actionId,
|
73
|
+
bridger,
|
74
|
+
position: {
|
75
|
+
withdraw: position.withdraw.map((v) => ({
|
76
|
+
sourceToken: v.sourceToken,
|
77
|
+
targetToken: v.targetToken,
|
78
|
+
amount: v.amount.toString()
|
79
|
+
})),
|
80
|
+
supply: position.supply.map((v) => ({
|
81
|
+
sourceToken: v.sourceToken,
|
82
|
+
targetToken: v.targetToken,
|
83
|
+
amount: v.amount.toString()
|
84
|
+
})),
|
85
|
+
},
|
86
|
+
sourceChainId: sourceChainId,
|
87
|
+
targetChainId: targetChainId,
|
88
|
+
metadata,
|
89
|
+
requestTransactionHash,
|
90
|
+
}
|
91
|
+
|
92
|
+
transaction.status = 'success';
|
93
|
+
await transaction.save()
|
94
|
+
|
95
|
+
this.logger.info(
|
96
|
+
`New bridge committed received: ${transactionHash} `
|
97
|
+
);
|
98
|
+
} catch (error) {
|
99
|
+
this.logger.error(error);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
if (processedEvents > 0)
|
104
|
+
this.logger.info(`${processedEvents} events processed`);
|
105
|
+
}
|
106
|
+
|
107
|
+
async start(): Promise<void> {
|
108
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
109
|
+
|
110
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
111
|
+
getRpcProviderUrl(this.chainId)
|
112
|
+
);
|
113
|
+
|
114
|
+
this.contract = getContract<InteropXContract>(
|
115
|
+
this.contractAddress,
|
116
|
+
abi.interopXContract,
|
117
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
118
|
+
);
|
119
|
+
|
120
|
+
await super.start()
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
export default SyncBridgeCommittedEvents;
|
@@ -0,0 +1,115 @@
|
|
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 { actionId, bridger, position, sourceChainId, targetChainId, metadata } = event.args;
|
44
|
+
|
45
|
+
const uniqueIdentifier = {
|
46
|
+
actionId,
|
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
|
+
continue;
|
59
|
+
}
|
60
|
+
|
61
|
+
await Transaction.create({
|
62
|
+
transactionHash,
|
63
|
+
...uniqueIdentifier,
|
64
|
+
requestBlockNumber: event.blockNumber,
|
65
|
+
requestEvent: {
|
66
|
+
actionId,
|
67
|
+
bridger,
|
68
|
+
position: {
|
69
|
+
withdraw: position.withdraw.map((v) => ({
|
70
|
+
sourceToken: v.sourceToken,
|
71
|
+
targetToken: v.targetToken,
|
72
|
+
amount: v.amount.toString()
|
73
|
+
})),
|
74
|
+
supply: position.supply.map((v) => ({
|
75
|
+
sourceToken: v.sourceToken,
|
76
|
+
targetToken: v.targetToken,
|
77
|
+
amount: v.amount.toString()
|
78
|
+
})),
|
79
|
+
},
|
80
|
+
sourceChainId: sourceChainId.toNumber(),
|
81
|
+
targetChainId: targetChainId.toNumber(),
|
82
|
+
metadata,
|
83
|
+
}
|
84
|
+
})
|
85
|
+
|
86
|
+
this.logger.info(
|
87
|
+
`New bridge request received: ${transactionHash} `
|
88
|
+
);
|
89
|
+
} catch (error) {
|
90
|
+
this.logger.error(error);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
if (processedEvents > 0)
|
95
|
+
this.logger.info(`${processedEvents} events processed`);
|
96
|
+
}
|
97
|
+
|
98
|
+
async start(): Promise<void> {
|
99
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
100
|
+
|
101
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
102
|
+
getRpcProviderUrl(this.chainId)
|
103
|
+
);
|
104
|
+
|
105
|
+
this.contract = getContract<InteropXContract>(
|
106
|
+
this.contractAddress,
|
107
|
+
abi.interopXContract,
|
108
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
109
|
+
);
|
110
|
+
|
111
|
+
await super.start()
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
export default SyncBridgeRequestEvents;
|
@@ -0,0 +1,121 @@
|
|
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
|
+
import { Op } from "sequelize";
|
12
|
+
|
13
|
+
class SyncBridgeRequestSentEvents extends BaseTask {
|
14
|
+
contractAddress: string;
|
15
|
+
provider: ethers.providers.JsonRpcProvider;
|
16
|
+
contract: InteropXContract;
|
17
|
+
chainId: ChainId;
|
18
|
+
|
19
|
+
constructor({ chainId }: { chainId: ChainId }) {
|
20
|
+
super({
|
21
|
+
logger: new Logger("InteropXContract::SyncBridgeRequestSentEvents"),
|
22
|
+
})
|
23
|
+
this.chainId = chainId;
|
24
|
+
}
|
25
|
+
|
26
|
+
async pollHandler() {
|
27
|
+
const currentBlock = await this.provider.getBlockNumber();
|
28
|
+
|
29
|
+
const events = await this.contract.queryFilter(
|
30
|
+
this.contract.filters.LogBridgeRequestSent(),
|
31
|
+
currentBlock - 2000,
|
32
|
+
currentBlock,
|
33
|
+
);
|
34
|
+
|
35
|
+
let processedEvents = 0;
|
36
|
+
|
37
|
+
for (const event of events) {
|
38
|
+
|
39
|
+
try {
|
40
|
+
if (!event.args) {
|
41
|
+
continue;
|
42
|
+
}
|
43
|
+
|
44
|
+
const { actionId, bridger, position, sourceChainId, targetChainId, requestTransactionHash, metadata } = event.args;
|
45
|
+
|
46
|
+
const uniqueIdentifier = {
|
47
|
+
actionId,
|
48
|
+
bridger,
|
49
|
+
requestTransactionHash,
|
50
|
+
sourceChainId: sourceChainId,
|
51
|
+
targetChainId: targetChainId,
|
52
|
+
}
|
53
|
+
|
54
|
+
let transactionHash = generateInteropTransactionHash(uniqueIdentifier);
|
55
|
+
|
56
|
+
const transaction = await Transaction.findOne({
|
57
|
+
where: {
|
58
|
+
transactionHash, requestSentEvent: {
|
59
|
+
[Op.eq]: null,
|
60
|
+
}
|
61
|
+
}
|
62
|
+
});
|
63
|
+
|
64
|
+
if (!transaction) {
|
65
|
+
continue;
|
66
|
+
}
|
67
|
+
transaction.sourceStatus = 'success'
|
68
|
+
transaction.sourceBlockNumber = event.blockNumber;
|
69
|
+
transaction.sourceTransactionHash = event.transactionHash
|
70
|
+
transaction.requestSentEvent = {
|
71
|
+
actionId,
|
72
|
+
bridger,
|
73
|
+
position: {
|
74
|
+
withdraw: position.withdraw.map((v) => ({
|
75
|
+
sourceToken: v.sourceToken,
|
76
|
+
targetToken: v.targetToken,
|
77
|
+
amount: v.amount.toString()
|
78
|
+
})),
|
79
|
+
supply: position.supply.map((v) => ({
|
80
|
+
sourceToken: v.sourceToken,
|
81
|
+
targetToken: v.targetToken,
|
82
|
+
amount: v.amount.toString()
|
83
|
+
})),
|
84
|
+
},
|
85
|
+
sourceChainId: sourceChainId,
|
86
|
+
targetChainId: targetChainId,
|
87
|
+
metadata,
|
88
|
+
requestTransactionHash,
|
89
|
+
}
|
90
|
+
await transaction.save()
|
91
|
+
|
92
|
+
this.logger.info(
|
93
|
+
`New bridge request sent received: ${transactionHash} `
|
94
|
+
);
|
95
|
+
} catch (error) {
|
96
|
+
this.logger.error(error);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
if (processedEvents > 0)
|
101
|
+
this.logger.info(`${processedEvents} events processed`);
|
102
|
+
}
|
103
|
+
|
104
|
+
async start(): Promise<void> {
|
105
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
106
|
+
|
107
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
108
|
+
getRpcProviderUrl(this.chainId)
|
109
|
+
);
|
110
|
+
|
111
|
+
this.contract = getContract<InteropXContract>(
|
112
|
+
this.contractAddress,
|
113
|
+
abi.interopXContract,
|
114
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
115
|
+
);
|
116
|
+
|
117
|
+
await super.start()
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
export default SyncBridgeRequestSentEvents;
|
@@ -49,10 +49,12 @@ class SyncTransactionStatusTask extends BaseTask {
|
|
49
49
|
transaction.sourceStatus = transactionStatus.sourceStatus
|
50
50
|
transaction.sourceTransactionHash = transactionStatus.sourceTransactionHash
|
51
51
|
transaction.sourceErrors = transactionStatus.sourceErrors
|
52
|
+
transaction.sourceLogs = transactionStatus.sourceLogs
|
52
53
|
|
53
54
|
transaction.targetStatus = transactionStatus.targetStatus
|
54
55
|
transaction.targetTransactionHash = transactionStatus.targetTransactionHash
|
55
56
|
transaction.targetErrors = transactionStatus.targetErrors
|
57
|
+
transaction.targetLogs = transactionStatus.targetLogs
|
56
58
|
|
57
59
|
transaction.status = transactionStatus.status
|
58
60
|
|