# Gas Experiment
```solidity
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.11;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../sushiXswap/interfaces/ISushiXSwap.sol";
contract GasProfiler {
using SafeERC20 for IERC20;
// Custom Error
error NotStargateRouter();
event StargateSushiXSwapDst(bytes32 indexed srcContext, bool failed);
IERC20 public stargateRouter = IERC20(0x8731d54E9D02c286767d56ac03e8037C07e01e98);
uint public gas0;
uint public gas1;
uint public gas2;
function setStargateRouter (address sgr) public {
stargateRouter = IERC20(sgr);
}
function profile(
uint16,
bytes memory,
uint256,
address _token,
uint256 amountLD,
bytes memory payload
) external {
gas0 = gasleft();
if (msg.sender != address(stargateRouter)) revert NotStargateRouter();
(
address to,
uint8[] memory actions,
uint256[] memory values,
bytes[] memory datas,
bytes32 srcContext
) = abi.decode(payload, (address, uint8[], uint256[], bytes[], bytes32));
uint256 limit = gasleft() - 200000;
bool failed;
/// @dev incase the actions fail, transfer bridge token to the to address
try
ISushiXSwap(payable(address(this))).cook{gas: limit}(
actions,
values,
datas
)
{} catch (bytes memory) {
gas1 = gasleft();
IERC20(_token).safeTransfer(to, amountLD);
failed = true;
}
/// @dev transfer any native token received as dust to the to address
if (address(this).balance > 0)
to.call{value: (address(this).balance)}("");
emit StargateSushiXSwapDst(srcContext, failed);
gas2 = gasleft();
}
function cook(
uint8[] memory actions,
uint256[] memory values,
bytes[] memory datas
) public payable {
revert();
}
/// @notice Allows the contract to receive Native tokens
receive() external payable {}
}
```
## Results
Running on forked mainnets:
Entry Gas: gas0-gas1
Exit Gas: gas1-gas2
**Eth Mainnet USDT**
Entry Gas: 28142
Exit Gas: 66143
**Eth Mainnet USDC**
Entry Gas: 28142
Exit Gas: 67581
**Polygon USDT**
Entry Gas: 28142
Exit Gas: 63762
**Polygon USDC**
Entry Gas: 28142
Exit Gas: 66108