@instadapp/interop-x 0.0.0-dev.733ff78 → 0.0.0-dev.76d0265

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. package/dist/package.json +13 -12
  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/constants/addresses.js +7 -7
  6. package/dist/src/constants/index.js +0 -1
  7. package/dist/src/constants/tokens.js +62 -39
  8. package/dist/src/db/models/transaction.js +19 -11
  9. package/dist/src/gnosis/actions/index.js +0 -2
  10. package/dist/src/gnosis/actions/withdraw/index.js +115 -0
  11. package/dist/src/gnosis/index.js +4 -4
  12. package/dist/src/index.js +5 -19
  13. package/dist/src/net/protocol/dial/SignatureDialProtocol.js +6 -2
  14. package/dist/src/tasks/{InteropBridge/ProcessWithdrawEvents.js → InteropXContract/ProcessBridgeRequestEvents.js} +50 -53
  15. package/dist/src/tasks/InteropXContract/SyncBridgeCommittedEvents.js +93 -0
  16. package/dist/src/tasks/InteropXContract/SyncBridgeRequestEvents.js +78 -0
  17. package/dist/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.js +90 -0
  18. package/dist/src/tasks/index.js +16 -30
  19. package/dist/src/typechain/{InteropBridgeToken.js → InteropXContract.js} +0 -0
  20. package/dist/src/typechain/factories/InteropXContract__factory.js +635 -0
  21. package/dist/src/typechain/factories/index.js +3 -5
  22. package/dist/src/typechain/index.js +3 -5
  23. package/dist/src/utils/index.js +44 -8
  24. package/package.json +13 -12
  25. package/src/abi/index.ts +2 -4
  26. package/src/abi/interopXContract.json +454 -0
  27. package/src/alias.ts +6 -0
  28. package/src/constants/addresses.ts +8 -8
  29. package/src/constants/index.ts +0 -1
  30. package/src/constants/tokens.ts +63 -40
  31. package/src/db/models/transaction.ts +66 -27
  32. package/src/gnosis/actions/index.ts +0 -2
  33. package/src/gnosis/actions/withdraw/index.ts +155 -0
  34. package/src/gnosis/index.ts +5 -5
  35. package/src/index.ts +4 -18
  36. package/src/net/protocol/dial/SignatureDialProtocol.ts +6 -2
  37. package/src/tasks/{InteropBridge/ProcessWithdrawEvents.ts → InteropXContract/ProcessBridgeRequestEvents.ts} +78 -100
  38. package/src/tasks/InteropXContract/SyncBridgeCommittedEvents.ts +125 -0
  39. package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +115 -0
  40. package/src/tasks/InteropXContract/SyncBridgeRequestSentEvents.ts +121 -0
  41. package/src/tasks/index.ts +18 -36
  42. package/src/typechain/InteropXContract.ts +680 -0
  43. package/src/typechain/factories/InteropXContract__factory.ts +642 -0
  44. package/src/typechain/factories/index.ts +1 -2
  45. package/src/typechain/index.ts +2 -4
  46. package/src/utils/index.ts +85 -8
  47. package/tsconfig.json +7 -2
  48. package/dist/src/abi/interopBridgeToken.json +0 -298
  49. package/dist/src/abi/interopXGateway.json +0 -184
  50. package/dist/src/constants/itokens.js +0 -13
  51. package/dist/src/gnosis/actions/deposit.js +0 -48
  52. package/dist/src/gnosis/actions/withdraw.js +0 -50
  53. package/dist/src/tasks/InteropBridge/SyncBurnEvents.js +0 -71
  54. package/dist/src/tasks/InteropBridge/SyncMintEvents.js +0 -67
  55. package/dist/src/tasks/InteropXGateway/ProcessDepositEvents.js +0 -164
  56. package/dist/src/tasks/InteropXGateway/SyncDepositEvents.js +0 -74
  57. package/dist/src/tasks/InteropXGateway/SyncWithdrawtEvents.js +0 -72
  58. package/dist/src/typechain/InteropXGateway.js +0 -2
  59. package/dist/src/typechain/factories/InteropBridgeToken__factory.js +0 -471
  60. package/dist/src/typechain/factories/InteropXGateway__factory.js +0 -265
  61. package/src/abi/interopBridgeToken.json +0 -298
  62. package/src/abi/interopXGateway.json +0 -184
  63. package/src/constants/itokens.ts +0 -10
  64. package/src/gnosis/actions/deposit.ts +0 -63
  65. package/src/gnosis/actions/withdraw.ts +0 -67
  66. package/src/tasks/InteropBridge/SyncBurnEvents.ts +0 -119
  67. package/src/tasks/InteropBridge/SyncMintEvents.ts +0 -99
  68. package/src/tasks/InteropXGateway/ProcessDepositEvents.ts +0 -260
  69. package/src/tasks/InteropXGateway/SyncDepositEvents.ts +0 -124
  70. package/src/tasks/InteropXGateway/SyncWithdrawtEvents.ts +0 -105
  71. package/src/typechain/InteropBridgeToken.ts +0 -692
  72. package/src/typechain/InteropXGateway.ts +0 -407
  73. package/src/typechain/factories/InteropBridgeToken__factory.ts +0 -478
  74. package/src/typechain/factories/InteropXGateway__factory.ts +0 -272
@@ -2,102 +2,125 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.tokens = void 0;
4
4
  exports.tokens = {
5
- 1: [
6
- {
7
- symbol: "ETH",
8
- name: "Ethereum",
9
- address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
10
- decimals: 18,
11
- },
12
- {
13
- symbol: "DAI",
14
- name: "DAI Stable",
15
- address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
16
- decimals: 18,
17
- },
18
- {
19
- symbol: "USDC",
20
- name: "USD Coin",
21
- address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
22
- decimals: 6,
23
- },
24
- {
25
- symbol: "USDT",
26
- name: "Tether USD Coin",
27
- address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
28
- decimals: 6,
29
- },
30
- {
31
- symbol: "WBTC",
32
- name: "Wrapped BTC",
33
- address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
34
- decimals: 8,
35
- },
36
- ],
5
+ // 1: [
6
+ // {
7
+ // aliases: ['eth'],
8
+ // symbol: "ETH",
9
+ // name: "Ethereum",
10
+ // address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
11
+ // decimals: 18,
12
+ // },
13
+ // {
14
+ // aliases: ['weth'],
15
+ // symbol: "WETH",
16
+ // name: "Wrapped Ethereum",
17
+ // address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
18
+ // decimals: 18,
19
+ // },
20
+ // {
21
+ // aliases: ['dai'],
22
+ // symbol: "DAI",
23
+ // name: "DAI Stable",
24
+ // address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
25
+ // decimals: 18,
26
+ // },
27
+ // {
28
+ // aliases: ['usdc'],
29
+ // symbol: "USDC",
30
+ // name: "USD Coin",
31
+ // address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
32
+ // decimals: 6,
33
+ // },
34
+ // {
35
+ // aliases: ['usdt'],
36
+ // symbol: "USDT",
37
+ // name: "Tether USD Coin",
38
+ // address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
39
+ // decimals: 6,
40
+ // },
41
+ // {
42
+ // aliases: ['wbtc'],
43
+ // symbol: "WBTC",
44
+ // name: "Wrapped BTC",
45
+ // address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
46
+ // decimals: 8,
47
+ // },
48
+ // ],
37
49
  137: [
38
50
  {
51
+ aliases: ['eth', 'weth'],
39
52
  symbol: "ETH",
40
53
  name: "Ethereum",
41
54
  address: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
42
55
  decimals: 18,
43
56
  },
44
57
  {
58
+ aliases: ['dai'],
45
59
  symbol: "DAI",
46
60
  name: "DAI Stable",
47
61
  address: "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063",
48
62
  decimals: 18,
49
63
  },
50
64
  {
65
+ aliases: ['usdc'],
51
66
  symbol: "USDC",
52
67
  name: "USD Coin",
53
68
  address: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
54
69
  decimals: 6,
55
70
  },
56
71
  {
72
+ aliases: ['usdt'],
57
73
  symbol: "USDT",
58
74
  name: "Tether USD Coin",
59
75
  address: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
60
76
  decimals: 6,
61
77
  },
62
78
  {
79
+ aliases: ['wbtc'],
63
80
  symbol: "WBTC",
64
81
  name: "Wrapped BTC",
65
82
  address: "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6",
66
83
  decimals: 8,
67
84
  },
68
- {
69
- symbol: "AVAX",
70
- name: "Avalanche Token",
71
- address: "0x2C89bbc92BD86F8075d1DEcc58C7F4E0107f286b",
72
- decimals: 18,
73
- },
74
85
  ],
75
86
  43114: [
76
87
  {
88
+ aliases: ['eth', 'weth'],
77
89
  symbol: "ETH",
78
90
  name: "Ethereum",
79
91
  address: "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB",
80
92
  decimals: 18,
81
93
  },
82
94
  {
95
+ aliases: ['dai'],
83
96
  symbol: "DAI",
84
97
  name: "DAI Stable",
85
98
  address: "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70",
86
99
  decimals: 18,
87
100
  },
88
101
  {
102
+ aliases: ['usdc'],
89
103
  symbol: "USDC",
90
104
  name: "USD Coin",
91
105
  address: "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664",
92
106
  decimals: 6,
93
107
  },
94
108
  {
95
- symbol: "USDT",
109
+ aliases: ['usdt'],
110
+ symbol: "USDt",
96
111
  name: "Tether USD Coin",
112
+ address: "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",
113
+ decimals: 6,
114
+ },
115
+ {
116
+ aliases: ['usdt'],
117
+ symbol: "USDT.e",
118
+ name: "Tether USD",
97
119
  address: "0xc7198437980c041c805A1EDcbA50c1Ce5db95118",
98
120
  decimals: 6,
99
121
  },
100
122
  {
123
+ aliases: ["wbtc"],
101
124
  symbol: "WBTC",
102
125
  name: "Wrapped BTC",
103
126
  address: "0x50b7545627a5162F82A992c33b87aDc75187B218",
@@ -12,16 +12,18 @@ Transaction.init({
12
12
  autoIncrement: true,
13
13
  primaryKey: true
14
14
  },
15
- submitTransactionHash: sequelize_2.DataTypes.NUMBER,
16
- submitBlockNumber: sequelize_2.DataTypes.NUMBER,
15
+ requestTransactionHash: sequelize_2.DataTypes.NUMBER,
16
+ requestBlockNumber: sequelize_2.DataTypes.NUMBER,
17
17
  transactionHash: sequelize_2.DataTypes.STRING,
18
- action: sequelize_2.DataTypes.STRING,
19
- from: sequelize_2.DataTypes.STRING,
20
- to: sequelize_2.DataTypes.STRING,
18
+ actionId: sequelize_2.DataTypes.STRING,
19
+ bridger: sequelize_2.DataTypes.STRING,
21
20
  sourceChainId: sequelize_2.DataTypes.NUMBER,
22
21
  sourceTransactionHash: sequelize_2.DataTypes.STRING,
23
22
  sourceBlockNumber: sequelize_2.DataTypes.NUMBER,
24
- sourceStatus: sequelize_2.DataTypes.STRING,
23
+ sourceStatus: {
24
+ type: sequelize_2.DataTypes.STRING,
25
+ defaultValue: 'uninitialised'
26
+ },
25
27
  sourceErrors: {
26
28
  type: sequelize_2.DataTypes.JSON,
27
29
  // defaultValue: [],
@@ -38,7 +40,10 @@ Transaction.init({
38
40
  targetChainId: sequelize_2.DataTypes.NUMBER,
39
41
  targetTransactionHash: sequelize_2.DataTypes.STRING,
40
42
  targetBlockNumber: sequelize_2.DataTypes.NUMBER,
41
- targetStatus: sequelize_2.DataTypes.STRING,
43
+ targetStatus: {
44
+ type: sequelize_2.DataTypes.STRING,
45
+ defaultValue: 'uninitialised'
46
+ },
42
47
  targetErrors: {
43
48
  type: sequelize_2.DataTypes.JSON,
44
49
  // defaultValue: [],
@@ -49,10 +54,13 @@ Transaction.init({
49
54
  },
50
55
  targetCreatedAt: sequelize_2.DataTypes.DATE,
51
56
  targetDelayUntil: sequelize_2.DataTypes.DATE,
52
- submitEvent: sequelize_2.DataTypes.JSON,
53
- sourceEvent: sequelize_2.DataTypes.JSON,
54
- targetEvent: sequelize_2.DataTypes.JSON,
55
- metadata: sequelize_2.DataTypes.JSON,
57
+ requestEvent: {
58
+ type: sequelize_2.DataTypes.JSON,
59
+ allowNull: false
60
+ },
61
+ requestSentEvent: sequelize_2.DataTypes.JSON,
62
+ committedEvent: sequelize_2.DataTypes.JSON,
63
+ completedEvent: sequelize_2.DataTypes.JSON,
56
64
  status: {
57
65
  type: sequelize_2.DataTypes.STRING,
58
66
  defaultValue: 'pending'
@@ -3,9 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const deposit_1 = __importDefault(require("./deposit"));
7
6
  const withdraw_1 = __importDefault(require("./withdraw"));
8
7
  exports.default = {
9
- deposit: deposit_1.default,
10
8
  withdraw: withdraw_1.default,
11
9
  };
@@ -0,0 +1,115 @@
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 abi_1 = __importDefault(require("@/abi"));
7
+ const config_1 = __importDefault(require("@/config"));
8
+ const constants_1 = require("@/constants");
9
+ const utils_1 = require("@/utils");
10
+ const ethers_1 = require("ethers");
11
+ const ethers_multisend_1 = require("ethers-multisend");
12
+ const getBridgeAmounts = async (user, tokens, chainId) => {
13
+ const sourceChainProvider = new ethers_1.ethers.providers.JsonRpcProvider((0, utils_1.getRpcProviderUrl)(chainId));
14
+ const sourceWallet = new ethers_1.ethers.Wallet(config_1.default.privateKey, sourceChainProvider);
15
+ const contractAddress = constants_1.addresses[chainId].interopXContract;
16
+ const contract = (0, utils_1.getContract)(contractAddress, abi_1.default.interopXContract, sourceWallet);
17
+ const data = await contract.getBridgeAmounts(user, tokens);
18
+ return data.map((item, index) => ({
19
+ token: tokens[index],
20
+ deposit: item.deposit,
21
+ withdraw: item.withdraw,
22
+ }));
23
+ };
24
+ async function default_1(transaction, type) {
25
+ const transactions = [];
26
+ const logs = [];
27
+ if (transaction.actionId !== 'withdraw') {
28
+ throw new Error(`Invalid action: ${transaction.actionId}`);
29
+ }
30
+ if (type !== 'source') {
31
+ throw new Error(`[WIP] Type not supported: ${type}`);
32
+ }
33
+ if (transaction.sourceStatus === 'pending') {
34
+ throw Error('Source transaction already processesing');
35
+ }
36
+ if (transaction.sourceStatus === 'pending') {
37
+ throw Error('Source transaction already processed');
38
+ }
39
+ if (!transaction.requestEvent) {
40
+ throw Error('Something went wrong, source transaction has no request event');
41
+ }
42
+ const { actionId, bridger, position, sourceChainId, targetChainId, metadata } = transaction.requestEvent;
43
+ const sourceChainProvider = new ethers_1.ethers.providers.JsonRpcProvider((0, utils_1.getRpcProviderUrl)(sourceChainId));
44
+ const sourceWallet = new ethers_1.ethers.Wallet(config_1.default.privateKey, sourceChainProvider);
45
+ const contractAddress = constants_1.addresses[sourceChainId].interopXContract;
46
+ const contract = (0, utils_1.getContract)(contractAddress, abi_1.default.interopXContract, sourceWallet);
47
+ const sourceToken = constants_1.tokens[sourceChainId].find(t => t.address.toLowerCase() === position.withdraw[0].sourceToken.toLowerCase());
48
+ if (!sourceToken) {
49
+ throw Error('Source token not found');
50
+ }
51
+ const targetToken = constants_1.tokens[targetChainId].find(t => t.address.toLowerCase() === position.withdraw[0].targetToken.toLowerCase());
52
+ if (!targetToken) {
53
+ throw Error('Target token not found');
54
+ }
55
+ if (!sourceToken.aliases.some(alias => targetToken.aliases.includes(alias))) {
56
+ throw Error('Source and target token must be the same');
57
+ }
58
+ const networks = [137, 43114];
59
+ const networkUserData = {};
60
+ for (const network of networks) {
61
+ networkUserData[network] = await getBridgeAmounts(bridger, constants_1.tokens[network].map(t => t.address), network);
62
+ }
63
+ for (const tokenSymbol of ["dai", "usdc", "usdt", "eth", "wbtc"]) {
64
+ let totalDeposit = ethers_1.BigNumber.from(0);
65
+ let totalWithdraw = ethers_1.BigNumber.from(0);
66
+ for (const network of networks) {
67
+ // on avax might we have 2 usdc/usdt tokens
68
+ const matchedTokens = constants_1.tokens[network].filter(t => t.aliases.includes(tokenSymbol));
69
+ for (const matchedToken of matchedTokens) {
70
+ const data = networkUserData[network].find(t => t.token.toLowerCase() === matchedToken.address.toLowerCase());
71
+ if (data) {
72
+ totalDeposit = totalDeposit.add(data.deposit);
73
+ totalWithdraw = totalWithdraw.add(data.withdraw);
74
+ }
75
+ }
76
+ // on Mainent add weth too
77
+ if (tokenSymbol === "eth" && network === 1) {
78
+ const weth = constants_1.tokens[1].find(t => t.symbol === 'WETH');
79
+ if (weth) {
80
+ const data = networkUserData[1].find(t => t.token.toLowerCase() === weth.address.toLowerCase());
81
+ if (data) {
82
+ totalDeposit = totalDeposit.add(data.deposit);
83
+ totalWithdraw = totalWithdraw.add(data.withdraw);
84
+ }
85
+ }
86
+ }
87
+ if (totalWithdraw.gt(totalDeposit)) {
88
+ throw Error(`if withdraw > deposit, user has debt and we can't process the withdraw and reject it`);
89
+ }
90
+ if (totalWithdraw.lt(totalDeposit)) {
91
+ throw Error('Something went wrong');
92
+ }
93
+ }
94
+ }
95
+ let balance = ethers_1.BigNumber.from(0);
96
+ if (position.withdraw[0].sourceToken.toLowerCase() === '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'.toLowerCase()) {
97
+ balance = await sourceChainProvider.getBalance(bridger);
98
+ }
99
+ else {
100
+ const erc20 = (0, utils_1.getContract)(position.withdraw[0].sourceToken, abi_1.default.erc20, sourceChainProvider);
101
+ balance = await erc20.balanceOf(constants_1.addresses[sourceChainId].gnosisSafe);
102
+ }
103
+ if (balance.lt(position.withdraw[0].amount)) {
104
+ throw new utils_1.LiquidityError();
105
+ }
106
+ const { data } = await contract.populateTransaction.withdrawRequested(actionId, bridger, position.withdraw[0].sourceToken, position.withdraw[0].targetToken, position.withdraw[0].amount, targetChainId, transaction.requestTransactionHash, metadata);
107
+ transactions.push({
108
+ to: contractAddress,
109
+ data: data,
110
+ value: '0',
111
+ operation: ethers_multisend_1.OperationType.Call,
112
+ });
113
+ return { transactions, logs };
114
+ }
115
+ exports.default = default_1;
@@ -7,14 +7,14 @@ exports.buildGnosisAction = void 0;
7
7
  const ethers_multisend_1 = require("ethers-multisend");
8
8
  const actions_1 = __importDefault(require("./actions"));
9
9
  const buildGnosisAction = async (transaction, type) => {
10
- type = type || transaction.sourceStatus === 'pending' ? 'source' : 'target';
11
- if (actions_1.default.hasOwnProperty(transaction.action)) {
12
- const { transactions, logs } = await actions_1.default[transaction.action](transaction, type);
10
+ // type = type || (transaction.sourceStatus === 'success' ? 'target' : 'source')
11
+ if (actions_1.default.hasOwnProperty(transaction.actionId)) {
12
+ const { transactions, logs } = await actions_1.default[transaction.actionId](transaction, type);
13
13
  return {
14
14
  data: (0, ethers_multisend_1.encodeMulti)(transactions).data,
15
15
  logs
16
16
  };
17
17
  }
18
- throw new Error(`Unknown action: ${transaction.action}`);
18
+ throw new Error(`Unknown action: ${transaction.actionId}`);
19
19
  };
20
20
  exports.buildGnosisAction = buildGnosisAction;
package/dist/src/index.js CHANGED
@@ -3,25 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const module_alias_1 = __importDefault(require("module-alias"));
6
+ require("./alias");
7
7
  const expand_home_dir_1 = __importDefault(require("expand-home-dir"));
8
8
  const fs_extra_1 = __importDefault(require("fs-extra"));
9
- module_alias_1.default.addAliases({
10
- "@/": __dirname + "/",
11
- "@/logger": __dirname + "/logger",
12
- "@/tasks": __dirname + "/tasks",
13
- "@/gnosis": __dirname + "/gnosis",
14
- "@/utils": __dirname + "/utils",
15
- "@/api": __dirname + "/api",
16
- "@/net": __dirname + "/net",
17
- "@/db": __dirname + "/db",
18
- "@/config": __dirname + "/config",
19
- "@/types": __dirname + "/types",
20
- "@/abi": __dirname + "/abi",
21
- "@/constants": __dirname + "/constants",
22
- "@/typechain": __dirname + "/typechain"
23
- });
24
- (0, module_alias_1.default)();
25
9
  const dotenv_1 = __importDefault(require("dotenv"));
26
10
  const chalk_1 = __importDefault(require("chalk"));
27
11
  const ethers_1 = require("ethers");
@@ -29,7 +13,7 @@ const package_json_1 = __importDefault(require("../package.json"));
29
13
  dotenv_1.default.config();
30
14
  const logger_1 = __importDefault(require("@/logger"));
31
15
  const logger = new logger_1.default('Process');
32
- const GIT_SHORT_HASH = '733ff78';
16
+ const GIT_SHORT_HASH = '76d0265';
33
17
  const printUsage = () => {
34
18
  console.log();
35
19
  console.log(`Interop X Node (v${package_json_1.default.version} - rev.${GIT_SHORT_HASH})`);
@@ -88,7 +72,9 @@ const utils_1 = require("./utils");
88
72
  async function main() {
89
73
  (0, net_1.startPeer)({});
90
74
  const tasks = new tasks_1.Tasks();
91
- tasks.start();
75
+ setTimeout(() => {
76
+ tasks.start();
77
+ }, 10000);
92
78
  (0, api_1.startApiServer)();
93
79
  net_1.protocol.on('TransactionStatus', async (payload) => {
94
80
  if (!net_1.peerPool.isLeadNode(payload.peerId)) {
@@ -17,6 +17,10 @@ class SignatureDialProtocol extends BaseDialProtocol_1.BaseDialProtocol {
17
17
  this.timeout = 30000;
18
18
  }
19
19
  async response(data) {
20
+ console.log({
21
+ tag: 'SignatureDialProtocol',
22
+ data
23
+ });
20
24
  const signer = config_1.default.wallet;
21
25
  let transaction;
22
26
  let maxTimeout = 20000;
@@ -36,9 +40,9 @@ class SignatureDialProtocol extends BaseDialProtocol_1.BaseDialProtocol {
36
40
  }
37
41
  const { data: gnosisData } = await (0, gnosis_1.buildGnosisAction)(transaction, data.type);
38
42
  const signedData = await (0, utils_1.signGnosisSafeTx)({
39
- to: constants_1.addresses[transaction.targetChainId].multisend,
43
+ to: constants_1.addresses[transaction.sourceChainId].multisend,
40
44
  data: gnosisData,
41
- chainId: transaction.targetChainId,
45
+ chainId: transaction.sourceChainId,
42
46
  safeTxGas: data.safeTxGas,
43
47
  nonce: data.safeNonce,
44
48
  }, { signer });
@@ -10,24 +10,15 @@ const abi_1 = __importDefault(require("@/abi"));
10
10
  const db_1 = require("@/db");
11
11
  const utils_1 = require("@/utils");
12
12
  const constants_1 = require("@/constants");
13
- const config_1 = __importDefault(require("@/config"));
14
13
  const sequelize_1 = require("sequelize");
14
+ const config_1 = __importDefault(require("@/config"));
15
15
  const waait_1 = __importDefault(require("waait"));
16
- const net_1 = require("@/net");
17
16
  const gnosis_1 = require("@/gnosis");
18
- const generateGnosisTransaction = async (transactionData, safeContract) => {
19
- console.log(transactionData);
20
- let isExecuted = await safeContract.dataHashes(await safeContract.getTransactionHash(transactionData.to, transactionData.value, transactionData.data, transactionData.operation, transactionData.safeTxGas, transactionData.baseGas, transactionData.gasPrice, transactionData.gasToken, transactionData.refundReceiver, transactionData.nonce));
21
- while (isExecuted == 1) {
22
- transactionData.safeTxGas = ethers_1.BigNumber.from(String(transactionData.safeTxGas)).add(1).toString();
23
- isExecuted = await safeContract.dataHashes(await safeContract.getTransactionHash(transactionData.to, transactionData.value, transactionData.data, transactionData.operation, transactionData.safeTxGas, transactionData.baseGas, transactionData.gasPrice, transactionData.gasToken, transactionData.refundReceiver, transactionData.nonce));
24
- }
25
- return transactionData;
26
- };
27
- class ProcessWithdrawEvents extends BaseTask_1.BaseTask {
17
+ const net_1 = require("@/net");
18
+ class ProccessBridgeRequestEvents extends BaseTask_1.BaseTask {
28
19
  constructor({ chainId }) {
29
20
  super({
30
- logger: new logger_1.default("InteropXGateway::ProcessWithdrawEvents"),
21
+ logger: new logger_1.default("InteropXContract::ProccessBridgeRequestEvents"),
31
22
  });
32
23
  this.leadNodeOnly = true;
33
24
  this.chainId = chainId;
@@ -38,19 +29,17 @@ class ProcessWithdrawEvents extends BaseTask_1.BaseTask {
38
29
  const transaction = await db_1.Transaction.findOne({
39
30
  where: {
40
31
  status: 'pending',
41
- sourceStatus: 'success',
42
- targetStatus: 'uninitialised',
43
- action: 'withdraw',
44
- sourceCreatedAt: {
32
+ sourceStatus: 'uninitialised',
33
+ createdAt: {
45
34
  [sequelize_1.Op.gte]: new Date(Date.now() - 12 * 60 * 60 * 1000),
46
35
  },
47
- targetDelayUntil: {
36
+ sourceDelayUntil: {
48
37
  [sequelize_1.Op.or]: {
49
38
  [sequelize_1.Op.is]: null,
50
39
  [sequelize_1.Op.lt]: new Date(),
51
40
  }
52
41
  },
53
- sourceBlockNumber: {
42
+ requestBlockNumber: {
54
43
  [sequelize_1.Op.lt]: blockNumber - 12,
55
44
  },
56
45
  sourceChainId: this.chainId,
@@ -62,27 +51,30 @@ class ProcessWithdrawEvents extends BaseTask_1.BaseTask {
62
51
  console.log(`Processing transaction ${transaction.transactionHash}`);
63
52
  transaction.targetStatus = 'pending';
64
53
  await transaction.save();
65
- // refresh event data?
66
- const targetChainProvider = new ethers_1.ethers.providers.JsonRpcProvider((0, utils_1.getRpcProviderUrl)(transaction.targetChainId));
67
- const targetWallet = new ethers_1.ethers.Wallet(config_1.default.privateKey, targetChainProvider);
68
- const safeAddress = constants_1.addresses[transaction.targetChainId].gnosisSafe;
69
- const safeContract = (0, utils_1.getContract)(safeAddress, abi_1.default.gnosisSafe, targetWallet);
70
- const ownersThreshold = await safeContract.getThreshold();
54
+ const ownersThreshold = await this.safeContract.getThreshold();
71
55
  await (0, waait_1.default)(10000);
72
56
  let data, logs = [];
73
57
  try {
74
- ({ data, logs } = await (0, gnosis_1.buildGnosisAction)(transaction));
58
+ ({ data, logs } = await (0, gnosis_1.buildGnosisAction)(transaction, 'source'));
75
59
  }
76
60
  catch (error) {
77
- console.log(error);
61
+ if (error instanceof utils_1.LiquidityError) {
62
+ await transaction.save();
63
+ transaction.sourceDelayUntil = new Date(Date.now() + 60 * 5 * 1000);
64
+ transaction.sourceStatus = 'uninitialised';
65
+ await transaction.save();
66
+ throw error;
67
+ return;
68
+ }
69
+ transaction.sourceStatus = 'failed';
70
+ transaction.sourceErrors = [error.message];
78
71
  transaction.targetStatus = 'failed';
79
- transaction.targetErrors = [error.message];
80
72
  transaction.status = 'failed';
81
73
  await transaction.save();
82
74
  net_1.protocol.sendTransaction(transaction);
83
75
  return;
84
76
  }
85
- let gnosisTx = await generateGnosisTransaction({
77
+ let gnosisTx = await (0, utils_1.generateGnosisTransaction)({
86
78
  baseGas: "0",
87
79
  data,
88
80
  gasPrice: "0",
@@ -90,12 +82,12 @@ class ProcessWithdrawEvents extends BaseTask_1.BaseTask {
90
82
  nonce: '0',
91
83
  operation: "1",
92
84
  refundReceiver: "0x0000000000000000000000000000000000000000",
93
- safeAddress: safeAddress,
85
+ safeAddress: this.safeContractAddress,
94
86
  safeTxGas: "79668",
95
- to: constants_1.addresses[transaction.targetChainId].multisend,
87
+ to: constants_1.addresses[transaction.sourceChainId].multisend,
96
88
  value: "0",
97
- }, safeContract);
98
- const owners = await safeContract.getOwners().then(owners => owners.map(owner => owner.toLowerCase()));
89
+ }, this.safeContract);
90
+ const owners = await this.safeContract.getOwners().then(owners => owners.map(owner => owner.toLowerCase()));
99
91
  const ownerPeerIds = net_1.peerPool.activePeers.filter(peer => owners.includes(peer.publicAddress.toLowerCase())).map(peer => peer.id);
100
92
  console.log(`Collecting signatures for execution ${transaction.transactionHash}`);
101
93
  console.log(ownerPeerIds);
@@ -109,54 +101,59 @@ class ProcessWithdrawEvents extends BaseTask_1.BaseTask {
109
101
  console.log({ signatures, validSignatures, ownersThreshold: ownersThreshold.toString() });
110
102
  if (validSignatures.length === 0 || ownersThreshold.gt(validSignatures.length)) {
111
103
  await transaction.save();
112
- transaction.targetDelayUntil = new Date(Date.now() + 30 * 1000);
113
- transaction.targetStatus = 'uninitialised';
104
+ transaction.sourceDelayUntil = new Date(Date.now() + 30 * 1000);
105
+ transaction.sourceStatus = 'uninitialised';
114
106
  await transaction.save();
115
107
  const errorMessage = (_a = signatures.find(s => !!s.error)) === null || _a === void 0 ? void 0 : _a.error;
116
108
  throw new Error(`Not enough signatures` + (errorMessage ? `: ${errorMessage}` : ''));
117
109
  }
118
110
  console.log(`Executing transaction for execution ${transaction.transactionHash}`);
119
- 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
- console.log({
121
- from: targetWallet.address,
122
- gasPrice: ethers_1.BigNumber.from(120 * 10 ** 9).toString(),
123
- to: safeAddress,
124
- data: txData,
125
- });
126
- const txSent = await targetWallet.sendTransaction({
127
- from: targetWallet.address,
128
- gasPrice: ethers_1.BigNumber.from(120 * 10 ** 9),
129
- to: safeAddress,
111
+ const { data: txData } = await this.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));
112
+ const txSent = await this.sourceWallet.sendTransaction({
113
+ from: this.sourceWallet.address,
114
+ gasPrice: ethers_1.ethers.BigNumber.from(120 * 10 ** 9),
115
+ to: this.safeContractAddress,
130
116
  data: txData,
131
117
  });
118
+ console.log(txSent);
132
119
  const receipt = await txSent.wait();
133
120
  const parsedLogs = [];
134
121
  receipt.logs.forEach((log) => {
135
122
  try {
136
- parsedLogs.push(safeContract.interface.parseLog(log));
123
+ parsedLogs.push(this.safeContract.interface.parseLog(log));
137
124
  }
138
125
  catch (e) { }
139
126
  });
140
127
  if (parsedLogs.find(e => e.name === 'ExecutionSuccess')) {
141
128
  console.log('ExecutionSuccess');
142
- transaction.targetStatus = 'success';
143
- transaction.targetTransactionHash = txSent.hash;
144
- transaction.targetLogs = logs;
129
+ transaction.sourceStatus = 'success';
130
+ if (txSent.blockNumber)
131
+ transaction.sourceBlockNumber = txSent.blockNumber;
132
+ transaction.sourceTransactionHash = txSent.hash;
133
+ transaction.sourceLogs = logs;
145
134
  transaction.status = 'success';
146
135
  await transaction.save();
147
136
  }
148
137
  else {
149
138
  console.log('ExecutionFailure');
150
- transaction.targetStatus = 'failed';
151
- transaction.targetTransactionHash = txSent.hash;
139
+ transaction.sourceStatus = 'failed';
140
+ if (txSent.blockNumber)
141
+ transaction.sourceBlockNumber = txSent.blockNumber;
142
+ transaction.sourceTransactionHash = txSent.hash;
143
+ transaction.sourceTransactionHash = txSent.hash;
152
144
  transaction.status = 'failed';
153
145
  await transaction.save();
154
146
  }
155
147
  net_1.protocol.sendTransaction(transaction);
156
148
  }
157
149
  async start() {
150
+ this.contractAddress = constants_1.addresses[this.chainId].interopXContract;
158
151
  this.provider = new ethers_1.ethers.providers.JsonRpcProvider((0, utils_1.getRpcProviderUrl)(this.chainId));
152
+ this.sourceWallet = new ethers_1.ethers.Wallet(config_1.default.privateKey, this.provider);
153
+ this.contract = (0, utils_1.getContract)(this.contractAddress, abi_1.default.interopXContract, this.sourceWallet);
154
+ this.safeContractAddress = constants_1.addresses[this.chainId].gnosisSafe;
155
+ this.safeContract = (0, utils_1.getContract)(this.safeContractAddress, abi_1.default.gnosisSafe, this.sourceWallet);
159
156
  await super.start();
160
157
  }
161
158
  }
162
- exports.default = ProcessWithdrawEvents;
159
+ exports.default = ProccessBridgeRequestEvents;