diff --git a/src/main/java/org/qortal/crosschain/BitcoinyTBD.java b/src/main/java/org/qortal/crosschain/BitcoinyTBD.java new file mode 100644 index 00000000..c25d2094 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/BitcoinyTBD.java @@ -0,0 +1,151 @@ +package org.qortal.crosschain; + +import org.bitcoinj.core.Coin; +import org.bitcoinj.core.Context; +import org.bitcoinj.core.NetworkParameters; +import org.qortal.api.model.crosschain.BitcoinyTBDRequest; +import org.qortal.crosschain.ChainableServer.ConnectionType; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class BitcoinyTBD extends Bitcoiny { + + private static HashMap requestsById = new HashMap<>(); + + private long minimumOrderAmount; + + private static Map instanceByCode = new HashMap<>(); + + private final NetTBD netTBD; + + /** + * Default ElectrumX Ports + * + * These are the defualts for all Bitcoin forks. + */ + private static final Map DEFAULT_ELECTRUMX_PORTS = new EnumMap<>(ConnectionType.class); + static { + DEFAULT_ELECTRUMX_PORTS.put(ConnectionType.TCP, 50001); + DEFAULT_ELECTRUMX_PORTS.put(ConnectionType.SSL, 50002); + } + + /** + * Constructor + * + * @param netTBD network access to the blockchain provider + * @param blockchain blockchain provider + * @param bitcoinjContext + * @param currencyCode the trading symbol, ie LTC + * @param minimumOrderAmount web search, LTC minimumOrderAmount = 1000000, 0.01 LTC minimum order to avoid dust errors + * @param feePerKb web search, LTC feePerKb = 10000, 0.0001 LTC per 1000 bytes + */ + private BitcoinyTBD( + NetTBD netTBD, + BitcoinyBlockchainProvider blockchain, + Context bitcoinjContext, + String currencyCode, + long minimumOrderAmount, + long feePerKb) { + + super(blockchain, bitcoinjContext, currencyCode, Coin.valueOf( feePerKb)); + + this.netTBD = netTBD; + this.minimumOrderAmount = minimumOrderAmount; + + LOGGER.info(() -> String.format("Starting BitcoinyTBD support using %s", this.netTBD.getName())); + } + + /** + * Get Instance + * + * @param currencyCode the trading symbol, ie LTC + * + * @return the instance + */ + public static synchronized Optional getInstance(String currencyCode) { + + return Optional.ofNullable(instanceByCode.get(currencyCode)); + } + + /** + * Build Instance + * + * @param bitcoinyTBDRequest + * @param networkParams + * @return the instance + */ + public static synchronized BitcoinyTBD buildInstance( + BitcoinyTBDRequest bitcoinyTBDRequest, + NetworkParameters networkParams + ) { + + NetTBD netTBD + = new NetTBD( + bitcoinyTBDRequest.getNetworkName(), + bitcoinyTBDRequest.getFeeCeiling(), + networkParams, + Collections.emptyList(), + bitcoinyTBDRequest.getExpectedGenesisHash() + ); + + BitcoinyBlockchainProvider electrumX = new ElectrumX(netTBD.getName(), netTBD.getGenesisHash(), netTBD.getServers(), DEFAULT_ELECTRUMX_PORTS); + Context bitcoinjContext = new Context(netTBD.getParams()); + + BitcoinyTBD instance + = new BitcoinyTBD( + netTBD, + electrumX, + bitcoinjContext, + bitcoinyTBDRequest.getCurrencyCode(), + bitcoinyTBDRequest.getMinimumOrderAmount(), + bitcoinyTBDRequest.getFeePerKb()); + electrumX.setBlockchain(instance); + + instanceByCode.put(bitcoinyTBDRequest.getCurrencyCode(), instance); + requestsById.put(bitcoinyTBDRequest.getId(), bitcoinyTBDRequest); + + return instance; + } + + public static List getRequests() { + + Collection requests = requestsById.values(); + + List list = new ArrayList<>( requests.size() ); + + list.addAll( requests ); + + return list; + } + + @Override + public long getMinimumOrderAmount() { + + return minimumOrderAmount; + } + + @Override + public long getP2shFee(Long timestamp) throws ForeignBlockchainException { + + return this.netTBD.getFeeCeiling(); + } + + @Override + public long getFeeCeiling() { + + return this.netTBD.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.netTBD.setFeeCeiling( fee ); + } +} \ No newline at end of file