diff --git a/contracts/gas-service/AxelarGasService.sol b/contracts/gas-service/AxelarGasService.sol index 58749bd1..ba452839 100644 --- a/contracts/gas-service/AxelarGasService.sol +++ b/contracts/gas-service/AxelarGasService.sol @@ -97,6 +97,28 @@ contract AxelarGasService is Upgradable, IAxelarGasService { ); } + function addGas( + bytes32 txHash, + uint256 logIndex, + address gasToken, + uint256 gasFeeAmount, + address refundAddress + ) external override { + _safeTransferFrom(gasToken, msg.sender, gasFeeAmount); + + emit GasAdded(txHash, logIndex, gasToken, gasFeeAmount, refundAddress); + } + + function addNativeGas( + bytes32 txHash, + uint256 logIndex, + address refundAddress + ) external payable override { + if (msg.value == 0) revert NothingReceived(); + + emit NativeGasAdded(txHash, logIndex, msg.value, refundAddress); + } + function collectFees(address payable receiver, address[] calldata tokens) external onlyOwner { for (uint256 i; i < tokens.length; i++) { address token = tokens[i]; diff --git a/contracts/interfaces/IAxelarGasService.sol b/contracts/interfaces/IAxelarGasService.sol index c10c1074..6a5663af 100644 --- a/contracts/interfaces/IAxelarGasService.sol +++ b/contracts/interfaces/IAxelarGasService.sol @@ -51,6 +51,10 @@ interface IAxelarGasService is IUpgradable { address refundAddress ); + event GasAdded(bytes32 indexed txHash, uint256 indexed logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress); + + event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress); + // This is called on the source chain before calling the gateway to execute a remote contract. function payGasForContractCall( address sender, @@ -95,6 +99,20 @@ interface IAxelarGasService is IUpgradable { address refundAddress ) external payable; + function addGas( + bytes32 txHash, + uint256 txIndex, + address gasToken, + uint256 gasFeeAmount, + address refundAddress + ) external; + + function addNativeGas( + bytes32 txHash, + uint256 logIndex, + address refundAddress + ) external payable; + function collectFees(address payable receiver, address[] calldata tokens) external; function refund( diff --git a/test/gmp/AxelarGasService.js b/test/gmp/AxelarGasService.js index fb865cc6..4999e839 100644 --- a/test/gmp/AxelarGasService.js +++ b/test/gmp/AxelarGasService.js @@ -234,4 +234,25 @@ describe('AxelarGasService', () => { await expect(await gasService.owner()).to.be.equal(userWallet.address); }); }); + + it('should emit events when gas is added', async () => { + const txHash = keccak256(defaultAbiCoder.encode(['string'], ['random tx hash'])); + const logIndex = 13; + const gasToken = testToken.address; + const gasFeeAmount = 1000; + const nativeGasFeeAmount = parseEther('1.0'); + + await testToken.connect(userWallet).approve(gasService.address, 1e6); + + await expect(gasService.connect(userWallet).addGas(txHash, logIndex, gasToken, gasFeeAmount, userWallet.address)) + .to.emit(gasService, 'GasAdded') + .withArgs(txHash, logIndex, gasToken, gasFeeAmount, userWallet.address) + .and.to.emit(testToken, 'Transfer') + .withArgs(userWallet.address, gasService.address, gasFeeAmount); + + await expect(await gasService.connect(userWallet).addNativeGas(txHash, logIndex, userWallet.address, { value: nativeGasFeeAmount })) + .to.emit(gasService, 'NativeGasAdded') + .withArgs(txHash, logIndex, nativeGasFeeAmount, userWallet.address) + .and.to.changeEtherBalance(gasService, nativeGasFeeAmount); + }); });