package network.thunder.core; import network.thunder.core.communication.nio.ConnectionManager; import network.thunder.core.communication.nio.ConnectionManagerImpl; import network.thunder.core.communication.objects.lightning.subobjects.PaymentData; import network.thunder.core.communication.objects.messages.impl.LNEventHelperImpl; import network.thunder.core.communication.objects.messages.impl.factories.ContextFactoryImpl; import network.thunder.core.communication.objects.messages.impl.message.lnpayment.OnionObject; import network.thunder.core.communication.objects.messages.impl.results.FailureResult; import network.thunder.core.communication.objects.messages.impl.results.NullResultCommand; import network.thunder.core.communication.objects.messages.interfaces.factories.ContextFactory; import network.thunder.core.communication.objects.messages.interfaces.helper.*; import network.thunder.core.communication.objects.messages.interfaces.helper.etc.ResultCommand; import network.thunder.core.communication.objects.subobjects.PaymentSecret; import network.thunder.core.database.DBHandler; import network.thunder.core.etc.Tools; import network.thunder.core.mesh.LNConfiguration; import network.thunder.core.mesh.NodeServer; import org.bitcoinj.core.Wallet; import java.util.List; /** * Created by matsjerratsch on 08/02/2016. */ public class ThunderContext { Wallet wallet; DBHandler dbHandler; NodeServer node; LNEventHelper eventHelper; ContextFactory contextFactory; ConnectionManager connectionManager; LNConfiguration configuration = new LNConfiguration(); public ThunderContext (Wallet wallet, DBHandler dbHandler, NodeServer node) { this.wallet = wallet; this.dbHandler = dbHandler; this.node = node; init(); } private void init () { eventHelper = new LNEventHelperImpl(); contextFactory = new ContextFactoryImpl(node, dbHandler, wallet, eventHelper); connectionManager = new ConnectionManagerImpl(node, contextFactory, dbHandler, eventHelper); } public void startUp (ResultCommand resultCallback) { startListening( result -> fetchNetworkIPs( result1 -> { if (result1.wasSuccessful()) { getSyncData(new NullResultCommand()); } })); } public void addEventListener (LNEventListener eventListener) { eventHelper.addListener(eventListener); } public void removeEventListener (LNEventListener eventListener) { eventHelper.removeListener(eventListener); } public void startListening (ResultCommand resultCallback) { connectionManager.startListening(resultCallback); } public void openChannel (byte[] node, ResultCommand resultCallback) { connectionManager.buildChannel(node, resultCallback); } public void makePayment (byte[] receiver, long amount, PaymentSecret secret, ResultCommand resultCallback) { try { LNPaymentHelper paymentHelper = contextFactory.getPaymentHelper(); LNOnionHelper onionHelper = contextFactory.getOnionHelper(); LNRoutingHelper routingHelper = contextFactory.getLNRoutingHelper(); List<byte[]> route = routingHelper.getRoute(node.pubKeyServer.getPubKey(), receiver, 1000L, 1f, 1f, 1f); OnionObject object = onionHelper.createOnionObject(route, null); PaymentData paymentData = new PaymentData(); paymentData.amount = amount; paymentData.onionObject = object; paymentData.sending = true; paymentData.secret = secret; paymentData.timestampOpen = Tools.currentTime(); paymentData.timestampRefund = Tools.currentTime() + route.size() * configuration.MAX_REFUND_DELAY * configuration.MAX_OVERLAY_REFUND; paymentData.csvDelay = configuration.DEFAULT_REVOCATION_DELAY; paymentHelper.makePayment(paymentData); } catch (Exception e) { resultCallback.execute(new FailureResult()); } } public void fetchNetworkIPs (ResultCommand resultCallback) { connectionManager.fetchNetworkIPs(resultCallback); } public void getSyncData (ResultCommand resultCallback) { contextFactory.getSyncHelper().resync(); connectionManager.startSyncing(resultCallback); } public void createRandomChannels (ResultCommand resultCallback) { new Thread(new Runnable() { @Override public void run () { try { connectionManager.startBuildingRandomChannel(resultCallback); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }