Skip to content

Commit

Permalink
Merge the devel branch into the main branch, v1.1.0-rc0
Browse files Browse the repository at this point in the history
This merge contains the following set of changes:
  - Add per-collateral limits (#52)
  - Update getAmountOut/getAmountIn estimation (#53)
  - Introduction of direct deposits (#49)
  - Support of KYCed accounts in limits management (#54)
  - Explicit storage slot to keep KycProvidersManager (#57)
  - Add verifiers for direct deposits (5bfd34d)
  • Loading branch information
akolotov authored Feb 23, 2023
2 parents 91035b1 + 5bfd34d commit 3235abc
Show file tree
Hide file tree
Showing 37 changed files with 3,322 additions and 178 deletions.
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@
path = lib/@uniswap/v3-core
url = https://github.com/Uniswap/v3-core
branch = 0.8
[submodule "lib/base58-solidity"]
path = lib/base58-solidity
url = https://github.com/storyicon/base58-solidity
branch = v1.0.2
1 change: 1 addition & 0 deletions lib/base58-solidity
Submodule base58-solidity added at c0c50a
1 change: 1 addition & 0 deletions remappings.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
@openzeppelin/contracts/=lib/@openzeppelin/contracts/contracts/
@gnosis/auction/=lib/@gnosis/auction/contracts/
@base58-solidity/=lib/base58-solidity/contracts/
4 changes: 3 additions & 1 deletion script/scripts/BobVault.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ contract DeployBobVault is Script {
yield: yield,
price: vaultCollateralPrice,
inFee: vaultCollateralInFee,
outFee: vaultCollateralOutFee
outFee: vaultCollateralOutFee,
maxBalance: type(uint128).max,
maxInvested: type(uint128).max
})
);

Expand Down
4 changes: 4 additions & 0 deletions script/scripts/Env.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ uint256 constant zkBobDailyDepositCap = 100_000 ether;
uint256 constant zkBobDailyWithdrawalCap = 100_000 ether;
uint256 constant zkBobDailyUserDepositCap = 10_000 ether;
uint256 constant zkBobDepositCap = 10_000 ether;
uint256 constant zkBobDailyUserDirectDepositCap = 0;
uint256 constant zkBobDirectDepositCap = 0;
uint256 constant zkBobDirectDepositFee = 0.1 gwei;
uint256 constant zkBobDirectDepositTimeout = 1 days;

// new zkbob impl
address constant zkBobPool = 0x72e6B59D4a90ab232e55D4BB7ed2dD17494D62fB;
Expand Down
64 changes: 50 additions & 14 deletions script/scripts/Local.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import "../../src/BobToken.sol";
import "../../src/proxy/EIP1967Proxy.sol";
import "../../src/zkbob/ZkBobPool.sol";
import "../../src/zkbob/manager/MutableOperatorManager.sol";
import "../../src/zkbob/ZkBobDirectDepositQueue.sol";

contract DeployLocal is Script {
function run() external {
Expand All @@ -25,39 +26,72 @@ contract DeployLocal is Script {

ITransferVerifier transferVerifier;
ITreeVerifier treeVerifier;
IBatchDepositVerifier batchDepositVerifier;
bytes memory code1 =
vm.getCode(string.concat("out/", zkBobVerifiers, "/TransferVerifier.sol/TransferVerifier.json"));
bytes memory code2 =
vm.getCode(string.concat("out/", zkBobVerifiers, "/TreeUpdateVerifier.sol/TreeUpdateVerifier.json"));
bytes memory code3 = vm.getCode(
string.concat("out/", zkBobVerifiers, "/DelegatedDepositVerifier.sol/DelegatedDepositVerifier.json")
);
assembly {
transferVerifier := create(0, add(code1, 0x20), mload(code1))
treeVerifier := create(0, add(code2, 0x20), mload(code2))
batchDepositVerifier := create(0, add(code3, 0x20), mload(code3))
}

EIP1967Proxy poolProxy = new EIP1967Proxy(tx.origin, mockImpl, "");
EIP1967Proxy queueProxy = new EIP1967Proxy(tx.origin, mockImpl, "");

ZkBobPool poolImpl = new ZkBobPool(
zkBobPoolId,
address(bob),
transferVerifier,
treeVerifier
treeVerifier,
batchDepositVerifier,
address(queueProxy)
);
EIP1967Proxy poolProxy = new EIP1967Proxy(tx.origin, address(poolImpl), abi.encodeWithSelector(
ZkBobPool.initialize.selector, zkBobInitialRoot,
zkBobPoolCap, zkBobDailyDepositCap, zkBobDailyWithdrawalCap, zkBobDailyUserDepositCap, zkBobDepositCap
));
{
bytes memory initData = abi.encodeWithSelector(
ZkBobPool.initialize.selector,
zkBobInitialRoot,
zkBobPoolCap,
zkBobDailyDepositCap,
zkBobDailyWithdrawalCap,
zkBobDailyUserDepositCap,
zkBobDepositCap,
zkBobDailyUserDirectDepositCap,
zkBobDirectDepositCap
);
poolProxy.upgradeToAndCall(address(poolImpl), initData);
}
ZkBobPool pool = ZkBobPool(address(poolProxy));

IOperatorManager operatorManager =
new MutableOperatorManager(zkBobRelayer, zkBobRelayerFeeReceiver, zkBobRelayerURL);
pool.setOperatorManager(operatorManager);
ZkBobDirectDepositQueue queueImpl = new ZkBobDirectDepositQueue(address(pool), address(bob));
queueProxy.upgradeTo(address(queueImpl));
ZkBobDirectDepositQueue queue = ZkBobDirectDepositQueue(address(queueProxy));

if (owner != address(0)) {
bob.transferOwnership(owner);
pool.transferOwnership(owner);
{
IOperatorManager operatorManager =
new MutableOperatorManager(zkBobRelayer, zkBobRelayerFeeReceiver, zkBobRelayerURL);
pool.setOperatorManager(operatorManager);
queue.setOperatorManager(operatorManager);
queue.setDirectDepositFee(uint64(zkBobDirectDepositFee));
queue.setDirectDepositTimeout(uint40(zkBobDirectDepositTimeout));
}

if (admin != tx.origin) {
bobProxy.setAdmin(admin);
poolProxy.setAdmin(admin);
{
if (owner != address(0)) {
bob.transferOwnership(owner);
pool.transferOwnership(owner);
queue.transferOwnership(owner);
}

if (admin != tx.origin) {
bobProxy.setAdmin(admin);
poolProxy.setAdmin(admin);
queueProxy.setAdmin(admin);
}
}

vm.stopBroadcast();
Expand All @@ -76,5 +110,7 @@ contract DeployLocal is Script {
console2.log("BobToken implementation:", address(bobImpl));
console2.log("ZkBobPool:", address(pool));
console2.log("ZkBobPool implementation:", address(poolImpl));
console2.log("ZkBobDirectDepositQueue:", address(queue));
console2.log("ZkBobDirectDepositQueue implementation:", address(queueImpl));
}
}
4 changes: 3 additions & 1 deletion script/scripts/NewZkBobPoolImpl.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ contract DeployNewZkBobPoolImpl is Script {
pool.pool_id(),
pool.token(),
pool.transfer_verifier(),
pool.tree_verifier()
pool.tree_verifier(),
pool.batch_deposit_verifier(),
address(pool.direct_deposit_queue())
);

vm.stopBroadcast();
Expand Down
55 changes: 44 additions & 11 deletions script/scripts/ZkBobPool.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import "forge-std/Script.sol";
import "./Env.s.sol";
import "../../src/proxy/EIP1967Proxy.sol";
import "../../src/zkbob/ZkBobPool.sol";
import "../../src/zkbob/ZkBobDirectDepositQueue.sol";
import "../../src/zkbob/manager/MutableOperatorManager.sol";

contract DeployZkBobPool is Script {
Expand All @@ -14,50 +15,82 @@ contract DeployZkBobPool is Script {

ITransferVerifier transferVerifier;
ITreeVerifier treeVerifier;
IBatchDepositVerifier batchDepositVerifier;
bytes memory code1 =
vm.getCode(string.concat("out/", zkBobVerifiers, "/TransferVerifier.sol/TransferVerifier.json"));
bytes memory code2 =
vm.getCode(string.concat("out/", zkBobVerifiers, "/TreeUpdateVerifier.sol/TreeUpdateVerifier.json"));
bytes memory code3 = vm.getCode(
string.concat("out/", zkBobVerifiers, "/DelegatedDepositVerifier.sol/DelegatedDepositVerifier.json")
);
assembly {
transferVerifier := create(0, add(code1, 0x20), mload(code1))
treeVerifier := create(0, add(code2, 0x20), mload(code2))
batchDepositVerifier := create(0, add(code3, 0x20), mload(code3))
}

ZkBobPool impl = new ZkBobPool(
EIP1967Proxy poolProxy = new EIP1967Proxy(tx.origin, mockImpl, "");
EIP1967Proxy queueProxy = new EIP1967Proxy(tx.origin, mockImpl, "");

ZkBobPool poolImpl = new ZkBobPool(
zkBobPoolId,
bobVanityAddr,
transferVerifier,
treeVerifier
treeVerifier,
batchDepositVerifier,
address(queueProxy)
);
EIP1967Proxy proxy = new EIP1967Proxy(tx.origin, address(impl), abi.encodeWithSelector(
ZkBobPool.initialize.selector, zkBobInitialRoot,
zkBobPoolCap, zkBobDailyDepositCap, zkBobDailyWithdrawalCap, zkBobDailyUserDepositCap, zkBobDepositCap
));
ZkBobPool pool = ZkBobPool(address(proxy));
bytes memory initData = abi.encodeWithSelector(
ZkBobPool.initialize.selector,
zkBobInitialRoot,
zkBobPoolCap,
zkBobDailyDepositCap,
zkBobDailyWithdrawalCap,
zkBobDailyUserDepositCap,
zkBobDepositCap,
zkBobDailyUserDirectDepositCap,
zkBobDirectDepositCap
);
poolProxy.upgradeToAndCall(address(poolImpl), initData);
ZkBobPool pool = ZkBobPool(address(poolProxy));

ZkBobDirectDepositQueue queueImpl = new ZkBobDirectDepositQueue(address(pool), bobVanityAddr);
queueProxy.upgradeTo(address(queueImpl));
ZkBobDirectDepositQueue queue = ZkBobDirectDepositQueue(address(queueProxy));

IOperatorManager operatorManager =
new MutableOperatorManager(zkBobRelayer, zkBobRelayerFeeReceiver, zkBobRelayerURL);
pool.setOperatorManager(operatorManager);
queue.setOperatorManager(operatorManager);

if (owner != address(0)) {
pool.transferOwnership(owner);
queue.transferOwnership(owner);
}

if (admin != tx.origin) {
proxy.setAdmin(admin);
poolProxy.setAdmin(admin);
queueProxy.setAdmin(admin);
}

vm.stopBroadcast();

require(proxy.implementation() == address(impl), "Invalid implementation address");
require(proxy.admin() == admin, "Proxy admin is not configured");
require(poolProxy.implementation() == address(poolImpl), "Invalid implementation address");
require(poolProxy.admin() == admin, "Proxy admin is not configured");
require(pool.owner() == owner, "Owner is not configured");
require(queueProxy.implementation() == address(queueImpl), "Invalid implementation address");
require(queueProxy.admin() == admin, "Proxy admin is not configured");
require(queue.owner() == owner, "Owner is not configured");
require(pool.transfer_verifier() == transferVerifier, "Transfer verifier is not configured");
require(pool.tree_verifier() == treeVerifier, "Tree verifier is not configured");
require(pool.batch_deposit_verifier() == batchDepositVerifier, "Batch deposit verifier is not configured");

console2.log("ZkBobPool:", address(pool));
console2.log("ZkBobPool implementation:", address(impl));
console2.log("ZkBobPool implementation:", address(poolImpl));
console2.log("ZkBobDirectDepositQueue:", address(queue));
console2.log("ZkBobDirectDepositQueue implementation:", address(queueImpl));
console2.log("TransferVerifier:", address(transferVerifier));
console2.log("TreeUpdateVerifier:", address(treeVerifier));
console2.log("BatchDepositVierifier:", address(batchDepositVerifier));
}
}
Loading

0 comments on commit 3235abc

Please sign in to comment.