The OPNet Smart Contract Runtime is the framework for building decentralized applications on Bitcoin L1. Written in AssemblyScript and compiled to WebAssembly, it enables smart contract development on Bitcoin with similar expressiveness to 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
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.
This runtime has been professionally audited by Verichains.
See SECURITY.md for details.
npm install @btc-vision/btc-runtimeimport { 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 override onDeployment(_calldata: Calldata): void {
const maxSupply: u256 = u256.fromString('1000000000000000000000000');
const decimals: u8 = 18;
const name: string = 'MyToken';
const symbol: string = 'MTK';
this.instantiate(new OP20InitParameters(maxSupply, decimals, name, symbol));
this._mint(Blockchain.tx.origin, maxSupply);
}
}| Solidity/EVM | OPNet/btc-runtime |
|---|---|
contract MyContract |
class MyContract extends OP_NET |
constructor() |
onDeployment(calldata) |
msg.sender |
Blockchain.tx.sender |
tx.origin |
Blockchain.tx.origin |
block.number |
Blockchain.block.number |
mapping(address => uint) |
AddressMemoryMap + StoredU256 |
emit Transfer(...) |
this.emitEvent(new TransferEvent(...)) |
ERC20 |
OP20 |
ERC721 |
OP721 |
require(condition, "msg") |
if (!condition) throw new Revert("msg") |
Documentation is available in docs/:
- Getting Started: Installation, First Contract, Project Structure
- Core Concepts: Blockchain Environment, Storage System, Pointers, Events, Security
- Contract Standards: OP_NET Base, OP20, OP20S, OP721
- Storage Types: Stored Primitives, Stored Arrays, Stored Maps, Memory Maps
- Advanced: Cross-Contract Calls, Signature Verification, Quantum Resistance
npm test- Fork the repository
- Create a feature branch
- Make your changes
- Run tests:
npm test - Submit a pull request
See the pull request template for requirements.
- Bugs: Use the bug report template
- Security: See SECURITY.md - do not open public issues for vulnerabilities