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 🙏

© 2026 – Pkg Stats / Ryan Hefner

xtract-cli

v0.30.1

Published

Solidity to MultiversX Rust smart contract transpiler

Readme

XTract (v0.30.1)

CI Tests npm PyPI

An open-source tool for converting Solidity smart contracts to MultiversX-compatible Rust smart contracts.

Quick Start

# Install
npm install -g xtract-cli

# Transpile a Solidity contract to MultiversX Rust
xtract MyContract.sol

# That's it! Your MultiversX Rust contract is ready at MyContract.rs

Overview

XTract analyzes Solidity code and generates MultiversX Rust code that can be compiled and deployed on the MultiversX blockchain. It supports a comprehensive set of Solidity features including control flow, mappings, modifiers, and inheritance.

Version 0.30.1 (Beta Release)

This version introduces comprehensive Solidity support:

Core Features

  • Function body transpilation: Converts require(), emit(), return, and assignments
  • Error handling: Maps Solidity require() → MultiversX require!() and revert()sc_panic!()
  • Event emission: Properly converts Solidity events to MultiversX event calls
  • Storage operations: Handles variable assignments and storage access patterns

Mapping Support

  • Single mappings: mapping(address => uint256) → storage mappers with key parameters
  • Nested mappings: mapping(address => mapping(address => uint256)) → multi-key storage mappers

Control Flow

  • If/else statements: Full if/else transpilation with proper Rust syntax
  • For loops: Counter-based loops transpiled to for i in 0..n syntax
  • While loops: While loop transpilation with condition conversion
  • Payable functions: Automatic #[payable("EGLD")] annotation

Advanced Features

  • Function modifiers: onlyOwner, whenNotPaused, custom modifiers
  • Basic inheritance: Contract inheritance with supertrait generation
  • Enhanced diagnostics: Detailed warnings for unsupported features

Test Coverage: 100% unit test success across 50 Solidity contracts with 64 test functions.

Installation

Via npm (recommended)

npm install -g xtract-cli

Via pip (Python)

pip install xtract

From source

git clone https://github.com/XTract-build/Xtract.git
cd XTract
pip install -e .

Usage

Basic Usage

# Transpile a Solidity contract
xtract MyContract.sol

# Specify output file
xtract MyContract.sol output.rs

# Verbose mode (show diagnostics)
xtract -v MyContract.sol

# Quiet mode
xtract -q MyContract.sol

Quick Example

# Create a simple Solidity contract
cat > MyStorage.sol << 'EOF'
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MyStorage {
    uint256 public value;
    address public owner;

    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    event ValueChanged(uint256 indexed newValue);

    constructor() {
        owner = msg.sender;
    }

    function setValue(uint256 newValue) public onlyOwner {
        require(newValue > 0, "Value must be positive");
        value = newValue;
        emit ValueChanged(newValue);
    }

    function getValue() public view returns (uint256) {
        return value;
    }
}
EOF

# Transpile it
xtract MyStorage.sol

# View the generated MultiversX Rust code
cat MyStorage.rs

Supported Solidity Features

Fully Supported

  • Contract declarations
  • State variables (all basic types)
  • Single mappings (mapping(address => uint256))
  • Nested mappings (mapping(address => mapping(address => uint256)))
  • Events with indexed parameters
  • Custom errors
  • Structs
  • Functions (public, private, view, payable)
  • Constructors
  • Function modifiers (onlyOwner, custom)
  • Basic inheritance (contract A is B, C)
  • require/revert statements
  • If/else statements
  • For loops (counter-based)
  • While loops

Requires Manual Review

  • Complex expressions (may need adjustment)
  • External contract calls

Not Yet Supported

  • Do-while loops
  • Inline assembly
  • Try-catch blocks
  • Libraries
  • Diamond inheritance

Examples

The test_cases/ directory contains 50 fully working examples including:

| Category | Examples | |----------|----------| | Basic | SimpleStorage, Counter, Config | | Tokens | ERC20Token, SimpleToken, TokenMinter | | NFTs | NFTMarketplace, Certificate, Badge | | DeFi | Staking, RewardPool, TokenSwap, Vesting | | Governance | Voting, Governance, Poll, Multisig | | Access Control | OnlyOwner, AccessControl, Pausable | | Patterns | Escrow, Auction, Lottery, Vault |

Documentation

Version Documentation

Developer Guide

Repository Structure

XTract/
  xtract/            # Python package (CLI + core transpiler)
  tests/             # Unit tests (64 test functions)
  test_cases/        # Solidity inputs and expected Rust outputs (50 contracts)
  demo/              # Compiled demo contracts
  docs/              # Documentation
  .github/workflows/ # CI configuration
  package.json       # npm package configuration
  pyproject.toml     # Python packaging config

How It Works

XTract follows a clear pipeline from Solidity source code to MultiversX Rust:

Solidity Source (.sol)
        ↓
┌─────────────────────┐
│  Validation &       │
│  Diagnostics        │
└──────────┬──────────┘
           ↓
┌─────────────────────┐
│  Parse Contract     │
│  - Name & Inheritance│
│  - Modifiers        │
│  - Storage & Events │
│  - Functions        │
└──────────┬──────────┘
           ↓
┌─────────────────────┐
│  Convert to         │
│  MultiversX Rust    │
└──────────┬──────────┘
           ↓
   Rust Output (.rs)

Testing

# Run all tests
pytest tests/ -v

# Run specific test
pytest tests/test_transpiler_core.py::test_nested_mapping_features -v

# Run with coverage
pytest tests/ --cov=xtract

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.