idleAnvil

forge transactions · psbt lab · sighash debugger
OFFLINE · NO KEYS
Click a step to jump to it.

Value flow

bars are relative to the largest amount · click to jump

Transaction header

version · locktime · network · serialization

Header fields

Forensic controls

These unlock fields elsewhere in the workbench. Nothing here changes the transaction on its own — it changes what you are allowed to type. Turn on Forensic mode in the header to reveal the unlocked fields.

VALID — standard NON-STANDARD — consensus-valid, poorly relayed INVALID — consensus failure UNKNOWN — not enough information

At a glance

Quick start

Examples use regtest-style placeholder data. Switch the network freely — addresses re-encode.

Inputs

outpoints and the complete spending metadata each signer needs

Outputs

addresses, script templates, raw scripts and the OP_RETURN builder

Script Lab

build Bitcoin Script from opcodes, ASM or raw bytes — then send it anywhere in the transaction

Opcode palette

Insert data
Click any opcode to append it to the canvas. Drag canvas rows to reorder.

Script canvas

ASM ↔ HEX

Rendered

Derived

Send to…

Signing Data

everything an external signer needs — and nothing that could sign here

Signer code — ready to run

Generated against the digests above. Fill in your own key, run it outside the browser, and paste the JSON it prints into Finalize → Signing JSON.

PSBT Lab

create, decode, compare and export BIP174 / BIP370 partially signed transactions

Generated PSBT

Bitcoin Core helper commands

Copy-paste into bitcoin-cli. The workbench deliberately holds no RPC credentials and makes no network calls.

Decode / import

Drop a .psbt file here, or click to choose

Decoded structure

Nothing decoded yet.

Finalize

bring signatures back in, assemble scriptSig / witness, produce the broadcastable transaction

Import signed result

Signature status per input

Final transaction

Inspector

byte-by-byte decoding — hover any byte to see which field it belongs to

Byte-level view

Press Decode.

Field detail

Hover a byte.

Decoded

Structure

Validation

structural, consensus and relay-policy findings — reported, never enforced

Sighash commitment matrix

Raw Lab

the unrestricted bench: hashes, encodings, signature surgery, address conversion

Hash calculator

Signature surgery

Build DER from r and s

Address ↔ script

Byte utilities

Taproot bench

Verify a signature

Toolkit

the supporting tools you reach for while building — descriptors, keys, trees, conversions, estimates

Output descriptors (BIP380)

Extended key decoder (BIP32)

Private keys are recognised but never displayed.

Taproot script tree builder

Leaves script hex or ASM · leaf version defaults to 0xc0
Tree layout
Result

Units & number bases

Number base conversion

Locktime & sequence lab

nSequence — relative timelocks (BIP68)

Size & fee estimator

Inputs
Outputs

Public key toolkit

Merkle root calculator

Script analyser

Multisig crafter

m-of-n from public keys — every variant computed live as you type
Public keys only. This builds the receiving side of a multisig wallet — the addresses and scripts. It never asks for, derives or stores a private key, so it cannot spend anything it creates.

Address

add a public key to begin
Every character of the address depends on every bit of every key.

Cosigner public keys

tick to include · drag order via the arrows
#Public key (33 / 65 / 32 bytes hex) StatusForm

Every variant of this key set

click a card to make it the headline address

Policy

2of3
Taproot options
NUMS removes the key path, so only the m-of-n script can spend.

Checks

What changed

Edit something to start the trail.

Use it

Node

optional live chain data over an Electrum WebSocket — off unless you connect it
DISCONNECTED
The workbench is fully usable offline. Connecting only adds chain lookups — fee estimates, UTXOs, previous transactions — and an explicitly confirmed broadcast. Private keys are never involved: there are none in this page to send.

Connection

One endpoint per chain, so switching networks switches servers. These are stored locally and never sent anywhere.

The port must be a WebSocket listener. A browser cannot open a plain TCP or SSL Electrum port, so Fulcrum's tcp = (usually 50001) and ssl = ports will not work here — you need ws = <port> (or wss =) in fulcrum.conf. One instance serves one chain; the genesis hash is checked on connect and a mismatch is reported rather than silently used.

UTXO lookup

Fetch a transaction

Broadcast

Chain

not connected

Fee estimates

Connect to load fee estimates.

Server banner

Traffic log

nothing yet