@instadapp/interop-x 0.0.0-dev.5953f3d → 0.0.0-dev.5a90c8d

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.
Files changed (92) hide show
  1. package/dist/package.json +8 -1
  2. package/dist/src/abi/aaveV2Resolver.json +832 -0
  3. package/dist/src/abi/balanceResolver.json +211 -0
  4. package/dist/src/abi/index.js +6 -0
  5. package/dist/src/abi/instList.json +232 -0
  6. package/dist/src/api/index.js +7 -0
  7. package/dist/src/constants/addresses.js +8 -2
  8. package/dist/src/constants/capPerChain.js +8 -0
  9. package/dist/src/constants/index.js +2 -0
  10. package/dist/src/constants/tokens.js +44 -44
  11. package/dist/src/constants/wrappedNativeToken.js +8 -0
  12. package/dist/src/crons/index.js +3 -0
  13. package/dist/src/crons/prices.js +16 -0
  14. package/dist/src/db/models/transaction.js +15 -7
  15. package/dist/src/errors/index.js +30 -0
  16. package/dist/src/gnosis/actions/aaveV2/source.js +17 -5
  17. package/dist/src/gnosis/actions/aaveV2/target.js +79 -0
  18. package/dist/src/index.js +2 -1
  19. package/dist/src/providers/index.js +17 -0
  20. package/dist/src/providers/retry-provider.js +45 -0
  21. package/dist/src/services/Prices.js +74 -0
  22. package/dist/src/services/index.js +8 -0
  23. package/dist/src/tasks/InteropX/{ProcessSubmitSubmitEvents.js → ProcessSubmitEvents.js} +84 -7
  24. package/dist/src/tasks/InteropX/ProcessValidateEvents.js +185 -0
  25. package/dist/src/tasks/InteropX/SyncLogExecuteEvents.js +113 -0
  26. package/dist/src/tasks/InteropX/SyncLogSubmitEvents.js +3 -1
  27. package/dist/src/tasks/InteropX/SyncLogValidateEvents.js +106 -0
  28. package/dist/src/tasks/index.js +13 -5
  29. package/dist/src/typechain/AaveV2Resolver.js +2 -0
  30. package/dist/src/typechain/BalanceResolver.js +2 -0
  31. package/dist/src/typechain/InstList.js +2 -0
  32. package/dist/src/typechain/factories/AaveV2Resolver__factory.js +1191 -0
  33. package/dist/src/typechain/factories/BalanceResolver__factory.js +228 -0
  34. package/dist/src/typechain/factories/InstList__factory.js +249 -0
  35. package/dist/src/typechain/factories/index.js +7 -1
  36. package/dist/src/typechain/index.js +7 -1
  37. package/dist/src/utils/async.js +18 -0
  38. package/dist/src/utils/dsa.js +24 -0
  39. package/dist/src/utils/formatting.js +67 -0
  40. package/dist/src/utils/gnosis.js +62 -0
  41. package/dist/src/utils/http.js +10 -0
  42. package/dist/src/utils/index.js +22 -220
  43. package/dist/src/utils/interop.js +16 -0
  44. package/dist/src/utils/tokens.js +22 -0
  45. package/dist/src/utils/validate.js +111 -0
  46. package/dist/src/utils/web3.js +93 -0
  47. package/package.json +8 -1
  48. package/src/abi/aaveV2Resolver.json +832 -0
  49. package/src/abi/balanceResolver.json +211 -0
  50. package/src/abi/index.ts +6 -0
  51. package/src/abi/instList.json +232 -0
  52. package/src/api/index.ts +8 -0
  53. package/src/constants/addresses.ts +19 -3
  54. package/src/constants/capPerChain.ts +5 -0
  55. package/src/constants/index.ts +2 -0
  56. package/src/constants/tokens.ts +44 -44
  57. package/src/constants/wrappedNativeToken.ts +5 -0
  58. package/src/crons/index.ts +1 -0
  59. package/src/crons/prices.ts +12 -0
  60. package/src/db/models/transaction.ts +134 -80
  61. package/src/errors/index.ts +26 -0
  62. package/src/gnosis/actions/aaveV2/source.ts +21 -6
  63. package/src/gnosis/actions/aaveV2/target.ts +131 -2
  64. package/src/index.ts +1 -0
  65. package/src/providers/index.ts +1 -0
  66. package/src/providers/retry-provider.ts +51 -0
  67. package/src/services/Prices.ts +89 -0
  68. package/src/services/index.ts +1 -0
  69. package/src/tasks/InteropX/{ProcessSubmitSubmitEvents.ts → ProcessSubmitEvents.ts} +104 -11
  70. package/src/tasks/InteropX/ProcessValidateEvents.ts +272 -0
  71. package/src/tasks/InteropX/SyncLogExecuteEvents.ts +161 -0
  72. package/src/tasks/InteropX/SyncLogSubmitEvents.ts +6 -6
  73. package/src/tasks/InteropX/SyncLogValidateEvents.ts +151 -0
  74. package/src/tasks/index.ts +16 -5
  75. package/src/typechain/AaveV2Resolver.ts +1017 -0
  76. package/src/typechain/BalanceResolver.ts +266 -0
  77. package/src/typechain/InstList.ts +402 -0
  78. package/src/typechain/factories/AaveV2Resolver__factory.ts +1198 -0
  79. package/src/typechain/factories/BalanceResolver__factory.ts +235 -0
  80. package/src/typechain/factories/InstList__factory.ts +253 -0
  81. package/src/typechain/factories/index.ts +3 -0
  82. package/src/typechain/index.ts +6 -0
  83. package/src/utils/async.ts +22 -0
  84. package/src/utils/dsa.ts +30 -0
  85. package/src/utils/formatting.ts +68 -0
  86. package/src/utils/gnosis.ts +123 -0
  87. package/src/utils/http.ts +6 -0
  88. package/src/utils/index.ts +9 -365
  89. package/src/utils/interop.ts +28 -0
  90. package/src/utils/tokens.ts +21 -0
  91. package/src/utils/validate.ts +174 -0
  92. package/src/utils/web3.ts +132 -0
@@ -1,74 +1,116 @@
1
- import { sequelize } from '@/db/sequelize'
2
- import { CreationOptional, InferAttributes, InferCreationAttributes, Model, DataTypes } from 'sequelize';
1
+ import { sequelize } from "@/db/sequelize";
2
+ import {
3
+ CreationOptional,
4
+ InferAttributes,
5
+ InferCreationAttributes,
6
+ Model,
7
+ DataTypes,
8
+ } from "sequelize";
3
9
 
4
10
  export interface IPositionTokenInfo {
5
- amount: string;
6
- sourceToken: string;
7
- targetToken: string;
11
+ amount: string;
12
+ sourceToken: string;
13
+ targetToken: string;
8
14
  }
9
15
 
10
16
  export interface IPosition {
11
- supply: IPositionTokenInfo[];
12
- withdraw: IPositionTokenInfo[];
17
+ supply: IPositionTokenInfo[];
18
+ withdraw: IPositionTokenInfo[];
13
19
  }
14
20
 
15
- export class Transaction extends Model<InferAttributes<Transaction>, InferCreationAttributes<Transaction>> {
16
- declare id: CreationOptional<number>;
17
-
18
- declare transactionHash: string;
19
- declare vnonce: string;
20
- declare actionId: string;
21
- declare sourceSender: string;
22
-
23
- declare submitChainId: number;
24
- declare submitTransactionHash: string;
25
- declare submitBlockNumber: number;
26
- declare submitCreatedAt: Date;
27
-
28
- declare sourceChainId: number;
29
- declare sourceDsaId: string;
30
- declare sourceTransactionHash: CreationOptional<string>;
31
- declare sourceBlockNumber: CreationOptional<number>;
32
- declare sourceStatus: CreationOptional<string>;
33
- declare sourceErrors: CreationOptional<string[]>;
34
- declare sourceLogs: CreationOptional<any[]>;
35
- declare sourceCreatedAt: CreationOptional<Date>;
36
- declare sourceDelayUntil: CreationOptional<Date>;
37
-
38
- declare targetChainId: number;
39
- declare targetDsaId: string;
40
- declare targetTransactionHash: CreationOptional<string>;
41
- declare targetBlockNumber: CreationOptional<number>;
42
- declare targetStatus: CreationOptional<string>;
43
- declare targetErrors: CreationOptional<string[]>;
44
- declare targetLogs: CreationOptional<any[]>;
45
- declare targetCreatedAt: CreationOptional<Date>;
46
- declare targetDelayUntil: CreationOptional<Date>;
47
-
48
- declare submitEvent: {
49
- position: IPosition;
50
- actionId: string;
51
- actionIdHashHash: string;
52
- sourceSender: string;
53
- sourceDsaId: string;
54
- targetDsaId: string;
55
- sourceChainId: number;
56
- targetChainId: number;
57
- vnonce: string;
58
- metadata: string;
59
- };
60
-
61
- declare status: CreationOptional<string>;
62
-
63
- declare createdAt: CreationOptional<Date>;
64
- declare updatedAt: CreationOptional<Date>;
21
+ export class Transaction extends Model<
22
+ InferAttributes<Transaction>,
23
+ InferCreationAttributes<Transaction>
24
+ > {
25
+ declare id: CreationOptional<number>;
26
+
27
+ declare transactionHash: string;
28
+ declare vnonce: string;
29
+ declare actionId: string;
30
+ declare sourceSender: string;
31
+
32
+ declare submitChainId: number;
33
+ declare submitTransactionHash: string;
34
+ declare submitBlockNumber: number;
35
+ declare submitCreatedAt: Date;
36
+
37
+ declare sourceChainId: number;
38
+ declare sourceDsaId: string;
39
+ declare sourceTransactionHash: CreationOptional<string>;
40
+ declare sourceBlockNumber: CreationOptional<number>;
41
+ declare sourceStatus: CreationOptional<string>;
42
+ declare sourceErrors: CreationOptional<string[]>;
43
+ declare sourceLogs: CreationOptional<any[]>;
44
+ declare sourceCreatedAt: CreationOptional<Date>;
45
+ declare sourceDelayUntil: CreationOptional<Date>;
46
+
47
+ declare targetChainId: number;
48
+ declare targetDsaId: string;
49
+ declare targetTransactionHash: CreationOptional<string>;
50
+ declare targetBlockNumber: CreationOptional<number>;
51
+ declare targetStatus: CreationOptional<string>;
52
+ declare targetErrors: CreationOptional<string[]>;
53
+ declare targetLogs: CreationOptional<any[]>;
54
+ declare targetCreatedAt: CreationOptional<Date>;
55
+ declare targetDelayUntil: CreationOptional<Date>;
56
+
57
+ declare submitEvent: {
58
+ position: IPosition;
59
+ actionId: string;
60
+ actionIdHashHash: string;
61
+ actionIdHash: string;
62
+ sourceSender: string;
63
+ sourceDsaId: string;
64
+ targetDsaId: string;
65
+ sourceChainId: number;
66
+ targetChainId: number;
67
+ vnonce: string;
68
+ metadata: string;
69
+ };
70
+
71
+ declare validateEvent: CreationOptional<{
72
+ sourceSpells: Array<{ connector: string; data: string }>;
73
+ position: IPosition;
74
+ actionId: string;
75
+ actionIdHashHash: string;
76
+ actionIdHash: string;
77
+ sourceSender: string;
78
+ sourceDsaId: string;
79
+ targetDsaId: string;
80
+ sourceChainId: number;
81
+ targetChainId: number;
82
+ vnonce: string;
83
+ metadata: string;
84
+ }>;
85
+
86
+ declare executeEvent: CreationOptional<{
87
+ sourceSpells: Array<{ connector: string; data: string }>;
88
+ targetSpells: Array<{ connector: string; data: string }>;
89
+ position: IPosition;
90
+ actionId: string;
91
+ actionIdHashHash: string;
92
+ actionIdHash: string;
93
+ sourceSender: string;
94
+ sourceDsaId: string;
95
+ targetDsaId: string;
96
+ sourceChainId: number;
97
+ targetChainId: number;
98
+ vnonce: string;
99
+ metadata: string;
100
+ }>;
101
+
102
+ declare status: CreationOptional<string>;
103
+
104
+ declare createdAt: CreationOptional<Date>;
105
+ declare updatedAt: CreationOptional<Date>;
65
106
  }
66
107
 
67
- Transaction.init({
108
+ Transaction.init(
109
+ {
68
110
  id: {
69
- type: DataTypes.INTEGER,
70
- autoIncrement: true,
71
- primaryKey: true
111
+ type: DataTypes.INTEGER,
112
+ autoIncrement: true,
113
+ primaryKey: true,
72
114
  },
73
115
 
74
116
  transactionHash: DataTypes.STRING,
@@ -86,20 +128,20 @@ Transaction.init({
86
128
  sourceTransactionHash: DataTypes.STRING,
87
129
  sourceBlockNumber: DataTypes.NUMBER,
88
130
  sourceStatus: {
89
- type: DataTypes.STRING,
90
- defaultValue: 'pending'
131
+ type: DataTypes.STRING,
132
+ defaultValue: "pending",
91
133
  },
92
134
  sourceErrors: {
93
- type: DataTypes.JSON,
94
- // defaultValue: [],
135
+ type: DataTypes.JSON,
136
+ // defaultValue: [],
95
137
  },
96
138
  sourceLogs: {
97
- type: DataTypes.JSON,
98
- // defaultValue: [],
139
+ type: DataTypes.JSON,
140
+ // defaultValue: [],
99
141
  },
100
142
  sourceCreatedAt: {
101
- type: DataTypes.DATE,
102
- defaultValue: Date.now()
143
+ type: DataTypes.DATE,
144
+ defaultValue: Date.now(),
103
145
  },
104
146
  sourceDelayUntil: DataTypes.STRING,
105
147
 
@@ -108,29 +150,41 @@ Transaction.init({
108
150
  targetTransactionHash: DataTypes.STRING,
109
151
  targetBlockNumber: DataTypes.NUMBER,
110
152
  targetStatus: {
111
- type: DataTypes.STRING,
112
- defaultValue: 'pending'
153
+ type: DataTypes.STRING,
154
+ defaultValue: "pending",
113
155
  },
114
156
  targetErrors: {
115
- type: DataTypes.JSON,
116
- // defaultValue: [],
157
+ type: DataTypes.JSON,
158
+ // defaultValue: [],
117
159
  },
118
160
  targetLogs: {
119
- type: DataTypes.JSON,
120
- // defaultValue: [],
161
+ type: DataTypes.JSON,
162
+ // defaultValue: [],
121
163
  },
122
164
  targetCreatedAt: DataTypes.DATE,
123
165
  targetDelayUntil: DataTypes.DATE,
124
166
 
125
167
  submitEvent: {
126
- type: DataTypes.JSON,
127
- allowNull: false
168
+ type: DataTypes.JSON,
169
+ allowNull: false,
170
+ },
171
+
172
+ validateEvent: {
173
+ type: DataTypes.JSON,
174
+ allowNull: true,
175
+ },
176
+
177
+ executeEvent: {
178
+ type: DataTypes.JSON,
179
+ allowNull: true,
128
180
  },
129
181
 
130
182
  status: {
131
- type: DataTypes.STRING,
132
- defaultValue: 'pending'
183
+ type: DataTypes.STRING,
184
+ defaultValue: "pending",
133
185
  },
134
186
  createdAt: DataTypes.DATE,
135
187
  updatedAt: DataTypes.DATE,
136
- }, { sequelize, tableName: 'transactions' });
188
+ },
189
+ { sequelize, tableName: "transactions" }
190
+ );
@@ -0,0 +1,26 @@
1
+ export class UnsupportedChaindIdError extends Error {
2
+ constructor(chainId: any) {
3
+ super(`Unsupported chainId: ${chainId}`);
4
+ }
5
+ }
6
+
7
+ export class LiquidityError extends Error {
8
+ constructor(message?: string) {
9
+ super(message || "Not enough liquidity");
10
+ Object.setPrototypeOf(this, new.target.prototype);
11
+ }
12
+ }
13
+
14
+ export class InvalidChaindIdError extends Error {
15
+ constructor(message?: string) {
16
+ super(message || "Invalid chain id");
17
+ Object.setPrototypeOf(this, new.target.prototype);
18
+ }
19
+ }
20
+
21
+ export class LowLiquidityError extends Error {
22
+ constructor(message?: string) {
23
+ super(message || "Low liquidity");
24
+ Object.setPrototypeOf(this, new.target.prototype);
25
+ }
26
+ }
@@ -2,6 +2,7 @@ import abi from "@/abi";
2
2
  import config from "@/config";
3
3
  import { addresses } from "@/constants";
4
4
  import { Transaction } from "@/db";
5
+ import { JsonRpcRetryProvider } from "@/providers";
5
6
  import { InteropX } from "@/typechain";
6
7
  import { ChainId } from "@/types";
7
8
  import { encodeConnectorMethod, getContract, getRpcProviderUrl } from "@/utils";
@@ -25,13 +26,16 @@ export default async function (transaction: Transaction) {
25
26
  metadata,
26
27
  } = transaction.submitEvent;
27
28
 
28
- const sourceChainProvider = new ethers.providers.JsonRpcProvider(
29
+ const sourceChainProvider = new JsonRpcRetryProvider(
29
30
  getRpcProviderUrl(sourceChainId as ChainId)
30
31
  );
31
32
  const sourceWallet = new ethers.Wallet(
32
33
  config.privateKey,
33
34
  sourceChainProvider
34
35
  );
36
+ const dsaAddress = addresses[sourceChainId].dsaAddress;
37
+ const sourceUserAddress =
38
+ Number(sourceDsaId) == 0 ? sourceSender : dsaAddress;
35
39
  const interopAddress = addresses[sourceChainId].interopX;
36
40
  const contract = getContract<InteropX>(
37
41
  interopAddress,
@@ -40,7 +44,7 @@ export default async function (transaction: Transaction) {
40
44
  );
41
45
 
42
46
  const sourceSpells: any[] = [];
43
- const commonSpells = [];
47
+ const commonSpells: any[] = [];
44
48
 
45
49
  for (const withdraw of position.withdraw) {
46
50
  let spellData = {
@@ -50,9 +54,20 @@ export default async function (transaction: Transaction) {
50
54
  };
51
55
 
52
56
  sourceSpells.push({
53
- connector: spellData.method,
57
+ connector: spellData.connector,
54
58
  data: encodeConnectorMethod(spellData),
55
59
  });
60
+
61
+ let spellDataBasicWithdraw = {
62
+ connector: "BASIC-A",
63
+ method: "withdraw",
64
+ args: [withdraw.sourceToken, withdraw.amount, sourceUserAddress, "0", "0"],
65
+ };
66
+
67
+ commonSpells.push({
68
+ connector: spellDataBasicWithdraw.connector,
69
+ data: encodeConnectorMethod(spellDataBasicWithdraw),
70
+ });
56
71
  }
57
72
 
58
73
  for (const supply of position.supply) {
@@ -63,18 +78,18 @@ export default async function (transaction: Transaction) {
63
78
  };
64
79
 
65
80
  sourceSpells.push({
66
- connector: spellDataWithdraw.method,
81
+ connector: spellDataWithdraw.connector,
67
82
  data: encodeConnectorMethod(spellDataWithdraw),
68
83
  });
69
84
 
70
85
  let spellDataBasicWithdraw = {
71
86
  connector: "BASIC-A",
72
87
  method: "withdraw",
73
- args: [supply.sourceToken, supply.amount, interopAddress, "0", "0"],
88
+ args: [supply.sourceToken, supply.amount, dsaAddress, "0", "0"],
74
89
  };
75
90
 
76
91
  sourceSpells.push({
77
- connector: spellDataBasicWithdraw.method,
92
+ connector: spellDataBasicWithdraw.connector,
78
93
  data: encodeConnectorMethod(spellDataBasicWithdraw),
79
94
  });
80
95
  }
@@ -1,6 +1,13 @@
1
-
2
-
1
+ import abi from "@/abi";
2
+ import config from "@/config";
3
+ import { addresses } from "@/constants";
3
4
  import { Transaction } from "@/db";
5
+ import { JsonRpcRetryProvider } from "@/providers";
6
+ import { InteropX } from "@/typechain";
7
+ import { InstList } from "@/typechain/InstList";
8
+ import { ChainId } from "@/types";
9
+ import { encodeConnectorMethod, getContract, getRpcProviderUrl } from "@/utils";
10
+ import { ethers } from "ethers";
4
11
  import { MetaTransaction, OperationType } from "ethers-multisend";
5
12
 
6
13
 
@@ -8,6 +15,128 @@ export default async function (transaction: Transaction) {
8
15
  const transactions: MetaTransaction[] = [];
9
16
  const logs: any[] = [];
10
17
 
18
+ const {
19
+ sourceSpells,
20
+ position,
21
+ actionId,
22
+ sourceSender,
23
+ sourceDsaId,
24
+ targetDsaId,
25
+ sourceChainId,
26
+ targetChainId,
27
+ vnonce,
28
+ metadata,
29
+ } = transaction.validateEvent;
30
+
31
+ const targetChainProvider = new JsonRpcRetryProvider(
32
+ getRpcProviderUrl(targetChainId as ChainId)
33
+ );
34
+ const targetWallet = new ethers.Wallet(
35
+ config.privateKey,
36
+ targetChainProvider
37
+ );
38
+
39
+
40
+ const targetInstListContract = getContract<InstList>(
41
+ addresses[targetChainId].instList,
42
+ abi.instList,
43
+ targetChainProvider,
44
+ );
45
+
46
+ const targetDsaAddress = await targetInstListContract.accountAddr(targetDsaId)
47
+ const dsaAddress = addresses[targetChainId].dsaAddress;
48
+ const interopAddress = addresses[targetChainId].interopX;
49
+ const contract = getContract<InteropX>(
50
+ interopAddress,
51
+ abi.interopX,
52
+ targetWallet
53
+ );
54
+
55
+ const targetSpells: any[] = [];
56
+ const commonSpells: any[] = [];
57
+
58
+ for (const supplyToken of position.supply) {
59
+ let spellData = {
60
+ connector: "AAVE-V2-A",
61
+ method: "deposit",
62
+ args: [supplyToken.targetToken, supplyToken.amount, "0", "0"],
63
+ };
64
+
65
+ targetSpells.push({
66
+ connector: spellData.connector,
67
+ data: encodeConnectorMethod(spellData),
68
+ });
69
+
70
+ let spellDataBasicWithdraw = {
71
+ connector: "BASIC-A",
72
+ method: "withdraw",
73
+ args: [supplyToken.targetToken, supplyToken.amount, targetDsaAddress, "0", "0"],
74
+ };
75
+
76
+ commonSpells.push({
77
+ connector: spellDataBasicWithdraw.connector,
78
+ data: encodeConnectorMethod(spellDataBasicWithdraw),
79
+ });
80
+ }
81
+
82
+ for (const withdrawToken of position.withdraw) {
83
+
84
+ let spellData = {
85
+ connector: "AAVE-V2-A",
86
+ method: "borrow",
87
+ args: [
88
+ withdrawToken.targetToken,
89
+ withdrawToken.amount,
90
+ "2",
91
+ "0",
92
+ "0",
93
+ ],
94
+ };
95
+
96
+ targetSpells.push({
97
+ connector: spellData.connector,
98
+ data: encodeConnectorMethod(spellData),
99
+ });
100
+
101
+ let spellData2 = {
102
+ connector: "BASIC-A",
103
+ method: "withdraw",
104
+ args: [
105
+ withdrawToken.targetToken,
106
+ withdrawToken.amount,
107
+ dsaAddress,
108
+ "0",
109
+ "0",
110
+ ],
111
+ };
112
+
113
+ targetSpells.push({
114
+ connector: spellData.connector,
115
+ data: encodeConnectorMethod(spellData2),
116
+ });
117
+ }
118
+
119
+ const { data } = await contract.populateTransaction.targetAction(
120
+ sourceSpells,
121
+ targetSpells,
122
+ commonSpells,
123
+ position,
124
+ actionId,
125
+ sourceSender,
126
+ sourceDsaId,
127
+ targetDsaId,
128
+ sourceChainId,
129
+ targetChainId,
130
+ vnonce,
131
+ metadata
132
+ );
133
+
134
+ transactions.push({
135
+ to: interopAddress,
136
+ data: data!,
137
+ value: "0",
138
+ operation: OperationType.Call,
139
+ });
11
140
 
12
141
  return { transactions, logs }
13
142
  }
package/src/index.ts CHANGED
@@ -82,6 +82,7 @@ import { startPeer, protocol, peerPool } from "@/net";
82
82
  import { startApiServer } from '@/api';
83
83
  import { Transaction } from './db';
84
84
  import { shortenHash } from './utils';
85
+ import './crons';
85
86
 
86
87
  async function main() {
87
88
 
@@ -0,0 +1 @@
1
+ export * from './retry-provider';
@@ -0,0 +1,51 @@
1
+ import { ethers } from "ethers";
2
+ import wait from "waait";
3
+ import Bluebird from "bluebird";
4
+
5
+ export interface RetryOptions {
6
+ delay?: number;
7
+ timeouts: number[];
8
+ }
9
+
10
+ export function promiseTimeout<T>(ms: number, promise: Promise<T>): Promise<T> {
11
+ return Bluebird.resolve(promise).timeout(ms);
12
+ }
13
+
14
+ export function retryOperation(
15
+ retriesLeft: number,
16
+ operation: () => Promise<any>,
17
+ options: RetryOptions
18
+ ) {
19
+ return new Promise((resolve, reject) => {
20
+ const { timeouts } = options;
21
+ // Find the timeout for this specific iteration
22
+ const timeout = timeouts[timeouts.length - retriesLeft];
23
+
24
+ // Wrap the original operation in a timeout
25
+ const execution = promiseTimeout(timeout, operation());
26
+
27
+ // If the promise is successful, resolve it and bubble the result up
28
+ return execution.then(resolve).catch((reason: any) => {
29
+ // If there are any retries left, we call the same retryOperation function again,
30
+ // but decrementing the number of retries left by 1
31
+ if (retriesLeft - 1 > 0) {
32
+ // Delay the new attempt slightly
33
+ return wait(options.delay || 50)
34
+ .then(retryOperation.bind(null, retriesLeft - 1, operation, options))
35
+ .then(resolve)
36
+ .catch(reject);
37
+ }
38
+ // Reject (and bubble the result up) if there are no more retries
39
+ return reject(reason);
40
+ });
41
+ });
42
+ }
43
+
44
+ export class JsonRpcRetryProvider extends ethers.providers.JsonRpcProvider {
45
+ public perform(method: string, params: any): Promise<any> {
46
+ const timeouts = [5_000, 10_000];
47
+ const operation = () => super.perform(method, params);
48
+
49
+ return retryOperation(2, operation, { timeouts, delay: 50 });
50
+ }
51
+ }
@@ -0,0 +1,89 @@
1
+ import Web3Utils from "web3-utils";
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import { tokens } from "@/constants";
5
+ import expandHomeDir from "expand-home-dir";
6
+ import config from "@/config";
7
+ import { http } from "@/utils";
8
+
9
+ const basePath = expandHomeDir(`~/.interop-x/data/${config.publicAddress}/${config.staging ? 'staging' : ''}`);
10
+ const mainnetPricesFilePath = path.resolve(basePath, "./mainnetPrices.json");
11
+ const networkTokenPricesFilePath = path.resolve(basePath, "./networkTokenPrices.json");
12
+
13
+ class Prices {
14
+ private static mainnetPrices = {};
15
+
16
+ private static networkTokenPrices = {};
17
+
18
+ static async fetch() {
19
+
20
+ if (!fs.existsSync(mainnetPricesFilePath)) {
21
+ fs.writeFileSync(mainnetPricesFilePath, JSON.stringify({}));
22
+ }
23
+
24
+ if (!fs.existsSync(networkTokenPricesFilePath)) {
25
+ fs.writeFileSync(networkTokenPricesFilePath, JSON.stringify({}));
26
+ }
27
+
28
+ this.mainnetPrices = JSON.parse(fs.readFileSync(mainnetPricesFilePath, "utf8"));
29
+ this.networkTokenPrices = JSON.parse(fs.readFileSync(networkTokenPricesFilePath, "utf8"));
30
+
31
+ try {
32
+ const path = tokens["1"]
33
+ .filter((a) => a.symbol !== "ETH")
34
+ .map((token) => token.address)
35
+ .join(",");
36
+
37
+ const [response, ethResponse, avaxResponse, polygonResponse] =
38
+ await Promise.all([
39
+ http.get(
40
+ "https://api.coingecko.com/api/v3/simple/token_price/ethereum",
41
+ {
42
+ params: { contract_addresses: path, vs_currencies: "usd" },
43
+ }
44
+ ),
45
+ http.get("https://api.coingecko.com/api/v3/simple/price", {
46
+ params: { ids: "ethereum", vs_currencies: "usd" },
47
+ }),
48
+ http.get("https://api.coingecko.com/api/v3/simple/price", {
49
+ params: { ids: "avalanche-2", vs_currencies: "usd" },
50
+ }),
51
+ http.get("https://api.coingecko.com/api/v3/simple/price", {
52
+ params: { ids: "matic-network", vs_currencies: "usd" },
53
+ }),
54
+ ]);
55
+
56
+ this.networkTokenPrices = {
57
+ "1": ethResponse.data.ethereum.usd.toString(),
58
+ "137": polygonResponse.data["matic-network"].usd.toString(),
59
+ "43114": avaxResponse.data["avalanche-2"].usd.toString(),
60
+ };
61
+
62
+ const data = response.data;
63
+
64
+ for (const key in data) {
65
+ const _key = Web3Utils.toChecksumAddress(key);
66
+ if (!data[key].usd) continue;
67
+ this.mainnetPrices[_key] = data[key].usd.toString();
68
+ }
69
+
70
+ this.mainnetPrices["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"] =
71
+ ethResponse.data.ethereum.usd.toString();
72
+ } catch (error) { }
73
+
74
+ fs.writeFileSync(mainnetPricesFilePath, JSON.stringify(this.mainnetPrices));
75
+ fs.writeFileSync(networkTokenPricesFilePath, JSON.stringify(this.networkTokenPrices));
76
+
77
+ return this.mainnetPrices;
78
+ }
79
+
80
+ static getMainnetPrices() {
81
+ return this.mainnetPrices;
82
+ }
83
+
84
+ static getNetworkTokenPrices() {
85
+ return this.networkTokenPrices;
86
+ }
87
+ }
88
+
89
+ export default Prices;
@@ -0,0 +1 @@
1
+ export { default as Prices } from './Prices';