diff --git a/contracts/evmx/fees/Credit.sol b/contracts/evmx/fees/Credit.sol index eb12043e..cdda8c39 100644 --- a/contracts/evmx/fees/Credit.sol +++ b/contracts/evmx/fees/Credit.sol @@ -121,18 +121,12 @@ abstract contract Credit is FeesManagerStorage, Initializable, Ownable, AppGatew } /// @notice Deposits credits and native tokens to a user - /// @param depositTo_ The address to deposit the credits to - /// @param chainSlug_ The chain slug - /// @param token_ The token address - /// @param nativeAmount_ The native amount - /// @param creditAmount_ The credit amount - function deposit( - uint32 chainSlug_, - address token_, - address depositTo_, - uint256 nativeAmount_, - uint256 creditAmount_ - ) external override onlyWatcher { + /// @param payload_ Encoded deposit parameters: (chainSlug, token, receiver, creditAmount, nativeAmount) + function deposit(bytes calldata payload_) external override onlyWatcher { + // Decode payload: (chainSlug, token, receiver, creditAmount, nativeAmount) + (uint32 chainSlug_, address token_, address depositTo_, uint256 creditAmount_, uint256 nativeAmount_) = + abi.decode(payload_, (uint32, address, address, uint256, uint256)); + tokenOnChainBalances[chainSlug_][token_] += creditAmount_ + nativeAmount_; // Mint tokens to the user @@ -142,9 +136,10 @@ abstract contract Credit is FeesManagerStorage, Initializable, Ownable, AppGatew bool success = feesPool.withdraw(depositTo_, nativeAmount_); if (!success) { - _mint(depositTo_, creditAmount_); - nativeAmount_ = 0; + // Convert failed native amount to credits + _mint(depositTo_, nativeAmount_); creditAmount_ += nativeAmount_; + nativeAmount_ = 0; } } diff --git a/contracts/evmx/interfaces/IFeesManager.sol b/contracts/evmx/interfaces/IFeesManager.sol index 4a96aa5a..97d20438 100644 --- a/contracts/evmx/interfaces/IFeesManager.sol +++ b/contracts/evmx/interfaces/IFeesManager.sol @@ -3,13 +3,7 @@ pragma solidity ^0.8.21; import {WriteFinality, AppGatewayApprovals, OverrideParams, Transaction, RawPayload, Payload} from "../../utils/common/Structs.sol"; interface IFeesManager { - function deposit( - uint32 chainSlug_, - address token_, - address depositTo_, - uint256 nativeAmount_, - uint256 creditAmount_ - ) external; + function deposit(bytes calldata payload_) external; function wrap(address receiver_) external payable; diff --git a/contracts/evmx/interfaces/IFeesPlug.sol b/contracts/evmx/interfaces/IFeesPlug.sol index 24cc719a..71b1134d 100644 --- a/contracts/evmx/interfaces/IFeesPlug.sol +++ b/contracts/evmx/interfaces/IFeesPlug.sol @@ -7,7 +7,8 @@ interface IFeesPlug { address token, address receiver, uint256 creditAmount, - uint256 nativeAmount + uint256 nativeAmount, + bytes32 payloadId ); /// @notice Event emitted when fees are withdrawn event FeesWithdrawn(address token, address receiver, uint256 amount); diff --git a/contracts/evmx/plugs/FeesPlug.sol b/contracts/evmx/plugs/FeesPlug.sol index 8320db52..a543ddd8 100644 --- a/contracts/evmx/plugs/FeesPlug.sol +++ b/contracts/evmx/plugs/FeesPlug.sol @@ -68,7 +68,17 @@ contract FeesPlug is IFeesPlug, PlugBase, AccessControl { ) internal { if (!whitelistedTokens[token_]) revert TokenNotWhitelisted(token_); token_.safeTransferFrom(msg.sender, address(this), creditAmount_ + nativeAmount_); - emit FeesDeposited(token_, receiver_, creditAmount_, nativeAmount_); + + // Get chain slug from socket + uint32 chainSlug_ = socket__.chainSlug(); + + // Encode deposit parameters: (chainSlug, token, receiver, creditAmount, nativeAmount) + bytes memory payload = abi.encode(chainSlug_, token_, receiver_, creditAmount_, nativeAmount_); + + // Create trigger via Socket to get unique payloadId + bytes32 payloadId = socket__.sendPayload(payload); + + emit FeesDeposited(token_, receiver_, creditAmount_, nativeAmount_, payloadId); } /// @notice Withdraws fees diff --git a/test/SetupTest.t.sol b/test/SetupTest.t.sol index 84118bab..16f1fbca 100644 --- a/test/SetupTest.t.sol +++ b/test/SetupTest.t.sol @@ -218,6 +218,7 @@ contract DeploySetup is SetupStore { // switchboard switchboard.registerSwitchboard(); + switchboard.setEvmxConfig(evmxSlug, 1); // Set EVMX config for trigger payloads switchboard.grantRole(WATCHER_ROLE, watcherEOA); switchboard.grantRole(RESCUE_ROLE, address(socketOwner)); @@ -430,7 +431,7 @@ contract FeesSetup is DeploySetup { vm.expectEmit(true, true, true, false); emit Deposited(chainSlug_, address(token), user_, credits_, native_); hoax(watcherEOA); - feesManager.deposit(chainSlug_, address(token), user_, native_, credits_); + feesManager.deposit(abi.encode(chainSlug_, address(token), user_, native_, credits_)); assertEq( feesManager.balanceOf(user_),