Skip to content

Commit

Permalink
feat: modify the committee tree logic to allow the real time updates (#…
Browse files Browse the repository at this point in the history
…18)

* init

* refactor the real time update logic

* small fixing
  • Loading branch information
cool-develope authored Aug 21, 2023
1 parent b994701 commit 3b81249
Show file tree
Hide file tree
Showing 20 changed files with 576 additions and 450 deletions.
8 changes: 4 additions & 4 deletions config/LagrangeService.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"strategies": [
{
"strategy_address": "0xdEe9De63F5E5db89cfCcC550ABAaDF61A48E7225",
"strategy_address": "0x91E333A3d61862B1FE976351cf0F3b30aff1D202",
"strategy_name": "Wrapped Ether",
"multiplier": 1000000000
}
Expand All @@ -21,7 +21,7 @@
}
],
"settlement": {
"opt_l2outputoracle": "0x4200000000000000000000000000000000000016",
"arb_outbox": "0x45Af9Ed1D03703e480CE7d328fB684bb67DA5049"
"opt_l2outputoracle": "0x4200000000000000000000000000000000000016",
"arb_outbox": "0x45Af9Ed1D03703e480CE7d328fB684bb67DA5049"
}
}
}
6 changes: 3 additions & 3 deletions script/Add_Quorum.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ contract AddQuorum is Script, Test {
string memory deployLGRData = vm.readFile(deployedLGRPath);
string memory configData = vm.readFile(configPath);

LagrangeService lagrangeService = LagrangeService(
stdJson.readAddress(deployLGRData, ".addresses.lagrangeService")
LagrangeCommittee committee = LagrangeCommittee(
stdJson.readAddress(deployLGRData, ".addresses.lagrangeCommittee")
);

// add strategy multipliers to lagrange service
Expand All @@ -52,7 +52,7 @@ contract AddQuorum is Script, Test {
});
}

lagrangeService.addStrategiesConsideredAndMultipliers(
committee.addStrategiesConsideredAndMultipliers(
1,
newStrategiesConsideredAndMultipliers
);
Expand Down
35 changes: 21 additions & 14 deletions script/Deploy_LGR.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {IL2OutputOracle} from "src/mock/optimism/IL2OutputOracle.sol";
contract Deploy is Script, Test {
string public deployDataPath =
string(bytes("script/output/deployed_mock.json"));
//string(bytes("script/output/M1_deployment_data.json"));
//string(bytes("script/output/M1_deployment_data.json"));
string public poseidonDataPath =
string(bytes("script/output/deployed_poseidon.json"));
string public serviceDataPath =
Expand Down Expand Up @@ -68,7 +68,7 @@ contract Deploy is Script, Test {

// deploy proxy admin for ability to upgrade proxy contracts
proxyAdmin = new ProxyAdmin();

// deploy upgradeable proxy contracts
emptyContract = new EmptyContract();
lagrangeCommittee = LagrangeCommittee(
Expand Down Expand Up @@ -101,23 +101,30 @@ contract Deploy is Script, Test {

// deploy implementation contracts
string memory poseidonData = vm.readFile(poseidonDataPath);
lagrangeCommitteeImp = new LagrangeCommittee(lagrangeService);
lagrangeCommitteeImp = new LagrangeCommittee(
lagrangeService,
lagrangeServiceManager,
IStrategyManager(strategyManagerAddress)
);
lagrangeServiceManagerImp = new LagrangeServiceManager(
ISlasher(slasherAddress)
ISlasher(slasherAddress),
lagrangeCommittee,
lagrangeService
);

lagrangeServiceImp = new LagrangeService(
lagrangeServiceManager,
lagrangeCommittee,
IStrategyManager(strategyManagerAddress)
lagrangeServiceManager
);

outbox = new Outbox();
IL2OutputOracle opt_L2OutputOracle = IL2OutputOracle(
stdJson.readAddress(configData, ".settlement.opt_l2outputoracle")
);

outbox = new Outbox();
IL2OutputOracle opt_L2OutputOracle = IL2OutputOracle(stdJson.readAddress(configData, ".settlement.opt_l2outputoracle"));
//L2OutputOracle l2oo = new L2OutputOracle();
//IL2OutputOracle opt_L2OutputOracle = IL2OutputOracle(l2oo.address);
//IOutbox arb_Outbox = IOutbox(stdJson.readAddress(configData, ".settlement.arb_outbox"));
IOutbox arb_Outbox = IOutbox(address(outbox));
//L2OutputOracle l2oo = new L2OutputOracle();
//IL2OutputOracle opt_L2OutputOracle = IL2OutputOracle(l2oo.address);
//IOutbox arb_Outbox = IOutbox(stdJson.readAddress(configData, ".settlement.arb_outbox"));
IOutbox arb_Outbox = IOutbox(address(outbox));

// deploy evidence verifier
arbitrumVerifier = new ArbitrumVerifier(outbox);
Expand Down
11 changes: 4 additions & 7 deletions script/Init_Committee.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ contract InitCommittee is Script, Test {
string public configPath = string(bytes("config/LagrangeService.json"));

struct InitialChains {
uint256 chainId;
uint32 chainId;
string chainName;
uint256 epochPeriod;
uint256 freezeDuration;
Expand All @@ -32,12 +32,9 @@ contract InitCommittee is Script, Test {
LagrangeCommittee lagrangeCommittee = LagrangeCommittee(
stdJson.readAddress(deployLGRData, ".addresses.lagrangeCommittee")
);

// initialize the lagrange committee
bytes memory initChains = stdJson.parseRaw(
configData,
".chains"
);
bytes memory initChains = stdJson.parseRaw(configData, ".chains");
InitialChains[] memory initialChains = abi.decode(
initChains,
(InitialChains[])
Expand All @@ -48,7 +45,7 @@ contract InitCommittee is Script, Test {
initialChains[i].chainId,
initialChains[i].epochPeriod,
initialChains[i].freezeDuration
);
);
}

vm.stopBroadcast();
Expand Down
43 changes: 38 additions & 5 deletions script/Redeploy_LGR_Committee.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,67 @@ pragma solidity ^0.8.12;
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";

import {IStrategyManager} from "eigenlayer-contracts/interfaces/IStrategyManager.sol";

import {LagrangeCommittee} from "src/protocol/LagrangeCommittee.sol";
import {LagrangeService} from "src/protocol/LagrangeService.sol";
import {LagrangeServiceManager} from "src/protocol/LagrangeServiceManager.sol";

import "forge-std/Script.sol";
import "forge-std/Test.sol";

contract Deploy is Script, Test {
string public deployDataPath =
string(bytes("script/output/deployed_goerli.json"));
string public mockDataPath =
string(bytes("script/output/deployed_mock.json"));

// Lagrange Contracts
ProxyAdmin public proxyAdmin;
LagrangeCommittee public lagrangeCommittee;
LagrangeCommittee public lagrangeCommitteeImp;
LagrangeService public lagrangeService;
LagrangeServiceManager public lagrangeServiceManager;

function run() public {
string memory deployData = vm.readFile(deployDataPath);
string memory mockData = vm.readFile(mockDataPath);

address strategyManagerAddress = stdJson.readAddress(
mockData,
".addresses.strategyManager"
);

vm.startBroadcast(msg.sender);

// deploy proxy admin for ability to upgrade proxy contracts
proxyAdmin = ProxyAdmin(stdJson.readAddress(deployData, ".lagrange.addresses.proxyAdmin"));
lagrangeService = LagrangeService(stdJson.readAddress(deployData, ".lagrange.addresses.lagrangeService"));
lagrangeCommittee = LagrangeCommittee(stdJson.readAddress(deployData, ".lagrange.addresses.lagrangeCommittee"));

proxyAdmin = ProxyAdmin(
stdJson.readAddress(deployData, ".lagrange.addresses.proxyAdmin")
);
lagrangeService = LagrangeService(
stdJson.readAddress(
deployData,
".lagrange.addresses.lagrangeService"
)
);
lagrangeCommittee = LagrangeCommittee(
stdJson.readAddress(
deployData,
".lagrange.addresses.lagrangeCommittee"
)
);
lagrangeServiceManager = LagrangeServiceManager(
stdJson.readAddress(
deployData,
".lagrange.addresses.lagrangeServiceManager"
)
);
// deploy implementation contracts
lagrangeCommitteeImp = new LagrangeCommittee(lagrangeService);
lagrangeCommitteeImp = new LagrangeCommittee(
lagrangeService,
lagrangeServiceManager,
IStrategyManager(strategyManagerAddress)
);

// upgrade proxy contracts
proxyAdmin.upgrade(
Expand Down
8 changes: 4 additions & 4 deletions script/Remove_Quorum.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ contract RemoveQuorum is Script, Test {

string memory deployLGRData = vm.readFile(deployedLGRPath);

LagrangeService lagrangeService = LagrangeService(
stdJson.readAddress(deployLGRData, ".addresses.lagrangeService")
LagrangeCommittee committee = LagrangeCommittee(
stdJson.readAddress(deployLGRData, ".addresses.lagrangeCommittee")
);

IStrategy[] memory strategies = new IStrategy[](1);
strategies[0] = IStrategy(0x91E333A3d61862B1FE976351cf0F3b30aff1D202);
uint256[] memory indexes = new uint256[](1);
indexes[0] = 0;
lagrangeService.removeStrategiesConsideredAndMultipliers(
committee.removeStrategiesConsideredAndMultipliers(
1,
strategies,
indexes
Expand Down
14 changes: 7 additions & 7 deletions script/output/deployed_lgr.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"addresses": {
"lagrangeCommittee": "0xC1dCca9f209BD61a154e85980dcaff3203e27c69",
"lagrangeCommitteeImp": "0x5439b84e75C18319D085d5a0d075e6d554Dc6A5a",
"lagrangeService": "0x4e61b4f5C24441C5f7c1e912595794a06C14906f",
"lagrangeServiceImp": "0x559dc7De2842dbf9255224327310ec2Bd10911d7",
"lagrangeServiceManager": "0xB98bE9328734DDBa1d3F1DA2715C53a6ca1015f6",
"lagrangeServiceManagerImp": "0x3CA882c83d3bE68C2654f23773c3f8DBE91751d7",
"proxyAdmin": "0xe76f31442D911A4f7D0792E0AC815De8F02350a0"
"lagrangeCommittee": "0x923d8ADAAa6e52c485293cD48EE56F7BFAD85cd4",
"lagrangeCommitteeImp": "0x75B96311d8040c0F0d543ED5dc57b8Aa8492ffEF",
"lagrangeService": "0xF824C350EA9501234a731B01B8EC6E660e069c7F",
"lagrangeServiceImp": "0x98f07aB2d35638B79582b250C01444cEce0E517A",
"lagrangeServiceManager": "0x181e2559779316009409f9C9F6d47C323B5720F0",
"lagrangeServiceManagerImp": "0xBbE77E34F41aBf10bc3B408D975c38F15592AF2d",
"proxyAdmin": "0x0C601f8E4776bD47e1c460547c457B4A5EE93faA"
}
}
2 changes: 1 addition & 1 deletion script/output/deployed_mock.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"addresses":{"delegationManager":"0xE93DCb1e6D17Fd3178700FfE8DB8715cAd6E51F0","slasher":"0x82172b246D7e1A0Be30806119071c1CC83d0dDA2","strategy":"0xdEe9De63F5E5db89cfCcC550ABAaDF61A48E7225","strategyManager":"0x43727F38be62e5f0B163e5d725b4e78284165455"}}
{"addresses":{"delegationManager":"0xbB9dDB1020F82F93e45DA0e2CFbd27756DA36956","slasher":"0x189d4f39f158664185DBB101791F47485B5bE993","strategy":"0x91E333A3d61862B1FE976351cf0F3b30aff1D202","strategyManager":"0x2f947E51B9A7cF1d6651D0a568261673233ba42b"}}
12 changes: 6 additions & 6 deletions script/output/deployed_poseidon.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"1": "0x22a80E4C09ACd1FD19cdDDD8F020255Ee619dFF0",
"2": "0xe60D87B752Bd1E6b60eA02AD9F5fd65d2f279F12",
"3": "0x3887f9e588Ec904b35e55B98C3746df485D3c25b",
"4": "0x6cC86DA97a0BFd83700EAf4DF66af8A63135B2BC",
"5": "0x0Bf14bD6270174FacD565878C6ad3C7d0bBc65B9",
"6": "0xC74D628EA658902D72Ac04Eabe62452b5Cd73365"
"1": "0xfd312Cf68d8cDC70bAB7AfDccBae9f2D0F9bA291",
"2": "0x8c6dB7d2F49c56aFe04A790d215E4dC6D7451d72",
"3": "0x11b59cE6E2b4509218bf45AF3582dC7E2a1e8a57",
"4": "0xf32358f5C8FFfCF1a7bDb58b270a082abb7Ba1A6",
"5": "0x660A09d2776fB3A4F4c2da6eBAa66996748Ec061",
"6": "0xa6045E9a60517Cf29435663a7f47f425e6020D53"
}
49 changes: 29 additions & 20 deletions src/interfaces/ILagrangeCommittee.sol
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.12;

interface ILagrangeCommittee {
struct OperatorStatus {
uint256 amount;
bytes blsPubKey;
uint32 serveUntilBlock;
bool slashed;
}
struct OperatorStatus {
uint256 amount;
bytes blsPubKey;
uint32 serveUntilBlock;
uint32 chainID;
bool slashed;
}

/// Leaf in Lagrange State Committee Trie
struct CommitteeLeaf {
address addr;
uint256 stake;
bytes blsPubKey;
}
struct OperatorUpdate {
address operator;
uint8 updateType;
}

interface ILagrangeCommittee {
struct CommitteeDef {
uint256 startBlock;
uint256 duration;
Expand All @@ -29,14 +28,24 @@ interface ILagrangeCommittee {
}

function getServeUntilBlock(address operator) external returns (uint32);

function setSlashed(address operator, uint256 chainID, bool slashed) external;

function setSlashed(address operator) external;

function getSlashed(address operator) external returns (bool);

function getCommittee(uint256 chainID, uint256 blockNumber) external returns (CommitteeData memory, uint256);

function addOperator(address operator, uint256 chainID, bytes memory blsPubKey, uint256 stake, uint32 serveUntilBlock) external;
function getCommittee(
uint32 chainID,
uint256 blockNumber
) external returns (CommitteeData memory, uint256);

function update(uint256 chainID, uint256 epochNumber) external;
}
function addOperator(
address operator,
bytes memory blsPubKey,
uint32 chainID,
uint32 serveUntilBlock
) external;

function updateOperator(OperatorUpdate memory opUpdate) external;

function update(uint32 chainID, uint256 epochNumber) external;
}
2 changes: 1 addition & 1 deletion src/interfaces/ILagrangeService.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity ^0.8.12;

interface ILagrangeService {
function register(
uint256 chainID,
uint32 chainID,
bytes memory _blsPubKey,
uint32 serveUntilBlock
) external;
Expand Down
27 changes: 16 additions & 11 deletions src/library/ArbitrumVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import "solidity-rlp/contracts/Helper.sol";
import "../mock/arbitrum/IOutbox.sol";

contract ArbitrumVerifier is Common {

IOutbox ArbOutbox;

using RLPReader for RLPReader.RLPItem;
Expand All @@ -18,31 +17,37 @@ contract ArbitrumVerifier is Common {
}

function verifyArbBlock(
bytes memory rlpData,
bytes memory rlpData,
uint256 comparisonNumber,
bytes32 comparisonBlockHash,
bytes calldata headerProof,
bytes32 comparisonBlockHash,
bytes calldata headerProof,
uint256 chainID
) external view returns (bool) {
RLPReader.RLPItem[] memory decoded = checkAndDecodeRLP(rlpData, comparisonBlockHash);
RLPReader.RLPItem memory extraDataItem = decoded[Common.BLOCK_HEADER_EXTRADATA_INDEX];
RLPReader.RLPItem memory blockNumberItem = decoded[Common.BLOCK_HEADER_NUMBER_INDEX];
RLPReader.RLPItem[] memory decoded = checkAndDecodeRLP(
rlpData,
comparisonBlockHash
);
RLPReader.RLPItem memory extraDataItem = decoded[
Common.BLOCK_HEADER_EXTRADATA_INDEX
];
RLPReader.RLPItem memory blockNumberItem = decoded[
Common.BLOCK_HEADER_NUMBER_INDEX
];
uint number = blockNumberItem.toUint();

bytes32 extraData = bytes32(extraDataItem.toUintStrict()); //TODO Maybe toUint() - please test this specifically with several cases.
bytes32 l2Hash = ArbOutbox.roots(extraData);
if (l2Hash == bytes32(0)) {
// No such confirmed node... TODO determine how these should be handled
return false;
}

//bool hashCheck = l2hash == comparisonBlockHash;
//bool numberCheck = number == comparisonNumber;
//bool res = hashCheck && numberCheck;
//bool res = true;
//bool res = true;
// Verify Proof
bool res = true;
return res;
}

}
Loading

0 comments on commit 3b81249

Please sign in to comment.