diff --git a/AlphaWallet/Common/Types/Configuration.swift b/AlphaWallet/Common/Types/Configuration.swift index c271828429..d01a4c93a7 100644 --- a/AlphaWallet/Common/Types/Configuration.swift +++ b/AlphaWallet/Common/Types/Configuration.swift @@ -94,6 +94,8 @@ struct Configuration { static let blockChainFantomTestnet = UIColor.red static let blockChainAvalanche = UIColor.red static let blockChainAvalancheTestnet = UIColor.red + static let blockChainRootstock = UIColor.black + static let blockChainRootstockTestnet = UIColor.black static let blockChainPolygon = UIColor(red: 130, green: 71, blue: 229) static let blockChainOptimistic = UIColor.red static let blockChainCronosTestnet = UIColor.red diff --git a/AlphaWallet/Extensions/RPCServer+Extensions.swift b/AlphaWallet/Extensions/RPCServer+Extensions.swift index 8cce4ed482..b98b91f093 100644 --- a/AlphaWallet/Extensions/RPCServer+Extensions.swift +++ b/AlphaWallet/Extensions/RPCServer+Extensions.swift @@ -29,6 +29,8 @@ extension RPCServer { case .fantom_testnet: return R.string.localizable.blockchainFantomTest() case .avalanche: return R.string.localizable.blockchainAvalanche() case .avalanche_testnet: return R.string.localizable.blockchainAvalancheTest() + case .rootstock: return R.string.localizable.blockchainRootstock() + case .rootstock_testnet: return R.string.localizable.blockchainRootstockTest() case .polygon: return R.string.localizable.blockchainPolygon() case .mumbai_testnet: return R.string.localizable.blockchainMumbai() case .optimistic: return R.string.localizable.blockchainOptimistic() @@ -62,6 +64,7 @@ extension RPCServer { case .heco_testnet: return R.image.hthecoTestnet() case .fantom, .fantom_testnet: return R.image.iconsTokensFantom() case .avalanche, .avalanche_testnet: return R.image.iconsTokensAvalanche() + case .rootstock, .rootstock_testnet: return R.image.iconsTokensRootstock() case .polygon, .mumbai_testnet: return R.image.iconsTokensPolygon() case .optimistic: return R.image.iconsTokensOptimistic() case .arbitrum: return R.image.arbitrum() @@ -91,6 +94,8 @@ extension RPCServer { case .fantom_testnet: return Configuration.Color.Semantic.blockChainFantomTestnet case .avalanche: return Configuration.Color.Semantic.blockChainAvalanche case .avalanche_testnet: return Configuration.Color.Semantic.blockChainAvalancheTestnet + case .rootstock: return Configuration.Color.Semantic.blockChainRootstock + case .rootstock_testnet: return Configuration.Color.Semantic.blockChainRootstockTestnet case .polygon, .mumbai_testnet: return Configuration.Color.Semantic.blockChainPolygon case .optimistic: return Configuration.Color.Semantic.blockChainOptimistic case .cronosMainnet: return Configuration.Color.Semantic.blockChainCronosMainnet @@ -122,6 +127,7 @@ extension RPCServer { case .cronosMainnet: return R.image.iconsNetworkCronos() case .fantom, .fantom_testnet: return R.image.iconsNetworkFantom() case .avalanche, .avalanche_testnet: return R.image.iconsNetworkAvalanche() + case .rootstock, .rootstock_testnet: return R.image.iconsNetworkRootstock() case .polygon: return R.image.iconsNetworkPolygon() case .mumbai_testnet: return nil case .optimistic: return R.image.iconsNetworkOptimism() diff --git a/AlphaWallet/Localization/en.lproj/Localizable.strings b/AlphaWallet/Localization/en.lproj/Localizable.strings index a6816db838..eb6f6899cf 100644 --- a/AlphaWallet/Localization/en.lproj/Localizable.strings +++ b/AlphaWallet/Localization/en.lproj/Localizable.strings @@ -474,6 +474,8 @@ "blockchain.fantom.test" = "Fantom Testnet Network"; "blockchain.Avalanche" = "Avalanche Mainnet C-Chain"; "blockchain.Avalanche.test" = "Avalanche FUJI C-Chain"; +"blockchain.Rootstock" = "Rootstock Mainnet"; +"blockchain.Rootstock.test" = "Rootstock Testnet"; "blockchain.Polygon" = "Polygon Mainnet"; "blockchain.Mumbai" = "Mumbai Testnet"; "blockchain.Optimistic" = "Optimistic Testnet"; diff --git a/AlphaWallet/Localization/es.lproj/Localizable.strings b/AlphaWallet/Localization/es.lproj/Localizable.strings index 8eb5d4ada6..918fa592b7 100644 --- a/AlphaWallet/Localization/es.lproj/Localizable.strings +++ b/AlphaWallet/Localization/es.lproj/Localizable.strings @@ -474,6 +474,8 @@ "blockchain.fantom.test" = "Fantom Testnet Network"; "blockchain.Avalanche" = "Avalanche Mainnet C-Chain"; "blockchain.Avalanche.test" = "Avalanche FUJI C-Chain"; +"blockchain.Rootstock" = "Rootstock Mainnet"; +"blockchain.Rootstock.test" = "Rootstock Testnet"; "blockchain.Polygon" = "Polygon Mainnet"; "blockchain.Mumbai" = "Mumbai Testnet"; "blockchain.Optimistic" = "Optimistic Testnet"; diff --git a/AlphaWallet/Localization/fi.lproj/Localizable.strings b/AlphaWallet/Localization/fi.lproj/Localizable.strings index 4c4e4a266b..5dfdc37ee1 100644 --- a/AlphaWallet/Localization/fi.lproj/Localizable.strings +++ b/AlphaWallet/Localization/fi.lproj/Localizable.strings @@ -474,6 +474,8 @@ "blockchain.fantom.test" = "Fantom Testnet Network"; "blockchain.Avalanche" = "Avalanche Mainnet C-Chain"; "blockchain.Avalanche.test" = "Avalanche FUJI C-Chain"; +"blockchain.Rootstock" = "Rootstock Mainnet"; +"blockchain.Rootstock.test" = "Rootstock Testnet"; "blockchain.Polygon" = "Polygon Mainnet"; "blockchain.Mumbai" = "Mumbai Testnet"; "blockchain.Optimistic" = "Optimistic Testnet"; diff --git a/AlphaWallet/Localization/ja.lproj/Localizable.strings b/AlphaWallet/Localization/ja.lproj/Localizable.strings index 82ae99eeff..6309015202 100644 --- a/AlphaWallet/Localization/ja.lproj/Localizable.strings +++ b/AlphaWallet/Localization/ja.lproj/Localizable.strings @@ -474,6 +474,8 @@ "blockchain.fantom.test" = "Fantom Testnet Network"; "blockchain.Avalanche" = "Avalanche Mainnet C-Chain"; "blockchain.Avalanche.test" = "Avalanche FUJI C-Chain"; +"blockchain.Rootstock" = "Rootstock Mainnet"; +"blockchain.Rootstock.test" = "Rootstock Testnet"; "blockchain.Polygon" = "Polygon Mainnet"; "blockchain.Mumbai" = "Mumbai Testnet"; "blockchain.Optimistic" = "Optimistic Testnet"; diff --git a/AlphaWallet/Localization/ko.lproj/Localizable.strings b/AlphaWallet/Localization/ko.lproj/Localizable.strings index 1459bc1e3c..8f65c041e8 100644 --- a/AlphaWallet/Localization/ko.lproj/Localizable.strings +++ b/AlphaWallet/Localization/ko.lproj/Localizable.strings @@ -471,6 +471,8 @@ "blockchain.fantom.test" = "Fantom Testnet Network"; "blockchain.Avalanche" = "Avalanche Mainnet C-Chain"; "blockchain.Avalanche.test" = "Avalanche FUJI C-Chain"; +"blockchain.Rootstock" = "Rootstock Mainnet"; +"blockchain.Rootstock.test" = "Rootstock Testnet"; "blockchain.Polygon" = "Polygon Mainnet"; "blockchain.Mumbai" = "Mumbai Testnet"; "blockchain.Optimistic" = "Optimistic Testnet"; diff --git a/AlphaWallet/Localization/zh-Hans.lproj/Localizable.strings b/AlphaWallet/Localization/zh-Hans.lproj/Localizable.strings index 92a4e0018b..c4824c48d2 100644 --- a/AlphaWallet/Localization/zh-Hans.lproj/Localizable.strings +++ b/AlphaWallet/Localization/zh-Hans.lproj/Localizable.strings @@ -474,6 +474,8 @@ "blockchain.fantom.test" = "Fantom Testnet Network"; "blockchain.Avalanche" = "Avalanche Mainnet C-Chain"; "blockchain.Avalanche.test" = "Avalanche FUJI C-Chain"; +"blockchain.Rootstock" = "Rootstock Mainnet"; +"blockchain.Rootstock.test" = "Rootstock Testnet"; "blockchain.Polygon" = "Polygon Mainnet"; "blockchain.Mumbai" = "Mumbai Testnet"; "blockchain.Optimistic" = "Optimistic Testnet"; diff --git a/AlphaWallet/Resources/Assets.xcassets/Network/icons-network-rootstock.imageset/Contents.json b/AlphaWallet/Resources/Assets.xcassets/Network/icons-network-rootstock.imageset/Contents.json new file mode 100644 index 0000000000..8af4ba90a1 --- /dev/null +++ b/AlphaWallet/Resources/Assets.xcassets/Network/icons-network-rootstock.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "icons-network-rootstock.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/AlphaWallet/Resources/Assets.xcassets/Network/icons-network-rootstock.imageset/icons-network-rootstock.pdf b/AlphaWallet/Resources/Assets.xcassets/Network/icons-network-rootstock.imageset/icons-network-rootstock.pdf new file mode 100644 index 0000000000..361d207d9b Binary files /dev/null and b/AlphaWallet/Resources/Assets.xcassets/Network/icons-network-rootstock.imageset/icons-network-rootstock.pdf differ diff --git a/AlphaWallet/Resources/Assets.xcassets/iconsTokensRootstock.imageset/Contents.json b/AlphaWallet/Resources/Assets.xcassets/iconsTokensRootstock.imageset/Contents.json new file mode 100644 index 0000000000..75c8ce90d8 --- /dev/null +++ b/AlphaWallet/Resources/Assets.xcassets/iconsTokensRootstock.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "filename" : "iconsTokensRootstock.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/AlphaWallet/Resources/Assets.xcassets/iconsTokensRootstock.imageset/iconsTokensRootstock.pdf b/AlphaWallet/Resources/Assets.xcassets/iconsTokensRootstock.imageset/iconsTokensRootstock.pdf new file mode 100644 index 0000000000..361d207d9b Binary files /dev/null and b/AlphaWallet/Resources/Assets.xcassets/iconsTokensRootstock.imageset/iconsTokensRootstock.pdf differ diff --git a/modules/AlphaWalletCore/AlphaWalletCore/Types/RPCServer.swift b/modules/AlphaWalletCore/AlphaWalletCore/Types/RPCServer.swift index cf6c5977a2..e0e9a11d22 100644 --- a/modules/AlphaWalletCore/AlphaWalletCore/Types/RPCServer.swift +++ b/modules/AlphaWalletCore/AlphaWalletCore/Types/RPCServer.swift @@ -24,6 +24,8 @@ public enum RPCServer: Hashable, CaseIterable { case fantom_testnet case avalanche case avalanche_testnet + case rootstock + case rootstock_testnet case polygon case mumbai_testnet case optimistic @@ -58,6 +60,8 @@ public enum RPCServer: Hashable, CaseIterable { case .fantom_testnet: return 0xfa2 case .avalanche: return 0xa86a case .avalanche_testnet: return 0xa869 + case .rootstock: return 30 + case .rootstock_testnet: return 31 case .polygon: return 137 case .mumbai_testnet: return 80001 case .optimistic: return 10 @@ -93,6 +97,8 @@ public enum RPCServer: Hashable, CaseIterable { .fantom_testnet, .avalanche, .avalanche_testnet, + .rootstock, + .rootstock_testnet, .polygon, .callisto, .mumbai_testnet, diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/CoinTickers.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/CoinTickers.swift index 6b07e55036..a9e9774f3a 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/CoinTickers.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/CoinTickers.swift @@ -142,7 +142,7 @@ private protocol CoinTickerServiceIdentifieble { extension CoinTickerServiceIdentifieble { var coinTickerProviderType: CoinTickersFetcher.Type { switch server { - case .main, .classic, .callisto, .custom, .goerli, .xDai, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: + case .main, .classic, .callisto, .custom, .goerli, .xDai, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return CoinGeckoTickersFetcher.self } } diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/Types/TickerId.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/Types/TickerId.swift index a403237d95..04425d91c7 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/Types/TickerId.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/CoinTicker/Types/TickerId.swift @@ -72,6 +72,7 @@ extension RPCServer { case "xdai": self = .xDai case "binance-smart-chain": self = .binance_smart_chain case "avalanche": self = .avalanche + case "rootstock": self = .rootstock case "polygon-pos": self = .polygon case "fantom": self = .fantom case "arbitrum-one": self = .arbitrum diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/GasPriceEstimator/GasPriceEstimator.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/GasPriceEstimator/GasPriceEstimator.swift index 826d927e0a..cc67bca80b 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/GasPriceEstimator/GasPriceEstimator.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/GasPriceEstimator/GasPriceEstimator.swift @@ -45,7 +45,7 @@ extension RPCServer { var supportsEip1559: Bool { switch self { case .main, .polygon, .goerli: return true - case .binance_smart_chain, .heco, .arbitrum, .klaytnCypress, .klaytnBaobabTestnet, .xDai, .custom, .callisto, .classic, .binance_smart_chain_testnet, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .mumbai_testnet, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return false + case .binance_smart_chain, .heco, .arbitrum, .klaytnCypress, .klaytnBaobabTestnet, .xDai, .custom, .callisto, .classic, .binance_smart_chain_testnet, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .mumbai_testnet, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return false } } diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Settings/Types/Constants.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Settings/Types/Constants.swift index 90f84d8c17..6e54448e34 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Settings/Types/Constants.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Settings/Types/Constants.swift @@ -21,6 +21,8 @@ public struct Constants { static let fantomTestMagicLinkHost = "test-fantom.aw.app" static let avalancheMagicLinkHost = "avalanche.aw.app" static let avalancheTestMagicLinkHost = "test-avalanche.aw.app" + static let rootstockMagicLinkHost = "rootstock.aw.app" + static let rootstockTestMagicLinkHost = "test-rootstock.aw.app" static let maticMagicLinkHost = "polygon.aw.app" static let mumbaiTestMagicLinkHost = "test-polygon.aw.app" static let optimisticMagicLinkHost = "optimistic.aw.app" diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Transactions/Oklink/OklinkNetworking.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Transactions/Oklink/OklinkNetworking.swift index 16bdc46fe2..f7bb859db4 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Transactions/Oklink/OklinkNetworking.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Transactions/Oklink/OklinkNetworking.swift @@ -471,6 +471,8 @@ private extension RPCServer { case .fantom_testnet: return "" case .avalanche: return "" case .avalanche_testnet: return "" + case .rootstock: return "" + case .rootstock_testnet: return "" case .polygon: return "" case .mumbai_testnet: return "" case .optimistic: return "" diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/RPCServers.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/RPCServers.swift index 0d8fd67fb1..c8df2b65b8 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/RPCServers.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/RPCServers.swift @@ -42,6 +42,8 @@ extension RPCServer: Hashable, CaseIterable { case .fantom_testnet: return "Fantom Testnet" case .avalanche: return "Avalanche Mainnet C-Chain" case .avalanche_testnet: return "Avalanche FUJI C-Chain" + case .rootstock: return "Rootstock Mainnet" + case .rootstock_testnet: return "Rootstock Testnet" case .polygon: return "Polygon Mainnet" case .mumbai_testnet: return "Mumbai Testnet" case .optimistic: return "Optimistic Ethereum" @@ -63,9 +65,9 @@ extension RPCServer: Hashable, CaseIterable { public var isTestnet: Bool { switch self { - case .xDai, .classic, .main, .callisto, .binance_smart_chain, .heco, .fantom, .avalanche, .polygon, .optimistic, .arbitrum, .palm, .klaytnCypress, .ioTeX, .cronosMainnet, .okx: + case .xDai, .classic, .main, .callisto, .binance_smart_chain, .heco, .fantom, .avalanche, .polygon, .rootstock, .optimistic, .arbitrum, .palm, .klaytnCypress, .ioTeX, .cronosMainnet, .okx: return false - case .goerli, .binance_smart_chain_testnet, .heco_testnet, .fantom_testnet, .avalanche_testnet, .mumbai_testnet, .cronosTestnet, .palmTestnet, .klaytnBaobabTestnet, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .sepolia: + case .goerli, .binance_smart_chain_testnet, .heco_testnet, .fantom_testnet, .avalanche_testnet, .mumbai_testnet, .rootstock_testnet, .cronosTestnet, .palmTestnet, .klaytnBaobabTestnet, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .sepolia: return true case .custom(let custom): return custom.isTestnet @@ -112,6 +114,8 @@ extension RPCServer: Hashable, CaseIterable { case .ioTeXTestnet: return "https://testnet.iotexscan.io" case .optimismGoerli: return "https://optimism-goerli.blockscout.com/optimism/goerli" case .arbitrumGoerli: return "https://testnet.arbiscan.io" + case .rootstock: return "https://blockscout.com/rsk/mainnet" + case .rootstock_testnet: return nil case .okx: return "https://www.oklink.com/okc" case .sepolia: return "https://sepolia.etherscan.io" } @@ -217,6 +221,11 @@ extension RPCServer: Hashable, CaseIterable { } case .ioTeX, .ioTeXTestnet: return .covalent(apiKey: Constants.Credentials.covalentApiKey) + case .rootstock: + guard let url = URL(string: "https://blockscout.com/rsk/mainnet/api") else { return .unknown } + return .blockscout(apiKey: nil, apiUrl: url) + case .rootstock_testnet: + return .unknown case .okx: return .oklink(apiKey: Constants.Credentials.oklinkKey) } @@ -226,7 +235,7 @@ extension RPCServer: Hashable, CaseIterable { var erc20AddressForNativeToken: AlphaWallet.Address? { switch self { case .optimistic: return AlphaWallet.Address(string: "0x4200000000000000000000000000000000000006")! - case .main, .goerli, .fantom, .heco, .heco_testnet, .binance_smart_chain, .binance_smart_chain_testnet, .polygon, .classic, .xDai, .mumbai_testnet, .callisto, .cronosTestnet, .fantom_testnet, .avalanche, .avalanche_testnet, .custom, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .cronosMainnet, .sepolia: return nil + case .main, .goerli, .fantom, .heco, .heco_testnet, .binance_smart_chain, .binance_smart_chain_testnet, .polygon, .classic, .xDai, .mumbai_testnet, .callisto, .cronosTestnet, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .custom, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .cronosMainnet, .sepolia: return nil case .klaytnCypress, .klaytnBaobabTestnet: return nil case .ioTeX, .ioTeXTestnet: return nil case .optimismGoerli, .arbitrumGoerli: return nil @@ -237,7 +246,7 @@ extension RPCServer: Hashable, CaseIterable { //Optimistic don't allow changing the gas price and limit public var canUserChangeGas: Bool { switch self { - case .main, .goerli, .fantom, .heco, .heco_testnet, .binance_smart_chain, .binance_smart_chain_testnet, .polygon, .classic, .xDai, .mumbai_testnet, .callisto, .cronosTestnet, .fantom_testnet, .avalanche, .avalanche_testnet, .custom, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .cronosMainnet, .okx, .sepolia: return true + case .main, .goerli, .fantom, .heco, .heco_testnet, .binance_smart_chain, .binance_smart_chain_testnet, .polygon, .classic, .xDai, .mumbai_testnet, .callisto, .cronosTestnet, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .custom, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .cronosMainnet, .okx, .sepolia: return true case .optimistic, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet: return false case .optimismGoerli, .arbitrumGoerli: return false } @@ -245,7 +254,7 @@ extension RPCServer: Hashable, CaseIterable { var shouldAddBufferWhenEstimatingGasPrice: Bool { switch self { - case .main, .classic, .callisto, .xDai, .goerli, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .custom, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: + case .main, .classic, .callisto, .xDai, .goerli, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .custom, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return true } } @@ -255,7 +264,7 @@ extension RPCServer: Hashable, CaseIterable { switch self { case .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .sepolia: return etherscanWebpageRoot?.appendingPathComponent("account").appendingPathComponent(address.eip55String) - case .main, .xDai, .goerli, .classic, .callisto, .binance_smart_chain, .binance_smart_chain_testnet, .custom, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet: + case .main, .xDai, .goerli, .classic, .callisto, .binance_smart_chain, .binance_smart_chain_testnet, .custom, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet: switch transactionsSource { case .etherscan: return etherscanWebpageRoot?.appendingPathComponent("address").appendingPathComponent(address.eip55String) @@ -276,7 +285,7 @@ extension RPCServer: Hashable, CaseIterable { switch self { case .main, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .avalanche, .avalanche_testnet, .sepolia: return etherscanWebpageRoot?.appendingPathComponent("token").appendingPathComponent(address.eip55String) - case .xDai, .goerli, .classic, .callisto, .binance_smart_chain, .binance_smart_chain_testnet, .custom, .heco, .heco_testnet, .fantom, .fantom_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx: + case .xDai, .goerli, .classic, .callisto, .binance_smart_chain, .binance_smart_chain_testnet, .custom, .heco, .heco_testnet, .fantom, .fantom_testnet, .polygon, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .rootstock, .rootstock_testnet, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx: return etherscanContractDetailsWebPageURL(for: address) } } @@ -294,6 +303,8 @@ extension RPCServer: Hashable, CaseIterable { case .fantom, .fantom_testnet: return "FTM" case .avalanche, .avalanche_testnet: return "AVAX" case .polygon, .mumbai_testnet: return "MATIC" + case .rootstock: return "RBTC" + case .rootstock_testnet: return "tRBTC" case .optimistic: return "ETH" case .cronosMainnet: return "CRO" case .cronosTestnet: return "tCRO" @@ -318,6 +329,8 @@ extension RPCServer: Hashable, CaseIterable { case .fantom, .fantom_testnet: return "FTM" case .avalanche, .avalanche_testnet: return "AVAX" case .polygon, .mumbai_testnet: return "MATIC" + case .rootstock: return "RBTC" + case .rootstock_testnet: return "tRBTC" case .cronosMainnet: return "CRO" case .cronosTestnet: return "tCRO" case .custom(let custom): return custom.nativeCryptoTokenName ?? "Ether" @@ -357,6 +370,8 @@ extension RPCServer: Hashable, CaseIterable { case .fantom_testnet: return Constants.fantomTestMagicLinkHost case .avalanche: return Constants.avalancheMagicLinkHost case .avalanche_testnet: return Constants.avalancheTestMagicLinkHost + case .rootstock: return Constants.rootstockMagicLinkHost + case .rootstock_testnet: return Constants.rootstockTestMagicLinkHost case .polygon: return Constants.maticMagicLinkHost case .mumbai_testnet: return Constants.mumbaiTestMagicLinkHost case .optimistic: return Constants.optimisticMagicLinkHost @@ -397,6 +412,8 @@ extension RPCServer: Hashable, CaseIterable { case .fantom_testnet: return "https://rpc.ankr.com/fantom_testnet" case .avalanche: return "https://api.avax.network/ext/bc/C/rpc" case .avalanche_testnet: return "https://api.avax-test.network/ext/bc/C/rpc" + case .rootstock: return "https://public-node.rsk.co" + case .rootstock_testnet: return "https://public-node.testnet.rsk.co" case .polygon: return "https://polygon-mainnet.infura.io/v3/\(Constants.Credentials.infuraKey)" case .mumbai_testnet: return "https://polygon-mumbai.infura.io/v3/\(Constants.Credentials.infuraKey)" case .optimistic: return "https://optimism-mainnet.infura.io/v3/\(Constants.Credentials.infuraKey)" @@ -433,7 +450,7 @@ extension RPCServer: Hashable, CaseIterable { var networkRequestsQueuePriority: Operation.QueuePriority { switch self { case .main, .polygon, .klaytnCypress, .klaytnBaobabTestnet: return .normal - case .xDai, .classic, .callisto, .goerli, .binance_smart_chain, .binance_smart_chain_testnet, .custom, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return .low + case .xDai, .classic, .callisto, .goerli, .binance_smart_chain, .binance_smart_chain_testnet, .custom, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .mumbai_testnet, .optimistic, .cronosTestnet, .arbitrum, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return .low } } @@ -456,7 +473,7 @@ extension RPCServer: Hashable, CaseIterable { var startBlock: UInt64 { switch self { - case .xDai, .cronosTestnet, .arbitrum, .mumbai_testnet, .polygon, .optimistic, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom_testnet, .main, .classic, .callisto, .goerli, .fantom, .custom, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .cronosMainnet, .avalanche, .avalanche_testnet, .sepolia: + case .xDai, .cronosTestnet, .arbitrum, .mumbai_testnet, .polygon, .optimistic, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom_testnet, .main, .classic, .callisto, .goerli, .fantom, .custom, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .cronosMainnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .sepolia: return 0 case .okx: return 2322601 @@ -484,7 +501,7 @@ extension RPCServer: Hashable, CaseIterable { return 3000 case .fantom_testnet: return 3000 - case .main, .classic, .callisto, .goerli, .fantom, .custom, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .sepolia: + case .main, .classic, .rootstock, .rootstock_testnet, .callisto, .goerli, .fantom, .custom, .palm, .palmTestnet, .optimismGoerli, .arbitrumGoerli, .sepolia: return nil case .klaytnCypress, .klaytnBaobabTestnet: return 1024 @@ -533,13 +550,15 @@ extension RPCServer: Hashable, CaseIterable { case .arbitrumGoerli: return 37 case .cronosMainnet: return 38 case .okx: return 39 + case .rootstock: return 40 + case .rootstock_testnet: return 41 } } public var explorerName: String { switch self { case .main, .goerli, .optimismGoerli, .arbitrumGoerli: return "Etherscan" - case .classic, .custom, .callisto, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .polygon, .mumbai_testnet, .optimistic, .arbitrum, .palm, .palmTestnet, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .sepolia: return "\(name) Explorer" + case .classic, .custom, .callisto, .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .polygon, .mumbai_testnet, .optimistic, .arbitrum, .palm, .palmTestnet, .klaytnCypress, .klaytnBaobabTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .sepolia: return "\(name) Explorer" case .xDai: return "Blockscout" case .cronosMainnet, .cronosTestnet: return "Cronoscan" case .okx: return "OKC Explorer" @@ -557,7 +576,7 @@ extension RPCServer: Hashable, CaseIterable { case .arbitrum: return .arbitrum case .klaytnCypress: return .klaytnCypress case .klaytnBaobabTestnet: return .klaytnBaobabTestnet - case .main, .goerli, .custom, .callisto, .xDai, .classic, .binance_smart_chain_testnet, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .mumbai_testnet, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return nil + case .main, .goerli, .custom, .callisto, .xDai, .classic, .binance_smart_chain_testnet, .heco_testnet, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .mumbai_testnet, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return nil } } @@ -569,26 +588,27 @@ extension RPCServer: Hashable, CaseIterable { case .binance_smart_chain: return "binance-smart-chain" case .avalanche: return "avalanche" case .polygon: return "polygon-pos" + case .rootstock: return "rootstock" case .fantom: return "fantom" case .arbitrum: return "arbitrum-one" case .klaytnCypress, .klaytnBaobabTestnet: return "klay-token" case .cronosMainnet: return "cronos" - case .callisto, .goerli, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom_testnet, .avalanche_testnet, .mumbai_testnet, .custom, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .okx, .sepolia: return nil + case .callisto, .goerli, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom_testnet, .avalanche_testnet, .rootstock_testnet, .mumbai_testnet, .custom, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .okx, .sepolia: return nil } } var coinbasePlatform: String? { switch self { case .main: return "ethereum" - case .avalanche, .xDai, .classic, .fantom, .arbitrum, .polygon, .binance_smart_chain, .klaytnCypress, .klaytnBaobabTestnet, .callisto, .goerli, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom_testnet, .avalanche_testnet, .mumbai_testnet, .custom, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return nil + case .avalanche, .xDai, .classic, .fantom, .arbitrum, .polygon, .binance_smart_chain, .klaytnCypress, .klaytnBaobabTestnet, .callisto, .goerli, .binance_smart_chain_testnet, .heco, .heco_testnet, .fantom_testnet, .avalanche_testnet, .rootstock, .rootstock_testnet, .mumbai_testnet, .custom, .optimistic, .cronosTestnet, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return nil } } var shouldExcludeZeroGasPrice: Bool { switch self { case .klaytnCypress, .klaytnBaobabTestnet: return true - case .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .optimistic, .polygon, .mumbai_testnet, .cronosTestnet, .arbitrum, .main, .classic, .callisto, .goerli, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .custom, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .xDai, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return false + case .binance_smart_chain, .binance_smart_chain_testnet, .heco, .heco_testnet, .optimistic, .polygon, .mumbai_testnet, .cronosTestnet, .arbitrum, .main, .classic, .callisto, .goerli, .fantom, .fantom_testnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .custom, .palm, .palmTestnet, .ioTeX, .ioTeXTestnet, .xDai, .optimismGoerli, .arbitrumGoerli, .cronosMainnet, .okx, .sepolia: return false } } @@ -611,7 +631,7 @@ extension RPCServer: Hashable, CaseIterable { case .fantom: return .batch(10) case .fantom_testnet: return .batch(10) case .ioTeX, .ioTeXTestnet: return .batch(200) - case .cronosTestnet, .avalanche, .avalanche_testnet, .custom, .sepolia: return .batch(32) + case .cronosTestnet, .avalanche, .avalanche_testnet, .rootstock, .rootstock_testnet, .custom, .sepolia: return .batch(32) } } diff --git a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/SessionsProvider.swift b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/SessionsProvider.swift index 8661648803..79cb82fc2e 100644 --- a/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/SessionsProvider.swift +++ b/modules/AlphaWalletFoundation/AlphaWalletFoundation/Types/SessionsProvider.swift @@ -182,7 +182,7 @@ public class ApiTransporterFactory { case .goerli, .mumbai_testnet, .sepolia: //NOTE: goerli as well as mumbai_testnet and sepolia retrun 403 error code policy = ApiTransporterRetryPolicy(retryableHTTPStatusCodes: [429, 408, 500, 502, 503, 504, 403]) - case .xDai, .classic, .main, .callisto, .binance_smart_chain, .heco, .fantom, .avalanche, .polygon, .optimistic, .arbitrum, .palm, .klaytnCypress, .ioTeX, .cronosMainnet, .okx, .binance_smart_chain_testnet, .heco_testnet, .fantom_testnet, .avalanche_testnet, .cronosTestnet, .palmTestnet, .klaytnBaobabTestnet, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .custom: + case .xDai, .classic, .main, .callisto, .binance_smart_chain, .heco, .fantom, .avalanche, .polygon, .optimistic, .arbitrum, .palm, .klaytnCypress, .ioTeX, .cronosMainnet, .okx, .binance_smart_chain_testnet, .heco_testnet, .fantom_testnet, .avalanche_testnet, .cronosTestnet, .palmTestnet, .rootstock, .rootstock_testnet, .klaytnBaobabTestnet, .ioTeXTestnet, .optimismGoerli, .arbitrumGoerli, .custom: policy = ApiTransporterRetryPolicy() }