Skip to content

Commit

Permalink
fix a bug found by DavidC
Browse files Browse the repository at this point in the history
  • Loading branch information
dantaik committed Feb 15, 2024
1 parent 6b46943 commit d80bd32
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 17 deletions.
17 changes: 15 additions & 2 deletions packages/protocol/contracts/signal/SignalService.sol
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,15 @@ contract SignalService is EssentialContract, ISignalService {
bytes[] storageProof;
}

uint256[50] private __gap;
mapping(address => bool) public isChainDataRelayerAuthorized;
uint256[49] private __gap;

event SnippetRelayed(
uint64 indexed chainid, bytes32 indexed kind, bytes32 data, bytes32 signal
);

event RelayerAuthorized(address indexed addr, bool authrized);

error SS_EMPTY_PROOF();
error SS_INVALID_APP();
error SS_INVALID_LAST_HOP_CHAINID();
Expand All @@ -53,22 +56,32 @@ contract SignalService is EssentialContract, ISignalService {
error SS_INVALID_SIGNAL();
error SS_LOCAL_CHAIN_DATA_NOT_FOUND();
error SS_UNSUPPORTED();
error SS_UNAUTHORIZED();

/// @dev Initializer to be called after being deployed behind a proxy.
function init(address _addressManager) external initializer {
__Essential_init(_addressManager);
}

/// @dev Authorize or deautohrize an address for calling relayChainData
/// @dev Note that addr is supposed to be TaikoL1 and TaikoL1 contracts deployed locally.
function authorizeChainDataRelayer(address addr, bool toAuthorize) external onlyOwner {
if (isChainDataRelayerAuthorized[addr] == toAuthorize) revert SS_INVALID_PARAMS();
isChainDataRelayerAuthorized[addr] = toAuthorize;

emit RelayerAuthorized(addr, toAuthorize);
}

/// @inheritdoc ISignalService
function relayChainData(
uint64 chainId,
bytes32 kind,
bytes32 data
)
external
onlyFromNamed("taiko")
returns (bytes32 slot)
{
if (!isChainDataRelayerAuthorized[msg.sender]) revert SS_UNAUTHORIZED();
return _relayChainData(chainId, kind, data);
}

Expand Down
1 change: 1 addition & 0 deletions packages/protocol/test/L1/TaikoL1TestBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ abstract contract TaikoL1TestBase is TaikoTest {
data: abi.encodeCall(SignalService.init, address(addressManager))
})
);
ss.authorizeChainDataRelayer(address(L1), true);

pv = PseZkVerifier(
deployProxy({
Expand Down
18 changes: 11 additions & 7 deletions packages/protocol/test/L2/TaikoL2.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,15 @@ contract TestTaikoL2 is TaikoTest {
data: abi.encodeCall(AddressManager.init, ())
});

deployProxy({
name: "signal_service",
impl: address(new SignalService()),
data: abi.encodeCall(SignalService.init, (addressManager)),
registerTo: addressManager,
owner: address(0)
});
SignalService ss = SignalService(
deployProxy({
name: "signal_service",
impl: address(new SignalService()),
data: abi.encodeCall(SignalService.init, (addressManager)),
registerTo: addressManager,
owner: address(0)
})
);

uint64 gasExcess = 0;
uint8 quotient = 8;
Expand All @@ -55,6 +57,8 @@ contract TestTaikoL2 is TaikoTest {

L2.setConfigAndExcess(TaikoL2.Config(gasTarget, quotient), gasExcess);

ss.authorizeChainDataRelayer(address(L2), true);

gasExcess = 195_420_300_100;

vm.roll(block.number + 1);
Expand Down
18 changes: 11 additions & 7 deletions packages/protocol/test/L2/TaikoL2NoFeeCheck.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ contract TestTaikoL2NoFeeCheck is TaikoTest {
data: abi.encodeCall(AddressManager.init, ())
});

deployProxy({
name: "signal_service",
impl: address(new SignalService()),
data: abi.encodeCall(SignalService.init, (addressManager)),
registerTo: addressManager,
owner: address(0)
});
SignalService ss = SignalService(
deployProxy({
name: "signal_service",
impl: address(new SignalService()),
data: abi.encodeCall(SignalService.init, (addressManager)),
registerTo: addressManager,
owner: address(0)
})
);

uint64 gasExcess = 0;
uint8 quotient = 8;
Expand All @@ -55,6 +57,8 @@ contract TestTaikoL2NoFeeCheck is TaikoTest {

L2.setConfigAndExcess(TaikoL2.Config(gasTarget, quotient), gasExcess);

ss.authorizeChainDataRelayer(address(L2), true);

vm.roll(block.number + 1);
vm.warp(block.timestamp + 30);
}
Expand Down
11 changes: 10 additions & 1 deletion packages/protocol/test/signal/SignalService.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ contract TestSignalService is TaikoTest {
);

taiko = randAddress();
addressManager.setAddress(uint64(block.chainid), "taiko", taiko);

signalService.authorizeChainDataRelayer(taiko, true);

vm.stopPrank();
}

Expand Down Expand Up @@ -298,6 +300,13 @@ contract TestSignalService is TaikoTest {
signal: randBytes32(),
proof: abi.encode(proofs)
});

vm.prank(Alice);
signalService.authorizeChainDataRelayer(taiko, false);

vm.expectRevert(SignalService.SS_UNAUTHORIZED.selector);
vm.prank(taiko);
signalService.relayChainData(srcChainId, LibSignals.SIGNAL_ROOT, proofs[0].rootHash);
}

function test_SignalService_proveSignalReceived_one_hop_state_root() public {
Expand Down

0 comments on commit d80bd32

Please sign in to comment.