Skip to content

Commit c32c07f

Browse files
feat(ibc-union): cosmwasm: add caller/relayer on callbacks
1 parent 11f3c5d commit c32c07f

File tree

15 files changed

+221
-39
lines changed

15 files changed

+221
-39
lines changed

cosmwasm/ibc-union/app/ucs03-zkgm/src/contract.rs

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,12 @@ pub fn execute(
123123
Ok(Response::default())
124124
}
125125
IbcUnionMsg::OnRecvPacket {
126+
caller,
126127
packet,
127128
relayer,
128129
relayer_msg,
129130
} => {
131+
let caller = deps.api.addr_validate(&caller)?;
130132
let relayer = deps.api.addr_validate(&relayer)?;
131133
if EXECUTING_PACKET.exists(deps.storage) {
132134
Err(ContractError::AlreadyExecuting)
@@ -136,6 +138,7 @@ pub fn execute(
136138
wasm_execute(
137139
env.contract.address,
138140
&ExecuteMsg::InternalExecutePacket {
141+
caller,
139142
packet,
140143
relayer,
141144
relayer_msg,
@@ -147,16 +150,23 @@ pub fn execute(
147150
}
148151
}
149152
IbcUnionMsg::OnAcknowledgementPacket {
153+
caller,
150154
packet,
151155
acknowledgement,
152156
relayer,
153157
} => {
158+
let caller = deps.api.addr_validate(&caller)?;
154159
let relayer = deps.api.addr_validate(&relayer)?;
155-
acknowledge_packet(deps, env, info, packet, relayer, acknowledgement)
160+
acknowledge_packet(deps, env, info, caller, packet, relayer, acknowledgement)
156161
}
157-
IbcUnionMsg::OnTimeoutPacket { packet, relayer } => {
162+
IbcUnionMsg::OnTimeoutPacket {
163+
caller,
164+
packet,
165+
relayer,
166+
} => {
167+
let caller = deps.api.addr_validate(&caller)?;
158168
let relayer = deps.api.addr_validate(&relayer)?;
159-
timeout_packet(deps, env, info, packet, relayer)
169+
timeout_packet(deps, env, info, caller, packet, relayer)
160170
}
161171
IbcUnionMsg::OnChannelCloseInit { .. }
162172
| IbcUnionMsg::OnChannelCloseConfirm { .. } => {
@@ -168,14 +178,15 @@ pub fn execute(
168178
}
169179
}
170180
ExecuteMsg::InternalExecutePacket {
181+
caller,
171182
packet,
172183
relayer,
173184
relayer_msg,
174185
} => {
175186
if info.sender != env.contract.address {
176187
Err(ContractError::OnlySelf)
177188
} else {
178-
execute_packet(deps, env, info, packet, relayer, relayer_msg)
189+
execute_packet(deps, env, info, caller, packet, relayer, relayer_msg)
179190
}
180191
}
181192
ExecuteMsg::InternalWriteAck { ack } => {
@@ -265,6 +276,7 @@ fn timeout_packet(
265276
deps: DepsMut,
266277
env: Env,
267278
info: MessageInfo,
279+
caller: Addr,
268280
packet: Packet,
269281
relayer: Addr,
270282
) -> Result<Response, ContractError> {
@@ -290,6 +302,7 @@ fn timeout_packet(
290302
deps,
291303
env,
292304
info,
305+
caller,
293306
packet,
294307
relayer,
295308
zkgm_packet.salt.into(),
@@ -305,6 +318,7 @@ fn timeout_internal(
305318
mut deps: DepsMut,
306319
env: Env,
307320
info: MessageInfo,
321+
caller: Addr,
308322
packet: Packet,
309323
relayer: Addr,
310324
salt: H256,
@@ -334,6 +348,7 @@ fn timeout_internal(
334348
deps.branch(),
335349
env.clone(),
336350
info.clone(),
351+
caller.clone(),
337352
packet.clone(),
338353
relayer.clone(),
339354
derive_batch_salt(i.try_into().unwrap(), salt),
@@ -354,7 +369,7 @@ fn timeout_internal(
354369
});
355370
}
356371
let multiplex = Multiplex::abi_decode_params(&instruction.operand, true)?;
357-
timeout_multiplex(deps, packet, relayer, path, multiplex)
372+
timeout_multiplex(deps, caller, packet, relayer, path, multiplex)
358373
}
359374
_ => Err(ContractError::UnknownOpcode {
360375
opcode: instruction.opcode,
@@ -364,6 +379,7 @@ fn timeout_internal(
364379

365380
fn timeout_multiplex(
366381
deps: DepsMut,
382+
caller: Addr,
367383
packet: Packet,
368384
relayer: Addr,
369385
path: U256,
@@ -396,8 +412,9 @@ fn timeout_multiplex(
396412
Ok(Response::new().add_message(wasm_execute(
397413
sender_addr,
398414
&IbcUnionMsg::OnTimeoutPacket {
415+
caller: caller.into(),
399416
packet: multiplex_packet,
400-
relayer: relayer.to_string(),
417+
relayer: relayer.into(),
401418
},
402419
vec![],
403420
)?))
@@ -413,6 +430,7 @@ fn acknowledge_packet(
413430
deps: DepsMut,
414431
env: Env,
415432
info: MessageInfo,
433+
caller: Addr,
416434
packet: Packet,
417435
relayer: Addr,
418436
ack: Bytes,
@@ -447,6 +465,7 @@ fn acknowledge_packet(
447465
deps,
448466
env,
449467
info,
468+
caller,
450469
packet,
451470
relayer,
452471
zkgm_packet.salt.into(),
@@ -466,6 +485,7 @@ fn acknowledge_internal(
466485
mut deps: DepsMut,
467486
env: Env,
468487
info: MessageInfo,
488+
caller: Addr,
469489
packet: Packet,
470490
relayer: Addr,
471491
salt: H256,
@@ -509,6 +529,7 @@ fn acknowledge_internal(
509529
deps.branch(),
510530
env.clone(),
511531
info.clone(),
532+
caller.clone(),
512533
packet.clone(),
513534
relayer.clone(),
514535
derive_batch_salt(i.try_into().unwrap(), salt),
@@ -534,7 +555,9 @@ fn acknowledge_internal(
534555
});
535556
}
536557
let multiplex = Multiplex::abi_decode_params(&instruction.operand, true)?;
537-
acknowledge_multiplex(deps, packet, relayer, path, multiplex, successful, ack)
558+
acknowledge_multiplex(
559+
deps, caller, packet, relayer, path, multiplex, successful, ack,
560+
)
538561
}
539562
_ => Err(ContractError::UnknownOpcode {
540563
opcode: instruction.opcode,
@@ -674,8 +697,10 @@ fn acknowledge_fungible_asset_order(
674697
}
675698
}
676699

700+
#[allow(clippy::too_many_arguments)]
677701
fn acknowledge_multiplex(
678702
deps: DepsMut,
703+
caller: Addr,
679704
packet: Packet,
680705
relayer: Addr,
681706
path: U256,
@@ -706,9 +731,10 @@ fn acknowledge_multiplex(
706731
Ok(Response::new().add_message(wasm_execute(
707732
sender_addr,
708733
&IbcUnionMsg::OnAcknowledgementPacket {
734+
caller: caller.into(),
709735
packet: multiplex_packet,
710736
acknowledgement: ack,
711-
relayer: relayer.to_string(),
737+
relayer: relayer.into(),
712738
},
713739
vec![],
714740
)?))
@@ -725,6 +751,7 @@ fn execute_packet(
725751
mut deps: DepsMut,
726752
env: Env,
727753
info: MessageInfo,
754+
caller: Addr,
728755
packet: Packet,
729756
relayer: Addr,
730757
relayer_msg: Bytes,
@@ -734,6 +761,7 @@ fn execute_packet(
734761
deps.branch(),
735762
env,
736763
info,
764+
caller,
737765
packet,
738766
relayer,
739767
relayer_msg,
@@ -754,6 +782,7 @@ fn execute_internal(
754782
deps: DepsMut,
755783
env: Env,
756784
info: MessageInfo,
785+
caller: Addr,
757786
packet: Packet,
758787
relayer: Addr,
759788
relayer_msg: Bytes,
@@ -792,6 +821,7 @@ fn execute_internal(
792821
deps,
793822
env,
794823
info,
824+
caller,
795825
packet,
796826
relayer,
797827
relayer_msg,
@@ -807,7 +837,16 @@ fn execute_internal(
807837
});
808838
}
809839
let multiplex = Multiplex::abi_decode_params(&instruction.operand, true)?;
810-
execute_multiplex(deps, env, packet, relayer, relayer_msg, path, multiplex)
840+
execute_multiplex(
841+
deps,
842+
env,
843+
caller,
844+
packet,
845+
relayer,
846+
relayer_msg,
847+
path,
848+
multiplex,
849+
)
811850
}
812851
OP_FORWARD => {
813852
if instruction.version > INSTR_VERSION_0 {
@@ -939,9 +978,11 @@ fn execute_forward(
939978
)?))
940979
}
941980

981+
#[allow(clippy::too_many_arguments)]
942982
fn execute_multiplex(
943983
deps: DepsMut,
944984
env: Env,
985+
caller: Addr,
945986
packet: Packet,
946987
relayer: Addr,
947988
relayer_msg: Bytes,
@@ -972,6 +1013,7 @@ fn execute_multiplex(
9721013
wasm_execute(
9731014
contract_address,
9741015
&IbcUnionMsg::OnRecvPacket {
1016+
caller: caller.into(),
9751017
packet: multiplex_packet,
9761018
relayer: relayer.into(),
9771019
relayer_msg,
@@ -1009,6 +1051,7 @@ fn execute_batch(
10091051
mut deps: DepsMut,
10101052
env: Env,
10111053
info: MessageInfo,
1054+
caller: Addr,
10121055
packet: Packet,
10131056
relayer: Addr,
10141057
relayer_msg: Bytes,
@@ -1023,6 +1066,7 @@ fn execute_batch(
10231066
deps.branch(),
10241067
env.clone(),
10251068
info.clone(),
1069+
caller.clone(),
10261070
packet.clone(),
10271071
relayer.clone(),
10281072
relayer_msg.clone(),

cosmwasm/ibc-union/app/ucs03-zkgm/src/msg.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ pub enum ExecuteMsg {
6969
/// Execute an Zkgm packet.
7070
/// Can only be called by the contract itself during packet handling.
7171
InternalExecutePacket {
72+
caller: Addr,
7273
packet: Packet,
7374
relayer: Addr,
7475
relayer_msg: Bytes,

cosmwasm/ibc-union/core/light-client-interface/src/lib.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -293,21 +293,26 @@ pub trait IbcClient: Sized {
293293

294294
/// Verify the initial state of the client
295295
fn verify_creation(
296+
caller: Addr,
296297
client_state: &Self::ClientState,
297298
consensus_state: &Self::ConsensusState,
299+
relayer: Addr,
298300
) -> Result<ClientCreationResult<Self>, IbcClientError<Self>>;
299301

300302
/// Verify `header` against the trusted state (`client_state` and `consensus_state`)
301303
/// and return `(updated height, updated client state, updated consensus state)`
302304
fn verify_header(
303305
ctx: IbcClientCtx<Self>,
304-
header: Self::Header,
305306
caller: Addr,
307+
header: Self::Header,
308+
relayer: Addr,
306309
) -> Result<StateUpdate<Self>, IbcClientError<Self>>;
307310

308311
fn misbehaviour(
309312
ctx: IbcClientCtx<Self>,
313+
caller: Addr,
310314
misbehaviour: Self::Misbehaviour,
315+
relayer: Addr,
311316
) -> Result<Self::ClientState, IbcClientError<Self>>;
312317
}
313318

@@ -354,17 +359,24 @@ pub fn query<T: IbcClient>(
354359
QueryMsg::VerifyCreation {
355360
// NOTE(aeryz): we don't need `client_id` since we already got the client and
356361
// consensus states
362+
caller,
357363
client_id: _,
358364
client_state,
359365
consensus_state,
366+
relayer,
360367
} => {
361368
let client_state = T::ClientState::decode_as::<T::Encoding>(&client_state)
362369
.map_err(|e| IbcClientError::Decode(DecodeError::ClientState(e)))?;
363370

364371
let consensus_state = T::ConsensusState::decode(&consensus_state)
365372
.map_err(|e| IbcClientError::Decode(DecodeError::ConsensusState(e)))?;
366373

367-
let client_creation = T::verify_creation(&client_state, &consensus_state)?;
374+
let client_creation = T::verify_creation(
375+
Addr::unchecked(caller),
376+
&client_state,
377+
&consensus_state,
378+
Addr::unchecked(relayer),
379+
)?;
368380

369381
let response = VerifyCreationResponse {
370382
latest_height: T::get_latest_height(&client_state),
@@ -418,7 +430,11 @@ pub fn query<T: IbcClient>(
418430

419431
to_json_binary(&()).map_err(Into::into)
420432
}
421-
QueryMsg::UpdateState { client_id, caller } => {
433+
QueryMsg::UpdateState {
434+
caller,
435+
client_id,
436+
relayer,
437+
} => {
422438
let ibc_host = deps.storage.read_item::<IbcHost>()?;
423439
let message = deps.querier.read_item::<QueryStore>(&ibc_host)?;
424440
let header =
@@ -431,8 +447,9 @@ pub fn query<T: IbcClient>(
431447
storage_writes,
432448
} = T::verify_header(
433449
IbcClientCtx::new(client_id, ibc_host, deps, env),
434-
header,
435450
Addr::unchecked(caller),
451+
header,
452+
Addr::unchecked(relayer),
436453
)?;
437454

438455
to_json_binary(
@@ -445,14 +462,21 @@ pub fn query<T: IbcClient>(
445462
)
446463
.map_err(Into::into)
447464
}
448-
QueryMsg::Misbehaviour { client_id, message } => {
465+
QueryMsg::Misbehaviour {
466+
caller,
467+
client_id,
468+
message,
469+
relayer,
470+
} => {
449471
let misbehaviour = T::Misbehaviour::decode_as::<T::Encoding>(&message)
450472
.map_err(DecodeError::Misbehaviour)?;
451473

452474
let ibc_host = deps.storage.read_item::<IbcHost>()?;
453475
let client_state = T::misbehaviour(
454476
IbcClientCtx::new(client_id, ibc_host, deps, env),
477+
Addr::unchecked(caller),
455478
misbehaviour,
479+
Addr::unchecked(relayer),
456480
)?;
457481

458482
to_json_binary(

0 commit comments

Comments
 (0)