From 6a84f557276ab1a1011f31a2440a460105ba9434 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Sun, 15 Sep 2013 22:08:19 +0200 Subject: [PATCH] Add a demo wallet app that uses JavaFX and Java 8. The app is not meant to be usable by end users. It is intended to act as a template for people to build custom apps that use contracts. To that end you can get money in, and empty your wallet, but there's no other controls beyond that. Apps based on this template look professional and have nice animations and visual effects. You can also use this as a way to learn JavaFX. --- pom.xml | 1 + wallettemplate/pom.xml | 43 +++++ .../wallettemplate/AlertWindowController.java | 32 ++++ .../BitcoinAddressValidator.java | 45 ++++++ .../main/java/wallettemplate/Controller.java | 152 ++++++++++++++++++ .../src/main/java/wallettemplate/Main.java | 138 ++++++++++++++++ .../wallettemplate/SendMoneyController.java | 66 ++++++++ .../java/wallettemplate/utils/GuiUtils.java | 87 ++++++++++ .../utils/TextFieldValidator.java | 34 ++++ .../wallettemplate/bitcoin_logo_plain.png | Bin 0 -> 44629 bytes .../main/resources/wallettemplate/checkpoints | Bin 0 -> 12021 bytes .../resources/wallettemplate/copy-icon.png | Bin 0 -> 1010 bytes .../main/resources/wallettemplate/main.fxml | 94 +++++++++++ .../resources/wallettemplate/send_money.fxml | 38 +++++ .../resources/wallettemplate/utils/alert.fxml | 77 +++++++++ .../wallettemplate/utils/text-validation.css | 17 ++ 16 files changed, 824 insertions(+) create mode 100644 wallettemplate/pom.xml create mode 100644 wallettemplate/src/main/java/wallettemplate/AlertWindowController.java create mode 100644 wallettemplate/src/main/java/wallettemplate/BitcoinAddressValidator.java create mode 100644 wallettemplate/src/main/java/wallettemplate/Controller.java create mode 100644 wallettemplate/src/main/java/wallettemplate/Main.java create mode 100644 wallettemplate/src/main/java/wallettemplate/SendMoneyController.java create mode 100644 wallettemplate/src/main/java/wallettemplate/utils/GuiUtils.java create mode 100644 wallettemplate/src/main/java/wallettemplate/utils/TextFieldValidator.java create mode 100644 wallettemplate/src/main/resources/wallettemplate/bitcoin_logo_plain.png create mode 100644 wallettemplate/src/main/resources/wallettemplate/checkpoints create mode 100644 wallettemplate/src/main/resources/wallettemplate/copy-icon.png create mode 100644 wallettemplate/src/main/resources/wallettemplate/main.fxml create mode 100644 wallettemplate/src/main/resources/wallettemplate/send_money.fxml create mode 100644 wallettemplate/src/main/resources/wallettemplate/utils/alert.fxml create mode 100644 wallettemplate/src/main/resources/wallettemplate/utils/text-validation.css diff --git a/pom.xml b/pom.xml index b99705c4..214af036 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ core examples tools + wallettemplate bitcoinj Parent diff --git a/wallettemplate/pom.xml b/wallettemplate/pom.xml new file mode 100644 index 00000000..9fe2dc95 --- /dev/null +++ b/wallettemplate/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + org.bitcoinj + wallettemplate + 1.0-SNAPSHOT + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + + + + + + com.google + bitcoinj + 0.11-SNAPSHOT + + + org.slf4j + slf4j-jdk14 + 1.6.4 + + + com.google.guava + guava + 13.0 + + + \ No newline at end of file diff --git a/wallettemplate/src/main/java/wallettemplate/AlertWindowController.java b/wallettemplate/src/main/java/wallettemplate/AlertWindowController.java new file mode 100644 index 00000000..d1654472 --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/AlertWindowController.java @@ -0,0 +1,32 @@ +package wallettemplate; + +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.stage.Stage; + +public class AlertWindowController { + public Label messageLabel; + public Label detailsLabel; + public Button okButton; + public Button cancelButton; + public Button actionButton; + + /** Initialize this alert dialog for information about a crash. */ + public void crashAlert(Stage stage, String crashMessage) { + messageLabel.setText("Unfortunately, we screwed up and the app crashed. Sorry about that!"); + detailsLabel.setText(crashMessage); + + cancelButton.setVisible(false); + actionButton.setVisible(false); + okButton.setOnAction(actionEvent -> stage.close()); + } + + /** Initialize this alert for general information: OK button only, nothing happens on dismissal. */ + public void informational(Stage stage, String message, String details) { + messageLabel.setText(message); + detailsLabel.setText(details); + cancelButton.setVisible(false); + actionButton.setVisible(false); + okButton.setOnAction(actionEvent -> stage.close()); + } +} diff --git a/wallettemplate/src/main/java/wallettemplate/BitcoinAddressValidator.java b/wallettemplate/src/main/java/wallettemplate/BitcoinAddressValidator.java new file mode 100644 index 00000000..22f32c3a --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/BitcoinAddressValidator.java @@ -0,0 +1,45 @@ +package wallettemplate; + +import com.google.bitcoin.core.Address; +import com.google.bitcoin.core.AddressFormatException; +import com.google.bitcoin.core.NetworkParameters; +import javafx.scene.Node; +import javafx.scene.control.TextField; +import wallettemplate.utils.TextFieldValidator; + +/** + * Given a text field, some network params and optionally some nodes, will make the text field an angry red colour + * if the address is invalid for those params, and enable/disable the nodes. + */ +public class BitcoinAddressValidator { + private NetworkParameters params; + private Node[] nodes; + + public BitcoinAddressValidator(NetworkParameters params, TextField field, Node... nodes) { + this.params = params; + this.nodes = nodes; + + // Handle the red highlighting, but don't highlight in red just when the field is empty because that makes + // the example/prompt address hard to read. + new TextFieldValidator(field, text -> text.isEmpty() || testAddr(text)); + // However we do want the buttons to be disabled when empty so we apply a different test there. + field.textProperty().addListener((observableValue, prev, current) -> { + toggleButtons(current); + }); + toggleButtons(field.getText()); + } + + private void toggleButtons(String current) { + boolean valid = testAddr(current); + for (Node n : nodes) n.setDisable(!valid); + } + + private boolean testAddr(String text) { + try { + new Address(params, text); + return true; + } catch (AddressFormatException e) { + return false; + } + } +} diff --git a/wallettemplate/src/main/java/wallettemplate/Controller.java b/wallettemplate/src/main/java/wallettemplate/Controller.java new file mode 100644 index 00000000..aba1202a --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/Controller.java @@ -0,0 +1,152 @@ +package wallettemplate; + +import com.google.bitcoin.core.*; +import com.google.bitcoin.uri.BitcoinURI; +import javafx.animation.*; +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.scene.control.Button; +import javafx.scene.control.*; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.util.Duration; +import wallettemplate.utils.GuiUtils; + +import java.awt.*; +import java.io.IOException; +import java.math.BigInteger; +import java.net.URI; +import java.util.Date; + +import static com.google.common.base.Preconditions.checkState; +import static javafx.application.Platform.isFxApplicationThread; +import static wallettemplate.Main.bitcoin; + +/** + * Gets created auto-magically by FXMLLoader via reflection. The widget fields are set to the GUI controls they're named + * after. This class handles all the updates and event handling for the main UI. + */ +public class Controller { + public ProgressBar syncProgress; + public VBox syncBox; + public HBox controlsBox; + public Label requestMoneyLink; + public Label balance; + public ContextMenu addressMenu; + public HBox addressLabelBox; + public Button sendMoneyOutBtn; + public ImageView copyWidget; + + private Address primaryAddress; + + // Called by FXMLLoader. + public void initialize() { + syncProgress.setProgress(-1); + addressLabelBox.setOpacity(0.0); + Tooltip tooltip = new Tooltip("Copy address to clipboard"); + Tooltip.install(copyWidget, tooltip); + } + + public void onBitcoinSetup() { + bitcoin.wallet().addEventListener(new BalanceUpdater()); + primaryAddress = bitcoin.wallet().getKeys().get(0).toAddress(Main.params); + refreshBalanceLabel(); + } + + public void requestMoney(MouseEvent event) { + // User clicked on the address. + if (event.getButton() == MouseButton.SECONDARY || (event.getButton() == MouseButton.PRIMARY && event.isMetaDown())) { + addressMenu.show(requestMoneyLink, event.getScreenX(), event.getScreenY()); + } else { + String uri = getURI(); + System.out.println("Opening " + uri); + try { + Desktop.getDesktop().browse(URI.create(uri)); + } catch (IOException e) { + // Couldn't open wallet app. + GuiUtils.crashAlert(e.getMessage()); + } + } + } + + private String getURI() { + return BitcoinURI.convertToBitcoinURI(getAddress(), Utils.COIN, Main.APP_NAME, null); + } + + private String getAddress() { + return primaryAddress.toString(); + } + + public void copyWidgetClicked(MouseEvent event) { + copyAddress(null); + } + + public void copyAddress(ActionEvent event) { + // User clicked icon or menu item. + Clipboard clipboard = Clipboard.getSystemClipboard(); + ClipboardContent content = new ClipboardContent(); + content.putString(getAddress()); + content.putHtml(String.format("%s", getURI(), getAddress())); + clipboard.setContent(content); + } + + public void sendMoneyOut(ActionEvent event) { + // Hide this UI and show the send money UI. This UI won't be clickable until the user dismisses send_money. + Main.instance.overlayUI("send_money.fxml"); + } + + public class ProgressBarUpdater extends DownloadListener { + @Override + protected void progress(double pct, int blocksSoFar, Date date) { + super.progress(pct, blocksSoFar, date); + Platform.runLater(() -> syncProgress.setProgress(pct / 100.0)); + } + + @Override + protected void doneDownload() { + super.doneDownload(); + Platform.runLater(Controller.this::readyToGoAnimation); + } + } + + public void readyToGoAnimation() { + // Sync progress bar slides out ... + TranslateTransition leave = new TranslateTransition(Duration.millis(600), syncBox); + leave.setByY(80.0); + // Buttons slide in and clickable address appears simultaneously. + TranslateTransition arrive = new TranslateTransition(Duration.millis(600), controlsBox); + arrive.setToY(0.0); + requestMoneyLink.setText(primaryAddress.toString()); + FadeTransition reveal = new FadeTransition(Duration.millis(500), addressLabelBox); + reveal.setToValue(1.0); + ParallelTransition group = new ParallelTransition(arrive, reveal); + // Slide out happens then slide in/fade happens. + SequentialTransition both = new SequentialTransition(leave, group); + both.setCycleCount(1); + both.setInterpolator(Interpolator.EASE_BOTH); + both.play(); + } + + public ProgressBarUpdater progressBarUpdater() { + return new ProgressBarUpdater(); + } + + public class BalanceUpdater extends AbstractWalletEventListener { + @Override + public void onWalletChanged(Wallet wallet) { + checkState(isFxApplicationThread()); + refreshBalanceLabel(); + } + } + + public void refreshBalanceLabel() { + final BigInteger amount = bitcoin.wallet().getBalance(Wallet.BalanceType.ESTIMATED); + balance.setText(Utils.bitcoinValueToFriendlyString(amount)); + } +} diff --git a/wallettemplate/src/main/java/wallettemplate/Main.java b/wallettemplate/src/main/java/wallettemplate/Main.java new file mode 100644 index 00000000..518e71c4 --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/Main.java @@ -0,0 +1,138 @@ +package wallettemplate; + +import com.google.bitcoin.core.NetworkParameters; +import com.google.bitcoin.kits.WalletAppKit; +import com.google.bitcoin.params.MainNetParams; +import com.google.bitcoin.params.RegTestParams; +import com.google.bitcoin.utils.BriefLogFormatter; +import com.google.bitcoin.utils.Threading; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.layout.Pane; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import wallettemplate.utils.GuiUtils; +import wallettemplate.utils.TextFieldValidator; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +public class Main extends Application { + public static String APP_NAME = "WalletTemplate"; + + public static NetworkParameters params = MainNetParams.get(); + public static WalletAppKit bitcoin; + public static Main instance; + + private StackPane uiStack; + private Pane mainUI; + + @Override + public void start(Stage mainWindow) throws Exception { + instance = this; + try { + init(mainWindow); + } catch (Throwable t) { + GuiUtils.crashAlert(t.getLocalizedMessage()); + } + } + + private void init(Stage mainWindow) throws IOException { + // Load the GUI. The Controller class will be automagically created and wired up. + URL location = getClass().getResource("main.fxml"); + FXMLLoader loader = new FXMLLoader(location); + mainUI = (Pane) loader.load(); + Controller controller = loader.getController(); + // Configure the window with a StackPane so we can overlay things on top of the main UI. + uiStack = new StackPane(mainUI); + mainWindow.setTitle(APP_NAME); + final Scene scene = new Scene(uiStack); + TextFieldValidator.configureScene(scene); // Add CSS that we need. + mainWindow.setScene(scene); + + // 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; + // Create the app kit. It won't do any heavyweight initialization until after we start it. + bitcoin = new WalletAppKit(params, new File("."), APP_NAME); + if (params == RegTestParams.get()) { + bitcoin.connectToLocalHost(); // You should run a regtest mode bitcoind locally. + } else if (params == MainNetParams.get()) { + // Checkpoints are block headers that ship inside our app: for a new user, we pick the last header + // in the checkpoints file and then download the rest from the network. It makes things much faster. + // Checkpoint files are made using the BuildCheckpoints tool and usually we have to download the + // last months worth or more (takes a few seconds). + bitcoin.setCheckpoints(getClass().getResourceAsStream("checkpoints")); + } + + // Now configure and start the appkit. This will take a second or two - we could show a temporary splash screen + // or progress widget to keep the user engaged whilst we initialise, but we don't. + bitcoin.setAutoSave(true) + .setDownloadListener(controller.progressBarUpdater()) + .setBlockingStartup(false) + .startAndWait(); + // Don't make the user wait for confirmations for now, as the intention is they're sending it their own money! + bitcoin.wallet().allowSpendingUnconfirmedTransactions(); + System.out.println(bitcoin.wallet()); + controller.onBitcoinSetup(); + mainWindow.show(); + } + + public class OverlayUI { + Node ui; + Object controller; + + public OverlayUI(Node ui, Object controller) { + this.ui = ui; + this.controller = controller; + } + + public void done() { + GuiUtils.fadeOutAndRemove(ui, uiStack); + GuiUtils.blurIn(mainUI); + this.ui = null; + this.controller = null; + } + } + + /** Loads the FXML file with the given name, blurs out the main UI and puts this one on top. */ + public OverlayUI overlayUI(String name) { + try { + // Load the UI from disk. + URL location = getClass().getResource(name); + FXMLLoader loader = new FXMLLoader(location); + Pane ui = (Pane) loader.load(); + Object controller = loader.getController(); + OverlayUI pair = new OverlayUI(ui, controller); + // Auto-magically set the overlayUi member, if it's there. + try { + controller.getClass().getDeclaredField("overlayUi").set(controller, pair); + } catch (IllegalAccessException | NoSuchFieldException ignored) { + } + GuiUtils.blurOut(mainUI); + uiStack.getChildren().add(ui); + GuiUtils.fadeIn(ui); + return pair; + } catch (IOException e) { + throw new RuntimeException(e); // Can't happen. + } + } + + @Override + public void stop() throws Exception { + bitcoin.stopAndWait(); + super.stop(); + } + + public static void main(String[] args) { + launch(args); + } +} diff --git a/wallettemplate/src/main/java/wallettemplate/SendMoneyController.java b/wallettemplate/src/main/java/wallettemplate/SendMoneyController.java new file mode 100644 index 00000000..eaa69367 --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/SendMoneyController.java @@ -0,0 +1,66 @@ +package wallettemplate; + +import com.google.bitcoin.core.Address; +import com.google.bitcoin.core.AddressFormatException; +import com.google.bitcoin.core.Transaction; +import com.google.bitcoin.core.Wallet; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import wallettemplate.utils.GuiUtils; + +public class SendMoneyController { + public Button sendBtn; + public Button cancelBtn; + public TextField address; + public Label titleLabel; + + public Main.OverlayUI overlayUi; + + // Called by FXMLLoader + public void initialize() { + new BitcoinAddressValidator(Main.params, address, sendBtn); + } + + public void cancel(ActionEvent event) { + overlayUi.done(); + } + + public void send(ActionEvent event) { + try { + Address destination = new Address(Main.params, address.getText()); + Wallet.SendRequest req = Wallet.SendRequest.emptyWallet(destination); + final Wallet.SendResult sendResult = Main.bitcoin.wallet().sendCoins(req); + if (sendResult == null) { + // We couldn't empty the wallet for some reason. TODO: When bitcoinj issue 425 is fixed, be more helpful + GuiUtils.informationalAlert("Could not empty the wallet", + "You may have too little money left in the wallet to make a transaction."); + overlayUi.done(); + return; + } + Futures.addCallback(sendResult.broadcastComplete, new FutureCallback() { + @Override + public void onSuccess(Transaction result) { + // TODO: Fix bitcoinj so these callbacks run on the user thread. + Platform.runLater(overlayUi::done); + } + + @Override + public void onFailure(Throwable t) { + // We died trying to empty the wallet. + Platform.runLater(() -> GuiUtils.crashAlert(t.getMessage())); + } + }); + sendBtn.setDisable(true); + address.setDisable(true); + titleLabel.setText("Broadcasting ..."); + } catch (AddressFormatException e) { + // Cannot happen because we already validated it when the text field changed. + throw new RuntimeException(e); + } + } +} diff --git a/wallettemplate/src/main/java/wallettemplate/utils/GuiUtils.java b/wallettemplate/src/main/java/wallettemplate/utils/GuiUtils.java new file mode 100644 index 00000000..c659e60e --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/utils/GuiUtils.java @@ -0,0 +1,87 @@ +package wallettemplate.utils; + +import javafx.animation.*; +import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.effect.GaussianBlur; +import javafx.scene.layout.Pane; +import javafx.stage.Modality; +import javafx.stage.Stage; +import javafx.util.Duration; +import wallettemplate.AlertWindowController; + +import java.io.IOException; +import java.util.function.BiConsumer; + +public class GuiUtils { + private static void runAlert(BiConsumer setup) { + try { + // JavaFX2 doesn't actually have a standard alert template. Instead the Scene Builder app will create FXML + // files for an alert window for you, and then you customise it as you see fit. I guess it makes sense in + // an odd sort of way. + Stage dialogStage = new Stage(); + dialogStage.initModality(Modality.WINDOW_MODAL); + FXMLLoader loader = new FXMLLoader(GuiUtils.class.getResource("alert.fxml")); + Pane pane = (Pane) loader.load(); + AlertWindowController controller = (AlertWindowController) loader.getController(); + setup.accept(dialogStage, controller); + dialogStage.setScene(new Scene(pane)); + dialogStage.showAndWait(); + } catch (IOException e) { + // We crashed whilst trying to show the alert dialog (this should never happen). Give up! + throw new RuntimeException(e); + } + } + + public static void crashAlert(String alert) { + runAlert((stage, controller) -> controller.crashAlert(stage, alert)); + } + + public static void informationalAlert(String message, String details) { + runAlert((stage, controller) -> controller.informational(stage, message, details)); + } + + private static final int UI_ANIMATION_TIME_MSEC = 350; + + public static void fadeIn(Node ui) { + FadeTransition ft = new FadeTransition(Duration.millis(UI_ANIMATION_TIME_MSEC), ui); + ft.setFromValue(0.0); + ft.setToValue(1.0); + ft.play(); + } + + public static Animation fadeOut(Node ui) { + FadeTransition ft = new FadeTransition(Duration.millis(UI_ANIMATION_TIME_MSEC), ui); + ft.setFromValue(ui.getOpacity()); + ft.setToValue(0.0); + ft.play(); + return ft; + } + + public static Animation fadeOutAndRemove(Node ui, Pane parentPane) { + Animation animation = fadeOut(ui); + animation.setOnFinished(actionEvent -> parentPane.getChildren().remove(ui)); + return animation; + } + + public static void blurOut(Node node) { + GaussianBlur blur = new GaussianBlur(0.0); + node.setEffect(blur); + Timeline timeline = new Timeline(); + KeyValue kv = new KeyValue(blur.radiusProperty(), 10.0); + KeyFrame kf = new KeyFrame(Duration.millis(UI_ANIMATION_TIME_MSEC), kv); + timeline.getKeyFrames().add(kf); + timeline.play(); + } + + public static void blurIn(Node node) { + GaussianBlur blur = (GaussianBlur) node.getEffect(); + Timeline timeline = new Timeline(); + KeyValue kv = new KeyValue(blur.radiusProperty(), 0.0); + KeyFrame kf = new KeyFrame(Duration.millis(UI_ANIMATION_TIME_MSEC), kv); + timeline.getKeyFrames().add(kf); + timeline.setOnFinished(actionEvent -> node.setEffect(null)); + timeline.play(); + } +} diff --git a/wallettemplate/src/main/java/wallettemplate/utils/TextFieldValidator.java b/wallettemplate/src/main/java/wallettemplate/utils/TextFieldValidator.java new file mode 100644 index 00000000..9e484ddc --- /dev/null +++ b/wallettemplate/src/main/java/wallettemplate/utils/TextFieldValidator.java @@ -0,0 +1,34 @@ +package wallettemplate.utils; + +import javafx.scene.Scene; +import javafx.scene.control.TextField; + +import java.util.function.Predicate; + +public class TextFieldValidator { + private boolean valid; + + public TextFieldValidator(TextField textField, Predicate validator) { + this.valid = validator.test(textField.getText()); + apply(textField, valid); + textField.textProperty().addListener((observableValue, prev, current) -> { + boolean nowValid = validator.test(current); + if (nowValid == valid) return; + apply(textField, nowValid); + valid = nowValid; + }); + } + + private static void apply(TextField textField, boolean nowValid) { + if (nowValid) { + textField.getStyleClass().remove("validation_error"); + } else { + textField.getStyleClass().add("validation_error"); + } + } + + public static void configureScene(Scene scene) { + final String file = TextFieldValidator.class.getResource("text-validation.css").toString(); + scene.getStylesheets().add(file); + } +} diff --git a/wallettemplate/src/main/resources/wallettemplate/bitcoin_logo_plain.png b/wallettemplate/src/main/resources/wallettemplate/bitcoin_logo_plain.png new file mode 100644 index 0000000000000000000000000000000000000000..af5ca49da41579506a65c65929c170422773837a GIT binary patch literal 44629 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 literal 0 HcmV?d00001 diff --git a/wallettemplate/src/main/resources/wallettemplate/checkpoints b/wallettemplate/src/main/resources/wallettemplate/checkpoints new file mode 100644 index 0000000000000000000000000000000000000000..a65eccdeaf5d80e39926eeb418ff771186fd7bf1 GIT binary patch literal 12021 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 literal 0 HcmV?d00001 diff --git a/wallettemplate/src/main/resources/wallettemplate/copy-icon.png b/wallettemplate/src/main/resources/wallettemplate/copy-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9efc6f24c22804dc3e78425459bf3ad86c021f GIT binary patch literal 1010 zcmV^8xj$e|1aTFC^ROEUHuAKl#-=C=BPBREi$?4^ zM$WbOa9+?=RaLc)kB|4CO7N_<)}|1EqJRz@8&Mk*s-yYJ%F2$3i3x|~8Rs-28bNz| z`$%nFosAOJNn`~Y4oj+FaB$Fjq^iHn1Yh0mZ*I4{%^;|I{@k!gNn}wR0n-TxY;tmv z=jZ1$T@t0voKEMc-EO~a5WJ|bx9Q-TO-j5?j2V{12NFO*L4hB!Z@@TOrxn<&z`Wkw-7PC>g91d$hDJd!7{W;HXmEM#r zk_b9GI}HUVHkYo3z;}0dVPj*12ZKTKo~Nd!vOpjJ>FMb_CnrZD=<4c{33LUL?_y9P zF>CPq{jj>a3fS`y4u@cFZVt|zISbj@*+8c?B|$+rQWu#Bq^yM+e3@-;Z^PQ!8f>-7SDwD36<78jR}?%lul#Pi+r{_yaS8(%aWdFI}>TCJDy0L#_(67n4#sR$l~ zYghAlMn;BKv~3+2wNe znmdXVS}Yc^gZa+R4x^&4tgP@07te=k@U!Ug{CJC<#f>8ck_0Mh85 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wallettemplate/src/main/resources/wallettemplate/utils/text-validation.css b/wallettemplate/src/main/resources/wallettemplate/utils/text-validation.css new file mode 100644 index 00000000..e9e6425c --- /dev/null +++ b/wallettemplate/src/main/resources/wallettemplate/utils/text-validation.css @@ -0,0 +1,17 @@ +.text-field.validation_error { + -fx-background-color: red, + linear-gradient( + to bottom, + derive(red,70%) 5%, + derive(red,90%) 40% + ); +} + +.text-field.validation_warning { + -fx-background-color: orange, + linear-gradient( + to bottom, + derive(orange,70%) 5%, + derive(orange,90%) 40% + ); +}