Skip to content
Merged
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
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@
[submodule "lib/forge-std"]
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/solady"]
path = lib/solady
url = https://github.com/Vectorized/solady
4 changes: 2 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
"[toml]": {
"editor.defaultFormatter": "tamasfe.even-better-toml"
},
"solidity.compileUsingRemoteVersion": "v0.8.17+commit.7dd6d404",
"solidity.compileUsingRemoteVersion": "v0.8.19+commit.7dd6d404",
"solidity.formatter": "forge",
"solidity.linter": "solhint",
"solidity.packageDefaultDependenciesContractsDirectory": "src",
"solidity.packageDefaultDependenciesDirectory": "lib"
}
}
4 changes: 2 additions & 2 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ bytecode_hash = "none"
fuzz = { runs = 1_000 }
gas_reports = ["*"]
libs = ["lib"]
evm_version = "shanghai"
# optimizer = true (default)
optimizer_runs = 200
fs_permissions = [{ access = "read-write", path = "./" }]
solc = "0.8.19"

auto_detect_solc = true
[profile.ci]
verbosity = 4

Expand Down
1 change: 1 addition & 0 deletions lib/solady
Submodule solady added at 513f58
1 change: 1 addition & 0 deletions remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ forge-test/=lib/prb-test/src/
forge-std/=lib/forge-std/src/
math/=lib/prb-math/src/
core/=src/
solady/=lib/solady/src
solmate/=lib/solmate/src/
openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/
openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/
Expand Down
61 changes: 61 additions & 0 deletions script/Run.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// SPDX-License-Identifier: MIT
//
// _____ _ _
// |_ _| | | (_)
// | | ___ _ __ __| | ___ _ __ _ _______
// | |/ _ \ '_ \ / _` |/ _ \ '__| |_ / _ \
// | | __/ | | | (_| | __/ | | |/ / __/
// \_/\___|_| |_|\__,_|\___|_| |_/___\___|
//
// Copyright (c) Tenderize Labs Ltd

// solhint-disable no-console

pragma solidity 0.8.20;

import { Script, console2 } from "forge-std/Script.sol";

import { MultiValidatorLST } from "core/multi-validator/MultiValidatorLST.sol";
import { MultiValidatorFactory } from "core/multi-validator/Factory.sol";
import { FlashUnstake, TenderSwap } from "core/multi-validator/FlashUnstake.sol";

import { LPT } from "core/adapters/LivepeerAdapter.sol";

import { ERC1967Proxy } from "openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol";
import { FlashUnstake } from "core/multi-validator/FlashUnstake.sol";

address constant TENDERIZER_1 = 0x4b7339E599a599DBd7829a8ECA0d233ED4F7eA09;
address constant TENDERIZER_2 = 0xFB32bF22B4F004a088c1E7d69e29492f5D7CD7E1;
address constant TENDERIZER_3 = 0x6DFd5Cee0Ed2ec24Fdc814Ad857902DE01c065d6;
address constant LIVEPEER_MINTER = 0xc20DE37170B45774e6CD3d2304017fc962f27252;

contract MultiValidatorLST_Deploy is Script {
bytes32 private constant salt = bytes32(uint256(1));

MultiValidatorFactory factory;
// MultiValidatorLST lst;

function run() public {
uint256 privKey = vm.envUint("PRIVATE_KEY");
vm.startBroadcast(privKey);
address lst = 0x312d7CD23148DA9Baac94b43f4E8557fCcFe824F;
LPT.approve(lst, type(uint256).max);
MultiValidatorLST(lst).deposit(msg.sender, 10 ether);

uint256 bal = MultiValidatorLST(lst).balanceOf(msg.sender);

MultiValidatorLST(lst).approve(0x59b86cf4d8B566602a687Bd9A2979792e73316d9, type(uint256).max);
(uint256 out, uint256 fee) = FlashUnstake(0x59b86cf4d8B566602a687Bd9A2979792e73316d9).flashUnstakeQuote(
lst, 0x686962481543d543934903C3FE8bDe8c5dB9Bd97, 1 ether
);
console2.log("Quote out: %s", out);
console2.log("fee: %s", fee);

(out, fee) = FlashUnstake(0x59b86cf4d8B566602a687Bd9A2979792e73316d9).flashUnstake(
lst, 0x686962481543d543934903C3FE8bDe8c5dB9Bd97, 1 ether, out - 1
);
console2.log("Successfully flash unstaked");
vm.stopBroadcast();
}
}
2 changes: 1 addition & 1 deletion script/XYZ_Faucet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ contract XYZ_Faucet is Script {
cooldown = cooldown != 0 ? cooldown : 1 days;
requestAmount = requestAmount != 0 ? requestAmount : 1000 ether;

address faucet = address(new TokenFaucet{salt: salt}(token, requestAmount, cooldown));
address faucet = address(new TokenFaucet{ salt: salt }(token, requestAmount, cooldown));
token.transfer(faucet, seedAmount);

console2.log("Faucet: ", faucet);
Expand Down
44 changes: 44 additions & 0 deletions script/multi-validator/MultiValidatorFactory.deploy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: MIT
//
// _____ _ _
// |_ _| | | (_)
// | | ___ _ __ __| | ___ _ __ _ _______
// | |/ _ \ '_ \ / _` |/ _ \ '__| |_ / _ \
// | | __/ | | | (_| | __/ | | |/ / __/
// \_/\___|_| |_|\__,_|\___|_| |_/___\___|
//
// Copyright (c) Tenderize Labs Ltd

// solhint-disable no-console

pragma solidity >=0.8.19;

import { MultiValidatorFactory } from "core/multi-validator/Factory.sol";

import { ERC1967Proxy } from "openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol";

import { Script, console2 } from "forge-std/Script.sol";

import { FlashUnstake } from "core/multi-validator/FlashUnstake.sol";

contract MultiValidatorFactory_Deploy is Script {
bytes32 private constant salt = bytes32(uint256(1));
MultiValidatorFactory factory;

function run() public {
uint256 privKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(privKey);
console2.log("Deploying MultiValidatorFactory...");
address factoryImpl = address(new MultiValidatorFactory());
factory = MultiValidatorFactory(address(new ERC1967Proxy{ salt: salt }(address(factoryImpl), "")));
factory.initialize();
console2.log("MultiValidatorFactory deployed at: %s", address(factory));

// deploy flash unstake wrapper
address flashUnstake = address(new FlashUnstake());
console2.log("FlashUnstake deployed at: %s", flashUnstake);

vm.stopBroadcast();
}
}
31 changes: 31 additions & 0 deletions script/multi-validator/MultiValidatorLST.deploy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: MIT
//
// _____ _ _
// |_ _| | | (_)
// | | ___ _ __ __| | ___ _ __ _ _______
// | |/ _ \ '_ \ / _` |/ _ \ '__| |_ / _ \
// | | __/ | | | (_| | __/ | | |/ / __/
// \_/\___|_| |_|\__,_|\___|_| |_/___\___|
//
// Copyright (c) Tenderize Labs Ltd

pragma solidity >=0.8.19;

import { Script, console2 } from "forge-std/Script.sol";

import { MultiValidatorLST } from "core/multi-validator/MultiValidatorLST.sol";
import { Registry } from "core/registry/Registry.sol";

contract MultiValidatorLST_Upgrade is Script {
bytes32 private constant salt = bytes32(uint256(1));

function run() public {
uint256 privateKey = vm.envUint("PRIVATE_KEY");
vm.startBroadcast(privateKey);

MultiValidatorLST lst = new MultiValidatorLST{ salt: salt }(Registry(0xa7cA8732Be369CaEaE8C230537Fc8EF82a3387EE));
console2.log("MultiValidatorLST deployed at: %s", address(lst));

vm.stopBroadcast();
}
}
84 changes: 84 additions & 0 deletions script/multi-validator/MultiValidatorLST.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// SPDX-License-Identifier: MIT
//
// _____ _ _
// |_ _| | | (_)
// | | ___ _ __ __| | ___ _ __ _ _______
// | |/ _ \ '_ \ / _` |/ _ \ '__| |_ / _ \
// | | __/ | | | (_| | __/ | | |/ / __/
// \_/\___|_| |_|\__,_|\___|_| |_/___\___|
//
// Copyright (c) Tenderize Labs Ltd

// solhint-disable no-console

pragma solidity >=0.8.19;

import { Script, console2 } from "forge-std/Script.sol";

import { MultiValidatorLST } from "core/multi-validator/MultiValidatorLST.sol";
import { MultiValidatorFactory } from "core/multi-validator/Factory.sol";
import { FlashUnstake } from "core/multi-validator/FlashUnstake.sol";

import { LPT } from "core/adapters/LivepeerAdapter.sol";

import { ERC1967Proxy } from "openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { MockERC20 } from "solmate/test/utils/mocks/MockERC20.sol";

address constant LIVEPEER_MINTER = 0xc20DE37170B45774e6CD3d2304017fc962f27252;

contract MultiValidatorLST_Deploy is Script {
bytes32 private constant salt = bytes32(uint256(1));

address[] tenderizers = [
0x4b7339E599a599DBd7829a8ECA0d233ED4F7eA09,
0xFB32bF22B4F004a088c1E7d69e29492f5D7CD7E1,
0x6DFd5Cee0Ed2ec24Fdc814Ad857902DE01c065d6,
0xbEb81a62E9A8463C22a3f999846F3E3FB2e2002A,
0x3a3D463fb8241DA6051eb4DAB2200C8b99691315,
0x109eA4859a99B3347db5025A920f63Ab0EF3de42,
0x6CBC6967A941CCa12c1316E4D567c6892C3F0Ed6,
0xFBc4435A3CebC1F4bd9c56aC95cfA37dfC142f5F,
0x43ef285F5e27D8CA978A7e577f4dDF52147EB77b,
0x47cd6B7e7308Fb062586e5185B4F3Ee7E224eefe,
0x9b6DB9Cc6E479dd28471B9C899890C20377DA200,
0xFCfeD578958D42Cd1c2ea09db09bfC1A668E0efd,
0x03572207d14bed3dd50E0d48CfaD44bDDB8BF4B7
];

MultiValidatorFactory factory;
MultiValidatorLST lst;

function run() public {
uint256 privKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(privKey);
address me = vm.addr(privKey);

console2.log("Deploying MultiValidatorFactory...");
address factoryImpl = address(new MultiValidatorFactory());
factory =
MultiValidatorFactory(address(new ERC1967Proxy{ salt: bytes32("MultiValidatorLSTFactory") }(address(factoryImpl), "")));
factory.initialize();

console2.log("MultiValidatorFactory deployed at: %s", address(factory));
console2.log("Factory owner: %s", factory.owner());

console2.log("Deploying MultiValidatorLST...");

lst = MultiValidatorLST(factory.deploy(address(LPT)));

console2.log("MultiValidatorLST deployed at: %s", address(lst));

// deploy flash unstake wrapper
address flashUnstake = address(new FlashUnstake());
console2.log("FlashUnstake deployed at: %s", flashUnstake);

lst.setFee(0.05e6); // 5% fee

for (uint256 i = 0; i < tenderizers.length; i++) {
lst.addValidator(payable(tenderizers[i]), 1_000_000 ether); // 2M Stake
}

vm.stopBroadcast();
}
}
26 changes: 26 additions & 0 deletions script/multi-validator/multi-validator-testnet.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/bin/bash
set -x
pkill -9 anvil
nohup bash -c "anvil --fork-url https://arb-mainnet.alchemyapi.io/v2/ISHp9nyZwKlfoSfS3-Hv-05CRiklcRBt --hardfork shanghai --chain-id 5000 --block-base-fee-per-gas 0 &" >/dev/null 2>&1 && sleep 5

forge build

curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","id":67,"method":"anvil_setCode","params": ["0x4e59b44847b379578588920ca78fbf26c0b4956c","0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"]}' 127.0.0.1:8545

export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

forge script script/MultiValidatorLST.s.sol:MultiValidatorLST_Deploy --rpc-url http://127.0.0.1:8545 --broadcast -vvv

LPT=0x289ba1701C2F088cf0faf8B3705246331cB8A839
MINTER=0xc20DE37170B45774e6CD3d2304017fc962f27252
AMOUNT=100000000000000000000000
ME=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
cast rpc anvil_impersonateAccount $MINTER
cast send $LPT --from $MINTER "transfer(address,uint256)(bool)" $ME $AMOUNT --unlocked

# init round
cast send 0xdd6f56DcC28D3F5f27084381fE8Df634985cc39f --from $ME "initializeRound()" --unlocked

read -r -d '' _ </dev/tty
echo "Closing Down Anvil"
pkill -9 anvil
1 change: 0 additions & 1 deletion src/factory/Factory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import { Tenderizer } from "core/tenderizer/Tenderizer.sol";
* @author Tenderize Labs Ltd
* @notice Factory for Tenderizer contracts
*/

contract Factory {
using ClonesWithImmutableArgs for address;

Expand Down
Loading
Loading