Kredits Contracts
This repository contains the Solidity smart contracts and the JavaScript API
wrapper for Kosmos Kredits.
Development
Installation
App dependencies
All requirements are defined in package.json
.
$ npm install
Local development chain
We use hardhat as development environment for the
smart contracts.
To run a local development chain run:
$ npm run devchain # or: hardhat node --network hardhat
Bootstrap
-
Run an EVM node and ipfs
$ npm run devchain
$ ipfs daemon
-
Compile contracts and build ABIs
(compiled artifacts will be in `/artifacts`)
$ npm run build
-
Deploy new upgradable contract proxies
$ npm run deploy:dao
-
Execute seeds to create demo contributors, contributions, etc. (optional)
$ npm run seeds
Step 2-4 is also summarized in npm run bootstrap
-
Show contract addresses
$ cat lib/addresses.json
Fund a local development account
If you need to fund development accounts with devchain coins:
$ npm run fund # or hardhat fund --network localhost
Specs / Testing
With a local development chain running:
$ hardhat test
If you add or change contract code, please make sure to add and/or adapt tests
accordingly. Don't worry, it's easy! You can use existing tests as a template
for new ones.
Contract architecture
We use the OpenZeppelin hardhat
proxy for
deploying and managing upgradeable contracts. (see scripts/create-proxy.js
)
Each contract is independent and is connected to its dependencies by storing
the addresses of the other contracts.
Helper scripts
scripts/
contains some helper scripts to interact with the contracts from the
CLI. At some point these should be moved into a real nice CLI.
To run these scripts use hardhat run
. For example: hardhat run scripts/list-contributors.js --network localhost
. (NOTE: add --network localhost
or the network you want to use)
Some scripts are also defined as npm script, see package.json
.
repl/console
Similar to cli.js but only provides a REPL with an initialized kredits
instance.
$ hardhat console --network localhost
add-{contributor, contribution, proposal}.js
Script to add a new entries to the contracts using the JS wrapper
$ hardhat run scripts/add-{contributor, contribution, proposal}.js --network localhost
list-{contributors, contributions, proposals}.js
List contract entries
$ hardhat run scripts/list-{contributors, contributions, proposals}.js --network localhost
seeds.js
Run seeds defined in config/seeds.js
.
$ npm run seeds
Get the contract addresses
All contract addresses are stored in lib/addresses.json
$ cat lib/addresses.json
Upgradeable contracts
We use OpenZeppelin for an upgradeable contracts:
https://www.npmjs.com/package/@openzeppelin/hardhat-upgrades
Refer to the OpenZeppelin README and scripts/create-proxy.js
OpenZeppelin Step by Step guide
For an upgrade example checkout scripts/upgrade-example.js
Deployment to other networks
Deployable networks are configured in the hardhat.config.js
.
To deploy to those networks provide the --network
argument to the hardhat
commands, e.g. --network rsk
.
Please note that some npm scripts combine multiple hardhat commands. In those
cases the hardhat commands needs to be run manually with the --network
argument. (=> don't use npm run bootstrap
)
Set a DEPLOY_KEY
environment variable with the private key (HEX) which will
be used as a root/deploy account
Typical deployment flow:
$ npm run build
$ hardhat run scripts/create-proxy.js --network rsk
# OR with deploy key:
$ DEPLOY_KEY=0xsomething hardhat run scripts/create-proxy.js --network rsk
$ # commit the new addresses in the addresses.json file if needed
To run the console on one of the non localhost networks you can also just pass
on the --network argument.
$ hardhat console --network rsk