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.
- package/.vscode/settings.json +11 -0
- package/actions/gen.act.ts +38 -0
- package/actions/tokens.act.ts +12 -0
- package/configs/dequanto.yml +51 -0
- package/contracts/abi/erc20.abi.json +222 -0
- package/contracts/gen/amm/AmmFactoryV2ContractBase.ts +66 -0
- package/contracts/gen/amm/AmmMasterChefV2ContractBase.ts +158 -0
- package/contracts/gen/amm/AmmPairContractV2Base.ts +158 -0
- package/contracts/gen/amm/AmmPairContractV3Base.ts +125 -0
- package/contracts/gen/amm/AmmRouterV2ContractBase.ts +124 -0
- package/contracts/gen/amm/AmmVaultV2ContractBase.ts +214 -0
- package/contracts/gen/base/ERC20Base.ts +90 -0
- package/contracts/gen/bsc/OneInchRouterV3Base.ts +57 -0
- package/contracts/gen/eth/WETHBase/WETHBase.sol +756 -0
- package/contracts/gen/eth/WETHBase.ts +136 -0
- package/contracts/gen/polygon/ERC20PolygonBase.ts +305 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Address.sol +216 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BeaconProxy.sol +61 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Bridge.sol +437 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeGetters.sol +70 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeGovernance.sol +142 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeImplementation.sol +34 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeSetters.sol +57 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeState.sol +52 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BridgeStructs.sol +66 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/BytesLib.sol +510 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Context.sol +23 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/ERC1967Proxy.sol +32 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/ERC1967Upgrade.sol +193 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/IBeacon.sol +15 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/IERC20.sol +81 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/IWormhole.sol +42 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Ownable.sol +71 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Proxy.sol +85 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/SafeERC20.sol +98 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/StorageSlot.sol +83 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Structs.sol +40 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/Token.sol +12 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/TokenBridge.sol +15 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/TokenImplementation.sol +177 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase/TokenState.sol +31 -0
- package/contracts/gen/polygon/WormholeBridgeContractBase.ts +231 -0
- package/contracts/gen/xdai/WXDaiTokenContractBase.ts +136 -0
- package/data/cex/eth.csv +356 -0
- package/data/tokens/1inch.json +16557 -0
- package/data/tokens/arbitrum.json +1 -0
- package/data/tokens/sushi.json +56388 -0
- package/dist/contracts/gen/amm/AmmFactoryV2ContractBase.js +53 -0
- package/dist/contracts/gen/amm/AmmMasterChefV2ContractBase.js +122 -0
- package/dist/contracts/gen/amm/AmmPairContractV2Base.js +122 -0
- package/dist/contracts/gen/amm/AmmPairContractV3Base.js +98 -0
- package/dist/contracts/gen/amm/AmmRouterV2ContractBase.js +95 -0
- package/dist/contracts/gen/amm/AmmVaultV2ContractBase.js +164 -0
- package/dist/contracts/gen/base/ERC20Base.js +64 -0
- package/dist/contracts/gen/bsc/OneInchRouterV3Base.js +47 -0
- package/dist/contracts/gen/eth/WETHBase.js +96 -0
- package/dist/contracts/gen/polygon/ERC20PolygonBase.js +233 -0
- package/dist/contracts/gen/polygon/WormholeBridgeContractBase.js +172 -0
- package/dist/contracts/gen/xdai/WXDaiTokenContractBase.js +96 -0
- package/dist/src/BlockchainExplorer/BlockChainExplorerFactory.js +227 -0
- package/dist/src/BlockchainExplorer/BlockChainExplorerProvider.js +32 -0
- package/dist/src/BlockchainExplorer/BlockNumberCache.js +33 -0
- package/dist/src/BlockchainExplorer/Bscscan.js +27 -0
- package/dist/src/BlockchainExplorer/Etherscan.js +27 -0
- package/dist/src/BlockchainExplorer/IAbiProvider.js +2 -0
- package/dist/src/BlockchainExplorer/IBlockChainExplorer.js +2 -0
- package/dist/src/BlockchainExplorer/Polyscan.js +27 -0
- package/dist/src/ChainAccounts.js +69 -0
- package/dist/src/ChainAccountsService.js +75 -0
- package/dist/src/Config.js +7 -0
- package/dist/src/blocks/BlockDateResolver.js +125 -0
- package/dist/src/bridges/BridgeFactory.js +19 -0
- package/dist/src/bridges/hop/HopAddresses.js +520 -0
- package/dist/src/bridges/hop/HopBridge.js +327 -0
- package/dist/src/bridges/hop/contracts/gen.act.js +43 -0
- package/dist/src/bridges/hop/contracts/polygon/Dai_l2AmmWrapperContract.js +52 -0
- package/dist/src/bridges/hop/contracts/polygon/Dai_l2BridgeContract.js +319 -0
- package/dist/src/bridges/hop/contracts/polygon/Dai_l2SaddleSwapContract.js +178 -0
- package/dist/src/bridges/hop/contracts/polygon/Eth_l2AmmWrapperContract.js +52 -0
- package/dist/src/bridges/hop/contracts/polygon/Eth_l2BridgeContract.js +319 -0
- package/dist/src/bridges/hop/contracts/polygon/Eth_l2SaddleSwapContract.js +178 -0
- package/dist/src/bridges/hop/contracts/polygon/Matic_l2AmmWrapperContract.js +52 -0
- package/dist/src/bridges/hop/contracts/polygon/Matic_l2BridgeContract.js +319 -0
- package/dist/src/bridges/hop/contracts/polygon/Matic_l2SaddleSwapContract.js +178 -0
- package/dist/src/bridges/hop/contracts/polygon/Usdc_l2AmmWrapperContract.js +52 -0
- package/dist/src/bridges/hop/contracts/polygon/Usdc_l2BridgeContract.js +319 -0
- package/dist/src/bridges/hop/contracts/polygon/Usdc_l2SaddleSwapContract.js +178 -0
- package/dist/src/bridges/hop/contracts/polygon/Usdt_l2AmmWrapperContract.js +52 -0
- package/dist/src/bridges/hop/contracts/polygon/Usdt_l2BridgeContract.js +319 -0
- package/dist/src/bridges/hop/contracts/polygon/Usdt_l2SaddleSwapContract.js +178 -0
- package/dist/src/bridges/hop/contracts/polygon/Wbtc_l2AmmWrapperContract.js +52 -0
- package/dist/src/bridges/hop/contracts/polygon/Wbtc_l2BridgeContract.js +319 -0
- package/dist/src/bridges/hop/contracts/polygon/Wbtc_l2SaddleSwapContract.js +178 -0
- package/dist/src/bridges/models/IBridge.js +2 -0
- package/dist/src/bridges/wormhole/contracts/WormholeBridgeContract.js +15 -0
- package/dist/src/chains/PlatformFactory.js +42 -0
- package/dist/src/chains/arbitrum/ArbTokenProvider.js +40 -0
- package/dist/src/chains/arbitrum/ArbWeb3Client.js +39 -0
- package/dist/src/chains/arbitrum/Arbiscan.js +27 -0
- package/dist/src/chains/boba/BobaWeb3Client.js +47 -0
- package/dist/src/chains/boba/Bobascan.js +28 -0
- package/dist/src/chains/xdai/XDaiWeb3Client.js +87 -0
- package/dist/src/chains/xdai/XDaiscan.js +27 -0
- package/dist/src/chains/xdai/tokens/WXDaiTokenContract.js +15 -0
- package/dist/src/clients/BscWeb3Client.js +38 -0
- package/dist/src/clients/ClientEventsStream.js +34 -0
- package/dist/src/clients/ClientPool.js +560 -0
- package/dist/src/clients/ClientPoolStats.js +52 -0
- package/dist/src/clients/EthWeb3Client.js +35 -0
- package/dist/src/clients/HardhatWeb3Client.js +56 -0
- package/dist/src/clients/PolyWeb3Client.js +77 -0
- package/dist/src/clients/Web3Client.js +186 -0
- package/dist/src/clients/Web3ClientFactory.js +32 -0
- package/dist/src/clients/interfaces/IWeb3Client.js +2 -0
- package/dist/src/clients/interfaces/IWeb3ClientStatus.js +2 -0
- package/dist/src/clients/interfaces/IWeb3EndpointOptions.js +2 -0
- package/dist/src/clients/model/ClientStatus.js +9 -0
- package/dist/src/clients/model/PromiEventWrap.js +52 -0
- package/dist/src/clients/model/SubscriptionWrap.js +42 -0
- package/dist/src/clients/utils/ClientEndpoints.js +27 -0
- package/dist/src/clients/utils/ClientErrorUtil.js +30 -0
- package/dist/src/clients/utils/TxFactory.js +14 -0
- package/dist/src/contracts/BscContract.js +30 -0
- package/dist/src/contracts/Contract.js +90 -0
- package/dist/src/contracts/ContractBase.js +139 -0
- package/dist/src/contracts/ContractFactory.js +17 -0
- package/dist/src/contracts/ContractProvider.js +40 -0
- package/dist/src/contracts/ContractReader.js +76 -0
- package/dist/src/contracts/ContractStream.js +20 -0
- package/dist/src/contracts/ContractWriter.js +62 -0
- package/dist/src/contracts/EthContract.js +31 -0
- package/dist/src/contracts/TxContract.js +37 -0
- package/dist/src/contracts/common/ERC20.js +14 -0
- package/dist/src/contracts/common/ERC20Polygon.js +14 -0
- package/dist/src/contracts/common/PoolPair.js +23 -0
- package/dist/src/contracts/utils/AbiDeserializer.js +89 -0
- package/dist/src/contracts/utils/ConvertUtils.js +21 -0
- package/dist/src/contracts/utils/InputDataUtils.js +87 -0
- package/dist/src/contracts/utils/TypeUtils.js +24 -0
- package/dist/src/defi/OneInch/OneInchRouter.js +14 -0
- package/dist/src/env/BigIntSerializer.js +19 -0
- package/dist/src/gen/Ast.js +12 -0
- package/dist/src/gen/ContractTemplate.js +27 -0
- package/dist/src/gen/Generator.js +180 -0
- package/dist/src/gen/GeneratorFromAbi.js +361 -0
- package/dist/src/handlers/TokenHandler.js +69 -0
- package/dist/src/indexer/BlocksTxIndexer.js +52 -0
- package/dist/src/indexer/PendingTxIndexer.js +96 -0
- package/dist/src/indexer/handlers/BlocksWalker.js +306 -0
- package/dist/src/indexer/handlers/TxQueueLoader.js +117 -0
- package/dist/src/json/JsonArrayStore.js +296 -0
- package/dist/src/json/JsonObjectStore.js +214 -0
- package/dist/src/json/JsonStore.spec.js +83 -0
- package/dist/src/loggers/ILogger.js +2 -0
- package/dist/src/loggers/LoggerService.js +34 -0
- package/dist/src/loggers/TxLoggerService.js +122 -0
- package/dist/src/models/IContractDetails.js +2 -0
- package/dist/src/models/IToken.js +2 -0
- package/dist/src/models/ITokenGlob.js +6 -0
- package/dist/src/models/ITransactionDetails.js +2 -0
- package/dist/src/models/TAddress.js +2 -0
- package/dist/src/models/TBufferLike.js +2 -0
- package/dist/src/models/THex.js +2 -0
- package/dist/src/models/TPlatform.js +2 -0
- package/dist/src/models/TResult.js +2 -0
- package/dist/src/ns/NameService.js +19 -0
- package/dist/src/ns/providers/EnsProvider.js +41 -0
- package/dist/src/ns/providers/INsProvider.js +2 -0
- package/dist/src/ns/providers/UDProvider.js +39 -0
- package/dist/src/ns/utils/$ns.js +17 -0
- package/dist/src/structs/PackedRanges.js +186 -0
- package/dist/src/structs/PackedRanges.spec.js +30 -0
- package/dist/src/tokens/TokenExchangeService.js +110 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/AmmUtilts.js +17 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmFactoryV2Contract.js +15 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmMasterChefV2Contract.js +15 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Contract.js +16 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Service.js +144 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmRouterV2Contract.js +15 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V2/AmmVaultV2Contract.js +15 -0
- package/dist/src/tokens/TokenExchanges/AmmBase/V3/AmmPairV3Contract.js +22 -0
- package/dist/src/tokens/TokenExchanges/AmmV2ExchangeBase.js +194 -0
- package/dist/src/tokens/TokenExchanges/OneInchExchange.js +92 -0
- package/dist/src/tokens/TokenExchanges/PancakeswapExchange.js +28 -0
- package/dist/src/tokens/TokenExchanges/SushiswapPolygonExchange.js +28 -0
- package/dist/src/tokens/TokenExchanges/UniswapExchange.js +28 -0
- package/dist/src/tokens/TokenOracles/AmmPriceV2Oracle.js +319 -0
- package/dist/src/tokens/TokenOracles/TokenPriceStore.js +108 -0
- package/dist/src/tokens/TokenPriceService.js +196 -0
- package/dist/src/tokens/TokenPriceServiceProvider.js +31 -0
- package/dist/src/tokens/TokenProviders/ATokenProvider.js +38 -0
- package/dist/src/tokens/TokenProviders/ITokenProvider.js +2 -0
- package/dist/src/tokens/TokenProviders/TPChain.js +35 -0
- package/dist/src/tokens/TokenProviders/TPCoinmarketcap.js +63 -0
- package/dist/src/tokens/TokenProviders/TPOneInch.js +65 -0
- package/dist/src/tokens/TokenProviders/TPSushiswap.js +89 -0
- package/dist/src/tokens/TokenProviders/TPUniswap.js +84 -0
- package/dist/src/tokens/TokenService.js +115 -0
- package/dist/src/tokens/TokenSwapService.js +37 -0
- package/dist/src/tokens/TokenTransferService.js +189 -0
- package/dist/src/tokens/TokensService.js +236 -0
- package/dist/src/tokens/TokensServiceBsc.js +18 -0
- package/dist/src/tokens/TokensServiceEth.js +15 -0
- package/dist/src/tokens/TokensServiceFactory.js +29 -0
- package/dist/src/tokens/TokensServicePolygon.js +18 -0
- package/dist/src/tokens/TokensServiceXDai.js +24 -0
- package/dist/src/tokens/defi/ISwapService.js +2 -0
- package/dist/src/tokens/defi/paraswap/Paraswap.js +135 -0
- package/dist/src/tokens/erc20/eth/WETH.js +14 -0
- package/dist/src/tokens/utils/TokenUtils.js +66 -0
- package/dist/src/txs/ITxConfig.js +2 -0
- package/dist/src/txs/TxDataBuilder.js +159 -0
- package/dist/src/txs/TxLogger.js +119 -0
- package/dist/src/txs/TxProvider.js +73 -0
- package/dist/src/txs/TxService.js +19 -0
- package/dist/src/txs/TxWriter.js +287 -0
- package/dist/src/txs/conditional/GasWatcherLogger.js +61 -0
- package/dist/src/txs/conditional/GasWatcherService.js +103 -0
- package/dist/src/txs/conditional/GasWatcherStore.js +25 -0
- package/dist/src/txs/conditional/GasWatcherTx.js +126 -0
- package/dist/src/txs/receipt/ITxLogItem.js +2 -0
- package/dist/src/txs/receipt/TxLogParser.js +27 -0
- package/dist/src/txs/receipt/TxLogsTransfer.js +50 -0
- package/dist/src/txs/receipt/TxTopicInMemoryProvider.js +41 -0
- package/dist/src/txs/receipt/TxTopicProvider.js +25 -0
- package/dist/src/utils/$abiParser.js +159 -0
- package/dist/src/utils/$abiType.js +77 -0
- package/dist/src/utils/$abiUtils.js +43 -0
- package/dist/src/utils/$address.js +41 -0
- package/dist/src/utils/$array.js +60 -0
- package/dist/src/utils/$bigint.js +130 -0
- package/dist/src/utils/$block.js +10 -0
- package/dist/src/utils/$class.js +13 -0
- package/dist/src/utils/$config.js +18 -0
- package/dist/src/utils/$contract.js +67 -0
- package/dist/src/utils/$csv.js +79 -0
- package/dist/src/utils/$date.js +496 -0
- package/dist/src/utils/$fn.js +117 -0
- package/dist/src/utils/$is.js +40 -0
- package/dist/src/utils/$logger.js +15 -0
- package/dist/src/utils/$number.js +95 -0
- package/dist/src/utils/$object.js +82 -0
- package/dist/src/utils/$path.js +33 -0
- package/dist/src/utils/$promise.js +13 -0
- package/dist/src/utils/$require.js +127 -0
- package/dist/src/utils/$sign.js +35 -0
- package/dist/src/utils/$signSerializer.js +264 -0
- package/dist/src/utils/$wallet.js +13 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/wallets/Wallet.js +26 -0
- package/dist/src/wallets/WalletBsc.js +17 -0
- package/dist/src/wallets/WalletService.js +35 -0
- package/dist/src/www/utils/BlockChainExplorerFormatter.js +15 -0
- package/hardhat.config.js +6 -0
- package/package.json +52 -0
- package/readme.md +76 -0
- package/src/BlockchainExplorer/BlockChainExplorerFactory.ts +273 -0
- package/src/BlockchainExplorer/BlockChainExplorerProvider.ts +26 -0
- package/src/BlockchainExplorer/BlockNumberCache.ts +46 -0
- package/src/BlockchainExplorer/Bscscan.ts +23 -0
- package/src/BlockchainExplorer/Etherscan.ts +25 -0
- package/src/BlockchainExplorer/IAbiProvider.ts +5 -0
- package/src/BlockchainExplorer/IBlockChainExplorer.ts +37 -0
- package/src/BlockchainExplorer/Polyscan.ts +23 -0
- package/src/ChainAccounts.ts +72 -0
- package/src/ChainAccountsService.ts +74 -0
- package/src/Config.ts +34 -0
- package/src/blocks/BlockDateResolver.ts +149 -0
- package/src/bridges/BridgeFactory.ts +16 -0
- package/src/bridges/hop/HopAddresses.ts +518 -0
- package/src/bridges/hop/HopBridge.ts +430 -0
- package/src/bridges/hop/contracts/gen.act.ts +50 -0
- package/src/bridges/hop/contracts/polygon/Dai_l2AmmWrapperContract.ts +69 -0
- package/src/bridges/hop/contracts/polygon/Dai_l2BridgeContract.ts +453 -0
- package/src/bridges/hop/contracts/polygon/Dai_l2SaddleSwapContract.ts +264 -0
- package/src/bridges/hop/contracts/polygon/Eth_l2AmmWrapperContract.ts +69 -0
- package/src/bridges/hop/contracts/polygon/Eth_l2BridgeContract.ts +453 -0
- package/src/bridges/hop/contracts/polygon/Eth_l2SaddleSwapContract.ts +264 -0
- package/src/bridges/hop/contracts/polygon/Matic_l2AmmWrapperContract.ts +69 -0
- package/src/bridges/hop/contracts/polygon/Matic_l2BridgeContract.ts +453 -0
- package/src/bridges/hop/contracts/polygon/Matic_l2SaddleSwapContract.ts +264 -0
- package/src/bridges/hop/contracts/polygon/Usdc_l2AmmWrapperContract.ts +69 -0
- package/src/bridges/hop/contracts/polygon/Usdc_l2BridgeContract.ts +453 -0
- package/src/bridges/hop/contracts/polygon/Usdc_l2SaddleSwapContract.ts +264 -0
- package/src/bridges/hop/contracts/polygon/Usdt_l2AmmWrapperContract.ts +69 -0
- package/src/bridges/hop/contracts/polygon/Usdt_l2BridgeContract.ts +453 -0
- package/src/bridges/hop/contracts/polygon/Usdt_l2SaddleSwapContract.ts +264 -0
- package/src/bridges/hop/contracts/polygon/Wbtc_l2AmmWrapperContract.ts +69 -0
- package/src/bridges/hop/contracts/polygon/Wbtc_l2BridgeContract.ts +453 -0
- package/src/bridges/hop/contracts/polygon/Wbtc_l2SaddleSwapContract.ts +264 -0
- package/src/bridges/models/IBridge.ts +43 -0
- package/src/bridges/wormhole/contracts/WormholeBridgeContract.ts +14 -0
- package/src/chains/PlatformFactory.ts +45 -0
- package/src/chains/arbitrum/ArbTokenProvider.ts +39 -0
- package/src/chains/arbitrum/ArbWeb3Client.ts +39 -0
- package/src/chains/arbitrum/Arbiscan.ts +24 -0
- package/src/chains/boba/BobaWeb3Client.ts +49 -0
- package/src/chains/boba/Bobascan.ts +25 -0
- package/src/chains/xdai/XDaiWeb3Client.ts +82 -0
- package/src/chains/xdai/XDaiscan.ts +24 -0
- package/src/chains/xdai/tokens/WXDaiTokenContract.json +279 -0
- package/src/chains/xdai/tokens/WXDaiTokenContract.ts +14 -0
- package/src/clients/BscWeb3Client.ts +38 -0
- package/src/clients/ClientEventsStream.ts +33 -0
- package/src/clients/ClientPool.ts +673 -0
- package/src/clients/ClientPoolStats.ts +64 -0
- package/src/clients/EthWeb3Client.ts +36 -0
- package/src/clients/HardhatWeb3Client.ts +60 -0
- package/src/clients/PolyWeb3Client.ts +91 -0
- package/src/clients/Web3Client.ts +228 -0
- package/src/clients/Web3ClientFactory.ts +28 -0
- package/src/clients/interfaces/IWeb3Client.ts +14 -0
- package/src/clients/interfaces/IWeb3ClientStatus.ts +23 -0
- package/src/clients/interfaces/IWeb3EndpointOptions.ts +9 -0
- package/src/clients/model/ClientStatus.ts +5 -0
- package/src/clients/model/PromiEventWrap.ts +61 -0
- package/src/clients/model/SubscriptionWrap.ts +53 -0
- package/src/clients/utils/ClientEndpoints.ts +26 -0
- package/src/clients/utils/ClientErrorUtil.ts +26 -0
- package/src/clients/utils/TxFactory.ts +17 -0
- package/src/contracts/BscContract.ts +28 -0
- package/src/contracts/Contract.ts +126 -0
- package/src/contracts/ContractBase.ts +158 -0
- package/src/contracts/ContractFactory.ts +19 -0
- package/src/contracts/ContractProvider.ts +55 -0
- package/src/contracts/ContractReader.ts +87 -0
- package/src/contracts/ContractStream.ts +18 -0
- package/src/contracts/ContractWriter.ts +97 -0
- package/src/contracts/EthContract.ts +29 -0
- package/src/contracts/TxContract.ts +43 -0
- package/src/contracts/common/ERC20.ts +13 -0
- package/src/contracts/common/ERC20Polygon.ts +13 -0
- package/src/contracts/common/PoolPair.ts +22 -0
- package/src/contracts/utils/AbiDeserializer.ts +98 -0
- package/src/contracts/utils/ConvertUtils.ts +16 -0
- package/src/contracts/utils/InputDataUtils.ts +93 -0
- package/src/contracts/utils/TypeUtils.ts +21 -0
- package/src/defi/OneInch/OneInchRouter.ts +13 -0
- package/src/env/BigIntSerializer.ts +18 -0
- package/src/gen/Ast.ts +12 -0
- package/src/gen/ContractTemplate.ts +36 -0
- package/src/gen/Generator.ts +227 -0
- package/src/gen/GeneratorFromAbi.ts +402 -0
- package/src/handlers/TokenHandler.ts +78 -0
- package/src/indexer/BlocksTxIndexer.ts +69 -0
- package/src/indexer/PendingTxIndexer.ts +124 -0
- package/src/indexer/handlers/BlocksWalker.ts +390 -0
- package/src/indexer/handlers/TxQueueLoader.ts +143 -0
- package/src/json/JsonArrayStore.ts +310 -0
- package/src/json/JsonObjectStore.ts +239 -0
- package/src/json/JsonStore.spec.ts +98 -0
- package/src/loggers/ILogger.ts +3 -0
- package/src/loggers/LoggerService.ts +39 -0
- package/src/loggers/TxLoggerService.ts +146 -0
- package/src/models/IContractDetails.ts +8 -0
- package/src/models/IToken.ts +11 -0
- package/src/models/ITokenGlob.ts +14 -0
- package/src/models/ITransactionDetails.ts +11 -0
- package/src/models/TAddress.ts +1 -0
- package/src/models/TBufferLike.ts +2 -0
- package/src/models/THex.ts +1 -0
- package/src/models/TPlatform.ts +1 -0
- package/src/models/TResult.ts +6 -0
- package/src/ns/NameService.ts +21 -0
- package/src/ns/providers/EnsProvider.ts +45 -0
- package/src/ns/providers/INsProvider.ts +6 -0
- package/src/ns/providers/UDProvider.ts +49 -0
- package/src/ns/utils/$ns.ts +15 -0
- package/src/structs/PackedRanges.spec.ts +38 -0
- package/src/structs/PackedRanges.ts +207 -0
- package/src/tokens/TokenExchangeService.ts +126 -0
- package/src/tokens/TokenExchanges/AmmBase/AmmUtilts.ts +16 -0
- package/src/tokens/TokenExchanges/AmmBase/V2/AmmFactoryV2Contract.ts +15 -0
- package/src/tokens/TokenExchanges/AmmBase/V2/AmmMasterChefV2Contract.ts +15 -0
- package/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Contract.ts +17 -0
- package/src/tokens/TokenExchanges/AmmBase/V2/AmmPairV2Service.ts +208 -0
- package/src/tokens/TokenExchanges/AmmBase/V2/AmmRouterV2Contract.ts +15 -0
- package/src/tokens/TokenExchanges/AmmBase/V2/AmmVaultV2Contract.ts +15 -0
- package/src/tokens/TokenExchanges/AmmBase/V3/AmmPairV3Contract.ts +24 -0
- package/src/tokens/TokenExchanges/AmmV2ExchangeBase.ts +242 -0
- package/src/tokens/TokenExchanges/OneInchExchange.ts +111 -0
- package/src/tokens/TokenExchanges/PancakeswapExchange.ts +30 -0
- package/src/tokens/TokenExchanges/SushiswapPolygonExchange.ts +30 -0
- package/src/tokens/TokenExchanges/UniswapExchange.ts +31 -0
- package/src/tokens/TokenOracles/AmmPriceV2Oracle.ts +440 -0
- package/src/tokens/TokenOracles/TokenPriceStore.ts +129 -0
- package/src/tokens/TokenPriceService.ts +276 -0
- package/src/tokens/TokenPriceServiceProvider.ts +36 -0
- package/src/tokens/TokenProviders/ATokenProvider.ts +42 -0
- package/src/tokens/TokenProviders/ITokenProvider.ts +9 -0
- package/src/tokens/TokenProviders/TPChain.ts +41 -0
- package/src/tokens/TokenProviders/TPCoinmarketcap.ts +82 -0
- package/src/tokens/TokenProviders/TPOneInch.ts +71 -0
- package/src/tokens/TokenProviders/TPSushiswap.ts +96 -0
- package/src/tokens/TokenProviders/TPUniswap.ts +85 -0
- package/src/tokens/TokenService.ts +128 -0
- package/src/tokens/TokenSwapService.ts +47 -0
- package/src/tokens/TokenTransferService.ts +216 -0
- package/src/tokens/TokensService.ts +252 -0
- package/src/tokens/TokensServiceBsc.ts +17 -0
- package/src/tokens/TokensServiceEth.ts +9 -0
- package/src/tokens/TokensServiceFactory.ts +24 -0
- package/src/tokens/TokensServicePolygon.ts +17 -0
- package/src/tokens/TokensServiceXDai.ts +26 -0
- package/src/tokens/defi/ISwapService.ts +12 -0
- package/src/tokens/defi/paraswap/Paraswap.ts +244 -0
- package/src/tokens/erc20/eth/WETH.ts +13 -0
- package/src/tokens/utils/TokenUtils.ts +63 -0
- package/src/txs/ITxConfig.ts +27 -0
- package/src/txs/TxDataBuilder.ts +207 -0
- package/src/txs/TxLogger.ts +121 -0
- package/src/txs/TxProvider.ts +68 -0
- package/src/txs/TxService.ts +19 -0
- package/src/txs/TxWriter.ts +370 -0
- package/src/txs/conditional/GasWatcherLogger.ts +57 -0
- package/src/txs/conditional/GasWatcherService.ts +117 -0
- package/src/txs/conditional/GasWatcherStore.ts +40 -0
- package/src/txs/conditional/GasWatcherTx.ts +143 -0
- package/src/txs/receipt/ITxLogItem.ts +25 -0
- package/src/txs/receipt/TxLogParser.ts +29 -0
- package/src/txs/receipt/TxLogsTransfer.ts +61 -0
- package/src/txs/receipt/TxTopicInMemoryProvider.ts +45 -0
- package/src/txs/receipt/TxTopicProvider.ts +29 -0
- package/src/utils/$abiParser.ts +179 -0
- package/src/utils/$abiType.ts +85 -0
- package/src/utils/$abiUtils.ts +38 -0
- package/src/utils/$address.ts +37 -0
- package/src/utils/$array.ts +57 -0
- package/src/utils/$bigint.ts +127 -0
- package/src/utils/$block.ts +7 -0
- package/src/utils/$class.ts +8 -0
- package/src/utils/$config.ts +17 -0
- package/src/utils/$contract.ts +67 -0
- package/src/utils/$csv.ts +54 -0
- package/src/utils/$date.ts +473 -0
- package/src/utils/$fn.ts +134 -0
- package/src/utils/$is.ts +37 -0
- package/src/utils/$logger.ts +10 -0
- package/src/utils/$number.ts +89 -0
- package/src/utils/$object.ts +95 -0
- package/src/utils/$path.ts +32 -0
- package/src/utils/$promise.ts +7 -0
- package/src/utils/$require.ts +118 -0
- package/src/utils/$sign.ts +36 -0
- package/src/utils/$signSerializer.ts +339 -0
- package/src/utils/$wallet.ts +10 -0
- package/src/utils/types.ts +29 -0
- package/src/wallets/Wallet.ts +33 -0
- package/src/wallets/WalletBsc.ts +13 -0
- package/src/wallets/WalletService.ts +43 -0
- package/src/www/utils/BlockChainExplorerFormatter.ts +13 -0
- package/test/ChainAccount.spec.ts +9 -0
- package/test/client.spec.ts +59 -0
- package/test/fixtures/DaiTokenContract.ts +13 -0
- package/test/fixtures/receipts/swap.json +94 -0
- package/test/generate/class.spec.ts +27 -0
- package/test/hardhat/TestNode.ts +61 -0
- package/test/ns.spec.ts +30 -0
- package/test/receipt.spec.ts +27 -0
- package/test/utils/abi-parser.spec.ts +117 -0
- package/test/utils/bigint.spec.ts +40 -0
- package/test/utils/date.spec.ts +8 -0
- package/test/utils/fn.spec.ts +39 -0
- package/test/utils/number.spec.ts +41 -0
- package/test/utils/sign.spec.ts +22 -0
- package/tsconfig-build.json +24 -0
- package/tsconfig-src.json +36 -0
- package/tsconfig.json +27 -0
- package/typings/globals/assertion/index.d.ts +159 -0
- package/typings/globals/assertion/typings.json +10 -0
- package/typings/globals/atma-utest/index.d.ts +53 -0
- package/typings/globals/atma-utest/typings.json +10 -0
- package/typings/globals/axios/index.d.ts +6 -0
- package/typings/globals/mask/index.d.ts +6 -0
- package/typings/globals/mask/typings.json +9 -0
- package/typings/index.d.ts +6 -0
- 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
|
+
}
|