From 38199b9b5f0fe2126fbf89e0e0704f74f35c9471 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 28 Apr 2014 00:14:10 +0200 Subject: [PATCH] account registration --- design/navIcons.psd | Bin 49006 -> 49828 bytes src/main/java/io/bitsquare/BitSquare.java | 92 ++---- .../java/io/bitsquare/bank/BankAccount.java | 67 ++++ .../io/bitsquare/bank/BankAccountType.java | 47 +++ .../btc/AccountRegistrationWallet.java | 197 ++++++++++++ .../io/bitsquare/btc/BlockChainFacade.java | 31 +- .../io/bitsquare/btc/DownloadListener.java | 10 + src/main/java/io/bitsquare/btc/Fees.java | 5 +- .../java/io/bitsquare/btc/IWalletFacade.java | 34 -- src/main/java/io/bitsquare/btc/KeyPair.java | 1 + .../java/io/bitsquare/btc/WalletFacade.java | 147 +++++++-- .../io/bitsquare/crypto/CryptoFacade.java | 78 +++++ .../io/bitsquare/crypto/ICryptoFacade.java | 6 - .../io/bitsquare/crypto/MockCryptoFacade.java | 16 - .../java/io/bitsquare/di/BitSquareModule.java | 44 +-- .../java/io/bitsquare/di/GuiceFXMLLoader.java | 41 ++- .../io/bitsquare/gui/ChildController.java | 6 + .../io/bitsquare/gui/IChildController.java | 6 - .../java/io/bitsquare/gui/MainController.java | 176 ++++++----- src/main/java/io/bitsquare/gui/MainView.fxml | 15 +- ...troller.java => NavigationController.java} | 6 +- .../gui/components/NetworkSyncPane.java | 44 +++ .../components/processbar/ProcessStepBar.java | 16 +- .../processbar/ProcessStepBarSkin.java | 40 ++- .../bitsquare/gui/funds/FundsController.java | 17 +- .../io/bitsquare/gui/funds/FundsView.fxml | 5 +- src/main/java/io/bitsquare/gui/global.css | 22 +- .../gui/history/HistoryController.java | 10 +- .../io/bitsquare/gui/home/HomeController.java | 10 +- .../java/io/bitsquare/gui/home/HomeView.fxml | 2 +- .../io/bitsquare/gui/msg/MsgController.java | 10 +- .../gui/orders/OrdersController.java | 10 +- .../gui/settings/SettingsController.java | 10 +- .../bitsquare/gui/setup/SetupController.java | 293 ++++++++++++++++++ .../io/bitsquare/gui/setup/SetupView.fxml | 31 ++ .../bitsquare/gui/trade/TradeController.java | 27 +- .../trade/offer/CreateOfferController.java | 26 +- .../trade/orderbook/OrderBookController.java | 26 +- .../tradeprocess/TradeProcessController.java | 150 ++++----- .../io/bitsquare/gui/util/FormBuilder.java | 57 ++++ .../java/io/bitsquare/gui/util/Icons.java | 55 ++++ .../gui/util/{Loc.java => Localisation.java} | 14 +- .../io/bitsquare/gui/util/Transitions.java | 77 +++++ .../io/bitsquare/gui/util/Verification.java | 22 ++ .../java/io/bitsquare/msg/IMessageFacade.java | 13 - src/main/java/io/bitsquare/msg/Message.java | 10 +- .../java/io/bitsquare/msg/MessageFacade.java | 10 +- .../settings/OrderBookFilterSettings.java | 6 +- .../java/io/bitsquare/settings/Settings.java | 33 +- .../java/io/bitsquare/settings/Startup.java | 32 ++ src/main/java/io/bitsquare/setup/ISetup.java | 6 - .../java/io/bitsquare/setup/MockSetup.java | 59 ---- .../java/io/bitsquare/storage/IStorage.java | 8 - .../{SimpleStorage.java => Storage.java} | 30 +- .../io/bitsquare/trade/OfferConstraints.java | 12 +- .../{TradingFacade.java => Trading.java} | 30 +- .../bitsquare/trade/orderbook/IOrderBook.java | 9 - .../{MockOrderBook.java => OrderBook.java} | 32 +- .../trade/payment/process/PaymentProcess.java | 12 +- .../java/io/bitsquare/user/BankDetails.java | 61 ---- src/main/java/io/bitsquare/user/User.java | 88 ++++-- src/main/resources/images/refresh.png | Bin 0 -> 573 bytes .../resources/images/tx/circleProgress0.png | Bin 0 -> 609 bytes .../resources/images/tx/circleProgress1.png | Bin 0 -> 654 bytes .../resources/images/tx/circleProgress2.png | Bin 0 -> 618 bytes .../resources/images/tx/circleProgress3.png | Bin 0 -> 577 bytes .../resources/images/tx/circleProgress4.png | Bin 0 -> 623 bytes .../resources/images/tx/circleProgress5.png | Bin 0 -> 538 bytes .../resources/images/tx/fullConfirmed.png | Bin 0 -> 537 bytes src/main/resources/images/tx/shapeHexagon.png | Bin 0 -> 159 bytes .../resources/images/tx/shapePentagon.png | Bin 0 -> 170 bytes src/main/resources/images/tx/shapeSquare.png | Bin 0 -> 123 bytes .../resources/images/tx/shapeTriangle.png | Bin 0 -> 228 bytes .../resources/images/unused/payment_step1.png | Bin 1540 -> 0 bytes .../resources/images/unused/payment_step2.png | Bin 1628 -> 0 bytes .../resources/images/unused/payment_step3.png | Bin 1706 -> 0 bytes .../resources/images/unused/payment_step4.png | Bin 1681 -> 0 bytes .../resources/images/unused/payment_step5.png | Bin 1663 -> 0 bytes .../resources/images/unused/sell_white.png | Bin 284 -> 0 bytes src/main/resources/images/unused/step1.png | Bin 1436 -> 0 bytes src/main/resources/images/unused/step2.png | Bin 1670 -> 0 bytes src/main/resources/images/unused/step3.png | Bin 1703 -> 0 bytes src/main/resources/images/unused/step4.png | Bin 1621 -> 0 bytes src/main/resources/images/unused/step5.png | Bin 1532 -> 0 bytes .../bitsquare/gui/util/VerificationTest.java | 16 + 85 files changed, 1736 insertions(+), 730 deletions(-) create mode 100644 src/main/java/io/bitsquare/bank/BankAccount.java create mode 100644 src/main/java/io/bitsquare/bank/BankAccountType.java create mode 100644 src/main/java/io/bitsquare/btc/AccountRegistrationWallet.java create mode 100644 src/main/java/io/bitsquare/btc/DownloadListener.java delete mode 100644 src/main/java/io/bitsquare/btc/IWalletFacade.java create mode 100644 src/main/java/io/bitsquare/crypto/CryptoFacade.java delete mode 100644 src/main/java/io/bitsquare/crypto/ICryptoFacade.java delete mode 100644 src/main/java/io/bitsquare/crypto/MockCryptoFacade.java create mode 100644 src/main/java/io/bitsquare/gui/ChildController.java delete mode 100644 src/main/java/io/bitsquare/gui/IChildController.java rename src/main/java/io/bitsquare/gui/{INavigationController.java => NavigationController.java} (83%) create mode 100644 src/main/java/io/bitsquare/gui/components/NetworkSyncPane.java create mode 100644 src/main/java/io/bitsquare/gui/setup/SetupController.java create mode 100644 src/main/java/io/bitsquare/gui/setup/SetupView.fxml create mode 100644 src/main/java/io/bitsquare/gui/util/FormBuilder.java rename src/main/java/io/bitsquare/gui/util/{Loc.java => Localisation.java} (85%) create mode 100644 src/main/java/io/bitsquare/gui/util/Transitions.java create mode 100644 src/main/java/io/bitsquare/gui/util/Verification.java delete mode 100644 src/main/java/io/bitsquare/msg/IMessageFacade.java create mode 100644 src/main/java/io/bitsquare/settings/Startup.java delete mode 100644 src/main/java/io/bitsquare/setup/ISetup.java delete mode 100644 src/main/java/io/bitsquare/setup/MockSetup.java delete mode 100644 src/main/java/io/bitsquare/storage/IStorage.java rename src/main/java/io/bitsquare/storage/{SimpleStorage.java => Storage.java} (76%) rename src/main/java/io/bitsquare/trade/{TradingFacade.java => Trading.java} (86%) delete mode 100644 src/main/java/io/bitsquare/trade/orderbook/IOrderBook.java rename src/main/java/io/bitsquare/trade/orderbook/{MockOrderBook.java => OrderBook.java} (86%) delete mode 100644 src/main/java/io/bitsquare/user/BankDetails.java create mode 100644 src/main/resources/images/refresh.png create mode 100644 src/main/resources/images/tx/circleProgress0.png create mode 100644 src/main/resources/images/tx/circleProgress1.png create mode 100644 src/main/resources/images/tx/circleProgress2.png create mode 100644 src/main/resources/images/tx/circleProgress3.png create mode 100644 src/main/resources/images/tx/circleProgress4.png create mode 100644 src/main/resources/images/tx/circleProgress5.png create mode 100755 src/main/resources/images/tx/fullConfirmed.png create mode 100644 src/main/resources/images/tx/shapeHexagon.png create mode 100644 src/main/resources/images/tx/shapePentagon.png create mode 100644 src/main/resources/images/tx/shapeSquare.png create mode 100644 src/main/resources/images/tx/shapeTriangle.png delete mode 100644 src/main/resources/images/unused/payment_step1.png delete mode 100644 src/main/resources/images/unused/payment_step2.png delete mode 100644 src/main/resources/images/unused/payment_step3.png delete mode 100644 src/main/resources/images/unused/payment_step4.png delete mode 100644 src/main/resources/images/unused/payment_step5.png delete mode 100644 src/main/resources/images/unused/sell_white.png delete mode 100644 src/main/resources/images/unused/step1.png delete mode 100644 src/main/resources/images/unused/step2.png delete mode 100644 src/main/resources/images/unused/step3.png delete mode 100644 src/main/resources/images/unused/step4.png delete mode 100644 src/main/resources/images/unused/step5.png create mode 100644 src/test/java/io/bitsquare/gui/util/VerificationTest.java diff --git a/design/navIcons.psd b/design/navIcons.psd index 7456529c0e10ba484ad87023db92650b0be958a9..5448deedf518b8c87db398058e3d96f32d021163 100644 GIT binary patch delta 2721 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 W`a=V#w80^y2Gd0DlS^}HEBprzReSaT diff --git a/src/main/java/io/bitsquare/BitSquare.java b/src/main/java/io/bitsquare/BitSquare.java index 7fe0ea6838..6831d17e44 100644 --- a/src/main/java/io/bitsquare/BitSquare.java +++ b/src/main/java/io/bitsquare/BitSquare.java @@ -1,30 +1,25 @@ package io.bitsquare; -import com.google.bitcoin.store.BlockStoreException; -import com.google.bitcoin.utils.BriefLogFormatter; -import com.google.bitcoin.utils.Threading; -import com.google.common.base.Throwables; import com.google.inject.Guice; import com.google.inject.Injector; -import io.bitsquare.btc.IWalletFacade; +import io.bitsquare.btc.WalletFacade; import io.bitsquare.di.BitSquareModule; import io.bitsquare.di.GuiceFXMLLoader; -import io.bitsquare.setup.ISetup; -import io.bitsquare.setup.MockSetup; +import io.bitsquare.gui.util.Localisation; +import io.bitsquare.settings.Startup; +import io.bitsquare.storage.Storage; +import io.bitsquare.user.User; import javafx.application.Application; -import javafx.application.Platform; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - public class BitSquare extends Application { private static final Logger log = LoggerFactory.getLogger(BitSquare.class); - private IWalletFacade walletFacade; + private WalletFacade walletFacade; public static void main(String[] args) { @@ -34,23 +29,30 @@ public class BitSquare extends Application @Override public void start(Stage stage) throws Exception { - // Show the crash dialog for any exceptions that we don't handle and that hit the main loop. - //GuiUtils.handleCrashesOnThisThread(); - try - { - init(stage); - } catch (Throwable t) - { - // Nicer message for the case where the block store file is locked. - if (Throwables.getRootCause(t) instanceof BlockStoreException) - { - //GuiUtils.informationalAlert("Already running", "This application is already running and cannot be started twice."); - } - else - { - throw t; - } - } + final Injector injector = Guice.createInjector(new BitSquareModule()); + walletFacade = injector.getInstance(WalletFacade.class); + + // apply stored data + final User user = injector.getInstance(User.class); + final Storage storage = injector.getInstance(Storage.class); + user.updateFromStorage((User) storage.read(user.getClass().getName())); + + //TODO remove + final Startup setup = injector.getInstance(Startup.class); + setup.applyPersistedData(); + + stage.setTitle("BitSquare"); + + GuiceFXMLLoader.setInjector(injector); + final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource("/io/bitsquare/gui/MainView.fxml"), Localisation.getResourceBundle()); + final Parent mainView = loader.load(); + final Scene scene = new Scene(mainView, 800, 600); + stage.setScene(scene); + + final String global = getClass().getResource("/io/bitsquare/gui/global.css").toExternalForm(); + scene.getStylesheets().setAll(global); + + stage.show(); } @Override @@ -60,38 +62,4 @@ public class BitSquare extends Application super.stop(); } - - private void init(Stage stage) throws IOException - { - // Make log output concise. - BriefLogFormatter.init(); - - // Tell bitcoinj to run event handlers on the JavaFX UI thread. This keeps things simple and means - // we cannot forget to switch threads when adding event handlers. Unfortunately, the DownloadListener - // we give to the app kit is currently an exception and runs on a library thread. It'll get fixed in - // a future version. - Threading.USER_THREAD = Platform::runLater; - - final Injector injector = Guice.createInjector(new BitSquareModule()); - walletFacade = injector.getInstance(IWalletFacade.class); - - final ISetup setup = injector.getInstance(MockSetup.class); - setup.applyPersistedData(); - - stage.setTitle("BitSquare"); - - // main view - final GuiceFXMLLoader loader = new GuiceFXMLLoader(injector); - final Parent mainView = loader.load(BitSquare.class.getResourceAsStream("/io/bitsquare/gui/MainView.fxml")); - final Scene scene = new Scene(mainView, 800, 600); - stage.setScene(scene); - - // apply css - final String global = getClass().getResource("/io/bitsquare/gui/global.css").toExternalForm(); - // final String textValidation = getClass().getResource("/wallettemplate/utils/text-validation.css").toExternalForm(); - //scene.getStylesheets().setAll(global, textValidation); - scene.getStylesheets().setAll(global); - - stage.show(); - } } diff --git a/src/main/java/io/bitsquare/bank/BankAccount.java b/src/main/java/io/bitsquare/bank/BankAccount.java new file mode 100644 index 0000000000..5d535c2c01 --- /dev/null +++ b/src/main/java/io/bitsquare/bank/BankAccount.java @@ -0,0 +1,67 @@ +package io.bitsquare.bank; + +import java.io.Serializable; + +public class BankAccount implements Serializable +{ + + private static final long serialVersionUID = 1792577576443221268L; + + public BankAccountType bankAccountType; + public String accountPrimaryID; + public String accountSecondaryID; + public String accountHolderName; + private String uid; + + // TODO just for mock yet + public BankAccount(BankAccountType bankAccountType) + { + this.bankAccountType = bankAccountType; + } + + public BankAccount(BankAccountType bankAccountType, String accountPrimaryID, String accountSecondaryID, String accountHolderName) + { + this.bankAccountType = bankAccountType; + this.accountPrimaryID = accountPrimaryID; + this.accountSecondaryID = accountSecondaryID; + this.accountHolderName = accountHolderName; + + uid = bankAccountType + "_" + accountPrimaryID + "_" + accountSecondaryID + "_" + accountHolderName; + } + + public String getAccountPrimaryID() + { + return accountPrimaryID; + } + + public String getAccountSecondaryID() + { + return accountSecondaryID; + } + + public String getAccountHolderName() + { + return accountHolderName; + } + + public BankAccountType getBankAccountType() + { + return bankAccountType; + } + + public String getUid() + { + return uid; + } + + @Override + public String toString() + { + return "BankAccount{" + + "bankAccountType=" + bankAccountType + + ", accountPrimaryID='" + accountPrimaryID + '\'' + + ", accountSecondaryID='" + accountSecondaryID + '\'' + + ", accountHolderName='" + accountHolderName + '\'' + + '}'; + } +} diff --git a/src/main/java/io/bitsquare/bank/BankAccountType.java b/src/main/java/io/bitsquare/bank/BankAccountType.java new file mode 100644 index 0000000000..a8305c57d7 --- /dev/null +++ b/src/main/java/io/bitsquare/bank/BankAccountType.java @@ -0,0 +1,47 @@ +package io.bitsquare.bank; + +import java.io.Serializable; + +public class BankAccountType implements Serializable +{ + + private static final long serialVersionUID = -8772708150197835288L; + + private BankAccountTypeEnum type; + private String primaryIDName; + private String secondaryIDName; + + public BankAccountType(BankAccountTypeEnum type, String primaryIDName, String secondaryIDName) + { + this.type = type; + this.primaryIDName = primaryIDName; + this.secondaryIDName = secondaryIDName; + } + + public BankAccountTypeEnum getType() + { + return type; + } + + public String getPrimaryIDName() + { + return primaryIDName; + } + + public String getSecondaryIDName() + { + return secondaryIDName; + } + + @Override + public String toString() + { + //TODO localisation + return type.toString(); + } + + public static enum BankAccountTypeEnum + { + SEPA, WIRE, INTERNATIONAL, OK_PAY, NET_TELLER, PERFECT_MONEY, OTHER + } +} diff --git a/src/main/java/io/bitsquare/btc/AccountRegistrationWallet.java b/src/main/java/io/bitsquare/btc/AccountRegistrationWallet.java new file mode 100644 index 0000000000..65b6322326 --- /dev/null +++ b/src/main/java/io/bitsquare/btc/AccountRegistrationWallet.java @@ -0,0 +1,197 @@ +package io.bitsquare.btc; + +import com.google.bitcoin.core.*; +import com.google.bitcoin.script.Script; +import com.google.bitcoin.script.ScriptBuilder; +import com.google.bitcoin.store.UnreadableWalletException; +import com.google.bitcoin.store.WalletProtobufSerializer; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.math.BigInteger; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import static com.google.bitcoin.script.ScriptOpCodes.OP_RETURN; + +public class AccountRegistrationWallet extends Wallet implements WalletEventListener +{ + private static final Logger log = LoggerFactory.getLogger(AccountRegistrationWallet.class); + + private NetworkParameters networkParameters; + + public AccountRegistrationWallet(NetworkParameters networkParameters, BlockChain chain, PeerGroup peerGroup) + { + super(networkParameters); + + this.networkParameters = networkParameters; + + File walletFile = new File(".", "bitsquare_account_reg" + ".wallet"); + if (walletFile.exists()) + { + try + { + FileInputStream walletStream = new FileInputStream(walletFile); + new WalletProtobufSerializer().readWallet(WalletProtobufSerializer.parseToProto(walletStream), this); + } catch (FileNotFoundException e) + { + e.printStackTrace(); + } catch (UnreadableWalletException e) + { + e.printStackTrace(); + } catch (IOException e) + { + e.printStackTrace(); + } + } + else + { + addKey(new ECKey()); + } + + chain.addWallet(this); + peerGroup.addWallet(this); + autosaveToFile(walletFile, 1, TimeUnit.SECONDS, null); + } + + public Address getAddress() + { + return getKey().toAddress(networkParameters); + } + + public ECKey getKey() + { + return getKeys().get(0); + } + + public void saveToBlockchain(byte[] dataToEmbed) throws InsufficientMoneyException + { + Script script = new ScriptBuilder() + .op(OP_RETURN) + .data(dataToEmbed) + .build(); + Transaction transaction = new Transaction(networkParameters); + TransactionOutput dataOutput = new TransactionOutput(networkParameters, + transaction, + Transaction.MIN_NONDUST_OUTPUT, + script.getProgram()); + transaction.addOutput(dataOutput); + Wallet.SendRequest sendRequest = Wallet.SendRequest.forTx(transaction); + + // give fee to miners yet. Later it could be spent to other traders via lottery... + sendRequest.fee = Fees.ACCOUNT_REGISTRATION_FEE; + + Wallet.SendResult sendResult = sendCoins(sendRequest); + + //TODO + Futures.addCallback(sendResult.broadcastComplete, new FutureCallback() + { + @Override + public void onSuccess(Transaction result) + { + log.info("sendResult onSuccess:" + result.toString()); + // Platform.runLater(overlayUi::done); + } + + @Override + public void onFailure(Throwable t) + { + log.warn("sendResult onFailure:" + t.toString()); + // We died trying to empty the wallet. + // crashAlert(t); + } + }); + + //TODO + sendResult.tx.getConfidence().addEventListener((tx, reason) -> { + //if (reason == TransactionConfidence.Listener.ChangeReason.SEEN_PEERS) + //updateTitleForBroadcast(); + }); + } + + public int getConfirmations() + { + // TODO just a quick impl. need to be checked if it works for all cases... + Set transactions = getTransactions(true); + if (transactions != null && transactions.size() == 1) + { + Transaction transaction = transactions.iterator().next(); + final int lastBlockSeenHeight = getLastBlockSeenHeight(); + int appearedAtChainHeight = 0; + if (transaction.getConfidence().getConfidenceType() == TransactionConfidence.ConfidenceType.BUILDING) + appearedAtChainHeight = transaction.getConfidence().getAppearedAtChainHeight(); + + final int numberOfBlocksEmbedded = lastBlockSeenHeight - appearedAtChainHeight + 1; + + if (numberOfBlocksEmbedded > 0) + return numberOfBlocksEmbedded; + else + return 0; + } + return 0; + } + + public int getNumberOfPeersSeenTx() + { + // TODO just a quick impl. need to be checked if it works for all cases... + Set transactions = getTransactions(true); + if (transactions != null && transactions.size() == 1) + { + Transaction transaction = transactions.iterator().next(); + return (transaction == null || transaction.getConfidence() == null) ? 0 : transaction.getConfidence().numBroadcastPeers(); + } + return 0; + } + + //TODO those handlers are not called yet... + @Override + public void onCoinsReceived(Wallet wallet, Transaction tx, BigInteger prevBalance, BigInteger newBalance) + { + log.info("onCoinsReceived"); + } + + @Override + public void onCoinsSent(Wallet wallet, Transaction tx, BigInteger prevBalance, BigInteger newBalance) + { + log.info("onCoinsSent"); + } + + @Override + public void onReorganize(Wallet wallet) + { + log.info("onReorganize"); + } + + @Override + public void onTransactionConfidenceChanged(Wallet wallet, Transaction tx) + { + log.info("onTransactionConfidenceChanged"); + } + + @Override + public void onWalletChanged(Wallet wallet) + { + log.info("onWalletChanged"); + } + + @Override + public void onKeysAdded(Wallet wallet, List keys) + { + log.info("onKeysAdded"); + } + + @Override + public void onScriptsAdded(Wallet wallet, List