Library for writing and testing smart contracts.
Sweeter, simpler, faster than Truffle.
Philosophy
- Simpler: Minimalistic, few dependencies.
- Sweeter: Nice syntax, easy to extend.
- Faster: Strong focus on the speed of tests execution.
Features:
- Sweet set of chai matchers, e.g.:
expect(...).to.be.revertedWith('Error message')
expect(...).to.emitEvent(contract, 'EventName).withArgs(...)
)
- Importing contracts from npm modules working out of the box, e.g.:
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
- Fixtures that help write fast and maintainable test suites, e.g.:
const {token} = await loadFixture(standardTokenWithBalance);
- Sub-second compilation with native and dockerized solc
- Support for TypeScript
- Documentation
Documentation
Documentation available here.
Installation:
To start using with npm, type:
npm i ethereum-waffle
or with Yarn:
yarn add ethereum-waffle
Step by step guide
Add external dependency:
To add external library add npm to your project:
npm i open-zeppelin
Example contract
Below is example contract written in Solidity. Place it in contracts
directory of your project:
pragma solidity ^0.5.1;
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
// Example class - a mock class using delivering from ERC20
contract BasicTokenMock is ERC20 {
constructor(address initialAccount, uint256 initialBalance) public {
super._mint(initialAccount, initialBalance);
}
}
Example test
Belows is example test written for the contract above written with Waffle. Place it in test
directory of your project:
import chai from 'chai';
import {createMockProvider, deployContract, getWallets, solidity} from 'ethereum-waffle';
import BasicTokenMock from './build/BasicTokenMock';
import MyLibrary from './build/MyLibrary';
import LibraryConsumer from './build/LibraryConsumer';
chai.use(solidity);
const {expect} = chai;
describe('INTEGRATION: Example', () => {
let provider = createMockProvider();
let [wallet, walletTo] = getWallets(provider);
let token;
beforeEach(async () => {
token = await deployContract(wallet, BasicTokenMock, [wallet.address, 1000]);
});
it('Assigns initial balance', async () => {
expect(await token.balanceOf(wallet.address)).to.eq(1000);
});
it('Transfer adds amount to destination account', async () => {
await token.transfer(walletTo.address, 7);
expect(await token.balanceOf(walletTo.address)).to.eq(7);
});
it('Transfer emits event', async () => {
await expect(token.transfer(walletTo.address, 7))
.to.emit(token, 'Transfer')
.withArgs(wallet.address, walletTo.address, 7);
});
it('Can not transfer above the amount', async () => {
await expect(token.transfer(walletTo.address, 1007)).to.be.reverted;
});
it('Can not transfer from empty account', async () => {
const tokenFromOtherWallet = token.connect(walletTo);
await expect(tokenFromOtherWallet.transfer(wallet.address, 1))
.to.be.reverted;
});
});
Compile
To compile contracts type:
npx waffle
To compile using a custom configuration file:
npx waffle config.json
Example configuration file looks like this:
{
"sourcesPath": "./custom_contracts",
"targetPath": "./custom_build",
"npmPath": "./custom_node_modules"
}
Run tests
To run test type in the console:
mocha
Adding a task
For convince, you can add a task to your package.json
. In the sections scripts
, add the following line:
"test": "waffle && test"
Now you can build and test your contracts with one command:
npm test
Documentation
For detailed feature walkthrough checkout documentation.
Contributing
Contributions are always welcome, no matter how large or small. Before contributing, please read the code of conduct and contribution policy.
Before you issue pull request:
Make sure all tests and linters pass. Make sure you have test coverage for any new features.
Running tests
Note: To make end-to-end test pass, you need to:
- have Docker installed, up and running
- have native solidity 0.5.* installed
To run tests type:
yarn test
To run linter type:
yarn lint
Roadmap
Waffle 2.0 (currently in beta)
- New matcher: changeBalance (see #9)
- Faster compilation with native and dockerized solc (aside from solcjs)
- Documentation
- TypeScript rewrite
Waffle 2.1
- Faster testing with native geth (aside from ganache)
- New matcher: changeBalance for ERC20 tokens
Waffle 2.2
- Debugging and profiling
License
Universal Login SDK is released under the MIT License.