Author: Varun Chauhan
Version: 2.0.0
License: MIT
An advanced, gas-efficient, and highly secure smart contract system for distributing ERC20 tokens via Merkle tree-based airdrops with EIP712 signature verification. This implementation combines the scalability of Merkle trees with the security of cryptographic signatures, allowing for secure token distribution to thousands of recipients while minimizing on-chain storage costs.
- EIP712 Signature Verification: Requires cryptographic signatures from account owners
- Dual Verification System: Both Merkle proof AND signature validation
- Reentrancy Protection: Implements CEI (Checks-Effects-Interactions) pattern
- Double-claim Prevention: Prevents users from claiming multiple times
- Comprehensive Input Validation: Robust error handling and edge case coverage
- Merkle Tree Efficiency: Verify eligibility without storing all recipient data on-chain
- Immutable Variables: Gas-optimized storage for unchanging data
- Optimized Signature Verification: Efficient ECDSA recovery implementation
- Safe Token Transfers: Uses OpenZeppelin's SafeERC20
- Comprehensive Test Suite: 46+ tests with 100% coverage
- Extensive Documentation: Full NatSpec comments and usage examples
- Fuzz Testing: Robustness validation with random inputs
- CI/CD Ready: Fast test execution and detailed reporting
- Battle-tested: Built using OpenZeppelin's secure contract libraries
- Unlimited Recipients: Can handle airdrops to any number of recipients
- Cross-chain Compatible: Works on any EVM-compatible blockchain
- Flexible Token Support: Compatible with any ERC20 token
The core airdrop contract implementing advanced security features with EIP712 signature verification.
Advanced Features:
- EIP712 Typed Data Signatures: Structured data signing for enhanced security
- Merkle Proof Verification: Gas-efficient eligibility verification using cryptographic proofs
- Double Hashing Security: Prevents second preimage attacks on leaf nodes
- Signature Recovery: ECDSA signature validation with malformed signature handling
- State Management: Comprehensive claim tracking and reentrancy protection
- Event Logging: Detailed event emission for successful claims and state changes
Security Mechanisms:
- Dual verification (Merkle proof + signature)
- CEI pattern implementation
- Immutable critical parameters (merkle root, token address)
- Safe external calls using OpenZeppelin's SafeERC20
A production-ready ERC20 token with advanced minting capabilities for airdrop testing and deployment.
Enhanced Features:
- Standard ERC20 Implementation: Full compliance with ERC20 specification
- Owner-Controlled Minting: Secure token creation restricted to contract owner
- Ownership Management: Transferable ownership with proper access controls
- Gas Optimized: Efficient implementation using OpenZeppelin's battle-tested code
- Comprehensive Testing: Fully tested including edge cases and fuzz testing
Use Cases:
- Airdrop token distribution
- Test token for development
- Template for custom token implementations
- Foundry installed
- Git for cloning the repository
git clone https://github.com/chauhan-varun/merkle-airdrop.git
cd merkle-airdrop
forge installforge buildforge testThe airdrop uses a cryptographically secure Merkle tree where each leaf represents a recipient and their token allocation:
// Double hashing for security against second preimage attacks
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount))));Security Benefits:
- Space Efficient: O(log n) storage complexity instead of O(n)
- Tamper Proof: Any modification invalidates the entire tree
- Privacy Preserving: Only reveals necessary information during claims
Enhanced security through structured data signing:
struct AirdropClaim {
address account;
uint256 amount;
}EIP712 Benefits:
- Human Readable: Clear signature content for users
- Replay Protection: Domain separator prevents cross-contract attacks
- Malleability Resistance: Structured data prevents signature manipulation
Recipients must provide comprehensive proof of eligibility:
Required Parameters:
account: Recipient address (must match signature signer)amount: Token allocation amountmerkleProof: Array of hashes proving inclusion in treev, r, s: EIP712 signature components from account owner
Verification Steps:
- Signature Verification: Validates EIP712 signature matches account
- Merkle Proof Verification: Confirms eligibility and amount
- State Check: Ensures no previous claim by this account
- Token Transfer: Safely transfers tokens using SafeERC20
Multi-layered security ensures robust protection:
- Anti-Replay: Claim state tracking prevents double-spending
- Signature Validation: ECDSA recovery with error handling
- Proof Verification: Cryptographic validation against merkle root
- Reentrancy Protection: State updates before external calls
// Deploy BagelToken with minting capabilities
BagelToken token = new BagelToken();# Generate recipient input data
forge script script/GenerateInput.s.sol
# Create merkle tree and generate proofs
forge script script/MakeMerkle.s.sol// Deploy with EIP712 domain setup
MerkleAirdrop airdrop = new MerkleAirdrop(
merkleRoot, // Root hash of the merkle tree
IERC20(token) // Token contract address
);// Mint tokens to airdrop contract
token.mint(address(airdrop), totalAirdropAmount);# Deploy to local network
forge script script/DeployMerkleAirdrop.s.sol --rpc-url http://localhost:8545 --private-key $PRIVATE_KEY --broadcast
# Deploy to testnet
forge script script/DeployMerkleAirdrop.s.sol --rpc-url $SEPOLIA_RPC_URL --private-key $PRIVATE_KEY --broadcast --verify
# Deploy to mainnet
forge script script/DeployMerkleAirdrop.s.sol --rpc-url $MAINNET_RPC_URL --private-key $PRIVATE_KEY --broadcast --verifyRecipients must provide both merkle proof AND signature for enhanced security:
// Enhanced claim with signature verification
airdrop.claim(
account, // Recipient address
amount, // Eligible token amount
merkleProof, // Proof of inclusion in tree
v, // Signature recovery byte
r, // First 32 bytes of signature
s // Second 32 bytes of signature
);// Example frontend code for signature generation
const domain = {
name: 'Merkle Airdrop',
version: '1.0.0',
chainId: await provider.getNetwork().chainId,
verifyingContract: airdropContract.address
};
const types = {
AirdropClaim: [
{ name: 'account', type: 'address' },
{ name: 'amount', type: 'uint256' }
]
};
const message = {
account: userAddress,
amount: eligibleAmount
};
// User signs the structured data
const signature = await signer._signTypedData(domain, types, message);
const { v, r, s } = ethers.utils.splitSignature(signature);
// Submit claim with signature
await airdropContract.claim(userAddress, eligibleAmount, merkleProof, v, r, s);// Check if user has claimed
bool hasClaimed = airdrop.hasClaimed(userAddress);
// Get merkle root
bytes32 root = airdrop.getMerkleRoot();
// Get airdrop token address
IERC20 token = airdrop.getAirdropToken();
// Generate message hash for signing
bytes32 messageHash = airdrop.getMessageHash(account, amount);The project includes an extensive test suite with 46 comprehensive tests covering all aspects of the contracts:
Security & Authentication (12 tests):
- β EIP712 signature verification
- β Invalid signature rejection
- β Merkle proof validation
- β Double-claim prevention
- β Access control mechanisms
- β Reentrancy protection
Core Functionality (15 tests):
- β Successful claims with dual verification
- β Token minting and transfers
- β State management and tracking
- β Event emission verification
- β View function accuracy
Edge Cases & Error Handling (10 tests):
- β Malformed signature handling
- β Invalid proof rejection
- β Zero address protection
- β Boundary value testing
- β Insufficient balance scenarios
Gas Optimization (4 tests):
- β Efficient signature verification
- β Optimized merkle proof validation
- β Storage access patterns
- β External call efficiency
Fuzz Testing (4 tests):
- β Random input validation
- β Boundary condition testing
- β Property-based testing
- β Invariant verification
Integration Testing (1 test):
- β End-to-end workflow validation
# Run all tests
forge test
# Verbose output with detailed logs
forge test -vv
# Extra verbose with stack traces
forge test -vvv
# Run specific test file
forge test --contracts test/MerkleAirdropTest.t.sol
# Run specific test function
forge test --match-test test_MerkleAirdrop_SuccessfulClaim
# Run with gas reporting
forge test --gas-report
# Generate coverage report
forge coverage
# Run fuzz tests with custom runs
forge test --fuzz-runs 1000Ran 2 test suites in 53.80ms (103.44ms CPU time):
46 tests passed, 0 failed, 0 skipped (46 total tests)
Test Suites:
βββ BagelTokenTest.t.sol: 25 tests β
βββ MerkleAirdropTest.t.sol: 21 tests β
- Line Coverage: 100%
- Branch Coverage: 100%
- Function Coverage: 100%
- Statement Coverage: 100%
See TEST_COVERAGE.md for detailed test documentation.
merkle-airdrop/
βββ π src/ # Smart Contracts
β βββ π― MerkleAirdrop.sol # Advanced airdrop contract with EIP712
β βββ π₯― BagelToken.sol # Production-ready ERC20 token
βββ π test/ # Comprehensive Test Suite
β βββ π§ͺ MerkleAirdropTest.t.sol # Integration & core functionality tests
β βββ π§ͺ BagelTokenTest.t.sol # Focused BagelToken tests
β βββ π TEST_COVERAGE.md # Detailed test documentation
βββ π script/ # Deployment & Utility Scripts
β βββ π DeployMerkleAirdrop.s.sol # Main deployment script
β βββ βοΈ GenerateInput.s.sol # Recipient data generation
β βββ π³ MakeMerkle.s.sol # Merkle tree construction
β βββ π§ Interactions.s.sol # Contract interaction utilities
β βββ π target/ # Generated data files
β βββ input.json # Recipient input data
β βββ output.json # Merkle tree output
βββ π lib/ # Dependencies
β βββ forge-std/ # Foundry standard library
β βββ openzeppelin-contracts/ # Security & standards
β βββ murky/ # Merkle tree utilities
β βββ foundry-devops/ # Development tools
β βββ foundry-era-contracts/ # zkSync compatibility
βββ π broadcast/ # Deployment artifacts
βββ π cache/ # Build cache
βββ π foundry.toml # Foundry configuration
βββ π Makefile # Build automation
βββ π README.md # This documentation
βββ π .gitignore # Git ignore patterns
MerkleAirdrop.sol: Advanced airdrop contract with EIP712 signature verification, dual security validation, and comprehensive security featuresBagelToken.sol: Production-ready ERC20 token with minting capabilities and ownership controls
MerkleAirdropTest.t.sol: 21 comprehensive tests covering integration scenarios and core functionalityBagelTokenTest.t.sol: 25 focused tests for ERC20 functionality, minting, and ownershipTEST_COVERAGE.md: Detailed documentation of test coverage and strategies
DeployMerkleAirdrop.s.sol: Production deployment script with environment configurationGenerateInput.s.sol: Utility for generating recipient data and amountsMakeMerkle.s.sol: Merkle tree construction and proof generationInteractions.s.sol: Contract interaction utilities for testing and maintenance
Create a .env file with comprehensive network configuration:
# Private Keys (use hardware wallet for production)
PRIVATE_KEY=your_private_key_here
DEPLOYER_PRIVATE_KEY=your_deployer_private_key_here
# Network RPC URLs
MAINNET_RPC_URL=https://mainnet.infura.io/v3/your-project-id
SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/your-project-id
POLYGON_RPC_URL=https://polygon-rpc.com
ARBITRUM_RPC_URL=https://arb1.arbitrum.io/rpc
BASE_RPC_URL=https://mainnet.base.org
# Verification APIs
ETHERSCAN_API_KEY=your_etherscan_api_key
POLYGONSCAN_API_KEY=your_polygonscan_api_key
ARBISCAN_API_KEY=your_arbiscan_api_key
BASESCAN_API_KEY=your_basescan_api_key
# Optional Configuration
GAS_PRICE=20000000000 # 20 gwei
GAS_LIMIT=8000000
VERIFY_CONTRACTS=trueAdvanced foundry.toml configuration for optimal development:
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc_version = "0.8.24" # Latest stable version
optimizer = true
optimizer_runs = 200
via_ir = true # Advanced optimization
gas_reports = ["*"] # Gas reports for all contracts
auto_detect_solc = false
[profile.ci]
fuzz_runs = 10000 # Extensive fuzz testing
invariant_runs = 256
invariant_depth = 500
[profile.production]
optimizer_runs = 1000000 # Maximum optimization for deployment
bytecode_hash = "none" # Reproducible builds
[rpc_endpoints]
mainnet = "${MAINNET_RPC_URL}"
sepolia = "${SEPOLIA_RPC_URL}"
polygon = "${POLYGON_RPC_URL}"
arbitrum = "${ARBITRUM_RPC_URL}"
base = "${BASE_RPC_URL}"
localhost = "http://localhost:8545"
[etherscan]
mainnet = { key = "${ETHERSCAN_API_KEY}", url = "https://api.etherscan.io/api" }
sepolia = { key = "${ETHERSCAN_API_KEY}", url = "https://api-sepolia.etherscan.io/api" }
polygon = { key = "${POLYGONSCAN_API_KEY}", url = "https://api.polygonscan.com/api" }
arbitrum = { key = "${ARBISCAN_API_KEY}", url = "https://api.arbiscan.io/api" }
base = { key = "${BASESCAN_API_KEY}", url = "https://api.basescan.org/api" }{
"solidity.defaultCompiler": "remote",
"solidity.compileUsingRemoteVersion": "v0.8.24+commit.e11b9ed9",
"solidity.formatter": "forge",
"editor.formatOnSave": true,
"[solidity]": {
"editor.defaultFormatter": "JuanBlanco.solidity"
}
}# Install pre-commit hooks
echo "forge test" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commitThe contracts are meticulously optimized for minimal gas consumption:
- Immutable Variables: Critical data (
merkleRoot,airdropToken) stored as immutable - Packed Structs: Efficient data packing in the
AirdropClaimstruct - Mapping Efficiency: Single storage slot per claim status
- Minimal State: Only essential data stored on-chain
- CEI Pattern: Checks-Effects-Interactions prevents reentrancy with minimal gas overhead
- Early Returns: Fail-fast validation reduces unnecessary computation
- Efficient Signature Recovery: Uses
ECDSA.tryRecoverfor gas-optimized signature validation - Optimized Hashing: Double-hashing strategy balances security and gas costs
- SafeERC20: Secure token transfers with minimal gas overhead
- Batch Operations: Single transaction for complete claim process
- Minimal External Calls: Reduces cross-contract interaction costs
Contract Deployment:
βββ MerkleAirdrop: ~750,000 gas
βββ BagelToken: ~650,000 gas
Function Execution:
βββ claim(): ~106,920 gas (successful claim)
βββ getMessageHash(): ~20,617 gas
βββ hasClaimed(): ~2,500 gas
βββ getMerkleRoot(): ~2,300 gas
Comparison with Traditional Airdrop:
βββ Traditional (store all recipients): ~50,000 gas per recipient
βββ Merkle Airdrop: ~106,920 gas total (amortized: ~0.01 gas per recipient)
// Immutable for gas savings
IERC20 private immutable i_airdropToken;
bytes32 private immutable i_merkleRoot;
// Efficient signature verification
(address actualSigner,,) = ECDSA.tryRecover(digest, _v, _r, _s);
return (actualSigner == signer);
// CEI pattern for security + gas efficiency
s_hasClaimed[account] = true; // Effect
emit Claimed(account, amount); // Effect
i_airdropToken.safeTransfer(account, amount); // Interaction- Compiler optimization runs: 200 (balanced for deployment + execution)
- Via-IR compilation for advanced optimization
- Bytecode size optimization for deployment cost reduction
- EIP712 Structured Signatures: Prevents signature replay and ensures data integrity
- Merkle Proof Verification: Cryptographically secure eligibility verification
- Double Hashing: Protects against second preimage attacks on leaf nodes
- Domain Separation: Prevents cross-contract and cross-chain signature reuse
- Signature-Based Claims: Only account owners can initiate claims
- Dual Verification: Requires both merkle proof AND valid signature
- Owner Controls: Restricted minting and administrative functions
- Address Validation: Prevents zero address and invalid recipient attacks
- Reentrancy Protection: CEI pattern prevents malicious callback attacks
- Double-Claim Prevention: Immutable claim tracking prevents token draining
- Immutable Critical Parameters: Merkle root and token address cannot be changed
- Atomic Operations: All-or-nothing claim processing
- Comprehensive Bounds Checking: Validates all input parameters
- Malformed Data Handling: Graceful handling of invalid signatures and proofs
- Custom Error Messages: Clear, gas-efficient error reporting
- Edge Case Coverage: Handles boundary conditions and unexpected inputs
- Reentrancy protection (CEI pattern)
- Integer overflow/underflow protection (Solidity 0.8+)
- Access control mechanisms
- Input validation and sanitization
- Safe external calls (OpenZeppelin SafeERC20)
- Gas limit considerations
- Front-running protection (signature-based claims)
- Secure random number generation (not applicable)
- Proper signature verification (ECDSA + EIP712)
- Hash function security (keccak256)
- Merkle tree implementation security
- Signature malleability protection
- Replay attack prevention
- Token balance verification
- Supply manipulation prevention
- Claim amount validation
- Economic incentive alignment
- MEV resistance considerations
// Custom errors for gas efficiency and clarity
error MerkleAirdrop__InvalidProof();
error MerkleAirdrop__AlreadyClaimed();
error MerkleAirdrop__InvalidSignature();
// CEI pattern implementation
function claim(...) external {
// Checks
if (s_hasClaimed[account]) revert MerkleAirdrop__AlreadyClaimed();
if (!_isValidSignature(...)) revert MerkleAirdrop__InvalidSignature();
if (!MerkleProof.verify(...)) revert MerkleAirdrop__InvalidProof();
// Effects
s_hasClaimed[account] = true;
emit Claimed(account, amount);
// Interactions
i_airdropToken.safeTransfer(account, amount);
}- NatSpec Comments: Comprehensive function documentation
- Security Notes: Inline comments explaining security considerations
- Test Coverage: 100% test coverage including security scenarios
- Formal Verification Ready: Code structure supports formal verification tools
# Format all Solidity files
forge fmt
# Check code formatting
forge fmt --check
# Generate gas usage snapshots
forge snapshot
# Compare gas usage against snapshots
forge snapshot --diff .gas-snapshot
# Run static analysis
slither . --config-file slither.config.json# Run complete test suite
forge test
# Run tests with detailed output
forge test -vvv
# Run specific test contract
forge test --contracts test/MerkleAirdropTest.t.sol
# Run fuzz testing with custom iterations
forge test --fuzz-runs 10000
# Generate test coverage report
forge coverage --report lcov
# Generate coverage HTML report
genhtml lcov.info --output-directory coverage# Start local Ethereum node
anvil
# Deploy to local network
make deploy-local
# Or using forge directly
forge script script/DeployMerkleAirdrop.s.sol \
--rpc-url http://localhost:8545 \
--private-key $PRIVATE_KEY \
--broadcast
# Interact with local deployment
forge script script/Interactions.s.sol \
--rpc-url http://localhost:8545 \
--private-key $PRIVATE_KEY \
--broadcast# Deploy to Sepolia testnet
make deploy-sepolia
# Deploy with verification
forge script script/DeployMerkleAirdrop.s.sol \
--rpc-url $SEPOLIA_RPC_URL \
--private-key $PRIVATE_KEY \
--broadcast \
--verify \
--etherscan-api-key $ETHERSCAN_API_KEY
# Deploy to other testnets
make deploy-polygon-mumbai
make deploy-arbitrum-goerli
make deploy-base-goerli# Deploy to mainnet (use with caution)
make deploy-mainnet
# Multi-chain deployments
make deploy-polygon
make deploy-arbitrum
make deploy-base# Verify on Ethereum mainnet
forge verify-contract \
--chain-id 1 \
--watch \
$CONTRACT_ADDRESS \
src/MerkleAirdrop.sol:MerkleAirdrop \
--etherscan-api-key $ETHERSCAN_API_KEY
# Verify on Polygon
forge verify-contract \
--chain-id 137 \
--watch \
$CONTRACT_ADDRESS \
src/MerkleAirdrop.sol:MerkleAirdrop \
--etherscan-api-key $POLYGONSCAN_API_KEY \
--verifier-url https://api.polygonscan.com/api
# Verify with constructor arguments
forge verify-contract \
--chain-id 1 \
--watch \
$CONTRACT_ADDRESS \
src/MerkleAirdrop.sol:MerkleAirdrop \
--constructor-args $(cast abi-encode "constructor(bytes32,address)" $MERKLE_ROOT $TOKEN_ADDRESS) \
--etherscan-api-key $ETHERSCAN_API_KEY# Generate airdrop input data
forge script script/GenerateInput.s.sol
# Create merkle tree and proofs
forge script script/MakeMerkle.s.sol
# Validate merkle tree integrity
forge test --match-test test_MerkleTree_Integrity# Check claim eligibility
cast call $AIRDROP_ADDRESS "hasClaimed(address)" $USER_ADDRESS
# Get merkle root
cast call $AIRDROP_ADDRESS "getMerkleRoot()"
# Get message hash for signing
cast call $AIRDROP_ADDRESS "getMessageHash(address,uint256)" $USER_ADDRESS $AMOUNT
# Submit claim transaction
cast send $AIRDROP_ADDRESS \
"claim(address,uint256,bytes32[],uint8,bytes32,bytes32)" \
$USER_ADDRESS $AMOUNT $PROOF_ARRAY $V $R $S \
--private-key $PRIVATE_KEY# Detailed gas report
forge test --gas-report
# Gas optimization analysis
forge snapshot --diff .gas-snapshot
# Function-level gas profiling
forge test --gas-report --json > gas-report.json# Contract size analysis
forge build --sizes
# Storage layout analysis
forge inspect MerkleAirdrop storage-layout
# ABI generation
forge inspect MerkleAirdrop abi > MerkleAirdrop.abi.json- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Complete security audit by reputable firm
- Comprehensive test coverage (β 46 tests, 100% coverage)
- Gas optimization analysis and tuning
- Multi-network compatibility testing
- Frontend integration testing
- Documentation review and updates
- Testnet deployment and validation
- Contract verification on block explorers
- Multi-signature wallet setup for admin functions
- Emergency pause mechanism consideration
- Monitoring and alerting systems setup
- Contract monitoring and health checks
- User education and documentation
- Community support channels
- Incident response procedures
- Regular security reviews
While the current contracts are non-upgradeable by design for security, future versions could implement:
- Transparent proxy pattern for upgradeability
- Time-locked administrative functions
- Multi-signature governance for critical operations
- Gradual rollout mechanisms
- Gas Costs: ~107k gas per claim vs traditional ~50k per recipient stored
- Storage Efficiency: O(1) vs O(n) storage complexity
- Network Congestion: Signature-based claims reduce MEV opportunities
- Cross-Chain: Architecture supports multi-chain deployments
If you discover a security vulnerability, please report it responsibly:
- DO NOT create a public GitHub issue
- Email security reports to: [[email protected]]
- Include detailed reproduction steps and impact assessment
- Allow reasonable time for patching before public disclosure
We appreciate responsible disclosure and will acknowledge security researchers appropriately.
We welcome contributions from the community! Here's how to get involved:
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/merkle-airdrop.git - Install dependencies:
forge install - Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes and add tests
- Ensure all tests pass:
forge test - Format code:
forge fmt - Commit changes:
git commit -m "Add amazing feature" - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Code Quality: Follow existing patterns and style
- Testing: Add comprehensive tests for new features
- Documentation: Update README and inline documentation
- Security: Consider security implications of changes
- Gas Optimization: Maintain or improve gas efficiency
- Additional test cases and edge case coverage
- Gas optimization improvements
- Integration examples and tutorials
- Multi-language SDK development
- Advanced tooling and utilities
- OpenZeppelin: Industry-standard secure smart contract libraries
- Foundry: Fast, portable, and modular toolkit for Ethereum development
- Murky: Gas-optimized Merkle tree utilities for Solidity
- Cyfrin Updraft: Advanced smart contract security education
- Patrick Collins: Educational content and best practices
- Smart Contract Programmer: Solidity tutorials and examples
- Trail of Bits: Security research and auditing methodologies
- ConsenSys Diligence: Smart contract security best practices
- Ethereum Foundation: EIP standards and security guidelines
Varun Chauhan
- π± GitHub: @chauhan-varun
- π¦ Twitter: @VarunChauhan_
- π§ Email: [[email protected]]
- π Website: chauhan-varun.dev
- π Discussions: GitHub Discussions
- π Issues: GitHub Issues
- π Documentation: Project Wiki
For technical support and questions:
- Check the Documentation and Wiki
- Search existing issues
- Create a new issue with detailed information
- Join the community discussions
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2025 Varun Chauhan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
If this project helped you, please consider:
- β Starring this repository
- π Sharing with the community
- π€ Contributing to make it even better
- π Reporting any issues you find
Made with β€οΈ by Varun Chauhan
Building secure, scalable, and efficient smart contracts for the decentralized future.