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 }