bridges.sol 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. address public immutable inbox = address(new BridgeArbitrumL1Inbox());
  35. address public immutable outbox = address(new BridgeArbitrumL1Outbox());
  36. function activeOutbox() public view returns (address) {
  37. return outbox;
  38. }
  39. function currentSender() public view returns (address) {
  40. return _currentSender;
  41. }
  42. }
  43. contract BridgeArbitrumL1Inbox {
  44. address public immutable bridge = msg.sender;
  45. }
  46. contract BridgeArbitrumL1Outbox {
  47. address public immutable bridge = msg.sender;
  48. function l2ToL1Sender() public view returns (address) {
  49. return BridgeArbitrumL1Mock(bridge).currentSender();
  50. }
  51. }
  52. contract BridgeArbitrumL2Mock is BaseRelayMock {
  53. function isTopLevelCall() public view returns (bool) {
  54. return _currentSender != address(0);
  55. }
  56. function wasMyCallersAddressAliased() public pure returns (bool) {
  57. return true;
  58. }
  59. function myCallersAddressWithoutAliasing() public view returns (address) {
  60. return _currentSender;
  61. }
  62. }
  63. /**
  64. * Optimism
  65. */
  66. contract BridgeOptimismMock is BaseRelayMock {
  67. function xDomainMessageSender() public view returns (address) {
  68. return _currentSender;
  69. }
  70. }
  71. /**
  72. * Polygon
  73. */
  74. contract BridgePolygonChildMock is BaseRelayMock {
  75. function relayAs(
  76. address target,
  77. bytes calldata data,
  78. address sender
  79. ) external override {
  80. IFxMessageProcessor(target).processMessageFromRoot(0, sender, data);
  81. }
  82. }