package com.mygeopay.core.coins; import com.mygeopay.core.util.GenericUtils; import com.google.common.collect.ImmutableList; import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.params.Networks; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; /** * @author John L. Jegutanis * @author Adonis Valamontes */ public enum CoinID { ASIACOIN_MAIN(AsiacoinMain.get()), BITCOIN_MAIN(BitcoinMain.get()), BITCOIN_TEST(BitcoinTest.get()), BOLICOIN_MAIN(BolicoinMain.get()), LITECOIN_MAIN(LitecoinMain.get()), BATACOIN_MAIN(BatacoinMain.get()), STEPSCOIN_MAIN(StepscoinMain.get()), LITECOIN_TEST(LitecoinTest.get()), DOGECOIN_MAIN(DogecoinMain.get()), DOGECOIN_TEST(DogecoinTest.get()), DOGECOINDARK_MAIN(DogecoinDarkMain.get()), EUROPECOIN_MAIN(EuropecoinMain.get()), GROESTLCOIN_MAIN(GroestlCoinMain.get()), GCRCOIN_MAIN(GcrCoinMain.get()), REDDCOIN_MAIN(ReddcoinMain.get()), PEERCOIN_MAIN(PeercoinMain.get()), DASH_MAIN(DashMain.get()), NUSHARES_MAIN(NuSharesMain.get()), NUBITS_MAIN(NuBitsMain.get()), NAMECOIN_MAIN(NamecoinMain.get()), BLACKCOIN_MAIN(BlackcoinMain.get()), CLAMCOIN_MAIN(ClamcoinMain.get()), MAZACOIN_MAIN(MazacoinMain.get()), STARTCOIN_MAIN(StartcoinMain.get()), MONACOIN_MAIN(MonacoinMain.get()), FEATHERCOIN_MAIN(FeathercoinMain.get()), CANADAECOIN_MAIN(CanadaeCoinMain.get()), RUBYCOIN_MAIN(RubycoinMain.get()), // URO_MAIN(UroMain.get()), DIGITALCOIN_MAIN(DigitalcoinMain.get()), PARKBYTE_MAIN(ParkbyteMain.get()), CANNACOIN_MAIN(CannacoinMain.get()), DIGIBYTE_MAIN(DigibyteMain.get()), NEOSCOIN_MAIN(NeoscoinMain.get()), VERTCOIN_MAIN(VertcoinMain.get()), JUMBUCKS_MAIN(JumbucksMain.get()), SHADOWCASH_MAIN(ShadowCashMain.get()), NOVACOIN_MAIN(NovacoinMain.get()), CRYPTOESCUDO_MAIN(CryptoescudoMain.get()), VPNCOIN_MAIN(VpncoinMain.get()), VCOIN_MAIN(VcoinMain.get()), VIACOIN_MAIN(ViacoinMain.get()), OKCASHCOIN_MAIN(OkCashMain.get()), FAIRCOIN_MAIN(FairCoinMain.get()), PAKCOIN_MAIN(PakcoinMain.get()), ; private static List<CoinType> types; private static HashMap<String, CoinType> idLookup = new HashMap<>(); private static HashMap<String, CoinType> symbolLookup = new HashMap<>(); private static HashMap<String, List<CoinType>> uriLookup = new HashMap<>(); static { Set<NetworkParameters> bitcoinjNetworks = Networks.get(); for (NetworkParameters network : bitcoinjNetworks) { Networks.unregister(network); } for (CoinID id : values()) { Networks.register(id.type); } ImmutableList.Builder<CoinType> coinTypeBuilder = ImmutableList.builder(); for (CoinID id : values()) { if (symbolLookup.containsKey(id.type.symbol)) { throw new IllegalStateException( "Coin currency codes must be unique, double found: " + id.type.symbol); } symbolLookup.put(id.type.symbol, id.type); if (idLookup.containsKey(id.type.getId())) { throw new IllegalStateException( "Coin IDs must be unique, double found: " + id.type.getId()); } idLookup.put(id.type.getId(), id.type); if (!uriLookup.containsKey(id.type.uriScheme)) { uriLookup.put(id.type.uriScheme, new ArrayList<CoinType>()); } uriLookup.get(id.type.uriScheme).add(id.type); coinTypeBuilder.add(id.type); } types = coinTypeBuilder.build(); } private final CoinType type; private CoinID(final CoinType type) { this.type = type; } @Override public String toString() { return type.getId(); } public CoinType getCoinType() { return type; } public static List<CoinType> getSupportedCoins() { return types; } public static CoinType typeFromId(String stringId) { if (idLookup.containsKey(stringId)) { return idLookup.get(stringId); } else { throw new IllegalArgumentException("Unsupported ID: " + stringId); } } public static List<CoinType> fromUri(String input) { for (String uri : uriLookup.keySet()) { if (input.startsWith(uri + "://") || input.startsWith(uri + ":")) { return uriLookup.get(uri); } } throw new IllegalArgumentException("Unsupported URI: " + input); } public static List<CoinType> typesFromAddress(String address) throws AddressFormatException { return GenericUtils.getPossibleTypes(address); } public static boolean isSymbolSupported(String symbol) { return symbolLookup.containsKey(symbol); } public static CoinType typeFromSymbol(String symbol) { if (symbolLookup.containsKey(symbol.toUpperCase())) { return symbolLookup.get(symbol.toUpperCase()); } else { throw new IllegalArgumentException("Unsupported coin symbol: " + symbol); } } }