@layerzerolabs/lz-evm-messagelib-v2 2.0.13 → 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/artifacts/contracts/Executor.sol/Executor.json +20 -20
  2. package/artifacts/contracts/ExecutorFeeLib.sol/ExecutorFeeLib.json +19 -19
  3. package/artifacts/contracts/MessageLibBase.sol/MessageLibBase.json +1 -1
  4. package/artifacts/contracts/PriceFeed.sol/PriceFeed.json +15 -15
  5. package/artifacts/contracts/ReceiveLibBaseE2.sol/ReceiveLibBaseE2.json +1 -1
  6. package/artifacts/contracts/SendLibBase.sol/SendLibBase.json +6 -6
  7. package/artifacts/contracts/SendLibBaseE2.sol/SendLibBaseE2.json +10 -10
  8. package/artifacts/contracts/Treasury.sol/Treasury.json +9 -9
  9. package/artifacts/contracts/Worker.sol/Worker.json +18 -18
  10. package/artifacts/contracts/interfaces/IExecutor.sol/IExecutor.json +3 -3
  11. package/artifacts/contracts/interfaces/IExecutorFeeLib.sol/IExecutorFeeLib.json +4 -4
  12. package/artifacts/contracts/interfaces/ILayerZeroPriceFeed.sol/ILayerZeroPriceFeed.json +3 -3
  13. package/artifacts/contracts/interfaces/IWorker.sol/IWorker.json +3 -3
  14. package/artifacts/contracts/uln/LzExecutor.sol/IReceiveUlnView.json +35 -0
  15. package/artifacts/contracts/uln/LzExecutor.sol/LzExecutor.json +279 -20
  16. package/artifacts/contracts/uln/ReceiveUlnBase.sol/ReceiveUlnBase.json +90 -11
  17. package/artifacts/contracts/uln/SendUlnBase.sol/SendUlnBase.json +7 -7
  18. package/artifacts/contracts/uln/UlnBase.sol/UlnBase.json +7 -7
  19. package/artifacts/contracts/uln/dvn/DVN.sol/DVN.json +31 -31
  20. package/artifacts/contracts/uln/dvn/DVNFeeLib.sol/DVNFeeLib.json +14 -14
  21. package/artifacts/contracts/uln/dvn/MultiSig.sol/MultiSig.json +5 -5
  22. package/artifacts/contracts/uln/dvn/adapters/CCIP/CCIPDVNAdapter.sol/CCIPDVNAdapter.json +488 -169
  23. package/artifacts/contracts/uln/dvn/adapters/CCIP/CCIPDVNAdapterFeeLib.sol/CCIPDVNAdapterFeeLib.json +372 -16
  24. package/artifacts/contracts/uln/dvn/adapters/DVNAdapterBase.sol/DVNAdapterBase.json +419 -93
  25. package/artifacts/contracts/uln/dvn/adapters/DVNAdapterBase.sol/IReceiveUln.json +34 -0
  26. package/artifacts/contracts/uln/dvn/adapters/DVNAdapterBase.sol/ISendLibBase.json +30 -0
  27. package/artifacts/contracts/uln/dvn/adapters/arbitrum/ArbitrumDVNAdapterL1.sol/ArbitrumDVNAdapterL1.json +936 -0
  28. package/artifacts/contracts/uln/dvn/adapters/arbitrum/ArbitrumDVNAdapterL2.sol/ArbitrumDVNAdapterL2.json +868 -0
  29. package/artifacts/contracts/uln/dvn/adapters/axelar/AxelarDVNAdapter.sol/AxelarDVNAdapter.json +611 -249
  30. package/artifacts/contracts/uln/dvn/adapters/axelar/AxelarDVNAdapter.sol/ISendLibBase.json +30 -0
  31. package/artifacts/contracts/uln/dvn/adapters/axelar/AxelarDVNAdapterFeeLib.sol/AxelarDVNAdapterFeeLib.json +526 -13
  32. package/artifacts/contracts/uln/dvn/adapters/libs/DVNAdapterMessageCodec.sol/DVNAdapterMessageCodec.json +16 -0
  33. package/artifacts/contracts/uln/dvn/adapters/optimism/OptimismDVNAdapterL1.sol/OptimismDVNAdapterL1.json +924 -0
  34. package/artifacts/contracts/uln/dvn/adapters/optimism/OptimismDVNAdapterL2.sol/OptimismDVNAdapterL2.json +891 -0
  35. package/artifacts/contracts/uln/interfaces/IDVN.sol/IDVN.json +3 -3
  36. package/artifacts/contracts/uln/interfaces/IDVNFeeLib.sol/IDVNFeeLib.json +1 -1
  37. package/artifacts/contracts/uln/interfaces/IReceiveUlnE2.sol/IReceiveUlnE2.json +0 -24
  38. package/artifacts/contracts/uln/interfaces/adapters/IAxelarDVNAdapter.sol/IAxelarDVNAdapter.json +160 -0
  39. package/artifacts/contracts/uln/interfaces/adapters/IAxelarDVNAdapterFeeLib.sol/IAxelarDVNAdapterFeeLib.json +282 -0
  40. package/artifacts/contracts/uln/interfaces/adapters/ICCIPDVNAdapter.sol/ICCIPDVNAdapter.json +91 -0
  41. package/artifacts/contracts/uln/interfaces/adapters/ICCIPDVNAdapterFeeLib.sol/ICCIPDVNAdapterFeeLib.json +290 -0
  42. package/artifacts/contracts/uln/libs/DVNOptions.sol/DVNOptions.json +4 -4
  43. package/artifacts/contracts/uln/libs/UlnOptions.sol/UlnOptions.json +7 -7
  44. package/artifacts/contracts/uln/uln301/AddressSizeConfig.sol/AddressSizeConfig.json +2 -2
  45. package/artifacts/contracts/uln/uln301/ReceiveLibBaseE1.sol/ReceiveLibBaseE1.json +5 -5
  46. package/artifacts/contracts/uln/uln301/ReceiveUln301.sol/ReceiveUln301.json +88 -57
  47. package/artifacts/contracts/uln/uln301/ReceiveUln301View.sol/IReceiveUln301.json +178 -0
  48. package/artifacts/contracts/uln/uln301/ReceiveUln301View.sol/ReceiveUln301View.json +126 -0
  49. package/artifacts/contracts/uln/uln301/SendLibBaseE1.sol/SendLibBaseE1.json +15 -15
  50. package/artifacts/contracts/uln/uln301/SendUln301.sol/SendUln301.json +76 -76
  51. package/artifacts/contracts/uln/uln301/TreasuryFeeHandler.sol/TreasuryFeeHandler.json +5 -5
  52. package/artifacts/contracts/uln/uln301/interfaces/IMessageLibE1.sol/IMessageLibE1.json +4 -4
  53. package/artifacts/contracts/uln/uln302/ReceiveUln302.sol/ReceiveUln302.json +79 -24
  54. package/artifacts/contracts/uln/uln302/ReceiveUln302View.sol/IReceiveUln302.json +146 -0
  55. package/artifacts/contracts/uln/uln302/ReceiveUln302View.sol/ReceiveUln302View.json +251 -0
  56. package/artifacts/contracts/uln/uln302/SendUln302.sol/SendUln302.json +75 -75
  57. package/artifacts/contracts/upgradeable/WorkerUpgradeable.sol/WorkerUpgradeable.json +18 -18
  58. package/contracts/ExecutorFeeLib.sol +6 -6
  59. package/contracts/MessageLibBase.sol +2 -2
  60. package/contracts/PriceFeed.sol +3 -3
  61. package/contracts/ReceiveLibBaseE2.sol +0 -26
  62. package/contracts/SendLibBase.sol +10 -10
  63. package/contracts/SendLibBaseE2.sol +4 -4
  64. package/contracts/Treasury.sol +2 -2
  65. package/contracts/Worker.sol +3 -3
  66. package/contracts/interfaces/IExecutorFeeLib.sol +4 -4
  67. package/contracts/interfaces/ILayerZeroPriceFeed.sol +3 -3
  68. package/contracts/interfaces/IWorker.sol +3 -3
  69. package/contracts/uln/LzExecutor.sol +51 -19
  70. package/contracts/uln/ReceiveUlnBase.sol +21 -14
  71. package/contracts/uln/UlnBase.sol +19 -19
  72. package/contracts/uln/dvn/DVN.sol +16 -16
  73. package/contracts/uln/dvn/DVNFeeLib.sol +2 -2
  74. package/contracts/uln/dvn/MultiSig.sol +13 -13
  75. package/contracts/uln/dvn/adapters/CCIP/CCIPDVNAdapter.sol +95 -97
  76. package/contracts/uln/dvn/adapters/CCIP/CCIPDVNAdapterFeeLib.sol +64 -2
  77. package/contracts/uln/dvn/adapters/DVNAdapterBase.sol +74 -124
  78. package/contracts/uln/dvn/adapters/arbitrum/ArbitrumDVNAdapterL1.sol +126 -0
  79. package/contracts/uln/dvn/adapters/arbitrum/ArbitrumDVNAdapterL2.sol +50 -0
  80. package/contracts/uln/dvn/adapters/avalanche/NOTES.md +4 -0
  81. package/contracts/uln/dvn/adapters/axelar/AxelarDVNAdapter.sol +85 -100
  82. package/contracts/uln/dvn/adapters/axelar/AxelarDVNAdapterFeeLib.sol +121 -2
  83. package/contracts/uln/dvn/adapters/libs/DVNAdapterMessageCodec.sol +36 -0
  84. package/contracts/uln/dvn/adapters/optimism/OptimismDVNAdapterL1.sol +86 -0
  85. package/contracts/uln/dvn/adapters/optimism/OptimismDVNAdapterL2.sol +58 -0
  86. package/contracts/uln/interfaces/IDVNFeeLib.sol +1 -1
  87. package/contracts/uln/interfaces/IReceiveUlnE2.sol +0 -5
  88. package/contracts/uln/interfaces/adapters/IAxelarDVNAdapter.sol +45 -0
  89. package/contracts/uln/interfaces/adapters/IAxelarDVNAdapterFeeLib.sol +48 -0
  90. package/contracts/uln/interfaces/adapters/ICCIPDVNAdapter.sol +30 -0
  91. package/contracts/uln/interfaces/adapters/ICCIPDVNAdapterFeeLib.sol +45 -0
  92. package/contracts/uln/libs/DVNOptions.sol +6 -6
  93. package/contracts/uln/libs/UlnOptions.sol +13 -13
  94. package/contracts/uln/uln301/AddressSizeConfig.sol +4 -4
  95. package/contracts/uln/uln301/ReceiveLibBaseE1.sol +4 -4
  96. package/contracts/uln/uln301/ReceiveUln301.sol +4 -41
  97. package/contracts/uln/uln301/ReceiveUln301View.sol +89 -0
  98. package/contracts/uln/uln301/SendLibBaseE1.sol +5 -5
  99. package/contracts/uln/uln301/SendUln301.sol +3 -3
  100. package/contracts/uln/uln301/TreasuryFeeHandler.sol +6 -6
  101. package/contracts/uln/uln301/interfaces/IMessageLibE1.sol +4 -4
  102. package/contracts/uln/uln302/ReceiveUln302.sol +4 -27
  103. package/contracts/uln/uln302/ReceiveUln302View.sol +89 -0
  104. package/contracts/uln/uln302/SendUln302.sol +3 -3
  105. package/contracts/upgradeable/WorkerUpgradeable.sol +3 -3
  106. package/package.json +7 -5
  107. package/artifacts/contracts/uln/dvn/adapters/DVNAdapterFeeLibBase.sol/DVNAdapterFeeLibBase.json +0 -50
  108. package/artifacts/contracts/uln/interfaces/IDVNAdapterFeeLib.sol/IDVNAdapterFeeLib.json +0 -50
  109. package/contracts/uln/dvn/adapters/DVNAdapterFeeLibBase.sol +0 -20
  110. package/contracts/uln/interfaces/IDVNAdapterFeeLib.sol +0 -13
@@ -2,6 +2,125 @@
2
2
 
3
3
  pragma solidity ^0.8.20;
4
4
 
5
- import { DVNAdapterFeeLibBase } from "../DVNAdapterFeeLibBase.sol";
5
+ import { Proxied } from "hardhat-deploy/solc_0.8/proxy/Proxied.sol";
6
+ import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
7
+ import { IAxelarGasService } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol";
8
+ import { Transfer } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/Transfer.sol";
6
9
 
7
- contract AxelarDVNAdapterFeeLib is DVNAdapterFeeLibBase {}
10
+ import { IAxelarDVNAdapter } from "../../../interfaces/adapters/IAxelarDVNAdapter.sol";
11
+ import { IAxelarDVNAdapterFeeLib } from "../../../interfaces/adapters/IAxelarDVNAdapterFeeLib.sol";
12
+ import { ILayerZeroPriceFeed } from "../../../../interfaces/ILayerZeroPriceFeed.sol";
13
+
14
+ contract AxelarDVNAdapterFeeLib is OwnableUpgradeable, Proxied, IAxelarDVNAdapterFeeLib {
15
+ uint16 internal constant BPS_DENOMINATOR = 10000;
16
+
17
+ /// @dev to be applied to native gas fee before sending to Axelar Gas Service
18
+ uint16 public nativeGasFeeMultiplierBps;
19
+
20
+ IAxelarDVNAdapter public dvn;
21
+ IAxelarGasService public gasService;
22
+ ILayerZeroPriceFeed public priceFeed;
23
+
24
+ mapping(uint32 dstEid => DstConfig) public dstConfig;
25
+
26
+ function initialize(
27
+ address _gasService,
28
+ address _dvn,
29
+ uint16 _nativeGasFeeMultiplierBps
30
+ ) external proxied initializer {
31
+ __Ownable_init();
32
+ gasService = IAxelarGasService(_gasService);
33
+ dvn = IAxelarDVNAdapter(_dvn);
34
+ nativeGasFeeMultiplierBps = _nativeGasFeeMultiplierBps;
35
+ }
36
+
37
+ // ================================ OnlyOwner ================================
38
+ function withdrawToken(address _token, address _to, uint256 _amount) external onlyOwner {
39
+ // transfers native if _token is address(0x0)
40
+ Transfer.nativeOrToken(_token, _to, _amount);
41
+ emit TokenWithdrawn(_token, _to, _amount);
42
+ }
43
+
44
+ function setGasService(address _gasService) external onlyOwner {
45
+ gasService = IAxelarGasService(_gasService);
46
+ emit GasServiceSet(_gasService);
47
+ }
48
+
49
+ function setPriceFeed(address _priceFeed) external onlyOwner {
50
+ priceFeed = ILayerZeroPriceFeed(_priceFeed);
51
+ emit PriceFeedSet(_priceFeed);
52
+ }
53
+
54
+ function setDstConfig(DstConfigParam[] calldata _param) external onlyOwner {
55
+ for (uint256 i = 0; i < _param.length; i++) {
56
+ DstConfigParam calldata param = _param[i];
57
+ dstConfig[param.dstEid] = DstConfig({ gas: param.gas, floorMarginUSD: param.floorMarginUSD });
58
+ }
59
+ emit DstConfigSet(_param);
60
+ }
61
+
62
+ function setNativeGasFeeMultiplierBps(uint16 _multiplierBps) external onlyOwner {
63
+ nativeGasFeeMultiplierBps = _multiplierBps;
64
+ emit NativeGasFeeMultiplierBpsSet(_multiplierBps);
65
+ }
66
+
67
+ // ================================ External ================================
68
+ function getFeeOnSend(
69
+ Param calldata _param,
70
+ IAxelarDVNAdapter.DstConfig calldata _dstConfig,
71
+ bytes memory _payload,
72
+ bytes calldata _options,
73
+ address _sendLib
74
+ ) external payable returns (uint256 totalFee) {
75
+ if (_options.length > 0) revert AxelarDVNAdapter_OptionsUnsupported();
76
+
77
+ uint256 axelarFee = _getAxelarFee(_dstConfig.nativeGasFee);
78
+ totalFee = _applyPremium(_dstConfig.multiplierBps, _param.defaultMultiplierBps, axelarFee);
79
+
80
+ // withdraw from uln to fee lib if not enough balance
81
+ uint256 balance = address(this).balance;
82
+ if (balance < axelarFee) {
83
+ dvn.withdrawToFeeLib(_sendLib);
84
+
85
+ // revert if still not enough
86
+ balance = address(this).balance;
87
+ if (balance < axelarFee) revert AxelarDVNAdapter_InsufficientBalance(balance, axelarFee);
88
+ }
89
+
90
+ // pay axelar gas service
91
+ gasService.payNativeGasForContractCall{ value: axelarFee }(
92
+ address(this), // sender
93
+ _dstConfig.chainName, // destinationChain
94
+ _dstConfig.peer, // destinationAddress
95
+ _payload, // payload
96
+ address(this) // refundAddress
97
+ );
98
+ }
99
+
100
+ function getFee(
101
+ Param calldata _param,
102
+ IAxelarDVNAdapter.DstConfig calldata _dstConfig,
103
+ bytes calldata _options
104
+ ) external view returns (uint256 totalFee) {
105
+ if (_options.length > 0) revert AxelarDVNAdapter_OptionsUnsupported();
106
+
107
+ uint256 axelarFee = _getAxelarFee(_dstConfig.nativeGasFee);
108
+ totalFee = _applyPremium(_dstConfig.multiplierBps, _param.defaultMultiplierBps, axelarFee);
109
+ }
110
+
111
+ // ================================ Internal ================================
112
+ function _getAxelarFee(uint256 _nativeGasFee) internal view returns (uint256) {
113
+ return (_nativeGasFee * nativeGasFeeMultiplierBps) / BPS_DENOMINATOR;
114
+ }
115
+
116
+ function _applyPremium(
117
+ uint16 multiplierBps,
118
+ uint16 defaultMultiplierBps,
119
+ uint256 fee
120
+ ) internal pure returns (uint256) {
121
+ uint256 multiplier = multiplierBps == 0 ? defaultMultiplierBps : multiplierBps;
122
+ return (fee * multiplier) / BPS_DENOMINATOR;
123
+ }
124
+
125
+ receive() external payable {}
126
+ }
@@ -0,0 +1,36 @@
1
+ // SPDX-License-Identifier: LZBL-1.2
2
+
3
+ pragma solidity ^0.8.20;
4
+
5
+ import { AddressCast } from "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/AddressCast.sol";
6
+
7
+ library DVNAdapterMessageCodec {
8
+ using AddressCast for bytes32;
9
+
10
+ error DVNAdapter_InvalidMessageSize();
11
+
12
+ uint256 private constant RECEIVE_LIB_OFFSET = 0;
13
+ uint256 private constant PAYLOAD_HASH_OFFSET = 32;
14
+ uint256 private constant PACKET_HEADER_OFFSET = 64;
15
+
16
+ uint256 internal constant PACKET_HEADER_SIZE = 81; // version(uint8) + nonce(uint64) + path(uint32,bytes32,uint32,bytes32)
17
+ uint256 internal constant MESSAGE_SIZE = 32 + 32 + PACKET_HEADER_SIZE; // receive_lib(bytes32) + payloadHash(bytes32) + packetHeader
18
+
19
+ function encode(
20
+ bytes32 _receiveLib,
21
+ bytes memory _packetHeader,
22
+ bytes32 _payloadHash
23
+ ) internal pure returns (bytes memory payload) {
24
+ return abi.encodePacked(_receiveLib, _payloadHash, _packetHeader);
25
+ }
26
+
27
+ function decode(
28
+ bytes calldata _message
29
+ ) internal pure returns (address receiveLib, bytes memory packetHeader, bytes32 payloadHash) {
30
+ if (_message.length != MESSAGE_SIZE) revert DVNAdapter_InvalidMessageSize();
31
+
32
+ receiveLib = bytes32(_message[RECEIVE_LIB_OFFSET:PAYLOAD_HASH_OFFSET]).toAddress();
33
+ payloadHash = bytes32(_message[PAYLOAD_HASH_OFFSET:PACKET_HEADER_OFFSET]);
34
+ packetHeader = _message[PACKET_HEADER_OFFSET:];
35
+ }
36
+ }
@@ -0,0 +1,86 @@
1
+ // SPDX-License-Identifier: BUSL-1.1
2
+
3
+ pragma solidity ^0.8.20;
4
+
5
+ import { ICrossDomainMessenger } from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
6
+
7
+ import { OptimismDVNAdapterL2 } from "./OptimismDVNAdapterL2.sol";
8
+ import { DVNAdapterMessageCodec } from "../libs/DVNAdapterMessageCodec.sol";
9
+ import { DVNAdapterBase } from "../DVNAdapterBase.sol";
10
+
11
+ /// @title OptimismDVNAdapterL1
12
+ /// @dev How Optimism DVN adapter works:
13
+ /// 1. call `sendMessage` on the L1CrossDomainMessenger contract.
14
+ /// refer to https://docs.optimism.io/builders/dapp-developers/bridging/messaging#basics-of-communication-between-layers
15
+ /// @dev Recovery:
16
+ /// 1. If the message is not executed or failed to execute on the destination chain, you can manually retry by calling `relayMessage` on the `CrossDomainMessenger` contract.
17
+ /// refer to https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/CrossDomainMessenger.sol#L211C14-L211C26
18
+ contract OptimismDVNAdapterL1 is DVNAdapterBase {
19
+ // --- Errors ---
20
+ error OnlyOptimism();
21
+ error NoPeer();
22
+
23
+ // --- Events ---
24
+ event PeerSet(address indexed peer);
25
+ event GasLimitSet(uint32 gasLimit);
26
+
27
+ uint32 public immutable optimismEid; // eid % 30000 (v1 eid)
28
+ address public immutable l1Messenger; // L1CrossDomainMessenger
29
+
30
+ uint32 public gasLimit;
31
+ address public peer;
32
+
33
+ constructor(
34
+ address[] memory _admins,
35
+ uint32 _optimismEid,
36
+ address _l1Messenger
37
+ ) DVNAdapterBase(msg.sender, _admins, 12000) {
38
+ optimismEid = _optimismEid; // eid % 30000 (v1 eid)
39
+ l1Messenger = _l1Messenger;
40
+ }
41
+
42
+ // --- Admin ---
43
+ function setGasLimit(uint32 _gasLimit) external onlyRole(ADMIN_ROLE) {
44
+ gasLimit = _gasLimit;
45
+ emit GasLimitSet(_gasLimit);
46
+ }
47
+
48
+ function setPeer(address _peer) external onlyRole(ADMIN_ROLE) {
49
+ peer = _peer;
50
+ emit PeerSet(_peer);
51
+ }
52
+
53
+ // --- Send ---
54
+ function assignJob(
55
+ AssignJobParam calldata _param,
56
+ bytes calldata /*_options*/
57
+ ) external payable override onlyAcl(_param.sender) returns (uint256) {
58
+ _getAndAssertReceiveLib(msg.sender, _param.dstEid);
59
+
60
+ if (_param.dstEid % 30000 != optimismEid) revert OnlyOptimism();
61
+ if (peer == address(0)) revert NoPeer();
62
+
63
+ bytes memory payload = abi.encodeWithSelector(
64
+ OptimismDVNAdapterL2.verify.selector,
65
+ DVNAdapterMessageCodec.encode(
66
+ receiveLibs[msg.sender][_param.dstEid],
67
+ _param.packetHeader,
68
+ _param.payloadHash
69
+ )
70
+ );
71
+ ICrossDomainMessenger(l1Messenger).sendMessage(peer, payload, gasLimit);
72
+
73
+ return 0;
74
+ }
75
+
76
+ // --- View ---
77
+ function getFee(
78
+ uint32 /*_dstEid*/,
79
+ uint64 /*_confirmations*/,
80
+ address _sender,
81
+ bytes calldata /*_options*/
82
+ ) public view override onlyAcl(_sender) returns (uint256) {
83
+ // no fee, charged as gas when sending message from L1 to L2
84
+ return 0;
85
+ }
86
+ }
@@ -0,0 +1,58 @@
1
+ // SPDX-License-Identifier: BUSL-1.1
2
+
3
+ pragma solidity ^0.8.20;
4
+
5
+ import { ICrossDomainMessenger } from "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
6
+
7
+ import { DVNAdapterBase } from "../DVNAdapterBase.sol";
8
+
9
+ contract OptimismDVNAdapterL2 is DVNAdapterBase {
10
+ // --- Errors ---
11
+ error UntrustedPeer(address peer);
12
+ error Unauthorized();
13
+
14
+ // --- Events ---
15
+ event PeerSet(address indexed peer);
16
+
17
+ address public immutable l2Messenger; // L2CrossDomainMessenger
18
+
19
+ address public peer;
20
+
21
+ constructor(address[] memory _admins, address _l2Messenger) DVNAdapterBase(msg.sender, _admins, 12000) {
22
+ l2Messenger = _l2Messenger;
23
+ }
24
+
25
+ // --- Admin ---
26
+ function setPeer(address _peer) external onlyRole(ADMIN_ROLE) {
27
+ peer = _peer;
28
+ emit PeerSet(_peer);
29
+ }
30
+
31
+ // --- Send ---
32
+ function assignJob(
33
+ AssignJobParam calldata /*_param*/,
34
+ bytes calldata /*_options*/
35
+ ) external payable override returns (uint256) {
36
+ revert DVNAdapter_NotImplemented();
37
+ }
38
+
39
+ function getFee(
40
+ uint32 /*_dstEid*/,
41
+ uint64 /*_confirmations*/,
42
+ address /*_sender*/,
43
+ bytes calldata /*_options*/
44
+ ) external pure override returns (uint256) {
45
+ revert DVNAdapter_NotImplemented();
46
+ }
47
+
48
+ // --- Receive ---
49
+ function verify(bytes calldata _payload) external {
50
+ // assert messenger
51
+ if (msg.sender != l2Messenger) revert Unauthorized();
52
+ // assert peer
53
+ address xSender = ICrossDomainMessenger(l2Messenger).xDomainMessageSender();
54
+ if (xSender != peer) revert UntrustedPeer(xSender);
55
+
56
+ _decodeAndVerify(_payload);
57
+ }
58
+ }
@@ -14,7 +14,7 @@ interface IDVNFeeLib {
14
14
  uint16 defaultMultiplierBps;
15
15
  }
16
16
 
17
- error UnsupportedOptionType(uint8 optionType);
17
+ error DVN_UnsupportedOptionType(uint8 optionType);
18
18
 
19
19
  function getFeeOnSend(
20
20
  FeeParams calldata _params,
@@ -2,17 +2,12 @@
2
2
 
3
3
  pragma solidity >=0.8.0;
4
4
 
5
- import { VerificationState } from "../ReceiveUlnBase.sol";
6
-
7
5
  /// @dev should be implemented by the ReceiveUln302 contract and future ReceiveUln contracts on EndpointV2
8
6
  interface IReceiveUlnE2 {
9
7
  /// @notice for each dvn to verify the payload
10
8
  /// @dev this function signature 0x0223536e
11
9
  function verify(bytes calldata _packetHeader, bytes32 _payloadHash, uint64 _confirmations) external;
12
10
 
13
- /// @notice check if commitVerification is ready to be called
14
- function verifiable(bytes calldata _packetHeader, bytes32 _payloadHash) external view returns (VerificationState);
15
-
16
11
  /// @notice verify the payload at endpoint, will check if all DVNs verified
17
12
  function commitVerification(bytes calldata _packetHeader, bytes32 _payloadHash) external;
18
13
  }
@@ -0,0 +1,45 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.8.0;
4
+
5
+ interface IAxelarDVNAdapter {
6
+ struct MultiplierParam {
7
+ uint32 dstEid;
8
+ uint16 multiplierBps;
9
+ }
10
+
11
+ struct FloorMarginUSDParam {
12
+ uint32 dstEid;
13
+ uint128 floorMarginUSD;
14
+ }
15
+
16
+ struct NativeGasFeeParam {
17
+ uint32 dstEid;
18
+ uint256 nativeGasFee;
19
+ }
20
+
21
+ struct DstConfigParam {
22
+ uint32 dstEid;
23
+ string chainName;
24
+ string peer;
25
+ uint16 multiplierBps;
26
+ uint256 nativeGasFee;
27
+ }
28
+
29
+ struct DstConfig {
30
+ string chainName;
31
+ string peer;
32
+ uint16 multiplierBps;
33
+ uint256 nativeGasFee;
34
+ }
35
+
36
+ event DstConfigSet(DstConfigParam[] params);
37
+ event NativeGasFeeSet(NativeGasFeeParam[] params);
38
+ event MultiplierSet(MultiplierParam[] params);
39
+ event FloorMarginUSDSet(FloorMarginUSDParam[] params);
40
+
41
+ error AxelarDVNAdapter_UntrustedPeer(string chainName, string peer);
42
+ error AxelarDVNAdapter_OnlyWorkerFeeLib();
43
+
44
+ function withdrawToFeeLib(address _sendLib) external;
45
+ }
@@ -0,0 +1,48 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.8.0;
4
+
5
+ import { IAxelarDVNAdapter } from "./IAxelarDVNAdapter.sol";
6
+
7
+ interface IAxelarDVNAdapterFeeLib {
8
+ struct Param {
9
+ uint32 dstEid;
10
+ uint64 confirmations;
11
+ address sender;
12
+ uint16 defaultMultiplierBps;
13
+ }
14
+
15
+ struct DstConfig {
16
+ uint64 gas;
17
+ uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR
18
+ }
19
+
20
+ struct DstConfigParam {
21
+ uint32 dstEid;
22
+ uint64 gas;
23
+ uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR
24
+ }
25
+
26
+ event DstConfigSet(DstConfigParam[] params);
27
+ event TokenWithdrawn(address token, address to, uint256 amount);
28
+ event GasServiceSet(address gasService);
29
+ event PriceFeedSet(address priceFeed);
30
+ event NativeGasFeeMultiplierBpsSet(uint16 multiplierBps);
31
+
32
+ error AxelarDVNAdapter_OptionsUnsupported();
33
+ error AxelarDVNAdapter_InsufficientBalance(uint256 actual, uint256 requested);
34
+
35
+ function getFeeOnSend(
36
+ Param calldata _params,
37
+ IAxelarDVNAdapter.DstConfig calldata _dstConfig,
38
+ bytes memory _payload,
39
+ bytes calldata _options,
40
+ address _sendLib
41
+ ) external payable returns (uint256 totalFee);
42
+
43
+ function getFee(
44
+ Param calldata _params,
45
+ IAxelarDVNAdapter.DstConfig calldata _dstConfig,
46
+ bytes calldata _options
47
+ ) external view returns (uint256 totalFee);
48
+ }
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.8.0;
4
+
5
+ interface ICCIPDVNAdapter {
6
+ struct DstConfigParam {
7
+ uint32 dstEid;
8
+ uint16 multiplierBps;
9
+ uint64 chainSelector;
10
+ uint256 gas;
11
+ bytes peer;
12
+ }
13
+
14
+ struct DstConfig {
15
+ // https://docs.chain.link/ccip/supported-networks/v1_2_0/testnet#ethereum-sepolia
16
+ // https://docs.chain.link/ccip/supported-networks/v1_0_0/mainnet
17
+ uint64 chainSelector;
18
+ uint16 multiplierBps;
19
+ // https://github.com/smartcontractkit/ccip/blob/ccip-develop/contracts/src/v0.8/ccip/libraries/Client.sol#L22C51-L22C51
20
+ // for destination is evm chain, need to use `abi.encode(address)` to get the peer
21
+ bytes peer;
22
+ uint256 gas;
23
+ }
24
+
25
+ event DstConfigSet(DstConfigParam[] params);
26
+ event RouterSet(address router);
27
+
28
+ error CCIPDVNAdapter_UntrustedPeer(uint64 chainSelector, bytes peer);
29
+ error CCIPDVNAdapter_InvalidRouter(address router);
30
+ }
@@ -0,0 +1,45 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity >=0.8.0;
4
+
5
+ import { Client } from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";
6
+ import { IRouterClient } from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol";
7
+ import { ICCIPDVNAdapter } from "./ICCIPDVNAdapter.sol";
8
+
9
+ interface ICCIPDVNAdapterFeeLib {
10
+ struct Param {
11
+ uint32 dstEid;
12
+ uint64 confirmations;
13
+ address sender;
14
+ uint16 defaultMultiplierBps;
15
+ }
16
+
17
+ struct DstConfig {
18
+ uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR
19
+ }
20
+
21
+ struct DstConfigParam {
22
+ uint32 dstEid;
23
+ uint128 floorMarginUSD; // uses priceFeed PRICE_RATIO_DENOMINATOR
24
+ }
25
+
26
+ event DstConfigSet(DstConfigParam[] params);
27
+
28
+ error CCIPDVN_OptionsUnsupported();
29
+
30
+ function getFeeOnSend(
31
+ Param calldata _params,
32
+ ICCIPDVNAdapter.DstConfig calldata _dstConfig,
33
+ Client.EVM2AnyMessage calldata _message,
34
+ bytes calldata _options,
35
+ IRouterClient _router
36
+ ) external payable returns (uint256 ccipFee, uint256 totalFee);
37
+
38
+ function getFee(
39
+ Param calldata _params,
40
+ ICCIPDVNAdapter.DstConfig calldata _dstConfig,
41
+ Client.EVM2AnyMessage calldata _message,
42
+ bytes calldata _options,
43
+ IRouterClient _router
44
+ ) external view returns (uint256 totalFee);
45
+ }
@@ -14,8 +14,8 @@ library DVNOptions {
14
14
  uint8 internal constant WORKER_ID = 2;
15
15
  uint8 internal constant OPTION_TYPE_PRECRIME = 1;
16
16
 
17
- error InvalidDVNIdx();
18
- error InvalidDVNOptions(uint256 cursor);
17
+ error DVN_InvalidDVNIdx();
18
+ error DVN_InvalidDVNOptions(uint256 cursor);
19
19
 
20
20
  /// @dev group dvn options by its idx
21
21
  /// @param _options [dvn_id][dvn_option][dvn_id][dvn_option]...
@@ -98,7 +98,7 @@ library DVNOptions {
98
98
  ) internal pure {
99
99
  // dvnIdx starts from 0 but default value of dvnIndices is 0,
100
100
  // so we tell if the slot is empty by adding 1 to dvnIdx
101
- if (_dvnIdx == 255) revert InvalidDVNIdx();
101
+ if (_dvnIdx == 255) revert DVN_InvalidDVNIdx();
102
102
  uint8 dvnIdxAdj = _dvnIdx + 1;
103
103
 
104
104
  for (uint256 j = 0; j < _dvnIndices.length; ++j) {
@@ -128,7 +128,7 @@ library DVNOptions {
128
128
 
129
129
  uint16 optionLength = _options.toUint16(cursor);
130
130
  cursor += 2;
131
- if (optionLength < 2) revert InvalidDVNOptions(cursor); // at least 1 byte for dvn_idx and 1 byte for option_type
131
+ if (optionLength < 2) revert DVN_InvalidDVNOptions(cursor); // at least 1 byte for dvn_idx and 1 byte for option_type
132
132
 
133
133
  uint8 dvnIdx = _options.toUint8(cursor);
134
134
 
@@ -138,7 +138,7 @@ library DVNOptions {
138
138
  // the composability of the options. e.g. if we refrain from enforcing the order, an OApp that has
139
139
  // already enforced certain options can append additional options to the end of the enforced
140
140
  // ones without restrictions.
141
- if (dvnIdx == 255) revert InvalidDVNIdx();
141
+ if (dvnIdx == 255) revert DVN_InvalidDVNIdx();
142
142
  if (!bitmap.get(dvnIdx)) {
143
143
  ++numDVNs;
144
144
  bitmap = bitmap.set(dvnIdx);
@@ -147,7 +147,7 @@ library DVNOptions {
147
147
  cursor += optionLength;
148
148
  }
149
149
  }
150
- if (cursor != _options.length) revert InvalidDVNOptions(cursor);
150
+ if (cursor != _options.length) revert DVN_InvalidDVNOptions(cursor);
151
151
  }
152
152
 
153
153
  /// @dev decode the next dvn option from _options starting from the specified cursor
@@ -15,11 +15,11 @@ library UlnOptions {
15
15
  uint16 internal constant TYPE_2 = 2; // legacy options type 2
16
16
  uint16 internal constant TYPE_3 = 3;
17
17
 
18
- error InvalidWorkerOptions(uint256 cursor);
19
- error InvalidWorkerId(uint8 workerId);
20
- error InvalidLegacyType1Option();
21
- error InvalidLegacyType2Option();
22
- error UnsupportedOptionType(uint16 optionType);
18
+ error LZ_ULN_InvalidWorkerOptions(uint256 cursor);
19
+ error LZ_ULN_InvalidWorkerId(uint8 workerId);
20
+ error LZ_ULN_InvalidLegacyType1Option();
21
+ error LZ_ULN_InvalidLegacyType2Option();
22
+ error LZ_ULN_UnsupportedOptionType(uint16 optionType);
23
23
 
24
24
  /// @dev decode the options into executorOptions and dvnOptions
25
25
  /// @param _options the options can be either legacy options (type 1 or 2) or type 3 options
@@ -29,7 +29,7 @@ library UlnOptions {
29
29
  bytes calldata _options
30
30
  ) internal pure returns (bytes memory executorOptions, bytes memory dvnOptions) {
31
31
  // at least 2 bytes for the option type, but can have no options
32
- if (_options.length < 2) revert InvalidWorkerOptions(0);
32
+ if (_options.length < 2) revert LZ_ULN_InvalidWorkerOptions(0);
33
33
 
34
34
  uint16 optionsType = uint16(bytes2(_options[0:2]));
35
35
  uint256 cursor = 2;
@@ -46,7 +46,7 @@ library UlnOptions {
46
46
  // checking the workerID can reduce gas usage for most cases
47
47
  while (cursor < _options.length) {
48
48
  uint8 workerId = uint8(bytes1(_options[cursor:cursor + 1]));
49
- if (workerId == 0) revert InvalidWorkerId(0);
49
+ if (workerId == 0) revert LZ_ULN_InvalidWorkerId(0);
50
50
 
51
51
  // workerId must equal to the lastWorkerId for the first option
52
52
  // so it is always skipped in the first option
@@ -70,12 +70,12 @@ library UlnOptions {
70
70
  ++cursor; // for workerId
71
71
 
72
72
  uint16 size = uint16(bytes2(_options[cursor:cursor + 2]));
73
- if (size == 0) revert InvalidWorkerOptions(cursor);
73
+ if (size == 0) revert LZ_ULN_InvalidWorkerOptions(cursor);
74
74
  cursor += size + 2;
75
75
  }
76
76
 
77
77
  // the options length must be the same as the cursor at the end
78
- if (cursor != _options.length) revert InvalidWorkerOptions(cursor);
78
+ if (cursor != _options.length) revert LZ_ULN_InvalidWorkerOptions(cursor);
79
79
 
80
80
  // if we have reached the end of the options and the options are not empty
81
81
  // we need to process the last worker's options
@@ -102,7 +102,7 @@ library UlnOptions {
102
102
  } else if (_workerId == DVNOptions.WORKER_ID) {
103
103
  _dvnOptions = _dvnOptions.length == 0 ? _newOptions : abi.encodePacked(_dvnOptions, _newOptions);
104
104
  } else {
105
- revert InvalidWorkerId(_workerId);
105
+ revert LZ_ULN_InvalidWorkerId(_workerId);
106
106
  }
107
107
  return (_executorOptions, _dvnOptions);
108
108
  }
@@ -120,7 +120,7 @@ library UlnOptions {
120
120
  bytes calldata _options
121
121
  ) internal pure returns (bytes memory executorOptions) {
122
122
  if (_optionType == TYPE_1) {
123
- if (_options.length != 34) revert InvalidLegacyType1Option();
123
+ if (_options.length != 34) revert LZ_ULN_InvalidLegacyType1Option();
124
124
 
125
125
  // execution gas
126
126
  uint128 executionGas = uint256(bytes32(_options[2:2 + 32])).toUint128();
@@ -137,7 +137,7 @@ library UlnOptions {
137
137
  );
138
138
  } else if (_optionType == TYPE_2) {
139
139
  // receiver size <= 32
140
- if (_options.length <= 66 || _options.length > 98) revert InvalidLegacyType2Option();
140
+ if (_options.length <= 66 || _options.length > 98) revert LZ_ULN_InvalidLegacyType2Option();
141
141
 
142
142
  // execution gas
143
143
  uint128 executionGas = uint256(bytes32(_options[2:2 + 32])).toUint128();
@@ -170,7 +170,7 @@ library UlnOptions {
170
170
  receiver
171
171
  );
172
172
  } else {
173
- revert UnsupportedOptionType(_optionType);
173
+ revert LZ_ULN_UnsupportedOptionType(_optionType);
174
174
  }
175
175
  }
176
176
  }
@@ -10,12 +10,12 @@ abstract contract AddressSizeConfig is Ownable {
10
10
 
11
11
  event AddressSizeSet(uint16 eid, uint256 size);
12
12
 
13
- error InvalidAddressSize();
14
- error AddressSizeAlreadySet();
13
+ error AddressSizeConfig_InvalidAddressSize();
14
+ error AddressSizeConfig_AddressSizeAlreadySet();
15
15
 
16
16
  function setAddressSize(uint16 _eid, uint256 _size) external onlyOwner {
17
- if (_size > 32) revert InvalidAddressSize();
18
- if (addressSizes[_eid] != 0) revert AddressSizeAlreadySet();
17
+ if (_size > 32) revert AddressSizeConfig_InvalidAddressSize();
18
+ if (addressSizes[_eid] != 0) revert AddressSizeConfig_AddressSizeAlreadySet();
19
19
  addressSizes[_eid] = _size;
20
20
  emit AddressSizeSet(_eid, _size);
21
21
  }