Skip to content

Commit 76a83f4

Browse files
feat: only authorized relayers can invoke handlers with commitment proof verification (#240)
* feat: only relayer can invoke handlers containing proof verificaiton * chore: update tests + only allow auth relayer to register client * fix: not needed for send_packet
1 parent 28ecac2 commit 76a83f4

File tree

6 files changed

+44
-12
lines changed

6 files changed

+44
-12
lines changed

cairo-contracts/packages/apps/src/transfer/components/transfer.cairo

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,8 @@ pub mod TokenTransferComponent {
184184
version_proposal: AppVersion,
185185
ordering: ChannelOrdering
186186
) -> AppVersion {
187+
self.assert_owner();
188+
187189
assert(port_id_on_a == TRANSFER_PORT_ID(), TransferErrors::INVALID_PORT_ID);
188190

189191
if version_proposal.is_non_zero() {
@@ -204,6 +206,8 @@ pub mod TokenTransferComponent {
204206
version_on_a: AppVersion,
205207
ordering: ChannelOrdering
206208
) -> AppVersion {
209+
self.assert_owner();
210+
207211
assert(version_on_a == VERSION(), TransferErrors::INVALID_APP_VERSION);
208212

209213
VERSION()
@@ -215,12 +219,16 @@ pub mod TokenTransferComponent {
215219
chan_id_on_a: ChannelId,
216220
version_on_b: AppVersion
217221
) {
222+
self.assert_owner();
223+
218224
assert(version_on_b == VERSION(), TransferErrors::INVALID_APP_VERSION);
219225
}
220226

221227
fn on_chan_open_confirm(
222228
ref self: ComponentState<TContractState>, port_id_on_b: PortId, chan_id_on_b: ChannelId
223-
) {}
229+
) {
230+
self.assert_owner();
231+
}
224232

225233
fn on_recv_packet(
226234
ref self: ComponentState<TContractState>, packet: Packet

cairo-contracts/packages/contracts/src/tests/channel.cairo

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use starknet_ibc_testkit::configs::{
88
};
99
use starknet_ibc_testkit::dummies::{
1010
HEIGHT, TIMESTAMP, COSMOS, STARKNET, CLIENT_ID, CONNECTION_ID, CHANNEL_ID, PORT_ID, SUPPLY,
11-
PACKET_COMMITMENT_ON_SN, RELAYER, SN_USER, CS_USER
11+
PACKET_COMMITMENT_ON_SN, SN_USER, CS_USER
1212
};
1313
use starknet_ibc_testkit::event_spy::{TransferEventSpyExt, ChannelEventSpyExt};
1414
use starknet_ibc_testkit::handles::{CoreHandle, AppHandle, ERC20Handle};
@@ -466,8 +466,6 @@ fn try_timeout_packet(timeout_height: Height, timeout_timestamp: Timestamp) {
466466

467467
start_cheat_caller_address(ics20.address, core.address);
468468

469-
core.register_relayer(RELAYER());
470-
471469
let msg = comet_cfg
472470
.dummy_msg_update_client(
473471
CLIENT_ID(), comet_cfg.latest_height, updating_height.clone(), updating_timestamp,

cairo-contracts/packages/contracts/src/tests/client.cairo

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use snforge_std::spy_events;
22
use starknet_ibc_core::client::{UpdateResponse, StatusTrait, ClientContractTrait};
33
use starknet_ibc_testkit::configs::CometClientConfigTrait;
4-
use starknet_ibc_testkit::dummies::{HEIGHT, RELAYER};
4+
use starknet_ibc_testkit::dummies::HEIGHT;
55
use starknet_ibc_testkit::event_spy::ClientEventSpyExt;
66
use starknet_ibc_testkit::handles::CoreHandle;
77
use starknet_ibc_testkit::setup::SetupImpl;
@@ -58,8 +58,6 @@ fn test_update_comet_client_ok() {
5858
// Update Client
5959
// -----------------------------------------------------------
6060

61-
core.register_relayer(RELAYER());
62-
6361
// Update the client to a new height and time.
6462
let updating_height = cfg.latest_height.clone() + HEIGHT(1);
6563
let updating_time = cfg.latest_timestamp.clone() + 1;

cairo-contracts/packages/core/src/channel/components/handler.cairo

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ pub mod ChannelHandlerComponent {
99
Map, StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess,
1010
StoragePointerWriteAccess
1111
};
12-
use starknet::{get_block_timestamp, get_block_number};
12+
use starknet::{get_block_timestamp, get_block_number, get_caller_address};
13+
use starknet_ibc_core::channel::ChannelHandlerComponent::ClientHandlerComponent::ClientReaderTrait;
1314
use starknet_ibc_core::channel::{
1415
ChannelEventEmitterComponent, IChannelHandler, IChannelQuery, MsgChanOpenInit,
1516
MsgChanOpenTry, MsgChanOpenAck, MsgChanOpenConfirm, MsgRecvPacket, MsgAckPacket,
1617
MsgTimeoutPacket, ChannelEnd, ChannelEndTrait, ChannelErrors, PacketTrait, ChannelOrdering,
1718
AppVersion, Receipt, ReceiptTrait, Packet, Acknowledgement
1819
};
1920
use starknet_ibc_core::client::{
20-
ClientHandlerComponent, ClientContract, ClientContractTrait, Height, HeightImpl
21+
ClientHandlerComponent, ClientContract, ClientContractTrait, Height, HeightImpl,
22+
ClientErrors
2123
};
2224
use starknet_ibc_core::commitment::{
2325
StateProof, Commitment, CommitmentZero, compute_packet_commitment, compute_ack_commitment
@@ -56,6 +58,9 @@ pub mod ChannelHandlerComponent {
5658
// IChannelHandler
5759
// -----------------------------------------------------------
5860

61+
// NOTE: Authorized relayer check is temporary and will be removed once
62+
// commitment proof verification is implemented.
63+
5964
#[embeddable_as(CoreChannelHandler)]
6065
impl CoreChannelHandlerImpl<
6166
TContractState,
@@ -77,18 +82,21 @@ pub mod ChannelHandlerComponent {
7782
fn chan_open_try(
7883
ref self: ComponentState<TContractState>, msg: MsgChanOpenTry
7984
) -> ChannelId {
85+
self.assert_authorized_relayer();
8086
let channel_sequence = self.read_next_channel_sequence();
8187
self.chan_open_try_validate(channel_sequence, msg.clone());
8288
self.chan_open_try_execute(channel_sequence, msg)
8389
}
8490

8591
fn chan_open_ack(ref self: ComponentState<TContractState>, msg: MsgChanOpenAck) {
92+
self.assert_authorized_relayer();
8693
let chan_end_on_a = self.read_channel_end(@msg.port_id_on_a, @msg.chan_id_on_a);
8794
self.chan_open_ack_validate(chan_end_on_a.clone(), msg.clone());
8895
self.chan_open_ack_execute(chan_end_on_a, msg);
8996
}
9097

9198
fn chan_open_confirm(ref self: ComponentState<TContractState>, msg: MsgChanOpenConfirm) {
99+
self.assert_authorized_relayer();
92100
let chan_end_on_b = self.read_channel_end(@msg.port_id_on_b, @msg.chan_id_on_b);
93101
self.chan_open_confirm_validate(chan_end_on_b.clone(), msg.clone());
94102
self.chan_open_confirm_execute(chan_end_on_b, msg);
@@ -101,20 +109,23 @@ pub mod ChannelHandlerComponent {
101109
}
102110

103111
fn recv_packet(ref self: ComponentState<TContractState>, msg: MsgRecvPacket) {
112+
self.assert_authorized_relayer();
104113
let chan_end_on_b = self
105114
.read_channel_end(@msg.packet.port_id_on_b, @msg.packet.chan_id_on_b);
106115
self.recv_packet_validate(msg.clone(), chan_end_on_b.clone());
107116
self.recv_packet_execute(msg, chan_end_on_b);
108117
}
109118

110119
fn ack_packet(ref self: ComponentState<TContractState>, msg: MsgAckPacket) {
120+
self.assert_authorized_relayer();
111121
let chan_end_on_a = self
112122
.read_channel_end(@msg.packet.port_id_on_a, @msg.packet.chan_id_on_b);
113123
self.ack_packet_validate(msg.clone(), chan_end_on_a.clone());
114124
self.ack_packet_execute(msg, chan_end_on_a);
115125
}
116126

117127
fn timeout_packet(ref self: ComponentState<TContractState>, msg: MsgTimeoutPacket) {
128+
self.assert_authorized_relayer();
118129
let chan_end_on_a = self
119130
.read_channel_end(@msg.packet.port_id_on_a, @msg.packet.chan_id_on_a);
120131
self.timeout_packet_validate(msg.clone(), chan_end_on_a.clone());
@@ -1078,6 +1089,15 @@ pub mod ChannelHandlerComponent {
10781089
root_on_b
10791090
);
10801091
}
1092+
1093+
fn assert_authorized_relayer(self: @ComponentState<TContractState>) {
1094+
let client_comp = get_dep_component!(self, ClientHandler);
1095+
1096+
assert(
1097+
client_comp.in_allowed_relayers(get_caller_address()),
1098+
ClientErrors::UNAUTHORIZED_RELAYER
1099+
);
1100+
}
10811101
}
10821102

10831103
// -----------------------------------------------------------

cairo-contracts/packages/core/src/client/components/handler.cairo

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ pub mod ClientHandlerComponent {
118118
client_type: felt252,
119119
client_address: ContractAddress
120120
) {
121+
assert(
122+
self.in_allowed_relayers(get_caller_address()), ClientErrors::UNAUTHORIZED_RELAYER
123+
);
124+
121125
self.write_supported_client(client_type, client_address);
122126
}
123127
}

cairo-contracts/packages/testkit/src/setup.cairo

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ pub impl SetupImpl of SetupTrait {
6868

6969
let mut comet = setup.deploy_client(client_contract_name);
7070

71-
core.register_client(CLIENT_TYPE(), comet.address);
71+
core.register_relayer(RELAYER());
7272

7373
start_cheat_caller_address(core.address, RELAYER());
7474

75+
core.register_client(CLIENT_TYPE(), comet.address);
76+
7577
(core, comet)
7678
}
7779

@@ -109,6 +111,10 @@ pub impl SetupImpl of SetupTrait {
109111

110112
let comet = setup.deploy_client(client_contract_name);
111113

114+
core.register_relayer(RELAYER());
115+
116+
start_cheat_caller_address(core.address, RELAYER());
117+
112118
core.register_client(CLIENT_TYPE(), comet.address);
113119

114120
let mut erc20 = setup.deploy_erc20();
@@ -117,8 +123,6 @@ pub impl SetupImpl of SetupTrait {
117123

118124
core.register_app(TRANSFER_PORT_ID(), ics20.address);
119125

120-
start_cheat_caller_address(core.address, RELAYER());
121-
122126
(core, ics20, erc20)
123127
}
124128
}

0 commit comments

Comments
 (0)