@instadapp/interop-x 0.0.0-dev.8f86e9f → 0.0.0-dev.9b1fcb8
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/package.json +1 -1
- package/dist/src/constants/itokens.js +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/net/protocol/dial/SignatureDialProtocol.js +8 -1
- package/dist/src/tasks/InteropBridge/SyncWithdrawEvents.js +68 -0
- package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +7 -18
- package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +1 -1
- package/dist/src/tasks/index.js +5 -0
- package/package.json +1 -1
- package/src/constants/itokens.ts +1 -1
- package/src/net/protocol/dial/SignatureDialProtocol.ts +10 -2
- package/src/tasks/InteropBridge/SyncWithdrawEvents.ts +119 -0
- package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +9 -21
- package/src/tasks/InteropXGateway/SyncDepositEvents.ts +1 -1
- package/src/tasks/index.ts +6 -0
package/dist/package.json
CHANGED
package/dist/src/index.js
CHANGED
@@ -40,7 +40,7 @@ catch (e) {
|
|
40
40
|
logger.error('Invalid private key');
|
41
41
|
process.exit(1);
|
42
42
|
}
|
43
|
-
logger.debug(`Starting Interop X Node (v${package_json_1.default.version} - rev.
|
43
|
+
logger.debug(`Starting Interop X Node (v${package_json_1.default.version} - rev.9b1fcb8)`);
|
44
44
|
const tasks_1 = require("@/tasks");
|
45
45
|
const net_1 = require("@/net");
|
46
46
|
const api_1 = require("@/api");
|
@@ -33,8 +33,15 @@ class SignatureDialProtocol extends BaseDialProtocol_1.BaseDialProtocol {
|
|
33
33
|
error: 'Event not found'
|
34
34
|
};
|
35
35
|
}
|
36
|
+
console.log("signing:", {
|
37
|
+
to: constants_1.addresses[transaction.targetChainId].multisend,
|
38
|
+
data: await (0, utils_1.buildDataForTransaction)(transaction, data.type),
|
39
|
+
chainId: transaction.targetChainId,
|
40
|
+
safeTxGas: data.safeTxGas,
|
41
|
+
nonce: data.safeNonce,
|
42
|
+
});
|
36
43
|
const signedData = await (0, utils_1.signGnosisSafeTx)({
|
37
|
-
to: constants_1.addresses[transaction.
|
44
|
+
to: constants_1.addresses[transaction.targetChainId].multisend,
|
38
45
|
data: await (0, utils_1.buildDataForTransaction)(transaction, data.type),
|
39
46
|
chainId: transaction.targetChainId,
|
40
47
|
safeTxGas: data.safeTxGas,
|
@@ -0,0 +1,68 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const BaseTask_1 = require("../BaseTask");
|
7
|
+
const logger_1 = __importDefault(require("@/logger"));
|
8
|
+
const ethers_1 = require("ethers");
|
9
|
+
const abi_1 = __importDefault(require("@/abi"));
|
10
|
+
const db_1 = require("@/db");
|
11
|
+
const utils_1 = require("@/utils");
|
12
|
+
const config_1 = __importDefault(require("@/config"));
|
13
|
+
class SyncWithdrawEvents extends BaseTask_1.BaseTask {
|
14
|
+
constructor({ chainId, itokenAddress }) {
|
15
|
+
super({
|
16
|
+
logger: new logger_1.default("InteropBridgeToken::SyncWithdrawEvents"),
|
17
|
+
});
|
18
|
+
this.chainId = chainId;
|
19
|
+
this.itokenAddress = itokenAddress;
|
20
|
+
}
|
21
|
+
async pollHandler() {
|
22
|
+
const currentBlock = await this.provider.getBlockNumber();
|
23
|
+
const events = await this.contract.queryFilter(this.contract.filters.Burn(), currentBlock - 2000, currentBlock);
|
24
|
+
let processedEvents = 0;
|
25
|
+
for (const event of events) {
|
26
|
+
try {
|
27
|
+
if (!event.args) {
|
28
|
+
continue;
|
29
|
+
}
|
30
|
+
const { to, amount, chainId } = event.args;
|
31
|
+
const uniqueIdentifier = {
|
32
|
+
action: 'withdraw',
|
33
|
+
submitTransactionHash: event.transactionHash,
|
34
|
+
sourceChainId: this.chainId,
|
35
|
+
targetChainId: chainId.toNumber(),
|
36
|
+
};
|
37
|
+
if (await db_1.Transaction.findOne({ where: uniqueIdentifier })) {
|
38
|
+
continue;
|
39
|
+
}
|
40
|
+
const tx = await event.getTransaction();
|
41
|
+
await db_1.Transaction.create(Object.assign(Object.assign({}, uniqueIdentifier), { transactionHash: (0, utils_1.generateInteropTransactionHash)(uniqueIdentifier), from: tx.from, to, submitTransactionHash: event.transactionHash, submitBlockNumber: event.blockNumber,
|
42
|
+
// submit & source are the same
|
43
|
+
sourceTransactionHash: event.transactionHash, sourceBlockNumber: event.blockNumber, sourceStatus: "success", targetStatus: "uninitialised", submitEvent: {
|
44
|
+
to,
|
45
|
+
amount: amount.toString(),
|
46
|
+
chainId: chainId.toString()
|
47
|
+
}, sourceEvent: {
|
48
|
+
to,
|
49
|
+
amount: amount.toString(),
|
50
|
+
chainId: chainId.toString(),
|
51
|
+
}, status: "pending" }));
|
52
|
+
this.logger.info(`Withdraw queued: ${event.transactionHash} ${event.blockNumber}`);
|
53
|
+
}
|
54
|
+
catch (error) {
|
55
|
+
this.logger.error(error);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
if (processedEvents > 0)
|
59
|
+
this.logger.info(`${processedEvents} events processed`);
|
60
|
+
}
|
61
|
+
async start() {
|
62
|
+
this.logger.info(`Starting execution watcher on interop chain`);
|
63
|
+
this.provider = new ethers_1.ethers.providers.JsonRpcProvider((0, utils_1.getRpcProviderUrl)(this.chainId));
|
64
|
+
this.contract = (0, utils_1.getContract)(this.itokenAddress, abi_1.default.interopBridgeToken, new ethers_1.ethers.Wallet(config_1.default.privateKey, this.provider));
|
65
|
+
await super.start();
|
66
|
+
}
|
67
|
+
}
|
68
|
+
exports.default = SyncWithdrawEvents;
|
@@ -58,6 +58,7 @@ class ProcessDepositEvents extends BaseTask_1.BaseTask {
|
|
58
58
|
if (!transaction) {
|
59
59
|
return;
|
60
60
|
}
|
61
|
+
console.log(`Processing transaction ${transaction.transactionHash}`);
|
61
62
|
transaction.targetStatus = 'pending';
|
62
63
|
await transaction.save();
|
63
64
|
// refresh event data?
|
@@ -100,35 +101,17 @@ class ProcessDepositEvents extends BaseTask_1.BaseTask {
|
|
100
101
|
const errorMessage = (_a = signatures.find(s => !!s.error)) === null || _a === void 0 ? void 0 : _a.error;
|
101
102
|
throw new Error(`Not enough signatures` + (errorMessage ? `: ${errorMessage}` : ''));
|
102
103
|
}
|
103
|
-
const execTransactionParams = [
|
104
|
-
gnosisTx.to,
|
105
|
-
gnosisTx.value,
|
106
|
-
gnosisTx.data,
|
107
|
-
gnosisTx.operation,
|
108
|
-
gnosisTx.safeTxGas,
|
109
|
-
gnosisTx.baseGas,
|
110
|
-
gnosisTx.gasPrice,
|
111
|
-
gnosisTx.gasToken,
|
112
|
-
gnosisTx.refundReceiver,
|
113
|
-
(0, utils_1.buildSignatureBytes)(validSignatures),
|
114
|
-
];
|
115
104
|
console.log(`Executing transaction for execution ${transaction.transactionHash}`);
|
116
|
-
console.log({
|
117
|
-
execTransactionParams
|
118
|
-
});
|
119
105
|
const { data: txData } = await safeContract.populateTransaction.execTransaction(gnosisTx.to, gnosisTx.value, gnosisTx.data, gnosisTx.operation, gnosisTx.safeTxGas, gnosisTx.baseGas, gnosisTx.gasPrice, gnosisTx.gasToken, gnosisTx.refundReceiver, (0, utils_1.buildSignatureBytes)(validSignatures));
|
120
106
|
console.log({
|
121
107
|
from: targetWallet.address,
|
122
108
|
gasPrice: ethers_1.BigNumber.from(120 * 10 ** 9).toString(),
|
123
|
-
gasLimit: ethers_1.BigNumber.from(6000000).toString(),
|
124
109
|
to: safeAddress,
|
125
110
|
data: txData,
|
126
111
|
});
|
127
|
-
return;
|
128
112
|
const txSent = await targetWallet.sendTransaction({
|
129
113
|
from: targetWallet.address,
|
130
114
|
gasPrice: ethers_1.BigNumber.from(120 * 10 ** 9),
|
131
|
-
gasLimit: ethers_1.BigNumber.from(6000000),
|
132
115
|
to: safeAddress,
|
133
116
|
data: txData,
|
134
117
|
});
|
@@ -142,9 +125,15 @@ class ProcessDepositEvents extends BaseTask_1.BaseTask {
|
|
142
125
|
});
|
143
126
|
if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
|
144
127
|
console.log('ExecutionSuccess');
|
128
|
+
transaction.targetStatus = 'success';
|
129
|
+
transaction.status = 'success';
|
130
|
+
await transaction.save();
|
145
131
|
}
|
146
132
|
else {
|
147
133
|
console.log('ExecutionFailure');
|
134
|
+
transaction.targetStatus = 'failed';
|
135
|
+
transaction.status = 'failed';
|
136
|
+
await transaction.save();
|
148
137
|
}
|
149
138
|
}
|
150
139
|
async start() {
|
@@ -55,7 +55,7 @@ class SyncDepositEvents extends BaseTask_1.BaseTask {
|
|
55
55
|
amount: amount.toString(),
|
56
56
|
vnonce: vnonce.toString(),
|
57
57
|
}, status: "pending" }));
|
58
|
-
this.logger.info(`
|
58
|
+
this.logger.info(`Deposit queued: ${event.transactionHash} ${event.blockNumber}`);
|
59
59
|
}
|
60
60
|
catch (error) {
|
61
61
|
this.logger.error(error);
|
package/dist/src/tasks/index.js
CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.Tasks = void 0;
|
7
7
|
const ProcessDepositEvents_1 = __importDefault(require("./InteropXGateway/ProcessDepositEvents"));
|
8
8
|
const SyncDepositEvents_1 = __importDefault(require("./InteropXGateway/SyncDepositEvents"));
|
9
|
+
const SyncWithdrawEvents_1 = __importDefault(require("./InteropBridge/SyncWithdrawEvents"));
|
9
10
|
class Tasks {
|
10
11
|
constructor() {
|
11
12
|
this.tasks = [
|
@@ -14,6 +15,10 @@ class Tasks {
|
|
14
15
|
}),
|
15
16
|
new ProcessDepositEvents_1.default({
|
16
17
|
chainId: 43114
|
18
|
+
}),
|
19
|
+
new SyncWithdrawEvents_1.default({
|
20
|
+
chainId: 137,
|
21
|
+
itokenAddress: '0xEab02fe1F016eE3e4106c1C6aad35FeEe657268E',
|
17
22
|
})
|
18
23
|
];
|
19
24
|
}
|
package/package.json
CHANGED
package/src/constants/itokens.ts
CHANGED
@@ -47,9 +47,17 @@ export class SignatureDialProtocol extends BaseDialProtocol<ISignatureRequest, I
|
|
47
47
|
};
|
48
48
|
}
|
49
49
|
|
50
|
+
console.log("signing:", {
|
51
|
+
to: addresses[transaction.targetChainId].multisend,
|
52
|
+
data: await buildDataForTransaction(transaction, data.type),
|
53
|
+
chainId: transaction.targetChainId as ChainId,
|
54
|
+
safeTxGas: data.safeTxGas,
|
55
|
+
nonce: data.safeNonce,
|
56
|
+
});
|
57
|
+
|
50
58
|
const signedData = await signGnosisSafeTx({
|
51
|
-
to: addresses[transaction.
|
52
|
-
data:
|
59
|
+
to: addresses[transaction.targetChainId].multisend,
|
60
|
+
data: await buildDataForTransaction(transaction, data.type),
|
53
61
|
chainId: transaction.targetChainId as ChainId,
|
54
62
|
safeTxGas: data.safeTxGas,
|
55
63
|
nonce: data.safeNonce,
|
@@ -0,0 +1,119 @@
|
|
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 { ChainId } from "@/types";
|
8
|
+
import config from "@/config";
|
9
|
+
import { InteropBridgeToken } from "@/typechain";
|
10
|
+
|
11
|
+
class SyncWithdrawEvents 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::SyncWithdrawEvents"),
|
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.Burn(),
|
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 { to, amount, chainId } = event.args;
|
45
|
+
|
46
|
+
const uniqueIdentifier = {
|
47
|
+
action: 'withdraw',
|
48
|
+
submitTransactionHash: event.transactionHash,
|
49
|
+
sourceChainId:this.chainId,
|
50
|
+
targetChainId: chainId.toNumber(),
|
51
|
+
}
|
52
|
+
|
53
|
+
if (await Transaction.findOne({ where: uniqueIdentifier })) {
|
54
|
+
continue;
|
55
|
+
}
|
56
|
+
|
57
|
+
const tx = await event.getTransaction()
|
58
|
+
|
59
|
+
await Transaction.create({
|
60
|
+
...uniqueIdentifier,
|
61
|
+
transactionHash: generateInteropTransactionHash(uniqueIdentifier),
|
62
|
+
from: tx.from,
|
63
|
+
to,
|
64
|
+
|
65
|
+
|
66
|
+
submitTransactionHash: event.transactionHash,
|
67
|
+
submitBlockNumber: event.blockNumber,
|
68
|
+
|
69
|
+
// submit & source are the same
|
70
|
+
sourceTransactionHash: event.transactionHash,
|
71
|
+
sourceBlockNumber: event.blockNumber,
|
72
|
+
sourceStatus: "success",
|
73
|
+
|
74
|
+
targetStatus: "uninitialised",
|
75
|
+
|
76
|
+
submitEvent: {
|
77
|
+
to,
|
78
|
+
amount: amount.toString(),
|
79
|
+
chainId: chainId.toString()
|
80
|
+
},
|
81
|
+
|
82
|
+
sourceEvent: {
|
83
|
+
to,
|
84
|
+
amount: amount.toString(),
|
85
|
+
chainId: chainId.toString(),
|
86
|
+
},
|
87
|
+
status: "pending",
|
88
|
+
})
|
89
|
+
|
90
|
+
this.logger.info(
|
91
|
+
`Withdraw queued: ${event.transactionHash} ${event.blockNumber}`
|
92
|
+
);
|
93
|
+
} catch (error) {
|
94
|
+
this.logger.error(error);
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
if (processedEvents > 0)
|
99
|
+
this.logger.info(`${processedEvents} events processed`);
|
100
|
+
}
|
101
|
+
|
102
|
+
async start(): Promise<void> {
|
103
|
+
this.logger.info(`Starting execution watcher on interop chain`);
|
104
|
+
|
105
|
+
this.provider = new ethers.providers.JsonRpcProvider(
|
106
|
+
getRpcProviderUrl(this.chainId)
|
107
|
+
);
|
108
|
+
|
109
|
+
this.contract = getContract<InteropBridgeToken>(
|
110
|
+
this.itokenAddress,
|
111
|
+
abi.interopBridgeToken,
|
112
|
+
new ethers.Wallet(config.privateKey!, this.provider)
|
113
|
+
);
|
114
|
+
|
115
|
+
await super.start()
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
export default SyncWithdrawEvents;
|
@@ -96,11 +96,11 @@ class ProcessDepositEvents extends BaseTask {
|
|
96
96
|
return;
|
97
97
|
}
|
98
98
|
|
99
|
-
|
99
|
+
console.log(`Processing transaction ${transaction.transactionHash}`);
|
100
|
+
|
100
101
|
transaction.targetStatus = 'pending';
|
101
102
|
await transaction.save();
|
102
103
|
|
103
|
-
|
104
104
|
// refresh event data?
|
105
105
|
|
106
106
|
const targetChainProvider = new ethers.providers.JsonRpcProvider(
|
@@ -165,25 +165,9 @@ class ProcessDepositEvents extends BaseTask {
|
|
165
165
|
throw new Error(`Not enough signatures` + (errorMessage ? `: ${errorMessage}` : ''));
|
166
166
|
}
|
167
167
|
|
168
|
-
const execTransactionParams = [
|
169
|
-
gnosisTx.to,
|
170
|
-
gnosisTx.value,
|
171
|
-
gnosisTx.data,
|
172
|
-
gnosisTx.operation,
|
173
|
-
gnosisTx.safeTxGas,
|
174
|
-
gnosisTx.baseGas,
|
175
|
-
gnosisTx.gasPrice,
|
176
|
-
gnosisTx.gasToken,
|
177
|
-
gnosisTx.refundReceiver,
|
178
|
-
buildSignatureBytes(validSignatures),
|
179
|
-
];
|
180
168
|
|
181
169
|
console.log(`Executing transaction for execution ${transaction.transactionHash}`)
|
182
170
|
|
183
|
-
console.log({
|
184
|
-
execTransactionParams
|
185
|
-
})
|
186
|
-
|
187
171
|
const { data: txData } = await safeContract.populateTransaction.execTransaction(
|
188
172
|
gnosisTx.to,
|
189
173
|
gnosisTx.value,
|
@@ -200,16 +184,14 @@ class ProcessDepositEvents extends BaseTask {
|
|
200
184
|
console.log({
|
201
185
|
from: targetWallet.address,
|
202
186
|
gasPrice: BigNumber.from(120 * 10 ** 9).toString(),
|
203
|
-
gasLimit: BigNumber.from(6_000_000).toString(),
|
204
187
|
to: safeAddress,
|
205
188
|
data: txData,
|
206
189
|
})
|
207
|
-
|
190
|
+
|
208
191
|
|
209
192
|
const txSent = await targetWallet.sendTransaction({
|
210
193
|
from: targetWallet.address,
|
211
194
|
gasPrice: BigNumber.from(120 * 10 ** 9),
|
212
|
-
gasLimit: BigNumber.from(6_000_000),
|
213
195
|
to: safeAddress,
|
214
196
|
data: txData,
|
215
197
|
})
|
@@ -226,8 +208,14 @@ class ProcessDepositEvents extends BaseTask {
|
|
226
208
|
|
227
209
|
if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
|
228
210
|
console.log('ExecutionSuccess')
|
211
|
+
transaction.targetStatus = 'success'
|
212
|
+
transaction.status = 'success'
|
213
|
+
await transaction.save();
|
229
214
|
} else {
|
230
215
|
console.log('ExecutionFailure')
|
216
|
+
transaction.targetStatus = 'failed'
|
217
|
+
transaction.status = 'failed'
|
218
|
+
await transaction.save();
|
231
219
|
}
|
232
220
|
}
|
233
221
|
|
@@ -93,7 +93,7 @@ class SyncDepositEvents extends BaseTask {
|
|
93
93
|
})
|
94
94
|
|
95
95
|
this.logger.info(
|
96
|
-
`
|
96
|
+
`Deposit queued: ${event.transactionHash} ${event.blockNumber}`
|
97
97
|
);
|
98
98
|
} catch (error) {
|
99
99
|
this.logger.error(error);
|
package/src/tasks/index.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import { BaseTask } from "./BaseTask";
|
2
2
|
import InteropXGatewayProcessDepositEvents from "./InteropXGateway/ProcessDepositEvents";
|
3
3
|
import InteropXGatewaySyncDepositEvents from "./InteropXGateway/SyncDepositEvents";
|
4
|
+
import InteropBridgeSyncWithdrawEvents from "./InteropBridge/SyncWithdrawEvents";
|
4
5
|
|
5
6
|
export class Tasks {
|
6
7
|
|
@@ -11,6 +12,11 @@ export class Tasks {
|
|
11
12
|
|
12
13
|
new InteropXGatewayProcessDepositEvents({
|
13
14
|
chainId: 43114
|
15
|
+
}),
|
16
|
+
|
17
|
+
new InteropBridgeSyncWithdrawEvents({
|
18
|
+
chainId: 137,
|
19
|
+
itokenAddress: '0xEab02fe1F016eE3e4106c1C6aad35FeEe657268E',
|
14
20
|
})
|
15
21
|
];
|
16
22
|
|