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 }