dequanto 0.0.1

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 (477) hide show
  1. package/.vscode/settings.json +11 -0
  2. package/actions/gen.act.ts +38 -0
  3. package/actions/tokens.act.ts +12 -0
  4. package/configs/dequanto.yml +51 -0
  5. package/contracts/abi/erc20.abi.json +222 -0
  6. package/contracts/gen/amm/AmmFactoryV2ContractBase.ts +66 -0
  7. package/contracts/gen/amm/AmmMasterChefV2ContractBase.ts +158 -0
  8. package/contracts/gen/amm/AmmPairContractV2Base.ts +158 -0
  9. package/contracts/gen/amm/AmmPairContractV3Base.ts +125 -0
  10. package/contracts/gen/amm/AmmRouterV2ContractBase.ts +124 -0
  11. package/contracts/gen/amm/AmmVaultV2ContractBase.ts +214 -0
  12. package/contracts/gen/base/ERC20Base.ts +90 -0
  13. package/contracts/gen/bsc/OneInchRouterV3Base.ts +57 -0
  14. package/contracts/gen/eth/WETHBase/WETHBase.sol +756 -0
  15. package/contracts/gen/eth/WETHBase.ts +136 -0
  16. package/contracts/gen/polygon/ERC20PolygonBase.ts +305 -0
  17. package/contracts/gen/polygon/WormholeBridgeContractBase/Address.sol +216 -0
  18. package/contracts/gen/polygon/WormholeBridgeContractBase/BeaconProxy.sol +61 -0
  19. package/contracts/gen/polygon/WormholeBridgeContractBase/Bridge.sol +437 -0
  20. package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeGetters.sol +70 -0
  21. package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeGovernance.sol +142 -0
  22. package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeImplementation.sol +34 -0
  23. package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeSetters.sol +57 -0
  24. package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeState.sol +52 -0
  25. package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeStructs.sol +66 -0
  26. package/contracts/gen/polygon/WormholeBridgeContractBase/BytesLib.sol +510 -0
  27. package/contracts/gen/polygon/WormholeBridgeContractBase/Context.sol +23 -0
  28. package/contracts/gen/polygon/WormholeBridgeContractBase/ERC1967Proxy.sol +32 -0
  29. package/contracts/gen/polygon/WormholeBridgeContractBase/ERC1967Upgrade.sol +193 -0
  30. package/contracts/gen/polygon/WormholeBridgeContractBase/IBeacon.sol +15 -0
  31. package/contracts/gen/polygon/WormholeBridgeContractBase/IERC20.sol +81 -0
  32. package/contracts/gen/polygon/WormholeBridgeContractBase/IWormhole.sol +42 -0
  33. package/contracts/gen/polygon/WormholeBridgeContractBase/Ownable.sol +71 -0
  34. package/contracts/gen/polygon/WormholeBridgeContractBase/Proxy.sol +85 -0
  35. package/contracts/gen/polygon/WormholeBridgeContractBase/SafeERC20.sol +98 -0
  36. package/contracts/gen/polygon/WormholeBridgeContractBase/StorageSlot.sol +83 -0
  37. package/contracts/gen/polygon/WormholeBridgeContractBase/Structs.sol +40 -0
  38. package/contracts/gen/polygon/WormholeBridgeContractBase/Token.sol +12 -0
  39. package/contracts/gen/polygon/WormholeBridgeContractBase/TokenBridge.sol +15 -0
  40. package/contracts/gen/polygon/WormholeBridgeContractBase/TokenImplementation.sol +177 -0
  41. package/contracts/gen/polygon/WormholeBridgeContractBase/TokenState.sol +31 -0
  42. package/contracts/gen/polygon/WormholeBridgeContractBase.ts +231 -0
  43. package/contracts/gen/xdai/WXDaiTokenContractBase.ts +136 -0
  44. package/data/cex/eth.csv +356 -0
  45. package/data/tokens/1inch.json +16557 -0
  46. package/data/tokens/arbitrum.json +1 -0
  47. package/data/tokens/sushi.json +56388 -0
  48. package/dist/contracts/gen/amm/AmmFactoryV2ContractBase.js +53 -0
  49. package/dist/contracts/gen/amm/AmmMasterChefV2ContractBase.js +122 -0
  50. package/dist/contracts/gen/amm/AmmPairContractV2Base.js +122 -0
  51. package/dist/contracts/gen/amm/AmmPairContractV3Base.js +98 -0
  52. package/dist/contracts/gen/amm/AmmRouterV2ContractBase.js +95 -0
  53. package/dist/contracts/gen/amm/AmmVaultV2ContractBase.js +164 -0
  54. package/dist/contracts/gen/base/ERC20Base.js +64 -0
  55. package/dist/contracts/gen/bsc/OneInchRouterV3Base.js +47 -0
  56. package/dist/contracts/gen/eth/WETHBase.js +96 -0
  57. package/dist/contracts/gen/polygon/ERC20PolygonBase.js +233 -0
  58. package/dist/contracts/gen/polygon/WormholeBridgeContractBase.js +172 -0
  59. package/dist/contracts/gen/xdai/WXDaiTokenContractBase.js +96 -0
  60. package/dist/src/BlockchainExplorer/BlockChainExplorerFactory.js +227 -0
  61. package/dist/src/BlockchainExplorer/BlockChainExplorerProvider.js +32 -0
  62. package/dist/src/BlockchainExplorer/BlockNumberCache.js +33 -0
  63. package/dist/src/BlockchainExplorer/Bscscan.js +27 -0
  64. package/dist/src/BlockchainExplorer/Etherscan.js +27 -0
  65. package/dist/src/BlockchainExplorer/IAbiProvider.js +2 -0
  66. package/dist/src/BlockchainExplorer/IBlockChainExplorer.js +2 -0
  67. package/dist/src/BlockchainExplorer/Polyscan.js +27 -0
  68. package/dist/src/ChainAccounts.js +69 -0
  69. package/dist/src/ChainAccountsService.js +75 -0
  70. package/dist/src/Config.js +7 -0
  71. package/dist/src/blocks/BlockDateResolver.js +125 -0
  72. package/dist/src/bridges/BridgeFactory.js +19 -0
  73. package/dist/src/bridges/hop/HopAddresses.js +520 -0
  74. package/dist/src/bridges/hop/HopBridge.js +327 -0
  75. package/dist/src/bridges/hop/contracts/gen.act.js +43 -0
  76. package/dist/src/bridges/hop/contracts/polygon/Dai_l2AmmWrapperContract.js +52 -0
  77. package/dist/src/bridges/hop/contracts/polygon/Dai_l2BridgeContract.js +319 -0
  78. package/dist/src/bridges/hop/contracts/polygon/Dai_l2SaddleSwapContract.js +178 -0
  79. package/dist/src/bridges/hop/contracts/polygon/Eth_l2AmmWrapperContract.js +52 -0
  80. package/dist/src/bridges/hop/contracts/polygon/Eth_l2BridgeContract.js +319 -0
  81. package/dist/src/bridges/hop/contracts/polygon/Eth_l2SaddleSwapContract.js +178 -0
  82. package/dist/src/bridges/hop/contracts/polygon/Matic_l2AmmWrapperContract.js +52 -0
  83. package/dist/src/bridges/hop/contracts/polygon/Matic_l2BridgeContract.js +319 -0
  84. package/dist/src/bridges/hop/contracts/polygon/Matic_l2SaddleSwapContract.js +178 -0
  85. package/dist/src/bridges/hop/contracts/polygon/Usdc_l2AmmWrapperContract.js +52 -0
  86. package/dist/src/bridges/hop/contracts/polygon/Usdc_l2BridgeContract.js +319 -0
  87. package/dist/src/bridges/hop/contracts/polygon/Usdc_l2SaddleSwapContract.js +178 -0
  88. package/dist/src/bridges/hop/contracts/polygon/Usdt_l2AmmWrapperContract.js +52 -0
  89. package/dist/src/bridges/hop/contracts/polygon/Usdt_l2BridgeContract.js +319 -0
  90. package/dist/src/bridges/hop/contracts/polygon/Usdt_l2SaddleSwapContract.js +178 -0
  91. package/dist/src/bridges/hop/contracts/polygon/Wbtc_l2AmmWrapperContract.js +52 -0
  92. package/dist/src/bridges/hop/contracts/polygon/Wbtc_l2BridgeContract.js +319 -0
  93. package/dist/src/bridges/hop/contracts/polygon/Wbtc_l2SaddleSwapContract.js +178 -0
  94. package/dist/src/bridges/models/IBridge.js +2 -0
  95. package/dist/src/bridges/wormhole/contracts/WormholeBridgeContract.js +15 -0
  96. package/dist/src/chains/PlatformFactory.js +42 -0
  97. package/dist/src/chains/arbitrum/ArbTokenProvider.js +40 -0
  98. package/dist/src/chains/arbitrum/ArbWeb3Client.js +39 -0
  99. package/dist/src/chains/arbitrum/Arbiscan.js +27 -0
  100. package/dist/src/chains/boba/BobaWeb3Client.js +47 -0
  101. package/dist/src/chains/boba/Bobascan.js +28 -0
  102. package/dist/src/chains/xdai/XDaiWeb3Client.js +87 -0
  103. package/dist/src/chains/xdai/XDaiscan.js +27 -0
  104. package/dist/src/chains/xdai/tokens/WXDaiTokenContract.js +15 -0
  105. package/dist/src/clients/BscWeb3Client.js +38 -0
  106. package/dist/src/clients/ClientEventsStream.js +34 -0
  107. package/dist/src/clients/ClientPool.js +560 -0
  108. package/dist/src/clients/ClientPoolStats.js +52 -0
  109. package/dist/src/clients/EthWeb3Client.js +35 -0
  110. package/dist/src/clients/HardhatWeb3Client.js +56 -0
  111. package/dist/src/clients/PolyWeb3Client.js +77 -0
  112. package/dist/src/clients/Web3Client.js +186 -0
  113. package/dist/src/clients/Web3ClientFactory.js +32 -0
  114. package/dist/src/clients/interfaces/IWeb3Client.js +2 -0
  115. package/dist/src/clients/interfaces/IWeb3ClientStatus.js +2 -0
  116. package/dist/src/clients/interfaces/IWeb3EndpointOptions.js +2 -0
  117. package/dist/src/clients/model/ClientStatus.js +9 -0
  118. package/dist/src/clients/model/PromiEventWrap.js +52 -0
  119. package/dist/src/clients/model/SubscriptionWrap.js +42 -0
  120. package/dist/src/clients/utils/ClientEndpoints.js +27 -0
  121. package/dist/src/clients/utils/ClientErrorUtil.js +30 -0
  122. package/dist/src/clients/utils/TxFactory.js +14 -0
  123. package/dist/src/contracts/BscContract.js +30 -0
  124. package/dist/src/contracts/Contract.js +90 -0
  125. package/dist/src/contracts/ContractBase.js +139 -0
  126. package/dist/src/contracts/ContractFactory.js +17 -0
  127. package/dist/src/contracts/ContractProvider.js +40 -0
  128. package/dist/src/contracts/ContractReader.js +76 -0
  129. package/dist/src/contracts/ContractStream.js +20 -0
  130. package/dist/src/contracts/ContractWriter.js +62 -0
  131. package/dist/src/contracts/EthContract.js +31 -0
  132. package/dist/src/contracts/TxContract.js +37 -0
  133. package/dist/src/contracts/common/ERC20.js +14 -0
  134. package/dist/src/contracts/common/ERC20Polygon.js +14 -0
  135. package/dist/src/contracts/common/PoolPair.js +23 -0
  136. package/dist/src/contracts/utils/AbiDeserializer.js +89 -0
  137. package/dist/src/contracts/utils/ConvertUtils.js +21 -0
  138. package/dist/src/contracts/utils/InputDataUtils.js +87 -0
  139. package/dist/src/contracts/utils/TypeUtils.js +24 -0
  140. package/dist/src/defi/OneInch/OneInchRouter.js +14 -0
  141. package/dist/src/env/BigIntSerializer.js +19 -0
  142. package/dist/src/gen/Ast.js +12 -0
  143. package/dist/src/gen/ContractTemplate.js +27 -0
  144. package/dist/src/gen/Generator.js +180 -0
  145. package/dist/src/gen/GeneratorFromAbi.js +361 -0
  146. package/dist/src/handlers/TokenHandler.js +69 -0
  147. package/dist/src/indexer/BlocksTxIndexer.js +52 -0
  148. package/dist/src/indexer/PendingTxIndexer.js +96 -0
  149. package/dist/src/indexer/handlers/BlocksWalker.js +306 -0
  150. package/dist/src/indexer/handlers/TxQueueLoader.js +117 -0
  151. package/dist/src/json/JsonArrayStore.js +296 -0
  152. package/dist/src/json/JsonObjectStore.js +214 -0
  153. package/dist/src/json/JsonStore.spec.js +83 -0
  154. package/dist/src/loggers/ILogger.js +2 -0
  155. package/dist/src/loggers/LoggerService.js +34 -0
  156. package/dist/src/loggers/TxLoggerService.js +122 -0
  157. package/dist/src/models/IContractDetails.js +2 -0
  158. package/dist/src/models/IToken.js +2 -0
  159. package/dist/src/models/ITokenGlob.js +6 -0
  160. package/dist/src/models/ITransactionDetails.js +2 -0
  161. package/dist/src/models/TAddress.js +2 -0
  162. package/dist/src/models/TBufferLike.js +2 -0
  163. package/dist/src/models/THex.js +2 -0
  164. package/dist/src/models/TPlatform.js +2 -0
  165. package/dist/src/models/TResult.js +2 -0
  166. package/dist/src/ns/NameService.js +19 -0
  167. package/dist/src/ns/providers/EnsProvider.js +41 -0
  168. package/dist/src/ns/providers/INsProvider.js +2 -0
  169. package/dist/src/ns/providers/UDProvider.js +39 -0
  170. package/dist/src/ns/utils/$ns.js +17 -0
  171. package/dist/src/structs/PackedRanges.js +186 -0
  172. package/dist/src/structs/PackedRanges.spec.js +30 -0
  173. package/dist/src/tokens/TokenExchangeService.js +110 -0
  174. package/dist/src/tokens/TokenExchanges/AmmBase/AmmUtilts.js +17 -0
  175. package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmFactoryV2Contract.js +15 -0
  176. package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmMasterChefV2Contract.js +15 -0
  177. package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Contract.js +16 -0
  178. package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Service.js +144 -0
  179. package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmRouterV2Contract.js +15 -0
  180. package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmVaultV2Contract.js +15 -0
  181. package/dist/src/tokens/TokenExchanges/AmmBase/V3/AmmPairV3Contract.js +22 -0
  182. package/dist/src/tokens/TokenExchanges/AmmV2ExchangeBase.js +194 -0
  183. package/dist/src/tokens/TokenExchanges/OneInchExchange.js +92 -0
  184. package/dist/src/tokens/TokenExchanges/PancakeswapExchange.js +28 -0
  185. package/dist/src/tokens/TokenExchanges/SushiswapPolygonExchange.js +28 -0
  186. package/dist/src/tokens/TokenExchanges/UniswapExchange.js +28 -0
  187. package/dist/src/tokens/TokenOracles/AmmPriceV2Oracle.js +319 -0
  188. package/dist/src/tokens/TokenOracles/TokenPriceStore.js +108 -0
  189. package/dist/src/tokens/TokenPriceService.js +196 -0
  190. package/dist/src/tokens/TokenPriceServiceProvider.js +31 -0
  191. package/dist/src/tokens/TokenProviders/ATokenProvider.js +38 -0
  192. package/dist/src/tokens/TokenProviders/ITokenProvider.js +2 -0
  193. package/dist/src/tokens/TokenProviders/TPChain.js +35 -0
  194. package/dist/src/tokens/TokenProviders/TPCoinmarketcap.js +63 -0
  195. package/dist/src/tokens/TokenProviders/TPOneInch.js +65 -0
  196. package/dist/src/tokens/TokenProviders/TPSushiswap.js +89 -0
  197. package/dist/src/tokens/TokenProviders/TPUniswap.js +84 -0
  198. package/dist/src/tokens/TokenService.js +115 -0
  199. package/dist/src/tokens/TokenSwapService.js +37 -0
  200. package/dist/src/tokens/TokenTransferService.js +189 -0
  201. package/dist/src/tokens/TokensService.js +236 -0
  202. package/dist/src/tokens/TokensServiceBsc.js +18 -0
  203. package/dist/src/tokens/TokensServiceEth.js +15 -0
  204. package/dist/src/tokens/TokensServiceFactory.js +29 -0
  205. package/dist/src/tokens/TokensServicePolygon.js +18 -0
  206. package/dist/src/tokens/TokensServiceXDai.js +24 -0
  207. package/dist/src/tokens/defi/ISwapService.js +2 -0
  208. package/dist/src/tokens/defi/paraswap/Paraswap.js +135 -0
  209. package/dist/src/tokens/erc20/eth/WETH.js +14 -0
  210. package/dist/src/tokens/utils/TokenUtils.js +66 -0
  211. package/dist/src/txs/ITxConfig.js +2 -0
  212. package/dist/src/txs/TxDataBuilder.js +159 -0
  213. package/dist/src/txs/TxLogger.js +119 -0
  214. package/dist/src/txs/TxProvider.js +73 -0
  215. package/dist/src/txs/TxService.js +19 -0
  216. package/dist/src/txs/TxWriter.js +287 -0
  217. package/dist/src/txs/conditional/GasWatcherLogger.js +61 -0
  218. package/dist/src/txs/conditional/GasWatcherService.js +103 -0
  219. package/dist/src/txs/conditional/GasWatcherStore.js +25 -0
  220. package/dist/src/txs/conditional/GasWatcherTx.js +126 -0
  221. package/dist/src/txs/receipt/ITxLogItem.js +2 -0
  222. package/dist/src/txs/receipt/TxLogParser.js +27 -0
  223. package/dist/src/txs/receipt/TxLogsTransfer.js +50 -0
  224. package/dist/src/txs/receipt/TxTopicInMemoryProvider.js +41 -0
  225. package/dist/src/txs/receipt/TxTopicProvider.js +25 -0
  226. package/dist/src/utils/$abiParser.js +159 -0
  227. package/dist/src/utils/$abiType.js +77 -0
  228. package/dist/src/utils/$abiUtils.js +43 -0
  229. package/dist/src/utils/$address.js +41 -0
  230. package/dist/src/utils/$array.js +60 -0
  231. package/dist/src/utils/$bigint.js +130 -0
  232. package/dist/src/utils/$block.js +10 -0
  233. package/dist/src/utils/$class.js +13 -0
  234. package/dist/src/utils/$config.js +18 -0
  235. package/dist/src/utils/$contract.js +67 -0
  236. package/dist/src/utils/$csv.js +79 -0
  237. package/dist/src/utils/$date.js +496 -0
  238. package/dist/src/utils/$fn.js +117 -0
  239. package/dist/src/utils/$is.js +40 -0
  240. package/dist/src/utils/$logger.js +15 -0
  241. package/dist/src/utils/$number.js +95 -0
  242. package/dist/src/utils/$object.js +82 -0
  243. package/dist/src/utils/$path.js +33 -0
  244. package/dist/src/utils/$promise.js +13 -0
  245. package/dist/src/utils/$require.js +127 -0
  246. package/dist/src/utils/$sign.js +35 -0
  247. package/dist/src/utils/$signSerializer.js +264 -0
  248. package/dist/src/utils/$wallet.js +13 -0
  249. package/dist/src/utils/types.js +2 -0
  250. package/dist/src/wallets/Wallet.js +26 -0
  251. package/dist/src/wallets/WalletBsc.js +17 -0
  252. package/dist/src/wallets/WalletService.js +35 -0
  253. package/dist/src/www/utils/BlockChainExplorerFormatter.js +15 -0
  254. package/hardhat.config.js +6 -0
  255. package/package.json +52 -0
  256. package/readme.md +76 -0
  257. package/src/BlockchainExplorer/BlockChainExplorerFactory.ts +273 -0
  258. package/src/BlockchainExplorer/BlockChainExplorerProvider.ts +26 -0
  259. package/src/BlockchainExplorer/BlockNumberCache.ts +46 -0
  260. package/src/BlockchainExplorer/Bscscan.ts +23 -0
  261. package/src/BlockchainExplorer/Etherscan.ts +25 -0
  262. package/src/BlockchainExplorer/IAbiProvider.ts +5 -0
  263. package/src/BlockchainExplorer/IBlockChainExplorer.ts +37 -0
  264. package/src/BlockchainExplorer/Polyscan.ts +23 -0
  265. package/src/ChainAccounts.ts +72 -0
  266. package/src/ChainAccountsService.ts +74 -0
  267. package/src/Config.ts +34 -0
  268. package/src/blocks/BlockDateResolver.ts +149 -0
  269. package/src/bridges/BridgeFactory.ts +16 -0
  270. package/src/bridges/hop/HopAddresses.ts +518 -0
  271. package/src/bridges/hop/HopBridge.ts +430 -0
  272. package/src/bridges/hop/contracts/gen.act.ts +50 -0
  273. package/src/bridges/hop/contracts/polygon/Dai_l2AmmWrapperContract.ts +69 -0
  274. package/src/bridges/hop/contracts/polygon/Dai_l2BridgeContract.ts +453 -0
  275. package/src/bridges/hop/contracts/polygon/Dai_l2SaddleSwapContract.ts +264 -0
  276. package/src/bridges/hop/contracts/polygon/Eth_l2AmmWrapperContract.ts +69 -0
  277. package/src/bridges/hop/contracts/polygon/Eth_l2BridgeContract.ts +453 -0
  278. package/src/bridges/hop/contracts/polygon/Eth_l2SaddleSwapContract.ts +264 -0
  279. package/src/bridges/hop/contracts/polygon/Matic_l2AmmWrapperContract.ts +69 -0
  280. package/src/bridges/hop/contracts/polygon/Matic_l2BridgeContract.ts +453 -0
  281. package/src/bridges/hop/contracts/polygon/Matic_l2SaddleSwapContract.ts +264 -0
  282. package/src/bridges/hop/contracts/polygon/Usdc_l2AmmWrapperContract.ts +69 -0
  283. package/src/bridges/hop/contracts/polygon/Usdc_l2BridgeContract.ts +453 -0
  284. package/src/bridges/hop/contracts/polygon/Usdc_l2SaddleSwapContract.ts +264 -0
  285. package/src/bridges/hop/contracts/polygon/Usdt_l2AmmWrapperContract.ts +69 -0
  286. package/src/bridges/hop/contracts/polygon/Usdt_l2BridgeContract.ts +453 -0
  287. package/src/bridges/hop/contracts/polygon/Usdt_l2SaddleSwapContract.ts +264 -0
  288. package/src/bridges/hop/contracts/polygon/Wbtc_l2AmmWrapperContract.ts +69 -0
  289. package/src/bridges/hop/contracts/polygon/Wbtc_l2BridgeContract.ts +453 -0
  290. package/src/bridges/hop/contracts/polygon/Wbtc_l2SaddleSwapContract.ts +264 -0
  291. package/src/bridges/models/IBridge.ts +43 -0
  292. package/src/bridges/wormhole/contracts/WormholeBridgeContract.ts +14 -0
  293. package/src/chains/PlatformFactory.ts +45 -0
  294. package/src/chains/arbitrum/ArbTokenProvider.ts +39 -0
  295. package/src/chains/arbitrum/ArbWeb3Client.ts +39 -0
  296. package/src/chains/arbitrum/Arbiscan.ts +24 -0
  297. package/src/chains/boba/BobaWeb3Client.ts +49 -0
  298. package/src/chains/boba/Bobascan.ts +25 -0
  299. package/src/chains/xdai/XDaiWeb3Client.ts +82 -0
  300. package/src/chains/xdai/XDaiscan.ts +24 -0
  301. package/src/chains/xdai/tokens/WXDaiTokenContract.json +279 -0
  302. package/src/chains/xdai/tokens/WXDaiTokenContract.ts +14 -0
  303. package/src/clients/BscWeb3Client.ts +38 -0
  304. package/src/clients/ClientEventsStream.ts +33 -0
  305. package/src/clients/ClientPool.ts +673 -0
  306. package/src/clients/ClientPoolStats.ts +64 -0
  307. package/src/clients/EthWeb3Client.ts +36 -0
  308. package/src/clients/HardhatWeb3Client.ts +60 -0
  309. package/src/clients/PolyWeb3Client.ts +91 -0
  310. package/src/clients/Web3Client.ts +228 -0
  311. package/src/clients/Web3ClientFactory.ts +28 -0
  312. package/src/clients/interfaces/IWeb3Client.ts +14 -0
  313. package/src/clients/interfaces/IWeb3ClientStatus.ts +23 -0
  314. package/src/clients/interfaces/IWeb3EndpointOptions.ts +9 -0
  315. package/src/clients/model/ClientStatus.ts +5 -0
  316. package/src/clients/model/PromiEventWrap.ts +61 -0
  317. package/src/clients/model/SubscriptionWrap.ts +53 -0
  318. package/src/clients/utils/ClientEndpoints.ts +26 -0
  319. package/src/clients/utils/ClientErrorUtil.ts +26 -0
  320. package/src/clients/utils/TxFactory.ts +17 -0
  321. package/src/contracts/BscContract.ts +28 -0
  322. package/src/contracts/Contract.ts +126 -0
  323. package/src/contracts/ContractBase.ts +158 -0
  324. package/src/contracts/ContractFactory.ts +19 -0
  325. package/src/contracts/ContractProvider.ts +55 -0
  326. package/src/contracts/ContractReader.ts +87 -0
  327. package/src/contracts/ContractStream.ts +18 -0
  328. package/src/contracts/ContractWriter.ts +97 -0
  329. package/src/contracts/EthContract.ts +29 -0
  330. package/src/contracts/TxContract.ts +43 -0
  331. package/src/contracts/common/ERC20.ts +13 -0
  332. package/src/contracts/common/ERC20Polygon.ts +13 -0
  333. package/src/contracts/common/PoolPair.ts +22 -0
  334. package/src/contracts/utils/AbiDeserializer.ts +98 -0
  335. package/src/contracts/utils/ConvertUtils.ts +16 -0
  336. package/src/contracts/utils/InputDataUtils.ts +93 -0
  337. package/src/contracts/utils/TypeUtils.ts +21 -0
  338. package/src/defi/OneInch/OneInchRouter.ts +13 -0
  339. package/src/env/BigIntSerializer.ts +18 -0
  340. package/src/gen/Ast.ts +12 -0
  341. package/src/gen/ContractTemplate.ts +36 -0
  342. package/src/gen/Generator.ts +227 -0
  343. package/src/gen/GeneratorFromAbi.ts +402 -0
  344. package/src/handlers/TokenHandler.ts +78 -0
  345. package/src/indexer/BlocksTxIndexer.ts +69 -0
  346. package/src/indexer/PendingTxIndexer.ts +124 -0
  347. package/src/indexer/handlers/BlocksWalker.ts +390 -0
  348. package/src/indexer/handlers/TxQueueLoader.ts +143 -0
  349. package/src/json/JsonArrayStore.ts +310 -0
  350. package/src/json/JsonObjectStore.ts +239 -0
  351. package/src/json/JsonStore.spec.ts +98 -0
  352. package/src/loggers/ILogger.ts +3 -0
  353. package/src/loggers/LoggerService.ts +39 -0
  354. package/src/loggers/TxLoggerService.ts +146 -0
  355. package/src/models/IContractDetails.ts +8 -0
  356. package/src/models/IToken.ts +11 -0
  357. package/src/models/ITokenGlob.ts +14 -0
  358. package/src/models/ITransactionDetails.ts +11 -0
  359. package/src/models/TAddress.ts +1 -0
  360. package/src/models/TBufferLike.ts +2 -0
  361. package/src/models/THex.ts +1 -0
  362. package/src/models/TPlatform.ts +1 -0
  363. package/src/models/TResult.ts +6 -0
  364. package/src/ns/NameService.ts +21 -0
  365. package/src/ns/providers/EnsProvider.ts +45 -0
  366. package/src/ns/providers/INsProvider.ts +6 -0
  367. package/src/ns/providers/UDProvider.ts +49 -0
  368. package/src/ns/utils/$ns.ts +15 -0
  369. package/src/structs/PackedRanges.spec.ts +38 -0
  370. package/src/structs/PackedRanges.ts +207 -0
  371. package/src/tokens/TokenExchangeService.ts +126 -0
  372. package/src/tokens/TokenExchanges/AmmBase/AmmUtilts.ts +16 -0
  373. package/src/tokens/TokenExchanges/AmmBase/V2/AmmFactoryV2Contract.ts +15 -0
  374. package/src/tokens/TokenExchanges/AmmBase/V2/AmmMasterChefV2Contract.ts +15 -0
  375. package/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Contract.ts +17 -0
  376. package/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Service.ts +208 -0
  377. package/src/tokens/TokenExchanges/AmmBase/V2/AmmRouterV2Contract.ts +15 -0
  378. package/src/tokens/TokenExchanges/AmmBase/V2/AmmVaultV2Contract.ts +15 -0
  379. package/src/tokens/TokenExchanges/AmmBase/V3/AmmPairV3Contract.ts +24 -0
  380. package/src/tokens/TokenExchanges/AmmV2ExchangeBase.ts +242 -0
  381. package/src/tokens/TokenExchanges/OneInchExchange.ts +111 -0
  382. package/src/tokens/TokenExchanges/PancakeswapExchange.ts +30 -0
  383. package/src/tokens/TokenExchanges/SushiswapPolygonExchange.ts +30 -0
  384. package/src/tokens/TokenExchanges/UniswapExchange.ts +31 -0
  385. package/src/tokens/TokenOracles/AmmPriceV2Oracle.ts +440 -0
  386. package/src/tokens/TokenOracles/TokenPriceStore.ts +129 -0
  387. package/src/tokens/TokenPriceService.ts +276 -0
  388. package/src/tokens/TokenPriceServiceProvider.ts +36 -0
  389. package/src/tokens/TokenProviders/ATokenProvider.ts +42 -0
  390. package/src/tokens/TokenProviders/ITokenProvider.ts +9 -0
  391. package/src/tokens/TokenProviders/TPChain.ts +41 -0
  392. package/src/tokens/TokenProviders/TPCoinmarketcap.ts +82 -0
  393. package/src/tokens/TokenProviders/TPOneInch.ts +71 -0
  394. package/src/tokens/TokenProviders/TPSushiswap.ts +96 -0
  395. package/src/tokens/TokenProviders/TPUniswap.ts +85 -0
  396. package/src/tokens/TokenService.ts +128 -0
  397. package/src/tokens/TokenSwapService.ts +47 -0
  398. package/src/tokens/TokenTransferService.ts +216 -0
  399. package/src/tokens/TokensService.ts +252 -0
  400. package/src/tokens/TokensServiceBsc.ts +17 -0
  401. package/src/tokens/TokensServiceEth.ts +9 -0
  402. package/src/tokens/TokensServiceFactory.ts +24 -0
  403. package/src/tokens/TokensServicePolygon.ts +17 -0
  404. package/src/tokens/TokensServiceXDai.ts +26 -0
  405. package/src/tokens/defi/ISwapService.ts +12 -0
  406. package/src/tokens/defi/paraswap/Paraswap.ts +244 -0
  407. package/src/tokens/erc20/eth/WETH.ts +13 -0
  408. package/src/tokens/utils/TokenUtils.ts +63 -0
  409. package/src/txs/ITxConfig.ts +27 -0
  410. package/src/txs/TxDataBuilder.ts +207 -0
  411. package/src/txs/TxLogger.ts +121 -0
  412. package/src/txs/TxProvider.ts +68 -0
  413. package/src/txs/TxService.ts +19 -0
  414. package/src/txs/TxWriter.ts +370 -0
  415. package/src/txs/conditional/GasWatcherLogger.ts +57 -0
  416. package/src/txs/conditional/GasWatcherService.ts +117 -0
  417. package/src/txs/conditional/GasWatcherStore.ts +40 -0
  418. package/src/txs/conditional/GasWatcherTx.ts +143 -0
  419. package/src/txs/receipt/ITxLogItem.ts +25 -0
  420. package/src/txs/receipt/TxLogParser.ts +29 -0
  421. package/src/txs/receipt/TxLogsTransfer.ts +61 -0
  422. package/src/txs/receipt/TxTopicInMemoryProvider.ts +45 -0
  423. package/src/txs/receipt/TxTopicProvider.ts +29 -0
  424. package/src/utils/$abiParser.ts +179 -0
  425. package/src/utils/$abiType.ts +85 -0
  426. package/src/utils/$abiUtils.ts +38 -0
  427. package/src/utils/$address.ts +37 -0
  428. package/src/utils/$array.ts +57 -0
  429. package/src/utils/$bigint.ts +127 -0
  430. package/src/utils/$block.ts +7 -0
  431. package/src/utils/$class.ts +8 -0
  432. package/src/utils/$config.ts +17 -0
  433. package/src/utils/$contract.ts +67 -0
  434. package/src/utils/$csv.ts +54 -0
  435. package/src/utils/$date.ts +473 -0
  436. package/src/utils/$fn.ts +134 -0
  437. package/src/utils/$is.ts +37 -0
  438. package/src/utils/$logger.ts +10 -0
  439. package/src/utils/$number.ts +89 -0
  440. package/src/utils/$object.ts +95 -0
  441. package/src/utils/$path.ts +32 -0
  442. package/src/utils/$promise.ts +7 -0
  443. package/src/utils/$require.ts +118 -0
  444. package/src/utils/$sign.ts +36 -0
  445. package/src/utils/$signSerializer.ts +339 -0
  446. package/src/utils/$wallet.ts +10 -0
  447. package/src/utils/types.ts +29 -0
  448. package/src/wallets/Wallet.ts +33 -0
  449. package/src/wallets/WalletBsc.ts +13 -0
  450. package/src/wallets/WalletService.ts +43 -0
  451. package/src/www/utils/BlockChainExplorerFormatter.ts +13 -0
  452. package/test/ChainAccount.spec.ts +9 -0
  453. package/test/client.spec.ts +59 -0
  454. package/test/fixtures/DaiTokenContract.ts +13 -0
  455. package/test/fixtures/receipts/swap.json +94 -0
  456. package/test/generate/class.spec.ts +27 -0
  457. package/test/hardhat/TestNode.ts +61 -0
  458. package/test/ns.spec.ts +30 -0
  459. package/test/receipt.spec.ts +27 -0
  460. package/test/utils/abi-parser.spec.ts +117 -0
  461. package/test/utils/bigint.spec.ts +40 -0
  462. package/test/utils/date.spec.ts +8 -0
  463. package/test/utils/fn.spec.ts +39 -0
  464. package/test/utils/number.spec.ts +41 -0
  465. package/test/utils/sign.spec.ts +22 -0
  466. package/tsconfig-build.json +24 -0
  467. package/tsconfig-src.json +36 -0
  468. package/tsconfig.json +27 -0
  469. package/typings/globals/assertion/index.d.ts +159 -0
  470. package/typings/globals/assertion/typings.json +10 -0
  471. package/typings/globals/atma-utest/index.d.ts +53 -0
  472. package/typings/globals/atma-utest/typings.json +10 -0
  473. package/typings/globals/axios/index.d.ts +6 -0
  474. package/typings/globals/mask/index.d.ts +6 -0
  475. package/typings/globals/mask/typings.json +9 -0
  476. package/typings/index.d.ts +6 -0
  477. package/typings.json +6 -0
@@ -0,0 +1,26 @@
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
+ exports.Wallet = void 0;
7
+ const a_di_1 = __importDefault(require("a-di"));
8
+ const ERC20_1 = require("@dequanto/contracts/common/ERC20");
9
+ const TokensService_1 = require("@dequanto/tokens/TokensService");
10
+ class Wallet {
11
+ constructor(account, client, explorer) {
12
+ this.account = account;
13
+ this.client = client;
14
+ this.explorer = explorer;
15
+ this.tokensService = a_di_1.default.resolve(TokensService_1.TokensService, this.account.platform, this.explorer);
16
+ }
17
+ async balanceOf(mix) {
18
+ let token = await this.tokensService.getToken(mix);
19
+ if (token == null) {
20
+ throw new Error(`Token ${mix} not found`);
21
+ }
22
+ let erc20 = new ERC20_1.ERC20(token.address, this.client, this.explorer);
23
+ return erc20.balanceOf(this.account.address);
24
+ }
25
+ }
26
+ exports.Wallet = Wallet;
@@ -0,0 +1,17 @@
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
+ exports.WalletBsc = void 0;
7
+ const a_di_1 = __importDefault(require("a-di"));
8
+ const BscWeb3Client_1 = require("@dequanto/clients/BscWeb3Client");
9
+ const Wallet_1 = require("./Wallet");
10
+ const Bscscan_1 = require("@dequanto/BlockchainExplorer/Bscscan");
11
+ /** @deprecated use generic Wallet.ts */
12
+ class WalletBsc extends Wallet_1.Wallet {
13
+ constructor(account) {
14
+ super(account, a_di_1.default.resolve(BscWeb3Client_1.BscWeb3Client), a_di_1.default.resolve(Bscscan_1.Bscscan));
15
+ }
16
+ }
17
+ exports.WalletBsc = WalletBsc;
@@ -0,0 +1,35 @@
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
+ exports.WalletService = void 0;
7
+ const a_di_1 = __importDefault(require("a-di"));
8
+ const alot_1 = __importDefault(require("alot"));
9
+ const TokensService_1 = require("@dequanto/tokens/TokensService");
10
+ class WalletService {
11
+ constructor(wallet) {
12
+ this.wallet = wallet;
13
+ }
14
+ async getTokens(fromBlock) {
15
+ let wallet = this.wallet;
16
+ let account = wallet.account;
17
+ let events = await wallet.explorer.getErc20Transfers(account.address, fromBlock);
18
+ let service = a_di_1.default.resolve(TokensService_1.TokensService, account.platform, wallet.explorer);
19
+ let tokens = await (0, alot_1.default)(events)
20
+ .map(x => x.contractAddress)
21
+ .distinct()
22
+ .mapAsync(async (address) => {
23
+ let token = await service.getKnownToken(address);
24
+ if (token?.address == null) {
25
+ return null;
26
+ }
27
+ return token;
28
+ })
29
+ .toArrayAsync({ threads: 10 });
30
+ return tokens.filter(Boolean);
31
+ }
32
+ }
33
+ exports.WalletService = WalletService;
34
+ class WalletTokensEntity {
35
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlockChainExplorerFormatter = void 0;
4
+ var BlockChainExplorerFormatter;
5
+ (function (BlockChainExplorerFormatter) {
6
+ function getAddressLink(address, platform) {
7
+ if (platform === 'bsc') {
8
+ return `https://bscscan.com/address/${address}`;
9
+ }
10
+ if (platform === 'eth') {
11
+ return `https://etherscan.io/address/${address}`;
12
+ }
13
+ }
14
+ BlockChainExplorerFormatter.getAddressLink = getAddressLink;
15
+ })(BlockChainExplorerFormatter = exports.BlockChainExplorerFormatter || (exports.BlockChainExplorerFormatter = {}));
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @type import('hardhat/config').HardhatUserConfig
3
+ */
4
+ module.exports = {
5
+ solidity: "0.7.3",
6
+ };
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "dequanto",
3
+ "version": "0.0.1",
4
+ "scripts": {
5
+ "hardhat": "hardhat node",
6
+ "build": "tsc -p tsconfig-src.json"
7
+ },
8
+ "devDependencies": {
9
+ "atma-loader-ts": "^1.1.18",
10
+ "hardhat": "^2.6.7",
11
+ "shellbee": "^0.5.16"
12
+ },
13
+ "dependencies": {
14
+ "@ethereumjs/common": "^2.5.0",
15
+ "@ethereumjs/tx": "^3.3.2",
16
+ "a-di": "^1.0.25",
17
+ "alot": "^0.2.96",
18
+ "atma": "^0.15.12",
19
+ "atma-io": "^1.2.59",
20
+ "atma-utils": "^0.2.51",
21
+ "axios": "^0.21.1",
22
+ "bcrypt": "^5.0.1",
23
+ "ethers": "^5.5.1",
24
+ "everlog": "^1.0.8",
25
+ "memd": "^0.3.10",
26
+ "papaparse": "^5.3.1",
27
+ "ts-nameof": "^5.0.0",
28
+ "web3": "^1.6.0",
29
+ "web3-core": "^1.6.0",
30
+ "web3-core-subscriptions": "^1.6.0"
31
+ },
32
+ "atma": {
33
+ "configs": "./configs/**.yml",
34
+ "plugins": [
35
+ "atma-loader-ts"
36
+ ],
37
+ "settings": {
38
+ "include": {
39
+ "amd": true,
40
+ "extentionDefault": {
41
+ "js": "ts"
42
+ },
43
+ "routes": "#import ./tsconfig-build.json compilerOptions.paths",
44
+ "map": {}
45
+ },
46
+ "atma-loader-ts": {
47
+ "sourceMap": true,
48
+ "typescript": "#import ./tsconfig-build.json"
49
+ }
50
+ }
51
+ }
52
+ }
package/readme.md ADDED
@@ -0,0 +1,76 @@
1
+ # dequanto
2
+
3
+
4
+ Here we share our library to work with Ethereum Virtual Machine RPC Nodes: Ethereum, Polygon, BSC, Arbitrum, etc. We use web3 and ethers to provide new Features and to simplify the API.
5
+
6
+ 1. RPC Client Pool
7
+ 2. Transaction Builder
8
+ 3. Generated TypeScript classes for contracts
9
+ 4. Etherscan&Co clients
10
+ 5. Tokens provider - get token data by symbol, address, platform.
11
+ 6. Tokens service - transfer and swap
12
+ 7. Transaction **Indexers** - listens to blocks and parse new transactions to simplify further processing
13
+ 8. Native **`BigInt`** types and various utility methods
14
+
15
+
16
+ ### Distribution `as-Source-Code`
17
+
18
+ Not as a library, but as the source code. Clone or fork it and use it as a **submodule**. Means:
19
+ a) you can `import` any `class`, `namespace` and `utility` methods.
20
+ b) you can easily extend and modify any `class`, `namespace` and `utility` method.
21
+ c) you get the documentation direct from the code. _We don't have much time yet to document all the parts_
22
+
23
+ And path prefix (alias) to your `tsconfig.json`
24
+ ```json
25
+ {
26
+ "compilerOptions": {
27
+ "paths": {
28
+ "@dequanto/*": [ "your-sub-module-folder/src/*" ]
29
+ }
30
+ }
31
+ }
32
+ ```
33
+
34
+ ### Configuration
35
+
36
+ Before you use the code, you should prepare the configuration for it: Node RPC URLs, Accounts, Blockchain Explorer API Keys, etc.
37
+
38
+ ## 1. RPC Client Pool
39
+
40
+ Provide multiple RPC Node URLs, this will make your application much more reliable. Even if one of the Nodes goes down or for some reason is not in-sync, all your RPC calls will still work.
41
+
42
+ [Web3Client](src/clients/Web3Client.ts) is the base class for all the EVM Platforms. This wraps web3 to provide pool-based communication with nodes. It handles also Gas and Nonce Values.
43
+
44
+
45
+ ## 2. Transaction Builder
46
+
47
+ [TxDataBuilder](src/txs/TxDataBuilder.ts) and [TxWriter](src/txs/TxWriter.ts) to create and submit transaction.
48
+
49
+
50
+ ## 3. Generated TypeScript classes for contracts
51
+
52
+ With auto-generated classes you can
53
+
54
+ a) type-safe method read and write(transaction) calls to blockchain
55
+ b) parse receipts of the contract transactions
56
+ c) easily subscribe to event streams of the contract
57
+
58
+ ## 4. Etherscan&Co clients
59
+
60
+ Ready to use Etherscan&Co classes to consume their API. Just drop-in the KEYs.
61
+
62
+ ## 5. Tokens provider
63
+
64
+ Get Tokens Data (`address`, `decimals`, etc) by `symbol` and `platform`
65
+
66
+ ## 6. Tokens service
67
+
68
+ One-liners to transfer tokens from A to B, or swap the tokens using popular DEXes
69
+
70
+ ## 7. Transaction **Indexers**
71
+
72
+ Start listening the blockchain with less code
73
+
74
+ ## 8. Utils
75
+
76
+ Lots of Utility methods. BigInt are the first-class citizens in the code.
@@ -0,0 +1,273 @@
1
+ import alot from 'alot';
2
+ import memd from 'memd';
3
+ import axios from 'axios'
4
+ import { IBlockChainExplorer, IBlockChainTransferEvent } from './IBlockChainExplorer';
5
+ import { Transaction } from 'web3-core';
6
+ import { AbiItem } from 'web3-utils';
7
+ import { IContractDetails } from '@dequanto/models/IContractDetails';
8
+ import { Web3Client } from '@dequanto/clients/Web3Client';
9
+ import { TAddress } from '@dequanto/models/TAddress';
10
+ import { $logger } from '@dequanto/utils/$logger';
11
+ import { $promise } from '@dequanto/utils/$promise';
12
+
13
+ export namespace BlockChainExplorerFactory {
14
+
15
+ export function create (opts: {
16
+ ABI_CACHE: string
17
+ CONTRACTS: IContractDetails[]
18
+ getWeb3: () => Web3Client
19
+ getConfig: () => { key: string, host: string }
20
+ }) {
21
+
22
+ const client = new Client();
23
+
24
+ return class implements IBlockChainExplorer {
25
+
26
+ localDb: IContractDetails[] = opts.CONTRACTS
27
+ config = opts.getConfig()
28
+
29
+ constructor () {
30
+ this.getContractAbi = memd.fn.memoize(this.getContractAbi, {
31
+ trackRef: true,
32
+ persistance: new memd.FsTransport({
33
+ path: opts.ABI_CACHE
34
+ })
35
+ });
36
+ this.getContractSource = memd.fn.memoize(this.getContractSource, {
37
+ trackRef: true,
38
+ persistance: new memd.FsTransport({
39
+ path: opts.ABI_CACHE.replace('.json', '-source.json')
40
+ })
41
+ });
42
+ }
43
+
44
+ async getContractMeta (name: string)
45
+ async getContractMeta (address: string)
46
+ async getContractMeta (q: string): Promise<IContractDetails> {
47
+ q = q.toLowerCase();
48
+
49
+ let info = this.localDb.find(x => x.address.toLowerCase() === q || x.name?.toLowerCase() === q);
50
+
51
+ return info;
52
+ }
53
+
54
+ async getContractAbi (address: TAddress, params?: { implementation: string }): Promise<{ abi: string, implementation: TAddress }> {
55
+ let info = await this.getContractMeta(address);
56
+ if (info?.proxy) {
57
+ address = info.proxy;
58
+ }
59
+
60
+ let url = `${this.config.host}/api?module=contract&action=getabi&address=${address}&apikey=${this.config.key}`;
61
+ let abi: string = await client.get(url);
62
+
63
+ let abiJson = JSON.parse(abi);
64
+ if (params?.implementation) {
65
+ if (/0x.{64}/.test(params.implementation)) {
66
+ let web3 = opts.getWeb3();
67
+
68
+ let stat = await web3.getNodeInfos();
69
+
70
+ //-let x = (BigInt($contract.keccak256("eip1967.proxy.implementation")) - 1n).toString(16);
71
+ let uin256Hex = await web3.getStorageAt(
72
+ '0x5a58505a96d1dbf8df91cb21b54419fc36e93fde',
73
+ `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
74
+ );
75
+ let hex = uin256Hex.replace(/0x0+/, '0x');
76
+ return this.getContractAbi(hex)
77
+ }
78
+ throw new Error(`Implement ${params.implementation} support`);
79
+ }
80
+ if (isOpenZeppelinProxy(abiJson)) {
81
+ let web3 = opts.getWeb3();
82
+ let uin256Hex = await web3.getStorageAt(
83
+ address,
84
+ `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
85
+ );
86
+ let hex = uin256Hex.replace(/0x0+/, '0x');
87
+ return this.getContractAbi(hex)
88
+ }
89
+
90
+ if (hasImplementationSlot(abiJson)) {
91
+ let web3 = opts.getWeb3();
92
+ let uin256Hex = await web3.readContract({
93
+ address: address,
94
+ abi: abiJson,
95
+ method: 'implementation',
96
+ arguments: []
97
+ });
98
+ let hex = uin256Hex.replace(/0x0+/, '0x');
99
+ return this.getContractAbi(hex);
100
+ }
101
+ if (hasTargetSlot(abiJson)) {
102
+ let web3 = opts.getWeb3();
103
+ let uin256Hex = await web3.readContract({
104
+ address: address,
105
+ abi: abiJson,
106
+ method: 'getTarget',
107
+ arguments: []
108
+ });
109
+ let hex = uin256Hex.replace(/0x0+/, '0x');
110
+ return this.getContractAbi(hex);
111
+ }
112
+ return { abi, implementation: address };
113
+ }
114
+
115
+ async getContractSource (address: string): Promise<{
116
+ SourceCode: string
117
+ ContractName: string
118
+ ABI: string
119
+ }> {
120
+ let url = `${this.config.host}/api?module=contract&action=getsourcecode&address=${address}&apikey=${this.config.key}`;
121
+ let result = await client.get(url);
122
+ return Array.isArray(result) ? result[0] : result;
123
+ }
124
+
125
+ async getTransactions (addr: TAddress, params?: { fromBlockNumber?: number, page?: number, size?: number, sort?: 'asc' | 'desc' }): Promise<Transaction[]> {
126
+ return this.loadTxs('txlist', addr, params);
127
+ }
128
+ async getTransactionsAll (addr: TAddress): Promise<Transaction[]> {
129
+ return this.loadTxsAll('txlist', addr);
130
+ }
131
+
132
+
133
+ async getInternalTransactions (addr: TAddress, params?: { fromBlockNumber?: number, page?: number, size?: number, sort?: 'asc' | 'desc' }): Promise<Transaction[]> {
134
+ return this.loadTxs('txlistinternal', addr, params);
135
+ }
136
+ async getInternalTransactionsAll (addr: TAddress): Promise<Transaction[]> {
137
+ return this.loadTxsAll('txlistinternal', addr);
138
+ }
139
+
140
+
141
+ async getErc20Transfers (addr: TAddress, fromBlockNumber?: number): Promise<IBlockChainTransferEvent[]> {
142
+ let events: IBlockChainTransferEvent[] = await this.loadTxs('tokentx', addr, { fromBlockNumber });
143
+ events.forEach(transfer => {
144
+ transfer.timeStamp = new Date((Number(transfer.timeStamp) * 1000))
145
+ transfer.value = BigInt(transfer.value);
146
+ transfer.blockNumber = Number(transfer.blockNumber);
147
+ transfer.tokenDecimal = Number(transfer.tokenDecimal);
148
+ });
149
+ return events;
150
+ }
151
+ async getErc20TransfersAll (addr: TAddress, fromBlockNumber?: number): Promise<IBlockChainTransferEvent[]> {
152
+ let events = await this.loadTxsAll('tokentx', addr) as any as IBlockChainTransferEvent[];
153
+ events.forEach(transfer => {
154
+ transfer.timeStamp = new Date((Number(transfer.timeStamp) * 1000))
155
+ transfer.value = BigInt(transfer.value);
156
+ transfer.blockNumber = Number(transfer.blockNumber);
157
+ transfer.tokenDecimal = Number(transfer.tokenDecimal);
158
+ });
159
+ return events;
160
+ }
161
+
162
+
163
+ async loadTxs(type: 'tokentx' | 'txlistinternal' | 'txlist', address: TAddress, params?: {
164
+ fromBlockNumber?: number,
165
+ page?: number,
166
+ size?: number,
167
+ sort?: 'asc' | 'desc'
168
+ }) {
169
+ let url = `${this.config.host}/api?module=account&action=${type}&address=${address}&sort=${params.sort ?? 'desc'}&apikey=${this.config.key}`;
170
+ if (params.fromBlockNumber != null) {
171
+ url += `&startblock=${params.fromBlockNumber}`
172
+ }
173
+ if (params.page != null) {
174
+ url += `&page=${params.page}`
175
+ }
176
+ if (params.size != null) {
177
+ url += `&offset=${params.size}`
178
+ }
179
+ let txs = await client.get(url);
180
+ return txs;
181
+ }
182
+
183
+ async loadTxsAll (type: 'tokentx' | 'txlistinternal' | 'txlist', address: TAddress): Promise<Transaction[]> {
184
+
185
+ let page = 1;
186
+ let size = 1000;
187
+ let out = [] as Transaction[];
188
+ let fromBlockNumber = null as number;
189
+ while(true) {
190
+ let arr = await this.loadTxs(type, address, { fromBlockNumber, sort: 'asc' });
191
+ out.push(...arr);
192
+ $logger.log(`Got transactions(${type}) for ${address}. Page: ${arr.length}; Received: ${out.length}. Latest Block: ${fromBlockNumber}`);
193
+
194
+ if (arr.length < size) {
195
+ break;
196
+ }
197
+ page++;
198
+ fromBlockNumber = Number(arr[arr.length - 1].blockNumber);
199
+ }
200
+ return alot(out).distinctBy(x => x.hash).toArray();
201
+ }
202
+ }
203
+ }
204
+ }
205
+
206
+ function isOpenZeppelinProxy(abi: AbiItem[]) {
207
+ let $interface = ['upgradeTo', 'implementation'];
208
+ return $interface.every(name => {
209
+ return abi.some(item => item.type === 'function' && item.name === name);
210
+ })
211
+ }
212
+ function hasImplementationSlot (abi: AbiItem[]) {
213
+ let $interface = ['proxyOwner', 'implementation'];
214
+ return $interface.every(name => {
215
+ return abi.some(item => item.type === 'function' && item.name === name);
216
+ })
217
+ }
218
+ function hasTargetSlot (abi: AbiItem[]) {
219
+ let $interface = ['upgrade', 'getTarget'];
220
+ return $interface.every(name => {
221
+ return abi.some(item => item.type === 'function' && item.name === name);
222
+ })
223
+ }
224
+
225
+
226
+
227
+ class Client {
228
+
229
+ @memd.deco.queued({ throttle: 1000 / 5 })
230
+ async get (url: string) {
231
+ return this.getInner(url)
232
+ }
233
+
234
+ async getPaged (url: string) {
235
+ let arr = [];
236
+ let page = 1;
237
+ let size = 200;
238
+ while (true) {
239
+ let path = `${url}&page=${page}&offset=${size}`;
240
+ let pageArr: any[] = await this.get(path);
241
+ arr = arr.concat(pageArr);
242
+ if (pageArr.length < size) {
243
+ break;
244
+ }
245
+ page++;
246
+ }
247
+ return arr;
248
+ }
249
+
250
+ private async getInner (url: string, opts?: { retryCount: number }) {
251
+ let resp = await axios.get(url);
252
+ let data = resp.data as { status: string, message: 'OK' | 'NOTOK', result: any };
253
+ if (data.message === 'NOTOK') {
254
+ let str = data.result;
255
+ if (/Max rate/i.test(str)) {
256
+ let count = opts?.retryCount ?? 3;
257
+ if (--count === 0) {
258
+ throw new Error(str);
259
+ }
260
+ await $promise.wait(200);
261
+ return this.getInner(url, {
262
+ retryCount: count
263
+ });
264
+ }
265
+ throw new Error(str);
266
+ }
267
+ if (data.result == null) {
268
+ console.warn(`Blockchain "${url}" explorer returned empty result`, data);
269
+ }
270
+ return data.result;
271
+ }
272
+ }
273
+
@@ -0,0 +1,26 @@
1
+ import di from 'a-di';
2
+ import { Arbiscan } from '@dequanto/chains/arbitrum/Arbiscan';
3
+ import { TPlatform } from '@dequanto/models/TPlatform';
4
+ import { Bscscan } from './Bscscan';
5
+ import { Etherscan } from './Etherscan';
6
+ import { Polyscan } from './Polyscan';
7
+ import { XDaiscan } from '@dequanto/chains/xdai/XDaiscan';
8
+
9
+ export namespace BlockChainExplorerProvider {
10
+ export function get (platform: TPlatform) {
11
+ switch (platform) {
12
+ case 'bsc':
13
+ return di.resolve(Bscscan);
14
+ case 'eth':
15
+ return di.resolve(Etherscan);
16
+ case 'polygon':
17
+ return di.resolve(Polyscan);
18
+ case 'arbitrum':
19
+ return di.resolve(Arbiscan);
20
+ case 'xdai':
21
+ return di.resolve(XDaiscan);
22
+ default:
23
+ throw new Error(`Unsupported platform ${platform} for block chain explorer`);
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,46 @@
1
+ import { Web3ClientFactory } from '@dequanto/clients/Web3ClientFactory';
2
+ import { JsonArrayStore } from '@dequanto/json/JsonArrayStore';
3
+ import { TAddress } from '@dequanto/models/TAddress';
4
+ import { TPlatform } from '@dequanto/models/TPlatform';
5
+ import memd from 'memd';
6
+
7
+
8
+ interface IBlockNumberCache {
9
+ address: TAddress
10
+ blockNumber: number
11
+ }
12
+
13
+ export class BlockNumberCache {
14
+ store: JsonArrayStore<IBlockNumberCache>;
15
+
16
+
17
+ constructor (public platform: TPlatform, public name: string) {
18
+
19
+ this.store = new JsonArrayStore<IBlockNumberCache>({
20
+ path: `/cache/${platform}/blockNumber-${name}.json`,
21
+ key: x => x.address
22
+ });
23
+ }
24
+
25
+ async getCached (address: TAddress) {
26
+ let entry = await this.store.getSingle(address);
27
+ return entry ?? {
28
+ address: address,
29
+ blockNumber: null,
30
+ };
31
+ }
32
+
33
+ async saveCached (cache: IBlockNumberCache) {
34
+ await this.store.upsert(cache);
35
+ }
36
+
37
+ async updateCache (cache: IBlockNumberCache) {
38
+ let client = Web3ClientFactory.get(this.platform);
39
+ let toleranz = 5;
40
+
41
+ let number = await client.getBlockNumberCached() - toleranz;
42
+
43
+ cache.blockNumber = Math.max(number, cache.blockNumber);
44
+ await this.store.upsert(cache);
45
+ }
46
+ }
@@ -0,0 +1,23 @@
1
+ import di from 'a-di';
2
+ import { BlockChainExplorerFactory } from './BlockChainExplorerFactory';
3
+
4
+ import { $config } from '@dequanto/utils/$config';
5
+ import { BscWeb3Client } from '@dequanto/clients/BscWeb3Client';
6
+
7
+ const contracts = $config.get('contracts.bsc', []);
8
+ export class Bscscan extends BlockChainExplorerFactory.create({
9
+ ABI_CACHE: `./cache/bsc/abis.json`,
10
+ CONTRACTS: contracts,
11
+ getWeb3 () {
12
+ return di.resolve(BscWeb3Client)
13
+ },
14
+ getConfig () {
15
+ const config = $config.get('blockchainExplorer.bsc');
16
+ return {
17
+ key: config?.key,
18
+ host: config?.host,
19
+ };
20
+ }
21
+ }) {
22
+
23
+ }
@@ -0,0 +1,25 @@
1
+ import { BlockChainExplorerFactory } from './BlockChainExplorerFactory';
2
+
3
+ import { $config } from '@dequanto/utils/$config';
4
+ import { EthWeb3Client } from '@dequanto/clients/EthWeb3Client';
5
+ import di from 'a-di';
6
+
7
+
8
+ const contracts = $config.get('contracts.eth', [])
9
+ export class Etherscan extends BlockChainExplorerFactory.create({
10
+ ABI_CACHE: `./cache/eth/abis.json`,
11
+ CONTRACTS: contracts,
12
+ getWeb3 () {
13
+ return di.resolve(EthWeb3Client)
14
+ },
15
+ getConfig () {
16
+ const config = $config.get('blockchainExplorer.eth');
17
+ return {
18
+ key: config?.key,
19
+ host: config?.host,
20
+ };
21
+ }
22
+ }) {
23
+
24
+ }
25
+
@@ -0,0 +1,5 @@
1
+ import { TAddress } from '@dequanto/models/TAddress';
2
+
3
+ export interface IAbiProvider {
4
+ getContractAbi (address: TAddress, opts: { implementation: string }): Promise<{ abi: string, implementation: TAddress }>
5
+ }
@@ -0,0 +1,37 @@
1
+ import { TAddress } from '@dequanto/models/TAddress';
2
+ import { IContractDetails } from '@dequanto/models/IContractDetails';
3
+ import { Transaction } from 'web3-core';
4
+ import { IAbiProvider } from './IAbiProvider';
5
+
6
+ export interface IBlockChainExplorer extends IAbiProvider {
7
+ localDb: IContractDetails[]
8
+ getContractMeta(q: string): Promise<IContractDetails>;
9
+ getContractAbi (address: TAddress, opts?: { implementation: string }): Promise<{ abi: string, implementation: TAddress }>
10
+ getContractSource (address: string): Promise<{
11
+ SourceCode: string
12
+ ContractName: string
13
+ ABI: string
14
+ }>
15
+
16
+ getTransactions (address: TAddress, params?: { fromBlockNumber?: number, page?: number, size?: number }): Promise<Transaction[]>
17
+ getTransactionsAll (address: TAddress): Promise<Transaction[]>
18
+
19
+ getInternalTransactions (address: TAddress, params?: { fromBlockNumber?: number, page?: number, size?: number }): Promise<Transaction[]>
20
+ getInternalTransactionsAll (address: TAddress): Promise<Transaction[]>
21
+
22
+ getErc20Transfers(address: TAddress, fromBlockNumber?: number): Promise<IBlockChainTransferEvent[]>
23
+ getErc20TransfersAll(address: TAddress, fromBlockNumber?: number): Promise<IBlockChainTransferEvent[]>
24
+ }
25
+
26
+ export interface IBlockChainTransferEvent {
27
+ blockNumber: number,
28
+ timeStamp: Date,
29
+ hash: string
30
+ from: string
31
+ contractAddress: string
32
+ to: string
33
+ value: bigint,
34
+ tokenName: string
35
+ tokenSymbol: string
36
+ tokenDecimal: number
37
+ }