@instadapp/interop-x 0.0.0-dev.a775e30 → 0.0.0-dev.a861339
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 +2 -2
- 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 +3 -0
- 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 +7 -18
- 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/{InteropXGateway/ProcessDepositEvents.js → InteropXContract/ProcessBridgeRequestEvents.js} +49 -51
- package/dist/src/tasks/InteropXContract/SyncBridgeRequestEvents.js +78 -0
- package/dist/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.js +80 -0
- package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +2 -0
- package/dist/src/tasks/index.js +13 -19
- 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 +14 -84
- package/package.json +2 -2
- 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 +3 -0
- package/src/constants/addresses.ts +3 -3
- package/src/constants/index.ts +0 -1
- package/src/db/models/transaction.ts +66 -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 +6 -17
- 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/{InteropBridge/ProcessWithdrawEvents.ts → InteropXContract/ProcessBridgeRequestEvents.ts} +75 -95
- package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +116 -0
- package/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.ts +112 -0
- package/src/tasks/Transactions/SyncTransactionStatusTask.ts +2 -0
- package/src/tasks/index.ts +17 -20
- 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 +46 -125
- 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
@@ -0,0 +1,19 @@
|
|
1
|
+
import { Transaction } from "@/db";
|
2
|
+
import { encodeMulti } from "ethers-multisend";
|
3
|
+
import actions from "./actions";
|
4
|
+
|
5
|
+
export const buildGnosisAction = async (transaction: Transaction, type: 'source' | 'target') => {
|
6
|
+
// type = type || (transaction.sourceStatus === 'success' ? 'target' : 'source')
|
7
|
+
|
8
|
+
if (actions.hasOwnProperty(transaction.action)) {
|
9
|
+
|
10
|
+
const { transactions, logs } = await actions[transaction.action](transaction, type);
|
11
|
+
|
12
|
+
return {
|
13
|
+
data: encodeMulti(transactions).data,
|
14
|
+
logs
|
15
|
+
};
|
16
|
+
}
|
17
|
+
|
18
|
+
throw new Error(`Unknown action: ${transaction.action}`);
|
19
|
+
}
|
package/src/index.ts
CHANGED
@@ -1,22 +1,7 @@
|
|
1
|
-
import
|
1
|
+
import './alias'
|
2
2
|
import expandHomeDir from "expand-home-dir";
|
3
3
|
import fs from 'fs-extra'
|
4
|
-
moduleAlias.addAliases({
|
5
|
-
"@/": __dirname + "/",
|
6
|
-
"@/logger": __dirname + "/logger",
|
7
|
-
"@/tasks": __dirname + "/tasks",
|
8
|
-
"@/utils": __dirname + "/utils",
|
9
|
-
"@/api": __dirname + "/api",
|
10
|
-
"@/net": __dirname + "/net",
|
11
|
-
"@/db": __dirname + "/db",
|
12
|
-
"@/config": __dirname + "/config",
|
13
|
-
"@/types": __dirname + "/types",
|
14
|
-
"@/abi": __dirname + "/abi",
|
15
|
-
"@/constants": __dirname + "/constants",
|
16
|
-
"@/typechain": __dirname + "/typechain"
|
17
|
-
})
|
18
4
|
|
19
|
-
moduleAlias();
|
20
5
|
import dotenv from "dotenv";
|
21
6
|
import chalk from 'chalk';
|
22
7
|
import { ethers } from "ethers";
|
@@ -104,7 +89,9 @@ async function main() {
|
|
104
89
|
|
105
90
|
const tasks = new Tasks()
|
106
91
|
|
107
|
-
|
92
|
+
setTimeout(() => {
|
93
|
+
tasks.start();
|
94
|
+
}, 10000)
|
108
95
|
|
109
96
|
startApiServer()
|
110
97
|
|
@@ -129,10 +116,12 @@ async function main() {
|
|
129
116
|
transaction.sourceStatus = payload.data.sourceStatus
|
130
117
|
transaction.sourceTransactionHash = payload.data.sourceTransactionHash
|
131
118
|
transaction.sourceErrors = payload.data.sourceErrors
|
119
|
+
transaction.sourceLogs = payload.data.sourceLogs
|
132
120
|
|
133
121
|
transaction.targetStatus = payload.data.targetStatus
|
134
122
|
transaction.targetTransactionHash = payload.data.targetTransactionHash
|
135
123
|
transaction.targetErrors = payload.data.targetErrors
|
124
|
+
transaction.targetLogs = payload.data.targetLogs
|
136
125
|
|
137
126
|
transaction.status = payload.data.status
|
138
127
|
|
@@ -2,12 +2,13 @@ import { BaseDialProtocol } from "./BaseDialProtocol";
|
|
2
2
|
import wait from "waait";
|
3
3
|
import config from "@/config";
|
4
4
|
import { Transaction } from "@/db";
|
5
|
-
import {
|
5
|
+
import { signGnosisSafeTx } from "@/utils";
|
6
6
|
import { addresses } from "@/constants";
|
7
7
|
import { ChainId } from "@/types";
|
8
|
+
import { buildGnosisAction } from "@/gnosis";
|
8
9
|
|
9
10
|
export interface ISignatureRequest {
|
10
|
-
type: 'source' | 'target'
|
11
|
+
type: 'source' | 'target',
|
11
12
|
transactionHash: string
|
12
13
|
safeTxGas: string
|
13
14
|
safeNonce: string
|
@@ -25,6 +26,10 @@ export class SignatureDialProtocol extends BaseDialProtocol<ISignatureRequest, I
|
|
25
26
|
}
|
26
27
|
|
27
28
|
async response(data: ISignatureRequest): Promise<ISignatureResponse> {
|
29
|
+
console.log({
|
30
|
+
tag: 'SignatureDialProtocol',
|
31
|
+
data
|
32
|
+
})
|
28
33
|
const signer = config.wallet;
|
29
34
|
|
30
35
|
let transaction: Transaction | null;
|
@@ -46,19 +51,12 @@ export class SignatureDialProtocol extends BaseDialProtocol<ISignatureRequest, I
|
|
46
51
|
error: 'Event not found'
|
47
52
|
};
|
48
53
|
}
|
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
|
-
});
|
54
|
+
const { data: gnosisData } = await buildGnosisAction(transaction, data.type);
|
57
55
|
|
58
56
|
const signedData = await signGnosisSafeTx({
|
59
|
-
to: addresses[transaction.
|
60
|
-
data:
|
61
|
-
chainId: transaction.
|
57
|
+
to: addresses[transaction.sourceChainId].multisend,
|
58
|
+
data: gnosisData,
|
59
|
+
chainId: transaction.sourceChainId as ChainId,
|
62
60
|
safeTxGas: data.safeTxGas,
|
63
61
|
nonce: data.safeNonce,
|
64
62
|
}, { signer });
|
package/src/net/protocol/dial/{SignatureDialProtocol.1.ts → TransactionStatusDialProtocol.ts}
RENAMED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { BaseDialProtocol } from "./BaseDialProtocol";
|
2
2
|
import { Transaction } from "@/db";
|
3
3
|
|
4
|
-
export class TransactionStatusDialProtocol extends BaseDialProtocol<string, Pick<Transaction, 'transactionHash' | 'sourceStatus' | 'sourceTransactionHash' | 'sourceErrors' | 'targetStatus' | 'targetTransactionHash' | 'targetErrors' | 'status'> | null> {
|
4
|
+
export class TransactionStatusDialProtocol extends BaseDialProtocol<string, Pick<Transaction, 'transactionHash' | 'sourceStatus' | 'sourceTransactionHash' | 'sourceErrors' | 'sourceLogs' | 'targetStatus' | 'targetTransactionHash' | 'targetErrors' | 'targetLogs' | 'status'> | null> {
|
5
5
|
protected timeout = 30000;
|
6
6
|
|
7
7
|
constructor(libp2p) {
|
@@ -20,10 +20,12 @@ export class TransactionStatusDialProtocol extends BaseDialProtocol<string, Pick
|
|
20
20
|
sourceStatus: transaction.sourceStatus,
|
21
21
|
sourceTransactionHash: transaction.sourceTransactionHash,
|
22
22
|
sourceErrors: transaction.sourceErrors,
|
23
|
+
sourceLogs: transaction.sourceLogs,
|
23
24
|
|
24
25
|
targetStatus: transaction.targetStatus,
|
25
26
|
targetTransactionHash: transaction.targetTransactionHash,
|
26
27
|
targetErrors: transaction.targetErrors,
|
28
|
+
targetLogs: transaction.targetLogs,
|
27
29
|
|
28
30
|
status: transaction.status,
|
29
31
|
}
|
@@ -6,7 +6,7 @@ import { IPeerInfo, peerPool } from "..";
|
|
6
6
|
import config from "@/config";
|
7
7
|
import { Event } from "@/types";
|
8
8
|
import { Transaction } from "@/db";
|
9
|
-
import { TransactionStatusDialProtocol } from "./dial/
|
9
|
+
import { TransactionStatusDialProtocol } from "./dial/TransactionStatusDialProtocol";
|
10
10
|
|
11
11
|
export interface ProtocolOptions {
|
12
12
|
/* Handshake timeout in ms (default: 8000) */
|
@@ -36,7 +36,7 @@ interface PeerInfoEvent extends BaseMessageEvent {
|
|
36
36
|
}
|
37
37
|
|
38
38
|
interface TransactionStatusEvent extends BaseMessageEvent {
|
39
|
-
data: Pick<Transaction, 'transactionHash' | 'sourceStatus' | 'sourceTransactionHash' | 'sourceErrors' | 'targetStatus' | 'targetTransactionHash' | 'targetErrors' | 'status'>
|
39
|
+
data: Pick<Transaction, 'transactionHash' | 'sourceStatus' | 'sourceTransactionHash' | 'sourceErrors' | 'sourceLogs' | 'targetStatus' | 'targetTransactionHash' | 'targetErrors' | 'targetLogs' | 'status'>
|
40
40
|
}
|
41
41
|
|
42
42
|
declare interface Protocol {
|
@@ -66,25 +66,35 @@ class Protocol extends EventEmitter {
|
|
66
66
|
Buffer.from(transaction.transactionHash),
|
67
67
|
|
68
68
|
Buffer.from(transaction.sourceStatus),
|
69
|
-
Buffer.from(transaction.sourceTransactionHash),
|
69
|
+
Buffer.from(transaction.sourceTransactionHash || ''),
|
70
70
|
transaction.sourceErrors ? transaction.sourceErrors.map((e) => Buffer.from(e)) : [],
|
71
|
+
transaction.sourceLogs ? transaction.sourceLogs.map((e) => [Buffer.from(e.type), Buffer.from(e.message)]) : [],
|
71
72
|
|
72
73
|
Buffer.from(transaction.targetStatus),
|
73
|
-
Buffer.from(transaction.targetTransactionHash),
|
74
|
+
Buffer.from(transaction.targetTransactionHash || ''),
|
74
75
|
transaction.targetErrors ? transaction.targetErrors.map((e) => Buffer.from(e)) : [],
|
76
|
+
transaction.targetLogs ? transaction.targetLogs.map((e) => [Buffer.from(e.type), Buffer.from(e.message)]) : [],
|
75
77
|
|
76
78
|
Buffer.from(transaction.status),
|
77
79
|
],
|
78
|
-
decode: ([transactionHash, sourceStatus, sourceTransactionHash, sourceErrors, targetStatus, targetTransactionHash, targetErrors, status]: [Buffer, Buffer, Buffer, Buffer[], Buffer, Buffer, Buffer[], Buffer]) => ({
|
80
|
+
decode: ([transactionHash, sourceStatus, sourceTransactionHash, sourceErrors, sourceLogs, targetStatus, targetTransactionHash, targetErrors, targetLogs, status]: [Buffer, Buffer, Buffer, Buffer[],[Buffer,Buffer][], Buffer, Buffer, Buffer[],[Buffer,Buffer][], Buffer]) => ({
|
79
81
|
transactionHash: transactionHash.toString(),
|
80
82
|
|
81
83
|
sourceStatus: sourceStatus.toString(),
|
82
|
-
sourceTransactionHash: sourceTransactionHash.toString(),
|
84
|
+
sourceTransactionHash: sourceTransactionHash.toString() || null,
|
83
85
|
sourceErrors: sourceErrors.map((e) => e.toString()),
|
86
|
+
sourceLogs: sourceLogs.map(e => ({
|
87
|
+
type: e[0].toString(),
|
88
|
+
message: e[1].toString(),
|
89
|
+
})),
|
84
90
|
|
85
91
|
targetStatus: targetStatus.toString(),
|
86
|
-
targetTransactionHash: targetTransactionHash.toString(),
|
92
|
+
targetTransactionHash: targetTransactionHash.toString() || null,
|
87
93
|
targetErrors: targetErrors.map((e) => e.toString()),
|
94
|
+
targetLogs: targetLogs.map(e => ({
|
95
|
+
type: e[0].toString(),
|
96
|
+
message: e[1].toString(),
|
97
|
+
})),
|
88
98
|
|
89
99
|
status: status.toString(),
|
90
100
|
}),
|
@@ -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
|
|
189
|
-
|
190
|
-
|
191
|
-
from: targetWallet.address,
|
192
|
-
gasPrice: BigNumber.from(120 * 10 ** 9),
|
193
|
-
to: safeAddress,
|
194
|
-
data: txData,
|
195
|
-
})
|
154
|
+
console.log(txSent);
|
155
|
+
|
196
156
|
|
197
157
|
const receipt = await txSent.wait();
|
198
158
|
|
@@ -200,32 +160,52 @@ 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
|
-
transaction.
|
169
|
+
transaction.sourceStatus = 'success'
|
170
|
+
transaction.sourceTransactionHash = txSent.hash
|
171
|
+
transaction.sourceLogs = logs;
|
211
172
|
transaction.status = 'success'
|
212
173
|
await transaction.save();
|
213
174
|
} else {
|
214
175
|
console.log('ExecutionFailure')
|
215
|
-
transaction.
|
216
|
-
transaction.
|
176
|
+
transaction.sourceStatus = 'failed'
|
177
|
+
transaction.sourceTransactionHash = txSent.hash
|
217
178
|
transaction.status = 'failed'
|
218
179
|
await transaction.save();
|
219
180
|
}
|
181
|
+
|
182
|
+
protocol.sendTransaction(transaction)
|
220
183
|
}
|
221
184
|
|
222
185
|
async start(): Promise<void> {
|
186
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
187
|
+
|
223
188
|
this.provider = new ethers.providers.JsonRpcProvider(
|
224
189
|
getRpcProviderUrl(this.chainId)
|
225
190
|
);
|
226
191
|
|
192
|
+
this.sourceWallet = new ethers.Wallet(config.privateKey!, this.provider);
|
193
|
+
|
194
|
+
this.contract = getContract<InteropXContract>(
|
195
|
+
this.contractAddress,
|
196
|
+
abi.interopXContract,
|
197
|
+
this.sourceWallet
|
198
|
+
);
|
199
|
+
|
200
|
+
this.safeContractAddress = addresses[this.chainId].gnosisSafe;
|
201
|
+
this.safeContract = getContract<GnosisSafe>(
|
202
|
+
this.safeContractAddress,
|
203
|
+
abi.gnosisSafe,
|
204
|
+
this.sourceWallet
|
205
|
+
);
|
206
|
+
|
227
207
|
await super.start()
|
228
208
|
}
|
229
209
|
}
|
230
210
|
|
231
|
-
export default
|
211
|
+
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
|
+
continue;
|
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;
|