Skip to content

Commit

Permalink
Modify migration script
Browse files Browse the repository at this point in the history
  • Loading branch information
AllFi committed Jun 5, 2024
1 parent 5ec30b8 commit 22644a7
Showing 1 changed file with 15 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ address constant zkBobPool = 0x1CA8C2B9B20E18e86d5b9a72370fC6c91814c97C;
/**
* @dev This address will become an owner of the new ZkBobAccounting and AllowListOperatorManager contracts.
*/
address constant owner = 0x14fc6a1a996A2EB889cF86e5c8cD17323bC85290;
address constant operatorManagerOwner = 0x14fc6a1a996A2EB889cF86e5c8cD17323bC85290;

/**
* @dev This value should be sufficient for dedicated prover to update the tree
Expand All @@ -36,12 +36,12 @@ uint64 constant minTreeUpdateFee = 0.1 gwei;
bool constant allowListEnabled = true;
// TODO: Update this addresses before deployment
address constant zkBobProxy1 = 0x7D2D146a7AD3F0Dc398AA718a9bFCa2Bc873a5FD;
address constant zkBobProxy2 = 0xFec49782FE8e11De9Fb3Ba645a76FE914FFfe3cb;
address constant zkBobProxyFeeReceiver1 = 0x7D2D146a7AD3F0Dc398AA718a9bFCa2Bc873a5FD;
address constant zkBobProxy2 = 0xFec49782FE8e11De9Fb3Ba645a76FE914FFfe3cb;
address constant zkBobProxyFeeReceiver2 = 0xFec49782FE8e11De9Fb3Ba645a76FE914FFfe3cb;
address constant zkBobProver1 = 0x33a0b018340d6424870cfC686a4d02e1df792254;
address constant zkBobProver2 = 0x63A88E69fa7adEf036fc6ED94394CC9295de2f99;
address constant zkBobProverFeeReceiver1 = 0x33a0b018340d6424870cfC686a4d02e1df792254;
address constant zkBobProver2 = 0x63A88E69fa7adEf036fc6ED94394CC9295de2f99;
address constant zkBobProverFeeReceiver2 = 0x63A88E69fa7adEf036fc6ED94394CC9295de2f99;

// Only for checks:
Expand All @@ -50,84 +50,51 @@ address constant relayer = 0xb9CD01c0b417b4e9095f620aE2f849A84a9B1690;
contract UpgradeTest is Test {
struct PoolSnapshot {
address owner;
bytes32 slot0;
bytes32 slot1;
uint256 poolIndex;
uint256 oneNullifier;
uint256 lastRoot;
bytes32 all_messages_hash;
uint256 relayerFee;
address tokenSeller;
address kycManager;
address accounting;
}

function makeSnapshot(ZkBobPoolUSDC _pool) internal view returns (PoolSnapshot memory) {
return PoolSnapshot({
owner: _pool.owner(),
slot0: vm.load(address(_pool), bytes32(uint256(1))),
slot1: vm.load(address(_pool), bytes32(uint256(2))),
poolIndex: _pool.pool_index(),
oneNullifier: _pool.nullifiers(0x39a833a5c374a0a3328f65ae9a9bf883945694cca613a8415c3a555bda388cd),
lastRoot: _pool.roots(_pool.pool_index()),
all_messages_hash: _pool.all_messages_hash(),
relayerFee: _pool.accumulatedFee(relayer),
tokenSeller: address(_pool.tokenSeller()),
kycManager: address(ZkBobAccounting(address(_pool)).kycProvidersManager())
accounting: address(_pool.accounting())
});
}

function postCheck(ZkBobPoolUSDC _pool, PoolSnapshot memory _snapshot) internal {
assertEq(_snapshot.owner, _pool.owner());
assertEq(address(_pool.redeemer()), address(0)); // redeemer is not set by script
assertNotEq(address(_pool.accounting()), address(0));
assertEq(_snapshot.poolIndex, uint256(_pool.pool_index()));
assertEq(
_snapshot.oneNullifier, _pool.nullifiers(0x39a833a5c374a0a3328f65ae9a9bf883945694cca613a8415c3a555bda388cd)
);
assertEq(_snapshot.lastRoot, _pool.roots(_pool.pool_index()));
assertEq(_snapshot.all_messages_hash, _pool.all_messages_hash());
assertEq(_snapshot.relayerFee, _pool.accumulatedFee(relayer));
assertEq(_snapshot.tokenSeller, address(_pool.tokenSeller()));
assertEq(_snapshot.accounting, address(_pool.accounting()));
assertEq(gracePeriod, _pool.gracePeriod());
assertEq(minTreeUpdateFee, _pool.minTreeUpdateFee());
assertEq(_snapshot.tokenSeller, address(_pool.tokenSeller()));
assertEq(_snapshot.kycManager, address(ZkBobAccounting(address(_pool.accounting())).kycProvidersManager()));

checkSlot0(uint256(_snapshot.slot0), ZkBobAccounting(address(_pool.accounting())));
checkSlot1(uint256(_snapshot.slot1), ZkBobAccounting(address(_pool.accounting())));

vm.expectRevert("ZkBobPool: queue is empty");
_pool.pendingCommitment();
}

function checkSlot0(uint256 slot0, ZkBobAccounting accounting) internal {
(
uint56 maxWeeklyAvgTvl,
uint32 maxWeeklyTxCount,
uint24 tailSlot,
uint24 headSlot,
uint88 cumTvl,
uint32 txCount
) = accounting.slot0();
uint24 curSlot = uint24(block.timestamp / 1 hours);

assertEq(uint56(slot0), maxWeeklyAvgTvl);
assertEq(uint32(slot0 >> 56), maxWeeklyTxCount);
assertEq(curSlot, tailSlot);
assertEq(curSlot, headSlot);
assertEq(uint88(slot0 >> (56 + 32 + 24 + 24)), cumTvl);
assertEq(uint32(slot0 >> (56 + 32 + 24 + 24 + 88)), txCount);
}

function checkSlot1(uint256 slot1, ZkBobAccounting accounting) internal {
(uint72 tvl) = accounting.slot1();
assertEq(uint72(slot1), tvl);
}
}

/**
* @dev Don't forget to set ZkBobPool.TOKEN_NUMERATOR to 1000 for USDC pools.
*/
contract DecentralizationUpgrade is Script, UpgradeTest {
contract MigrateDecentralization is Script, UpgradeTest {
function run() external {
ZkBobPoolUSDC pool = ZkBobPoolUSDC(address(zkBobPool));
PoolSnapshot memory snapshot = makeSnapshot(pool);
Expand All @@ -147,61 +114,22 @@ contract DecentralizationUpgrade is Script, UpgradeTest {
// 2. Upgrade proxy to new implementation
EIP1967Proxy(payable(address(pool))).upgradeTo(address(newImpl));

migrateAccounting(address(pool), address(snapshot.kycManager));
migrateDecentralization(address(pool), address(snapshot.tokenSeller));

vm.stopBroadcast();

postCheck(ZkBobPoolUSDC(address(pool)), snapshot);
}

// TODO: Check limits
function migrateAccounting(address _pool, address _kycManager) internal {
// 3. Deploy new ZkBobAccounting implementation
ZkBobAccounting accounting = new ZkBobAccounting(address(_pool), 1_000_000_000);

bytes memory dump = ZkBobPool(_pool).extsload(bytes32(uint256(1)), 2);
uint32 txCount = uint32(_load(dump, 0, 4));
uint88 cumTvl = uint88(_load(dump, 4, 11));
uint32 maxWeeklyTxCount = uint32(_load(dump, 21, 4));
uint56 maxWeeklyAvgTvl = uint56(_load(dump, 25, 7));
uint72 tvl = uint72(_load(dump, 55, 9));

// 4. Initialize pool index
ZkBobPool(_pool).initializePoolIndex(txCount * 128);
// 5. Set accounting
ZkBobPool(_pool).setAccounting(IZkBobAccounting(accounting));

// 6. Initialize accounting
ZkBobAccounting(accounting).initialize(txCount, tvl, cumTvl, maxWeeklyTxCount, maxWeeklyAvgTvl);
// 7. Set kyc providers manager
ZkBobAccounting(accounting).setKycProvidersManager(IKycProvidersManager(_kycManager));
// 8. Set limits for tier 0
ZkBobAccounting(accounting).setLimits(
0, 2_000_000 gwei, 300_000 gwei, 300_000 gwei, 10_000 gwei, 10_000 gwei, 10_000 gwei, 1_000 gwei
);
// 9. Set limits for tier 1
ZkBobAccounting(accounting).setLimits(
1, 2_000_000 gwei, 300_000 gwei, 300_000 gwei, 100_000 gwei, 100_000 gwei, 10_000 gwei, 1_000 gwei
);
// 10. Set limits for tier 254
ZkBobAccounting(accounting).setLimits(
254, 2_000_000 gwei, 300_000 gwei, 300_000 gwei, 20_000 gwei, 20_000 gwei, 10_000 gwei, 1_000 gwei
);

// 11. Transfer accounting accounting ownership to the owner
accounting.transferOwnership(owner);
}

function migrateDecentralization(address _pool, address _tokenSeller) internal {
// 12. Set grace period
// 3. Set grace period
ZkBobPool(_pool).setGracePeriod(gracePeriod);
// 13. Set min tree update fee
// 4. Set min tree update fee
ZkBobPool(_pool).setMinTreeUpdateFee(minTreeUpdateFee);
// 14. Set token seller
// 5. Set token seller
ZkBobPoolUSDC(_pool).setTokenSeller(_tokenSeller);

// 15. Deploy AllowListOperatorManager
// 6. Deploy AllowListOperatorManager
address[] memory operators = new address[](4);
operators[0] = zkBobProxy1;
operators[1] = zkBobProver1;
Expand All @@ -217,16 +145,10 @@ contract DecentralizationUpgrade is Script, UpgradeTest {
AllowListOperatorManager operatorManager =
new AllowListOperatorManager(operators, feeReceivers, allowListEnabled);

// 16. Set operator manager
// 7. Set operator manager
ZkBobPool(_pool).setOperatorManager(operatorManager);

// 17. Transfer operator manager ownership to the owner
operatorManager.transferOwnership(owner);
}

function _load(bytes memory _dump, uint256 _from, uint256 _len) internal pure returns (uint256 res) {
assembly {
res := shr(sub(256, shl(3, _len)), mload(add(_dump, add(32, _from))))
}
// 8. Transfer operator manager ownership to the owner
operatorManager.transferOwnership(operatorManagerOwner);
}
}

0 comments on commit 22644a7

Please sign in to comment.