Skip to content

Commit eac4583

Browse files
ianhe8xmzxyz
andauthored
Goerli mumbai (#292)
* refactor to root/child contract structure * add rootsdk - fix tests * integrate with maticjs * replace ChildERC20 to a mock * Add license and compiler version * Fix test pipeline * FIx test * Fix vesting contract test * Only run unit test * Clean `PermissionedExchange` in other contracts * Skip exchange and airdropper test * Fix maintenance test * clean up fx portal stuff * fix ts * add solidity version for polygondest * fix enum order * fix test pipeline * Fix exchange test * Update doc --------- Co-authored-by: mzxyz <8177474+mzxyz@users.noreply.github.com>
1 parent ab17e00 commit eac4583

File tree

88 files changed

+2688
-2391
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+2688
-2391
lines changed

.env_template

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
ENDPOINT=http://127.0.0.1:8545
2-
SEED=test test test test test test test test test test test junk
1+
CHILD_ENDPOINT=http://127.0.0.1:8545
2+
ROOT_ENDPOINT
3+
PK=
34
ETHERSCAN_API_KEY=sjdkkdndnkdssnj
5+
POLYGONSCAN_API_KEY=

.github/workflows/pr.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ jobs:
1919
- name: lint
2020
run: yarn lint
2121
- name: test
22-
run: yarn test
22+
run: yarn test:all

README.md

+18-5
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,14 @@ To verify the contracts deployment, run the following cmd to verify specific typ
9494

9595
### test
9696

97-
`yarn test`
97+
Single Test
98+
`yarn test ./test/SQToken.test.ts`
9899

99100
Note: After contract upgrade, should run below again.
100101

101102
```
102103
yarn build
103-
yarn test
104+
yarn test:all
104105
yarn mocha test/Staking.test.ts
105106
...
106107
```
@@ -119,13 +120,15 @@ Note: After contract upgrade, should run below again.
119120

120121
Example
121122
```shell
122-
yarn upgrade --testnet PlanManager
123+
yarn upgrade --network testnet --check-only=false --target child
124+
yarn upgrade --network testnet --check-only=false --target root
123125
```
124126

125-
### Verify Contract on Polygonscan
127+
### Verify Contract on Polygonscan / etherscan
126128
```
127129
# set up ETHERSCAN_API_KEY in .env
128-
yarn hardhat publish --deployment publish/kepler.json --network kepler
130+
yarn hardhat publishChild --deployment publish/testnet.json --network testnet --networkpair testnet
131+
yarn hardhat publishRoot --deployment publish/testnet.json --network goerli --networkpair testnet
129132
```
130133

131134
### Debug Script
@@ -158,3 +161,13 @@ You can find all revert code details at `./public/revertcode.json`
158161
```
159162
https://wiki.polygon.technology/docs/pos/design/bridge/ethereum-polygon/getting-started/
160163
```
164+
165+
Deposit usually takes more than 20 min
166+
Withdraw takes moer than 40 min
167+
168+
### Withdraw token
169+
For some rpcs, eth_getRootHash is not available, in that case, we should use withdrawExitFaster
170+
171+
### TODOs
172+
to support L1&L2 token pair mode, we can not burn token in l2 (bridge layer) according to the standard-bridge doc.
173+
Instead, we either can avoid burn token but switch to taking a fee to treasury, or we need to call cross chain transfer for burn token.

contracts/ConsumerHost.sol

+12-12
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
147147
*/
148148
function collectFee(address account, uint256 amount) external onlyOwner {
149149
require(fee >= amount, 'C002');
150-
IERC20(settings.getSQToken()).safeTransfer(account, amount);
150+
IERC20(settings.getContractAddress(SQContracts.SQToken)).safeTransfer(account, amount);
151151
fee -= amount;
152152
}
153153

@@ -197,7 +197,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
197197
* @notice Approve host can use consumer balance
198198
*/
199199
function approve() external {
200-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
200+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
201201
Consumer storage consumer = consumers[msg.sender];
202202
consumer.approved = true;
203203
emit Approve(msg.sender);
@@ -207,7 +207,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
207207
* @notice Disapprove host can use consumer balance
208208
*/
209209
function disapprove() external {
210-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
210+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
211211
Consumer storage consumer = consumers[msg.sender];
212212
consumer.approved = false;
213213
emit Disapprove(msg.sender);
@@ -218,11 +218,11 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
218218
* @param amount the amount
219219
*/
220220
function deposit(uint256 amount, bool isApprove) external {
221-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
221+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
222222
// transfer the balance to contract
223-
IERC20 sqt = IERC20(settings.getSQToken());
223+
IERC20 sqt = IERC20(settings.getContractAddress(SQContracts.SQToken));
224224
sqt.safeTransferFrom(msg.sender, address(this), amount);
225-
sqt.safeIncreaseAllowance(settings.getStateChannel(), amount);
225+
sqt.safeIncreaseAllowance(settings.getContractAddress(SQContracts.StateChannel), amount);
226226

227227
Consumer storage consumer = consumers[msg.sender];
228228
consumer.balance += amount;
@@ -239,12 +239,12 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
239239
* @param amount the amount
240240
*/
241241
function withdraw(uint256 amount) external {
242-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
242+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
243243
Consumer storage consumer = consumers[msg.sender];
244244
require(consumer.balance >= amount, 'C002');
245245

246246
// transfer the balance to consumer
247-
IERC20(settings.getSQToken()).safeTransfer(msg.sender, amount);
247+
IERC20(settings.getContractAddress(SQContracts.SQToken)).safeTransfer(msg.sender, amount);
248248
consumer.balance -= amount;
249249

250250
emit Withdraw(msg.sender, amount, consumer.balance);
@@ -262,7 +262,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
262262
uint256 amount,
263263
bytes memory callback
264264
) external {
265-
require(msg.sender == settings.getStateChannel(), 'G011');
265+
require(msg.sender == settings.getContractAddress(SQContracts.StateChannel), 'G011');
266266
(address consumer, bytes memory sign) = abi.decode(callback, (address, bytes));
267267
if (channels[channelId] == address(0)) {
268268
channels[channelId] = consumer;
@@ -280,7 +280,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
280280
bytes32 payload = keccak256(abi.encode(channelId, amount, nonce));
281281
bytes32 hash = keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', payload));
282282
address sConsumer = ECDSA.recover(hash, sign);
283-
require(sConsumer == consumer || IConsumerRegistry(settings.getConsumerRegistry()).isController(consumer, sConsumer), 'C006');
283+
require(sConsumer == consumer || IConsumerRegistry(settings.getContractAddress(SQContracts.ConsumerRegistry)).isController(consumer, sConsumer), 'C006');
284284
info.nonce = nonce + 1;
285285

286286
require(sConsumer == sender, 'C010');
@@ -300,7 +300,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
300300
* @param amount the amount back to consumer
301301
*/
302302
function claimed(uint256 channelId, uint256 amount) external {
303-
require(msg.sender == settings.getStateChannel(), 'G011');
303+
require(msg.sender == settings.getContractAddress(SQContracts.StateChannel), 'G011');
304304

305305
address consumer = channels[channelId];
306306
Consumer storage info = consumers[consumer];
@@ -328,7 +328,7 @@ contract ConsumerHost is Initializable, OwnableUpgradeable, IConsumer, ERC165 {
328328
if (signerIndex[sConsumer] > 0) {
329329
return true;
330330
}
331-
return channels[channelId] == sConsumer || IConsumerRegistry(settings.getConsumerRegistry()).isController(channels[channelId], sConsumer);
331+
return channels[channelId] == sConsumer || IConsumerRegistry(settings.getContractAddress(SQContracts.ConsumerRegistry)).isController(channels[channelId], sConsumer);
332332
}
333333

334334
/**

contracts/DisputeManager.sol

+3-3
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ contract DisputeManager is IDisputeManager, Initializable, OwnableUpgradeable {
7777
) external {
7878
require(disputeIdByIndexer[_indexer].length <= 20, 'D001');
7979
require(_deposit >= minimumDeposit, 'D002');
80-
IERC20(settings.getSQToken()).safeTransferFrom(msg.sender, address(this), _deposit);
80+
IERC20(settings.getContractAddress(SQContracts.SQToken)).safeTransferFrom(msg.sender, address(this), _deposit);
8181

8282
Dispute storage dispute = disputes[nextDisputeId];
8383
dispute.disputeId = nextDisputeId;
@@ -103,7 +103,7 @@ contract DisputeManager is IDisputeManager, Initializable, OwnableUpgradeable {
103103
require(newDeposit > dispute.depositAmount, 'D005');
104104
uint256 rewardAmount = newDeposit - dispute.depositAmount;
105105
require(rewardAmount <= indexerSlashAmount, 'D005');
106-
IStakingManager(settings.getStakingManager()).slashIndexer(dispute.indexer, indexerSlashAmount);
106+
IStakingManager(settings.getContractAddress(SQContracts.StakingManager)).slashIndexer(dispute.indexer, indexerSlashAmount);
107107
} else if (state == DisputeState.Rejected) {
108108
//reject dispute, slash fisherman
109109
require(newDeposit < dispute.depositAmount, 'D005');
@@ -113,7 +113,7 @@ contract DisputeManager is IDisputeManager, Initializable, OwnableUpgradeable {
113113
}
114114

115115
dispute.state = state;
116-
IERC20(settings.getSQToken()).safeTransfer(dispute.fisherman, newDeposit);
116+
IERC20(settings.getContractAddress(SQContracts.SQToken)).safeTransfer(dispute.fisherman, newDeposit);
117117

118118
uint256[] memory ids = disputeIdByIndexer[dispute.indexer];
119119
delete disputeIdByIndexer[dispute.indexer];

contracts/IndexerRegistry.sol

+8-8
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ contract IndexerRegistry is Initializable, OwnableUpgradeable, Constants {
139139

140140
metadata[msg.sender] = _metadata;
141141
setInitialCommissionRate(msg.sender, rate);
142-
IStakingManager(settings.getStakingManager()).stake(msg.sender, amount);
142+
IStakingManager(settings.getContractAddress(SQContracts.StakingManager)).stake(msg.sender, amount);
143143

144144
emit RegisterIndexer(msg.sender, amount, _metadata);
145145
}
@@ -149,12 +149,12 @@ contract IndexerRegistry is Initializable, OwnableUpgradeable, Constants {
149149
* This function will call unstake for Indexer to make sure indexer unstaking all staked SQT Token after unregister.
150150
*/
151151
function unregisterIndexer() external onlyIndexer {
152-
require(IProjectRegistry(settings.getProjectRegistry()).numberOfDeployments(msg.sender) == 0, 'IR004');
152+
require(IProjectRegistry(settings.getContractAddress(SQContracts.ProjectRegistry)).numberOfDeployments(msg.sender) == 0, 'IR004');
153153

154154
delete metadata[msg.sender];
155155
delete controllers[msg.sender];
156156

157-
IStakingManager stakingManager = IStakingManager(settings.getStakingManager());
157+
IStakingManager stakingManager = IStakingManager(settings.getContractAddress(SQContracts.StakingManager));
158158
uint256 amount = stakingManager.getAfterDelegationAmount(msg.sender, msg.sender);
159159
stakingManager.unstake(msg.sender, amount);
160160

@@ -216,11 +216,11 @@ contract IndexerRegistry is Initializable, OwnableUpgradeable, Constants {
216216
* when indexer do registration. The commissionRate need to apply at once.
217217
*/
218218
function setInitialCommissionRate(address indexer, uint256 rate) private {
219-
IRewardsStaking rewardsStaking = IRewardsStaking(settings.getRewardsStaking());
219+
IRewardsStaking rewardsStaking = IRewardsStaking(settings.getContractAddress(SQContracts.RewardsStaking));
220220
require(rewardsStaking.getTotalStakingAmount(indexer) == 0, 'RS001');
221221
require(rate <= PER_MILL, 'IR006');
222222

223-
uint256 eraNumber = IEraManager(settings.getEraManager()).safeUpdateAndGetEra();
223+
uint256 eraNumber = IEraManager(settings.getContractAddress(SQContracts.EraManager)).safeUpdateAndGetEra();
224224
commissionRates[indexer] = CommissionRate(eraNumber, rate, rate);
225225

226226
emit SetCommissionRate(indexer, rate);
@@ -233,8 +233,8 @@ contract IndexerRegistry is Initializable, OwnableUpgradeable, Constants {
233233
function setCommissionRate(uint256 rate) external onlyIndexer {
234234
require(rate <= PER_MILL, 'IR006');
235235

236-
uint256 eraNumber = IEraManager(settings.getEraManager()).safeUpdateAndGetEra();
237-
IRewardsStaking(settings.getRewardsStaking()).onICRChange(msg.sender, eraNumber + 2);
236+
uint256 eraNumber = IEraManager(settings.getContractAddress(SQContracts.EraManager)).safeUpdateAndGetEra();
237+
IRewardsStaking(settings.getContractAddress(SQContracts.RewardsStaking)).onICRChange(msg.sender, eraNumber + 2);
238238

239239
CommissionRate storage commissionRate = commissionRates[msg.sender];
240240
if (commissionRate.era < eraNumber) {
@@ -247,7 +247,7 @@ contract IndexerRegistry is Initializable, OwnableUpgradeable, Constants {
247247
}
248248

249249
function getCommissionRate(address indexer) external view returns (uint256) {
250-
uint256 era = IEraManager(settings.getEraManager()).eraNumber();
250+
uint256 era = IEraManager(settings.getContractAddress(SQContracts.EraManager)).eraNumber();
251251
CommissionRate memory rate = commissionRates[indexer];
252252
if ((rate.era + 1) < era) {
253253
return rate.valueAfter;

contracts/PermissionedExchange.sol

+5-5
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,12 @@ contract PermissionedExchange is Initializable, OwnableUpgradeable {
228228
* @param _amount The amount to trade.
229229
*/
230230
function trade(uint256 _orderId, uint256 _amount) public {
231-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
231+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
232232
ExchangeOrder storage order = orders[_orderId];
233-
if (order.tokenGet == settings.getSQToken()) {
233+
if (order.tokenGet == settings.getContractAddress(SQContracts.SQToken)) {
234234
require(tradeQuota[order.tokenGet][msg.sender] >= _amount, 'PE005');
235235
}
236-
if (order.tokenGive == settings.getSQToken()) {
236+
if (order.tokenGive == settings.getContractAddress(SQContracts.SQToken)) {
237237
require(_amount <= tradeLimitation, 'PE012');
238238
accumulatedTrades[msg.sender] = accumulatedTrades[msg.sender] + _amount;
239239
require(accumulatedTrades[msg.sender] <= tradeLimitationPerAccount, 'PE013');
@@ -243,7 +243,7 @@ contract PermissionedExchange is Initializable, OwnableUpgradeable {
243243
require(amount > 0, 'PE007');
244244
require(amount <= order.tokenGiveBalance, 'PE008');
245245
order.tokenGiveBalance -= amount;
246-
if (order.tokenGet == settings.getSQToken()) {
246+
if (order.tokenGet == settings.getContractAddress(SQContracts.SQToken)) {
247247
tradeQuota[order.tokenGet][msg.sender] -= _amount;
248248
}
249249
if (order.pairOrderId != 0){
@@ -262,7 +262,7 @@ contract PermissionedExchange is Initializable, OwnableUpgradeable {
262262
* @param _orderId The order id to settle.
263263
*/
264264
function settleExpiredOrder(uint256 _orderId) public {
265-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
265+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
266266
ExchangeOrder memory order = orders[_orderId];
267267
require(order.expireDate != 0, 'PE009');
268268
require(order.expireDate < block.timestamp, 'PE010');

contracts/PlanManager.sol

+7-7
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ contract PlanManager is Initializable, OwnableUpgradeable, IPlanManager {
154154
* @param deploymentId project deployment Id on plan
155155
*/
156156
function createPlan(uint256 price, uint256 templateId, bytes32 deploymentId) external {
157-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
157+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
158158
require(price > 0, 'PM005');
159159
require(getPlanTemplate(templateId).active, 'PM006');
160160
require(limits[msg.sender][deploymentId] < limit, 'PM007');
@@ -171,7 +171,7 @@ contract PlanManager is Initializable, OwnableUpgradeable, IPlanManager {
171171
* @param planId Plan id to remove
172172
*/
173173
function removePlan(uint256 planId) external {
174-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
174+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
175175
require(plans[planId].indexer == msg.sender, 'PM008');
176176

177177
bytes32 deploymentId = plans[planId].deploymentId;
@@ -188,7 +188,7 @@ contract PlanManager is Initializable, OwnableUpgradeable, IPlanManager {
188188
* @param deploymentId project deployment Id
189189
*/
190190
function acceptPlan(uint256 planId, bytes32 deploymentId) external {
191-
require(!(IEraManager(settings.getEraManager()).maintenance()), 'G019');
191+
require(!(IEraManager(settings.getContractAddress(SQContracts.EraManager)).maintenance()), 'G019');
192192
Plan memory plan = plans[planId];
193193
require(plan.active, 'PM009');
194194
if (plan.deploymentId != bytes32(0)) {
@@ -201,7 +201,7 @@ contract PlanManager is Initializable, OwnableUpgradeable, IPlanManager {
201201
//stable price mode
202202
PlanTemplateV2 memory template = getPlanTemplate(plan.templateId);
203203
require(template.active, 'PM006');
204-
uint256 sqtPrice = IPriceOracle(settings.getPriceOracle()).convertPrice(template.priceToken, settings.getSQToken(), plan.price);
204+
uint256 sqtPrice = IPriceOracle(settings.getContractAddress(SQContracts.PriceOracle)).convertPrice(template.priceToken, settings.getContractAddress(SQContracts.SQToken), plan.price);
205205

206206
// create closed service agreement contract
207207
ClosedServiceAgreementInfo memory agreement = ClosedServiceAgreementInfo(
@@ -216,10 +216,10 @@ contract PlanManager is Initializable, OwnableUpgradeable, IPlanManager {
216216
);
217217

218218
// deposit SQToken into serviceAgreementRegistry contract
219-
IERC20(settings.getSQToken()).transferFrom(msg.sender, settings.getServiceAgreementRegistry(), sqtPrice);
219+
IERC20(settings.getContractAddress(SQContracts.SQToken)).transferFrom(msg.sender, settings.getContractAddress(SQContracts.ServiceAgreementRegistry), sqtPrice);
220220

221221
// register the agreement to service agreement registry contract
222-
IServiceAgreementRegistry registry = IServiceAgreementRegistry(settings.getServiceAgreementRegistry());
222+
IServiceAgreementRegistry registry = IServiceAgreementRegistry(settings.getContractAddress(SQContracts.ServiceAgreementRegistry));
223223
registry.createClosedServiceAgreement(agreement, true);
224224
}
225225

@@ -244,7 +244,7 @@ contract PlanManager is Initializable, OwnableUpgradeable, IPlanManager {
244244
return v2templates[templateId];
245245
} else {
246246
PlanTemplate memory v1template = templates[templateId];
247-
return PlanTemplateV2(v1template.period, v1template.dailyReqCap, v1template.rateLimit, settings.getSQToken(), v1template.metadata, v1template.active);
247+
return PlanTemplateV2(v1template.period, v1template.dailyReqCap, v1template.rateLimit, settings.getContractAddress(SQContracts.SQToken), v1template.metadata, v1template.active);
248248
}
249249
}
250250
}

contracts/ProjectRegistry.sol

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ contract ProjectRegistry is Initializable, OwnableUpgradeable, ERC721Upgradeable
6969
/// @dev MODIFIER
7070
/// @notice only indexer can call
7171
modifier onlyIndexer() {
72-
require(IIndexerRegistry(settings.getIndexerRegistry()).isIndexer(msg.sender), 'G002');
72+
require(IIndexerRegistry(settings.getContractAddress(SQContracts.IndexerRegistry)).isIndexer(msg.sender), 'G002');
7373
_;
7474
}
7575

@@ -226,7 +226,7 @@ contract ProjectRegistry is Initializable, OwnableUpgradeable, ERC721Upgradeable
226226

227227
require(currentStatus == ServiceStatus.READY, 'PR005');
228228
require(
229-
!IServiceAgreementExtra(settings.getServiceAgreementExtra()).hasOngoingClosedServiceAgreement(
229+
!IServiceAgreementExtra(settings.getContractAddress(SQContracts.ServiceAgreementExtra)).hasOngoingClosedServiceAgreement(
230230
msg.sender,
231231
deploymentId
232232
),

0 commit comments

Comments
 (0)