@instadapp/interop-x 0.0.0-dev.326bdca → 0.0.0-dev.32db40c

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 (234) hide show
  1. package/.github/workflows/ci.yml +19 -0
  2. package/dist/package.json +15 -12
  3. package/dist/src/abi/connectors/index.js +36 -0
  4. package/dist/src/abi/connectors/v1/aave.js +148 -0
  5. package/dist/src/abi/connectors/v1/aave_claim.js +4 -0
  6. package/dist/src/abi/connectors/v1/aave_migrate.js +109 -0
  7. package/dist/src/abi/connectors/v1/aave_polygon_migrate.js +110 -0
  8. package/dist/src/abi/connectors/v1/aave_stake.js +4 -0
  9. package/dist/src/abi/connectors/v1/aave_v1_import.js +54 -0
  10. package/dist/src/abi/connectors/v1/aave_v2.js +230 -0
  11. package/dist/src/abi/connectors/v1/aave_v2_import.js +59 -0
  12. package/dist/src/abi/connectors/v1/authority.js +100 -0
  13. package/dist/src/abi/connectors/v1/basic.js +136 -0
  14. package/dist/src/abi/connectors/v1/chi.js +36 -0
  15. package/dist/src/abi/connectors/v1/comp.js +4 -0
  16. package/dist/src/abi/connectors/v1/compound.js +4 -0
  17. package/dist/src/abi/connectors/v1/compoundImport.js +69 -0
  18. package/dist/src/abi/connectors/v1/compoundImport_v2.js +4 -0
  19. package/dist/src/abi/connectors/v1/compound_old.js +448 -0
  20. package/dist/src/abi/connectors/v1/curve.js +140 -0
  21. package/dist/src/abi/connectors/v1/curve_claim.js +63 -0
  22. package/dist/src/abi/connectors/v1/curve_gauge.js +158 -0
  23. package/dist/src/abi/connectors/v1/curve_sbtc.js +140 -0
  24. package/dist/src/abi/connectors/v1/curve_susd.js +140 -0
  25. package/dist/src/abi/connectors/v1/curve_three.js +79 -0
  26. package/dist/src/abi/connectors/v1/curve_y.js +140 -0
  27. package/dist/src/abi/connectors/v1/dsa_migrate_v1_to_v2.js +4 -0
  28. package/dist/src/abi/connectors/v1/dydx.js +148 -0
  29. package/dist/src/abi/connectors/v1/dydx_flash.js +52 -0
  30. package/dist/src/abi/connectors/v1/fee.js +50 -0
  31. package/dist/src/abi/connectors/v1/gelato.js +1138 -0
  32. package/dist/src/abi/connectors/v1/index.js +58 -0
  33. package/dist/src/abi/connectors/v1/instapool.js +439 -0
  34. package/dist/src/abi/connectors/v1/instapool_v2.js +126 -0
  35. package/dist/src/abi/connectors/v1/kyber.js +117 -0
  36. package/dist/src/abi/connectors/v1/maker.js +480 -0
  37. package/dist/src/abi/connectors/v1/maker_old.js +300 -0
  38. package/dist/src/abi/connectors/v1/math.js +43 -0
  39. package/dist/src/abi/connectors/v1/migrate.js +46 -0
  40. package/dist/src/abi/connectors/v1/oasis.js +198 -0
  41. package/dist/src/abi/connectors/v1/oneInch.js +160 -0
  42. package/dist/src/abi/connectors/v1/polygon_bridge.js +4 -0
  43. package/dist/src/abi/connectors/v1/refinance.js +4 -0
  44. package/dist/src/abi/connectors/v1/staking.js +220 -0
  45. package/dist/src/abi/connectors/v1/swerve.js +179 -0
  46. package/dist/src/abi/connectors/v1/uniswap.js +297 -0
  47. package/dist/src/abi/connectors/v2/1INCH-A.js +4 -0
  48. package/dist/src/abi/connectors/v2/1INCH-B.js +4 -0
  49. package/dist/src/abi/connectors/v2/AAVE-CLAIM-A.js +4 -0
  50. package/dist/src/abi/connectors/v2/AAVE-CLAIM-B.js +166 -0
  51. package/dist/src/abi/connectors/v2/AAVE-STAKE-A.js +4 -0
  52. package/dist/src/abi/connectors/v2/AAVE-V1-A.js +130 -0
  53. package/dist/src/abi/connectors/v2/AAVE-V1-IMPORT-A.js +4 -0
  54. package/dist/src/abi/connectors/v2/AAVE-V2-A.js +230 -0
  55. package/dist/src/abi/connectors/v2/AAVE-V2-IMPORT-A.js +4 -0
  56. package/dist/src/abi/connectors/v2/AAVE-V2-IMPORT-B.js +225 -0
  57. package/dist/src/abi/connectors/v2/AUTHORITY-A.js +100 -0
  58. package/dist/src/abi/connectors/v2/B-COMPOUND-A.js +4 -0
  59. package/dist/src/abi/connectors/v2/B-LIQUITY-A.js +4 -0
  60. package/dist/src/abi/connectors/v2/B-MAKERDAO-A.js +4 -0
  61. package/dist/src/abi/connectors/v2/BASIC-A.js +136 -0
  62. package/dist/src/abi/connectors/v2/BASIC-B.js +4 -0
  63. package/dist/src/abi/connectors/v2/BASIC-C.js +4 -0
  64. package/dist/src/abi/connectors/v2/COMP-A.js +4 -0
  65. package/dist/src/abi/connectors/v2/COMPOUND-A.js +4 -0
  66. package/dist/src/abi/connectors/v2/COMPOUND-IMPORT-A.js +4 -0
  67. package/dist/src/abi/connectors/v2/COMPOUND-IMPORT-B.js +195 -0
  68. package/dist/src/abi/connectors/v2/G-UNISWAP-A.js +4 -0
  69. package/dist/src/abi/connectors/v2/GELATO-AAVE-A.js +4 -0
  70. package/dist/src/abi/connectors/v2/INST-A.js +4 -0
  71. package/dist/src/abi/connectors/v2/INST-LM-A.js +4 -0
  72. package/dist/src/abi/connectors/v2/INST-STAKING-A.js +4 -0
  73. package/dist/src/abi/connectors/v2/INST-STAKING-B.js +4 -0
  74. package/dist/src/abi/connectors/v2/INSTAPOOL-A.js +4 -0
  75. package/dist/src/abi/connectors/v2/LIQUITY-A.js +4 -0
  76. package/dist/src/abi/connectors/v2/MAKERDAO-A.js +4 -0
  77. package/dist/src/abi/connectors/v2/MAKERDAO-CLAIM-A.js +136 -0
  78. package/dist/src/abi/connectors/v2/PARASWAP-A.js +4 -0
  79. package/dist/src/abi/connectors/v2/POLYGON-BRIDGE-A.js +4 -0
  80. package/dist/src/abi/connectors/v2/REFINANCE-A.js +4 -0
  81. package/dist/src/abi/connectors/v2/REFLEXER-A.js +4 -0
  82. package/dist/src/abi/connectors/v2/STAKE-ERC20-A.js +4 -0
  83. package/dist/src/abi/connectors/v2/UNISWAP-A.js +297 -0
  84. package/dist/src/abi/connectors/v2/UNISWAP-V2-A.js +4 -0
  85. package/dist/src/abi/connectors/v2/UNISWAP-V3-A.js +4 -0
  86. package/dist/src/abi/connectors/v2/UNISWAP-V3-STAKE-A.js +4 -0
  87. package/dist/src/abi/connectors/v2/WETH-A.js +4 -0
  88. package/dist/src/abi/connectors/v2/YEARN-VAULT-A.js +4 -0
  89. package/dist/src/abi/connectors/v2/index.js +89 -0
  90. package/dist/src/abi/index.js +4 -2
  91. package/dist/src/abi/interopX.json +1436 -0
  92. package/dist/src/api/index.js +1 -1
  93. package/dist/src/constants/addresses.js +4 -7
  94. package/dist/src/constants/blockConfirmations.js +8 -0
  95. package/dist/src/constants/index.js +1 -0
  96. package/dist/src/constants/tokens.js +62 -39
  97. package/dist/src/db/models/transaction.js +12 -12
  98. package/dist/src/gnosis/actions/aaveV2/index.js +11 -0
  99. package/dist/src/gnosis/actions/aaveV2/source.js +73 -0
  100. package/dist/src/gnosis/actions/aaveV2/target.js +8 -0
  101. package/dist/src/gnosis/actions/index.js +2 -2
  102. package/dist/src/gnosis/index.js +4 -4
  103. package/dist/src/index.js +1 -1
  104. package/dist/src/net/protocol/dial/SignatureDialProtocol.js +6 -2
  105. package/dist/src/tasks/InteropX/ProcessSubmitSubmitEvents.js +180 -0
  106. package/dist/src/tasks/{InteropXContract/SyncBridgeRequestEvents.js → InteropX/SyncLogSubmitEvents.js} +26 -18
  107. package/dist/src/tasks/Transactions/SyncTransactionStatusTask.js +6 -3
  108. package/dist/src/tasks/index.js +10 -8
  109. package/dist/src/typechain/{InteropXContract.js → InteropX.js} +0 -0
  110. package/dist/src/typechain/factories/InteropX__factory.js +1928 -0
  111. package/dist/src/typechain/factories/index.js +3 -3
  112. package/dist/src/typechain/index.js +3 -3
  113. package/dist/src/utils/index.js +88 -33
  114. package/package.json +15 -12
  115. package/src/abi/connectors/index.ts +14 -0
  116. package/src/abi/connectors/v1/aave.ts +147 -0
  117. package/src/abi/connectors/v1/aave_claim.ts +3 -0
  118. package/src/abi/connectors/v1/aave_migrate.ts +108 -0
  119. package/src/abi/connectors/v1/aave_polygon_migrate.ts +109 -0
  120. package/src/abi/connectors/v1/aave_stake.ts +3 -0
  121. package/src/abi/connectors/v1/aave_v1_import.ts +53 -0
  122. package/src/abi/connectors/v1/aave_v2.ts +229 -0
  123. package/src/abi/connectors/v1/aave_v2_import.ts +58 -0
  124. package/src/abi/connectors/v1/authority.ts +99 -0
  125. package/src/abi/connectors/v1/basic.ts +135 -0
  126. package/src/abi/connectors/v1/chi.ts +35 -0
  127. package/src/abi/connectors/v1/comp.ts +3 -0
  128. package/src/abi/connectors/v1/compound.ts +3 -0
  129. package/src/abi/connectors/v1/compoundImport.ts +68 -0
  130. package/src/abi/connectors/v1/compoundImport_v2.ts +3 -0
  131. package/src/abi/connectors/v1/compound_old.ts +447 -0
  132. package/src/abi/connectors/v1/curve.ts +139 -0
  133. package/src/abi/connectors/v1/curve_claim.ts +62 -0
  134. package/src/abi/connectors/v1/curve_gauge.ts +157 -0
  135. package/src/abi/connectors/v1/curve_sbtc.ts +139 -0
  136. package/src/abi/connectors/v1/curve_susd.ts +139 -0
  137. package/src/abi/connectors/v1/curve_three.ts +78 -0
  138. package/src/abi/connectors/v1/curve_y.ts +139 -0
  139. package/src/abi/connectors/v1/dsa_migrate_v1_to_v2.ts +3 -0
  140. package/src/abi/connectors/v1/dydx.ts +147 -0
  141. package/src/abi/connectors/v1/dydx_flash.ts +51 -0
  142. package/src/abi/connectors/v1/fee.ts +49 -0
  143. package/src/abi/connectors/v1/gelato.ts +1137 -0
  144. package/src/abi/connectors/v1/index.ts +42 -0
  145. package/src/abi/connectors/v1/instapool.ts +438 -0
  146. package/src/abi/connectors/v1/instapool_v2.ts +125 -0
  147. package/src/abi/connectors/v1/kyber.ts +116 -0
  148. package/src/abi/connectors/v1/maker.ts +479 -0
  149. package/src/abi/connectors/v1/maker_old.ts +299 -0
  150. package/src/abi/connectors/v1/math.ts +42 -0
  151. package/src/abi/connectors/v1/migrate.ts +45 -0
  152. package/src/abi/connectors/v1/oasis.ts +197 -0
  153. package/src/abi/connectors/v1/oneInch.ts +159 -0
  154. package/src/abi/connectors/v1/polygon_bridge.ts +3 -0
  155. package/src/abi/connectors/v1/refinance.ts +3 -0
  156. package/src/abi/connectors/v1/staking.ts +219 -0
  157. package/src/abi/connectors/v1/swerve.ts +178 -0
  158. package/src/abi/connectors/v1/uniswap.ts +297 -0
  159. package/src/abi/connectors/v2/1INCH-A.ts +3 -0
  160. package/src/abi/connectors/v2/1INCH-B.ts +3 -0
  161. package/src/abi/connectors/v2/AAVE-CLAIM-A.ts +3 -0
  162. package/src/abi/connectors/v2/AAVE-CLAIM-B.ts +165 -0
  163. package/src/abi/connectors/v2/AAVE-STAKE-A.ts +3 -0
  164. package/src/abi/connectors/v2/AAVE-V1-A.ts +130 -0
  165. package/src/abi/connectors/v2/AAVE-V1-IMPORT-A.ts +3 -0
  166. package/src/abi/connectors/v2/AAVE-V2-A.ts +229 -0
  167. package/src/abi/connectors/v2/AAVE-V2-IMPORT-A.ts +3 -0
  168. package/src/abi/connectors/v2/AAVE-V2-IMPORT-B.ts +224 -0
  169. package/src/abi/connectors/v2/AUTHORITY-A.ts +99 -0
  170. package/src/abi/connectors/v2/B-COMPOUND-A.ts +3 -0
  171. package/src/abi/connectors/v2/B-LIQUITY-A.ts +3 -0
  172. package/src/abi/connectors/v2/B-MAKERDAO-A.ts +3 -0
  173. package/src/abi/connectors/v2/BASIC-A.ts +135 -0
  174. package/src/abi/connectors/v2/BASIC-B.ts +3 -0
  175. package/src/abi/connectors/v2/BASIC-C.ts +3 -0
  176. package/src/abi/connectors/v2/COMP-A.ts +3 -0
  177. package/src/abi/connectors/v2/COMPOUND-A.ts +3 -0
  178. package/src/abi/connectors/v2/COMPOUND-IMPORT-A.ts +3 -0
  179. package/src/abi/connectors/v2/COMPOUND-IMPORT-B.ts +194 -0
  180. package/src/abi/connectors/v2/G-UNISWAP-A.ts +3 -0
  181. package/src/abi/connectors/v2/GELATO-AAVE-A.ts +3 -0
  182. package/src/abi/connectors/v2/INST-A.ts +3 -0
  183. package/src/abi/connectors/v2/INST-LM-A.ts +3 -0
  184. package/src/abi/connectors/v2/INST-STAKING-A.ts +3 -0
  185. package/src/abi/connectors/v2/INST-STAKING-B.ts +3 -0
  186. package/src/abi/connectors/v2/INSTAPOOL-A.ts +3 -0
  187. package/src/abi/connectors/v2/LIQUITY-A.ts +3 -0
  188. package/src/abi/connectors/v2/MAKERDAO-A.ts +3 -0
  189. package/src/abi/connectors/v2/MAKERDAO-CLAIM-A.ts +135 -0
  190. package/src/abi/connectors/v2/PARASWAP-A.ts +3 -0
  191. package/src/abi/connectors/v2/POLYGON-BRIDGE-A.ts +3 -0
  192. package/src/abi/connectors/v2/REFINANCE-A.ts +3 -0
  193. package/src/abi/connectors/v2/REFLEXER-A.ts +3 -0
  194. package/src/abi/connectors/v2/STAKE-ERC20-A.ts +3 -0
  195. package/src/abi/connectors/v2/UNISWAP-A.ts +297 -0
  196. package/src/abi/connectors/v2/UNISWAP-V2-A.ts +3 -0
  197. package/src/abi/connectors/v2/UNISWAP-V3-A.ts +3 -0
  198. package/src/abi/connectors/v2/UNISWAP-V3-STAKE-A.ts +3 -0
  199. package/src/abi/connectors/v2/WETH-A.ts +3 -0
  200. package/src/abi/connectors/v2/YEARN-VAULT-A.ts +3 -0
  201. package/src/abi/connectors/v2/index.ts +87 -0
  202. package/src/abi/index.ts +7 -5
  203. package/src/abi/interopX.json +1436 -0
  204. package/src/api/index.ts +1 -1
  205. package/src/constants/addresses.ts +5 -8
  206. package/src/constants/blockConfirmations.ts +5 -0
  207. package/src/constants/index.ts +1 -0
  208. package/src/constants/tokens.ts +63 -40
  209. package/src/db/models/transaction.ts +31 -29
  210. package/src/gnosis/actions/aaveV2/index.ts +9 -0
  211. package/src/gnosis/actions/aaveV2/source.ts +118 -0
  212. package/src/gnosis/actions/aaveV2/target.ts +13 -0
  213. package/src/gnosis/actions/index.ts +2 -2
  214. package/src/gnosis/index.ts +5 -5
  215. package/src/net/protocol/dial/SignatureDialProtocol.ts +7 -2
  216. package/src/tasks/InteropX/ProcessSubmitSubmitEvents.ts +270 -0
  217. package/src/tasks/InteropX/SyncLogSubmitEvents.ts +138 -0
  218. package/src/tasks/Transactions/SyncTransactionStatusTask.ts +6 -3
  219. package/src/tasks/index.ts +10 -8
  220. package/src/typechain/InteropX.ts +1216 -0
  221. package/src/typechain/factories/InteropX__factory.ts +1932 -0
  222. package/src/typechain/factories/index.ts +1 -1
  223. package/src/typechain/index.ts +2 -2
  224. package/src/utils/index.ts +222 -97
  225. package/dist/src/abi/interopXContract.json +0 -391
  226. package/dist/src/gnosis/actions/withdraw/index.js +0 -41
  227. package/dist/src/tasks/InteropXContract/ProcessBridgeRequestEvents.js +0 -146
  228. package/dist/src/typechain/factories/InteropXContract__factory.js +0 -526
  229. package/src/abi/interopXContract.json +0 -391
  230. package/src/gnosis/actions/withdraw/index.ts +0 -56
  231. package/src/tasks/InteropXContract/ProcessBridgeRequestEvents.ts +0 -208
  232. package/src/tasks/InteropXContract/SyncBridgeRequestEvents.ts +0 -116
  233. package/src/typechain/InteropXContract.ts +0 -524
  234. package/src/typechain/factories/InteropXContract__factory.ts +0 -533
@@ -3,4 +3,4 @@
3
3
  /* eslint-disable */
4
4
  export { Erc20__factory } from "./Erc20__factory";
5
5
  export { GnosisSafe__factory } from "./GnosisSafe__factory";
6
- export { InteropXContract__factory } from "./InteropXContract__factory";
6
+ export { InteropX__factory } from "./InteropX__factory";
@@ -3,8 +3,8 @@
3
3
  /* eslint-disable */
4
4
  export type { Erc20 } from "./Erc20";
5
5
  export type { GnosisSafe } from "./GnosisSafe";
6
- export type { InteropXContract } from "./InteropXContract";
6
+ export type { InteropX } from "./InteropX";
7
7
  export * as factories from "./factories";
8
8
  export { Erc20__factory } from "./factories/Erc20__factory";
9
9
  export { GnosisSafe__factory } from "./factories/GnosisSafe__factory";
10
- export { InteropXContract__factory } from "./factories/InteropXContract__factory";
10
+ export { InteropX__factory } from "./factories/InteropX__factory";
@@ -1,17 +1,20 @@
1
1
  /**
2
2
  * @module util
3
3
  */
4
- import axios from 'axios'
4
+ import axios from "axios";
5
5
  import axiosRetry from "axios-retry";
6
- import { addresses } from '@/constants';
7
- import { ChainId } from '@/types'
8
- import { ethers } from 'ethers';
9
- import { GnosisSafe } from '@/typechain';
6
+ import { addresses } from "@/constants";
7
+ import { ChainId } from "@/types";
8
+ import { ethers } from "ethers";
9
+ import { GnosisSafe } from "@/typechain";
10
+ import retry from "async-retry";
11
+ import { connectors } from "@/abi/connectors";
12
+ import Web3EthAbi from "web3-eth-abi";
13
+
10
14
  export const http = axios.create();
11
15
 
12
16
  axiosRetry(http, { retries: 3, retryDelay: axiosRetry.exponentialDelay });
13
17
 
14
-
15
18
  export function shortenHash(hash: string, length: number = 4) {
16
19
  if (!hash) return;
17
20
 
@@ -25,22 +28,25 @@ export function shortenHash(hash: string, length: number = 4) {
25
28
  }
26
29
 
27
30
  export function short(buffer: Buffer): string {
28
- return buffer.toString('hex').slice(0, 8) + '...'
31
+ return buffer.toString("hex").slice(0, 8) + "...";
29
32
  }
30
33
 
31
- export const signGnosisSafeTx = async ({
32
- to,
33
- data = null as any,
34
- value = '0',
35
- operation = '1',
36
- baseGas = '0',
37
- gasPrice = "0",
38
- gasToken = "0x0000000000000000000000000000000000000000",
39
- refundReceiver = "0x0000000000000000000000000000000000000000",
40
- safeTxGas = "79668" as string | number,
41
- nonce = "0",
42
- chainId = 137 as ChainId,
43
- }, { signer }) => {
34
+ export const signGnosisSafeTx = async (
35
+ {
36
+ to,
37
+ data = null as any,
38
+ value = "0",
39
+ operation = "1",
40
+ baseGas = "0",
41
+ gasPrice = "0",
42
+ gasToken = "0x0000000000000000000000000000000000000000",
43
+ refundReceiver = "0x0000000000000000000000000000000000000000",
44
+ safeTxGas = "79668" as string | number,
45
+ nonce = "0",
46
+ chainId = 137 as ChainId,
47
+ },
48
+ { signer }
49
+ ) => {
44
50
  const gnosisSafe = addresses[chainId].gnosisSafe;
45
51
 
46
52
  const domain = {
@@ -50,16 +56,16 @@ export const signGnosisSafeTx = async ({
50
56
 
51
57
  const types = {
52
58
  SafeTx: [
53
- { type: 'address', name: 'to' },
54
- { type: 'uint256', name: 'value' },
55
- { type: 'bytes', name: 'data' },
56
- { type: 'uint8', name: 'operation' },
57
- { type: 'uint256', name: 'safeTxGas' },
58
- { type: 'uint256', name: 'baseGas' },
59
- { type: 'uint256', name: 'gasPrice' },
60
- { type: 'address', name: 'gasToken' },
61
- { type: 'address', name: 'refundReceiver' },
62
- { type: 'uint256', name: 'nonce' },
59
+ { type: "address", name: "to" },
60
+ { type: "uint256", name: "value" },
61
+ { type: "bytes", name: "data" },
62
+ { type: "uint8", name: "operation" },
63
+ { type: "uint256", name: "safeTxGas" },
64
+ { type: "uint256", name: "baseGas" },
65
+ { type: "uint256", name: "gasPrice" },
66
+ { type: "address", name: "gasToken" },
67
+ { type: "address", name: "refundReceiver" },
68
+ { type: "uint256", name: "nonce" },
63
69
  ],
64
70
  };
65
71
 
@@ -77,21 +83,21 @@ export const signGnosisSafeTx = async ({
77
83
  value,
78
84
  };
79
85
 
80
- return await signer._signTypedData(domain, types, message)
86
+ return await signer._signTypedData(domain, types, message);
81
87
  };
82
88
 
83
89
  export const getRpcProviderUrl = (chainId: ChainId) => {
84
90
  switch (chainId) {
85
91
  case 1:
86
- return 'https://rpc.ankr.com/eth';
92
+ return "https://rpc.ankr.com/eth";
87
93
  case 137:
88
- return 'https://rpc.ankr.com/polygon';
94
+ return "https://rpc.ankr.com/polygon";
89
95
  case 43114:
90
- return 'https://rpc.ankr.com/avalanche';
96
+ return "https://rpc.ankr.com/avalanche";
91
97
  default:
92
98
  throw new Error(`Unknown chainId: ${chainId}`);
93
99
  }
94
- }
100
+ };
95
101
 
96
102
  export interface Signature {
97
103
  signer: string;
@@ -114,84 +120,161 @@ export const buildSignatureBytes = (signatures: Signature[]): string => {
114
120
  * Call an async function with a maximum time limit (in milliseconds) for the timeout
115
121
  * Resolved promise for async function call, or an error if time limit reached
116
122
  */
117
- export const asyncCallWithTimeout = async <T>(asyncPromise: Promise<T>, timeout: number) => {
123
+ export const asyncCallWithTimeout = async <T>(
124
+ asyncPromise: Promise<T>,
125
+ timeout: number
126
+ ) => {
118
127
  let timeoutHandle;
119
128
 
120
129
  const timeoutPromise = new Promise((_resolve, reject) => {
121
130
  timeoutHandle = setTimeout(
122
- () => reject(new Error('Async call timeout limit reached')),
131
+ () => reject(new Error("Async call timeout limit reached")),
123
132
  timeout
124
133
  );
125
134
  });
126
135
 
127
- return Promise.race([asyncPromise, timeoutPromise]).then(result => {
136
+ return Promise.race([asyncPromise, timeoutPromise]).then((result) => {
128
137
  clearTimeout(timeoutHandle);
129
138
  return result;
130
- }) as Promise<T>
131
- }
139
+ }) as Promise<T>;
140
+ };
132
141
 
142
+ type GenerateInteropTransactionHashParam = {
143
+ actionId: string;
144
+ vnonce: string;
145
+ sourceSender: string;
146
+ sourceChainId: string | number;
147
+ sourceDsaId: string;
148
+ targetChainId: string | number;
149
+ targetDsaId: string;
150
+ };
133
151
 
134
- export const generateInteropTransactionHash = (data: { action: string, bridger: string, requestTransactionHash: string, sourceChainId: string | number, targetChainId: string | number }) => {
135
- return ethers.utils.solidityKeccak256(['string', 'string', 'string', 'string', 'string'], [
136
- String(data.action),
137
- String(data.bridger),
138
- String(data.requestTransactionHash),
139
- String(data.sourceChainId),
140
- String(data.targetChainId),
141
- ]);
152
+ export const generateInteropTransactionHash = (
153
+ data: GenerateInteropTransactionHashParam
154
+ ) => {
155
+ return ethers.utils.solidityKeccak256(
156
+ Array.from({ length: 7 }, () => "string"),
157
+ [
158
+ String(data.actionId),
159
+ String(data.vnonce),
160
+ String(data.sourceSender),
161
+ String(data.sourceChainId),
162
+ String(data.sourceDsaId),
163
+ String(data.targetChainId),
164
+ String(data.targetDsaId),
165
+ ]
166
+ );
167
+ };
168
+
169
+ export class ContractError extends Error {
170
+ method: string;
171
+ address: string;
172
+ args: any[];
142
173
  }
143
174
 
144
- export function getContract<TContract extends ethers.Contract>(address: string, contractInterface: ethers.ContractInterface | any, signerOrProvider?: ethers.Signer | ethers.providers.Provider) {
145
- if (!ethers.utils.getAddress(address) || address === ethers.constants.AddressZero) {
146
- throw Error(`Invalid 'address' parameter '${address}'.`)
175
+ export function getContract<TContract extends ethers.Contract>(
176
+ address: string,
177
+ contractInterface: ethers.ContractInterface | any,
178
+ signerOrProvider?: ethers.Signer | ethers.providers.Provider
179
+ ) {
180
+ if (
181
+ !ethers.utils.getAddress(address) ||
182
+ address === ethers.constants.AddressZero
183
+ ) {
184
+ throw Error(`Invalid 'address' parameter '${address}'.`);
147
185
  }
148
186
 
149
187
  const contract = new ethers.Contract(
150
188
  address,
151
189
  contractInterface,
152
190
  signerOrProvider
153
- ) as TContract
191
+ ) as TContract;
154
192
 
155
193
  // Make sure the contract properties is writable
156
- const desc = Object.getOwnPropertyDescriptor(contract, 'functions');
194
+ const desc = Object.getOwnPropertyDescriptor(contract, "functions");
157
195
 
158
196
  if (!desc || desc.writable !== true) {
159
- return contract
197
+ return contract;
160
198
  }
161
199
 
162
200
  return new Proxy(contract, {
163
201
  get(target, prop, receiver) {
164
202
  const value = Reflect.get(target, prop, receiver);
165
203
 
166
- if (typeof value === 'function' && (contract.functions.hasOwnProperty(prop) || ['queryFilter'].includes(String(prop)))) {
204
+ if (
205
+ typeof value === "function" &&
206
+ (contract.functions.hasOwnProperty(prop) ||
207
+ ["queryFilter"].includes(String(prop)))
208
+ ) {
209
+ let isConstant = false;
210
+
211
+ try {
212
+ isConstant = contract.interface.getFunction(String(prop)).constant;
213
+ } catch (error) {}
214
+
167
215
  return async (...args: any[]) => {
168
216
  try {
169
- return await value.bind(contract)(...args);
217
+ return await retry(
218
+ async () => await value.bind(contract)(...args),
219
+ { retries: isConstant ? 1 : 3 }
220
+ );
170
221
  } catch (error) {
171
- throw new Error(`Error calling "${String(prop)}" on "${address}": ${error.reason || error.message}`)
222
+ const err = new ContractError(
223
+ `Error calling "${String(prop)}" on "${address}": ${
224
+ error.reason || error.message
225
+ }`
226
+ );
227
+
228
+ err.method = String(prop);
229
+ err.address = address;
230
+ err.args = [...args];
231
+
232
+ throw err;
172
233
  }
173
- }
234
+ };
174
235
  }
175
236
 
176
-
177
- if (typeof value === 'object' && ['populateTransaction', 'estimateGas', 'functions', 'callStatic'].includes(String(prop))) {
237
+ if (
238
+ typeof value === "object" &&
239
+ [
240
+ "populateTransaction",
241
+ "estimateGas",
242
+ "functions",
243
+ "callStatic",
244
+ ].includes(String(prop))
245
+ ) {
178
246
  const parentProp = String(prop);
179
247
 
180
248
  return new Proxy(value, {
181
249
  get(target, prop, receiver) {
182
250
  const value = Reflect.get(target, prop, receiver);
183
251
 
184
- if (typeof value === 'function') {
252
+ if (typeof value === "function") {
185
253
  return async (...args: any[]) => {
186
254
  try {
187
- return await value.bind(contract)(...args);
255
+ return await retry(
256
+ async () => await value.bind(contract)(...args),
257
+ { retries: parentProp === "callStatic" ? 3 : 1 }
258
+ );
188
259
  } catch (error) {
189
- throw new Error(`Error calling "${String(prop)}" using "${parentProp}" on "${address}": ${error.reason || error.message}`)
260
+ const err = new ContractError(
261
+ `Error calling "${String(
262
+ prop
263
+ )}" using "${parentProp}" on "${address}": ${
264
+ error.reason || error.message
265
+ }`
266
+ );
267
+
268
+ err.method = String(prop);
269
+ err.address = address;
270
+ err.args = [...args];
271
+
272
+ throw err;
190
273
  }
191
- }
274
+ };
192
275
  }
193
- }
194
- })
276
+ },
277
+ });
195
278
  }
196
279
 
197
280
  return value;
@@ -199,42 +282,84 @@ export function getContract<TContract extends ethers.Contract>(address: string,
199
282
  });
200
283
  }
201
284
 
202
- export const generateGnosisTransaction = async (transactionData: any, safeContract: GnosisSafe) => {
285
+ export const generateGnosisTransaction = async (
286
+ transactionData: any,
287
+ safeContract: GnosisSafe
288
+ ) => {
203
289
  console.log(transactionData);
204
290
 
205
291
  let isExecuted = await safeContract.dataHashes(
206
- await safeContract.getTransactionHash(
207
- transactionData.to,
208
- transactionData.value,
209
- transactionData.data,
210
- transactionData.operation,
211
- transactionData.safeTxGas,
212
- transactionData.baseGas,
213
- transactionData.gasPrice,
214
- transactionData.gasToken,
215
- transactionData.refundReceiver,
216
- transactionData.nonce
217
- )
218
- )
292
+ await safeContract.getTransactionHash(
293
+ transactionData.to,
294
+ transactionData.value,
295
+ transactionData.data,
296
+ transactionData.operation,
297
+ transactionData.safeTxGas,
298
+ transactionData.baseGas,
299
+ transactionData.gasPrice,
300
+ transactionData.gasToken,
301
+ transactionData.refundReceiver,
302
+ transactionData.nonce
303
+ )
304
+ );
219
305
 
220
306
  while (isExecuted == 1) {
221
- transactionData.safeTxGas = ethers.BigNumber.from(String(transactionData.safeTxGas)).add(1).toString()
222
-
223
- isExecuted = await safeContract.dataHashes(
224
- await safeContract.getTransactionHash(
225
- transactionData.to,
226
- transactionData.value,
227
- transactionData.data,
228
- transactionData.operation,
229
- transactionData.safeTxGas,
230
- transactionData.baseGas,
231
- transactionData.gasPrice,
232
- transactionData.gasToken,
233
- transactionData.refundReceiver,
234
- transactionData.nonce
235
- )
307
+ transactionData.safeTxGas = ethers.BigNumber.from(
308
+ String(transactionData.safeTxGas)
309
+ )
310
+ .add(1)
311
+ .toString();
312
+
313
+ isExecuted = await safeContract.dataHashes(
314
+ await safeContract.getTransactionHash(
315
+ transactionData.to,
316
+ transactionData.value,
317
+ transactionData.data,
318
+ transactionData.operation,
319
+ transactionData.safeTxGas,
320
+ transactionData.baseGas,
321
+ transactionData.gasPrice,
322
+ transactionData.gasToken,
323
+ transactionData.refundReceiver,
324
+ transactionData.nonce
236
325
  )
326
+ );
327
+ }
328
+
329
+ return transactionData;
330
+ };
331
+
332
+ export class LiquidityError extends Error {
333
+ constructor(message?: string) {
334
+ super(message || "Not enough liquidity");
335
+ Object.setPrototypeOf(this, new.target.prototype);
336
+ }
337
+ }
338
+
339
+ export const encodeConnectorMethod = (params: {
340
+ connector: string;
341
+ method: string;
342
+ args: string[];
343
+ }) => {
344
+ const connectorInterface = getInterface(
345
+ connectors.versions[2][params.connector],
346
+ params.method
347
+ );
348
+
349
+ if (!connectorInterface)
350
+ throw new Error(`ConnectorInterface '${params.method}' not found`);
351
+
352
+ //@ts-ignore
353
+ return Web3EthAbi.encodeFunctionCall(connectorInterface, params.args);
354
+ };
355
+
356
+ const getInterface = (abiItems: any[], method: string) => {
357
+ const abiItem = abiItems.find((abiItem) => abiItem.name === method);
358
+
359
+ if (!abiItem) {
360
+ console.error(`${method} is an invalid method.`);
361
+ return;
237
362
  }
238
363
 
239
- return transactionData
240
- }
364
+ return abiItem;
365
+ };