This repository contains the Solidity smart contracts and the JavaScript API wrapper for Kosmos Kredits.
All requirements are defined in package.json
.
$ npm install
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
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
If you need to fund development accounts with devchain coins:
$ npm run fund # or hardhat fund --network localhost
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.
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.
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
.
Similar to cli.js but only provides a REPL with an initialized kredits
instance.
$ hardhat console --network localhost
Script to add a new entries to the contracts using the JS wrapper
$ hardhat run scripts/add-{contributor, contribution, proposal}.js --network localhost
List contract entries
$ hardhat run scripts/list-{contributors, contributions, proposals}.js --network localhost
Run seeds defined in config/seeds.js
.
$ npm run seeds
All contract addresses are stored in lib/addresses.json
$ cat lib/addresses.json
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
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