Learn Ethereum Solidity programming through test driven development (inspired by Ruby Koans)
Branch: master
Clone or download
Latest commit 61d7f6d Dec 29, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
assets/css Fix: added scss file to style github pages theme. added 50x margin to… Sep 29, 2018
contracts Finished: lvl 6 structs Sep 20, 2018
migrations Add: lvl 5.4 Sep 18, 2018
test Updated Test_numbers_2.sol Nov 23, 2018
AssertTests.sol Change: filename and scope planning of tests Sep 20, 2018
CNAME Create CNAME Sep 29, 2018
LICENSE.txt Add: gitignore, mitlicense, readme boilerplate Aug 15, 2018
README.md Fix: user onboarding instructions, del package.json for now Nov 3, 2018
_config.yml fixes type identified in issue #48 Dec 29, 2018
package-lock.json Add ganache-cli to package.json Nov 3, 2018
truffle-config.js Add: truffle framework Aug 15, 2018


This is an intermediate series for learning Solidity and smart contract development. You will explore technicalities from syntax edgecases, to assembly in the EVM, to smart contract coding conventions, all through test driven development.

“If your mind is empty, it is always ready for anything, it is open to everything. In the beginner’s mind there are many possibilities, but in the expert’s mind there are few.”

Learning Path

Standard data types

  1. Asserts
  2. Numbers
  3. Bytes
  4. Arrays
  5. Mappings
  6. Structs
  7. Storage

Function types (in progress)

  • variable modifers: public private
  • Visbility modifiers: public, private, external, etc.
  • Getter modifiers: view, pure, constant

Transactions details (in progress)

  • address & how its computed
  • data types: sender, value, gas, this
  • async return values

Javascript client (in progress)

  • events
  • error handling: require, asserts
  • free getter functions
  • constructing send / call fns

Design patterns (in progress)

  • interfaces
  • libraries, ERC libs
  • factory patterns

Security (in progress)

  • ownership
  • overflow, underflow
  • re-entry
  • tx.origin
  • delegatecall: scope
  • storage hacks

Solidity Assembly (in progress)

  • bytecode & opcodes


How to Setup

  • Clone the repo: git clone https://github.com/nczhu/solidity-koans.git
  • Install dependencies:
npm install -g truffle ganache-cli
  • Start Ganache: ganache-cli
  • In a new tab, check out the /test directory, where each test represents a koan. To get started with the easiest (and first) Koan, run: truffle test ./test/Test_assert_1.sol

How to Tackle Each Koan

  1. Each test is initially incomplete, e.g.:
function test_should_return_true() public {
   Assert.isTrue(__, "should return true");
  1. Run each level with: truffle test ./test/Test_FILENAME Tests will fail with error messages, e.g.:
2) Test_Assert_1
   Error: should return true
  1. In your editor, replace __ with the correct values or code, e.g.:
function test_should_return_true() public {
   Assert.isTrue(true, "should return true");
  1. To pass each level, make sure:
  • All tests are passing

  • All compiler warnings and errors are fixed

  • Hint: Use Remix IDE to test potential solutions


  • Member "..." not unique after argument-dependent lookup in type(library Assert). Solution: try typecasting your answer to solve compiler issues.


  1. Fork it the project
  2. Create your feature branch using issue #: git checkout -b issue#-feature
  3. Commit your changes: git commit -am 'Fix/Add/Change: commit msg'
  4. Push to the branch: git push origin issue#-feature
  5. Create a new Pull Request

See full list of outstanding issues here.

Design Decisions

  • Rewrote Assert.sol to accommodate for additional data types. Modifications are signed inline with @nczhu


MIT License