Skip to content

Commit

Permalink
Add new proposed functions skeleton
Browse files Browse the repository at this point in the history
admin struct & removeAdminAddress code

remove, register, add admin + onlyAdmin modifier

add relayer functions

helper function to avoid repeat of code

verifyRelayer and relayerExistsMap

updateParam changes

Remove unwanted code and variables

Remove old code

Formatting + efficient return for verify function

decouple registered and nonregistered admins, remove relayer before deleting, correct address size,

add old modifier checks before adding relayer

seed with current whitelists.todo: add relayers

Refactor: replace admin with manager

contract and exist checks inside function

remove onlyWhitelabelRelayer for the most part.

Remove register unregister from template file

isRelayer, not verifyRelayer

isContract check for manager

override in isRelayer

refactor naming

addRelayer -> editRelayer

remove most compilation errors apart from transfer

compilation error fix: payable+map

extra payables

modify templates

fix bugs in contract

feat: add foundry test (#194)

* add foundry test and clean unused files

* update readme

Remove unneeded modifier + properly remove relayer

updateRelayer event and no need for removeRelayer

For smooth transition and let old relayers exit

Only use updateRelayerEvent + Refacoring functions

Better naming of some maps

update only once

Remove repeated event

Remove onlyAllowedParty + correct var order

remove deposit + bring back old withdraw

test for adding new param which doesn't work

correct the test

testunregister

Check emit event

remove manager and ismanger, isrelayer test

removeManagerByHimself test + comments

testCurrentRelayerTransition() and update()

Remove manager struct

Refactor + remove unwanted functions

Remove check that is not needed

Refactor to less confusing name

Ensure manager isn't already registered

bug info

Test for relayer address 0 which had a bug

Remove todo which is already done now

Combine to one manager struct

Remove dues

remove unwanted code

ensure 0 address is not a relayer

remove deposit and dues code in updateParam

template file update + correct whitelist mainnet addr

check contract first

refactor

Refactor even names and regenerate interface

payable manager not required

bug fix of twice adding of same relayer + test

emit events in initialisation as well

update the template file based on recent changes

public to internal + remove unused event

Test to ensure a contract can't be a relayer

2 step relayer registration. todo: test update

Fix testAddManager

Fix the rest of the tests

Remove unused comments

check for code and proxy relayer + test

edge case where manager gets removed before accept

name change to be consistent

delete provisional relayer when relayer is deleted

Check for correct manager

update comment

dlt managerToProvisionalRelayer when dltng relayer

address pr comments

update template

remove check for contracts on relayer manager

docs: add how to generate mainnet/testnet/QA genesis file (#221)

docs: add more comments for contracts (#218)

Update BEP20Token.template (#236)

feat(BEP-171): enhance security of cross-chain (#204)

remove unused onlyWhitelabelRelayer

relayer: update template

extract helper function addNewManager in tests

relayer: fix generation scripts
  • Loading branch information
emailtovamos authored and brilliant-lx committed Apr 20, 2023
1 parent 8cfa94e commit b721396
Show file tree
Hide file tree
Showing 85 changed files with 5,832 additions and 23,556 deletions.
18 changes: 9 additions & 9 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
node_modules/
build/
.idea
pids
logs
out/
.idea/
pids/
logs/
cache/

contracts/flattened/*.sol

#Hardhat files
cache
artifacts
# foundry lib
lib/forge-std/

.env

types
typechain-types
package-lock.json
yarn.lock
3 changes: 0 additions & 3 deletions .prettierignore

This file was deleted.

16 changes: 0 additions & 16 deletions .prettierrc

This file was deleted.

9 changes: 0 additions & 9 deletions .soliumignore

This file was deleted.

9 changes: 0 additions & 9 deletions .soliumrc.json

This file was deleted.

91 changes: 57 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,88 @@ This repo hold all the genesis contracts on Binance Smart chain. More details in

## Prepare

Install dependency:
Install node.js dependency:
```shell script
npm install
```
```

Node: v12.18.3
Truffle: Truffle v5.1.31
Solc: 0.6.4+commit.1dca32f3.Darwin.appleclang
Ganache-cli: v6.10.1
Install foundry:
```shell script
curl -L https://foundry.paradigm.xyz | bash
foundryup
forge install --no-git --no-commit foundry-rs/[email protected]
```

Please make sure your dependency version is as follows:

## unit test
Node: v12.18.3

Generate contracts for testing:
```shell script
# the first account of ganache
node generate-system.js --mock true --network local
node generate-systemReward.js --mock true
node generate-validatorset.js --mock true
node generate-slash.js --mock true
node generate-crosschain.js --mock true
node generate-tokenhub.js --mock true
node generate-relayerhub.js --mock true
node generate-tendermintlightclient.js --mock true
node generate-relayerincentivizecontract.js --roundSize 30 --maximumWeight 3 --mock true
```
Truffle: v5.1.31

Start ganache:
```shell script
ganache-cli --mnemonic 'clock radar mass judge dismiss just intact mind resemble fringe diary casino' --gasLimit 100000000 -e 10000 --allowUnlimitedContractSize
Solc: 0.6.4+commit.1dca32f3

Tips: You can manage multi version of Solc and Node:
```Shell
## Install solc-select and solc
pip3 install solc-select
solc-select install 0.6.4 && solc-select use 0.6.4

## Install nvm and node
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash
nvm install 12.18.3 && nvm use 12.18.3
```

Run truffle test:
```shell script
truffle compile
truffle migrate
truffle test
## Unit test

Add follow line to .env file in project dir, replace `archive_node` with a valid bsc mainnet node url which should be in archive mode:

```text
RPC_BSC=${archive_node}
```

Run hardhat test:
You can get a free archive node endpoint from https://nodereal.io/.

Run forge test:
```shell script
npx hardhat compile
npx hardhat test
forge test
```

Flatten all system contracts:
## Flatten all system contracts

```shell script
npm run flatten
```

## how to generate genesis file.

All system contracts will be flattened and output into `${workspace}/contracts/flattened/`.

## How to generate genesis file

1. Edit `init_holders.js` file to alloc the initial BNB holder.
2. Edit `validators.js` file to alloc the initial validator set.
3. Edit `generate-validatorset.js` file to change `fromChainId` and `toChainId`,
4. Edit `generate-tokenhub.js` file to change `refundRelayReward`, `minimumRelayFee` and `maxGasForCallingBEP20`.
5. Edit `generate-tendermintlightclient.js` file to change `chainID` and `initConsensusStateBytes`.
6. run ` node generate-genesis.js` will generate genesis.json

## How to generate mainnet/testnet/QA genesis file

```shell
npm run generate-mainnet
npm run generate-testnet
npm run generate-QA
```
Check the `genesis.json` file and you can get the exact compiled bytecode for different network.

## How to update contract interface for test

```shell script
// get metadata
forge build

// generate interface
cast interface ${workspace}/out/{contract_name}.sol/${contract_name}.json -p ^0.8.10 -n ${contract_name} > ${workspace}/lib/interface/I${contract_name}.sol
```

## License

The library is licensed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0),
Expand Down
27 changes: 27 additions & 0 deletions contracts/BSCValidatorSet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,12 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
}

/*********************** External Functions **************************/

/**
* @dev Collect all fee of transactions from the current block and deposit it to the contract
*
* @param valAddr The validator address who produced the current block
*/
function deposit(address valAddr) external payable onlyCoinbase onlyInit noEmptyDeposit{
uint256 value = msg.value;
uint256 index = currentValidatorSetMap[valAddr];
Expand Down Expand Up @@ -362,6 +368,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
return CODE_OK;
}

/**
* @dev With each epoch, there will be a partial rotation between cabinets and candidates. Rotation is determined by this function
*
*/
function shuffle(address[] memory validators, uint256 epochNumber, uint startIdx, uint offset, uint limit, uint modNumber) internal pure {
for (uint i; i<limit; ++i) {
uint random = uint(keccak256(abi.encodePacked(epochNumber, startIdx+i))) % modNumber;
Expand All @@ -373,6 +383,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
}
}

/**
* @dev Get mining validators that are block producers in the current epoch, including most of the cabinets and a few of the candidates
*
*/
function getMiningValidators() public view returns(address[] memory) {
uint256 _maxNumOfWorkingCandidates = maxNumOfWorkingCandidates;
uint256 _numOfCabinets = numOfCabinets;
Expand Down Expand Up @@ -401,6 +415,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
return miningValidators;
}

/**
* @dev Get all validators, including all of the cabinets and all of the candidates
*
*/
function getValidators() public view returns(address[] memory) {
uint n = currentValidatorSet.length;
uint valid = 0;
Expand Down Expand Up @@ -514,6 +532,11 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
return true;
}


/**
* @dev Enter maintenance for current validators. refer to https://github.com/bnb-chain/BEPs/blob/master/BEP127.md
*
*/
function enterMaintenance() external initValidatorExtraSet {
// check maintain config
if (maxNumOfMaintaining == 0) {
Expand All @@ -528,6 +551,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
_enterMaintenance(msg.sender, index);
}

/**
* @dev Exit maintenance for current validators. refer to https://github.com/bnb-chain/BEPs/blob/master/BEP127.md
*
*/
function exitMaintenance() external {
uint256 index = getCurrentValidatorIndex(msg.sender);

Expand Down
27 changes: 27 additions & 0 deletions contracts/BSCValidatorSet.template
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,12 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
}

/*********************** External Functions **************************/

/**
* @dev Collect all fee of transactions from the current block and deposit it to the contract
*
* @param valAddr The validator address who produced the current block
*/
function deposit(address valAddr) external payable onlyCoinbase onlyInit noEmptyDeposit{
uint256 value = msg.value;
uint256 index = currentValidatorSetMap[valAddr];
Expand Down Expand Up @@ -362,6 +368,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
return CODE_OK;
}

/**
* @dev With each epoch, there will be a partial rotation between cabinets and candidates. Rotation is determined by this function
*
*/
function shuffle(address[] memory validators, uint256 epochNumber, uint startIdx, uint offset, uint limit, uint modNumber) internal pure {
for (uint i; i<limit; ++i) {
uint random = uint(keccak256(abi.encodePacked(epochNumber, startIdx+i))) % modNumber;
Expand All @@ -373,6 +383,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
}
}

/**
* @dev Get mining validators that are block producers in the current epoch, including most of the cabinets and a few of the candidates
*
*/
function getMiningValidators() public view returns(address[] memory) {
uint256 _maxNumOfWorkingCandidates = maxNumOfWorkingCandidates;
uint256 _numOfCabinets = numOfCabinets;
Expand Down Expand Up @@ -401,6 +415,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
return miningValidators;
}

/**
* @dev Get all validators, including all of the cabinets and all of the candidates
*
*/
function getValidators() public view returns(address[] memory) {
uint n = currentValidatorSet.length;
uint valid = 0;
Expand Down Expand Up @@ -514,6 +532,11 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
return true;
}


/**
* @dev Enter maintenance for current validators. refer to https://github.com/bnb-chain/BEPs/blob/master/BEP127.md
*
*/
function enterMaintenance() external initValidatorExtraSet {
// check maintain config
if (maxNumOfMaintaining == 0) {
Expand All @@ -528,6 +551,10 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
_enterMaintenance(msg.sender, index);
}

/**
* @dev Exit maintenance for current validators. refer to https://github.com/bnb-chain/BEPs/blob/master/BEP127.md
*
*/
function exitMaintenance() external {
uint256 index = getCurrentValidatorIndex(msg.sender);

Expand Down
Loading

0 comments on commit b721396

Please sign in to comment.