bridges.sol 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.0;
  3. import "../../utils/Address.sol";
  4. import "../../vendor/polygon/IFxMessageProcessor.sol";
  5. abstract contract BaseRelayMock {
  6. // needed to parse custom errors
  7. error NotCrossChainCall();
  8. error InvalidCrossChainSender(address sender, address expected);
  9. address internal _currentSender;
  10. function relayAs(
  11. address target,
  12. bytes calldata data,
  13. address sender
  14. ) external virtual {
  15. address previousSender = _currentSender;
  16. _currentSender = sender;
  17. (bool success, bytes memory returndata) = target.call(data);
  18. Address.verifyCallResult(success, returndata, "low-level call reverted");
  19. _currentSender = previousSender;
  20. }
  21. }
  22. /**
  23. * AMB
  24. */
  25. contract BridgeAMBMock is BaseRelayMock {
  26. function messageSender() public view returns (address) {
  27. return _currentSender;
  28. }
  29. }
  30. /**
  31. * Arbitrum
  32. */
  33. contract BridgeArbitrumL1Mock is BaseRelayMock {
  34. /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
  35. address public immutable inbox = address(new BridgeArbitrumL1Inbox());
  36. /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
  37. address public immutable outbox = address(new BridgeArbitrumL1Outbox());
  38. function activeOutbox() public view returns (address) {
  39. return outbox;
  40. }
  41. function currentSender() public view returns (address) {
  42. return _currentSender;
  43. }
  44. }
  45. contract BridgeArbitrumL1Inbox {
  46. /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
  47. address public immutable bridge = msg.sender;
  48. }
  49. contract BridgeArbitrumL1Outbox {
  50. /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment
  51. address public immutable bridge = msg.sender;
  52. function l2ToL1Sender() public view returns (address) {
  53. return BridgeArbitrumL1Mock(bridge).currentSender();
  54. }
  55. }
  56. contract BridgeArbitrumL2Mock is BaseRelayMock {
  57. function isTopLevelCall() public view returns (bool) {
  58. return _currentSender != address(0);
  59. }
  60. function wasMyCallersAddressAliased() public pure returns (bool) {
  61. return true;
  62. }
  63. function myCallersAddressWithoutAliasing() public view returns (address) {
  64. return _currentSender;
  65. }
  66. }
  67. /**
  68. * Optimism
  69. */
  70. contract BridgeOptimismMock is BaseRelayMock {
  71. function xDomainMessageSender() public view returns (address) {
  72. return _currentSender;
  73. }
  74. }
  75. /**
  76. * Polygon
  77. */
  78. contract BridgePolygonChildMock is BaseRelayMock {
  79. function relayAs(
  80. address target,
  81. bytes calldata data,
  82. address sender
  83. ) external override {
  84. IFxMessageProcessor(target).processMessageFromRoot(0, sender, data);
  85. }
  86. }