Smart contracts for TokenBridge
Branch: master
Clone or download
akolotov Merge pull request #131 from poanetwork/develop
Merge the changes related to security updates to the master branch
Latest commit 4615162 Jan 3, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
contracts Add execution limits to NATIVE-TO-ERC20 mode Dec 21, 2018
deploy Merge pull request #117 from poanetwork/111-security-roles-2.2 Jan 3, 2019
migrations fix npm run test build Jun 12, 2018
scripts add message for deployment. Jun 12, 2018
test Add execution limits to NATIVE-TO-ERC20 mode Dec 21, 2018
.dockerignore A docker environment initialization Oct 30, 2018
.editorconfig 1. Add ERC677 support Mar 2, 2018
.gitattributes Add solidity syntax highlighting Mar 14, 2018
.gitignore update deployment script Jun 19, 2018
.node-xmlhttprequest-sync-27493 Audit feedback Apr 18, 2018
.solcover.js fix solium Apr 16, 2018
.soliumignore add travis Apr 13, 2018
.travis.yml update node.js for travis Jun 12, 2018
CODE_OF_CONDUCT.md README doc updates, added CONTRIBUTING file Sep 24, 2018
CONTRIBUTING.md README doc updates, added CONTRIBUTING file Sep 24, 2018
Dockerfile A docker environment initialization Oct 30, 2018
GAS_CONSUMPTION.md Add ERC20-to-Native gas consumption report Oct 24, 2018
LICENSE add LICENSE Apr 27, 2018
README.md Merge branch 'master' into develop Nov 6, 2018
deploy.sh added a script to simplify deployment by using Docker Nov 2, 2018
docker-compose.yml A docker environment initialization Oct 30, 2018
flatten.sh Add erc20-to-native contracts to the flattening script Oct 20, 2018
package-lock.json Add eth-gas-reporter for unit tests Oct 22, 2018
package.json Add eth-gas-reporter for unit tests Oct 22, 2018
truffle-config.js Init Feb 13, 2018
truffle.js Add eth-gas-reporter for unit tests Oct 22, 2018

README.md

Join the chat at https://gitter.im/poanetwork/poa-bridge Build Status

POA Bridge Smart Contracts

These contracts provide the core functionality for the POA bridge. They implement the logic to relay assests between two EVM-based blockchain networks. The contracts collect bridge validator's signatures to approve and facilitate relay operations.

The POA bridge smart contracts are intended to work with the bridge process implemented on NodeJS. Please refer to the bridge process documentation to configure and deploy the bridge.

Bridge Overview

The POA Bridge allows users to transfer assets between two chains in the Ethereum ecosystem. It is composed of several elements which are located in different POA Network repositories:

Bridge Elements

  1. Solidity smart contracts, contained in this repository.
  2. Token Bridge. A NodeJS oracle responsible for listening to events and sending transactions to authorize asset transfers.
  3. Bridge UI Application. A DApp interface to transfer tokens and coins between chains.
  4. Bridge Monitor. A tool for checking balances and unprocessed events in bridged networks.
  5. Bridge Deployment Playbooks. Manages configuration instructions for remote deployments.

Bridge Smart Contracts Summary

Operations

Currently, the contracts support two types of relay operations:

  • Tokenize the native coin in one blockchain network (Home) into an ERC20 token in another network (Foreign).
  • Swap a token presented by an existing ERC20 contract in a Foreign network into an ERC20 token in the Home network, where one pair of bridge contracts corresponds to one pair of ERC20 tokens.
  • to mint new native coins in Home blockchain network from a token presented by an existing ERC20 contract in a Foreign network.

Components

The POA bridge contracts consist of several components:

  • The Home Bridge smart contract. This is currently deployed in POA.Network.
  • The Foreign Bridge smart contract. This is deployed in the Ethereum Mainnet.
  • Depending on the type of relay operations the following components are also used:
    • in NATIVE-TO-ERC mode: the ERC20 token (in fact, the ERC677 extension is used) is deployed on the Foreign network;
    • in ERC-TO-ERC mode: the ERC20 token (in fact, the ERC677 extension is used) is deployed on the Home network;
    • in ERC-TO-NATIVE mode: The home network nodes must support consensus engine that allows using a smart contract for block reward calculation;
  • The Validators smart contract is deployed in both the POA.Network and the Ethereum Mainnet.

Bridge Roles and Responsibilities

Responsibilities and roles of the bridge:

  • Administrator role (representation of a multisig contract):
    • add/remove validators
    • set daily limits on both bridges
    • set maximum per transaction limit on both bridges
    • set minimum per transaction limit on both bridges
    • upgrade contracts in case of vulnerability
    • set minimum required signatures from validators in order to relay a user's transaction
  • Validator role:
    • provide 100% uptime to relay transactions
    • listen for UserRequestForSignature events on Home Bridge and sign an approval to relay assets on Foreign network
    • listen for CollectedSignatures events on Home Bridge. As soon as enough signatures are collected, transfer all collected signatures to the Foreign Bridge contract.
    • listen for UserRequestForAffirmation or Transfer (depending on the bridge mode) events on the Foreign Bridge and send approval to Home Bridge to relay assets from Foreign Network to Home
  • User role:
    • sends assets to Bridge contracts:
      • in NATIVE-TO-ERC mode: send native coins to the Home Bridge to receive ERC20 tokens from the Foreign Bridge, send ERC20 tokens to the Foreign Bridge to unlock native coins from the Home Bridge;
      • in ERC-TO-ERC mode: transfer ERC20 tokens to the Foreign Bridge to mint ERC20 tokens on the Home Network, transfer ERC20 tokens to the Home Bridge to unlock ERC20 tokens on Foreign networks;
      • in ERC-TO-NATIVE mode: send ERC20 tokens to the Foreign Bridge to receive native coins from the Home Bridge, send native coins to the Home Bridge to unlock ERC20 tokens from the Foreign Bridge.

Usage

There are two ways to deploy contracts:

  • install and use NodeJS
  • use Docker to deploy

Deployment with NodeJS

Install Dependencies

npm install

Deploy

Please the README.md in the deploy folder for instructions and .env file configuration

Test

npm test

Flatten

Fattened contracts can be used to verify the contract code in a block explorer like BlockScout or Etherscan. The following command will prepare flattened version of the contracts:

npm run flatten

The flattened contracts can be found in the flats directory.

Deployment in the Docker environment

Docker and Docker Compose can be used to deploy contracts without NodeJS installed on the system. If you are on Linux, we recommend you create a docker group and add your user to it, so that you can use the CLI without sudo.

Prepare the docker container

docker-compose up --build

Note: The container must be rebuilt every time the code in a contract or deployment script is changed.

Deploy the contracts

  1. Create the .env file in the deploy directory as described in the deployment README.md.
  2. Run deployment process:
    docker-compose run bridge-contracts deploy.sh
    or with Linux:
    ./deploy.sh

Copy flatten sources (if needed)

  1. Discover the container name:
    docker-compose images bridge-contracts
  2. In the following command, use the container name to copy the flattened contracts code to the current working directory. The contracts will be located in the flats directory.
    docker cp name-of-your-container:/contracts/flats ./

Shutdown the container

If the container is no longer needed, it can be shutdown:

docker-compose down

Gas Consumption

The GAS_CONSUMPTION file includes Min, Max, and Avg gas consumption figures for contracts associated with each bridge mode.

Testing environment

To test the bridge scripts in ERC20-to-ERC20 mode on a testnet like Sokol or Kovan, you must deploy an ERC20 token to the foreign network. This can be done by running the following command:

cd deploy
node testenv-deploy.js token

or with Docker:

./deploy.sh token

Contributing

See the CONTRIBUTING document for contribution, testing and pull request protocol.

License

License: GPL v3.0

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.