package com.greenaddress.greenbits.wallets; import com.greenaddress.greenapi.HDKey; import com.greenaddress.greenapi.HWWallet; import com.greenaddress.greenapi.Network; import com.greenaddress.greenapi.Output; import com.greenaddress.greenapi.PreparedTransaction; import com.satoshilabs.trezor.Trezor; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Transaction; import org.bitcoinj.crypto.DeterministicKey; import org.bitcoinj.params.MainNetParams; import java.util.LinkedList; import java.util.List; public class TrezorHWWallet extends HWWallet { private final Trezor trezor; private final List<Integer> addrn; public TrezorHWWallet(final Trezor t) { trezor = t; addrn = new LinkedList<>(); } private TrezorHWWallet(final TrezorHWWallet parent, final Integer childNumber) { trezor = parent.trezor; addrn = new LinkedList<>(parent.addrn); addrn.add(childNumber); } @Override protected HWWallet derive(final Integer childNumber) { return new TrezorHWWallet(this, childNumber); } @Override protected ECKey.ECDSASignature signMessage(final String message) { final Integer[] intArray = new Integer[addrn.size()]; return trezor.MessageSignMessage(addrn.toArray(intArray), message); } @Override public DeterministicKey getPubKey() { final Integer[] intArray = new Integer[addrn.size()]; final String[] xpub = trezor.MessageGetPublicKey(addrn.toArray(intArray)).split("%", -1); return HDKey.createMasterKey(xpub[xpub.length - 4], xpub[xpub.length - 2]); } @Override public List<byte[]> signTransaction(final PreparedTransaction ptx) { final boolean isMainnet = Network.NETWORK.getId().equals(MainNetParams.ID_MAINNET); return trezor.MessageSignTx(ptx, isMainnet ? "Bitcoin": "Testnet"); } @Override public List<byte[]> signTransaction(final Transaction tx, final PreparedTransaction ptx, final List<Output> prevOuts) { ptx.mDecoded = tx; // TODO: remove from PreparedTransaction ptx.mPrevOutputs = prevOuts; // TODO: remove this argument since it's part of ptx return signTransaction(ptx); } @Override public Object[] getChallengeArguments() { return getChallengeArguments(true); } }