@instadapp/interop-x 0.0.0-dev.8cb1c22 → 0.0.0-dev.909c44a

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 (204) hide show
  1. package/dist/package.json +9 -2
  2. package/dist/src/abi/aaveV2Resolver.json +832 -0
  3. package/dist/src/abi/aaveV3Resolver.json +628 -0
  4. package/dist/src/abi/balanceResolver.json +211 -0
  5. package/dist/src/abi/connectors/index.js +2 -2
  6. package/dist/src/abi/connectors/v2/1INCH-A.js +39 -1
  7. package/dist/src/abi/connectors/v2/1INCH-V3-A.js +42 -0
  8. package/dist/src/abi/connectors/v2/1INCH-V4-A.js +42 -0
  9. package/dist/src/abi/connectors/v2/AAVE-IMPORT-V2-V3-A.js +57 -0
  10. package/dist/src/abi/connectors/v2/AAVE-V2-A.js +91 -133
  11. package/dist/src/abi/connectors/v2/AAVE-V2-IMPORT-C.js +4 -0
  12. package/dist/src/abi/connectors/v2/AAVE-V3-A.js +322 -0
  13. package/dist/src/abi/connectors/v2/AAVE-V3-CLAIM-A.js +58 -0
  14. package/dist/src/abi/connectors/v2/AAVE-V3-IMPORT-A.js +59 -0
  15. package/dist/src/abi/connectors/v2/AAVE-V3-IMPORT-PERMIT-A.js +81 -0
  16. package/dist/src/abi/connectors/v2/BASIC-A.js +44 -86
  17. package/dist/src/abi/connectors/v2/BENQI-A.js +901 -0
  18. package/dist/src/abi/connectors/v2/COMPOUND-IMPORT-C.js +4 -0
  19. package/dist/src/abi/connectors/v2/COMPOUND-IMPORT-D.js +27 -0
  20. package/dist/src/abi/connectors/v2/DSA-SPELL-A.js +60 -0
  21. package/dist/src/abi/connectors/v2/HOP-A.js +41 -0
  22. package/dist/src/abi/connectors/v2/HOP-MAINNET-A.js +38 -0
  23. package/dist/src/abi/connectors/v2/INSTA-DEX-SIMULATION-A.js +40 -0
  24. package/dist/src/abi/connectors/v2/INSTAPOOL-B.js +4 -0
  25. package/dist/src/abi/connectors/v2/INSTAPOOL-C.js +4 -0
  26. package/dist/src/abi/connectors/v2/INTEROP-A.js +4 -0
  27. package/dist/src/abi/connectors/v2/INTEROP-STAGING-A.js +4 -0
  28. package/dist/src/abi/connectors/v2/LIDO-STETH-A.js +36 -0
  29. package/dist/src/abi/connectors/v2/LITE-A.js +4 -0
  30. package/dist/src/abi/connectors/v2/MSTABLE-A.js +4 -0
  31. package/dist/src/abi/connectors/v2/NOTIONAL-V2-A.js +484 -0
  32. package/dist/src/abi/connectors/v2/PANGOLIN-A.js +136 -0
  33. package/dist/src/abi/connectors/v2/PANGOLIN-STAKE-A.js +227 -0
  34. package/dist/src/abi/connectors/v2/PARASWAP-A.js +26 -1
  35. package/dist/src/abi/connectors/v2/PARASWAP-V5-A.js +29 -0
  36. package/dist/src/abi/connectors/v2/POOLTOGETHER-A.js +4 -0
  37. package/dist/src/abi/connectors/v2/QI-A.js +4 -0
  38. package/dist/src/abi/connectors/v2/QUICKSWAP-A.js +136 -0
  39. package/dist/src/abi/connectors/v2/SUSHISWAP-A.js +136 -0
  40. package/dist/src/abi/connectors/v2/SWAP-AGGREGATOR-A.js +25 -0
  41. package/dist/src/abi/connectors/v2/UBIQUITY-A.js +73 -0
  42. package/dist/src/abi/connectors/v2/UNISWAP-SELL-BETA.js +4 -0
  43. package/dist/src/abi/connectors/v2/UNISWAP-V3-A.js +1 -1
  44. package/dist/src/abi/connectors/v2/UNISWAP-V3-ROUTER-A.js +4 -0
  45. package/dist/src/abi/connectors/v2/UNISWAP-V3-STAKER-B.js +193 -0
  46. package/dist/src/abi/connectors/v2/UNISWAP-V3-SWAP-A.js +74 -0
  47. package/dist/src/abi/connectors/v2/UNIVERSE-A.js +4 -0
  48. package/dist/src/abi/connectors/v2/WAVAX-A.js +4 -0
  49. package/dist/src/abi/connectors/v2/WFTM-A.js +60 -0
  50. package/dist/src/abi/connectors/v2/WMATIC-A.js +4 -0
  51. package/dist/src/abi/connectors/v2/ZEROX-A.js +29 -0
  52. package/dist/src/abi/connectors/v2/ZEROX-V4-A.js +29 -0
  53. package/dist/src/abi/connectors/v2/index.js +128 -44
  54. package/dist/src/abi/index.js +8 -0
  55. package/dist/src/abi/instList.json +232 -0
  56. package/dist/src/api/index.js +7 -0
  57. package/dist/src/constants/addresses.js +9 -1
  58. package/dist/src/constants/capPerChain.js +8 -0
  59. package/dist/src/constants/index.js +2 -0
  60. package/dist/src/constants/tokens.js +44 -44
  61. package/dist/src/constants/wrappedNativeToken.js +8 -0
  62. package/dist/src/crons/index.js +3 -0
  63. package/dist/src/crons/prices.js +16 -0
  64. package/dist/src/db/models/transaction.js +5 -1
  65. package/dist/src/errors/index.js +30 -0
  66. package/dist/src/gnosis/actions/aaveV2/source.js +26 -1
  67. package/dist/src/gnosis/actions/aaveV2/target.js +20 -5
  68. package/dist/src/gnosis/actions/aaveV3/index.js +11 -0
  69. package/dist/src/gnosis/actions/aaveV3/source.js +74 -0
  70. package/dist/src/gnosis/actions/aaveV3/target.js +87 -0
  71. package/dist/src/gnosis/actions/index.js +2 -0
  72. package/dist/src/index.js +2 -1
  73. package/dist/src/providers/index.js +17 -0
  74. package/dist/src/providers/retry-provider.js +45 -0
  75. package/dist/src/services/Prices.js +74 -0
  76. package/dist/src/services/index.js +8 -0
  77. package/dist/src/tasks/InteropX/{ProcessSubmitSubmitEvents.js → ProcessSubmitEvents.js} +110 -16
  78. package/dist/src/tasks/InteropX/ProcessValidateEvents.js +30 -10
  79. package/dist/src/tasks/InteropX/SyncLogExecuteEvents.js +113 -0
  80. package/dist/src/tasks/InteropX/SyncLogSubmitEvents.js +3 -2
  81. package/dist/src/tasks/InteropX/SyncLogValidateEvents.js +6 -5
  82. package/dist/src/tasks/index.js +7 -5
  83. package/dist/src/typechain/AaveV2Resolver.js +2 -0
  84. package/dist/src/typechain/AaveV3Resolver.js +2 -0
  85. package/dist/src/typechain/BalanceResolver.js +2 -0
  86. package/dist/src/typechain/InstList.js +2 -0
  87. package/dist/src/typechain/factories/AaveV2Resolver__factory.js +1191 -0
  88. package/dist/src/typechain/factories/AaveV3Resolver__factory.js +887 -0
  89. package/dist/src/typechain/factories/BalanceResolver__factory.js +228 -0
  90. package/dist/src/typechain/factories/InstList__factory.js +249 -0
  91. package/dist/src/typechain/factories/index.js +9 -1
  92. package/dist/src/typechain/index.js +9 -1
  93. package/dist/src/utils/async.js +18 -0
  94. package/dist/src/utils/dsa.js +36 -0
  95. package/dist/src/utils/formatting.js +67 -0
  96. package/dist/src/utils/gnosis.js +87 -0
  97. package/dist/src/utils/http.js +10 -0
  98. package/dist/src/utils/index.js +22 -220
  99. package/dist/src/utils/interop.js +16 -0
  100. package/dist/src/utils/tokens.js +22 -0
  101. package/dist/src/utils/validate.js +111 -0
  102. package/dist/src/utils/web3.js +93 -0
  103. package/package.json +9 -2
  104. package/src/abi/aaveV2Resolver.json +832 -0
  105. package/src/abi/aaveV3Resolver.json +628 -0
  106. package/src/abi/balanceResolver.json +211 -0
  107. package/src/abi/connectors/index.ts +5 -5
  108. package/src/abi/connectors/v2/1INCH-A.ts +39 -1
  109. package/src/abi/connectors/v2/1INCH-V3-A.ts +41 -0
  110. package/src/abi/connectors/v2/1INCH-V4-A.ts +41 -0
  111. package/src/abi/connectors/v2/AAVE-IMPORT-V2-V3-A.ts +56 -0
  112. package/src/abi/connectors/v2/AAVE-V2-A.ts +93 -135
  113. package/src/abi/connectors/v2/AAVE-V2-IMPORT-C.ts +3 -0
  114. package/src/abi/connectors/v2/AAVE-V3-A.ts +321 -0
  115. package/src/abi/connectors/v2/AAVE-V3-CLAIM-A.ts +57 -0
  116. package/src/abi/connectors/v2/AAVE-V3-IMPORT-A.ts +58 -0
  117. package/src/abi/connectors/v2/AAVE-V3-IMPORT-PERMIT-A.ts +80 -0
  118. package/src/abi/connectors/v2/BASIC-A.ts +44 -86
  119. package/src/abi/connectors/v2/BENQI-A.ts +900 -0
  120. package/src/abi/connectors/v2/COMPOUND-IMPORT-C.ts +3 -0
  121. package/src/abi/connectors/v2/COMPOUND-IMPORT-D.ts +26 -0
  122. package/src/abi/connectors/v2/DSA-SPELL-A.ts +59 -0
  123. package/src/abi/connectors/v2/HOP-A.ts +40 -0
  124. package/src/abi/connectors/v2/HOP-MAINNET-A.ts +37 -0
  125. package/src/abi/connectors/v2/INSTA-DEX-SIMULATION-A.ts +39 -0
  126. package/src/abi/connectors/v2/INSTAPOOL-B.ts +3 -0
  127. package/src/abi/connectors/v2/INSTAPOOL-C.ts +3 -0
  128. package/src/abi/connectors/v2/INTEROP-A.ts +3 -0
  129. package/src/abi/connectors/v2/INTEROP-STAGING-A.ts +3 -0
  130. package/src/abi/connectors/v2/LIDO-STETH-A.ts +35 -0
  131. package/src/abi/connectors/v2/LITE-A.ts +3 -0
  132. package/src/abi/connectors/v2/MSTABLE-A.ts +3 -0
  133. package/src/abi/connectors/v2/NOTIONAL-V2-A.ts +483 -0
  134. package/src/abi/connectors/v2/PANGOLIN-A.ts +135 -0
  135. package/src/abi/connectors/v2/PANGOLIN-STAKE-A.ts +226 -0
  136. package/src/abi/connectors/v2/PARASWAP-A.ts +26 -1
  137. package/src/abi/connectors/v2/PARASWAP-V5-A.ts +28 -0
  138. package/src/abi/connectors/v2/POOLTOGETHER-A.ts +3 -0
  139. package/src/abi/connectors/v2/QI-A.ts +3 -0
  140. package/src/abi/connectors/v2/QUICKSWAP-A.ts +135 -0
  141. package/src/abi/connectors/v2/SUSHISWAP-A.ts +135 -0
  142. package/src/abi/connectors/v2/SWAP-AGGREGATOR-A.ts +24 -0
  143. package/src/abi/connectors/v2/UBIQUITY-A.ts +72 -0
  144. package/src/abi/connectors/v2/UNISWAP-SELL-BETA.ts +3 -0
  145. package/src/abi/connectors/v2/UNISWAP-V3-A.ts +1 -1
  146. package/src/abi/connectors/v2/UNISWAP-V3-ROUTER-A.ts +3 -0
  147. package/src/abi/connectors/v2/UNISWAP-V3-STAKER-B.ts +192 -0
  148. package/src/abi/connectors/v2/UNISWAP-V3-SWAP-A.ts +73 -0
  149. package/src/abi/connectors/v2/UNIVERSE-A.ts +3 -0
  150. package/src/abi/connectors/v2/WAVAX-A.ts +3 -0
  151. package/src/abi/connectors/v2/WFTM-A.ts +59 -0
  152. package/src/abi/connectors/v2/WMATIC-A.ts +3 -0
  153. package/src/abi/connectors/v2/ZEROX-A.ts +28 -0
  154. package/src/abi/connectors/v2/ZEROX-V4-A.ts +28 -0
  155. package/src/abi/connectors/v2/index.ts +171 -85
  156. package/src/abi/index.ts +8 -0
  157. package/src/abi/instList.json +232 -0
  158. package/src/api/index.ts +8 -0
  159. package/src/constants/addresses.ts +21 -2
  160. package/src/constants/capPerChain.ts +5 -0
  161. package/src/constants/index.ts +2 -0
  162. package/src/constants/tokens.ts +44 -44
  163. package/src/constants/wrappedNativeToken.ts +5 -0
  164. package/src/crons/index.ts +1 -0
  165. package/src/crons/prices.ts +12 -0
  166. package/src/db/models/transaction.ts +22 -1
  167. package/src/errors/index.ts +26 -0
  168. package/src/gnosis/actions/aaveV2/source.ts +56 -3
  169. package/src/gnosis/actions/aaveV2/target.ts +35 -7
  170. package/src/gnosis/actions/aaveV3/index.ts +9 -0
  171. package/src/gnosis/actions/aaveV3/source.ts +119 -0
  172. package/src/gnosis/actions/aaveV3/target.ts +142 -0
  173. package/src/gnosis/actions/index.ts +2 -0
  174. package/src/index.ts +1 -0
  175. package/src/providers/index.ts +1 -0
  176. package/src/providers/retry-provider.ts +51 -0
  177. package/src/services/Prices.ts +89 -0
  178. package/src/services/index.ts +1 -0
  179. package/src/tasks/InteropX/{ProcessSubmitSubmitEvents.ts → ProcessSubmitEvents.ts} +139 -22
  180. package/src/tasks/InteropX/ProcessValidateEvents.ts +42 -19
  181. package/src/tasks/InteropX/SyncLogExecuteEvents.ts +161 -0
  182. package/src/tasks/InteropX/SyncLogSubmitEvents.ts +6 -7
  183. package/src/tasks/InteropX/SyncLogValidateEvents.ts +9 -10
  184. package/src/tasks/index.ts +8 -5
  185. package/src/typechain/AaveV2Resolver.ts +1017 -0
  186. package/src/typechain/AaveV3Resolver.ts +935 -0
  187. package/src/typechain/BalanceResolver.ts +266 -0
  188. package/src/typechain/InstList.ts +402 -0
  189. package/src/typechain/factories/AaveV2Resolver__factory.ts +1198 -0
  190. package/src/typechain/factories/AaveV3Resolver__factory.ts +894 -0
  191. package/src/typechain/factories/BalanceResolver__factory.ts +235 -0
  192. package/src/typechain/factories/InstList__factory.ts +253 -0
  193. package/src/typechain/factories/index.ts +4 -0
  194. package/src/typechain/index.ts +8 -0
  195. package/src/utils/async.ts +22 -0
  196. package/src/utils/dsa.ts +56 -0
  197. package/src/utils/formatting.ts +68 -0
  198. package/src/utils/gnosis.ts +166 -0
  199. package/src/utils/http.ts +6 -0
  200. package/src/utils/index.ts +9 -365
  201. package/src/utils/interop.ts +28 -0
  202. package/src/utils/tokens.ts +21 -0
  203. package/src/utils/validate.ts +179 -0
  204. package/src/utils/web3.ts +132 -0
@@ -1,48 +1,48 @@
1
1
  export const tokens = {
2
- // 1: [
3
- // {
4
- // aliases: ['eth'],
5
- // symbol: "ETH",
6
- // name: "Ethereum",
7
- // address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
8
- // decimals: 18,
9
- // },
10
- // {
11
- // aliases: ['weth'],
12
- // symbol: "WETH",
13
- // name: "Wrapped Ethereum",
14
- // address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
15
- // decimals: 18,
16
- // },
17
- // {
18
- // aliases: ['dai'],
19
- // symbol: "DAI",
20
- // name: "DAI Stable",
21
- // address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
22
- // decimals: 18,
23
- // },
24
- // {
25
- // aliases: ['usdc'],
26
- // symbol: "USDC",
27
- // name: "USD Coin",
28
- // address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
29
- // decimals: 6,
30
- // },
31
- // {
32
- // aliases: ['usdt'],
33
- // symbol: "USDT",
34
- // name: "Tether USD Coin",
35
- // address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
36
- // decimals: 6,
37
- // },
38
- // {
39
- // aliases: ['wbtc'],
40
- // symbol: "WBTC",
41
- // name: "Wrapped BTC",
42
- // address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
43
- // decimals: 8,
44
- // },
45
- // ],
2
+ 1: [
3
+ {
4
+ aliases: ['eth'],
5
+ symbol: "ETH",
6
+ name: "Ethereum",
7
+ address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
8
+ decimals: 18,
9
+ },
10
+ {
11
+ aliases: ['weth'],
12
+ symbol: "WETH",
13
+ name: "Wrapped Ethereum",
14
+ address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
15
+ decimals: 18,
16
+ },
17
+ {
18
+ aliases: ['dai'],
19
+ symbol: "DAI",
20
+ name: "DAI Stable",
21
+ address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
22
+ decimals: 18,
23
+ },
24
+ {
25
+ aliases: ['usdc'],
26
+ symbol: "USDC",
27
+ name: "USD Coin",
28
+ address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
29
+ decimals: 6,
30
+ },
31
+ {
32
+ aliases: ['usdt'],
33
+ symbol: "USDT",
34
+ name: "Tether USD Coin",
35
+ address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
36
+ decimals: 6,
37
+ },
38
+ {
39
+ aliases: ['wbtc'],
40
+ symbol: "WBTC",
41
+ name: "Wrapped BTC",
42
+ address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
43
+ decimals: 8,
44
+ },
45
+ ],
46
46
  137: [
47
47
  {
48
48
  aliases: ['eth', 'weth'],
@@ -0,0 +1,5 @@
1
+ export const wrappedNativeToken = {
2
+ "1": '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
3
+ "137": '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
4
+ "43114": '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7'
5
+ };
@@ -0,0 +1 @@
1
+ import "./prices"
@@ -0,0 +1,12 @@
1
+ import { Prices } from "@/services";
2
+ import cron from "node-cron";
3
+
4
+ Prices.fetch().catch(console.log);
5
+
6
+ cron.schedule(`* * * * *`, async () => {
7
+ try {
8
+ await Prices.fetch();
9
+ } catch (error) {
10
+ console.log("Prices: ", error.message);
11
+ }
12
+ });
@@ -83,6 +83,22 @@ export class Transaction extends Model<
83
83
  metadata: string;
84
84
  }>;
85
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
+
86
102
  declare status: CreationOptional<string>;
87
103
 
88
104
  declare createdAt: CreationOptional<Date>;
@@ -127,7 +143,7 @@ Transaction.init(
127
143
  type: DataTypes.DATE,
128
144
  defaultValue: Date.now(),
129
145
  },
130
- sourceDelayUntil: DataTypes.STRING,
146
+ sourceDelayUntil: DataTypes.DATE,
131
147
 
132
148
  targetChainId: DataTypes.NUMBER,
133
149
  targetDsaId: DataTypes.STRING,
@@ -158,6 +174,11 @@ Transaction.init(
158
174
  allowNull: true,
159
175
  },
160
176
 
177
+ executeEvent: {
178
+ type: DataTypes.JSON,
179
+ allowNull: true,
180
+ },
181
+
161
182
  status: {
162
183
  type: DataTypes.STRING,
163
184
  defaultValue: "pending",
@@ -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,12 +2,15 @@ import abi from "@/abi";
2
2
  import config from "@/config";
3
3
  import { addresses } from "@/constants";
4
4
  import { Transaction } from "@/db";
5
- import { InteropX } from "@/typechain";
5
+ import { JsonRpcRetryProvider } from "@/providers";
6
+ import { AaveV2Resolver, InteropX } from "@/typechain";
6
7
  import { ChainId } from "@/types";
7
- import { encodeConnectorMethod, getContract, getRpcProviderUrl } from "@/utils";
8
+ import { encodeConnectorMethod, getContract, getDsaAccountAddress, getRpcProviderUrl } from "@/utils";
8
9
  import { ethers } from "ethers";
9
10
  import { MetaTransaction, OperationType } from "ethers-multisend";
10
11
 
12
+ const safeUserRatioGap = "800000000000000000"
13
+
11
14
  export default async function (transaction: Transaction) {
12
15
  const transactions: MetaTransaction[] = [];
13
16
  const logs: any[] = [];
@@ -25,13 +28,20 @@ export default async function (transaction: Transaction) {
25
28
  metadata,
26
29
  } = transaction.submitEvent;
27
30
 
28
- const sourceChainProvider = new ethers.providers.JsonRpcProvider(
31
+ const sourceChainProvider = new JsonRpcRetryProvider(
29
32
  getRpcProviderUrl(sourceChainId as ChainId)
30
33
  );
31
34
  const sourceWallet = new ethers.Wallet(
32
35
  config.privateKey,
33
36
  sourceChainProvider
34
37
  );
38
+ const targetChainProvider = new JsonRpcRetryProvider(
39
+ getRpcProviderUrl(targetChainId as ChainId)
40
+ );
41
+ const targetWallet = new ethers.Wallet(
42
+ config.privateKey,
43
+ targetChainProvider
44
+ );
35
45
  const dsaAddress = addresses[sourceChainId].dsaAddress;
36
46
  const sourceUserAddress =
37
47
  Number(sourceDsaId) == 0 ? sourceSender : dsaAddress;
@@ -42,6 +52,49 @@ export default async function (transaction: Transaction) {
42
52
  sourceWallet
43
53
  );
44
54
 
55
+ const sourceResolverContract = getContract<AaveV2Resolver>(
56
+ addresses[sourceChainId].aaveV2Resolver,
57
+ abi.aaveV2Resolver,
58
+ sourceWallet
59
+ );
60
+
61
+ const targetResolverContract = getContract<AaveV2Resolver>(
62
+ addresses[targetChainId].aaveV2Resolver,
63
+ abi.aaveV2Resolver,
64
+ targetWallet
65
+ );
66
+
67
+
68
+ const sourceDsaAddress = await getDsaAccountAddress({ dsaId: sourceDsaId, chainId: sourceChainId, provider: sourceChainProvider });
69
+
70
+ const sourceAavePosition = await sourceResolverContract.checkAavePosition(sourceDsaAddress, position, safeUserRatioGap, false)
71
+
72
+ const userSourceAaveIsOk = sourceAavePosition.isOk;
73
+
74
+ if (!userSourceAaveIsOk) {
75
+ throw new Error("Source chain aave position is not safe to migrate.");
76
+ }
77
+
78
+ const targetDsaAddress = await getDsaAccountAddress({ dsaId: targetDsaId, chainId: targetChainId, provider: targetChainProvider });
79
+
80
+ const targetAavePosition = await targetResolverContract
81
+ .checkAavePosition(targetDsaAddress, position, safeUserRatioGap, true)
82
+
83
+ const userTargetAaveIsOk = targetAavePosition.isOk;
84
+
85
+ if (!userTargetAaveIsOk) {
86
+ throw new Error("Target chain aave position will not be safe after migration.");
87
+ }
88
+
89
+ const targetAavePositionWithFee = await targetResolverContract
90
+ .checkAavePosition(targetDsaAddress, position, safeUserRatioGap, true);
91
+
92
+ const userTargetAaveIsOkWithFee = targetAavePositionWithFee.isOk;
93
+
94
+ if (!userTargetAaveIsOkWithFee) {
95
+ throw new Error("Target chain aave position will not be safe after migration due to minimum fee.");
96
+ }
97
+
45
98
  const sourceSpells: any[] = [];
46
99
  const commonSpells: any[] = [];
47
100
 
@@ -2,12 +2,14 @@ import abi from "@/abi";
2
2
  import config from "@/config";
3
3
  import { addresses } from "@/constants";
4
4
  import { Transaction } from "@/db";
5
- import { InteropX } from "@/typechain";
5
+ import { JsonRpcRetryProvider } from "@/providers";
6
+ import { AaveV2Resolver, InteropX } from "@/typechain";
6
7
  import { ChainId } from "@/types";
7
- import { encodeConnectorMethod, getContract, getRpcProviderUrl } from "@/utils";
8
+ import { encodeConnectorMethod, getContract, getDsaAccountAddress, getRpcProviderUrl } from "@/utils";
8
9
  import { ethers } from "ethers";
9
10
  import { MetaTransaction, OperationType } from "ethers-multisend";
10
11
 
12
+ const safeUserRatioGap = "800000000000000000"
11
13
 
12
14
  export default async function (transaction: Transaction) {
13
15
  const transactions: MetaTransaction[] = [];
@@ -26,15 +28,41 @@ export default async function (transaction: Transaction) {
26
28
  metadata,
27
29
  } = transaction.validateEvent;
28
30
 
29
- const targetChainProvider = new ethers.providers.JsonRpcProvider(
31
+ const targetChainProvider = new JsonRpcRetryProvider(
30
32
  getRpcProviderUrl(targetChainId as ChainId)
31
33
  );
32
34
  const targetWallet = new ethers.Wallet(
33
35
  config.privateKey,
34
36
  targetChainProvider
35
37
  );
38
+
39
+ const targetResolverContract = getContract<AaveV2Resolver>(
40
+ addresses[targetChainId].aaveV2Resolver,
41
+ abi.aaveV2Resolver,
42
+ targetWallet
43
+ );
44
+
45
+ const targetDsaAddress = await getDsaAccountAddress({ dsaId: targetDsaId, chainId: targetChainId, provider: targetChainProvider });
46
+
47
+ const targetAavePosition = await targetResolverContract
48
+ .checkAavePosition(targetDsaAddress, position, safeUserRatioGap, true)
49
+
50
+ const userTargetAaveIsOk = targetAavePosition.isOk;
51
+
52
+ if (!userTargetAaveIsOk) {
53
+ throw new Error("Target chain aave position will not be safe after migration.");
54
+ }
55
+
56
+ const targetAavePositionWithFee = await targetResolverContract
57
+ .checkAavePosition(targetDsaAddress, position, safeUserRatioGap, true);
58
+
59
+ const userTargetAaveIsOkWithFee = targetAavePositionWithFee.isOk;
60
+
61
+ if (!userTargetAaveIsOkWithFee) {
62
+ throw new Error("Target chain aave position will not be safe after migration due to minimum fee.");
63
+ }
64
+
36
65
  const dsaAddress = addresses[targetChainId].dsaAddress;
37
- const sourceUserAddress = Number(sourceDsaId) == 0 ? sourceSender : dsaAddress;
38
66
  const interopAddress = addresses[targetChainId].interopX;
39
67
  const contract = getContract<InteropX>(
40
68
  interopAddress,
@@ -60,7 +88,7 @@ export default async function (transaction: Transaction) {
60
88
  let spellDataBasicWithdraw = {
61
89
  connector: "BASIC-A",
62
90
  method: "withdraw",
63
- args: [supplyToken.targetToken, supplyToken.amount, sourceUserAddress, "0", "0"],
91
+ args: [supplyToken.targetToken, supplyToken.amount, targetDsaAddress, "0", "0"],
64
92
  };
65
93
 
66
94
  commonSpells.push({
@@ -94,14 +122,14 @@ export default async function (transaction: Transaction) {
94
122
  args: [
95
123
  withdrawToken.targetToken,
96
124
  withdrawToken.amount,
97
- interopAddress,
125
+ dsaAddress,
98
126
  "0",
99
127
  "0",
100
128
  ],
101
129
  };
102
130
 
103
131
  targetSpells.push({
104
- connector: spellData.connector,
132
+ connector: spellData2.connector,
105
133
  data: encodeConnectorMethod(spellData2),
106
134
  });
107
135
  }
@@ -0,0 +1,9 @@
1
+ import { Transaction } from "@/db";
2
+ import source from "./source";
3
+ import target from "./target";
4
+
5
+
6
+
7
+ export default async function (transaction: Transaction, type: 'source' | 'target') {
8
+ return type === 'source' ? source(transaction) : target(transaction);
9
+ }
@@ -0,0 +1,119 @@
1
+ import abi from "@/abi";
2
+ import config from "@/config";
3
+ import { addresses } from "@/constants";
4
+ import { Transaction } from "@/db";
5
+ import { JsonRpcRetryProvider } from "@/providers";
6
+ import { InteropX } from "@/typechain";
7
+ import { ChainId } from "@/types";
8
+ import { encodeConnectorMethod, getContract, getRpcProviderUrl } from "@/utils";
9
+ import { ethers } from "ethers";
10
+ import { MetaTransaction, OperationType } from "ethers-multisend";
11
+
12
+ export default async function (transaction: Transaction) {
13
+ const transactions: MetaTransaction[] = [];
14
+ const logs: any[] = [];
15
+
16
+ const {
17
+ position,
18
+ actionId,
19
+ actionIdHashHash,
20
+ sourceSender,
21
+ sourceDsaId,
22
+ targetDsaId,
23
+ sourceChainId,
24
+ targetChainId,
25
+ vnonce,
26
+ metadata,
27
+ } = transaction.submitEvent;
28
+
29
+ const sourceChainProvider = new JsonRpcRetryProvider(
30
+ getRpcProviderUrl(sourceChainId as ChainId)
31
+ );
32
+ const sourceWallet = new ethers.Wallet(
33
+ config.privateKey,
34
+ sourceChainProvider
35
+ );
36
+ const dsaAddress = addresses[sourceChainId].dsaAddress;
37
+ const sourceUserAddress =
38
+ Number(sourceDsaId) == 0 ? sourceSender : dsaAddress;
39
+ const interopAddress = addresses[sourceChainId].interopX;
40
+ const contract = getContract<InteropX>(
41
+ interopAddress,
42
+ abi.interopX,
43
+ sourceWallet
44
+ );
45
+
46
+ const sourceSpells: any[] = [];
47
+ const commonSpells: any[] = [];
48
+
49
+ for (const withdraw of position.withdraw) {
50
+ let spellData = {
51
+ connector: "AAVE-V3-A",
52
+ method: "payback",
53
+ args: [withdraw.sourceToken, withdraw.amount, "2", "0", "0"],
54
+ };
55
+
56
+ sourceSpells.push({
57
+ connector: spellData.connector,
58
+ data: encodeConnectorMethod(spellData),
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
+ });
71
+ }
72
+
73
+ for (const supply of position.supply) {
74
+ let spellDataWithdraw = {
75
+ connector: "AAVE-V3-A",
76
+ method: "withdraw",
77
+ args: [supply.sourceToken, supply.amount, "0", "0"],
78
+ };
79
+
80
+ sourceSpells.push({
81
+ connector: spellDataWithdraw.connector,
82
+ data: encodeConnectorMethod(spellDataWithdraw),
83
+ });
84
+
85
+ let spellDataBasicWithdraw = {
86
+ connector: "BASIC-A",
87
+ method: "withdraw",
88
+ args: [supply.sourceToken, supply.amount, dsaAddress, "0", "0"],
89
+ };
90
+
91
+ sourceSpells.push({
92
+ connector: spellDataBasicWithdraw.connector,
93
+ data: encodeConnectorMethod(spellDataBasicWithdraw),
94
+ });
95
+ }
96
+
97
+ const { data } = await contract.populateTransaction.sourceAction(
98
+ sourceSpells,
99
+ commonSpells,
100
+ position,
101
+ actionId,
102
+ sourceSender,
103
+ sourceDsaId,
104
+ targetDsaId,
105
+ sourceChainId,
106
+ targetChainId,
107
+ vnonce,
108
+ metadata
109
+ );
110
+
111
+ transactions.push({
112
+ to: interopAddress,
113
+ data: data!,
114
+ value: "0",
115
+ operation: OperationType.Call,
116
+ });
117
+
118
+ return { transactions, logs };
119
+ }
@@ -0,0 +1,142 @@
1
+ import abi from "@/abi";
2
+ import config from "@/config";
3
+ import { addresses } from "@/constants";
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";
11
+ import { MetaTransaction, OperationType } from "ethers-multisend";
12
+
13
+
14
+ export default async function (transaction: Transaction) {
15
+ const transactions: MetaTransaction[] = [];
16
+ const logs: any[] = [];
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-V3-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-V3-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: spellData2.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
+ });
140
+
141
+ return { transactions, logs }
142
+ }
@@ -1,5 +1,7 @@
1
1
  import aaveV2 from "./aaveV2"
2
+ import aaveV3 from "./aaveV3"
2
3
 
3
4
  export default {
4
5
  'A:AAVE-V2:AAVE-V2': aaveV2,
6
+ 'A:AAVE-V3:AAVE-V3': aaveV3,
5
7
  }
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';