From b43ea7745fdc62ae0a2a26099b08edb601f5fe79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rmungandrk?= Date: Thu, 13 Nov 2025 14:47:35 +0700 Subject: [PATCH] Update wasm_hook.go --- modules/ibc-hooks/wasm_hook.go | 37 +++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/modules/ibc-hooks/wasm_hook.go b/modules/ibc-hooks/wasm_hook.go index eb4fe771..5af0081d 100644 --- a/modules/ibc-hooks/wasm_hook.go +++ b/modules/ibc-hooks/wasm_hook.go @@ -304,9 +304,40 @@ func (h WasmHooks) OnAcknowledgementPacketOverride(im IBCMiddleware, ctx sdk.Con return err } - sudoMsg := []byte(fmt.Sprintf( - `{"ibc_lifecycle_complete": {"ibc_ack": {"channel": "%s", "sequence": %d, "ack": %s, "success": %s}}}`, - packet.SourceChannel, packet.Sequence, ackAsJson, success)) + // Construct message using struct to avoid unsafe quoting + type ibcAckMsg struct { + Channel string `json:"channel"` + Sequence uint64 `json:"sequence"` + Ack interface{} `json:"ack"` + Success string `json:"success"` + } + type ibcLifecycleCompleteMsg struct { + IbcAck ibcAckMsg `json:"ibc_ack"` + } + type sudoMsgWrapper struct { + IbcLifecycleComplete ibcLifecycleCompleteMsg `json:"ibc_lifecycle_complete"` + } + + // Unmarshal ackAsJson so it can be passed as a value, not a quoted string + var ackUnmarshaled interface{} + if err := json.Unmarshal(ackAsJson, &ackUnmarshaled); err != nil { + return err + } + + sudoMsgStruct := sudoMsgWrapper{ + IbcLifecycleComplete: ibcLifecycleCompleteMsg{ + IbcAck: ibcAckMsg{ + Channel: packet.SourceChannel, + Sequence: packet.Sequence, + Ack: ackUnmarshaled, + Success: success, + }, + }, + } + sudoMsg, err := json.Marshal(sudoMsgStruct) + if err != nil { + return err + } _, err = h.ContractKeeper.Sudo(ctx, contractAddr, sudoMsg) if err != nil { // error processing the callback