Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion lightclients/bsc/contracts/lib/Verify.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ library Verify {
uint256 blobGasUsed;
uint256 excessBlobGas;
bytes parentBeaconBlockRoot;
bytes requestsHash;
}

struct ReceiptProof {
Expand Down Expand Up @@ -161,6 +162,8 @@ library Verify {
bytes[] memory list;
if(bytes32(_header.parentBeaconBlockRoot) != bytes32("")){
list = new bytes[](16);
} else if(bytes32(_header.requestsHash) != bytes32("")){
list = new bytes[](22);
} else {
list = new bytes[](21);
}
Expand Down Expand Up @@ -195,7 +198,10 @@ library Verify {
_list[18] = RLPEncode.encodeUint(_header.blobGasUsed);
_list[19] = RLPEncode.encodeUint(_header.excessBlobGas);
_list[20] = RLPEncode.encodeBytes(_header.parentBeaconBlockRoot);
}
if(_list.length != 21){
_list[21] = RLPEncode.encodeBytes(_header.requestsHash);
}
}
}

function _validateProof(
Expand Down
10 changes: 7 additions & 3 deletions lightclients/bsc/utils/Util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const { promisfy } = require("promisfy");
public blobGasUsed?:BigNumber;
public excessBlobGas?:BigNumber;
public parentBeaconBlockRoot?:string
public requestsHash ?:string
constructor(
parentHash: string,
sha3Uncles: string,
Expand All @@ -50,6 +51,7 @@ const { promisfy } = require("promisfy");
blobGasUsed:BigNumber,
excessBlobGas:BigNumber,
parentBeaconBlockRoot:string,
requestsHash:string,
) {
this.parentHash = parentHash;
this.sha3Uncles = sha3Uncles;
Expand All @@ -69,6 +71,7 @@ const { promisfy } = require("promisfy");
this.blobGasUsed = blobGasUsed;
this.excessBlobGas = excessBlobGas;
this.parentBeaconBlockRoot = parentBeaconBlockRoot;
this.requestsHash = requestsHash;
}
}

Expand Down Expand Up @@ -109,7 +112,7 @@ const { promisfy } = require("promisfy");


export class ReceiptProof {
public txReceipt?: string;;
public txReceipt?: string;
public keyIndex?: string;
public proof?: Array<string>;

Expand Down Expand Up @@ -137,7 +140,7 @@ const { promisfy } = require("promisfy");
let blobGasUsed = rpcHeader.blobGasUsed ? BigNumber.from(rpcHeader.blobGasUsed) : BigNumber.from("0");
let excessBlobGas = rpcHeader.excessBlobGas ? BigNumber.from(rpcHeader.excessBlobGas) : BigNumber.from("0");
let parentBeaconBlockRoot = rpcHeader.parentBeaconBlockRoot ? rpcHeader.parentBeaconBlockRoot : "0x0000000000000000000000000000000000000000000000000000000000000001";

let requestsHash = rpcHeader.requestsHash ? rpcHeader.requestsHash : "0x0000000000000000000000000000000000000000000000000000000000000000";
let blockHeader = new BlockHeader(
rpcHeader.parentHash,
rpcHeader.sha3Uncles,
Expand All @@ -158,7 +161,8 @@ const { promisfy } = require("promisfy");
withdrawalsRoot,
blobGasUsed,
excessBlobGas,
parentBeaconBlockRoot
parentBeaconBlockRoot,
requestsHash
);
return blockHeader;
}
Expand Down
11 changes: 11 additions & 0 deletions lightclients/oracle/contracts/OracleProxy.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";

contract OracleProxy is ERC1967Proxy {
constructor(address _logic, bytes memory _data) ERC1967Proxy(_logic, _data) {
require(address(_logic) != address(0), "_logic zero address");
}
}
13 changes: 9 additions & 4 deletions lightclients/oracle/contracts/abstract/ECDSAMultisig.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

pragma solidity 0.8.20;

import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import {EnumerableSet} from "../lib/EnumerableSet.sol";
import {ECDSAMultisigStorage} from "../lib/ECDSAMultisigStorage.sol";
import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import { MultisigEnumerableSet } from "../lib/MultisigEnumerableSet.sol";
import { ECDSAMultisigStorage } from "../lib/ECDSAMultisigStorage.sol";

/**
* @title ECDSAMultisig
Expand All @@ -14,14 +14,16 @@ abstract contract ECDSAMultisig {
error ECDSAMultisig_AddSignerFailed();
error ECDSAMultisig_QuorumNotReached();
error ECDSAMultisig_RemoveSignerFailed();
error ECDSAMultisig_SignerZeroAddress();
error ECDSAMultisig_SignerLimitReached();
error ECDSAMultisig_SignerAlreadySigned();
error ECDSAMultisig_InsufficientSigners();
error ECDSAMultisig_MessageValueMismatch();
error ECDSAMultisig_QuorumValueZero();
error ECDSAMultisig_RecoveredSignerNotAuthorized();

using ECDSA for bytes32;
using EnumerableSet for EnumerableSet.AddressSet;
using MultisigEnumerableSet for MultisigEnumerableSet.AddressSet;

function _setQuorum(uint256 quorum) internal {
ECDSAMultisigStorage.Layout storage l = ECDSAMultisigStorage.layout();
Expand All @@ -43,6 +45,7 @@ abstract contract ECDSAMultisig {
ECDSAMultisigStorage.Layout storage l = ECDSAMultisigStorage.layout();

if (l.signers.length() >= 256) revert ECDSAMultisig_SignerLimitReached();
if (account == address(0)) revert ECDSAMultisig_SignerZeroAddress();
if (!l.signers.add(account)) revert ECDSAMultisig_AddSignerFailed();
}

Expand Down Expand Up @@ -83,6 +86,8 @@ abstract contract ECDSAMultisig {
) internal view virtual {
ECDSAMultisigStorage.Layout storage l = ECDSAMultisigStorage.layout();

if (l.quorum == 0) revert ECDSAMultisig_QuorumValueZero();

if (l.quorum > signatures.length) revert ECDSAMultisig_QuorumNotReached();

uint256 signerBitmap;
Expand Down
4 changes: 2 additions & 2 deletions lightclients/oracle/contracts/lib/ECDSAMultisigStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

pragma solidity 0.8.20;

import {EnumerableSet} from "../lib/EnumerableSet.sol";
import { MultisigEnumerableSet } from "../lib/MultisigEnumerableSet.sol";

/**
* @title ECDSAMultisig Storage
Expand All @@ -12,7 +12,7 @@ library ECDSAMultisigStorage {
struct Layout {
bytes32 version;
uint256 quorum;
EnumerableSet.AddressSet signers;
MultisigEnumerableSet.AddressSet signers;
}

bytes32 internal constant STORAGE_SLOT = keccak256("map.contracts.storage.ECDSAMultisig");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ pragma solidity 0.8.20;
* @dev https://github.com/solidstate-network/solidstate-solidity/blob/master/contracts/data/EnumerableSet.sol
* @dev derived from https://github.com/OpenZeppelin/openzeppelin-contracts (MIT license)
*/
library EnumerableSet {
library MultisigEnumerableSet {
error EnumerableSet__IndexOutOfBounds();

struct Set {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@mapprotocol/protocol/contracts/interface/ILightNode.sol";
import "./lib/Verify.sol";
import "../lib/Verify.sol";

contract LightNode is UUPSUpgradeable, Initializable, Pausable, ILightNode {
address public mptVerify;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@mapprotocol/protocol/contracts/interface/ILightNode.sol";
import "./abstract/ECDSAMultisig.sol";
import "./lib/Verify.sol";
import "../abstract/ECDSAMultisig.sol";
import "../lib/Verify.sol";

contract LightNodeV2 is ECDSAMultisig, UUPSUpgradeable, Initializable, Pausable, ILightNode {
address public mptVerify;
Expand All @@ -18,7 +18,7 @@ contract LightNodeV2 is ECDSAMultisig, UUPSUpgradeable, Initializable, Pausable,

uint256 private _nodeType;

event SetMptVerify(address newMptVerify);
// event SetMptVerify(address newMptVerify);
event SetNodeType(uint256 nodeType);
event UpdateMultisig(bytes32 version, uint256 quorum, address[] signers);
event AdminTransferred(address indexed previous, address indexed newAdmin);
Expand All @@ -39,19 +39,23 @@ contract LightNodeV2 is ECDSAMultisig, UUPSUpgradeable, Initializable, Pausable,
_;
}

constructor() {}
constructor() {
_disableInitializers();
}

function initialize(uint256 _chainId, address _controller, address _mptVerify, uint256 _node) external initializer {
require(_chainId > 0, "invalid _chainId");
require(_controller != address(0), "_controller zero address");
require(_mptVerify != address(0), "_mptVerify zero address");
require(_node == 4 || _node == 5, "LightNode: invalid node type");
chainId = _chainId;
mptVerify = _mptVerify;
_nodeType = _node;
_changeAdmin(_controller);
}

function updateMultisig(uint256 quorum, address[] calldata signers) external onlyOwner {
if(quorum == 0) revert ECDSAMultisig_QuorumValueZero();
_setQuorum(0);
address[] memory preSigners = _signers();
uint256 preLen = preSigners.length;
Expand Down Expand Up @@ -98,7 +102,7 @@ contract LightNodeV2 is ECDSAMultisig, UUPSUpgradeable, Initializable, Pausable,
function verifyProofData(
uint256 _logIndex,
bytes memory _receiptProof
) external view override returns (bool success, string memory message, ILightVerifier.txLog memory log) {
) external view override whenNotPaused returns (bool success, string memory message, ILightVerifier.txLog memory log) {
return _verifyProofData(_logIndex, _receiptProof);
}

Expand All @@ -113,7 +117,7 @@ contract LightNodeV2 is ECDSAMultisig, UUPSUpgradeable, Initializable, Pausable,
bool _cache,
uint256 _logIndex,
bytes memory _receiptProof
) external override returns (bool success, string memory message, ILightVerifier.txLog memory log) {
) external override whenNotPaused returns (bool success, string memory message, ILightVerifier.txLog memory log) {
return _verifyProofData(_logIndex, _receiptProof);
}

Expand Down Expand Up @@ -165,7 +169,7 @@ contract LightNodeV2 is ECDSAMultisig, UUPSUpgradeable, Initializable, Pausable,
}

function isVerifiable(uint256, bytes32) external view override returns (bool) {
return true;
return (_quorum() != 0 && !paused());
}

function nodeType() external view override returns (uint256) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@mapprotocol/protocol/contracts/interface/ILightNode.sol";
import "./abstract/ECDSAMultisig.sol";
import "../abstract/ECDSAMultisig.sol";

contract OracleV2 is ECDSAMultisig, Ownable, Pausable, ReentrancyGuard {
struct LightNodeInfo {
Expand Down Expand Up @@ -40,6 +40,7 @@ contract OracleV2 is ECDSAMultisig, Ownable, Pausable, ReentrancyGuard {
}

function updateMultisig(uint256 quorum, address[] calldata signers) external onlyOwner {
if(quorum == 0) revert ECDSAMultisig_QuorumValueZero();
_setQuorum(0);
address[] memory preSigners = _signers();
uint256 preLen = preSigners.length;
Expand Down Expand Up @@ -123,7 +124,7 @@ contract OracleV2 is ECDSAMultisig, Ownable, Pausable, ReentrancyGuard {
singers[i] = signer;
signatures[i] = signature;
}
canVerify = (len >= _quorum());
canVerify = (_version() == version && len >= _quorum());
}

function isProposed(
Expand Down
Loading