LoopBackMock.sol 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // SPDX-License-Identifier: BUSL-1.1
  2. pragma solidity 0.7.6;
  3. pragma abicoder v2;
  4. import "../interfaces/IMirrorgateReceiver.sol";
  5. import "../interfaces/IMirrorgateRouter.sol";
  6. import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
  7. import "hardhat/console.sol";
  8. contract LoopBackMock is IMirrorgateReceiver {
  9. IMirrorgateRouter public immutable router;
  10. event LoopBack(bytes srcAddress, uint256 srcPoolId, uint256 dstPoolId, uint256 amount);
  11. constructor(address _router) {
  12. router = IMirrorgateRouter(_router);
  13. }
  14. bool paused;
  15. function mgReceive(
  16. uint16 _chainId,
  17. bytes memory _srcAddress,
  18. uint256, /*_nonce*/
  19. address _token,
  20. uint256 amountLD,
  21. bytes memory payload
  22. ) external override {
  23. require(!paused, "Failed sgReceive due to pause");
  24. require(msg.sender == address(router), "only router");
  25. uint256 halfAmount = amountLD / 2;
  26. bytes memory srcAddress = _srcAddress;
  27. // approve the router to spend the halfAmount;
  28. IERC20(_token).approve(address(router), halfAmount);
  29. IMirrorgateRouter.lzTxObj memory txObj = IMirrorgateRouter.lzTxObj(500000, 0, "");
  30. (uint256 srcPoolId, uint256 dstPoolId) = abi.decode(payload, (uint256, uint256));
  31. (uint256 nativeFee, ) = router.quoteLayerZeroFee(_chainId, 1, srcAddress, "", txObj);
  32. router.swap{value: nativeFee}(_chainId, srcPoolId, dstPoolId, address(this), halfAmount, 0, txObj, srcAddress, bytes("0x"));
  33. emit LoopBack(srcAddress, srcPoolId, dstPoolId, halfAmount);
  34. }
  35. function pause(bool _paused) external {
  36. paused = _paused;
  37. }
  38. // be able to receive ether
  39. fallback() external payable {}
  40. receive() external payable {}
  41. }