Skip to content

Commit 43f1f1b

Browse files
lightsing0xmountaintop
authored andcommitted
feat: migrate to goerli (#44)
* using geth * remove ticker * using generated token.json * fix for goerli * generate deploy info * refactor: move event to delegate and fix erc20 (#42) * fix base block
1 parent 641c50f commit 43f1f1b

10 files changed

+244
-157
lines changed

contracts/FluiDex.sol

+76-56
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,18 @@ import "@openzeppelin/contracts/access/Ownable.sol";
99
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
1010
import "hardhat/console.sol"; // for debugging
1111

12-
import "./Events.sol";
1312
import "./IFluiDex.sol";
1413
import "./IVerifier.sol";
1514

1615
/**
1716
* @title FluiDexDemo
1817
*/
19-
contract FluiDexDemo is
20-
AccessControl,
21-
Events,
22-
IFluiDex,
23-
Ownable,
24-
ReentrancyGuard
25-
{
18+
contract FluiDexDemo is AccessControl, IFluiDex, Ownable, ReentrancyGuard {
2619
using SafeERC20 for IERC20;
2720

2821
bytes32 public constant PLUGIN_ADMIN_ROLE = keccak256("PLUGIN_ADMIN_ROLE");
29-
bytes32 public constant TOKEN_ADMIN_ROLE = keccak256("TOKEN_ADMIN_ROLE");
3022
bytes32 public constant DELEGATE_ROLE = keccak256("DELEGATE_ROLE");
3123

32-
enum BlockState {
33-
Empty,
34-
Committed,
35-
Verified
36-
}
37-
38-
struct UserInfo {
39-
address ethAddr;
40-
bytes32 bjjPubkey;
41-
}
42-
4324
/// hard limit for ERC20 tokens
4425
uint16 constant TOKEN_NUM_LIMIT = 65535;
4526
/// hard limit for users
@@ -66,10 +47,8 @@ contract FluiDexDemo is
6647
GENESIS_ROOT = _genesis_root;
6748
verifier = _verifier;
6849
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
69-
_setRoleAdmin(TOKEN_ADMIN_ROLE, DEFAULT_ADMIN_ROLE);
7050
_setRoleAdmin(PLUGIN_ADMIN_ROLE, DEFAULT_ADMIN_ROLE);
7151
_setRoleAdmin(DELEGATE_ROLE, DEFAULT_ADMIN_ROLE);
72-
grantRole(TOKEN_ADMIN_ROLE, msg.sender);
7352
grantRole(PLUGIN_ADMIN_ROLE, msg.sender);
7453
grantRole(DELEGATE_ROLE, msg.sender);
7554
}
@@ -91,14 +70,13 @@ contract FluiDexDemo is
9170
* @param tokenAddr the ERC20 token address
9271
* @return the new ERC20 token tokenId
9372
*/
94-
function addToken(address origin, address tokenAddr)
73+
function addToken(address tokenAddr)
9574
external
9675
override
9776
nonReentrant
9877
onlyRole(DELEGATE_ROLE)
9978
returns (uint16)
10079
{
101-
require(hasRole(TOKEN_ADMIN_ROLE, origin));
10280
require(tokenAddrToId[tokenAddr] == 0, "token existed");
10381
tokenNum++;
10482
require(tokenNum < TOKEN_NUM_LIMIT, "token num limit reached");
@@ -107,64 +85,65 @@ contract FluiDexDemo is
10785
tokenIdToAddr[tokenId] = tokenAddr;
10886
tokenAddrToId[tokenAddr] = tokenId;
10987

110-
emit NewToken(origin, tokenAddr, tokenId);
11188
return tokenId;
11289
}
11390

11491
/**
11592
* @param to the L2 address (bjjPubkey) of the deposit target.
11693
*/
117-
function depositETH(address origin, bytes32 to)
118-
external
119-
payable
120-
override
121-
orCreateUser(origin, to)
122-
onlyRole(DELEGATE_ROLE)
123-
{
124-
emit Deposit(ETH_ID, to, msg.value);
125-
}
94+
function depositETH(bytes32 to)
95+
external
96+
payable
97+
override
98+
onlyRole(DELEGATE_ROLE)
99+
{}
126100

127101
/**
128-
* @param to the L2 address (bjjPubkey) of the deposit target.
129102
* @param amount the deposit amount.
130103
*/
131-
function depositERC20(
132-
address origin,
133-
IERC20 token,
134-
bytes32 to,
135-
uint128 amount
136-
) external override nonReentrant tokenExist(token) orCreateUser(origin, to) {
137-
uint16 tokenId = tokenAddrToId[address(token)];
104+
function depositERC20(IERC20 token, uint256 amount)
105+
external
106+
override
107+
nonReentrant
108+
tokenExist(token)
109+
onlyRole(DELEGATE_ROLE)
110+
returns (uint16 tokenId, uint256 realAmount)
111+
{
112+
tokenId = tokenAddrToId[address(token)];
138113

139114
uint256 balanceBeforeDeposit = token.balanceOf(address(this));
140-
token.safeTransferFrom(origin, address(this), amount);
115+
token.safeTransferFrom(msg.sender, address(this), amount);
141116
uint256 balanceAfterDeposit = token.balanceOf(address(this));
142-
uint256 realAmount = balanceAfterDeposit - balanceBeforeDeposit;
143-
emit Deposit(tokenId, to, realAmount);
117+
realAmount = balanceAfterDeposit - balanceBeforeDeposit;
144118
}
145119

146120
/**
147121
* @dev this won't verify the pubkey
148122
* @param ethAddr the L1 address
149123
* @param bjjPubkey the L2 address (bjjPubkey)
150124
*/
151-
function registerUser(address ethAddr, bytes32 bjjPubkey) public {
125+
function registerUser(address ethAddr, bytes32 bjjPubkey)
126+
external
127+
override
128+
onlyRole(DELEGATE_ROLE)
129+
returns (uint16 userId)
130+
{
152131
require(userBjjPubkeyToUserId[bjjPubkey] == 0, "user existed");
153132
userNum++;
154133
require(userNum < USER_NUM_LIMIT, "user num limit reached");
155134

156-
uint16 userId = userNum;
135+
userId = userNum;
157136
userIdToUserInfo[userId] = UserInfo({
158137
ethAddr: ethAddr,
159138
bjjPubkey: bjjPubkey
160139
});
161140
userBjjPubkeyToUserId[bjjPubkey] = userId;
162-
emit RegisterUser(ethAddr, userId, bjjPubkey);
163141
}
164142

165143
function getBlockStateByBlockId(uint256 _block_id)
166-
public
144+
external
167145
view
146+
override
168147
returns (BlockState)
169148
{
170149
return block_states[_block_id];
@@ -230,13 +209,54 @@ contract FluiDexDemo is
230209
}
231210

232211
/**
233-
* @dev create a user if not exist
234-
* @param bjjPubkey the L2 address (bjjPubkey)
212+
* @param tokenId tokenId
213+
* @return tokenAddr
235214
*/
236-
modifier orCreateUser(address origin, bytes32 bjjPubkey) {
237-
if (userBjjPubkeyToUserId[bjjPubkey] == 0) {
238-
registerUser(origin, bjjPubkey);
239-
}
240-
_;
215+
function getTokenAddr(uint16 tokenId)
216+
external
217+
view
218+
override
219+
returns (address)
220+
{
221+
return tokenIdToAddr[tokenId];
222+
}
223+
224+
/**
225+
* @param tokenAddr tokenAddr
226+
* @return tokenId
227+
*/
228+
function getTokenId(address tokenAddr)
229+
external
230+
view
231+
override
232+
returns (uint16)
233+
{
234+
return tokenAddrToId[tokenAddr];
235+
}
236+
237+
/**
238+
* @param userId userId
239+
* @return UserInfo
240+
*/
241+
function getUserInfo(uint16 userId)
242+
external
243+
view
244+
override
245+
returns (UserInfo memory)
246+
{
247+
return userIdToUserInfo[userId];
248+
}
249+
250+
/**
251+
* @param bjjPubkey user's pubkey
252+
* @return userId, returns 0 if not exist
253+
*/
254+
function getUserId(bytes32 bjjPubkey)
255+
external
256+
view
257+
override
258+
returns (uint16)
259+
{
260+
return userBjjPubkeyToUserId[bjjPubkey];
241261
}
242262
}

contracts/FluiDexDelegate.sol

+55-10
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,31 @@ pragma solidity ^0.8.0;
44

55
import "@openzeppelin/contracts/access/AccessControl.sol";
66
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
7+
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
8+
import "./Events.sol";
79
import "./IFluiDex.sol";
810
import "./IFluiDexDelegate.sol";
911

10-
contract FluiDexDelegate is AccessControl, IFluiDexDelegate, ReentrancyGuard {
12+
contract FluiDexDelegate is
13+
AccessControl,
14+
Events,
15+
IFluiDexDelegate,
16+
ReentrancyGuard
17+
{
18+
using SafeERC20 for IERC20;
19+
20+
bytes32 public constant TOKEN_ADMIN_ROLE = keccak256("TOKEN_ADMIN_ROLE");
21+
22+
/// use 0 representing ETH in tokenId
23+
uint16 constant ETH_ID = 0;
1124

1225
IFluiDex target;
1326
event TargetChange(IFluiDex prev, IFluiDex now);
1427

1528
constructor(IFluiDex _target) {
1629
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
30+
_setRoleAdmin(TOKEN_ADMIN_ROLE, DEFAULT_ADMIN_ROLE);
31+
grantRole(TOKEN_ADMIN_ROLE, msg.sender);
1732
target = _target;
1833
}
1934

@@ -32,21 +47,29 @@ contract FluiDexDelegate is AccessControl, IFluiDexDelegate, ReentrancyGuard {
3247
/**
3348
* @notice request to add a new ERC20 token
3449
* @param tokenAddr the ERC20 token address
35-
* @return the new ERC20 token tokenId
50+
* @return tokenId the new ERC20 token tokenId
3651
*/
37-
function addToken(address tokenAddr)
38-
external
52+
function addToken(address tokenAddr)
53+
external
3954
override
40-
returns (uint16)
55+
onlyRole(TOKEN_ADMIN_ROLE)
56+
returns (uint16 tokenId)
4157
{
42-
return target.addToken(msg.sender, tokenAddr);
58+
tokenId = target.addToken(tokenAddr);
59+
emit NewToken(msg.sender, tokenAddr, tokenId);
4360
}
4461

4562
/**
4663
* @param to the L2 address (bjjPubkey) of the deposit target.
4764
*/
48-
function depositETH(bytes32 to) external payable override {
49-
target.depositETH{value: msg.value}(msg.sender, to);
65+
function depositETH(bytes32 to)
66+
external
67+
payable
68+
override
69+
orCreateUser(msg.sender, to)
70+
{
71+
target.depositETH{value: msg.value}(to);
72+
emit Deposit(ETH_ID, to, msg.value);
5073
}
5174

5275
/**
@@ -56,9 +79,19 @@ contract FluiDexDelegate is AccessControl, IFluiDexDelegate, ReentrancyGuard {
5679
function depositERC20(
5780
IERC20 token,
5881
bytes32 to,
59-
uint128 amount
82+
uint256 amount
6083
) external override {
61-
target.depositERC20(msg.sender, token, to, amount);
84+
uint256 balanceBeforeDeposit = token.balanceOf(address(this));
85+
token.safeTransferFrom(msg.sender, address(this), amount);
86+
uint256 balanceAfterDeposit = token.balanceOf(address(this));
87+
uint256 realAmount = balanceAfterDeposit - balanceBeforeDeposit;
88+
token.safeIncreaseAllowance(address(target), realAmount);
89+
90+
(uint16 tokenId, uint256 finalAmount) = target.depositERC20(
91+
token,
92+
realAmount
93+
);
94+
emit Deposit(tokenId, to, finalAmount);
6295
}
6396

6497
/**
@@ -75,4 +108,16 @@ contract FluiDexDelegate is AccessControl, IFluiDexDelegate, ReentrancyGuard {
75108
) external override returns (bool) {
76109
return target.submitBlock(_block_id, _public_inputs, _serialized_proof);
77110
}
111+
112+
/**
113+
* @dev create a user if not exist
114+
* @param bjjPubkey the L2 address (bjjPubkey)
115+
*/
116+
modifier orCreateUser(address origin, bytes32 bjjPubkey) {
117+
if (target.getUserId(bjjPubkey) == 0) {
118+
uint16 userId = target.registerUser(origin, bjjPubkey);
119+
emit RegisterUser(msg.sender, userId, bjjPubkey);
120+
}
121+
_;
122+
}
78123
}

0 commit comments

Comments
 (0)