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

@btc-vision/btc-runtime

v1.10.12

Published

Bitcoin L1 Smart Contract Runtime for OPNet. Build decentralized applications on Bitcoin using AssemblyScript and WebAssembly. Fully audited.

Readme

OPNet Smart Contract Runtime

Bitcoin AssemblyScript TypeScript NodeJS WebAssembly NPM

code style: prettier

Overview

The OPNet Smart Contract Runtime is the foundational framework for building decentralized applications directly on Bitcoin Layer 1 (L1). Written in AssemblyScript and compiled to WebAssembly, btc-runtime enables developers to create, deploy, and execute smart contracts on the Bitcoin network with the same expressiveness as Ethereum's Solidity.

Unlike Bitcoin Layer 2 solutions, OPNet operates directly on Bitcoin's base layer, inheriting Bitcoin's security guarantees and decentralization properties while adding programmable smart contract capabilities.

What is OPNet?

OPNet (Open Protocol Network) is a consensus-layer built on Bitcoin L1. It allows developers to write smart contracts in AssemblyScript or similar that compile to WebAssembly (WASM) and execute deterministically across all network nodes. Think of it as "Solidity for Bitcoin" - you get the programmability of Ethereum with the security of Bitcoin.

Why AssemblyScript?

AssemblyScript compiles to WebAssembly, which provides:

  • Deterministic execution across all platforms and nodes
  • Near-native performance for compute-intensive operations
  • Memory safety through WASM's sandboxed environment
  • Familiar syntax for TypeScript/JavaScript developers

IMPORTANT: Floating-Point Arithmetic is Prohibited

Floating-point arithmetic (f32, f64) is strictly prohibited in blockchain and smart contract environments. Floating-point operations are non-deterministic across different CPU architectures, compilers, and platforms due to differences in rounding, precision, and IEEE 754 implementation details.

Always use integer arithmetic (u128, u256) for all blockchain computations. For decimal values, use fixed-point representation (e.g., store currency as smallest units like satoshis). This library provides full support for 128-bit and 256-bit integer operations through @btc-vision/as-bignum.

Security Audit

This runtime has been professionally audited by Verichains, a leading blockchain security firm. The audit covered all core components including contract standards (OP20, OP721), storage systems, cryptographic operations, and security mechanisms.

For full details, see SECURITY.md.

Features

| Feature | Description | |------------------------------|------------------------------------------------------------------| | Contract Standards | OP20 (fungible tokens), OP721 (NFTs), OP20S (gasless signatures) | | Storage System | Pointer-based persistent storage with SHA256 key hashing | | SafeMath | Overflow/underflow protection for all arithmetic operations | | Reentrancy Protection | Built-in guards with STANDARD and CALLBACK modes | | Cryptographic Operations | Schnorr signatures, ML-DSA (quantum-resistant), SHA256 | | Bitcoin Integration | Transaction parsing, address validation, script building | | Event System | 352-byte events for state change notifications | | Cross-Contract Calls | Inter-contract communication with configurable failure handling |

Installation

npm install @btc-vision/btc-runtime

Quick Start

Your First Contract

Here's a minimal OP20 token contract to get you started:

import { u256 } from '@btc-vision/as-bignum/assembly';
import {
    Blockchain,
    BytesWriter,
    Calldata,
    OP20,
    OP20InitParameters,
} from '@btc-vision/btc-runtime/runtime';

@final
export class MyToken extends OP20 {
    public constructor() {
        super();
        // NOTE: Constructor runs on EVERY interaction, not just deployment!
    }

    // This runs ONCE when the contract is deployed (like Solidity's constructor)
    public override onDeployment(_calldata: Calldata): void {
        const maxSupply: u256 = u256.fromString('1000000000000000000000000'); // 1 million tokens
        const decimals: u8 = 18;
        const name: string = 'MyToken';
        const symbol: string = 'MTK';

        this.instantiate(new OP20InitParameters(maxSupply, decimals, name, symbol));

        // Mint initial supply to deployer
        this._mint(Blockchain.tx.origin, maxSupply);
    }

    // Custom mint function (deployer only)
    public mint(calldata: Calldata): BytesWriter {
        this.onlyDeployer(Blockchain.tx.sender);

        const to = calldata.readAddress();
        const amount = calldata.readU256();
        this._mint(to, amount);

        return new BytesWriter(0);
    }
}

Solidity Comparison

If you're coming from Solidity/EVM development, here's how OPNet concepts map:

| Solidity/EVM | OPNet/btc-runtime | Notes | |-----------------------------|-------------------------------------------|-----------------------------| | contract MyContract | class MyContract extends OP_NET | Base class inheritance | | constructor() | onDeployment(calldata) | Runs once at deployment | | msg.sender | Blockchain.tx.sender | Immediate caller | | tx.origin | Blockchain.tx.origin | Original transaction signer | | block.number | Blockchain.block.number | Current block height | | mapping(address => uint) | AddressMemoryMap + StoredU256 | Pointer-based storage | | emit Transfer(...) | this.emitEvent(new TransferEvent(...)) | Event emission | | ERC20 | OP20 | Fungible token standard | | ERC721 | OP721 | Non-fungible token standard | | uint256 | u256 | 256-bit unsigned integer | | require(condition, "msg") | if (!condition) throw new Revert("msg") | Error handling | | modifier onlyOwner | this.onlyDeployer(sender) | Access control |

Documentation

Comprehensive documentation is available in the docs/ directory:

Getting Started

Core Concepts

Contract Standards

Types & Utilities

Storage Types

Advanced Topics

Examples

API Reference

Running Tests

# Run all tests with verbose output
npm test

# Run tests with summary only
npm run test:ci

Project Structure

btc-runtime/
├── runtime/                    # Core runtime library
│   ├── contracts/              # Contract base classes (OP_NET, OP20, OP721)
│   ├── storage/                # Storage types (Stored*, Maps)
│   ├── math/                   # SafeMath operations
│   ├── types/                  # Core types (Address, Calldata)
│   ├── events/                 # Event system
│   └── env/                    # Blockchain environment
├── docs/                       # Documentation
└── tests/                      # Test suite

Key Differences from Solidity

1. Constructor Behavior

// OPNet: Constructor runs EVERY time
export class MyContract extends OP_NET {
    constructor() {
        super();
        // DON'T put initialization here - it runs on every call!
    }

    // Use this for one-time initialization (like Solidity constructor)
    public override onDeployment(calldata: Calldata): void {
        // Initialize storage here
    }
}

2. Storage is Explicit

// Solidity: Implicit storage
// mapping(address => uint256) balances;

// OPNet: Explicit pointer allocation
class Test {
    private balancePointer: u16 = Blockchain.nextPointer;
    private balances: AddressMemoryMap<Address, StoredU256> = new AddressMemoryMap(
        this.balancePointer,
        u256.Zero
    );
}

3. Integer Types

// OPNet uses u256 from as-bignum (NOT native BigInt)
import { u256 } from '@btc-vision/as-bignum/assembly';

const a = u256.from(100);
const b = u256.from(50);
const sum = SafeMath.add(a, b);  // Always use SafeMath!

4. No Floating Point

// WRONG - Non-deterministic!
// const price: f64 = 1.5;

// CORRECT - Fixed-point with integers
const PRECISION: u256 = u256.fromU64(1_000_000); // 6 decimals
const price: u256 = SafeMath.mul(amount, PRECISION);

Contributing

Contributions are welcome! Please ensure all tests pass before submitting a pull request.

npm test

License

This project is licensed under the Apache-2.0 License. See LICENSE for details.

Links