Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduction USDC pool migrated from BOB token #79

Merged
merged 16 commits into from
Aug 3, 2023
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
7 changes: 3 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ on:

env:
FOUNDRY_PROFILE: ci
FOUNDRY_VERSION: v1.0.0
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's set version to nightly here, to keep it in one place? Or maybe it's even better to put it in the CI variables?
https://docs.github.com/en/actions/learn-github-actions/variables

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I added it to the repository variables

FORK_RPC_URL_MAINNET: ${{ secrets.FORK_RPC_URL_MAINNET }}
FORK_RPC_URL_OPTIMISM: ${{ secrets.FORK_RPC_URL_OPTIMISM }}
FORK_RPC_URL_POLYGON: ${{ secrets.FORK_RPC_URL_POLYGON }}
Expand All @@ -23,7 +22,7 @@ jobs:
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
version: nightly
id: init

- name: Run Forge fmt src
Expand Down Expand Up @@ -59,7 +58,7 @@ jobs:
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
version: nightly

- name: Run Forge build
run: |
Expand Down Expand Up @@ -87,7 +86,7 @@ jobs:
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: ${{ env.FOUNDRY_VERSION }}
version: nightly

- name: Run Forge build
run: |
Expand Down
6 changes: 4 additions & 2 deletions src/zkbob/ZkBobDirectDepositQueue.sol
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ contract ZkBobDirectDepositQueue is IZkBobDirectDeposits, IZkBobDirectDepositQue
bytes4 internal constant MESSAGE_PREFIX_DIRECT_DEPOSIT_V1 = 0x00000001;

uint256 internal immutable TOKEN_DENOMINATOR;
uint256 internal constant TOKEN_NUMERATOR = 1;

address public immutable token;
uint256 public immutable pool_id;
Expand Down Expand Up @@ -53,6 +54,7 @@ contract ZkBobDirectDepositQueue is IZkBobDirectDeposits, IZkBobDirectDepositQue

constructor(address _pool, address _token, uint256 _denominator) {
require(Address.isContract(_token), "ZkBobDirectDepositQueue: not a contract");
require(TOKEN_NUMERATOR == 1 || _denominator == 1, "ZkBobDirectDepositQueue: incorrect denominator");
pool = _pool;
token = _token;
TOKEN_DENOMINATOR = _denominator;
Expand Down Expand Up @@ -151,7 +153,7 @@ contract ZkBobDirectDepositQueue is IZkBobDirectDeposits, IZkBobDirectDepositQue

hashsum = uint256(keccak256(input)) % R;

IERC20(token).safeTransfer(msg.sender, (total + totalFee) * TOKEN_DENOMINATOR);
IERC20(token).safeTransfer(msg.sender, (total + totalFee) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR);

emit CompleteDirectDepositBatch(_indices);
}
Expand Down Expand Up @@ -245,7 +247,7 @@ contract ZkBobDirectDepositQueue is IZkBobDirectDeposits, IZkBobDirectDepositQue

uint64 fee = directDepositFee;
// small amount of wei might get lost during division, this amount will stay in the contract indefinitely
uint64 depositAmount = uint64(_amount / TOKEN_DENOMINATOR);
uint64 depositAmount = uint64(_amount / TOKEN_DENOMINATOR * TOKEN_NUMERATOR);
require(depositAmount > fee, "ZkBobDirectDepositQueue: direct deposit amount is too low");
unchecked {
depositAmount -= fee;
Expand Down
7 changes: 5 additions & 2 deletions src/zkbob/ZkBobPermit2Mixin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,16 @@ abstract contract ZkBobPermit2Mixin is ZkBobPool {

permit2.permitTransferFrom(
IPermit2.PermitTransferFrom({
permitted: IPermit2.TokenPermissions({token: token, amount: uint256(_tokenAmount) * TOKEN_DENOMINATOR}),
permitted: IPermit2.TokenPermissions({
token: token,
amount: uint256(_tokenAmount) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR
}),
nonce: _nullifier,
deadline: uint256(_memo_permit_deadline())
}),
IPermit2.SignatureTransferDetails({
to: address(this),
requestedAmount: uint256(_tokenAmount) * TOKEN_DENOMINATOR
requestedAmount: uint256(_tokenAmount) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR
}),
_user,
depositSignature
Expand Down
47 changes: 26 additions & 21 deletions src/zkbob/ZkBobPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
bytes4 internal constant MESSAGE_PREFIX_COMMON_V1 = 0x00000000;

uint256 internal immutable TOKEN_DENOMINATOR;
uint256 internal constant TOKEN_NUMERATOR = 1;

uint256 public immutable pool_id;
ITransferVerifier public immutable transfer_verifier;
Expand Down Expand Up @@ -73,6 +74,7 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
require(Address.isContract(address(_tree_verifier)), "ZkBobPool: not a contract");
require(Address.isContract(address(_batch_deposit_verifier)), "ZkBobPool: not a contract");
require(Address.isContract(_direct_deposit_queue), "ZkBobPool: not a contract");
require(TOKEN_NUMERATOR == 1 || _denominator == 1, "ZkBobPool: incorrect denominator");
pool_id = __pool_id;
token = _token;
transfer_verifier = _transfer_verifier;
Expand Down Expand Up @@ -121,13 +123,13 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
roots[0] = _root;
_setLimits(
0,
_tvlCap / TOKEN_DENOMINATOR,
_dailyDepositCap / TOKEN_DENOMINATOR,
_dailyWithdrawalCap / TOKEN_DENOMINATOR,
_dailyUserDepositCap / TOKEN_DENOMINATOR,
_depositCap / TOKEN_DENOMINATOR,
_dailyUserDirectDepositCap / TOKEN_DENOMINATOR,
_directDepositCap / TOKEN_DENOMINATOR
_tvlCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyWithdrawalCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyUserDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_depositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyUserDirectDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_directDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR
);
}

Expand All @@ -143,11 +145,10 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
}

/**
* @dev Tells the denominator for converting BOB into zkBOB units.
* 1e18 BOB units = 1e9 zkBOB units.
* @dev Tells the denominator for converting pool token into zkBOB units.
*/
function denominator() external view returns (uint256) {
return TOKEN_DENOMINATOR;
return TOKEN_NUMERATOR == 1 ? TOKEN_DENOMINATOR : (1 << 255) | TOKEN_NUMERATOR;
}

/**
Expand Down Expand Up @@ -235,19 +236,23 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
int256 token_amount = transfer_token_delta + int256(fee);
int256 energy_amount = _transfer_energy_amount();

require(token_amount % int256(TOKEN_NUMERATOR) == 0, "ZkBobPool: incorrect token amount");

if (txType == 0) {
// Deposit
require(transfer_token_delta > 0 && energy_amount == 0, "ZkBobPool: incorrect deposit amounts");
IERC20(token).safeTransferFrom(user, address(this), uint256(token_amount) * TOKEN_DENOMINATOR);
IERC20(token).safeTransferFrom(
user, address(this), uint256(token_amount) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR
);
} else if (txType == 1) {
// Transfer
require(token_amount == 0 && energy_amount == 0, "ZkBobPool: incorrect transfer amounts");
} else if (txType == 2) {
// Withdraw
require(token_amount <= 0 && energy_amount <= 0, "ZkBobPool: incorrect withdraw amounts");

uint256 native_amount = _memo_native_amount() * TOKEN_DENOMINATOR;
uint256 withdraw_amount = uint256(-token_amount) * TOKEN_DENOMINATOR;
uint256 native_amount = _memo_native_amount() * TOKEN_DENOMINATOR / TOKEN_NUMERATOR;
uint256 withdraw_amount = uint256(-token_amount) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR;

if (native_amount > 0) {
withdraw_amount -= _withdrawNative(user, native_amount);
Expand Down Expand Up @@ -343,7 +348,7 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
_operator == msg.sender || operatorManager.isOperatorFeeReceiver(_operator, msg.sender),
"ZkBobPool: not authorized"
);
uint256 fee = accumulatedFee[_operator] * TOKEN_DENOMINATOR;
uint256 fee = accumulatedFee[_operator] * TOKEN_DENOMINATOR / TOKEN_NUMERATOR;
require(fee > 0, "ZkBobPool: no fee to withdraw");
IERC20(token).safeTransfer(_to, fee);
accumulatedFee[_operator] = 0;
Expand Down Expand Up @@ -377,13 +382,13 @@ abstract contract ZkBobPool is IZkBobPool, EIP1967Admin, Ownable, Parameters, Zk
{
_setLimits(
_tier,
_tvlCap / TOKEN_DENOMINATOR,
_dailyDepositCap / TOKEN_DENOMINATOR,
_dailyWithdrawalCap / TOKEN_DENOMINATOR,
_dailyUserDepositCap / TOKEN_DENOMINATOR,
_depositCap / TOKEN_DENOMINATOR,
_dailyUserDirectDepositCap / TOKEN_DENOMINATOR,
_directDepositCap / TOKEN_DENOMINATOR
_tvlCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyWithdrawalCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyUserDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_depositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_dailyUserDirectDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR,
_directDepositCap / TOKEN_DENOMINATOR * TOKEN_NUMERATOR
);
}

Expand Down
35 changes: 35 additions & 0 deletions src/zkbob/ZkBobPoolUSDCMigrated.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

import "./ZkBobPool.sol";
import "./ZkBobTokenSellerMixin.sol";
import "./ZkBobUSDCPermitMixin.sol";

/**
* @title ZkBobPoolUSDCMigrated
* Shielded transactions pool for USDC tokens supporting USDC transfer authorizations
* It is intended to be deployed as implemenation of the pool for BOB tokens that is
* why it supports the same nomination
*/
contract ZkBobPoolUSDCMigrated is ZkBobPool, ZkBobTokenSellerMixin, ZkBobUSDCPermitMixin {
constructor(
uint256 __pool_id,
address _token,
ITransferVerifier _transfer_verifier,
ITreeVerifier _tree_verifier,
IBatchDepositVerifier _batch_deposit_verifier,
address _direct_deposit_queue
)
ZkBobPool(
__pool_id,
_token,
_transfer_verifier,
_tree_verifier,
_batch_deposit_verifier,
_direct_deposit_queue,
1, // Make sure that TOKEN_NUMERATOR is set in 1000 in ZkBobPool and ZkBobDirectDepositQueue
1_000_000_000
)
{}
}
8 changes: 7 additions & 1 deletion src/zkbob/ZkBobSaltedPermitMixin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ abstract contract ZkBobSaltedPermitMixin is ZkBobPool {
function _transferFromByPermit(address _user, uint256 _nullifier, int256 _tokenAmount) internal override {
(uint8 v, bytes32 r, bytes32 s) = _permittable_deposit_signature();
IERC20Permit(token).receiveWithSaltedPermit(
_user, uint256(_tokenAmount) * TOKEN_DENOMINATOR, _memo_permit_deadline(), bytes32(_nullifier), v, r, s
_user,
uint256(_tokenAmount) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR,
_memo_permit_deadline(),
bytes32(_nullifier),
v,
r,
s
);
}
}
2 changes: 1 addition & 1 deletion src/zkbob/ZkBobUSDCPermitMixin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ abstract contract ZkBobUSDCPermitMixin is ZkBobPool {
IUSDCPermit(token).transferWithAuthorization(
_user,
address(this),
uint256(_tokenAmount) * TOKEN_DENOMINATOR,
uint256(_tokenAmount) * TOKEN_DENOMINATOR / TOKEN_NUMERATOR,
0,
_memo_permit_deadline(),
bytes32(_nullifier),
Expand Down