Skip to content

Commit 8093f04

Browse files
authored
Merge branch 'master' into fmacleal/superevent-blockheader-extension
2 parents f3b8977 + 0e7d4bb commit 8093f04

File tree

52 files changed

+7528
-633
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+7528
-633
lines changed

rskj-core/src/main/java/co/rsk/core/RskAddress.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class RskAddress {
4343
public static final int LENGTH_IN_BYTES = 20;
4444

4545
private static final RskAddress NULL_ADDRESS = new RskAddress();
46+
//
47+
public static final RskAddress ZERO_ADDRESS = new RskAddress("0000000000000000000000000000000000000000");
4648

4749
/**
4850
* This compares using the lexicographical order of the sender unsigned bytes.

rskj-core/src/main/java/co/rsk/peg/Bridge.java

Lines changed: 103 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,40 @@
2323
import co.rsk.bitcoinj.core.*;
2424
import co.rsk.bitcoinj.script.Script;
2525
import co.rsk.bitcoinj.store.BlockStoreException;
26-
import co.rsk.core.types.bytes.Bytes;
27-
import co.rsk.peg.constants.BridgeConstants;
2826
import co.rsk.core.RskAddress;
27+
import co.rsk.core.types.bytes.Bytes;
2928
import co.rsk.crypto.Keccak256;
3029
import co.rsk.panic.PanicProcessor;
30+
import co.rsk.peg.BridgeMethods.AuthorizerProvider;
3131
import co.rsk.peg.BridgeMethods.BridgeMethodExecutor;
32-
import co.rsk.peg.feeperkb.FeePerKbResponseCode;
33-
import co.rsk.peg.lockingcap.LockingCapIllegalArgumentException;
34-
import co.rsk.peg.vote.ABICallSpec;
3532
import co.rsk.peg.bitcoin.MerkleBranch;
33+
import co.rsk.peg.constants.BridgeConstants;
3634
import co.rsk.peg.federation.Federation;
3735
import co.rsk.peg.federation.FederationChangeResponseCode;
3836
import co.rsk.peg.federation.FederationMember;
37+
import co.rsk.peg.feeperkb.FeePerKbResponseCode;
3938
import co.rsk.peg.flyover.FlyoverTxResponseCodes;
39+
import co.rsk.peg.lockingcap.LockingCapIllegalArgumentException;
4040
import co.rsk.peg.utils.BtcTransactionFormatUtils;
41+
import co.rsk.peg.vote.ABICallSpec;
42+
import co.rsk.peg.vote.AddressBasedAuthorizer;
4143
import co.rsk.peg.whitelist.LockWhitelistEntry;
4244
import co.rsk.peg.whitelist.OneOffWhiteListEntry;
4345
import co.rsk.peg.whitelist.WhitelistResponseCode;
4446
import co.rsk.rpc.modules.trace.ProgramSubtrace;
4547
import com.google.common.annotations.VisibleForTesting;
48+
import java.io.IOException;
49+
import java.math.BigInteger;
50+
import java.time.Instant;
51+
import java.util.*;
52+
import java.util.function.BiFunction;
53+
import java.util.stream.Collectors;
4654
import org.ethereum.config.Constants;
4755
import org.ethereum.config.blockchain.upgrades.ActivationConfig;
4856
import org.ethereum.config.blockchain.upgrades.ConsensusRule;
49-
import org.ethereum.core.*;
57+
import org.ethereum.core.Block;
58+
import org.ethereum.core.CallTransaction;
59+
import org.ethereum.core.SignatureCache;
5060
import org.ethereum.util.ByteUtil;
5161
import org.ethereum.vm.DataWord;
5262
import org.ethereum.vm.MessageCall.MsgType;
@@ -57,16 +67,6 @@
5767
import org.slf4j.Logger;
5868
import org.slf4j.LoggerFactory;
5969

60-
import java.io.IOException;
61-
import java.math.BigInteger;
62-
import java.time.Instant;
63-
import java.util.ArrayList;
64-
import java.util.Arrays;
65-
import java.util.List;
66-
import java.util.Optional;
67-
import java.util.function.BiFunction;
68-
import java.util.stream.Collectors;
69-
7070
/**
7171
* Precompiled contract that manages the 2 way peg between bitcoin and RSK.
7272
* This class is just a wrapper, actual functionality is found in BridgeSupport.
@@ -224,6 +224,15 @@ public class Bridge extends PrecompiledContracts.PrecompiledContract {
224224

225225
public static final CallTransaction.Function GET_ACTIVE_POWPEG_REDEEM_SCRIPT = BridgeMethods.GET_ACTIVE_POWPEG_REDEEM_SCRIPT.getFunction();
226226

227+
// Union Bridge Contract functions
228+
public static final CallTransaction.Function SET_UNION_BRIDGE_CONTRACT_ADDRESS_FOR_TESTNET = BridgeMethods.SET_UNION_BRIDGE_CONTRACT_ADDRESS_FOR_TESTNET.getFunction();
229+
public static final CallTransaction.Function GET_UNION_BRIDGE_CONTRACT_ADDRESS = BridgeMethods.GET_UNION_BRIDGE_CONTRACT_ADDRESS.getFunction();
230+
public static final CallTransaction.Function GET_UNION_BRIDGE_LOCKING_CAP = BridgeMethods.GET_UNION_BRIDGE_LOCKING_CAP.getFunction();
231+
public static final CallTransaction.Function INCREASE_UNION_BRIDGE_LOCKING_CAP = BridgeMethods.INCREASE_UNION_BRIDGE_LOCKING_CAP.getFunction();
232+
public static final CallTransaction.Function REQUEST_UNION_BRIDGE_RBTC = BridgeMethods.REQUEST_UNION_BRIDGE_RBTC.getFunction();
233+
public static final CallTransaction.Function RELEASE_UNION_BRIDGE_RBTC = BridgeMethods.RELEASE_UNION_BRIDGE_RBTC.getFunction();
234+
public static final CallTransaction.Function SET_UNION_BRIDGE_TRANSFER_PERMISSIONS = BridgeMethods.SET_UNION_BRIDGE_TRANSFER_PERMISSIONS.getFunction();
235+
227236
// Log topics used by Bridge Contract pre RSKIP146
228237
public static final DataWord RELEASE_BTC_TOPIC = DataWord.fromString("release_btc_topic");
229238
public static final DataWord UPDATE_COLLECTIONS_TOPIC = DataWord.fromString("update_collections_topic");
@@ -1482,6 +1491,84 @@ public long getEstimatedFeesForNextPegOutEvent(Object[] args) throws IOException
14821491
return bridgeSupport.getEstimatedFeesForNextPegOutEvent().value;
14831492
}
14841493

1494+
public int setUnionBridgeContractAddressForTestnet(Object[] args) {
1495+
logger.trace("setUnionBridgeContractAddressForTestnet");
1496+
// A DataWord cast is used because a SolidityType "address" is decoded using this specific type.
1497+
RskAddress unionBridgeContractAddress = new RskAddress((DataWord) args[0]);
1498+
return bridgeSupport.setUnionBridgeContractAddressForTestnet(unionBridgeContractAddress).getCode();
1499+
}
1500+
1501+
public String getUnionBridgeContractAddress(Object[] args) {
1502+
logger.trace("getUnionBridgeContractAddress");
1503+
return bridgeSupport.getUnionBridgeContractAddress().toHexString();
1504+
}
1505+
1506+
public BigInteger getUnionBridgeLockingCap(Object[] args) {
1507+
logger.trace("getUnionBridgeLockingCap");
1508+
return bridgeSupport.getUnionBridgeLockingCap().asBigInteger();
1509+
}
1510+
1511+
public int increaseUnionBridgeLockingCap(Object[] args) {
1512+
logger.trace("increaseUnionBridgeLockingCap");
1513+
co.rsk.core.Coin newLockingCap = new co.rsk.core.Coin((BigInteger) args[0]);
1514+
return bridgeSupport.increaseUnionBridgeLockingCap(rskTx, newLockingCap).getCode();
1515+
}
1516+
1517+
public int requestUnionBridgeRbtc(Object[] args) {
1518+
logger.trace("requestUnionBridgeRbtc");
1519+
co.rsk.core.Coin amountRequested = new co.rsk.core.Coin((BigInteger) args[0]);
1520+
return bridgeSupport.requestUnionBridgeRbtc(rskTx, amountRequested).getCode();
1521+
}
1522+
1523+
public int releaseUnionBridgeRbtc(Object[] args) {
1524+
logger.trace("releaseUnionBridgeRbtc");
1525+
return bridgeSupport.releaseUnionBridgeRbtc(rskTx).getCode();
1526+
}
1527+
1528+
public int setUnionBridgeTransferPermissions(Object[] args) {
1529+
logger.trace("setUnionBridgeTransferPermissions");
1530+
boolean requestEnabled = (boolean) args[0];
1531+
boolean releaseEnabled = (boolean) args[1];
1532+
return bridgeSupport.setUnionBridgeTransferPermissions(rskTx, requestEnabled, releaseEnabled).getCode();
1533+
}
1534+
1535+
protected static BridgeMethods.BridgeMethodExecutor executeIfAuthorized(
1536+
AuthorizerProvider authorizerProvider,
1537+
BridgeMethods.BridgeMethodExecutor decorate,
1538+
String functionName
1539+
) {
1540+
return (self, args) -> {
1541+
AddressBasedAuthorizer addressBasedAuthorizer = authorizerProvider.provide(self.bridgeConstants);
1542+
if (!addressBasedAuthorizer.isAuthorized(self.rskTx, self.signatureCache)) {
1543+
String errorMessage = String.format(
1544+
"The sender is not authorized to call %s",
1545+
functionName
1546+
);
1547+
throw new VMException(errorMessage);
1548+
}
1549+
return decorate.execute(self, args);
1550+
};
1551+
}
1552+
1553+
public static BridgeMethods.BridgeMethodExecutor executeIfTestnetAndAuthorized(
1554+
AuthorizerProvider authorizerProvider,
1555+
BridgeMethods.BridgeMethodExecutor decorate,
1556+
String functionName
1557+
) {
1558+
return (self, args) -> {
1559+
boolean isMainnet = self.constants.getChainId() == Constants.MAINNET_CHAIN_ID;
1560+
if (isMainnet) {
1561+
String errorMessage = String.format(
1562+
"The %s function is disabled in Mainnet.",
1563+
functionName
1564+
);
1565+
throw new VMException(errorMessage);
1566+
}
1567+
1568+
return executeIfAuthorized(authorizerProvider, decorate, functionName).execute(self, args);
1569+
};
1570+
}
1571+
14851572
public static BridgeMethods.BridgeMethodExecutor activeAndRetiringFederationOnly(BridgeMethods.BridgeMethodExecutor decoratee, String funcName) {
14861573
return (self, args) -> {
14871574
boolean isFromActiveFed = BridgeUtils.isFromFederateMember(self.rskTx, self.bridgeSupport.getActiveFederation(), self.signatureCache);

rskj-core/src/main/java/co/rsk/peg/BridgeEvents.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,26 @@ public enum BridgeEvents {
7878
PEGOUT_TRANSACTION_CREATED("pegout_transaction_created", new CallTransaction.Param[] {
7979
new CallTransaction.Param(true, Fields.BTC_TX_HASH, SolidityType.getType(SolidityType.BYTES32)),
8080
new CallTransaction.Param(false, Fields.UTXO_OUTPOINT_VALUES, SolidityType.getType(SolidityType.BYTES))
81-
});
81+
}),
82+
UNION_LOCKING_CAP_INCREASED("union_bridge_locking_cap_increased", new CallTransaction.Param[] {
83+
new CallTransaction.Param(true, Fields.CALLER, SolidityType.getType(SolidityType.ADDRESS)),
84+
new CallTransaction.Param(false, "previousLockingCap", SolidityType.getType(SolidityType.UINT256)),
85+
new CallTransaction.Param(false, "newLockingCap", SolidityType.getType(SolidityType.UINT256))
86+
}),
87+
UNION_RBTC_REQUESTED("union_rbtc_requested", new CallTransaction.Param[] {
88+
new CallTransaction.Param(true, Fields.REQUESTER, SolidityType.getType(SolidityType.ADDRESS)),
89+
new CallTransaction.Param(false, Fields.AMOUNT, SolidityType.getType(SolidityType.UINT256))
90+
}),
91+
UNION_RBTC_RELEASED("union_rbtc_released", new CallTransaction.Param[] {
92+
new CallTransaction.Param(true, Fields.RECEIVER, SolidityType.getType(SolidityType.ADDRESS)),
93+
new CallTransaction.Param(false, Fields.AMOUNT, SolidityType.getType(SolidityType.UINT256))
94+
}),
95+
UNION_BRIDGE_TRANSFER_PERMISSIONS_UPDATED("union_bridge_transfer_permissions_updated", new CallTransaction.Param[] {
96+
new CallTransaction.Param(true, Fields.CALLER, SolidityType.getType(SolidityType.ADDRESS)),
97+
new CallTransaction.Param(false, "enablePowPegToUnionBridge", SolidityType.getType(SolidityType.BOOL)),
98+
new CallTransaction.Param(false, "enableUnionBridgeToPowPeg", SolidityType.getType(SolidityType.BOOL))
99+
})
100+
;
82101

83102
private final String eventName;
84103
private final CallTransaction.Param[] params;
@@ -102,5 +121,7 @@ private static class Fields {
102121
private static final String RELEASE_RSK_TX_HASHES = "releaseRskTxHashes";
103122
private static final String SENDER = "sender";
104123
private static final String UTXO_OUTPOINT_VALUES = "utxoOutpointValues";
124+
private static final String REQUESTER = "requester";
125+
private static final String CALLER = "caller";
105126
}
106127
}

0 commit comments

Comments
 (0)