Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
86ff45b
Add RSKIP529 config
julia-zack Oct 1, 2025
e4e544f
Add super event authorizer to union bridge constants
julia-zack Oct 1, 2025
63c4f38
Add SUPER_EVENT index key
julia-zack Oct 1, 2025
db44807
Add deserializer method to return empty array when null data
julia-zack Oct 1, 2025
ae897ed
Add union bridge storage provider impl
julia-zack Oct 1, 2025
d10c6e6
Add union bridge support impl
julia-zack Oct 1, 2025
ecd3e5f
Add bridge support method to call union bridge ones
julia-zack Oct 1, 2025
c029c00
Add Bridge Methods
julia-zack Oct 1, 2025
9e4fa2c
Add missing RSKIP529 config for getReed801Rskips
julia-zack Oct 1, 2025
54f9787
Remove unnecessary des_serializer methods for super event data
julia-zack Oct 2, 2025
e6430fb
Remove business logic of empty data from storage provider
julia-zack Oct 2, 2025
83d0daf
Save null in storage when clearing super event value
julia-zack Oct 2, 2025
acde190
Return empty array from support when empty data from provider
julia-zack Oct 2, 2025
165d1dd
Replace declaration of emptyArray for ByteUtil.EMPTY_BYTE_ARRAY
julia-zack Oct 2, 2025
66244b5
Add TODOs for gas cost in new methods
julia-zack Oct 2, 2025
5756b7e
Add data length in error message
julia-zack Oct 2, 2025
ef3d53f
Remove superEventAuthorizer from constants
julia-zack Oct 2, 2025
a672ba8
Move authorization checks to union support
julia-zack Oct 2, 2025
6232bcf
Remove checks at bridge level. Add tests for bridge support
julia-zack Oct 2, 2025
3444d36
Remove last use of emptyArray
julia-zack Oct 2, 2025
05bfe63
Remove unnecessary tests. Rename
julia-zack Oct 2, 2025
3180e97
Refactor storage provider so getter does not return Optional
julia-zack Oct 3, 2025
e2d9940
Create validate method that throws to remove duplicated code. Refacto…
julia-zack Oct 3, 2025
d358f26
Avoid handling null values as super event
marcos-iov Oct 6, 2025
2ddf575
Clean up setSuperEvent method
marcos-iov Oct 6, 2025
2eb9a11
Add BASE_EVENT storage index key
julia-zack Oct 3, 2025
bb13a89
Add set, get and clear base event methods in storage provider
julia-zack Oct 3, 2025
b498e7d
Add set, get and clear base event methods in support
julia-zack Oct 3, 2025
2f6c069
Add methods in bridge support to call union ones
julia-zack Oct 3, 2025
da6c061
Add methods to Bridge
julia-zack Oct 3, 2025
e2aa63e
Refactor storage provider so getter does not return Optional
julia-zack Oct 3, 2025
0e9c00a
Import EMPTY_BYTE_ARRAY constant
julia-zack Oct 3, 2025
fc15f72
Simplify base events logic
marcos-iov Oct 7, 2025
2a0e6c4
Add RSKIP529 to ActivationConfigTest
marcos-iov Oct 9, 2025
539135b
Cleanup BridgeTest
marcos-iov Oct 10, 2025
710424c
Add requireNonNull check to support layer also
julia-zack Oct 13, 2025
8d31a22
Refactor and cleaning up tests
julia-zack Oct 13, 2025
58ac28d
Refactor to check data is not null before everything else
julia-zack Oct 13, 2025
f05e22c
Fix tests post rebase
marcos-iov Oct 17, 2025
45e7fd2
Extract event data length validation to its own method
marcos-iov Oct 17, 2025
1fc9cda
Use SolidityType enum for new methods definition
marcos-iov Oct 17, 2025
cdd986b
Set gas cost for new Bridge methods to get/set super/base events info
marcos-iov Oct 20, 2025
aed8c70
Set RSKIP529 as part of Vetiver
marcos-iov Oct 20, 2025
e940f01
Add RSKIP529 as part of Reed 8.1.0
marcos-iov Oct 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions rskj-core/src/main/java/co/rsk/peg/Bridge.java
Original file line number Diff line number Diff line change
Expand Up @@ -1532,6 +1532,38 @@ public int setUnionBridgeTransferPermissions(Object[] args) {
return bridgeSupport.setUnionBridgeTransferPermissions(rskTx, requestEnabled, releaseEnabled).getCode();
}

public byte[] getSuperEvent(Object[] args) {
logger.trace("getSuperEvent");
return bridgeSupport.getSuperEvent();
}

public void setSuperEvent(Object[] args) {
logger.trace("setSuperEvent");
byte[] data = (byte[]) args[0];
bridgeSupport.setSuperEvent(rskTx, data);
}

public void clearSuperEvent(Object[] args) {
logger.trace("clearSuperEvent");
bridgeSupport.clearSuperEvent(rskTx);
}

public byte[] getBaseEvent(Object[] args) {
logger.trace("getBaseEvent");
return bridgeSupport.getBaseEvent();
}

public void setBaseEvent(Object[] args) {
logger.trace("setBaseEvent");
byte[] data = (byte[]) args[0];
bridgeSupport.setBaseEvent(rskTx, data);
}

public void clearBaseEvent(Object[] args) {
logger.trace("clearBaseEvent");
bridgeSupport.clearBaseEvent(rskTx);
}

protected static BridgeMethods.BridgeMethodExecutor executeIfAuthorized(
AuthorizerProvider authorizerProvider,
BridgeMethods.BridgeMethodExecutor decorate,
Expand Down
98 changes: 83 additions & 15 deletions rskj-core/src/main/java/co/rsk/peg/BridgeMethods.java
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"getBtcBlockchainBestChainHeight",
new String[]{},
new String[]{"int"}
new String[]{INT}
),
fixedCost(19000L),
(BridgeMethodExecutorTyped<Integer>) Bridge::getBtcBlockchainBestChainHeight,
Expand All @@ -141,7 +141,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"getBtcBlockchainInitialBlockHeight",
new String[]{},
new String[]{"int"}
new String[]{INT}
),
fixedCost(20000L),
(BridgeMethodExecutorTyped<Integer>) Bridge::getBtcBlockchainInitialBlockHeight,
Expand Down Expand Up @@ -324,7 +324,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"getMinimumLockTxValue",
new String[]{},
new String[]{"int"}
new String[]{INT}
),
fixedCost(2000L),
(BridgeMethodExecutorTyped<Long>) Bridge::getMinimumLockTxValue,
Expand Down Expand Up @@ -636,7 +636,7 @@ public enum BridgeMethods {
REGISTER_BTC_TRANSACTION(
CallTransaction.Function.fromSignature(
"registerBtcTransaction",
new String[]{BYTES, "int", BYTES},
new String[]{BYTES, INT, BYTES},
new String[]{}
),
fixedCost(22000L),
Expand Down Expand Up @@ -830,7 +830,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"setUnionBridgeContractAddressForTestnet",
new String[]{ADDRESS},
new String[]{"int"}
new String[]{INT}
),
fixedCost(8_000L),
Bridge.executeIfTestnetAndAuthorized(
Expand Down Expand Up @@ -869,7 +869,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"increaseUnionBridgeLockingCap",
new String[]{UINT256},
new String[]{"int"}
new String[]{INT}
),
fixedCost(8_000L),
Bridge.executeIfAuthorized(
Expand All @@ -884,7 +884,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"requestUnionBridgeRbtc",
new String[]{UINT256},
new String[]{"int"}
new String[]{INT}
),
fixedCost(8_000L),
(BridgeMethodExecutorTyped<Integer>) Bridge::requestUnionBridgeRbtc,
Expand All @@ -895,7 +895,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"releaseUnionBridgeRbtc",
new String[]{},
new String[]{"int"}
new String[]{INT}
),
fixedCost(8_000L),
(BridgeMethodExecutorTyped<Integer>) Bridge::releaseUnionBridgeRbtc,
Expand All @@ -906,7 +906,7 @@ public enum BridgeMethods {
CallTransaction.Function.fromSignature(
"setUnionBridgeTransferPermissions",
new String[]{BOOL, BOOL},
new String[]{"int"}
new String[]{INT}
),
fixedCost(8_000L),
Bridge.executeIfAuthorized(
Expand All @@ -917,6 +917,74 @@ public enum BridgeMethods {
activations -> activations.isActive(RSKIP502),
fixedPermission(false)
),
GET_SUPER_EVENT(
CallTransaction.Function.fromSignature(
"getSuperEvent",
new String[]{},
new String[]{BYTES}
),
fixedCost(3_000L),
(BridgeMethodExecutorTyped<byte[]>) Bridge::getSuperEvent,
activations -> activations.isActive(RSKIP529),
fixedPermission(false),
CallTypeHelper.ALLOW_STATIC_CALL
),
SET_SUPER_EVENT(
CallTransaction.Function.fromSignature(
"setSuperEvent",
new String[]{BYTES},
new String[]{}
),
fixedCost(8_000L),
(BridgeMethodExecutorVoid) Bridge::setSuperEvent,
activations -> activations.isActive(RSKIP529),
fixedPermission(false)
),
CLEAR_SUPER_EVENT(
CallTransaction.Function.fromSignature(
"clearSuperEvent",
new String[]{},
new String[]{}
),
fixedCost(8_000L),
(BridgeMethodExecutorVoid) Bridge::clearSuperEvent,
activations -> activations.isActive(RSKIP529),
fixedPermission(false)
),
GET_BASE_EVENT(
CallTransaction.Function.fromSignature(
"getBaseEvent",
new String[]{},
new String[]{BYTES}
),
fixedCost(3_000L),
(BridgeMethodExecutorTyped<byte[]>) Bridge::getBaseEvent,
activations -> activations.isActive(RSKIP529),
fixedPermission(false),
CallTypeHelper.ALLOW_STATIC_CALL
),
SET_BASE_EVENT(
CallTransaction.Function.fromSignature(
"setBaseEvent",
new String[]{BYTES},
new String[]{}
),
fixedCost(8_000L),
(BridgeMethodExecutorVoid) Bridge::setBaseEvent,
activations -> activations.isActive(RSKIP529),
fixedPermission(false)
),
CLEAR_BASE_EVENT(
CallTransaction.Function.fromSignature(
"clearBaseEvent",
new String[]{},
new String[]{}
),
fixedCost(8_000L),
(BridgeMethodExecutorVoid) Bridge::clearBaseEvent,
activations -> activations.isActive(RSKIP529),
fixedPermission(false)
),
;

private static class CallTypeHelper {
Expand All @@ -925,6 +993,12 @@ private static class CallTypeHelper {
private static final Predicate<MsgType> RESTRICTED_TO_CALL = callType -> callType == MsgType.CALL;
}

private static final Map<ByteArrayWrapper, BridgeMethods> SIGNATURES = Stream.of(BridgeMethods.values())
.collect(Collectors.toMap(
m -> new ByteArrayWrapper(m.getFunction().encodeSignature()),
Function.identity()
));

private final CallTransaction.Function function;
private final CostProvider costProvider;
private final Function<ActivationConfig.ForBlock, Boolean> isEnabledFunction;
Expand Down Expand Up @@ -1117,10 +1191,4 @@ private static BridgeCallPermissionProvider fixedPermission(boolean onlyAllowsLo
private static BridgeCallPermissionProvider fromMethod(BridgeCallPermissionProvider bridgeCallPermissionProvider) {
return (Bridge bridge, Object[] args) -> bridgeCallPermissionProvider.getOnlyAllowLocalCallsPermission(bridge, args);
}

private static final Map<ByteArrayWrapper, BridgeMethods> SIGNATURES = Stream.of(BridgeMethods.values())
.collect(Collectors.toMap(
m -> new ByteArrayWrapper(m.getFunction().encodeSignature()),
Function.identity()
));
}
24 changes: 24 additions & 0 deletions rskj-core/src/main/java/co/rsk/peg/BridgeSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -2941,6 +2941,30 @@ public UnionResponseCode setUnionBridgeTransferPermissions(Transaction tx, boole
return unionBridgeSupport.setTransferPermissions(tx, requestEnabled, releaseEnabled);
}

public byte[] getSuperEvent() {
return unionBridgeSupport.getSuperEvent();
}

public void setSuperEvent(Transaction tx, byte[] data) {
unionBridgeSupport.setSuperEvent(tx, data);
}

public void clearSuperEvent(Transaction tx) {
unionBridgeSupport.clearSuperEvent(tx);
}

public byte[] getBaseEvent() {
return unionBridgeSupport.getBaseEvent();
}

public void setBaseEvent(Transaction tx, byte[] data) {
unionBridgeSupport.setBaseEvent(tx, data);
}

public void clearBaseEvent(Transaction tx) {
unionBridgeSupport.clearBaseEvent(tx);
}

protected FlyoverFederationInformation createFlyoverFederationInformation(Keccak256 flyoverDerivationHash) {
return createFlyoverFederationInformation(flyoverDerivationHash, getActiveFederation());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public enum UnionBridgeStorageIndexKey {

UNION_BRIDGE_REQUEST_ENABLED("unionBridgeRequestEnabled"),
UNION_BRIDGE_RELEASE_ENABLED("unionBridgeReleaseEnabled"),
SUPER_EVENT("superEvent"),
BASE_EVENT("baseEvent"),
;

private final String key;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,12 @@ public interface UnionBridgeStorageProvider {
Optional<Boolean> isUnionBridgeRequestEnabled();
void setUnionBridgeReleaseEnabled(boolean enabled);
Optional<Boolean> isUnionBridgeReleaseEnabled();
byte[] getSuperEvent();
void setSuperEvent(byte[] data);
void clearSuperEvent();
byte[] getBaseEvent();
void setBaseEvent(byte[] data);
void clearBaseEvent();

void save();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@

import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static java.util.Objects.requireNonNull;
import static org.ethereum.util.ByteUtil.EMPTY_BYTE_ARRAY;

import co.rsk.core.Coin;
import co.rsk.core.RskAddress;
import co.rsk.peg.BridgeSerializationUtils;
import co.rsk.peg.storage.StorageAccessor;
import java.util.Optional;
import javax.annotation.Nonnull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UnionBridgeStorageProviderImpl implements UnionBridgeStorageProvider {
private static final Logger logger = LoggerFactory.getLogger(UnionBridgeStorageProviderImpl.class);

private final StorageAccessor bridgeStorageAccessor;

Expand All @@ -21,6 +27,8 @@ public class UnionBridgeStorageProviderImpl implements UnionBridgeStorageProvide

private Boolean unionBridgeRequestEnabled;
private Boolean unionBridgeReleaseEnabled;
private byte[] superEvent;
private byte[] baseEvent;

public UnionBridgeStorageProviderImpl(StorageAccessor bridgeStorageAccessor) {
this.bridgeStorageAccessor = bridgeStorageAccessor;
Expand All @@ -33,6 +41,8 @@ public void save() {
saveWeisTransferredToUnionBridge();
saveRequestEnabled();
saveReleaseEnabled();
saveSuperEvent();
saveBaseEvent();
}

private void saveReleaseEnabled() {
Expand Down Expand Up @@ -189,4 +199,76 @@ public Optional<Boolean> isUnionBridgeReleaseEnabled() {
BridgeSerializationUtils::deserializeBoolean
)));
}

@Override
public byte[] getSuperEvent() {
if (!isNull(superEvent)) {
return superEvent.clone();
}

superEvent = bridgeStorageAccessor.getFromRepository(
UnionBridgeStorageIndexKey.SUPER_EVENT.getKey(),
data -> data
);
return Optional.ofNullable(superEvent).orElse(EMPTY_BYTE_ARRAY);
}

@Override
public void setSuperEvent(@Nonnull byte[] data) {
requireNonNull(data, "Super event data cannot be null");
this.superEvent = data.clone();
}

@Override
public void clearSuperEvent() {
logger.info("[clearSuperEvent] Clearing super event.");
setSuperEvent(EMPTY_BYTE_ARRAY);
}

private void saveSuperEvent() {
if (isNull(superEvent)) {
return;
}

bridgeStorageAccessor.saveToRepository(
UnionBridgeStorageIndexKey.SUPER_EVENT.getKey(),
superEvent
);
}

@Override
public byte[] getBaseEvent() {
if (!isNull(baseEvent)) {
return baseEvent.clone();
}

baseEvent = bridgeStorageAccessor.getFromRepository(
UnionBridgeStorageIndexKey.BASE_EVENT.getKey(),
data -> data
);
return Optional.ofNullable(baseEvent).orElse(EMPTY_BYTE_ARRAY);
}

@Override
public void setBaseEvent(@Nonnull byte[] data) {
requireNonNull(data, "Base event data cannot be null");
this.baseEvent = data.clone();
}

@Override
public void clearBaseEvent() {
logger.info("[clearBaseEvent] Clearing base event.");
setBaseEvent(EMPTY_BYTE_ARRAY);
}

private void saveBaseEvent() {
if (isNull(baseEvent)) {
return;
}

bridgeStorageAccessor.saveToRepository(
UnionBridgeStorageIndexKey.BASE_EVENT.getKey(),
baseEvent
);
}
}
Loading
Loading