@instadapp/interop-x 0.0.0-dev.6088815 → 0.0.0-dev.6a2c9c4
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 +16 -14
- 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 +6 -3
- package/dist/src/config/index.js +10 -1
- package/dist/src/constants/addresses.js +7 -7
- package/dist/src/constants/index.js +0 -1
- package/dist/src/constants/tokens.js +62 -39
- 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 +115 -0
- package/dist/src/gnosis/index.js +20 -0
- package/dist/src/index.js +39 -23
- package/dist/src/net/peer/index.js +2 -1
- package/dist/src/net/pool/index.js +7 -2
- package/dist/src/net/protocol/dial/SignatureDialProtocol.js +9 -10
- package/dist/src/net/protocol/dial/TransactionStatusDialProtocol.js +30 -0
- package/dist/src/net/protocol/index.js +26 -5
- package/dist/src/tasks/AutoUpdateTask.js +42 -18
- package/dist/src/tasks/BaseTask.js +11 -3
- package/dist/src/tasks/{InteropXGateway/ProcessDepositEvents.js → InteropXContract/ProcessBridgeRequestEvents.js} +61 -53
- package/dist/src/tasks/InteropXContract/SyncBridgeCommittedEvents.js +93 -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 +57 -0
- package/dist/src/tasks/index.js +16 -17
- 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 +57 -92
- package/package.json +16 -14
- 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 +5 -2
- package/src/config/index.ts +9 -1
- package/src/constants/addresses.ts +8 -8
- package/src/constants/index.ts +0 -1
- package/src/constants/tokens.ts +63 -40
- package/src/db/models/transaction.ts +76 -27
- package/src/gnosis/actions/index.ts +5 -0
- package/src/gnosis/actions/withdraw/index.ts +155 -0
- package/src/gnosis/index.ts +19 -0
- package/src/index.ts +52 -25
- package/src/net/peer/index.ts +2 -1
- package/src/net/pool/index.ts +7 -3
- package/src/net/protocol/dial/SignatureDialProtocol.ts +11 -13
- package/src/net/protocol/dial/TransactionStatusDialProtocol.ts +33 -0
- package/src/net/protocol/index.ts +28 -6
- package/src/tasks/AutoUpdateTask.ts +48 -21
- package/src/tasks/BaseTask.ts +13 -3
- package/src/tasks/{InteropBridge/ProcessWithdrawEvents.ts → InteropXContract/ProcessBridgeRequestEvents.ts} +88 -95
- package/src/tasks/InteropXContract/SyncBridgeCommittedEvents.ts +125 -0
- package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +115 -0
- package/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.ts +121 -0
- package/src/tasks/Transactions/SyncTransactionStatusTask.ts +69 -0
- package/src/tasks/index.ts +21 -18
- 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 +97 -129
- package/tsconfig.json +7 -2
- package/dist/src/abi/interopBridgeToken.json +0 -286
- package/dist/src/abi/interopXGateway.json +0 -184
- package/dist/src/constants/itokens.js +0 -13
- package/dist/src/tasks/InteropBridge/ProcessWithdrawEvents.js +0 -147
- package/dist/src/tasks/InteropBridge/SyncWithdrawEvents.js +0 -70
- package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -75
- package/dist/src/typechain/InteropXGateway.js +0 -2
- package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -459
- package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
- package/src/abi/interopBridgeToken.json +0 -286
- package/src/abi/interopXGateway.json +0 -184
- package/src/constants/itokens.ts +0 -10
- package/src/tasks/InteropBridge/SyncWithdrawEvents.ts +0 -121
- package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -245
- package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -126
- package/src/typechain/InteropBridgeToken.ts +0 -686
- package/src/typechain/InteropXGateway.ts +0 -407
- package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -466
- package/src/typechain/factories/InteropXGateway__factory.ts +0 -272
package/src/net/pool/index.ts
CHANGED
@@ -2,6 +2,8 @@ import { Event } from "@/types";
|
|
2
2
|
import config from "@/config";
|
3
3
|
import Logger from "@/logger";
|
4
4
|
import { getAddress } from "ethers/lib/utils";
|
5
|
+
import { shortenHash } from "@/utils";
|
6
|
+
import chalk from "chalk";
|
5
7
|
|
6
8
|
|
7
9
|
const logger = new Logger('PeerPool')
|
@@ -87,7 +89,7 @@ export class PeerPool {
|
|
87
89
|
|
88
90
|
if (newPeer) {
|
89
91
|
config.events.emit(Event.POOL_PEER_ADDED, peer)
|
90
|
-
logger.info(`Peer ${peer.id} with address ${peer.publicAddress} added to pool`)
|
92
|
+
logger.info(`Peer ${chalk.bold(shortenHash(peer.id, 16))} with address ${chalk.bold(shortenHash(peer.publicAddress))} added to pool`)
|
91
93
|
}
|
92
94
|
}
|
93
95
|
}
|
@@ -102,7 +104,7 @@ export class PeerPool {
|
|
102
104
|
if (this.pool.delete(peer.id)) {
|
103
105
|
peer.pooled = false
|
104
106
|
config.events.emit(Event.POOL_PEER_REMOVED, peer)
|
105
|
-
logger.info(`Peer ${peer.id} with address ${peer.publicAddress} removed from pool`)
|
107
|
+
logger.info(`Peer ${chalk.bold(shortenHash(peer.id, 16))} with address ${chalk.bold(shortenHash(peer.publicAddress))} removed from pool`)
|
106
108
|
}
|
107
109
|
}
|
108
110
|
}
|
@@ -123,7 +125,6 @@ export class PeerPool {
|
|
123
125
|
return this.activePeers.map((p) => p.id)
|
124
126
|
}
|
125
127
|
|
126
|
-
|
127
128
|
getPeer(id: string){
|
128
129
|
return this.pool.get(id);
|
129
130
|
}
|
@@ -138,6 +139,9 @@ export class PeerPool {
|
|
138
139
|
return getAddress(peer.publicAddress) === getAddress(config.leadNodeAddress)
|
139
140
|
}
|
140
141
|
|
142
|
+
getLeadPeer() {
|
143
|
+
return this.peers.find((p) => this.isLeadNode(p.id))
|
144
|
+
}
|
141
145
|
|
142
146
|
cleanup() {
|
143
147
|
// let compDate = Date.now() - this.PEERS_CLEANUP_TIME_LIMIT * 60
|
@@ -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 });
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { BaseDialProtocol } from "./BaseDialProtocol";
|
2
|
+
import { Transaction } from "@/db";
|
3
|
+
|
4
|
+
export class TransactionStatusDialProtocol extends BaseDialProtocol<string, Pick<Transaction, 'transactionHash' | 'sourceStatus' | 'sourceTransactionHash' | 'sourceErrors' | 'sourceLogs' | 'targetStatus' | 'targetTransactionHash' | 'targetErrors' | 'targetLogs' | 'status'> | null> {
|
5
|
+
protected timeout = 30000;
|
6
|
+
|
7
|
+
constructor(libp2p) {
|
8
|
+
super(libp2p, '/interop-x/transaction-status')
|
9
|
+
}
|
10
|
+
|
11
|
+
async response(transactionHash: string){
|
12
|
+
const transaction = await Transaction.findOne({ where: { transactionHash } })
|
13
|
+
|
14
|
+
if(! transaction){
|
15
|
+
return null
|
16
|
+
}
|
17
|
+
return {
|
18
|
+
transactionHash: transaction.transactionHash,
|
19
|
+
|
20
|
+
sourceStatus: transaction.sourceStatus,
|
21
|
+
sourceTransactionHash: transaction.sourceTransactionHash,
|
22
|
+
sourceErrors: transaction.sourceErrors,
|
23
|
+
sourceLogs: transaction.sourceLogs,
|
24
|
+
|
25
|
+
targetStatus: transaction.targetStatus,
|
26
|
+
targetTransactionHash: transaction.targetTransactionHash,
|
27
|
+
targetErrors: transaction.targetErrors,
|
28
|
+
targetLogs: transaction.targetLogs,
|
29
|
+
|
30
|
+
status: transaction.status,
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
@@ -6,6 +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/TransactionStatusDialProtocol";
|
9
10
|
|
10
11
|
export interface ProtocolOptions {
|
11
12
|
/* Handshake timeout in ms (default: 8000) */
|
@@ -35,7 +36,7 @@ interface PeerInfoEvent extends BaseMessageEvent {
|
|
35
36
|
}
|
36
37
|
|
37
38
|
interface TransactionStatusEvent extends BaseMessageEvent {
|
38
|
-
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'>
|
39
40
|
}
|
40
41
|
|
41
42
|
declare interface Protocol {
|
@@ -65,31 +66,42 @@ class Protocol extends EventEmitter {
|
|
65
66
|
Buffer.from(transaction.transactionHash),
|
66
67
|
|
67
68
|
Buffer.from(transaction.sourceStatus),
|
68
|
-
Buffer.from(transaction.sourceTransactionHash),
|
69
|
+
Buffer.from(transaction.sourceTransactionHash || ''),
|
69
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)]) : [],
|
70
72
|
|
71
73
|
Buffer.from(transaction.targetStatus),
|
72
|
-
Buffer.from(transaction.targetTransactionHash),
|
74
|
+
Buffer.from(transaction.targetTransactionHash || ''),
|
73
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)]) : [],
|
74
77
|
|
75
78
|
Buffer.from(transaction.status),
|
76
79
|
],
|
77
|
-
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]) => ({
|
78
81
|
transactionHash: transactionHash.toString(),
|
79
82
|
|
80
83
|
sourceStatus: sourceStatus.toString(),
|
81
|
-
sourceTransactionHash: sourceTransactionHash.toString(),
|
84
|
+
sourceTransactionHash: sourceTransactionHash.toString() || null,
|
82
85
|
sourceErrors: sourceErrors.map((e) => e.toString()),
|
86
|
+
sourceLogs: sourceLogs.map(e => ({
|
87
|
+
type: e[0].toString(),
|
88
|
+
message: e[1].toString(),
|
89
|
+
})),
|
83
90
|
|
84
91
|
targetStatus: targetStatus.toString(),
|
85
|
-
targetTransactionHash: targetTransactionHash.toString(),
|
92
|
+
targetTransactionHash: targetTransactionHash.toString() || null,
|
86
93
|
targetErrors: targetErrors.map((e) => e.toString()),
|
94
|
+
targetLogs: targetLogs.map(e => ({
|
95
|
+
type: e[0].toString(),
|
96
|
+
message: e[1].toString(),
|
97
|
+
})),
|
87
98
|
|
88
99
|
status: status.toString(),
|
89
100
|
}),
|
90
101
|
},
|
91
102
|
];
|
92
103
|
private signature: SignatureDialProtocol;
|
104
|
+
private transactionStatus: TransactionStatusDialProtocol;
|
93
105
|
|
94
106
|
|
95
107
|
start({ libp2p, topic = null, }) {
|
@@ -109,6 +121,7 @@ class Protocol extends EventEmitter {
|
|
109
121
|
})
|
110
122
|
|
111
123
|
this.signature = new SignatureDialProtocol(this.libp2p);
|
124
|
+
this.transactionStatus = new TransactionStatusDialProtocol(this.libp2p);
|
112
125
|
}
|
113
126
|
|
114
127
|
|
@@ -177,6 +190,15 @@ class Protocol extends EventEmitter {
|
|
177
190
|
return []
|
178
191
|
}
|
179
192
|
}
|
193
|
+
|
194
|
+
async requestTransactionStatus(transactionHash: string, peerId: string) {
|
195
|
+
try {
|
196
|
+
return await this.transactionStatus.send(transactionHash, peerId);
|
197
|
+
} catch (error) {
|
198
|
+
console.log(error);
|
199
|
+
return null
|
200
|
+
}
|
201
|
+
}
|
180
202
|
}
|
181
203
|
|
182
204
|
export const protocol = new Protocol();
|
@@ -1,13 +1,16 @@
|
|
1
1
|
import { BaseTask } from "./BaseTask";
|
2
2
|
import Logger from '@/logger';
|
3
|
-
import
|
4
|
-
import {
|
5
|
-
import { spawn } from 'child_process';
|
3
|
+
import spawnAsync from 'await-spawn';
|
4
|
+
import { spawn } from 'child_process'
|
6
5
|
import config from "@/config";
|
6
|
+
import wait from "waait";
|
7
|
+
import packageJson from "../../package.json";
|
8
|
+
|
7
9
|
const currentVersion = packageJson.version;
|
10
|
+
const tag = config.staging ? 'dev' : 'latest';
|
8
11
|
|
9
12
|
class AutoUpdateTask extends BaseTask {
|
10
|
-
pollIntervalMs: number = 60 * 1000
|
13
|
+
pollIntervalMs: number = 60 * 10 * 1000
|
11
14
|
|
12
15
|
constructor() {
|
13
16
|
super({
|
@@ -19,11 +22,28 @@ class AutoUpdateTask extends BaseTask {
|
|
19
22
|
return config.autoUpdate && !config.isLeadNode();
|
20
23
|
}
|
21
24
|
|
22
|
-
async
|
25
|
+
async getInstalledVersion() {
|
26
|
+
try {
|
27
|
+
const stdout = await spawnAsync('npm', ['-g', 'ls', '--depth=0', '--json'])
|
28
|
+
return JSON.parse(stdout.toString()).dependencies[packageJson.name].version
|
29
|
+
} catch (error) {
|
30
|
+
this.logger.error(error)
|
31
|
+
return currentVersion
|
32
|
+
}
|
33
|
+
}
|
23
34
|
|
24
|
-
|
35
|
+
async getLatestVersion() {
|
36
|
+
try {
|
37
|
+
const stdout = await spawnAsync('npm', ['view', `${packageJson.name}@${tag}`, 'version'])
|
38
|
+
return stdout.toString().trim()
|
39
|
+
} catch (error) {
|
40
|
+
this.logger.error(error)
|
41
|
+
return currentVersion
|
42
|
+
}
|
43
|
+
}
|
25
44
|
|
26
|
-
|
45
|
+
async pollHandler() {
|
46
|
+
const version = await this.getLatestVersion()
|
27
47
|
|
28
48
|
if (version === currentVersion) {
|
29
49
|
return;
|
@@ -31,24 +51,31 @@ class AutoUpdateTask extends BaseTask {
|
|
31
51
|
|
32
52
|
this.logger.warn(`New version ${version} available.`)
|
33
53
|
|
54
|
+
this.logger.info('Updating...')
|
34
55
|
|
35
|
-
|
56
|
+
await spawnAsync('npm', ['-g', 'install', `@instadapp/interop-x@${tag}`, '-f']);
|
36
57
|
|
37
|
-
|
38
|
-
this.logger.warn(`Installed version ${version}`)
|
39
|
-
this.logger.warn(`Restarting...`)
|
58
|
+
await wait(5000)
|
40
59
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
stdio: "inherit"
|
46
|
-
});
|
60
|
+
if (version !== await this.getInstalledVersion()) {
|
61
|
+
this.logger.warn(`failed to install ${version}, retrying in 5 minutes`)
|
62
|
+
return;
|
63
|
+
}
|
47
64
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
65
|
+
this.logger.warn(`Installed version ${version}`)
|
66
|
+
this.logger.warn(`Restarting...`)
|
67
|
+
|
68
|
+
|
69
|
+
// TODO: its restarting in the bg, but it should be in the fg
|
70
|
+
const subprocess = spawn(process.argv[0], process.argv.slice(1), {
|
71
|
+
cwd: process.cwd(),
|
72
|
+
stdio: "inherit",
|
73
|
+
// shell: process.env.SHELL,
|
74
|
+
});
|
75
|
+
|
76
|
+
subprocess.unref();
|
77
|
+
|
78
|
+
process.exit()
|
52
79
|
}
|
53
80
|
}
|
54
81
|
|
package/src/tasks/BaseTask.ts
CHANGED
@@ -19,6 +19,7 @@ export class BaseTask extends EventEmitter implements IBaseTask {
|
|
19
19
|
started: boolean = false
|
20
20
|
pollIntervalMs: number = 10 * 1000
|
21
21
|
leadNodeOnly: boolean = false
|
22
|
+
exceptLeadNode: boolean = false
|
22
23
|
|
23
24
|
public constructor({ logger }: { logger?: Logger }) {
|
24
25
|
super()
|
@@ -45,11 +46,20 @@ export class BaseTask extends EventEmitter implements IBaseTask {
|
|
45
46
|
}
|
46
47
|
|
47
48
|
prePollHandler(): boolean {
|
48
|
-
if
|
49
|
-
|
49
|
+
if(config.isMaintenanceMode()){
|
50
|
+
this.logger.warn('Maintenance mode is enabled. Skipping task.')
|
51
|
+
return false
|
50
52
|
}
|
51
53
|
|
52
|
-
|
54
|
+
if (this.exceptLeadNode) {
|
55
|
+
return !config.isLeadNode();
|
56
|
+
}
|
57
|
+
|
58
|
+
if (this.leadNodeOnly) {
|
59
|
+
return config.isLeadNode()
|
60
|
+
}
|
61
|
+
|
62
|
+
return true
|
53
63
|
}
|
54
64
|
|
55
65
|
async pollHandler() {
|
@@ -1,66 +1,33 @@
|
|
1
1
|
import { BaseTask } from "../BaseTask";
|
2
2
|
import Logger from '@/logger';
|
3
|
-
import {
|
3
|
+
import { ethers, Wallet } from "ethers";
|
4
4
|
import abi from "@/abi";
|
5
5
|
import { Transaction } from "@/db";
|
6
|
-
import {
|
6
|
+
import { buildSignatureBytes, generateGnosisTransaction, generateInteropTransactionHash, getContract, getRpcProviderUrl, LiquidityError, 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,64 @@ 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
|
-
|
67
|
+
const ownersThreshold = await this.safeContract.getThreshold();
|
68
|
+
await wait(10000);
|
103
69
|
|
104
|
-
const targetChainProvider = new ethers.providers.JsonRpcProvider(
|
105
|
-
getRpcProviderUrl(transaction.targetChainId as ChainId)
|
106
|
-
);
|
107
70
|
|
108
|
-
|
71
|
+
let data, logs = [];
|
109
72
|
|
110
|
-
|
73
|
+
try {
|
74
|
+
({ data, logs } = await buildGnosisAction(transaction, 'source'));
|
111
75
|
|
76
|
+
} catch (error) {
|
77
|
+
|
78
|
+
if(error instanceof LiquidityError){
|
79
|
+
await transaction.save();
|
80
|
+
transaction.sourceDelayUntil = new Date(Date.now() + 60 * 5 * 1000);
|
81
|
+
transaction.sourceStatus = 'uninitialised'
|
82
|
+
|
83
|
+
await transaction.save();
|
112
84
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
targetWallet
|
117
|
-
)
|
85
|
+
throw error
|
86
|
+
return;
|
87
|
+
}
|
118
88
|
|
119
|
-
|
120
|
-
|
89
|
+
transaction.sourceStatus = 'failed';
|
90
|
+
transaction.sourceErrors = [error.message];
|
91
|
+
transaction.targetStatus = 'failed';
|
92
|
+
|
93
|
+
transaction.status = 'failed'
|
94
|
+
await transaction.save();
|
95
|
+
protocol.sendTransaction(transaction)
|
96
|
+
return;
|
97
|
+
}
|
121
98
|
|
122
99
|
let gnosisTx = await generateGnosisTransaction({
|
123
100
|
baseGas: "0",
|
124
|
-
data
|
101
|
+
data,
|
125
102
|
gasPrice: "0",
|
126
103
|
gasToken: "0x0000000000000000000000000000000000000000",
|
127
104
|
nonce: '0',
|
128
105
|
operation: "1",
|
129
106
|
refundReceiver: "0x0000000000000000000000000000000000000000",
|
130
|
-
safeAddress:
|
107
|
+
safeAddress: this.safeContractAddress,
|
131
108
|
safeTxGas: "79668",
|
132
|
-
to: addresses[transaction.
|
109
|
+
to: addresses[transaction.sourceChainId].multisend,
|
133
110
|
value: "0",
|
134
|
-
}, safeContract);
|
111
|
+
}, this.safeContract);
|
135
112
|
|
136
|
-
const owners = await safeContract.getOwners().then(owners => owners.map(owner => owner.toLowerCase()));
|
113
|
+
const owners = await this.safeContract.getOwners().then(owners => owners.map(owner => owner.toLowerCase()));
|
137
114
|
|
138
115
|
const ownerPeerIds = peerPool.activePeers.filter(peer => owners.includes(peer.publicAddress.toLowerCase())).map(peer => peer.id)
|
139
116
|
|
140
117
|
console.log(`Collecting signatures for execution ${transaction.transactionHash}`)
|
141
118
|
|
142
119
|
console.log(ownerPeerIds);
|
143
|
-
|
120
|
+
|
144
121
|
const signatures = await protocol.requestSignatures({
|
145
122
|
type: 'source',
|
146
123
|
transactionHash: transaction.transactionHash,
|
@@ -155,18 +132,17 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
155
132
|
|
156
133
|
if (validSignatures.length === 0 || ownersThreshold.gt(validSignatures.length)) {
|
157
134
|
await transaction.save();
|
158
|
-
transaction.
|
159
|
-
transaction.
|
135
|
+
transaction.sourceDelayUntil = new Date(Date.now() + 30 * 1000);
|
136
|
+
transaction.sourceStatus = 'uninitialised'
|
160
137
|
|
161
138
|
await transaction.save();
|
162
139
|
const errorMessage = signatures.find(s => !!s.error)?.error;
|
163
140
|
throw new Error(`Not enough signatures` + (errorMessage ? `: ${errorMessage}` : ''));
|
164
141
|
}
|
165
142
|
|
166
|
-
|
167
143
|
console.log(`Executing transaction for execution ${transaction.transactionHash}`)
|
168
144
|
|
169
|
-
const { data: txData } = await safeContract.populateTransaction.execTransaction(
|
145
|
+
const { data: txData } = await this.safeContract.populateTransaction.execTransaction(
|
170
146
|
gnosisTx.to,
|
171
147
|
gnosisTx.value,
|
172
148
|
gnosisTx.data,
|
@@ -179,20 +155,15 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
179
155
|
buildSignatureBytes(validSignatures)
|
180
156
|
);
|
181
157
|
|
182
|
-
|
183
|
-
from:
|
184
|
-
gasPrice: BigNumber.from(120 * 10 ** 9)
|
185
|
-
to:
|
158
|
+
const txSent = await this.sourceWallet.sendTransaction({
|
159
|
+
from: this.sourceWallet.address,
|
160
|
+
gasPrice: ethers.BigNumber.from(120 * 10 ** 9),
|
161
|
+
to: this.safeContractAddress,
|
186
162
|
data: txData,
|
187
163
|
})
|
188
164
|
|
165
|
+
console.log(txSent);
|
189
166
|
|
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
167
|
|
197
168
|
const receipt = await txSent.wait();
|
198
169
|
|
@@ -200,34 +171,56 @@ class ProcessWithdrawEvents extends BaseTask {
|
|
200
171
|
|
201
172
|
receipt.logs.forEach((log) => {
|
202
173
|
try {
|
203
|
-
parsedLogs.push(safeContract.interface.parseLog(log));
|
174
|
+
parsedLogs.push(this.safeContract.interface.parseLog(log));
|
204
175
|
} catch (e) { }
|
205
176
|
});
|
206
177
|
|
207
178
|
if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
|
208
179
|
console.log('ExecutionSuccess')
|
209
|
-
transaction.
|
210
|
-
|
211
|
-
|
180
|
+
transaction.sourceStatus = 'success'
|
181
|
+
if (txSent.blockNumber)
|
182
|
+
transaction.sourceBlockNumber = txSent.blockNumber;
|
183
|
+
transaction.sourceTransactionHash = txSent.hash
|
184
|
+
transaction.sourceLogs = logs;
|
212
185
|
await transaction.save();
|
213
186
|
} else {
|
214
187
|
console.log('ExecutionFailure')
|
215
|
-
transaction.
|
216
|
-
|
188
|
+
transaction.sourceStatus = 'failed'
|
189
|
+
if (txSent.blockNumber)
|
190
|
+
transaction.sourceBlockNumber = txSent.blockNumber;
|
191
|
+
transaction.sourceTransactionHash = txSent.hash
|
192
|
+
transaction.sourceTransactionHash = txSent.hash
|
217
193
|
transaction.status = 'failed'
|
218
194
|
await transaction.save();
|
219
195
|
}
|
196
|
+
|
197
|
+
protocol.sendTransaction(transaction)
|
220
198
|
}
|
221
199
|
|
222
200
|
async start(): Promise<void> {
|
223
|
-
this.
|
201
|
+
this.contractAddress = addresses[this.chainId].interopXContract;
|
224
202
|
|
225
203
|
this.provider = new ethers.providers.JsonRpcProvider(
|
226
204
|
getRpcProviderUrl(this.chainId)
|
227
205
|
);
|
228
206
|
|
207
|
+
this.sourceWallet = new ethers.Wallet(config.privateKey!, this.provider);
|
208
|
+
|
209
|
+
this.contract = getContract<InteropXContract>(
|
210
|
+
this.contractAddress,
|
211
|
+
abi.interopXContract,
|
212
|
+
this.sourceWallet
|
213
|
+
);
|
214
|
+
|
215
|
+
this.safeContractAddress = addresses[this.chainId].gnosisSafe;
|
216
|
+
this.safeContract = getContract<GnosisSafe>(
|
217
|
+
this.safeContractAddress,
|
218
|
+
abi.gnosisSafe,
|
219
|
+
this.sourceWallet
|
220
|
+
);
|
221
|
+
|
229
222
|
await super.start()
|
230
223
|
}
|
231
224
|
}
|
232
225
|
|
233
|
-
export default
|
226
|
+
export default ProccessBridgeRequestEvents;
|