From 14ae62e2ac74db9b7a0c7ccf9b1d79b5904eacef Mon Sep 17 00:00:00 2001 From: Hussein Ait Lahcen Date: Wed, 3 Sep 2025 22:53:06 +0200 Subject: [PATCH] chore(zkgm): allow empty/invalid mm address on ack --- .../ibc-union/app/ucs03-zkgm/src/contract.rs | 42 ++++++++----------- evm/contracts/apps/ucs/03-zkgm/TokenOrder.sol | 28 +++++++++---- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/cosmwasm/ibc-union/app/ucs03-zkgm/src/contract.rs b/cosmwasm/ibc-union/app/ucs03-zkgm/src/contract.rs index f085c02e6c..3db3025d09 100644 --- a/cosmwasm/ibc-union/app/ucs03-zkgm/src/contract.rs +++ b/cosmwasm/ibc-union/app/ucs03-zkgm/src/contract.rs @@ -972,23 +972,21 @@ fn acknowledge_fungible_asset_order_v2( let minter = TOKEN_MINTER.load(deps.storage)?; if order.kind == TOKEN_ORDER_KIND_UNESCROW { - let market_maker = deps - .api - .addr_validate( - str::from_utf8(ack.market_maker.as_ref()) - .map_err(|_| ContractError::InvalidReceiver)?, - ) - .map_err(|_| ContractError::UnableToValidateMarketMaker)?; // Mint tokens to market maker (EVM: IZkgmERC20(address(baseToken)).mint(marketMaker, order.baseAmount)) - messages.push(make_wasm_msg( - WrappedTokenMsg::MintTokens { - denom: base_denom, - amount: base_amount.into(), - mint_to_address: market_maker, - }, - minter, - vec![], - )?); + if let Some(market_maker) = str::from_utf8(ack.market_maker.as_ref()) + .ok() + .and_then(|x| deps.api.addr_validate(x).ok()) + { + messages.push(make_wasm_msg( + WrappedTokenMsg::MintTokens { + denom: base_denom, + amount: base_amount.into(), + mint_to_address: market_maker, + }, + minter, + vec![], + )?); + } } else { // Decrease channel balance and transfer (EVM: _decreaseOutstandingV2 + safeTransfer) decrease_channel_balance_v2( @@ -1013,14 +1011,10 @@ fn acknowledge_fungible_asset_order_v2( minter, vec![], )?); - } else { - let market_maker = deps - .api - .addr_validate( - str::from_utf8(ack.market_maker.as_ref()) - .map_err(|_| ContractError::InvalidReceiver)?, - ) - .map_err(|_| ContractError::UnableToValidateMarketMaker)?; + } else if let Some(market_maker) = str::from_utf8(ack.market_maker.as_ref()) + .ok() + .and_then(|x| deps.api.addr_validate(x).ok()) + { messages.push(make_wasm_msg( LocalTokenMsg::Unescrow { denom: base_denom, diff --git a/evm/contracts/apps/ucs/03-zkgm/TokenOrder.sol b/evm/contracts/apps/ucs/03-zkgm/TokenOrder.sol index d503cefc98..6d5200dde7 100644 --- a/evm/contracts/apps/ucs/03-zkgm/TokenOrder.sol +++ b/evm/contracts/apps/ucs/03-zkgm/TokenOrder.sol @@ -615,13 +615,15 @@ contract UCS03ZkgmTokenOrderImpl is Versioned, TokenBucket, UCS03ZkgmStore { } else if (assetOrderAck.fillType == ZkgmLib.FILL_TYPE_MARKETMAKER) { // A market maker filled, we pay with the sent asset. - address marketMaker = - address(bytes20(assetOrderAck.marketMaker)); address baseToken = address(bytes20(order.baseToken)); if (order.kind == ZkgmLib.TOKEN_ORDER_KIND_UNESCROW) { - IZkgmERC20(address(baseToken)).mint( - marketMaker, order.baseAmount - ); + if (assetOrderAck.marketMaker.length == 20) { + address marketMaker = + address(bytes20(assetOrderAck.marketMaker)); + IZkgmERC20(address(baseToken)).mint( + marketMaker, order.baseAmount + ); + } } else { _decreaseOutstandingV2( ibcPacket.sourceChannelId, @@ -631,14 +633,22 @@ contract UCS03ZkgmTokenOrderImpl is Versioned, TokenBucket, UCS03ZkgmStore { order.baseAmount ); // Check if the counterparty minted and wants us to burn to net. - if (marketMaker == address(0)) { + if ( + assetOrderAck.marketMaker.eq( + abi.encodePacked(address(0)) + ) + ) { IZkgmERC20(baseToken).burn( address(this), order.baseAmount ); } else { - IERC20(baseToken).safeTransfer( - marketMaker, order.baseAmount - ); + if (assetOrderAck.marketMaker.length == 20) { + address marketMaker = + address(bytes20(assetOrderAck.marketMaker)); + IERC20(baseToken).safeTransfer( + marketMaker, order.baseAmount + ); + } } } } else {