Coverage Summary for Class: PeginInstructionsVersion1 (co.rsk.peg.pegininstructions)
Class |
Class, %
|
Method, %
|
Line, %
|
PeginInstructionsVersion1 |
0%
(0/1)
|
0%
(0/5)
|
0%
(0/24)
|
1 package co.rsk.peg.pegininstructions;
2
3 import co.rsk.bitcoinj.core.Address;
4 import co.rsk.bitcoinj.core.NetworkParameters;
5 import java.util.Arrays;
6 import java.util.Optional;
7 import org.ethereum.util.ByteUtil;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10
11 public class PeginInstructionsVersion1 extends PeginInstructionsBase {
12 private static final Logger logger = LoggerFactory.getLogger(PeginInstructionsVersion1.class);
13 private static final int P2PKH_ADDRESS_TYPE = 1;
14 private static final int P2SH_ADDRESS_TYPE = 2;
15
16 private final NetworkParameters params;
17 private Optional<Address> btcRefundAddress;
18
19 public PeginInstructionsVersion1(NetworkParameters params) {
20 super(1);
21 this.params = params;
22 }
23
24 @Override
25 protected void validateDataLength(byte[] data) throws PeginInstructionsParseException {
26 if (data.length != 25 && data.length != 46) {
27 String message = String.format("[validateDataLength] Invalid data length. Expected 22 or 43 bytes, received %d", data.length);
28 logger.debug(message);
29 throw new PeginInstructionsParseException(message);
30 }
31 }
32
33 @Override
34 protected void parseAdditionalData(byte[] data) throws PeginInstructionsParseException {
35 if (data.length == 25) {
36 this.btcRefundAddress = Optional.empty();
37 return;
38 }
39
40 byte[] btcRefundAddressTypeBytes = Arrays.copyOfRange(data, 25, 26);
41 int btcRefundAddressType = ByteUtil.byteArrayToInt(btcRefundAddressTypeBytes);
42 byte[] hash = Arrays.copyOfRange(data, 26, data.length);
43
44 Address parsedBtcRefundAddress;
45
46 switch (btcRefundAddressType) {
47 case P2PKH_ADDRESS_TYPE:
48 // Uses pubKeyHash
49 parsedBtcRefundAddress = new Address(this.params, hash);
50 logger.debug("[parseAdditionalData] Obtained P2PKH BTC address: {}",parsedBtcRefundAddress);
51 break;
52 case P2SH_ADDRESS_TYPE:
53 // Uses scriptPubKeyHash
54 parsedBtcRefundAddress = new Address(this.params, this.params.getP2SHHeader(), hash);
55 logger.debug("[parseAdditionalData] Obtained P2SH BTC address: {}",parsedBtcRefundAddress);
56 break;
57 default:
58 String message = String.format("[parseAdditionalData] Invalid btc address type: %d", btcRefundAddressType);
59 logger.debug(message);
60 throw new PeginInstructionsParseException(message);
61 }
62
63 this.btcRefundAddress = Optional.of(parsedBtcRefundAddress);
64 }
65
66 public Optional<Address> getBtcRefundAddress() {
67 return this.btcRefundAddress;
68 }
69 }