Coverage Summary for Class: P2shP2wpkhBtcLockSender (co.rsk.peg.btcLockSender)

Class Class, % Method, % Line, %
P2shP2wpkhBtcLockSender 0% (0/1) 0% (0/5) 0% (0/28)


1 package co.rsk.peg.btcLockSender; 2  3 import co.rsk.bitcoinj.core.Address; 4 import co.rsk.bitcoinj.core.BtcECKey; 5 import co.rsk.bitcoinj.core.BtcTransaction; 6 import co.rsk.bitcoinj.core.Sha256Hash; 7 import co.rsk.core.RskAddress; 8 import org.ethereum.crypto.HashUtil; 9 import org.ethereum.util.ByteUtil; 10  11 public class P2shP2wpkhBtcLockSender implements BtcLockSender { 12  13  private TxSenderAddressType txSenderAddressType; 14  private Address btcAddress; 15  private RskAddress rskAddress; 16  17  public P2shP2wpkhBtcLockSender() { 18  this.txSenderAddressType = TxSenderAddressType.P2SHP2WPKH; 19  } 20  21  @Override 22  public TxSenderAddressType getTxSenderAddressType() { 23  return txSenderAddressType; 24  } 25  26  @Override 27  public Address getBTCAddress() { 28  return this.btcAddress; 29  } 30  31  @Override 32  public RskAddress getRskAddress() { 33  return this.rskAddress; 34  } 35  36  @Override 37  public boolean tryParse(BtcTransaction btcTx) { 38  if (btcTx == null) { 39  return false; 40  } 41  if (!btcTx.hasWitness()) { 42  return false; 43  } 44  if (btcTx.getInput(0).getScriptBytes() == null) { 45  return false; 46  } 47  if (btcTx.getInput(0).getScriptSig().getChunks().size() != 1) { 48  return false; 49  } 50  if (btcTx.getWitness(0).getPushCount() != 2) { 51  return false; 52  } 53  54  byte[] pubKey = btcTx.getWitness(0).getPush(1); 55  // get pubKey from witness 56  BtcECKey key = BtcECKey.fromPublicOnly(btcTx.getWitness(0).getPush(1)); 57  58  if (!key.isCompressed()) { 59  return false; 60  } 61  62  try { 63  // pubkeyhash = hash160(sha256(pubKey)) 64  byte[] keyHash = key.getPubKeyHash(); 65  66  // witnessVersion = 0x00 67  // push20 = 0x14 68  // scriptPubKey = hash160(sha256(witnessVersion push20 pubkeyhash)) 69  byte[] redeemScript = ByteUtil.merge(new byte[]{ 0x00, 0x14}, keyHash); 70  byte[] scriptPubKey = HashUtil.ripemd160(Sha256Hash.hash(redeemScript)); 71  72  this.btcAddress = new Address(btcTx.getParams(), btcTx.getParams().getP2SHHeader(), scriptPubKey); 73  this.rskAddress = new RskAddress(org.ethereum.crypto.ECKey.fromPublicOnly(pubKey).getAddress()); 74  } catch (Exception e) { 75  return false; 76  } 77  78  return true; 79  } 80 }