Skip to content

Commit

Permalink
Merge pull request #3 from crosschain-alliance/feat/amb-update-on-mes…
Browse files Browse the repository at this point in the history
…sage

feat: add adapters & threshold to onMessage (AMB)
  • Loading branch information
allemanfredi authored Jun 18, 2024
2 parents 0cef705 + d5f8f2b commit 24be92c
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 57 deletions.
4 changes: 4 additions & 0 deletions contracts/interfaces/IHashiManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ interface IHashiManager {

function reporters() external view returns (address[]);

function expectedAdaptersHash() external view returns (bytes32);

function expectedThreshold() external view returns (uint256);

function yaho() external view returns (address);

function yaru() external view returns (address);
Expand Down
5 changes: 0 additions & 5 deletions contracts/interfaces/hashi/IAdapter.sol

This file was deleted.

15 changes: 0 additions & 15 deletions contracts/interfaces/hashi/IReporter.sol

This file was deleted.

7 changes: 2 additions & 5 deletions contracts/interfaces/hashi/IYaho.sol
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
pragma solidity 0.4.24;

import "./IAdapter.sol";
import "./IReporter.sol";

interface IYaho {
function dispatchMessage(
uint256 targetChainId,
uint256 threshold,
address receiver,
bytes data,
IReporter[] reporters,
IAdapter[] adapters
address[] reporters,
address[] adapters
) external returns (uint256);
}
36 changes: 20 additions & 16 deletions contracts/upgradeable_contracts/BasicBridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@ pragma solidity 0.4.24;
import "./Upgradeable.sol";
import "./InitializableBridge.sol";
import "openzeppelin-solidity/contracts/AddressUtils.sol";
import "../libraries/ArbitraryMessage.sol";
import "./Validatable.sol";
import "./Ownable.sol";
import "./Claimable.sol";
import "./VersionableBridge.sol";
import "./DecimalShiftBridge.sol";
import "../interfaces/hashi/IYaho.sol";
import "../interfaces/hashi/IAdapter.sol";
import "../interfaces/hashi/IReporter.sol";
import "../interfaces/IHashiManager.sol";

contract BasicBridge is
Expand Down Expand Up @@ -84,22 +83,27 @@ contract BasicBridge is

function _maybeRelayDataWithHashi(bytes data) internal {
if (HASHI_IS_ENABLED) {
address[] memory hReporters = hashiManager().reporters();
IReporter[] memory reporters = new IReporter[](hReporters.length);
for (uint256 i = 0; i < hReporters.length; i++) reporters[i] = IReporter(hReporters[i]);

address[] memory hAdapters = hashiManager().adapters();
IAdapter[] memory adapters = new IAdapter[](hAdapters.length);
for (uint256 j = 0; j < hAdapters.length; j++) adapters[j] = IAdapter(hAdapters[j]);

IYaho(hashiManager().yaho()).dispatchMessage(
hashiManager().targetChainId(),
hashiManager().threshold(),
hashiManager().targetAddress(),
IHashiManager manager = hashiManager();
IYaho(manager.yaho()).dispatchMessage(
manager.targetChainId(),
manager.threshold(),
manager.targetAddress(),
data,
reporters,
adapters
manager.reporters(),
manager.adapters()
);
}
}

function _validateHashiMessage(uint256 chainId, uint256 threshold, address sender, address[] adapters) internal {
IHashiManager manager = hashiManager();
require(
HASHI_IS_ENABLED &&
msg.sender == manager.yaru() &&
chainId == manager.targetChainId() &&
sender == manager.targetAddress() &&
threshold == manager.expectedThreshold() &&
keccak256(abi.encodePacked(adapters)) == manager.expectedAdaptersHash()
);
}
}
18 changes: 18 additions & 0 deletions contracts/upgradeable_contracts/HashiManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ contract HashiManager is InitializableBridge, Ownable {
bytes32 internal constant TARGET_ADDRESS = 0x2f1696ba9bd43014bc580768c9270c32ad765cbf97d2a2ba5e81ab9f1ee90561; // keccak256(abi.encodePacked("targetAddress"))
bytes32 internal constant TARGET_CHAIN_ID = 0xbd2b577e24554caf96874c1f333079c108fe5afbd441f36a76920df41d10820c; // keccak256(abi.encodePacked("targetChainId"))
bytes32 internal constant THRESHOLD = 0xd46c2b20c7303c2e50535d224276492e8a1eda2a3d7398e0bea254640c1154e7; // keccak256(abi.encodePacked("threshold"))
bytes32 internal constant EXPECTED_THRESHOLD = 0x8d22a2c372a80e72edabc4af18641f1c8144f8c3c74dce591bace2af2a167b88; // keccak256(abi.encodePacked("expectedThreshold"))
bytes32 internal constant EXPECTED_ADAPTERS_HASH = 0x21aa67cae9293b939ada82eb9133293e592da66aa847a5596523bd6d2bf2529b; // keccak256(abi.encodePacked("expectedAdapters"))

function initialize(address _owner) external onlyRelevantSender returns (bool) {
require(!isInitialized());
Expand All @@ -37,6 +39,22 @@ contract HashiManager is InitializableBridge, Ownable {
return _getArray(N_REPORTERS, "reporters");
}

function expectedAdaptersHash() external view returns (bytes32) {
return bytes32(uintStorage[EXPECTED_ADAPTERS_HASH]);
}

function setExpectedAdaptersHash(address[] adapters_) external onlyOwner {
uintStorage[EXPECTED_ADAPTERS_HASH] = uint256(keccak256(abi.encodePacked(adapters_)));
}

function expectedThreshold() external view returns (uint256) {
return uintStorage[EXPECTED_THRESHOLD];
}

function setExpectedThreshold(uint256 expectedThreshold_) external onlyOwner {
uintStorage[EXPECTED_THRESHOLD] = expectedThreshold_;
}

function yaho() external view returns (address) {
return addressStorage[YAHO];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,16 @@ contract BasicForeignAMB is BasicAMB, MessageRelay, MessageDelivery {
processMessage(sender, executor, msgId, gasLimit, dataType, chainIds[0], data);
}

function onMessage(uint256 chainId, uint256, address sender, bytes message) external returns (bytes) {
require(
HASHI_IS_ENABLED &&
msg.sender == hashiManager().yaru() &&
chainId == hashiManager().targetChainId() &&
sender == hashiManager().targetAddress()
);
(bytes32 msgId, ) = ArbitraryMessage.unpackData(message);
function onMessage(
uint256, /*messageId*/
uint256 chainId,
address sender,
uint256 threshold,
address[] adapters,
bytes data
) external returns (bytes) {
_validateHashiMessage(chainId, threshold, sender, adapters);
(bytes32 msgId, ) = ArbitraryMessage.unpackData(data);
_setHashiApprovalForMessage(msgId, true);
}

Expand Down
18 changes: 10 additions & 8 deletions contracts/upgradeable_contracts/arbitrary_message/BasicHomeAMB.sol
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,16 @@ contract BasicHomeAMB is BasicAMB, MessageDelivery {
}
}

function onMessage(uint256 chainId, uint256, address sender, bytes message) external returns (bytes) {
require(
HASHI_IS_ENABLED &&
msg.sender == hashiManager().yaru() &&
chainId == hashiManager().targetChainId() &&
sender == hashiManager().targetAddress()
);
(bytes32 msgId, ) = ArbitraryMessage.unpackData(message);
function onMessage(
uint256, /*messageId*/
uint256 chainId,
address sender,
uint256 threshold,
address[] adapters,
bytes data
) external returns (bytes) {
_validateHashiMessage(chainId, threshold, sender, adapters);
(bytes32 msgId, ) = ArbitraryMessage.unpackData(data);
_setHashiApprovalForMessage(msgId, true);
}

Expand Down

0 comments on commit 24be92c

Please sign in to comment.