@hyperlane-xyz/core 3.12.2 → 3.13.0

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 (190) hide show
  1. package/README.md +1 -1
  2. package/contracts/avs/ECDSAStakeRegistry.sol +119 -29
  3. package/contracts/avs/ECDSAStakeRegistryStorage.sol +5 -1
  4. package/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors.sol +15 -2
  5. package/contracts/test/ERC20Test.sol +12 -0
  6. package/contracts/token/extensions/{HypFiatTokenCollateral.sol → HypFiatToken.sol} +1 -1
  7. package/contracts/token/extensions/{HypXERC20Collateral.sol → HypXERC20.sol} +1 -1
  8. package/contracts/token/extensions/HypXERC20Lockbox.sol +54 -0
  9. package/contracts/token/interfaces/IXERC20.sol +15 -0
  10. package/contracts/token/interfaces/IXERC20Lockbox.sol +61 -0
  11. package/dist/buildArtifact.js +1 -1
  12. package/dist/buildArtifact.json +1 -1
  13. package/dist/contracts/avs/ECDSAStakeRegistry.d.ts +94 -15
  14. package/dist/contracts/avs/ECDSAStakeRegistry.d.ts.map +1 -1
  15. package/dist/contracts/avs/ECDSAStakeRegistryStorage.d.ts +18 -0
  16. package/dist/contracts/avs/ECDSAStakeRegistryStorage.d.ts.map +1 -1
  17. package/dist/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors.d.ts +18 -0
  18. package/dist/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors.d.ts.map +1 -1
  19. package/dist/contracts/test/ERC20Test.sol/XERC20Test.d.ts +63 -1
  20. package/dist/contracts/test/ERC20Test.sol/XERC20Test.d.ts.map +1 -1
  21. package/dist/contracts/token/extensions/{HypXERC20Collateral.d.ts → HypFiatToken.d.ts} +4 -4
  22. package/dist/contracts/token/extensions/HypFiatToken.d.ts.map +1 -0
  23. package/dist/contracts/token/extensions/HypFiatToken.js +2 -0
  24. package/dist/contracts/token/extensions/HypFiatToken.js.map +1 -0
  25. package/dist/contracts/token/extensions/{HypFiatTokenCollateral.d.ts → HypXERC20.d.ts} +4 -4
  26. package/dist/contracts/token/extensions/HypXERC20.d.ts.map +1 -0
  27. package/dist/contracts/token/extensions/HypXERC20.js +2 -0
  28. package/dist/contracts/token/extensions/HypXERC20.js.map +1 -0
  29. package/dist/contracts/token/{HypERC20CollateralVaultDeposit.d.ts → extensions/HypXERC20Lockbox.d.ts} +36 -81
  30. package/dist/contracts/token/extensions/HypXERC20Lockbox.d.ts.map +1 -0
  31. package/dist/contracts/token/extensions/HypXERC20Lockbox.js +2 -0
  32. package/dist/contracts/token/extensions/HypXERC20Lockbox.js.map +1 -0
  33. package/dist/contracts/token/extensions/index.d.ts +3 -2
  34. package/dist/contracts/token/extensions/index.d.ts.map +1 -1
  35. package/dist/contracts/token/interfaces/IXERC20.d.ts +63 -1
  36. package/dist/contracts/token/interfaces/IXERC20.d.ts.map +1 -1
  37. package/dist/contracts/token/interfaces/IXERC20Lockbox.d.ts +252 -0
  38. package/dist/contracts/token/interfaces/IXERC20Lockbox.d.ts.map +1 -0
  39. package/dist/contracts/token/interfaces/IXERC20Lockbox.js +2 -0
  40. package/dist/contracts/token/interfaces/IXERC20Lockbox.js.map +1 -0
  41. package/dist/contracts/token/interfaces/index.d.ts +1 -0
  42. package/dist/contracts/token/interfaces/index.d.ts.map +1 -1
  43. package/dist/factories/contracts/avs/ECDSAStakeRegistryStorage__factory.d.ts +29 -0
  44. package/dist/factories/contracts/avs/ECDSAStakeRegistryStorage__factory.d.ts.map +1 -1
  45. package/dist/factories/contracts/avs/ECDSAStakeRegistryStorage__factory.js +36 -0
  46. package/dist/factories/contracts/avs/ECDSAStakeRegistryStorage__factory.js.map +1 -1
  47. package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.d.ts +76 -5
  48. package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.d.ts.map +1 -1
  49. package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.js +98 -6
  50. package/dist/factories/contracts/avs/ECDSAStakeRegistry__factory.js.map +1 -1
  51. package/dist/factories/contracts/avs/HyperlaneServiceManager__factory.d.ts +1 -1
  52. package/dist/factories/contracts/avs/HyperlaneServiceManager__factory.js +1 -1
  53. package/dist/factories/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors__factory.d.ts +29 -0
  54. package/dist/factories/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors__factory.d.ts.map +1 -1
  55. package/dist/factories/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors__factory.js +36 -0
  56. package/dist/factories/contracts/interfaces/avs/vendored/IECDSAStakeRegistryEventsAndErrors__factory.js.map +1 -1
  57. package/dist/factories/contracts/test/ERC20Test.sol/ERC20Test__factory.d.ts +1 -1
  58. package/dist/factories/contracts/test/ERC20Test.sol/ERC20Test__factory.js +1 -1
  59. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.d.ts +1 -1
  60. package/dist/factories/contracts/test/ERC20Test.sol/FiatTokenTest__factory.js +1 -1
  61. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.d.ts +29 -1
  62. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.d.ts.map +1 -1
  63. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.js +37 -1
  64. package/dist/factories/contracts/test/ERC20Test.sol/XERC20Test__factory.js.map +1 -1
  65. package/dist/factories/contracts/test/TestRemoteChallenger__factory.d.ts +1 -1
  66. package/dist/factories/contracts/test/TestRemoteChallenger__factory.js +1 -1
  67. package/dist/factories/contracts/test/avs/TestHyperlaneServiceManager__factory.d.ts +1 -1
  68. package/dist/factories/contracts/test/avs/TestHyperlaneServiceManager__factory.js +1 -1
  69. package/dist/factories/contracts/token/extensions/{HypFiatTokenCollateral__factory.d.ts → HypFiatToken__factory.d.ts} +11 -11
  70. package/dist/factories/contracts/token/extensions/HypFiatToken__factory.d.ts.map +1 -0
  71. package/dist/factories/contracts/token/extensions/{HypFiatTokenCollateral__factory.js → HypFiatToken__factory.js} +3 -3
  72. package/dist/factories/contracts/token/extensions/HypFiatToken__factory.js.map +1 -0
  73. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.d.ts +449 -0
  74. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.d.ts.map +1 -0
  75. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.js +595 -0
  76. package/dist/factories/contracts/token/extensions/HypXERC20Lockbox__factory.js.map +1 -0
  77. package/dist/factories/contracts/token/extensions/{HypXERC20Collateral__factory.d.ts → HypXERC20__factory.d.ts} +11 -11
  78. package/dist/factories/contracts/token/extensions/HypXERC20__factory.d.ts.map +1 -0
  79. package/dist/factories/contracts/token/extensions/{HypXERC20Collateral__factory.js → HypXERC20__factory.js} +3 -3
  80. package/dist/factories/contracts/token/extensions/HypXERC20__factory.js.map +1 -0
  81. package/dist/factories/contracts/token/extensions/index.d.ts +3 -2
  82. package/dist/factories/contracts/token/extensions/index.d.ts.map +1 -1
  83. package/dist/factories/contracts/token/extensions/index.js +3 -2
  84. package/dist/factories/contracts/token/extensions/index.js.map +1 -1
  85. package/dist/factories/contracts/token/interfaces/IXERC20Lockbox__factory.d.ts +87 -0
  86. package/dist/factories/contracts/token/interfaces/IXERC20Lockbox__factory.d.ts.map +1 -0
  87. package/dist/factories/contracts/token/interfaces/IXERC20Lockbox__factory.js +117 -0
  88. package/dist/factories/contracts/token/interfaces/IXERC20Lockbox__factory.js.map +1 -0
  89. package/dist/factories/contracts/token/interfaces/IXERC20__factory.d.ts +28 -0
  90. package/dist/factories/contracts/token/interfaces/IXERC20__factory.d.ts.map +1 -1
  91. package/dist/factories/contracts/token/interfaces/IXERC20__factory.js +36 -0
  92. package/dist/factories/contracts/token/interfaces/IXERC20__factory.js.map +1 -1
  93. package/dist/factories/contracts/token/interfaces/index.d.ts +1 -0
  94. package/dist/factories/contracts/token/interfaces/index.d.ts.map +1 -1
  95. package/dist/factories/contracts/token/interfaces/index.js +1 -0
  96. package/dist/factories/contracts/token/interfaces/index.js.map +1 -1
  97. package/dist/index.d.ts +8 -4
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +4 -2
  100. package/dist/index.js.map +1 -1
  101. package/package.json +2 -2
  102. package/dist/contracts/interfaces/avs/IAVSDirectory.d.ts +0 -160
  103. package/dist/contracts/interfaces/avs/IAVSDirectory.d.ts.map +0 -1
  104. package/dist/contracts/interfaces/avs/IAVSDirectory.js +0 -2
  105. package/dist/contracts/interfaces/avs/IAVSDirectory.js.map +0 -1
  106. package/dist/contracts/interfaces/avs/IDelegationManager.d.ts +0 -93
  107. package/dist/contracts/interfaces/avs/IDelegationManager.d.ts.map +0 -1
  108. package/dist/contracts/interfaces/avs/IDelegationManager.js +0 -2
  109. package/dist/contracts/interfaces/avs/IDelegationManager.js.map +0 -1
  110. package/dist/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors.d.ts +0 -157
  111. package/dist/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors.d.ts.map +0 -1
  112. package/dist/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors.js +0 -2
  113. package/dist/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors.js.map +0 -1
  114. package/dist/contracts/interfaces/avs/IPaymentCoordinator.d.ts +0 -96
  115. package/dist/contracts/interfaces/avs/IPaymentCoordinator.d.ts.map +0 -1
  116. package/dist/contracts/interfaces/avs/IPaymentCoordinator.js +0 -2
  117. package/dist/contracts/interfaces/avs/IPaymentCoordinator.js.map +0 -1
  118. package/dist/contracts/interfaces/avs/IServiceManager.d.ts +0 -250
  119. package/dist/contracts/interfaces/avs/IServiceManager.d.ts.map +0 -1
  120. package/dist/contracts/interfaces/avs/IServiceManager.js +0 -2
  121. package/dist/contracts/interfaces/avs/IServiceManager.js.map +0 -1
  122. package/dist/contracts/interfaces/avs/IServiceManagerUI.d.ts +0 -189
  123. package/dist/contracts/interfaces/avs/IServiceManagerUI.d.ts.map +0 -1
  124. package/dist/contracts/interfaces/avs/IServiceManagerUI.js +0 -2
  125. package/dist/contracts/interfaces/avs/IServiceManagerUI.js.map +0 -1
  126. package/dist/contracts/interfaces/avs/ISlasher.d.ts +0 -66
  127. package/dist/contracts/interfaces/avs/ISlasher.d.ts.map +0 -1
  128. package/dist/contracts/interfaces/avs/ISlasher.js +0 -2
  129. package/dist/contracts/interfaces/avs/ISlasher.js.map +0 -1
  130. package/dist/contracts/interfaces/avs/IStrategy.d.ts +0 -295
  131. package/dist/contracts/interfaces/avs/IStrategy.d.ts.map +0 -1
  132. package/dist/contracts/interfaces/avs/IStrategy.js +0 -2
  133. package/dist/contracts/interfaces/avs/IStrategy.js.map +0 -1
  134. package/dist/contracts/test/ERC20Test.d.ts +0 -391
  135. package/dist/contracts/test/ERC20Test.d.ts.map +0 -1
  136. package/dist/contracts/test/ERC20Test.js +0 -2
  137. package/dist/contracts/test/ERC20Test.js.map +0 -1
  138. package/dist/contracts/token/HypERC20CollateralVaultDeposit.d.ts.map +0 -1
  139. package/dist/contracts/token/HypERC20CollateralVaultDeposit.js +0 -2
  140. package/dist/contracts/token/HypERC20CollateralVaultDeposit.js.map +0 -1
  141. package/dist/contracts/token/extensions/HypFiatTokenCollateral.d.ts.map +0 -1
  142. package/dist/contracts/token/extensions/HypFiatTokenCollateral.js +0 -2
  143. package/dist/contracts/token/extensions/HypFiatTokenCollateral.js.map +0 -1
  144. package/dist/contracts/token/extensions/HypXERC20Collateral.d.ts.map +0 -1
  145. package/dist/contracts/token/extensions/HypXERC20Collateral.js +0 -2
  146. package/dist/contracts/token/extensions/HypXERC20Collateral.js.map +0 -1
  147. package/dist/factories/contracts/interfaces/avs/IAVSDirectory__factory.d.ts +0 -71
  148. package/dist/factories/contracts/interfaces/avs/IAVSDirectory__factory.d.ts.map +0 -1
  149. package/dist/factories/contracts/interfaces/avs/IAVSDirectory__factory.js +0 -96
  150. package/dist/factories/contracts/interfaces/avs/IAVSDirectory__factory.js.map +0 -1
  151. package/dist/factories/contracts/interfaces/avs/IDelegationManager__factory.d.ts +0 -54
  152. package/dist/factories/contracts/interfaces/avs/IDelegationManager__factory.d.ts.map +0 -1
  153. package/dist/factories/contracts/interfaces/avs/IDelegationManager__factory.js +0 -75
  154. package/dist/factories/contracts/interfaces/avs/IDelegationManager__factory.js.map +0 -1
  155. package/dist/factories/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors__factory.d.ts +0 -205
  156. package/dist/factories/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors__factory.d.ts.map +0 -1
  157. package/dist/factories/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors__factory.js +0 -266
  158. package/dist/factories/contracts/interfaces/avs/IECDSAStakeRegistryEventsAndErrors__factory.js.map +0 -1
  159. package/dist/factories/contracts/interfaces/avs/IPaymentCoordinator__factory.d.ts +0 -49
  160. package/dist/factories/contracts/interfaces/avs/IPaymentCoordinator__factory.d.ts.map +0 -1
  161. package/dist/factories/contracts/interfaces/avs/IPaymentCoordinator__factory.js +0 -68
  162. package/dist/factories/contracts/interfaces/avs/IPaymentCoordinator__factory.js.map +0 -1
  163. package/dist/factories/contracts/interfaces/avs/IServiceManagerUI__factory.d.ts +0 -90
  164. package/dist/factories/contracts/interfaces/avs/IServiceManagerUI__factory.d.ts.map +0 -1
  165. package/dist/factories/contracts/interfaces/avs/IServiceManagerUI__factory.js +0 -122
  166. package/dist/factories/contracts/interfaces/avs/IServiceManagerUI__factory.js.map +0 -1
  167. package/dist/factories/contracts/interfaces/avs/IServiceManager__factory.d.ts +0 -130
  168. package/dist/factories/contracts/interfaces/avs/IServiceManager__factory.d.ts.map +0 -1
  169. package/dist/factories/contracts/interfaces/avs/IServiceManager__factory.js +0 -174
  170. package/dist/factories/contracts/interfaces/avs/IServiceManager__factory.js.map +0 -1
  171. package/dist/factories/contracts/interfaces/avs/ISlasher__factory.d.ts +0 -19
  172. package/dist/factories/contracts/interfaces/avs/ISlasher__factory.d.ts.map +0 -1
  173. package/dist/factories/contracts/interfaces/avs/ISlasher__factory.js +0 -29
  174. package/dist/factories/contracts/interfaces/avs/ISlasher__factory.js.map +0 -1
  175. package/dist/factories/contracts/interfaces/avs/IStrategy__factory.d.ts +0 -173
  176. package/dist/factories/contracts/interfaces/avs/IStrategy__factory.d.ts.map +0 -1
  177. package/dist/factories/contracts/interfaces/avs/IStrategy__factory.js +0 -235
  178. package/dist/factories/contracts/interfaces/avs/IStrategy__factory.js.map +0 -1
  179. package/dist/factories/contracts/test/ERC20Test__factory.d.ts +0 -281
  180. package/dist/factories/contracts/test/ERC20Test__factory.d.ts.map +0 -1
  181. package/dist/factories/contracts/test/ERC20Test__factory.js +0 -379
  182. package/dist/factories/contracts/test/ERC20Test__factory.js.map +0 -1
  183. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.d.ts +0 -470
  184. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.d.ts.map +0 -1
  185. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.js +0 -621
  186. package/dist/factories/contracts/token/HypERC20CollateralVaultDeposit__factory.js.map +0 -1
  187. package/dist/factories/contracts/token/extensions/HypFiatTokenCollateral__factory.d.ts.map +0 -1
  188. package/dist/factories/contracts/token/extensions/HypFiatTokenCollateral__factory.js.map +0 -1
  189. package/dist/factories/contracts/token/extensions/HypXERC20Collateral__factory.d.ts.map +0 -1
  190. package/dist/factories/contracts/token/extensions/HypXERC20Collateral__factory.js.map +0 -1
package/README.md CHANGED
@@ -28,7 +28,7 @@ yarn test
28
28
 
29
29
  ### Fixtures
30
30
 
31
- Some forge tests may generate fixtures in the [fixtures](./fixtures/) directory. This allows [SDK](../typescript/sdk) tests to leverage forge fuzzing. These are git ignored and should not be committed.
31
+ Some forge tests may generate fixtures. This allows the [SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) tests to leverage forge fuzzing. These are git ignored and should not be committed.
32
32
 
33
33
  ## License
34
34
 
@@ -44,13 +44,14 @@ contract ECDSAStakeRegistry is
44
44
  __ECDSAStakeRegistry_init(_serviceManager, _thresholdWeight, _quorum);
45
45
  }
46
46
 
47
- /// @notice Registers a new operator using a provided signature
47
+ /// @notice Registers a new operator using a provided signature and signing key
48
48
  /// @param _operatorSignature Contains the operator's signature, salt, and expiry
49
+ /// @param _signingKey The signing key to add to the operator's history
49
50
  function registerOperatorWithSignature(
50
- address _operator,
51
- ISignatureUtils.SignatureWithSaltAndExpiry memory _operatorSignature
51
+ ISignatureUtils.SignatureWithSaltAndExpiry memory _operatorSignature,
52
+ address _signingKey
52
53
  ) external {
53
- _registerOperatorWithSig(_operator, _operatorSignature);
54
+ _registerOperatorWithSig(msg.sender, _operatorSignature, _signingKey);
54
55
  }
55
56
 
56
57
  /// @notice Deregisters an existing operator
@@ -58,6 +59,18 @@ contract ECDSAStakeRegistry is
58
59
  _deregisterOperator(msg.sender);
59
60
  }
60
61
 
62
+ /**
63
+ * @notice Updates the signing key for an operator
64
+ * @dev Only callable by the operator themselves
65
+ * @param _newSigningKey The new signing key to set for the operator
66
+ */
67
+ function updateOperatorSigningKey(address _newSigningKey) external {
68
+ if (!_operatorRegistered[msg.sender]) {
69
+ revert OperatorNotRegistered();
70
+ }
71
+ _updateOperatorSigningKey(msg.sender, _newSigningKey);
72
+ }
73
+
61
74
  /**
62
75
  * @notice Updates the StakeRegistry's view of one or more operators' stakes adding a new entry in their history of stake checkpoints,
63
76
  * @dev Queries stakes from the Eigenlayer core DelegationManager contract
@@ -107,18 +120,18 @@ contract ECDSAStakeRegistry is
107
120
 
108
121
  /// @notice Verifies if the provided signature data is valid for the given data hash.
109
122
  /// @param _dataHash The hash of the data that was signed.
110
- /// @param _signatureData Encoded signature data consisting of an array of signers, an array of signatures, and a reference block number.
123
+ /// @param _signatureData Encoded signature data consisting of an array of operators, an array of signatures, and a reference block number.
111
124
  /// @return The function selector that indicates the signature is valid according to ERC1271 standard.
112
125
  function isValidSignature(
113
126
  bytes32 _dataHash,
114
127
  bytes memory _signatureData
115
128
  ) external view returns (bytes4) {
116
129
  (
117
- address[] memory signers,
130
+ address[] memory operators,
118
131
  bytes[] memory signatures,
119
132
  uint32 referenceBlock
120
133
  ) = abi.decode(_signatureData, (address[], bytes[], uint32));
121
- _checkSignatures(_dataHash, signers, signatures, referenceBlock);
134
+ _checkSignatures(_dataHash, operators, signatures, referenceBlock);
122
135
  return IERC1271Upgradeable.isValidSignature.selector;
123
136
  }
124
137
 
@@ -128,6 +141,37 @@ contract ECDSAStakeRegistry is
128
141
  return _quorum;
129
142
  }
130
143
 
144
+ /**
145
+ * @notice Retrieves the latest signing key for a given operator.
146
+ * @param _operator The address of the operator.
147
+ * @return The latest signing key of the operator.
148
+ */
149
+ function getLastestOperatorSigningKey(
150
+ address _operator
151
+ ) external view returns (address) {
152
+ return address(uint160(_operatorSigningKeyHistory[_operator].latest()));
153
+ }
154
+
155
+ /**
156
+ * @notice Retrieves the latest signing key for a given operator at a specific block number.
157
+ * @param _operator The address of the operator.
158
+ * @param _blockNumber The block number to get the operator's signing key.
159
+ * @return The signing key of the operator at the given block.
160
+ */
161
+ function getOperatorSigningKeyAtBlock(
162
+ address _operator,
163
+ uint256 _blockNumber
164
+ ) external view returns (address) {
165
+ return
166
+ address(
167
+ uint160(
168
+ _operatorSigningKeyHistory[_operator].getAtBlock(
169
+ _blockNumber
170
+ )
171
+ )
172
+ );
173
+ }
174
+
131
175
  /// @notice Retrieves the last recorded weight for a given operator.
132
176
  /// @param _operator The address of the operator.
133
177
  /// @return uint256 - The latest weight of the operator.
@@ -313,9 +357,11 @@ contract ECDSAStakeRegistry is
313
357
 
314
358
  /// @dev registers an operator through a provided signature
315
359
  /// @param _operatorSignature Contains the operator's signature, salt, and expiry
360
+ /// @param _signingKey The signing key to add to the operator's history
316
361
  function _registerOperatorWithSig(
317
362
  address _operator,
318
- ISignatureUtils.SignatureWithSaltAndExpiry memory _operatorSignature
363
+ ISignatureUtils.SignatureWithSaltAndExpiry memory _operatorSignature,
364
+ address _signingKey
319
365
  ) internal virtual {
320
366
  if (_operatorRegistered[_operator]) {
321
367
  revert OperatorAlreadyRegistered();
@@ -324,6 +370,7 @@ contract ECDSAStakeRegistry is
324
370
  _operatorRegistered[_operator] = true;
325
371
  int256 delta = _updateOperatorWeight(_operator);
326
372
  _updateTotalWeight(delta);
373
+ _updateOperatorSigningKey(_operator, _signingKey);
327
374
  IServiceManager(_serviceManager).registerOperatorToAVS(
328
375
  _operator,
329
376
  _operatorSignature
@@ -331,6 +378,28 @@ contract ECDSAStakeRegistry is
331
378
  emit OperatorRegistered(_operator, _serviceManager);
332
379
  }
333
380
 
381
+ /// @dev Internal function to update an operator's signing key
382
+ /// @param _operator The address of the operator to update the signing key for
383
+ /// @param _newSigningKey The new signing key to set for the operator
384
+ function _updateOperatorSigningKey(
385
+ address _operator,
386
+ address _newSigningKey
387
+ ) internal {
388
+ address oldSigningKey = address(
389
+ uint160(_operatorSigningKeyHistory[_operator].latest())
390
+ );
391
+ if (_newSigningKey == oldSigningKey) {
392
+ return;
393
+ }
394
+ _operatorSigningKeyHistory[_operator].push(uint160(_newSigningKey));
395
+ emit SigningKeyUpdate(
396
+ _operator,
397
+ block.number,
398
+ _newSigningKey,
399
+ oldSigningKey
400
+ );
401
+ }
402
+
334
403
  /// @notice Updates the weight of an operator and returns the previous and current weights.
335
404
  /// @param _operator The address of the operator to update the weight of.
336
405
  function _updateOperatorWeight(
@@ -401,30 +470,33 @@ contract ECDSAStakeRegistry is
401
470
  /**
402
471
  * @notice Common logic to verify a batch of ECDSA signatures against a hash, using either last stake weight or at a specific block.
403
472
  * @param _dataHash The hash of the data the signers endorsed.
404
- * @param _signers A collection of addresses that endorsed the data hash.
473
+ * @param _operators A collection of addresses that endorsed the data hash.
405
474
  * @param _signatures A collection of signatures matching the signers.
406
475
  * @param _referenceBlock The block number for evaluating stake weight; use max uint32 for latest weight.
407
476
  */
408
477
  function _checkSignatures(
409
478
  bytes32 _dataHash,
410
- address[] memory _signers,
479
+ address[] memory _operators,
411
480
  bytes[] memory _signatures,
412
481
  uint32 _referenceBlock
413
482
  ) internal view {
414
- uint256 signersLength = _signers.length;
415
- address lastSigner;
483
+ uint256 signersLength = _operators.length;
484
+ address currentOperator;
485
+ address lastOperator;
486
+ address signer;
416
487
  uint256 signedWeight;
417
488
 
418
489
  _validateSignaturesLength(signersLength, _signatures.length);
419
490
  for (uint256 i; i < signersLength; i++) {
420
- address currentSigner = _signers[i];
491
+ currentOperator = _operators[i];
492
+ signer = _getOperatorSigningKey(currentOperator, _referenceBlock);
421
493
 
422
- _validateSortedSigners(lastSigner, currentSigner);
423
- _validateSignature(currentSigner, _dataHash, _signatures[i]);
494
+ _validateSortedSigners(lastOperator, currentOperator);
495
+ _validateSignature(signer, _dataHash, _signatures[i]);
424
496
 
425
- lastSigner = currentSigner;
497
+ lastOperator = currentOperator;
426
498
  uint256 operatorWeight = _getOperatorWeight(
427
- currentSigner,
499
+ currentOperator,
428
500
  _referenceBlock
429
501
  );
430
502
  signedWeight += operatorWeight;
@@ -474,6 +546,27 @@ contract ECDSAStakeRegistry is
474
546
  }
475
547
  }
476
548
 
549
+ /// @notice Retrieves the operator weight for a signer, either at the last checkpoint or a specified block.
550
+ /// @param _operator The operator to query their signing key history for
551
+ /// @param _referenceBlock The block number to query the operator's weight at, or the maximum uint32 value for the last checkpoint.
552
+ /// @return The weight of the operator.
553
+ function _getOperatorSigningKey(
554
+ address _operator,
555
+ uint32 _referenceBlock
556
+ ) internal view returns (address) {
557
+ if (_referenceBlock >= block.number) {
558
+ revert InvalidReferenceBlock();
559
+ }
560
+ return
561
+ address(
562
+ uint160(
563
+ _operatorSigningKeyHistory[_operator].getAtBlock(
564
+ _referenceBlock
565
+ )
566
+ )
567
+ );
568
+ }
569
+
477
570
  /// @notice Retrieves the operator weight for a signer, either at the last checkpoint or a specified block.
478
571
  /// @param _signer The address of the signer whose weight is returned.
479
572
  /// @param _referenceBlock The block number to query the operator's weight at, or the maximum uint32 value for the last checkpoint.
@@ -482,11 +575,10 @@ contract ECDSAStakeRegistry is
482
575
  address _signer,
483
576
  uint32 _referenceBlock
484
577
  ) internal view returns (uint256) {
485
- if (_referenceBlock == type(uint32).max) {
486
- return _operatorWeightHistory[_signer].latest();
487
- } else {
488
- return _operatorWeightHistory[_signer].getAtBlock(_referenceBlock);
578
+ if (_referenceBlock >= block.number) {
579
+ revert InvalidReferenceBlock();
489
580
  }
581
+ return _operatorWeightHistory[_signer].getAtBlock(_referenceBlock);
490
582
  }
491
583
 
492
584
  /// @notice Retrieve the total stake weight at a specific block or the latest if not specified.
@@ -496,11 +588,10 @@ contract ECDSAStakeRegistry is
496
588
  function _getTotalWeight(
497
589
  uint32 _referenceBlock
498
590
  ) internal view returns (uint256) {
499
- if (_referenceBlock == type(uint32).max) {
500
- return _totalWeightHistory.latest();
501
- } else {
502
- return _totalWeightHistory.getAtBlock(_referenceBlock);
591
+ if (_referenceBlock >= block.number) {
592
+ revert InvalidReferenceBlock();
503
593
  }
594
+ return _totalWeightHistory.getAtBlock(_referenceBlock);
504
595
  }
505
596
 
506
597
  /// @notice Retrieves the threshold stake for a given reference block.
@@ -510,11 +601,10 @@ contract ECDSAStakeRegistry is
510
601
  function _getThresholdStake(
511
602
  uint32 _referenceBlock
512
603
  ) internal view returns (uint256) {
513
- if (_referenceBlock == type(uint32).max) {
514
- return _thresholdWeightHistory.latest();
515
- } else {
516
- return _thresholdWeightHistory.getAtBlock(_referenceBlock);
604
+ if (_referenceBlock >= block.number) {
605
+ revert InvalidReferenceBlock();
517
606
  }
607
+ return _thresholdWeightHistory.getAtBlock(_referenceBlock);
518
608
  }
519
609
 
520
610
  /// @notice Validates that the cumulative stake of signed messages meets or exceeds the required threshold.
@@ -30,6 +30,10 @@ abstract contract ECDSAStakeRegistryStorage is
30
30
  /// @notice Defines the duration after which the stake's weight expires.
31
31
  uint256 internal _stakeExpiry;
32
32
 
33
+ /// @notice Maps an operator to their signing key history using checkpoints
34
+ mapping(address => CheckpointsUpgradeable.History)
35
+ internal _operatorSigningKeyHistory;
36
+
33
37
  /// @notice Tracks the total stake history over time using checkpoints
34
38
  CheckpointsUpgradeable.History internal _totalWeightHistory;
35
39
 
@@ -51,5 +55,5 @@ abstract contract ECDSAStakeRegistryStorage is
51
55
  // slither-disable-next-line shadowing-state
52
56
  /// @dev Reserves storage slots for future upgrades
53
57
  // solhint-disable-next-line
54
- uint256[42] private __gap;
58
+ uint256[40] private __gap;
55
59
  }
@@ -12,8 +12,6 @@ struct Quorum {
12
12
  StrategyParams[] strategies; // An array of strategy parameters to define the quorum
13
13
  }
14
14
 
15
- /// part of mock interfaces for vendoring necessary Eigenlayer contracts for the hyperlane AVS
16
- /// @author Layr Labs, Inc.
17
15
  interface IECDSAStakeRegistryEventsAndErrors {
18
16
  /// @notice Emitted when the system registers an operator
19
17
  /// @param _operator The address of the registered operator
@@ -61,7 +59,19 @@ interface IECDSAStakeRegistryEventsAndErrors {
61
59
  /// @notice Emits when setting a new threshold weight.
62
60
  event ThresholdWeightUpdated(uint256 _thresholdWeight);
63
61
 
62
+ /// @notice Emitted when an operator's signing key is updated
63
+ /// @param operator The address of the operator whose signing key was updated
64
+ /// @param updateBlock The block number at which the signing key was updated
65
+ /// @param newSigningKey The operator's signing key after the update
66
+ /// @param oldSigningKey The operator's signing key before the update
67
+ event SigningKeyUpdate(
68
+ address indexed operator,
69
+ uint256 indexed updateBlock,
70
+ address indexed newSigningKey,
71
+ address oldSigningKey
72
+ );
64
73
  /// @notice Indicates when the lengths of the signers array and signatures array do not match.
74
+
65
75
  error LengthMismatch();
66
76
 
67
77
  /// @notice Indicates encountering an invalid length for the signers or signatures array.
@@ -76,6 +86,9 @@ interface IECDSAStakeRegistryEventsAndErrors {
76
86
  /// @notice Thrown when missing operators in an update
77
87
  error MustUpdateAllOperators();
78
88
 
89
+ /// @notice Reference blocks must be for blocks that have already been confirmed
90
+ error InvalidReferenceBlock();
91
+
79
92
  /// @notice Indicates operator weights were out of sync and the signed weight exceed the total
80
93
  error InvalidSignedWeight();
81
94
 
@@ -65,4 +65,16 @@ contract XERC20Test is ERC20Test, IXERC20 {
65
65
  function burn(address account, uint256 amount) public override {
66
66
  _burn(account, amount);
67
67
  }
68
+
69
+ function setLimits(
70
+ address _bridge,
71
+ uint256 _mintingLimit,
72
+ uint256 _burningLimit
73
+ ) external {
74
+ require(false);
75
+ }
76
+
77
+ function owner() external returns (address) {
78
+ return address(0x0);
79
+ }
68
80
  }
@@ -5,7 +5,7 @@ import {IFiatToken} from "../interfaces/IFiatToken.sol";
5
5
  import {HypERC20Collateral} from "../HypERC20Collateral.sol";
6
6
 
7
7
  // see https://github.com/circlefin/stablecoin-evm/blob/master/doc/tokendesign.md#issuing-and-destroying-tokens
8
- contract HypFiatTokenCollateral is HypERC20Collateral {
8
+ contract HypFiatToken is HypERC20Collateral {
9
9
  constructor(
10
10
  address _fiatToken,
11
11
  address _mailbox
@@ -4,7 +4,7 @@ pragma solidity >=0.8.0;
4
4
  import {IXERC20} from "../interfaces/IXERC20.sol";
5
5
  import {HypERC20Collateral} from "../HypERC20Collateral.sol";
6
6
 
7
- contract HypXERC20Collateral is HypERC20Collateral {
7
+ contract HypXERC20 is HypERC20Collateral {
8
8
  constructor(
9
9
  address _xerc20,
10
10
  address _mailbox
@@ -0,0 +1,54 @@
1
+ // SPDX-License-Identifier: MIT OR Apache-2.0
2
+ pragma solidity >=0.8.0;
3
+
4
+ import {IXERC20Lockbox} from "../interfaces/IXERC20Lockbox.sol";
5
+ import {IXERC20, IERC20} from "../interfaces/IXERC20.sol";
6
+ import {HypERC20Collateral} from "../HypERC20Collateral.sol";
7
+
8
+ contract HypXERC20Lockbox is HypERC20Collateral {
9
+ uint256 constant MAX_INT = 2 ** 256 - 1;
10
+
11
+ IXERC20Lockbox public immutable lockbox;
12
+ IXERC20 public immutable xERC20;
13
+
14
+ constructor(
15
+ address _lockbox,
16
+ address _mailbox
17
+ ) HypERC20Collateral(address(IXERC20Lockbox(_lockbox).ERC20()), _mailbox) {
18
+ lockbox = IXERC20Lockbox(_lockbox);
19
+ xERC20 = lockbox.XERC20();
20
+
21
+ // grant infinite approvals to lockbox
22
+ require(
23
+ IERC20(wrappedToken).approve(_lockbox, MAX_INT),
24
+ "erc20 lockbox approve failed"
25
+ );
26
+ require(
27
+ xERC20.approve(_lockbox, MAX_INT),
28
+ "xerc20 lockbox approve failed"
29
+ );
30
+ }
31
+
32
+ function _transferFromSender(
33
+ uint256 _amount
34
+ ) internal override returns (bytes memory) {
35
+ // transfer erc20 from sender
36
+ super._transferFromSender(_amount);
37
+ // convert erc20 to xERC20
38
+ lockbox.deposit(_amount);
39
+ // burn xERC20
40
+ xERC20.burn(address(this), _amount);
41
+ return bytes("");
42
+ }
43
+
44
+ function _transferTo(
45
+ address _recipient,
46
+ uint256 _amount,
47
+ bytes calldata /*metadata*/
48
+ ) internal override {
49
+ // mint xERC20
50
+ xERC20.mint(address(this), _amount);
51
+ // convert xERC20 to erc20
52
+ lockbox.withdrawTo(_recipient, _amount);
53
+ }
54
+ }
@@ -21,4 +21,19 @@ interface IXERC20 is IERC20 {
21
21
  * @param _amount The amount of tokens being burned
22
22
  */
23
23
  function burn(address _user, uint256 _amount) external;
24
+
25
+ /**
26
+ * @notice Updates the limits of any bridge
27
+ * @dev Can only be called by the owner
28
+ * @param _mintingLimit The updated minting limit we are setting to the bridge
29
+ * @param _burningLimit The updated burning limit we are setting to the bridge
30
+ * @param _bridge The address of the bridge we are setting the limits too
31
+ */
32
+ function setLimits(
33
+ address _bridge,
34
+ uint256 _mintingLimit,
35
+ uint256 _burningLimit
36
+ ) external;
37
+
38
+ function owner() external returns (address);
24
39
  }
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: UNLICENSED
2
+ pragma solidity >=0.8.4 <0.9.0;
3
+
4
+ // adapted from https://github.com/defi-wonderland/xERC20
5
+
6
+ import {IXERC20} from "./IXERC20.sol";
7
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
8
+
9
+ interface IXERC20Lockbox {
10
+ /**
11
+ * @notice The XERC20 token of this contract
12
+ */
13
+ function XERC20() external returns (IXERC20);
14
+
15
+ /**
16
+ * @notice The ERC20 token of this contract
17
+ */
18
+ function ERC20() external returns (IERC20);
19
+
20
+ /**
21
+ * @notice Deposit ERC20 tokens into the lockbox
22
+ *
23
+ * @param _amount The amount of tokens to deposit
24
+ */
25
+
26
+ function deposit(uint256 _amount) external;
27
+
28
+ /**
29
+ * @notice Deposit ERC20 tokens into the lockbox, and send the XERC20 to a user
30
+ *
31
+ * @param _user The user to send the XERC20 to
32
+ * @param _amount The amount of tokens to deposit
33
+ */
34
+
35
+ function depositTo(address _user, uint256 _amount) external;
36
+
37
+ /**
38
+ * @notice Deposit the native asset into the lockbox, and send the XERC20 to a user
39
+ *
40
+ * @param _user The user to send the XERC20 to
41
+ */
42
+
43
+ function depositNativeTo(address _user) external payable;
44
+
45
+ /**
46
+ * @notice Withdraw ERC20 tokens from the lockbox
47
+ *
48
+ * @param _amount The amount of tokens to withdraw
49
+ */
50
+
51
+ function withdraw(uint256 _amount) external;
52
+
53
+ /**
54
+ * @notice Withdraw ERC20 tokens from the lockbox
55
+ *
56
+ * @param _user The user to withdraw to
57
+ * @param _amount The amount of tokens to withdraw
58
+ */
59
+
60
+ function withdrawTo(address _user, uint256 _amount) external;
61
+ }