package com.greenaddress.greenapi; import android.util.SparseArray; import org.bitcoinj.crypto.ChildNumber; import org.bitcoinj.crypto.DeterministicKey; import org.bitcoinj.crypto.HDKeyDerivation; import java.util.ArrayList; import java.util.Map; public class HDClientKey { private static final SparseArray<DeterministicKey> mClientKeys = new SparseArray<>(); // // Temporary methods for use while converting from DeterministicKey private static DeterministicKey deriveChildKey(final DeterministicKey parent, final Integer childNum) { return HDKeyDerivation.deriveChildKey(parent, new ChildNumber(childNum)); } public static DeterministicKey getMyPublicKey(final int subAccount, final Integer pointer) { final DeterministicKey ret = mClientKeys.get(subAccount); if (pointer == null) return ret; return deriveChildKey(deriveChildKey(ret, HDKey.BRANCH_REGULAR), pointer); // Child } public static void resetCache(final ArrayList<Map<String, Object>> subAccounts, final ISigningWallet hdParent) { synchronized (mClientKeys) { mClientKeys.clear(); if (hdParent == null) return; mClientKeys.put(0, hdParent.getSubAccountPublicKey(0)); for (final Map<String, Object> subaccount : subAccounts) { final DeterministicKey key = hdParent.getSubAccountPublicKey((Integer) subaccount.get("pointer")); mClientKeys.put((Integer) subaccount.get("pointer"), key); } } } }