diff --git a/core/src/main/java/org/bitcoinj/wallet/DerivationPathFactory.java b/core/src/main/java/org/bitcoinj/wallet/DerivationPathFactory.java index ce542d7d6..ef1841a37 100644 --- a/core/src/main/java/org/bitcoinj/wallet/DerivationPathFactory.java +++ b/core/src/main/java/org/bitcoinj/wallet/DerivationPathFactory.java @@ -185,14 +185,15 @@ public ImmutableList masternodeOperatorDerivationPath() { } /** mixed coins derivation path - * m/9'/5'/4' (mainnet) - * m/9'/1'/4' (testnet, devnets) + * m/9'/5'/4'/account' (mainnet) + * m/9'/1'/4'/account (testnet, devnets) */ - public ImmutableList coinJoinDerivationPath() { + public ImmutableList coinJoinDerivationPath(int account) { return ImmutableList.builder() .add(FEATURE_PURPOSE) .add(coinType) .add(new ChildNumber(4, true)) + .add(ChildNumber.ZERO_HARDENED) .build(); } diff --git a/core/src/main/java/org/bitcoinj/wallet/WalletEx.java b/core/src/main/java/org/bitcoinj/wallet/WalletEx.java index fe6b1a0cd..dfcf2b64c 100644 --- a/core/src/main/java/org/bitcoinj/wallet/WalletEx.java +++ b/core/src/main/java/org/bitcoinj/wallet/WalletEx.java @@ -180,8 +180,8 @@ public static WalletEx fromWatchingKeyB58(NetworkParameters params, String watch * Creates a new keychain and activates it using the seed of the active key chain, if the path does not exist. */ @VisibleForTesting - public void initializeCoinJoin() { - getCoinJoin().addKeyChain(getKeyChainSeed(), derivationPathFactory.coinJoinDerivationPath()); + public void initializeCoinJoin(int account) { + getCoinJoin().addKeyChain(getKeyChainSeed(), derivationPathFactory.coinJoinDerivationPath(account)); } public Coin getDenominatedBalance() { @@ -871,6 +871,10 @@ public boolean selectTxDSInsByDenomination(int nDenom, Coin nValueMax, List log.info(" output: {}", output)); + } return nValueTotal.isPositive(); } @@ -950,8 +954,8 @@ List getDenominatedOutputs() { return result; } - public void initializeCoinJoin(@Nullable KeyParameter keyParameter) { - ImmutableList path = DerivationPathFactory.get(getParams()).coinJoinDerivationPath(); + public void initializeCoinJoin(@Nullable KeyParameter keyParameter, int account) { + ImmutableList path = DerivationPathFactory.get(getParams()).coinJoinDerivationPath(account); if (keyParameter != null) { getCoinJoin().addEncryptedKeyChain(getKeyChainSeed(), path, keyParameter); } else { diff --git a/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java b/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java index a7605052e..202ec6310 100644 --- a/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java +++ b/core/src/test/java/org/bitcoinj/coinjoin/CoinJoinSessionTest.java @@ -180,7 +180,7 @@ public void tearDown() { @Ignore public void sessionTest() throws Exception { System.out.println("Session test started..."); - mixingWallet.initializeCoinJoin(); + mixingWallet.initializeCoinJoin(0); CoinJoinClientOptions.reset(); CoinJoinClientOptions.setAmount(Coin.COIN); CoinJoinClientOptions.setEnabled(true); @@ -351,7 +351,7 @@ public void sessionTest() throws Exception { @Test(timeout = 30000) // Exception: test timed out after 100 milliseconds public void sessionTestTwo() throws Exception { System.out.println("Session test started..."); - mixingWallet.initializeCoinJoin(); + mixingWallet.initializeCoinJoin(0); CoinJoinClientOptions.reset(); CoinJoinClientOptions.setAmount(Coin.COIN); CoinJoinClientOptions.setEnabled(true); @@ -595,7 +595,7 @@ private void addBlock() throws PrunedException { @Test public void sessionAttemptWithEmptyWalletTest() throws Exception { - mixingWallet.initializeCoinJoin(); + mixingWallet.initializeCoinJoin(0); CoinJoinClientOptions.reset(); CoinJoinClientOptions.setAmount(Coin.COIN); CoinJoinClientOptions.setEnabled(true); diff --git a/core/src/test/java/org/bitcoinj/coinjoin/TestWithCoinJoinWallet.java b/core/src/test/java/org/bitcoinj/coinjoin/TestWithCoinJoinWallet.java index 91c83d176..7c350aee3 100644 --- a/core/src/test/java/org/bitcoinj/coinjoin/TestWithCoinJoinWallet.java +++ b/core/src/test/java/org/bitcoinj/coinjoin/TestWithCoinJoinWallet.java @@ -61,7 +61,7 @@ public void tearDown() throws Exception { } public void setupWallet() { - walletEx.initializeCoinJoin(); + walletEx.initializeCoinJoin(0); DeterministicKey key = (DeterministicKey) walletEx.getCoinJoin().freshReceiveKey(); txDeposit = new Transaction(UNITTEST); diff --git a/core/src/test/java/org/bitcoinj/wallet/CoinJoinWalletTest.java b/core/src/test/java/org/bitcoinj/wallet/CoinJoinWalletTest.java index 61fa94fb1..6bd99747b 100644 --- a/core/src/test/java/org/bitcoinj/wallet/CoinJoinWalletTest.java +++ b/core/src/test/java/org/bitcoinj/wallet/CoinJoinWalletTest.java @@ -69,7 +69,7 @@ public void setUp() throws UnreadableWalletException { .build(); wallet.addAndActivateHDChain(bip44); - wallet.initializeCoinJoin(); + wallet.initializeCoinJoin(0); wallet.coinjoin.getActiveKeyChain().getKeys(KeyChain.KeyPurpose.RECEIVE_FUNDS, 3000); wallet.addWalletTransaction(new WalletTransaction(WalletTransaction.Pool.SPENT, new Transaction(TESTNET, inputTx))); ArrayList unspentTxList = Lists.newArrayList(); @@ -113,11 +113,12 @@ public void setUp() throws UnreadableWalletException { @Test public void keyTest() { - ECKey key661 = ECKey.fromPublicOnly(HEX.decode("034382c0cd973ee81e6bf63f9f52bf892e451a4b67ca966de4d9974bc295244f77")); + System.out.println(wallet.toString(true, false, true, null)); + ECKey key661 = ECKey.fromPublicOnly(HEX.decode("026097b3f8a2884383df50a9f48f2f5477c871e0c1c54732c8e22a4a9be9803ae5")); ECKey key = (ECKey) wallet.coinjoin.findKeyFromPubKey(key661.getPubKey()); assertNotNull(key); - ECKey key2317 = wallet.findKeyFromPubKeyHash(HEX.decode("f6863a7856dbc547d26f03e6ebb8c3db3eb12f9d"), Script.ScriptType.P2PKH); + ECKey key2317 = wallet.findKeyFromPubKeyHash(HEX.decode("43a51a896f7197cdc539bc65a8f29eddc9571751"), Script.ScriptType.P2PKH); assertNotNull(key2317); } @@ -155,7 +156,7 @@ public void encryptDecryptWalletWithArbitraryPathAndScriptTypeWithCoinJoin() thr .build(); WalletEx encryptedWallet = new WalletEx(DEVNET, keyChainGroup); DeterministicKey keyBip44 = encryptedWallet.currentKey(KeyChain.KeyPurpose.RECEIVE_FUNDS); - encryptedWallet.initializeCoinJoin(); + encryptedWallet.initializeCoinJoin(0); DeterministicKey coinJoinKey = (DeterministicKey) encryptedWallet.coinjoin.currentKey(KeyChain.KeyPurpose.RECEIVE_FUNDS); encryptedWallet.encrypt(PASSWORD1); encryptedWallet.decrypt(PASSWORD1); diff --git a/core/src/test/java/org/bitcoinj/wallet/DerivationPathFactoryTest.java b/core/src/test/java/org/bitcoinj/wallet/DerivationPathFactoryTest.java index 7fdd47b81..f15ba0d5b 100644 --- a/core/src/test/java/org/bitcoinj/wallet/DerivationPathFactoryTest.java +++ b/core/src/test/java/org/bitcoinj/wallet/DerivationPathFactoryTest.java @@ -60,9 +60,9 @@ public class DerivationPathFactoryTest { // m / 9' / 5' / 3' / 1' - Masternode Voting Path public static final ImmutableList COINJOIN_PATH = ImmutableList.of(new ChildNumber(9, true), - ChildNumber.FIVE_HARDENED, new ChildNumber(4, true)); + ChildNumber.FIVE_HARDENED, new ChildNumber(4, true), ChildNumber.ZERO_HARDENED); public static final ImmutableList COINJOIN_PATH_TESTNET = ImmutableList.of(new ChildNumber(9, true), - ChildNumber.ONE_HARDENED, new ChildNumber(4, true)); + ChildNumber.ONE_HARDENED, new ChildNumber(4, true), ChildNumber.ZERO_HARDENED); @Test public void validateMainNet() { @@ -82,7 +82,7 @@ public void validateMainNet() { assertEquals(BLOCKCHAIN_IDENTITY_FUNDING_PATH, factory.blockchainIdentityRegistrationFundingDerivationPath()); // coinjoin - assertEquals(COINJOIN_PATH, factory.coinJoinDerivationPath()); + assertEquals(COINJOIN_PATH, factory.coinJoinDerivationPath(0)); } @Test @@ -103,6 +103,6 @@ public void validateTestNet() { assertEquals(BLOCKCHAIN_IDENTITY_FUNDING_PATH_TESTNET, factory.blockchainIdentityRegistrationFundingDerivationPath()); // coinjoin - assertEquals(COINJOIN_PATH_TESTNET, factory.coinJoinDerivationPath()); + assertEquals(COINJOIN_PATH_TESTNET, factory.coinJoinDerivationPath(0)); } } diff --git a/tools/src/main/java/org/bitcoinj/tools/WalletTool.java b/tools/src/main/java/org/bitcoinj/tools/WalletTool.java index 23bc1f508..bf4955669 100644 --- a/tools/src/main/java/org/bitcoinj/tools/WalletTool.java +++ b/tools/src/main/java/org/bitcoinj/tools/WalletTool.java @@ -1425,7 +1425,7 @@ private static void createWallet(OptionSet options, NetworkParameters params, Fi throw new RuntimeException(e); } wallet = WalletEx.fromSeed(params, seed, outputScriptType); - wallet.initializeCoinJoin(); + wallet.initializeCoinJoin(0); } else if (options.has(watchFlag)) { wallet = WalletEx.fromWatchingKeyB58(params, options.valueOf(watchFlag), creationTimeSecs); } else { @@ -1634,7 +1634,7 @@ private static void setCreationTime() { } private static void mix() { - wallet.getCoinJoin().addKeyChain(wallet.getKeyChainSeed(), DerivationPathFactory.get(wallet.getParams()).coinJoinDerivationPath()); + wallet.getCoinJoin().addKeyChain(wallet.getKeyChainSeed(), DerivationPathFactory.get(wallet.getParams()).coinJoinDerivationPath(0)); syncChain(); // set defaults CoinJoinReporter reporter = new CoinJoinReporter(params);