From 9a72fb8f77660cc35bd65d4ec4de3c9f73074e33 Mon Sep 17 00:00:00 2001 From: Aelita4 Date: Mon, 23 Jan 2023 00:29:46 +0100 Subject: [PATCH] Make buttons in GUI work --- .../java/pl/mikorosa/dziecoin/Blockchain.java | 1 + src/main/java/pl/mikorosa/dziecoin/Main.java | 7 +- .../pl/mikorosa/dziecoin/gui/MainFrame.java | 140 +++++++++++++++++- 3 files changed, 144 insertions(+), 4 deletions(-) diff --git a/src/main/java/pl/mikorosa/dziecoin/Blockchain.java b/src/main/java/pl/mikorosa/dziecoin/Blockchain.java index ab21fb0..c33520e 100644 --- a/src/main/java/pl/mikorosa/dziecoin/Blockchain.java +++ b/src/main/java/pl/mikorosa/dziecoin/Blockchain.java @@ -69,6 +69,7 @@ public class Blockchain { } blocks.add(block); length++; + if(length != 1 && Main.mainFrame != null) Main.mainFrame.onNewBlockUpdate(); } public int getAddressBalance(String walletAddress) { diff --git a/src/main/java/pl/mikorosa/dziecoin/Main.java b/src/main/java/pl/mikorosa/dziecoin/Main.java index 1d2dcc6..7294f55 100644 --- a/src/main/java/pl/mikorosa/dziecoin/Main.java +++ b/src/main/java/pl/mikorosa/dziecoin/Main.java @@ -9,6 +9,7 @@ import java.util.List; public class Main { public static int difficulty; public static Blockchain blockchain; + public static MainFrame mainFrame; public static DatabaseConnection db; public static void main(String[] args) { @@ -25,6 +26,9 @@ public class Main { difficulty = 4; blockchain = new Blockchain(w1.getAddress()); + mainFrame = new MainFrame(); + mainFrame.setVisible(true); + NFT n1 = new NFT(w1.getAddress(), "licencja na wozek widlowy"); List t1 = new ArrayList<>(); @@ -66,8 +70,5 @@ public class Main { System.out.println("Wallet 1: " + blockchain.getAddressBalance(w1.getAddress())); System.out.println("Wallet 2: " + blockchain.getAddressBalance(w2.getAddress())); System.out.println("Wallet 3: " + blockchain.getAddressBalance(w3.getAddress())); - - MainFrame mf = new MainFrame(); - mf.setVisible(true); } } \ No newline at end of file diff --git a/src/main/java/pl/mikorosa/dziecoin/gui/MainFrame.java b/src/main/java/pl/mikorosa/dziecoin/gui/MainFrame.java index 51b80c7..3cfce20 100644 --- a/src/main/java/pl/mikorosa/dziecoin/gui/MainFrame.java +++ b/src/main/java/pl/mikorosa/dziecoin/gui/MainFrame.java @@ -78,26 +78,145 @@ public class MainFrame extends JFrame { mineBlockTree.setModel(model); sendSubmit.addActionListener(e -> { + String sendTo = recipient.getText(); + int howMuch; + if(sendTo.isEmpty()) { + JOptionPane.showMessageDialog(null, "Input correct wallet address"); + return; + } + try { + howMuch = Integer.parseInt(amountToSend.getText()); + if(howMuch <= 0) throw new NumberFormatException("Value cannot be lower or equal to 0"); + } catch(NumberFormatException er) { + JOptionPane.showMessageDialog(null, "Input correct amount greater than 0"); + return; + } + if(bc.getAddressBalance(addr) - howMuch < 0 || howMuchLeftToSpend - howMuch < 0) { + JOptionPane.showMessageDialog(null, "Transaction reverted, not enough funds"); + return; + } + DefaultMutableTreeNode a = new DefaultMutableTreeNode("Transaction"); + transactions.add(new Transaction(addr, sendTo, howMuch)); + + a.add(new DefaultMutableTreeNode("Sender: " + addr)); + a.add(new DefaultMutableTreeNode("Recipient: " + sendTo)); + a.add(new DefaultMutableTreeNode("Amount: " + howMuch)); + + rootMineBlock.add(a); + DefaultTreeModel model14 = new DefaultTreeModel(rootMineBlock); + mineBlockTree.setModel(model14); + JOptionPane.showMessageDialog(null, "Transaction created, mine block to add it to blockchain"); + howMuchLeftToSpend -= howMuch; + mineBlockButton.setEnabled(true); + clearButton.setEnabled(true); + mineBlockButton.setText("Mine block"); }); validateChainButton.addActionListener(e -> { + Block.VerifyCodes status = bc.validateChain(); + if(status == Block.VerifyCodes.SUCCESS) JOptionPane.showMessageDialog(null, "Chain is valid", "Verification", JOptionPane.INFORMATION_MESSAGE); + else if(status == Block.VerifyCodes.HASH_MISMATCH) JOptionPane.showMessageDialog(null, "Hash mismatch found", "Verification", JOptionPane.ERROR_MESSAGE); + else if(status == Block.VerifyCodes.INVALID_POW_SIGNATURE) JOptionPane.showMessageDialog(null, "Invalid proof of work signature found", "Verification", JOptionPane.ERROR_MESSAGE); + else if(status == Block.VerifyCodes.INVALID_BLOCK_HASH) JOptionPane.showMessageDialog(null, "Invalid block hash found", "Verification", JOptionPane.ERROR_MESSAGE); }); - payForTuitionButton.addActionListener(e -> { + int input = JOptionPane.showConfirmDialog(null, "6 DC will be sent to pay tuition\nAre you sure?", "Payment Confirmation", JOptionPane.YES_NO_OPTION); + if(input == JOptionPane.YES_OPTION) { + if(bc.getAddressBalance(addr) - 6 < 0 || howMuchLeftToSpend - 6 < 0) JOptionPane.showMessageDialog(null, "Transaction reverted, not enough funds"); + else { + DefaultMutableTreeNode a = new DefaultMutableTreeNode("Transaction"); + a.add(new DefaultMutableTreeNode("Sender: " + addr)); + a.add(new DefaultMutableTreeNode("Recipient: wsiz")); + a.add(new DefaultMutableTreeNode("Amount: 6")); + + rootMineBlock.add(a); + DefaultTreeModel model13 = new DefaultTreeModel(rootMineBlock); + mineBlockTree.setModel(model13); + + transactions.add(new Transaction(addr, "wsiz", 6)); + + JOptionPane.showMessageDialog(null, "Transaction created, mine block to add it to blockchain"); + howMuchLeftToSpend -= 6; + mineBlockButton.setEnabled(true); + clearButton.setEnabled(true); + mineBlockButton.setText("Mine block"); + } + } }); payForAdvanceButton.addActionListener(e -> { + int input = JOptionPane.showConfirmDialog(null, "1 DC will be sent to pay advance\nAre you sure?", "Payment Confirmation", JOptionPane.YES_NO_OPTION); + if(input == JOptionPane.YES_OPTION) { + if(bc.getAddressBalance(addr) - 1 < 0 || howMuchLeftToSpend - 1 < 0) JOptionPane.showMessageDialog(null, "Transaction reverted, not enough funds"); + else { + DefaultMutableTreeNode a = new DefaultMutableTreeNode("Transaction"); + a.add(new DefaultMutableTreeNode("Sender: " + addr)); + a.add(new DefaultMutableTreeNode("Recipient: wsiz")); + a.add(new DefaultMutableTreeNode("Amount: 1")); + + rootMineBlock.add(a); + DefaultTreeModel model12 = new DefaultTreeModel(rootMineBlock); + mineBlockTree.setModel(model12); + + transactions.add(new Transaction(addr, "wsiz", 1)); + + JOptionPane.showMessageDialog(null, "Transaction created, mine block to add it to blockchain"); + howMuchLeftToSpend -= 1; + mineBlockButton.setEnabled(true); + clearButton.setEnabled(true); + mineBlockButton.setText("Mine block"); + } + } }); mineBlockButton.addActionListener(e -> { + mineBlockButton.setEnabled(false); + clearButton.setEnabled(false); + Block block = new Block(bc.getLatestBlock().getHash(), bc.getLength() + 1, transactions); + for (NFT nft : nfts) { + block.addNFT(nft); + } + + rootMineBlock.removeAllChildren(); + mineBlockButton.setText("Mining, please wait..."); + block.mineBlock(); + mineBlockButton.setText("Mine block"); + JOptionPane.showMessageDialog(null, "Block mined successfully"); + + try { + bc.addBlock(block); + } catch (BlockchainIntegrityException er) { + JOptionPane.showMessageDialog(null, "Unable to add a block: " + er.getMessage(), "Fatal error", JOptionPane.ERROR_MESSAGE); + return; + } + + transactions.clear(); + + howMuchLeftToSpend = bc.getAddressBalance(addr); + + rootMineBlock.removeAllChildren(); + DefaultTreeModel model1 = new DefaultTreeModel(rootMineBlock); + mineBlockTree.setModel(model1); }); clearButton.addActionListener(e -> { + int input = JOptionPane.showConfirmDialog(null, "All pending transactions will be cancelled\nAre you sure?", "Clear Confirmation", JOptionPane.YES_NO_OPTION); + if(input == JOptionPane.YES_OPTION) { + mineBlockButton.setEnabled(false); + clearButton.setEnabled(false); + transactions.clear(); + + howMuchLeftToSpend = bc.getAddressBalance(addr); + + rootMineBlock.removeAllChildren(); + DefaultTreeModel model1 = new DefaultTreeModel(rootMineBlock); + mineBlockTree.setModel(model1); + } }); exportButton.addActionListener(e -> { @@ -105,7 +224,26 @@ public class MainFrame extends JFrame { }); createMintNFTButton.addActionListener(e -> { + String input = JOptionPane.showInputDialog("Input data for NFT: "); + if(input != null && !input.isEmpty()) { + NFT n = new NFT(addr, input); + nfts.add(n); + DefaultMutableTreeNode a = new DefaultMutableTreeNode("NFT"); + + a.add(new DefaultMutableTreeNode("Contract: " + n.getContract())); + a.add(new DefaultMutableTreeNode("Owner: " + addr)); + a.add(new DefaultMutableTreeNode("Data: " + input)); + + rootMineBlock.add(a); + DefaultTreeModel model13 = new DefaultTreeModel(rootMineBlock); + mineBlockTree.setModel(model13); + + JOptionPane.showMessageDialog(null, "NFT minted, mine block to add it to blockchain"); + mineBlockButton.setEnabled(true); + clearButton.setEnabled(true); + mineBlockButton.setText("Mine block"); + } }); }