Tamago🍳
Tamago is a standard smart contract suite for Verity, similar to solmate/solady for Solidity.
Tamago uses Tama, a modern toolchain for secure-by-construction Ethereum applications.
All smart contracts in Tamago are formally verified via Lean, meaning they're mathematically proven to adhere to the specs. The specs are also double-checked via Foundry mirror tests.
Tamago claims the first ever formally verified EVM implementations of sqrt(), cbrt(), log10(), log256(), as well as the full ERC4626 standard.
Components
Ownable: single-owner authorization with ownership transfer and renunciation.ERC20: fungible token with allowances, owner-controlled minting and burning, fixed 18-decimal metadata, and overflow-safe accounting.ERC721: non-fungible token with ownership, approvals, operator approvals, minting, and transfer behavior.WETH: wrapped ETH with ERC20-compatible accounting, deposits, withdrawals, approvals, and transfers.ERC4626: tokenized vault accounting with share/asset conversion previews, deposits, minting, withdrawals, redemptions, and ERC20 share behavior.FixedPointMathLib: reusable unsigned integer math helpers, including saturating arithmetic, distance, averages, roots, logs, and clamping.
Each component has a Verity implementation, a property spec, a Lean proof file, and mirror tests that connect the proved properties to generated EVM artifacts.
Install
From a Tama project, add Tamago as a package dependency:
tama install Bacon-labs/tamago
Pin a specific revision for reproducible builds:
tama install Bacon-labs/tamago@<git-revision>
Then refresh and verify the project:
tama doctor
tama check
tama build --locked
tama test
Usage
Import the source bundle from Lean:
import Tamago
Or import only the components you need:
import Tamago.Auth.Ownable
import Tamago.Tokens.ERC20
import Tamago.Tokens.ERC721
import Tamago.Tokens.WETH
import Tamago.Tokens.ERC4626
import Tamago.Utils.FixedPointMathLib
Reference a component's compilation model from your own Verity code or build configuration:
#check Tamago.Auth.Ownable.spec
#check Tamago.Tokens.ERC20.spec
#check Tamago.Tokens.ERC721.spec
#check Tamago.Tokens.WETH.spec
#check Tamago.Tokens.ERC4626.spec
#check Tamago.Utils.FixedPointMathLib.spec
Use the generated Solidity deployers from Foundry tests after tama build:
import {ERC20Deployer} from "tamago/src/generated/verity/ERC20Deployer.sol";
import {ERC20Iface} from "tamago/src/generated/verity/ERC20Iface.sol";
contract ExampleTest {
function deployToken(address owner) internal returns (ERC20Iface token) {
token = ERC20Deployer.deploy(owner);
}
}
The same pattern applies to the other generated deployers and interfaces:
Ownable, ERC721, WETH, ERC4626, and FixedPointMathLib.
Repository Layout
.
|-- verity/
| |-- src/
| | |-- Tamago.lean # Source aggregate module
| | `-- Tamago/ # Contract and library implementations
| |-- spec/
| | `-- Tamago/
| | |-- Spec.lean # Spec aggregate module
| | `-- Spec/ # Property specs
| |-- proof/
| | `-- Tamago/
| | |-- Proof.lean # Proof aggregate module
| | `-- Proof/ # Proofs for the specs
| `-- common/
| `-- Tamago/Common/ # Shared events and helper models
|-- src/generated/verity/ # Generated Solidity deployers and interfaces
`-- test/verity/ # Foundry mirror tests with tama: property links
Development
For local development on Tamago itself, clone with submodules:
git clone --recurse-submodules git@github.com:Bacon-labs/tamago.git
cd tamago
For an existing checkout:
git submodule update --init --recursive
Run the standard verification workflow:
tama doctor
tama build --locked
tama test
tama audit
The CI workflow in .github/workflows/ci.yml runs the same checks on pushes to
main and on pull requests.
License
Tamago is released under the MIT License. See LICENSE.