Coverage Summary for Class: PeginInformation (co.rsk.peg)
Class |
Class, %
|
Method, %
|
Line, %
|
PeginInformation |
0%
(0/1)
|
0%
(0/11)
|
0%
(0/52)
|
1 package co.rsk.peg;
2
3 import co.rsk.bitcoinj.core.Address;
4 import co.rsk.bitcoinj.core.BtcTransaction;
5 import co.rsk.core.RskAddress;
6 import co.rsk.peg.btcLockSender.BtcLockSender;
7 import co.rsk.peg.btcLockSender.BtcLockSender.TxSenderAddressType;
8 import co.rsk.peg.btcLockSender.BtcLockSenderProvider;
9 import co.rsk.peg.pegininstructions.PeginInstructions;
10 import co.rsk.peg.pegininstructions.PeginInstructionsException;
11 import co.rsk.peg.pegininstructions.PeginInstructionsProvider;
12 import co.rsk.peg.pegininstructions.PeginInstructionsVersion1;
13 import java.util.Optional;
14 import org.ethereum.config.blockchain.upgrades.ActivationConfig;
15 import org.ethereum.config.blockchain.upgrades.ConsensusRule;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 public class PeginInformation {
20
21 private static final Logger logger = LoggerFactory.getLogger(PeginInformation.class);
22
23 private final BtcLockSenderProvider btcLockSenderProvider;
24 private final PeginInstructionsProvider peginInstructionsProvider;
25 private final ActivationConfig.ForBlock activations;
26
27 private int protocolVersion;
28 private RskAddress rskDestinationAddress;
29 private Address btcRefundAddress;
30 private Address senderBtcAddress;
31 private TxSenderAddressType senderBtcAddressType;
32
33 public PeginInformation(
34 BtcLockSenderProvider btcLockSenderProvider,
35 PeginInstructionsProvider peginInstructionsProvider,
36 ActivationConfig.ForBlock activations) {
37 this.btcLockSenderProvider = btcLockSenderProvider;
38 this.peginInstructionsProvider = peginInstructionsProvider;
39 this.activations = activations;
40 this.protocolVersion = -1; // Set an invalid value by default
41 this.senderBtcAddressType = TxSenderAddressType.UNKNOWN;
42 }
43
44 public int getProtocolVersion() {
45 return protocolVersion;
46 }
47
48 public RskAddress getRskDestinationAddress() {
49 return this.rskDestinationAddress;
50 }
51
52 public Address getBtcRefundAddress() {
53 return this.btcRefundAddress;
54 }
55
56 public Address getSenderBtcAddress() {
57 return this.senderBtcAddress;
58 }
59
60 public TxSenderAddressType getSenderBtcAddressType() {
61 return this.senderBtcAddressType;
62 }
63
64 public void parse(BtcTransaction btcTx) throws PeginInstructionsException {
65 logger.trace("[parse] Trying to parse peg-in information from btc tx {}", btcTx.getHash());
66
67 // Get information from tx sender first
68 Optional<BtcLockSender> btcLockSenderOptional = btcLockSenderProvider.tryGetBtcLockSender(btcTx);
69 if (btcLockSenderOptional.isPresent()) {
70 BtcLockSender btcLockSender = btcLockSenderOptional.get();
71 parseFromBtcLockSender(btcLockSender);
72 }
73
74 // If HF is active and peg-in instructions were provided then override the info obtained from BtcLockSender
75 Optional<PeginInstructions> peginInstructionsOptional = Optional.empty();
76 if (activations.isActive(ConsensusRule.RSKIP170)) {
77 peginInstructionsOptional = peginInstructionsProvider.buildPeginInstructions(btcTx);
78 if (peginInstructionsOptional.isPresent()) {
79 PeginInstructions peginInstructions = peginInstructionsOptional.get();
80 parseFromPeginInstructions(peginInstructions);
81 }
82 }
83
84 // If BtcLockSender could not be parsed and peg-in instructions were not provided, then this tx can't be processed
85 if(!btcLockSenderOptional.isPresent() && !peginInstructionsOptional.isPresent()) {
86 String message = String.format("Could not get peg-in information for tx %s", btcTx.getHash());
87 logger.warn("[parse] {}", message);
88 throw new PeginInstructionsException(message);
89 }
90 }
91
92 private void parseFromBtcLockSender(BtcLockSender btcLockSender) {
93 this.protocolVersion = 0;
94 this.rskDestinationAddress = btcLockSender.getRskAddress();
95 this.btcRefundAddress = btcLockSender.getBTCAddress();
96 this.senderBtcAddress = btcLockSender.getBTCAddress();
97 this.senderBtcAddressType = btcLockSender.getTxSenderAddressType();
98
99 logger.trace("[parseFromBtcLockSender] Protocol version: {}", this.protocolVersion);
100 logger.trace("[parseFromBtcLockSender] RSK destination address: {}", btcLockSender.getRskAddress());
101 logger.trace("[parseFromBtcLockSender] BTC refund address: {}", btcLockSender.getBTCAddress());
102 logger.trace("[parseFromBtcLockSender] Sender BTC address: {}", btcLockSender.getBTCAddress());
103 logger.trace("[parseFromBtcLockSender] Sender BTC address type: {}", btcLockSender.getTxSenderAddressType());
104 }
105
106 private void parseFromPeginInstructions(PeginInstructions peginInstructions) throws PeginInstructionsException {
107 this.protocolVersion = peginInstructions.getProtocolVersion();
108 this.rskDestinationAddress = peginInstructions.getRskDestinationAddress();
109 logger.trace("[parseFromPeginInstructions] Protocol version: {}", peginInstructions.getProtocolVersion());
110 logger.trace("[parseFromPeginInstructions] RSK destination address: {}", peginInstructions.getRskDestinationAddress());
111
112 switch (protocolVersion) {
113 case 1:
114 PeginInstructionsVersion1 peginInstructionsV1 = (PeginInstructionsVersion1) peginInstructions;
115 parseFromPeginInstructionsVersion1(peginInstructionsV1);
116 break;
117 default:
118 String message = String.format("Invalid protocol version: %d", protocolVersion);
119 logger.warn("[parseFromPeginInstructions] {}", message);
120 throw new PeginInstructionsException(message);
121 }
122 }
123
124 private void parseFromPeginInstructionsVersion1(PeginInstructionsVersion1 peginInstructions) {
125 Optional<Address> btcRefundAddressOptional = peginInstructions.getBtcRefundAddress();
126 if (btcRefundAddressOptional.isPresent()) {
127 this.btcRefundAddress = btcRefundAddressOptional.get();
128 logger.trace("[parseFromPeginInstructionsVersion1] BTC refund address: {}", btcRefundAddressOptional.get());
129 }
130 }
131 }