BRC20 Programmable Module (JSON-RPC)

The BRC2.0 Programmable Module provides smart contract execution capabilities for BRC-20 indexers, running on a custom EVM execution engine using revm. This allows inscribing smart contracts and function calls on the Bitcoin blockchain.

See the BRC2.0 Proposal for detailed protocol information.

Endpoint

POST https://mainnet.subfrost.io/v4/jsonrpc/brc20-prog

Also available on other networks:

  • Signet: https://signet.subfrost.io/v4/jsonrpc/brc20-prog
  • Regtest: https://regtest.subfrost.io/v4/jsonrpc/brc20-prog

With API key: https://mainnet.subfrost.io/v4/{api_key}/brc20-prog


Ethereum-Compatible Methods

BRC2.0 implements the Ethereum JSON-RPC API for read operations.

eth_blockNumber

Returns the latest indexed block height.

{
  "jsonrpc": "2.0",
  "method": "eth_blockNumber",
  "params": [],
  "id": 1
}

eth_getBlockByNumber

Returns block information with all indexed transactions.

{
  "jsonrpc": "2.0",
  "method": "eth_getBlockByNumber",
  "params": ["0x1", true],
  "id": 1
}

eth_getBlockByHash

Returns block information by block hash.

{
  "jsonrpc": "2.0",
  "method": "eth_getBlockByHash",
  "params": ["0x...", true],
  "id": 1
}

eth_getTransactionReceipt

Returns the transaction receipt including logs and status.

{
  "jsonrpc": "2.0",
  "method": "eth_getTransactionReceipt",
  "params": ["0x..."],
  "id": 1
}

eth_call

Interact with deployed contracts (read-only).

{
  "jsonrpc": "2.0",
  "method": "eth_call",
  "params": [{
    "to": "0x...",
    "data": "0x..."
  }, "latest"],
  "id": 1
}

eth_estimateGas

Estimate gas for a transaction.

{
  "jsonrpc": "2.0",
  "method": "eth_estimateGas",
  "params": [{
    "to": "0x...",
    "data": "0x..."
  }],
  "id": 1
}

Debug Methods

debug_traceTransaction

Returns a callTracer result for a transaction. Requires EVM_RECORD_TRACES=true on the server.

{
  "jsonrpc": "2.0",
  "method": "debug_traceTransaction",
  "params": ["0x...", {"tracer": "callTracer"}],
  "id": 1
}

Transaction Pool

txpool_content

Returns pending transactions that were sent out of order.

{
  "jsonrpc": "2.0",
  "method": "txpool_content",
  "params": [],
  "id": 1
}

BRC-20 Balance Method

brc20_balance

Returns the current BRC-20 balance (in-module) for a given pkscript and ticker.

Parameters:

  • pkscript (string): Bitcoin pkscript (hex)
  • ticker (string): BRC-20 ticker
{
  "jsonrpc": "2.0",
  "method": "brc20_balance",
  "params": {
    "pkscript": "0014...",
    "ticker": "ordi"
  },
  "id": 1
}

Receipt Lookup Methods

brc20_getTxReceiptByInscriptionId

Returns the transaction receipt for a given inscription ID.

{
  "jsonrpc": "2.0",
  "method": "brc20_getTxReceiptByInscriptionId",
  "params": ["abc123i0"],
  "id": 1
}

brc20_getInscriptionIdByTxHash

Returns the inscription ID for a given transaction hash.

{
  "jsonrpc": "2.0",
  "method": "brc20_getInscriptionIdByTxHash",
  "params": ["0x..."],
  "id": 1
}

Precompiled Contracts

BRC2.0 includes precompiled contracts for Bitcoin-specific operations:

  • BIP322_Verifier: 0x00000000000000000000000000000000000000fe
  • BTC_Transaction: 0x00000000000000000000000000000000000000fd
  • BTC_LastSatLoc: 0x00000000000000000000000000000000000000fc
  • BTC_LockedPkScript: 0x00000000000000000000000000000000000000fb

BIP322 Verifier

Verify BIP-322 signatures. Supports P2TR, P2WPKH, and P2SH-P2WPKH single-sig addresses.

interface IBIP322_Verifier {
    function verify(
        bytes calldata pkscript,
        bytes calldata message,
        bytes calldata signature
    ) external returns (bool success);
}

BTC Transaction

Get Bitcoin transaction details.

interface IBTC_Transaction {
    function getTxDetails(bytes32 txid) external view returns (
        uint256 block_height,
        bytes32[] memory vin_txids,
        uint256[] memory vin_vouts,
        bytes[] memory vin_scriptPubKeys,
        uint256[] memory vin_values,
        bytes[] memory vout_scriptPubKeys,
        uint256[] memory vout_values
    );
}

BTC Last Sat Location

Track satoshi locations using ordinal theory.

interface IBTC_LastSatLoc {
    function getLastSatLocation(
        bytes32 txid,
        uint256 vout,
        uint256 sat
    ) external view returns (
        bytes32 last_txid,
        uint256 last_vout,
        uint256 last_sat,
        bytes memory old_pkscript,
        bytes memory new_pkscript
    );
}

BTC Locked PkScript

Calculate lock pkscripts for time-locked outputs.

interface IBTC_LockedPkscript {
    function getLockedPkscript(
        bytes calldata pkscript,
        uint256 lock_block_count
    ) external view returns (bytes memory locked_pkscript);
}

BRC20_Controller Contract

The BRC20_Controller contract is deployed at 0xc54dd4581af2dbf18e4d90840226756e9d2b3cdb and handles BRC-20 deposits, transfers, and withdrawals within the programmable module.


Error Handling

Standard JSON-RPC 2.0 errors are returned:

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32600,
    "message": "Invalid Request"
  },
  "id": 1
}