Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
ethereum-waffle
Advanced tools
The most advanced framework for testing smart contracts.
Sweeter, simpler and faster.
expect(...).to.be.revertedWith('Error message')
expect(...).to.emit(contract, 'EventName').withArgs(...)
)import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
const {token} = await loadFixture(standardTokenWithBalance);
const mockToken = await deployMockContract(wallet, IERC20.abi);
Documentation is available here.
To get started install ethereum-waffle
with yarn:
yarn add --dev ethereum-waffle
Or if you prefer using npm:
npm install --save-dev ethereum-waffle
To add an external library install it using npm:
npm install @openzeppelin/contracts -D
or with yarn:
yarn add @openzeppelin/contracts -D
Find this example in examples/basic
and use it.
Below is an example contract written in Solidity. Place it in contracts/BasicToken.sol
file of your project:
pragma solidity ^0.6.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
// Example class - a mock class using delivering from ERC20
contract BasicToken is ERC20 {
constructor(uint256 initialBalance) ERC20("Basic", "BSC") public {
_mint(msg.sender, initialBalance);
}
}
Below is an example test written for the contract above compiled with Waffle. Place it under test/BasicToken.test.ts
file in your project directory:
import {expect, use} from 'chai';
import {Contract} from 'ethers';
import {deployContract, MockProvider, solidity} from 'ethereum-waffle';
import BasicToken from '../build/BasicToken.json';
use(solidity);
describe('BasicToken', () => {
const [wallet, walletTo] = new MockProvider().getWallets();
let token: Contract;
beforeEach(async () => {
token = await deployContract(wallet, BasicToken, [1000]);
});
it('Assigns initial balance', async () => {
expect(await token.balanceOf(wallet.address)).to.equal(1000);
});
it('Transfer adds amount to destination account', async () => {
await token.transfer(walletTo.address, 7);
expect(await token.balanceOf(walletTo.address)).to.equal(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;
});
it('Calls totalSupply on BasicToken contract', async () => {
await token.totalSupply();
expect('totalSupply').to.be.calledOnContract(token);
});
it('Calls balanceOf with sender address on BasicToken contract', async () => {
await token.balanceOf(wallet.address);
expect('balanceOf').to.be.calledOnContractWith(token, [wallet.address]);
});
});
Note: You will also need to install the following dependencies to run the example above:
yarn add mocha -D
yarn add chai -D
Or with npm:
npm i chai -D
npm i mocha -D
To compile your smart contracts run:
npx waffle
To compile using a custom configuration file run:
npx waffle config.json
Example configuration file looks like this (all fields optional):
{
"sourceDirectory": "./custom_contracts",
"outputDirectory": "./custom_build",
"nodeModulesDirectory": "./custom_node_modules"
}
To enable generation of typechain artifacts:
{
"typechainEnabled": true
}
To flat your smart contracts run:
npx waffle flatten
In configuration file you can add optional field with path to flatten files:
{
"flattenOutputDirectory": "./custom_flatten"
}
To run the tests run the following command:
npx mocha
For convenience, you can add the following to your package.json
:
{
...,
"scripts": {
"test": "waffle && mocha"
}
}
Now you can build and test your contracts with one command:
npm test
For detailed feature walkthrough checkout documentation.
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.
Note: To make end-to-end test pass, you need to:
docker pull ethereum/solc:stable
To run tests type:
yarn test
To run linter type:
yarn lint
Install Sphinx to build documentation:
cd docs
make html
Before building documentation for the first time you may have to install required python packages:
pip3 install -r docs/requirements.txt
See https://github.com/EthWorks/Waffle/issues/155
Waffle is released under the MIT License.
FAQs
Sweeter, faster and simpler than truffle.
The npm package ethereum-waffle receives a total of 43,604 weekly downloads. As such, ethereum-waffle popularity was classified as popular.
We found that ethereum-waffle demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.