unchecked-counter
v1.0.0
Published
Solidity counter type that bypasses checked arithmetic
Downloads
38
Maintainers
Readme
Unchecked Counter

Solidity counter type that bypasses checked arithmetic, designed to be used in for loops.
Background
User-defined value types (UDVTs) provide a means to create aliases for elementary Solidity types, resulting in a
zero-cost abstraction that enhances type safety and improves code readability. Solidity v0.8.19 onwards allows for the
binding of operators such as + to UDVTs, making the syntax even more concise and expressive.
Further recommended reading on this topic:
Install
forge install PaulRBerg/unchecked-counter@v1Your .gitmodules file should now contain the following entry:
[submodule "lib/unchecked-counter"]
branch = "v1"
path = "lib/unchecked-counter"
url = "https://github.com/PaulRBerg/unchecked-counter"Usage
With Casting Function
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.19;
import { UC, uc } from "unchecked-counter/UC.sol";
// Example that uses the `uc` casting function
function iterate(uint256[] memory arr) pure {
for (UC i = uc(0); i < uc(100); i = i + uc(1)) {
uint256 element = arr[i.into()]; // or `i.unwrap()`
}
}
With Constants
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.19;
import { ONE, UC, ZERO } from "unchecked-counter/UC.sol";
// Example that uses the constants `ONE` and `ZERO`
function iterate(uint256[] memory arr) pure {
uint256 counter;
for (UC i = uc(0); i < uc(100); i = i + uc(1)) {
uint256 element = arr[i.into()]; // or `i.unwrap()`
}
}Contributing
Feel free to dive in! Open an issue, start a discussion or submit a PR.
Pre Requisites
You will need the following software on your machine:
In addition, familiarity with Solidity is requisite.
Set Up
Clone this repository including submodules:
$ git clone --recurse-submodules -j8 [email protected]:PaulRBerg/unchecked-counter.gitThen, inside the project's directory, run this to install the Node.js dependencies:
$ yarn installNow you can start making changes.
License
MIT © Paul Razvan Berg
