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,437 @@
1
+ // contracts/Bridge.sol
2
+ // SPDX-License-Identifier: Apache 2
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
8
+
9
+ import "../libraries/external/BytesLib.sol";
10
+
11
+ import "./BridgeGetters.sol";
12
+ import "./BridgeSetters.sol";
13
+ import "./BridgeStructs.sol";
14
+ import "./BridgeGovernance.sol";
15
+
16
+ import "./token/Token.sol";
17
+ import "./token/TokenImplementation.sol";
18
+
19
+ contract Bridge is BridgeGovernance {
20
+ using BytesLib for bytes;
21
+
22
+ // Produce a AssetMeta message for a given token
23
+ function attestToken(address tokenAddress, uint32 nonce) public payable returns (uint64 sequence){
24
+ // decimals, symbol & token are not part of the core ERC20 token standard, so we need to support contracts that dont implement them
25
+ (,bytes memory queriedDecimals) = tokenAddress.staticcall(abi.encodeWithSignature("decimals()"));
26
+ (,bytes memory queriedSymbol) = tokenAddress.staticcall(abi.encodeWithSignature("symbol()"));
27
+ (,bytes memory queriedName) = tokenAddress.staticcall(abi.encodeWithSignature("name()"));
28
+
29
+ uint8 decimals = abi.decode(queriedDecimals, (uint8));
30
+
31
+ string memory symbolString = abi.decode(queriedSymbol, (string));
32
+ string memory nameString = abi.decode(queriedName, (string));
33
+
34
+ bytes32 symbol;
35
+ bytes32 name;
36
+ assembly {
37
+ // first 32 bytes hold string length
38
+ symbol := mload(add(symbolString, 32))
39
+ name := mload(add(nameString, 32))
40
+ }
41
+
42
+ BridgeStructs.AssetMeta memory meta = BridgeStructs.AssetMeta({
43
+ payloadID : 2,
44
+ // Address of the token. Left-zero-padded if shorter than 32 bytes
45
+ tokenAddress : bytes32(uint256(uint160(tokenAddress))),
46
+ // Chain ID of the token
47
+ tokenChain : chainId(),
48
+ // Number of decimals of the token (big-endian uint8)
49
+ decimals : decimals,
50
+ // Symbol of the token (UTF-8)
51
+ symbol : symbol,
52
+ // Name of the token (UTF-8)
53
+ name : name
54
+ });
55
+
56
+ bytes memory encoded = encodeAssetMeta(meta);
57
+
58
+ sequence = wormhole().publishMessage{
59
+ value : msg.value
60
+ }(nonce, encoded, 15);
61
+ }
62
+
63
+ function wrapAndTransferETH(uint16 recipientChain, bytes32 recipient, uint256 arbiterFee, uint32 nonce) public payable returns (uint64 sequence) {
64
+ uint wormholeFee = wormhole().messageFee();
65
+
66
+ require(wormholeFee < msg.value, "value is smaller than wormhole fee");
67
+
68
+ uint amount = msg.value - wormholeFee;
69
+
70
+ require(arbiterFee <= amount, "fee is bigger than amount minus wormhole fee");
71
+
72
+ uint normalizedAmount = normalizeAmount(amount, 18);
73
+ uint normalizedArbiterFee = normalizeAmount(arbiterFee, 18);
74
+
75
+ // refund dust
76
+ uint dust = amount - deNormalizeAmount(normalizedAmount, 18);
77
+ if (dust > 0) {
78
+ payable(msg.sender).transfer(dust);
79
+ }
80
+
81
+ // deposit into WETH
82
+ WETH().deposit{
83
+ value : amount - dust
84
+ }();
85
+
86
+ // track and check outstanding token amounts
87
+ bridgeOut(address(WETH()), normalizedAmount);
88
+
89
+ sequence = logTransfer(chainId(), bytes32(uint256(uint160(address(WETH())))), normalizedAmount, recipientChain, recipient, normalizedArbiterFee, wormholeFee, nonce);
90
+ }
91
+
92
+ // Initiate a Transfer
93
+ function transferTokens(address token, uint256 amount, uint16 recipientChain, bytes32 recipient, uint256 arbiterFee, uint32 nonce) public payable returns (uint64 sequence) {
94
+ // determine token parameters
95
+ uint16 tokenChain;
96
+ bytes32 tokenAddress;
97
+ if (isWrappedAsset(token)) {
98
+ tokenChain = TokenImplementation(token).chainId();
99
+ tokenAddress = TokenImplementation(token).nativeContract();
100
+ } else {
101
+ tokenChain = chainId();
102
+ tokenAddress = bytes32(uint256(uint160(token)));
103
+ }
104
+
105
+ // query tokens decimals
106
+ (,bytes memory queriedDecimals) = token.staticcall(abi.encodeWithSignature("decimals()"));
107
+ uint8 decimals = abi.decode(queriedDecimals, (uint8));
108
+
109
+ // don't deposit dust that can not be bridged due to the decimal shift
110
+ amount = deNormalizeAmount(normalizeAmount(amount, decimals), decimals);
111
+
112
+ if (tokenChain == chainId()) {
113
+ // query own token balance before transfer
114
+ (,bytes memory queriedBalanceBefore) = token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)));
115
+ uint256 balanceBefore = abi.decode(queriedBalanceBefore, (uint256));
116
+
117
+ // transfer tokens
118
+ SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);
119
+
120
+ // query own token balance after transfer
121
+ (,bytes memory queriedBalanceAfter) = token.staticcall(abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)));
122
+ uint256 balanceAfter = abi.decode(queriedBalanceAfter, (uint256));
123
+
124
+ // correct amount for potential transfer fees
125
+ amount = balanceAfter - balanceBefore;
126
+ } else {
127
+ SafeERC20.safeTransferFrom(IERC20(token), msg.sender, address(this), amount);
128
+
129
+ TokenImplementation(token).burn(address(this), amount);
130
+ }
131
+
132
+ // normalize amounts decimals
133
+ uint256 normalizedAmount = normalizeAmount(amount, decimals);
134
+ uint256 normalizedArbiterFee = normalizeAmount(arbiterFee, decimals);
135
+
136
+ // track and check outstanding token amounts
137
+ if (tokenChain == chainId()) {
138
+ bridgeOut(token, normalizedAmount);
139
+ }
140
+
141
+ sequence = logTransfer(tokenChain, tokenAddress, normalizedAmount, recipientChain, recipient, normalizedArbiterFee, msg.value, nonce);
142
+ }
143
+
144
+ function normalizeAmount(uint256 amount, uint8 decimals) internal pure returns(uint256){
145
+ if (decimals > 8) {
146
+ amount /= 10 ** (decimals - 8);
147
+ }
148
+ return amount;
149
+ }
150
+
151
+ function deNormalizeAmount(uint256 amount, uint8 decimals) internal pure returns(uint256){
152
+ if (decimals > 8) {
153
+ amount *= 10 ** (decimals - 8);
154
+ }
155
+ return amount;
156
+ }
157
+
158
+ function logTransfer(uint16 tokenChain, bytes32 tokenAddress, uint256 amount, uint16 recipientChain, bytes32 recipient, uint256 fee, uint256 callValue, uint32 nonce) internal returns (uint64 sequence) {
159
+ require(fee <= amount, "fee exceeds amount");
160
+
161
+ BridgeStructs.Transfer memory transfer = BridgeStructs.Transfer({
162
+ payloadID : 1,
163
+ amount : amount,
164
+ tokenAddress : tokenAddress,
165
+ tokenChain : tokenChain,
166
+ to : recipient,
167
+ toChain : recipientChain,
168
+ fee : fee
169
+ });
170
+
171
+ bytes memory encoded = encodeTransfer(transfer);
172
+
173
+ sequence = wormhole().publishMessage{
174
+ value : callValue
175
+ }(nonce, encoded, 15);
176
+ }
177
+
178
+ function updateWrapped(bytes memory encodedVm) external returns (address token) {
179
+ (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);
180
+
181
+ require(valid, reason);
182
+ require(verifyBridgeVM(vm), "invalid emitter");
183
+
184
+ BridgeStructs.AssetMeta memory meta = parseAssetMeta(vm.payload);
185
+ return _updateWrapped(meta, vm.sequence);
186
+ }
187
+
188
+ function _updateWrapped(BridgeStructs.AssetMeta memory meta, uint64 sequence) internal returns (address token) {
189
+ address wrapped = wrappedAsset(meta.tokenChain, meta.tokenAddress);
190
+ require(wrapped != address(0), "wrapped asset does not exists");
191
+
192
+ // Update metadata
193
+ TokenImplementation(wrapped).updateDetails(bytes32ToString(meta.name), bytes32ToString(meta.symbol), sequence);
194
+
195
+ return wrapped;
196
+ }
197
+
198
+ function createWrapped(bytes memory encodedVm) external returns (address token) {
199
+ (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);
200
+
201
+ require(valid, reason);
202
+ require(verifyBridgeVM(vm), "invalid emitter");
203
+
204
+ BridgeStructs.AssetMeta memory meta = parseAssetMeta(vm.payload);
205
+ return _createWrapped(meta, vm.sequence);
206
+ }
207
+
208
+ // Creates a wrapped asset using AssetMeta
209
+ function _createWrapped(BridgeStructs.AssetMeta memory meta, uint64 sequence) internal returns (address token) {
210
+ require(meta.tokenChain != chainId(), "can only wrap tokens from foreign chains");
211
+ require(wrappedAsset(meta.tokenChain, meta.tokenAddress) == address(0), "wrapped asset already exists");
212
+
213
+ // initialize the TokenImplementation
214
+ bytes memory initialisationArgs = abi.encodeWithSelector(
215
+ TokenImplementation.initialize.selector,
216
+ bytes32ToString(meta.name),
217
+ bytes32ToString(meta.symbol),
218
+ meta.decimals,
219
+ sequence,
220
+
221
+ address(this),
222
+
223
+ meta.tokenChain,
224
+ meta.tokenAddress
225
+ );
226
+
227
+ // initialize the BeaconProxy
228
+ bytes memory constructorArgs = abi.encode(address(this), initialisationArgs);
229
+
230
+ // deployment code
231
+ bytes memory bytecode = abi.encodePacked(type(BridgeToken).creationCode, constructorArgs);
232
+
233
+ bytes32 salt = keccak256(abi.encodePacked(meta.tokenChain, meta.tokenAddress));
234
+
235
+ assembly {
236
+ token := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
237
+
238
+ if iszero(extcodesize(token)) {
239
+ revert(0, 0)
240
+ }
241
+ }
242
+
243
+ setWrappedAsset(meta.tokenChain, meta.tokenAddress, token);
244
+ }
245
+
246
+ function completeTransfer(bytes memory encodedVm) public {
247
+ _completeTransfer(encodedVm, false);
248
+ }
249
+
250
+ function completeTransferAndUnwrapETH(bytes memory encodedVm) public {
251
+ _completeTransfer(encodedVm, true);
252
+ }
253
+
254
+ // Execute a Transfer message
255
+ function _completeTransfer(bytes memory encodedVm, bool unwrapWETH) internal {
256
+ (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVm);
257
+
258
+ require(valid, reason);
259
+ require(verifyBridgeVM(vm), "invalid emitter");
260
+
261
+ BridgeStructs.Transfer memory transfer = parseTransfer(vm.payload);
262
+
263
+ require(!isTransferCompleted(vm.hash), "transfer already completed");
264
+ setTransferCompleted(vm.hash);
265
+
266
+ require(transfer.toChain == chainId(), "invalid target chain");
267
+
268
+ IERC20 transferToken;
269
+ if (transfer.tokenChain == chainId()) {
270
+ transferToken = IERC20(address(uint160(uint256(transfer.tokenAddress))));
271
+
272
+ // track outstanding token amounts
273
+ bridgedIn(address(transferToken), transfer.amount);
274
+ } else {
275
+ address wrapped = wrappedAsset(transfer.tokenChain, transfer.tokenAddress);
276
+ require(wrapped != address(0), "no wrapper for this token created yet");
277
+
278
+ transferToken = IERC20(wrapped);
279
+ }
280
+
281
+ require(unwrapWETH == false || address(transferToken) == address(WETH()), "invalid token, can only unwrap WETH");
282
+
283
+ // query decimals
284
+ (,bytes memory queriedDecimals) = address(transferToken).staticcall(abi.encodeWithSignature("decimals()"));
285
+ uint8 decimals = abi.decode(queriedDecimals, (uint8));
286
+
287
+ // adjust decimals
288
+ uint256 nativeAmount = deNormalizeAmount(transfer.amount, decimals);
289
+ uint256 nativeFee = deNormalizeAmount(transfer.fee, decimals);
290
+
291
+ // transfer fee to arbiter
292
+ if (nativeFee > 0) {
293
+ require(nativeFee <= nativeAmount, "fee higher than transferred amount");
294
+
295
+ if (unwrapWETH) {
296
+ WETH().withdraw(nativeFee);
297
+
298
+ payable(msg.sender).transfer(nativeFee);
299
+ } else {
300
+ if (transfer.tokenChain != chainId()) {
301
+ // mint wrapped asset
302
+ TokenImplementation(address(transferToken)).mint(msg.sender, nativeFee);
303
+ } else {
304
+ SafeERC20.safeTransfer(transferToken, msg.sender, nativeFee);
305
+ }
306
+ }
307
+ }
308
+
309
+ // transfer bridged amount to recipient
310
+ uint transferAmount = nativeAmount - nativeFee;
311
+ address transferRecipient = address(uint160(uint256(transfer.to)));
312
+
313
+ if (unwrapWETH) {
314
+ WETH().withdraw(transferAmount);
315
+
316
+ payable(transferRecipient).transfer(transferAmount);
317
+ } else {
318
+ if (transfer.tokenChain != chainId()) {
319
+ // mint wrapped asset
320
+ TokenImplementation(address(transferToken)).mint(transferRecipient, transferAmount);
321
+ } else {
322
+ SafeERC20.safeTransfer(transferToken, transferRecipient, transferAmount);
323
+ }
324
+ }
325
+ }
326
+
327
+ function bridgeOut(address token, uint normalizedAmount) internal {
328
+ uint outstanding = outstandingBridged(token);
329
+ require(outstanding + normalizedAmount <= type(uint64).max, "transfer exceeds max outstanding bridged token amount");
330
+ setOutstandingBridged(token, outstanding + normalizedAmount);
331
+ }
332
+
333
+ function bridgedIn(address token, uint normalizedAmount) internal {
334
+ setOutstandingBridged(token, outstandingBridged(token) - normalizedAmount);
335
+ }
336
+
337
+ function verifyBridgeVM(IWormhole.VM memory vm) internal view returns (bool){
338
+ if (bridgeContracts(vm.emitterChainId) == vm.emitterAddress) {
339
+ return true;
340
+ }
341
+
342
+ return false;
343
+ }
344
+
345
+ function encodeAssetMeta(BridgeStructs.AssetMeta memory meta) public pure returns (bytes memory encoded) {
346
+ encoded = abi.encodePacked(
347
+ meta.payloadID,
348
+ meta.tokenAddress,
349
+ meta.tokenChain,
350
+ meta.decimals,
351
+ meta.symbol,
352
+ meta.name
353
+ );
354
+ }
355
+
356
+ function encodeTransfer(BridgeStructs.Transfer memory transfer) public pure returns (bytes memory encoded) {
357
+ encoded = abi.encodePacked(
358
+ transfer.payloadID,
359
+ transfer.amount,
360
+ transfer.tokenAddress,
361
+ transfer.tokenChain,
362
+ transfer.to,
363
+ transfer.toChain,
364
+ transfer.fee
365
+ );
366
+ }
367
+
368
+ function parseAssetMeta(bytes memory encoded) public pure returns (BridgeStructs.AssetMeta memory meta) {
369
+ uint index = 0;
370
+
371
+ meta.payloadID = encoded.toUint8(index);
372
+ index += 1;
373
+
374
+ require(meta.payloadID == 2, "invalid AssetMeta");
375
+
376
+ meta.tokenAddress = encoded.toBytes32(index);
377
+ index += 32;
378
+
379
+ meta.tokenChain = encoded.toUint16(index);
380
+ index += 2;
381
+
382
+ meta.decimals = encoded.toUint8(index);
383
+ index += 1;
384
+
385
+ meta.symbol = encoded.toBytes32(index);
386
+ index += 32;
387
+
388
+ meta.name = encoded.toBytes32(index);
389
+ index += 32;
390
+
391
+ require(encoded.length == index, "invalid AssetMeta");
392
+ }
393
+
394
+ function parseTransfer(bytes memory encoded) public pure returns (BridgeStructs.Transfer memory transfer) {
395
+ uint index = 0;
396
+
397
+ transfer.payloadID = encoded.toUint8(index);
398
+ index += 1;
399
+
400
+ require(transfer.payloadID == 1, "invalid Transfer");
401
+
402
+ transfer.amount = encoded.toUint256(index);
403
+ index += 32;
404
+
405
+ transfer.tokenAddress = encoded.toBytes32(index);
406
+ index += 32;
407
+
408
+ transfer.tokenChain = encoded.toUint16(index);
409
+ index += 2;
410
+
411
+ transfer.to = encoded.toBytes32(index);
412
+ index += 32;
413
+
414
+ transfer.toChain = encoded.toUint16(index);
415
+ index += 2;
416
+
417
+ transfer.fee = encoded.toUint256(index);
418
+ index += 32;
419
+
420
+ require(encoded.length == index, "invalid Transfer");
421
+ }
422
+
423
+ function bytes32ToString(bytes32 input) internal pure returns (string memory) {
424
+ uint256 i;
425
+ while (i < 32 && input[i] != 0) {
426
+ i++;
427
+ }
428
+ bytes memory array = new bytes(i);
429
+ for (uint c = 0; c < i; c++) {
430
+ array[c] = input[c];
431
+ }
432
+ return string(array);
433
+ }
434
+
435
+ // we need to accept ETH sends to unwrap WETH
436
+ receive() external payable {}
437
+ }
@@ -0,0 +1,70 @@
1
+ // contracts/Getters.sol
2
+ // SPDX-License-Identifier: Apache 2
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+
8
+ import "../interfaces/IWormhole.sol";
9
+
10
+ import "./BridgeState.sol";
11
+
12
+ contract BridgeGetters is BridgeState {
13
+ function governanceActionIsConsumed(bytes32 hash) public view returns (bool) {
14
+ return _state.consumedGovernanceActions[hash];
15
+ }
16
+
17
+ function isInitialized(address impl) public view returns (bool) {
18
+ return _state.initializedImplementations[impl];
19
+ }
20
+
21
+ function isTransferCompleted(bytes32 hash) public view returns (bool) {
22
+ return _state.completedTransfers[hash];
23
+ }
24
+
25
+ function wormhole() public view returns (IWormhole) {
26
+ return IWormhole(_state.wormhole);
27
+ }
28
+
29
+ function chainId() public view returns (uint16){
30
+ return _state.provider.chainId;
31
+ }
32
+
33
+ function governanceChainId() public view returns (uint16){
34
+ return _state.provider.governanceChainId;
35
+ }
36
+
37
+ function governanceContract() public view returns (bytes32){
38
+ return _state.provider.governanceContract;
39
+ }
40
+
41
+ function wrappedAsset(uint16 tokenChainId, bytes32 tokenAddress) public view returns (address){
42
+ return _state.wrappedAssets[tokenChainId][tokenAddress];
43
+ }
44
+
45
+ function bridgeContracts(uint16 chainId_) public view returns (bytes32){
46
+ return _state.bridgeImplementations[chainId_];
47
+ }
48
+
49
+ function tokenImplementation() public view returns (address){
50
+ return _state.tokenImplementation;
51
+ }
52
+
53
+ function WETH() public view returns (IWETH){
54
+ return IWETH(_state.provider.WETH);
55
+ }
56
+
57
+ function outstandingBridged(address token) public view returns (uint256){
58
+ return _state.outstandingBridged[token];
59
+ }
60
+
61
+ function isWrappedAsset(address token) public view returns (bool){
62
+ return _state.isWrappedAsset[token];
63
+ }
64
+ }
65
+
66
+ interface IWETH is IERC20 {
67
+ function deposit() external payable;
68
+
69
+ function withdraw(uint amount) external;
70
+ }
@@ -0,0 +1,142 @@
1
+ // contracts/Bridge.sol
2
+ // SPDX-License-Identifier: Apache 2
3
+
4
+ pragma solidity ^0.8.0;
5
+
6
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+ import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
8
+ import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol";
9
+
10
+ import "../libraries/external/BytesLib.sol";
11
+
12
+ import "./BridgeGetters.sol";
13
+ import "./BridgeSetters.sol";
14
+ import "./BridgeStructs.sol";
15
+
16
+ import "./token/Token.sol";
17
+ import "./token/TokenImplementation.sol";
18
+
19
+ import "../interfaces/IWormhole.sol";
20
+
21
+ contract BridgeGovernance is BridgeGetters, BridgeSetters, ERC1967Upgrade {
22
+ using BytesLib for bytes;
23
+
24
+ // "TokenBridge" (left padded)
25
+ bytes32 constant module = 0x000000000000000000000000000000000000000000546f6b656e427269646765;
26
+
27
+ // Execute a RegisterChain governance message
28
+ function registerChain(bytes memory encodedVM) public {
29
+ (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);
30
+ require(valid, reason);
31
+
32
+ setGovernanceActionConsumed(vm.hash);
33
+
34
+ BridgeStructs.RegisterChain memory chain = parseRegisterChain(vm.payload);
35
+
36
+ require(chain.chainId == chainId() || chain.chainId == 0, "invalid chain id");
37
+ require(bridgeContracts(chain.emitterChainID) == bytes32(0), "chain already registered");
38
+
39
+ setBridgeImplementation(chain.emitterChainID, chain.emitterAddress);
40
+ }
41
+
42
+ // Execute a UpgradeContract governance message
43
+ function upgrade(bytes memory encodedVM) public {
44
+ (IWormhole.VM memory vm, bool valid, string memory reason) = verifyGovernanceVM(encodedVM);
45
+ require(valid, reason);
46
+
47
+ setGovernanceActionConsumed(vm.hash);
48
+
49
+ BridgeStructs.UpgradeContract memory implementation = parseUpgrade(vm.payload);
50
+
51
+ require(implementation.chainId == chainId(), "wrong chain id");
52
+
53
+ upgradeImplementation(address(uint160(uint256(implementation.newContract))));
54
+ }
55
+
56
+ function verifyGovernanceVM(bytes memory encodedVM) internal view returns (IWormhole.VM memory parsedVM, bool isValid, string memory invalidReason){
57
+ (IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVM);
58
+
59
+ if (!valid) {
60
+ return (vm, valid, reason);
61
+ }
62
+
63
+ if (vm.emitterChainId != governanceChainId()) {
64
+ return (vm, false, "wrong governance chain");
65
+ }
66
+ if (vm.emitterAddress != governanceContract()) {
67
+ return (vm, false, "wrong governance contract");
68
+ }
69
+
70
+ if (governanceActionIsConsumed(vm.hash)) {
71
+ return (vm, false, "governance action already consumed");
72
+ }
73
+
74
+ return (vm, true, "");
75
+ }
76
+
77
+ event ContractUpgraded(address indexed oldContract, address indexed newContract);
78
+
79
+ function upgradeImplementation(address newImplementation) internal {
80
+ address currentImplementation = _getImplementation();
81
+
82
+ _upgradeTo(newImplementation);
83
+
84
+ // Call initialize function of the new implementation
85
+ (bool success, bytes memory reason) = newImplementation.delegatecall(abi.encodeWithSignature("initialize()"));
86
+
87
+ require(success, string(reason));
88
+
89
+ emit ContractUpgraded(currentImplementation, newImplementation);
90
+ }
91
+
92
+ function parseRegisterChain(bytes memory encoded) public pure returns (BridgeStructs.RegisterChain memory chain) {
93
+ uint index = 0;
94
+
95
+ // governance header
96
+
97
+ chain.module = encoded.toBytes32(index);
98
+ index += 32;
99
+ require(chain.module == module, "invalid RegisterChain: wrong module");
100
+
101
+ chain.action = encoded.toUint8(index);
102
+ index += 1;
103
+ require(chain.action == 1, "invalid RegisterChain: wrong action");
104
+
105
+ chain.chainId = encoded.toUint16(index);
106
+ index += 2;
107
+
108
+ // payload
109
+
110
+ chain.emitterChainID = encoded.toUint16(index);
111
+ index += 2;
112
+
113
+ chain.emitterAddress = encoded.toBytes32(index);
114
+ index += 32;
115
+
116
+ require(encoded.length == index, "invalid RegisterChain: wrong length");
117
+ }
118
+
119
+ function parseUpgrade(bytes memory encoded) public pure returns (BridgeStructs.UpgradeContract memory chain) {
120
+ uint index = 0;
121
+
122
+ // governance header
123
+
124
+ chain.module = encoded.toBytes32(index);
125
+ index += 32;
126
+ require(chain.module == module, "invalid UpgradeContract: wrong module");
127
+
128
+ chain.action = encoded.toUint8(index);
129
+ index += 1;
130
+ require(chain.action == 2, "invalid UpgradeContract: wrong action");
131
+
132
+ chain.chainId = encoded.toUint16(index);
133
+ index += 2;
134
+
135
+ // payload
136
+
137
+ chain.newContract = encoded.toBytes32(index);
138
+ index += 32;
139
+
140
+ require(encoded.length == index, "invalid UpgradeContract: wrong length");
141
+ }
142
+ }
@@ -0,0 +1,34 @@
1
+ // contracts/Implementation.sol
2
+ // SPDX-License-Identifier: Apache 2
3
+
4
+ pragma solidity ^0.8.0;
5
+ pragma experimental ABIEncoderV2;
6
+
7
+ import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol";
8
+
9
+ import "./Bridge.sol";
10
+
11
+
12
+ contract BridgeImplementation is Bridge {
13
+ // Beacon getter for the token contracts
14
+ function implementation() public view returns (address) {
15
+ return tokenImplementation();
16
+ }
17
+
18
+ function initialize() initializer public virtual {
19
+ // this function needs to be exposed for an upgrade to pass
20
+ }
21
+
22
+ modifier initializer() {
23
+ address impl = ERC1967Upgrade._getImplementation();
24
+
25
+ require(
26
+ !isInitialized(impl),
27
+ "already initialized"
28
+ );
29
+
30
+ setInitialized(impl);
31
+
32
+ _;
33
+ }
34
+ }