diff --git a/contracts/precrime/ILayerZeroClientPrecrime.sol b/contracts/precrime/ILayerZeroClientPrecrime.sol new file mode 100644 index 0000000..a255c57 --- /dev/null +++ b/contracts/precrime/ILayerZeroClientPrecrime.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import { ILayerZeroClientPrecrimeInternal } from './ILayerZeroClientPrecrimeInternal.sol'; + +interface ILayerZeroClientPrecrime is ILayerZeroClientPrecrimeInternal { + function precrime() external view returns (address); + + function setPrecrime(address precrime) external; +} diff --git a/contracts/precrime/ILayerZeroClientPrecrimeInternal.sol b/contracts/precrime/ILayerZeroClientPrecrimeInternal.sol new file mode 100644 index 0000000..fc34367 --- /dev/null +++ b/contracts/precrime/ILayerZeroClientPrecrimeInternal.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +interface ILayerZeroClientPrecrimeInternal { + event SetPrecrime(address precrime); +} diff --git a/contracts/precrime/LayerZeroClientPrecrime.sol b/contracts/precrime/LayerZeroClientPrecrime.sol new file mode 100644 index 0000000..a1809b5 --- /dev/null +++ b/contracts/precrime/LayerZeroClientPrecrime.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import { ILayerZeroClientPrecrime } from './ILayerZeroClientPrecrime.sol'; +import { LayerZeroClientPrecrimeInternal } from './LayerZeroClientPrecrimeInternal.sol'; + +abstract contract LayerZeroClientPrecrime is + ILayerZeroClientPrecrime, + LayerZeroClientPrecrimeInternal +{ + function precrime() external view returns (address) { + return _precrime(); + } + + function setPrecrime(address precrime) external { + return _setPrecrime(precrime); + } +} diff --git a/contracts/precrime/LayerZeroClientPrecrimeInternal.sol b/contracts/precrime/LayerZeroClientPrecrimeInternal.sol new file mode 100644 index 0000000..45fa661 --- /dev/null +++ b/contracts/precrime/LayerZeroClientPrecrimeInternal.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import { ILayerZeroClientPrecrimeInternal } from './ILayerZeroClientPrecrimeInternal.sol'; +import { LayerZeroClientPrecrimeStorage } from './LayerZeroClientPrecrimeStorage.sol'; + +abstract contract LayerZeroClientPrecrimeInternal is + ILayerZeroClientPrecrimeInternal +{ + function _precrime() internal view virtual returns (address) { + return LayerZeroClientPrecrimeStorage.layout().precrime; + } + + function _setPrecrime(address precrime) internal virtual { + // TODO: onlyOwner + LayerZeroClientPrecrimeStorage.layout().precrime = precrime; + emit SetPrecrime(precrime); + } +} diff --git a/contracts/precrime/LayerZeroClientPrecrimeStorage.sol b/contracts/precrime/LayerZeroClientPrecrimeStorage.sol new file mode 100644 index 0000000..0bb2dda --- /dev/null +++ b/contracts/precrime/LayerZeroClientPrecrimeStorage.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +library LayerZeroClientPrecrimeStorage { + struct Layout { + address precrime; + } + + bytes32 internal constant STORAGE_SLOT = + keccak256('solidstate.contracts.storage.LayerZeroClientPrecrime'); + + function layout() internal pure returns (Layout storage l) { + bytes32 slot = STORAGE_SLOT; + assembly { + l.slot := slot + } + } +}