public BitAddress getFreshReceiveAddress(boolean isManualAddressManagement) throws Bip44KeyLookAheadExceededException { lock.lock(); try { BitAddress newAddress = null; BitAddress freshAddress = getFreshReceiveAddress(); if (isManualAddressManagement) { newAddress = getLastUsedAddress(RECEIVE_FUNDS); } if (newAddress == null) { newAddress = freshAddress; } return newAddress; } finally { lock.unlock(); walletSaveNow(); } }
private void createAddress(WalletPocketHD account, @Nullable String newLabel) { if (account.canCreateFreshReceiveAddress()) { try { AbstractAddress newAddress = account.getFreshReceiveAddress( app.getConfiguration().isManualAddressManagement()); if (newLabel != null && !newLabel.isEmpty()) { final Uri uri = AddressBookProvider.contentUri(getActivity().getPackageName(), account.getCoinType()) .buildUpon().appendPath(newAddress.toString()).build(); final ContentValues values = new ContentValues(); values.put(AddressBookProvider.KEY_LABEL, newLabel); if (resolver != null) resolver.insert(uri, values); } } catch (Bip44KeyLookAheadExceededException e) { // Should not happen as we already checked if we can create a new address Toast.makeText(getActivity(), R.string.too_many_unused_addresses, Toast.LENGTH_LONG).show(); } } else { Toast.makeText(getContext(), R.string.too_many_unused_addresses, Toast.LENGTH_LONG).show(); } } }
@Test public void issuedKeys() throws Bip44KeyLookAheadExceededException { List<BitAddress> issuedAddresses = new ArrayList<>(); assertEquals(0, pocket.getIssuedReceiveAddresses().size()); assertEquals(0, pocket.keys.getNumIssuedExternalKeys()); issuedAddresses.add(0, pocket.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS)); BitAddress freshAddress = pocket.getFreshReceiveAddress(); assertEquals(freshAddress, pocket.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS)); assertEquals(1, pocket.getIssuedReceiveAddresses().size()); assertEquals(1, pocket.keys.getNumIssuedExternalKeys()); assertEquals(issuedAddresses, pocket.getIssuedReceiveAddresses()); issuedAddresses.add(0, pocket.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS)); freshAddress = pocket.getFreshReceiveAddress(); assertEquals(freshAddress, pocket.currentAddress(KeyChain.KeyPurpose.RECEIVE_FUNDS)); assertEquals(2, pocket.getIssuedReceiveAddresses().size()); assertEquals(2, pocket.keys.getNumIssuedExternalKeys()); assertEquals(issuedAddresses, pocket.getIssuedReceiveAddresses()); }
@Test public void issuedKeysLimit2() throws Exception { assertTrue(pocket.canCreateFreshReceiveAddress()); try { for (int i = 0; i < 100; i++) { pocket.getFreshReceiveAddress(); } } catch (Bip44KeyLookAheadExceededException e) { assertFalse(pocket.canCreateFreshReceiveAddress()); // We haven't used any key so the total must be 20 - 1 (the unused key) assertEquals(19, pocket.getNumberIssuedReceiveAddresses()); assertEquals(19, pocket.getIssuedReceiveAddresses().size()); } }
try { for (int i = 0; i < 100; i++) { pocket.getFreshReceiveAddress(); try { for (int i = 0; i < 100; i++) { pocket.getFreshReceiveAddress();
tx.addOutput(VPN.oneCoin().toCoin(), account.getFreshReceiveAddress()); account.addNewTransactionIfNeeded(tx); WalletPocketHD newAccount = testWalletSerializationForCoin(account); tx.setTime(0x99999999); tx.setExtraBytes(new byte[0]); tx.addOutput(VPN.oneCoin().toCoin(), account.getFreshReceiveAddress()); account.addNewTransactionIfNeeded(tx); newAccount = testWalletSerializationForCoin(account); byte[] bytes = {0x1, 0x2, 0x3}; tx.setExtraBytes(bytes); tx.addOutput(VPN.oneCoin().toCoin(), account.getFreshReceiveAddress()); account.addNewTransactionIfNeeded(tx); newAccount = testWalletSerializationForCoin(account);