npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2024 – Pkg Stats / Ryan Hefner

snekmate

v0.1.0

Published

State-of-the-art, highly opinionated, hyper-optimised, and secure 🐍Vyper smart contract building blocks.

Downloads

9

Readme

🐍 snekmate

πŸ•΅οΈβ€β™‚οΈ Test smart contracts License: AGPL-3.0-only npm package PyPI package

State-of-the-art, highly opinionated, hyper-optimised, and secure 🐍Vyper smart contract building blocks.

[!WARNING] This is experimental software and is provided on an "as is" and "as available" basis. We do not give any warranties and will not be liable for any losses incurred through any use of this code base.

πŸ“œ Contracts

src
└── snekmate
    β”œβ”€β”€ auth
    β”‚   β”œβ”€β”€ ownable β€” "Owner-Based Access Control Functions"
    β”‚   β”œβ”€β”€ ownable_2step β€” "2-Step Ownership Transfer Functions"
    β”‚   β”œβ”€β”€ access_control β€” "Multi-Role-Based Access Control Functions"
    β”‚   β”œβ”€β”€ interfaces
    β”‚   β”‚   └── IAccessControl β€” "AccessControl Interface Definition"
    β”‚   └── mocks
    β”‚       β”œβ”€β”€ ownable_mock β€” "`ownable` Module Reference Implementation"
    β”‚       β”œβ”€β”€ ownable_2step_mock β€” "`ownable_2step` Module Reference Implementation"
    β”‚       └── access_control_mock β€” "`access_control` Module Reference Implementation"
    β”œβ”€β”€ extensions
    β”‚   β”œβ”€β”€ erc2981 β€” "ERC-721 and ERC-1155 Compatible ERC-2981 Reference Implementation"
    β”‚   β”œβ”€β”€ erc4626 β€” "Modern and Gas-Efficient ERC-4626 Tokenised Vault Implementation"
    β”‚   β”œβ”€β”€ interfaces
    β”‚   β”‚   └── IERC2981 β€” "EIP-2981 Interface Definition"
    β”‚   └── mocks
    β”‚       β”œβ”€β”€ erc2981_mock β€” "`erc2981` Module Reference Implementation"
    β”‚       └── erc4626_mock β€” "`erc4626` Module Reference Implementation"
    β”œβ”€β”€ governance
    β”‚   β”œβ”€β”€ timelock_controller β€” "Multi-Role-Based Timelock Controller Reference Implementation"
    β”‚   └── mocks
    β”‚       └── timelock_controller_mock β€” "`timelock_controller` Module Reference Implementation"
    β”œβ”€β”€ tokens
    β”‚   β”œβ”€β”€ erc20 β€” "Modern and Gas-Efficient ERC-20 + EIP-2612 Implementation"
    β”‚   β”œβ”€β”€ erc721 β€” "Modern and Gas-Efficient ERC-721 + EIP-4494 Implementation"
    β”‚   β”œβ”€β”€ erc1155 β€” "Modern and Gas-Efficient ERC-1155 Implementation"
    β”‚   β”œβ”€β”€ interfaces
    β”‚   β”‚   β”œβ”€β”€ IERC20Permit β€” "EIP-2612 Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC721Enumerable β€” "EIP-721 Optional Enumeration Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC721Metadata β€” "EIP-721 Optional Metadata Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC721Permit β€” "EIP-4494 Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC721Receiver β€” "EIP-721 Token Receiver Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC1155 β€” "EIP-1155 Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC1155MetadataURI β€” "EIP-1155 Optional Metadata Interface Definition"
    β”‚   β”‚   β”œβ”€β”€ IERC1155Receiver β€” "EIP-1155 Token Receiver Interface Definition"
    β”‚   β”‚   └── IERC4906 β€” "EIP-4906 Interface Definition"
    β”‚   └── mocks
    β”‚       β”œβ”€β”€ erc20_mock β€” "`erc20` Module Reference Implementation"
    β”‚       β”œβ”€β”€ erc721_mock β€” "`erc721` Module Reference Implementation"
    β”‚       └── erc1155_mock β€” "`erc1155` Module Reference Implementation"
    └── utils
        β”œβ”€β”€ base64 β€” "Base64 Encoding and Decoding Functions"
        β”œβ”€β”€ batch_distributor β€” "Batch Sending Both Native and ERC-20 Tokens"
        β”œβ”€β”€ create_address β€” "`CREATE` EVM Opcode Utility Function for Address Calculation"
        β”œβ”€β”€ create2_address β€” "`CREATE2` EVM Opcode Utility Functions for Address Calculations"
        β”œβ”€β”€ ecdsa β€” "Elliptic Curve Digital Signature Algorithm (ECDSA) Secp256k1-Based Functions"
        β”œβ”€β”€ p256 β€” "Elliptic Curve Digital Signature Algorithm (ECDSA) Secp256r1-Based Functions"
        β”œβ”€β”€ message_hash_utils β€” "Signature Message Hash Utility Functions"
        β”œβ”€β”€ signature_checker β€” "ECDSA and EIP-1271 Signature Verification Functions"
        β”œβ”€β”€ eip712_domain_separator β€” "EIP-712 Domain Separator"
        β”œβ”€β”€ math β€” "Standard Mathematical Utility Functions"
        β”œβ”€β”€ merkle_proof_verification β€” "Merkle Tree Proof Verification Functions"
        β”œβ”€β”€ multicall β€” "Multicall Functions"
        β”œβ”€β”€ interfaces
        β”‚   β”œβ”€β”€ IERC1271 β€” "EIP-1271 Interface Definition"
        β”‚   └── IERC5267 β€” "EIP-5267 Interface Definition"
        └── mocks
            β”œβ”€β”€ base64_mock β€” "`base64` Module Reference Implementation"
            β”œβ”€β”€ batch_distributor_mock β€” "`batch_distributor` Module Reference Implementation"
            β”œβ”€β”€ create_address_mock β€” "`create_address` Module Reference Implementation"
            β”œβ”€β”€ create2_address_mock β€” "`create2_address` Module Reference Implementation"
            β”œβ”€β”€ ecdsa_mock β€” "`ecdsa` Module Reference Implementation"
            β”œβ”€β”€ p256_mock β€” "`p256` Module Reference Implementation"
            β”œβ”€β”€ message_hash_utils_mock β€” "`message_hash_utils` Module Reference Implementation"
            β”œβ”€β”€ signature_checker_mock β€” "`signature_checker` Module Reference Implementation"
            β”œβ”€β”€ eip712_domain_separator_mock β€” "`eip712_domain_separator` Module Reference Implementation"
            β”œβ”€β”€ math_mock β€” "`math` Module Reference Implementation"
            β”œβ”€β”€ merkle_proof_verification_mock β€” "`merkle_proof_verification` Module Reference Implementation"
            └── multicall_mock β€” "`multicall` Module Reference Implementation"

πŸŽ› Installation

[!IMPORTANT]
🐍 snekmate uses a ZeroVer-based versioning scheme. This means 🐍 snekmate's major version will never exceed the first and most important number in computing: zero.

We offer three convenient ways to install the 🐍 snekmate contracts:

1️⃣ Foundry

You can install 🐍 snekmate via submodules using Foundry with:

forge install pcaversaccio/snekmate

[!NOTE] If you want to leverage 🐍 snekmate's VyperDeployer contract for your own testing, ensure that you compile the 🐍Vyper contracts with the same EVM version as configured in your foundry.toml file. The VyperDeployer contract offers two overloaded deployContract functions that allow the configuration of the target EVM version. Please note that since 🐍Vyper version 0.4.0 the default EVM version is set to cancun. Furthermore, the VyperDeployer contract relies on the Python script compile.py for successful compilation and deployment. Always use the VyperDeployer contract alongside with the aforementioned script.

2️⃣ PyPI

You can install 🐍 snekmate from PyPI with:

pip install snekmate

You can use pip install snekmate -t . to install the contracts directly into the current working directory!

3️⃣ npm

You can install 🐍 snekmate from npm with:

npm install --save-dev snekmate

Or if you are using Yarn:

yarn add --dev snekmate

In case you are using pnpm, invoke:

pnpm add --save-dev snekmate

[!CAUTION] It is possible to install the latest versions of main or any other branch locally via pip install git+https://github.com/pcaversaccio/snekmate.git@<branch> or forge install pcaversaccio/snekmate && forge update. Each branch, including the main branch, must be understood as a development branch that should be avoided in favour of tagged releases. The release process includes security measures that the repository branches do not guarantee.

πŸ”§ Usage

🐍Vyper favours code reuse through composition rather than inheritance (Solidity inheritance makes it easy to break the Liskov Substitution Principle). A 🐍Vyper module encapsulates everything required for code reuse, from type and function declarations to state. All 🐍 snekmate contracts are 🐍Vyper modules. Thus, many of the 🐍 snekmate contracts do not compile independently, but you must import and initializes them. Please note that if a module is stateless, it does not require the keyword initializes (or uses) for initialisation (or usage). Each module contract has an associated mock contract in the mock/ directory, which is part of the associated contract subdirectory. These mock contracts are very illustrative of how 🐍 snekmate contracts can be used as 🐍Vyper modules.

[!IMPORTANT] All 🐍 snekmate contracts are very well documented in the form of general code and NatSpec comments. There are no shortcuts – if you are importing specific logic, read the documentation!

Please read here to learn more about using 🐍Vyper modules.

πŸ‘©πŸΌβ€βš–οΈ Tests

This repository contains Foundry-based unit tests, property-based tests (i.e. stateless fuzzing), and invariant tests (i.e. stateful fuzzing) for all contracts, if applicable. All tests are run as part of the CI pipeline test-contracts.

[!NOTE] An invariant is a property of a program that should always hold true. Fuzzing is a way of checking whether the invariant is falsifiable.

| Contract | Unit Tests | Property-Based Tests | Invariant Tests | | :-------------------------- | :------------: | :----------------------: | :-----------------: | | ownable | βœ… | βœ… | βœ… | | ownable_2step | βœ… | βœ… | βœ… | | access_control | βœ… | βœ… | βœ… | | erc2981 | βœ… | βœ… | βœ… | | erc4626 | βœ… | βœ… | βœ… | | timelock_controller | βœ… | βœ… | βœ… | | erc20 | βœ… | βœ… | βœ… | | erc721 | βœ… | βœ… | βœ… | | erc1155 | βœ… | βœ… | βœ… | | base64 | βœ… | ❌ | ❌ | | batch_distributor | βœ… | βœ… | βœ… | | create_address | βœ… | βœ… | ❌ | | create2_address | βœ… | βœ… | ❌ | | ecdsa | βœ… | βœ… | ❌ | | p256 | βœ… | βœ… | ❌ | | message_hash_utils | βœ… | βœ… | ❌ | | signature_checker | βœ… | βœ… | ❌ | | eip712_domain_separator | βœ… | βœ… | ❌ | | math | βœ… | βœ… | ❌ | | merkle_proof_verification | βœ… | βœ… | ❌ | | multicall | βœ… | ❌ | ❌ |

βœ… Test Type Implemented   ❌ Test Type Not Implemented

Furthermore, the echidna-based property tests for the erc20 and erc721 contracts are available in the test/tokens/echidna/ directory. You can run the tests by invoking:

# Run Echidna ERC-20 property tests.
~$ FOUNDRY_PROFILE=echidna echidna test/tokens/echidna/ERC20Properties.sol --contract CryticERC20ExternalHarness --config test/echidna.yaml

# Run Echidna ERC-721 property tests.
~$ FOUNDRY_PROFILE=echidna echidna test/tokens/echidna/ERC721Properties.sol --contract CryticERC721ExternalHarness --config test/echidna.yaml

Eventually, the halmos-based symbolic tests for the erc20, erc721, erc1155, and math contracts are available in the test/tokens/halmos/ and test/utils/halmos/ directories. You can run the tests by invoking:

[!IMPORTANT] You must install the Yices 2 SMT solver before invoking the halmos-based symbolic tests.

# Run Halmos ERC-20 symbolic tests.
~$ FOUNDRY_PROFILE=halmos halmos --contract ERC20TestHalmos --config test/halmos.toml

# Run Halmos ERC-721 symbolic tests. Be careful, this is a (very!) time-consuming operation.
~$ FOUNDRY_PROFILE=halmos halmos --contract ERC721TestHalmos --config test/halmos.toml

# Run Halmos ERC-1155 symbolic tests. Be careful, this is a time-consuming operation.
~$ FOUNDRY_PROFILE=halmos halmos --contract ERC1155TestHalmos --config test/halmos.toml

# Run Halmos math symbolic tests.
~$ FOUNDRY_PROFILE=halmos halmos --contract MathTestHalmos --config test/halmos.toml

[!TIP] If you encounter any issues, please ensure that you have the latest 🐍Vyper version installed locally.

πŸ™πŸΌ Acknowledgements

This repository is inspired by or directly modified from many sources, primarily:

🫑 Contributing

🐍 snekmate only exists thanks to its contributors. There are many ways to get involved and contribute to our high-quality and secure smart contracts. Check out our Contribution Guidelines!

πŸ’Έ Donation

I am a strong advocate of the open-source and free software paradigm. However, if you feel my work deserves a donation, you can send it to this address: 0xe9Fa0c8B5d7F79DeC36D3F448B1Ac4cEdedE4e69. I can pledge that I will use this money to help fix more existing challenges in the Ethereum ecosystem 🀝.

πŸ’’ Disclaimer