@instadapp/interop-x 0.0.0-dev.b8c571d → 0.0.0-dev.bfeca30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. package/dist/package.json +18 -16
  2. package/dist/src/abi/index.js +2 -4
  3. package/dist/src/abi/interopXContract.json +454 -0
  4. package/dist/src/alias.js +10 -0
  5. package/dist/src/api/index.js +6 -3
  6. package/dist/src/config/index.js +11 -1
  7. package/dist/src/constants/addresses.js +3 -3
  8. package/dist/src/constants/index.js +0 -1
  9. package/dist/src/constants/tokens.js +31 -1
  10. package/dist/src/db/models/transaction.js +27 -11
  11. package/dist/src/gnosis/actions/index.js +9 -0
  12. package/dist/src/gnosis/actions/withdraw/index.js +55 -0
  13. package/dist/src/gnosis/index.js +20 -0
  14. package/dist/src/index.js +75 -24
  15. package/dist/src/net/peer/index.js +2 -1
  16. package/dist/src/net/pool/index.js +18 -2
  17. package/dist/src/net/protocol/dial/SignatureDialProtocol.js +9 -10
  18. package/dist/src/net/protocol/dial/TransactionStatusDialProtocol.js +30 -0
  19. package/dist/src/net/protocol/index.js +51 -1
  20. package/dist/src/tasks/AutoUpdateTask.js +70 -0
  21. package/dist/src/tasks/BaseTask.js +11 -3
  22. package/dist/src/tasks/{InteropBridge/ProcessWithdrawEvents.js → InteropXContract/ProcessBridgeRequestEvents.js} +55 -48
  23. package/dist/src/tasks/InteropXContract/SyncBridgeCommittedEvents.js +92 -0
  24. package/dist/src/tasks/InteropXContract/SyncBridgeRequestEvents.js +78 -0
  25. package/dist/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.js +90 -0
  26. package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +55 -0
  27. package/dist/src/tasks/index.js +18 -17
  28. package/dist/src/typechain/{InteropBridgeToken.js → InteropXContract.js} +0 -0
  29. package/dist/src/typechain/factories/InteropXContract__factory.js +635 -0
  30. package/dist/src/typechain/factories/index.js +3 -5
  31. package/dist/src/typechain/index.js +3 -5
  32. package/dist/src/utils/index.js +55 -92
  33. package/package.json +18 -16
  34. package/src/abi/index.ts +2 -4
  35. package/src/abi/interopXContract.json +454 -0
  36. package/src/alias.ts +6 -0
  37. package/src/api/index.ts +5 -2
  38. package/src/config/index.ts +11 -1
  39. package/src/constants/addresses.ts +3 -3
  40. package/src/constants/index.ts +0 -1
  41. package/src/constants/tokens.ts +32 -2
  42. package/src/db/models/transaction.ts +76 -27
  43. package/src/gnosis/actions/index.ts +5 -0
  44. package/src/gnosis/actions/withdraw/index.ts +77 -0
  45. package/src/gnosis/index.ts +19 -0
  46. package/src/index.ts +96 -26
  47. package/src/net/peer/index.ts +2 -1
  48. package/src/net/pool/index.ts +25 -5
  49. package/src/net/protocol/dial/SignatureDialProtocol.ts +11 -13
  50. package/src/net/protocol/dial/TransactionStatusDialProtocol.ts +33 -0
  51. package/src/net/protocol/index.ts +67 -1
  52. package/src/tasks/AutoUpdateTask.ts +82 -0
  53. package/src/tasks/BaseTask.ts +13 -3
  54. package/src/tasks/{InteropBridge/ProcessWithdrawEvents.ts → InteropXContract/ProcessBridgeRequestEvents.ts} +78 -93
  55. package/src/tasks/InteropXContract/SyncBridgeCommittedEvents.ts +124 -0
  56. package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +115 -0
  57. package/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.ts +121 -0
  58. package/src/tasks/Transactions/SyncTransactionStatusTask.ts +67 -0
  59. package/src/tasks/index.ts +27 -21
  60. package/src/typechain/InteropXContract.ts +680 -0
  61. package/src/typechain/factories/InteropXContract__factory.ts +642 -0
  62. package/src/typechain/factories/index.ts +1 -2
  63. package/src/typechain/index.ts +2 -4
  64. package/src/utils/index.ts +96 -129
  65. package/tsconfig.json +7 -2
  66. package/dist/src/abi/interopBridgeToken.json +0 -286
  67. package/dist/src/abi/interopXGateway.json +0 -184
  68. package/dist/src/constants/itokens.js +0 -13
  69. package/dist/src/tasks/InteropBridge/SyncWithdrawEvents.js +0 -70
  70. package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +0 -147
  71. package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -75
  72. package/dist/src/typechain/InteropXGateway.js +0 -2
  73. package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -459
  74. package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
  75. package/src/abi/interopBridgeToken.json +0 -286
  76. package/src/abi/interopXGateway.json +0 -184
  77. package/src/constants/itokens.ts +0 -10
  78. package/src/tasks/InteropBridge/SyncWithdrawEvents.ts +0 -121
  79. package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -241
  80. package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -126
  81. package/src/typechain/InteropBridgeToken.ts +0 -686
  82. package/src/typechain/InteropXGateway.ts +0 -407
  83. package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -466
  84. package/src/typechain/factories/InteropXGateway__factory.ts +0 -272
@@ -1,40 +1,75 @@
1
1
  import { sequelize } from '@/db/sequelize'
2
2
  import { CreationOptional, InferAttributes, InferCreationAttributes, Model, DataTypes } from 'sequelize';
3
3
 
4
+ export interface IPositionTokenInfo{
5
+ amount: string;
6
+ sourceToken: string;
7
+ targetToken: string;
8
+ }
9
+
10
+ export interface IPosition {
11
+ supply: IPositionTokenInfo[];
12
+ withdraw: IPositionTokenInfo[];
13
+ }
14
+
4
15
  export class Transaction extends Model<InferAttributes<Transaction>, InferCreationAttributes<Transaction>> {
5
16
  declare id: CreationOptional<number>;
6
17
 
7
18
  declare transactionHash: string;
8
- declare action: string;
9
- declare from: string;
10
- declare to: string;
19
+
20
+ declare actionId: string;
21
+ declare bridger: string;
22
+ declare requestTransactionHash: string;
11
23
 
12
- declare submitTransactionHash: string;
13
- declare submitBlockNumber: number;
24
+ declare requestBlockNumber: number;
14
25
 
15
26
  declare sourceChainId: number;
16
27
  declare sourceTransactionHash: CreationOptional<string>;
17
28
  declare sourceBlockNumber: CreationOptional<number>;
18
- declare sourceStatus: string;
29
+ declare sourceStatus: CreationOptional<string>;
19
30
  declare sourceErrors: CreationOptional<string[]>;
31
+ declare sourceLogs: CreationOptional<any[]>;
20
32
  declare sourceCreatedAt: CreationOptional<Date>;
21
33
  declare sourceDelayUntil: CreationOptional<Date>;
22
34
 
23
35
  declare targetChainId: number;
24
36
  declare targetTransactionHash: CreationOptional<string>;
25
37
  declare targetBlockNumber: CreationOptional<number>;
26
- declare targetStatus: string;
38
+ declare targetStatus: CreationOptional<string>;
27
39
  declare targetErrors: CreationOptional<string[]>;
40
+ declare targetLogs: CreationOptional<any[]>;
28
41
  declare targetCreatedAt: CreationOptional<Date>;
29
42
  declare targetDelayUntil: CreationOptional<Date>;
30
43
 
31
- declare submitEvent: any;
32
- declare sourceEvent: CreationOptional<any>;
33
- declare targetEvent: CreationOptional<any>;
34
-
35
- declare metadata: CreationOptional<any>;
36
-
37
- declare status: string;
44
+ declare requestEvent: {
45
+ actionId: string;
46
+ bridger: string;
47
+ metadata: string;
48
+ position: IPosition;
49
+ sourceChainId: number;
50
+ targetChainId: number;
51
+ };
52
+ declare requestSentEvent: CreationOptional<{
53
+ actionId: string;
54
+ bridger: string;
55
+ metadata: string;
56
+ position: IPosition;
57
+ sourceChainId: number;
58
+ targetChainId: number;
59
+ requestTransactionHash: string;
60
+ }>;
61
+ declare committedEvent: CreationOptional<{
62
+ actionId: string;
63
+ bridger: string;
64
+ metadata: string;
65
+ position: IPosition;
66
+ sourceChainId: number;
67
+ targetChainId: number;
68
+ requestTransactionHash: string;
69
+ }>;
70
+ declare completedEvent: CreationOptional<any>;
71
+
72
+ declare status: CreationOptional<string>;
38
73
 
39
74
  declare createdAt: CreationOptional<Date>;
40
75
  declare updatedAt: CreationOptional<Date>;
@@ -47,23 +82,28 @@ Transaction.init({
47
82
  primaryKey: true
48
83
  },
49
84
 
50
- submitTransactionHash: DataTypes.NUMBER,
51
- submitBlockNumber: DataTypes.NUMBER,
85
+ requestTransactionHash: DataTypes.NUMBER,
86
+ requestBlockNumber: DataTypes.NUMBER,
52
87
 
53
88
  transactionHash: DataTypes.STRING,
54
- action: DataTypes.STRING,
55
-
56
- from: DataTypes.STRING,
57
- to: DataTypes.STRING,
89
+ actionId: DataTypes.STRING,
90
+ bridger: DataTypes.STRING,
58
91
 
59
92
  sourceChainId: DataTypes.NUMBER,
60
93
  sourceTransactionHash: DataTypes.STRING,
61
94
  sourceBlockNumber: DataTypes.NUMBER,
62
- sourceStatus: DataTypes.STRING,
95
+ sourceStatus: {
96
+ type: DataTypes.STRING,
97
+ defaultValue: 'uninitialised'
98
+ },
63
99
  sourceErrors: {
64
100
  type: DataTypes.JSON,
65
101
  // defaultValue: [],
66
102
  },
103
+ sourceLogs: {
104
+ type: DataTypes.JSON,
105
+ // defaultValue: [],
106
+ },
67
107
  sourceCreatedAt: {
68
108
  type: DataTypes.DATE,
69
109
  defaultValue: Date.now()
@@ -73,19 +113,28 @@ Transaction.init({
73
113
  targetChainId: DataTypes.NUMBER,
74
114
  targetTransactionHash: DataTypes.STRING,
75
115
  targetBlockNumber: DataTypes.NUMBER,
76
- targetStatus: DataTypes.STRING,
116
+ targetStatus: {
117
+ type: DataTypes.STRING,
118
+ defaultValue: 'uninitialised'
119
+ },
77
120
  targetErrors: {
78
121
  type: DataTypes.JSON,
79
122
  // defaultValue: [],
80
123
  },
124
+ targetLogs: {
125
+ type: DataTypes.JSON,
126
+ // defaultValue: [],
127
+ },
81
128
  targetCreatedAt: DataTypes.DATE,
82
129
  targetDelayUntil: DataTypes.DATE,
83
130
 
84
- submitEvent: DataTypes.JSON,
85
- sourceEvent: DataTypes.JSON,
86
- targetEvent: DataTypes.JSON,
87
-
88
- metadata: DataTypes.JSON,
131
+ requestEvent: {
132
+ type: DataTypes.JSON,
133
+ allowNull: false
134
+ },
135
+ requestSentEvent: DataTypes.JSON,
136
+ committedEvent: DataTypes.JSON,
137
+ completedEvent: DataTypes.JSON,
89
138
 
90
139
  status: {
91
140
  type: DataTypes.STRING,
@@ -0,0 +1,5 @@
1
+ import withdraw from "./withdraw"
2
+
3
+ export default {
4
+ withdraw,
5
+ }
@@ -0,0 +1,77 @@
1
+ import abi from "@/abi";
2
+ import config from "@/config";
3
+ import { addresses, tokens } from "@/constants";
4
+ import { Transaction } from "@/db";
5
+ import { InteropXContract } from "@/typechain";
6
+ import { ChainId } from "@/types";
7
+ import { getContract, getRpcProviderUrl } from "@/utils";
8
+ import { ethers } from "ethers";
9
+ import { MetaTransaction, OperationType } from "ethers-multisend";
10
+
11
+ export default async function (transaction: Transaction, type: 'source' | 'target') {
12
+ const transactions: MetaTransaction[] = [];
13
+ const logs: any[] = [];
14
+
15
+ if (transaction.actionId !== 'withdraw') {
16
+ throw new Error(`Invalid action: ${transaction.actionId}`)
17
+ }
18
+
19
+ if (type !== 'source') {
20
+ throw new Error(`[WIP] Type not supported: ${type}`)
21
+ }
22
+
23
+ if (transaction.sourceStatus === 'pending') {
24
+ throw Error('Source transaction already processesing')
25
+ }
26
+
27
+ if (transaction.sourceStatus === 'pending') {
28
+ throw Error('Source transaction already processed')
29
+ }
30
+
31
+ if (!transaction.requestEvent) {
32
+ throw Error('Something went wrong, source transaction has no request event')
33
+ }
34
+
35
+ const { actionId, bridger, position, sourceChainId, targetChainId, metadata} = transaction.requestEvent;
36
+
37
+ const sourceChainProvider = new ethers.providers.JsonRpcProvider(getRpcProviderUrl(targetChainId as ChainId));
38
+ const sourceWallet = new ethers.Wallet(config.privateKey, sourceChainProvider);
39
+ const contractAddress = addresses[sourceChainId].interopXContract;
40
+ const contract = getContract<InteropXContract>(contractAddress, abi.interopXContract, sourceWallet);
41
+
42
+ const sourceToken = tokens[sourceChainId].find(t => t.address.toLowerCase() === position.withdraw[0].sourceToken.toLowerCase());
43
+
44
+ if (!sourceToken) {
45
+ throw Error('Source token not found')
46
+ }
47
+
48
+ const targetToken = tokens[targetChainId].find(t => t.address.toLowerCase() === position.withdraw[0].targetToken.toLowerCase());
49
+
50
+ if (!targetToken) {
51
+ throw Error('Target token not found')
52
+ }
53
+
54
+ if (!sourceToken.aliases.some(alias => targetToken.aliases.includes(alias))) {
55
+ throw Error('Source and target token must be the same')
56
+ }
57
+
58
+ const { data } = await contract.populateTransaction.withdrawRequested(
59
+ actionId,
60
+ bridger,
61
+ position.withdraw[0].sourceToken,
62
+ position.withdraw[0].targetToken,
63
+ position.withdraw[0].amount,
64
+ targetChainId,
65
+ transaction.requestTransactionHash,
66
+ metadata,
67
+ );
68
+
69
+ transactions.push({
70
+ to: contractAddress,
71
+ data: data!,
72
+ value: '0',
73
+ operation: OperationType.Call,
74
+ });
75
+
76
+ return { transactions, logs }
77
+ }
@@ -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.actionId)) {
9
+
10
+ const { transactions, logs } = await actions[transaction.actionId](transaction, type);
11
+
12
+ return {
13
+ data: encodeMulti(transactions).data,
14
+ logs
15
+ };
16
+ }
17
+
18
+ throw new Error(`Unknown action: ${transaction.actionId}`);
19
+ }
package/src/index.ts CHANGED
@@ -1,23 +1,9 @@
1
- import moduleAlias from 'module-alias';
2
-
3
- moduleAlias.addAliases({
4
- "@/": __dirname + "/",
5
- "@/logger": __dirname + "/logger",
6
- "@/tasks": __dirname + "/tasks",
7
- "@/utils": __dirname + "/utils",
8
- "@/api": __dirname + "/api",
9
- "@/net": __dirname + "/net",
10
- "@/db": __dirname + "/db",
11
- "@/config": __dirname + "/config",
12
- "@/types": __dirname + "/types",
13
- "@/abi": __dirname + "/abi",
14
- "@/constants": __dirname + "/constants",
15
- "@/typechain": __dirname + "/typechain"
16
- })
1
+ import './alias'
2
+ import expandHomeDir from "expand-home-dir";
3
+ import fs from 'fs-extra'
17
4
 
18
- moduleAlias();
19
- import assert from "assert";
20
5
  import dotenv from "dotenv";
6
+ import chalk from 'chalk';
21
7
  import { ethers } from "ethers";
22
8
  import packageJson from '../package.json'
23
9
  dotenv.config();
@@ -25,28 +11,77 @@ dotenv.config();
25
11
  import Logger from "@/logger";
26
12
  const logger = new Logger('Process')
27
13
 
14
+ const GIT_SHORT_HASH = '@GIT_SHORT_HASH@';
15
+
16
+ const printUsage = () => {
17
+ console.log()
18
+ console.log(`Interop X Node (v${packageJson.version} - rev.${GIT_SHORT_HASH})`)
19
+ console.log()
28
20
 
29
- if (process.argv.at(-1) === 'help') {
30
21
  console.log('Usage:')
31
- console.log(' PRIVATE_KEY=abcd1234 interop-x')
32
- console.log(' PRIVATE_KEY=abcd1234 STAGING=true interop-x')
22
+ console.log(' interop-x help Show this message')
23
+ console.log(' interop-x version Print out the installed version of Interop X')
24
+
25
+ console.log()
26
+
27
+ console.log(' interop-x down Put the node into maintenance mode')
28
+ console.log(' interop-x up Take the node out of maintenance mode')
29
+
30
+ console.log()
31
+
32
+ console.log(' PRIVATE_KEY=abcd1234 interop-x Start the node with the given private key')
33
+ console.log(' PRIVATE_KEY=abcd1234 STAGING=true interop-x Start the node in staging mode')
34
+ console.log(' PRIVATE_KEY=abcd1234 AUTO_UPDATE=true interop-x Start the node in auto update mode')
35
+ console.log(' PRIVATE_KEY=abcd1234 API_HOST=0.0.0.0 API_PORT=8080 interop-x Start the node with custom API host and port')
36
+ console.log()
37
+
38
+ }
39
+
40
+ if (process.argv.at(-1) === 'help') {
41
+ printUsage()
42
+ process.exit(0)
43
+ }
44
+
45
+ const basePath = expandHomeDir(`~/.interop-x`);
46
+
47
+ if (process.argv.at(-1) === 'down') {
48
+ fs.outputFileSync(basePath + '/maintenance', Date.now().toString())
49
+ console.log(chalk.red('Maintenance mode enabled'))
50
+ process.exit(0)
51
+ }
52
+
53
+ if (process.argv.at(-1) === 'up') {
54
+ fs.removeSync(basePath + '/maintenance')
55
+ console.log(chalk.green('Maintenance mode disabled'))
33
56
  process.exit(0)
34
57
  }
35
58
 
36
- assert(process.env.PRIVATE_KEY, "PRIVATE_KEY is not defined");
37
59
 
60
+ if (process.argv.at(-1) === 'version') {
61
+ console.log(`Interop X Node (v${packageJson.version} - rev.${GIT_SHORT_HASH})`)
62
+ process.exit(0)
63
+ }
64
+
65
+ if (!process.env.PRIVATE_KEY) {
66
+ console.error(chalk.bgRed.white.bold('Please provide a private key\n'))
67
+ printUsage()
68
+ process.exit(1)
69
+ }
38
70
  try {
39
71
  new ethers.Wallet(process.env.PRIVATE_KEY!)
40
72
  } catch (e) {
41
- logger.error('Invalid private key')
73
+ console.error(chalk.bgRed.white('Invalid private key\n'))
74
+ printUsage()
42
75
  process.exit(1)
43
76
  }
44
77
 
45
- logger.debug(`Starting Interop X Node (v${packageJson.version} - rev.@GIT_SHORT_HASH@)`)
78
+ logger.debug(`Starting Interop X Node (v${packageJson.version} - rev.${GIT_SHORT_HASH})`)
46
79
 
47
80
  import { Tasks } from "@/tasks";
48
- import { startPeer } from "@/net";
81
+ import { startPeer, protocol, peerPool } from "@/net";
49
82
  import { startApiServer } from '@/api';
83
+ import { Transaction } from './db';
84
+ import { shortenHash } from './utils';
50
85
 
51
86
  async function main() {
52
87
 
@@ -54,9 +89,44 @@ async function main() {
54
89
 
55
90
  const tasks = new Tasks()
56
91
 
57
- tasks.start();
92
+ setTimeout(() => {
93
+ tasks.start();
94
+ }, 10000)
58
95
 
59
96
  startApiServer()
97
+
98
+ protocol.on('TransactionStatus', async (payload) => {
99
+ if (!peerPool.isLeadNode(payload.peerId)) {
100
+ const peer = peerPool.getPeer(payload.peerId)
101
+
102
+ if (!peer) {
103
+ return;
104
+ }
105
+
106
+ logger.info(`ignored transaction status from ${payload.peerId} ${shortenHash(peer.publicAddress)} `)
107
+ return;
108
+ }
109
+
110
+ const transaction = await Transaction.findOne({ where: { transactionHash: payload.data.transactionHash } })
111
+
112
+ if (!transaction) {
113
+ return;
114
+ }
115
+
116
+ transaction.sourceStatus = payload.data.sourceStatus
117
+ transaction.sourceTransactionHash = payload.data.sourceTransactionHash
118
+ transaction.sourceErrors = payload.data.sourceErrors
119
+ transaction.sourceLogs = payload.data.sourceLogs
120
+
121
+ transaction.targetStatus = payload.data.targetStatus
122
+ transaction.targetTransactionHash = payload.data.targetTransactionHash
123
+ transaction.targetErrors = payload.data.targetErrors
124
+ transaction.targetLogs = payload.data.targetLogs
125
+
126
+ transaction.status = payload.data.status
127
+
128
+ await transaction.save()
129
+ })
60
130
  }
61
131
 
62
132
  main()
@@ -17,6 +17,7 @@ import KadDHT from "libp2p-kad-dht";
17
17
  import PubsubPeerDiscovery from "libp2p-pubsub-peer-discovery";
18
18
  import { protocol } from "@/net";
19
19
  import config from "@/config";
20
+ import chalk from "chalk";
20
21
 
21
22
  const logger = new Logger("Peer");
22
23
 
@@ -80,7 +81,7 @@ export const startPeer = async ({ }: IPeerOptions) => {
80
81
  },
81
82
  });
82
83
 
83
- logger.info("Peer ID:", node.peerId.toB58String());
84
+ logger.info("Peer ID:", chalk.bold(node.peerId.toB58String()));
84
85
 
85
86
  await node.start();
86
87
 
@@ -1,6 +1,9 @@
1
1
  import { Event } from "@/types";
2
2
  import config from "@/config";
3
3
  import Logger from "@/logger";
4
+ import { getAddress } from "ethers/lib/utils";
5
+ import { shortenHash } from "@/utils";
6
+ import chalk from "chalk";
4
7
 
5
8
 
6
9
  const logger = new Logger('PeerPool')
@@ -83,10 +86,10 @@ export class PeerPool {
83
86
  const newPeer = !this.pool.get(peer.id);
84
87
  this.pool.set(peer.id, peer)
85
88
  peer.pooled = true
86
-
87
- if(newPeer) {
89
+
90
+ if (newPeer) {
88
91
  config.events.emit(Event.POOL_PEER_ADDED, peer)
89
- 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`)
90
93
  }
91
94
  }
92
95
  }
@@ -101,7 +104,7 @@ export class PeerPool {
101
104
  if (this.pool.delete(peer.id)) {
102
105
  peer.pooled = false
103
106
  config.events.emit(Event.POOL_PEER_REMOVED, peer)
104
- 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`)
105
108
  }
106
109
  }
107
110
  }
@@ -110,7 +113,7 @@ export class PeerPool {
110
113
  this.cleanup()
111
114
 
112
115
  return this.peers.filter((p) => {
113
- if(!p.pooled) return false;
116
+ if (!p.pooled) return false;
114
117
 
115
118
  const now = new Date()
116
119
 
@@ -122,6 +125,23 @@ export class PeerPool {
122
125
  return this.activePeers.map((p) => p.id)
123
126
  }
124
127
 
128
+ getPeer(id: string){
129
+ return this.pool.get(id);
130
+ }
131
+
132
+ isLeadNode(id: string) {
133
+ const peer = this.pool.get(id);
134
+
135
+ if (!peer) {
136
+ return false;
137
+ }
138
+
139
+ return getAddress(peer.publicAddress) === getAddress(config.leadNodeAddress)
140
+ }
141
+
142
+ getLeadPeer() {
143
+ return this.peers.find((p) => this.isLeadNode(p.id))
144
+ }
125
145
 
126
146
  cleanup() {
127
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 { buildDataForTransaction, signGnosisSafeTx } from "@/utils";
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.targetChainId].multisend,
60
- data: await buildDataForTransaction(transaction, data.type),
61
- chainId: transaction.targetChainId as ChainId,
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
+ }