A Miniscript-based high-level scripting language for Bitcoin contracts
npm install minsc



!Pull Requests Welcome
Minsc is a high-level scripting language for expressing Bitcoin Script spending conditions.
It is based on the Miniscript Policy language,
with additional features and syntactic sugar sprinkled on top, including variables, functions, infix notation, human-readable times and more.
Documentation & live playground are available on the website: https://min.sc
Support development: ⛓️ on-chain or ⚡ lightning via BTCPay
- A user and a 2FA service need to sign off, but after 90 days the user alone is enough
``hack`
pk(user_pk) && (pk(service_pk) || older(90 days))
:arrow_forward: Try it live
- Traditional preimage-based HTLC
`hack
$redeem = pk(A) && sha256(H);
$refund = pk(B) && older(10);
$redeem || $refund
`
:arrow_forward: Try it live
- Liquid-like federated pegin, with emergency recovery keys that become active after a timeout
`hack
$federation = 4 of [ pk(A), pk(B), pk(C), pk(D), pk(E) ];
$recovery = 2 of [ pk(F), pk(G), pk(I) ];
$timeout = older(3 months);
likely@$federation || ($timeout && $recovery)
`
:arrow_forward: Try it live
- The BOLT #3 received HTLC policy
`hack
fn bolt3_htlc_received($revoke_pk, $local_pk, $remote_pk, $secret, $delay) {
$success = pk($local_pk) && hash160($secret);
$timeout = older($delay);
pk($revoke_pk) || (pk($remote_pk) && ($success || $timeout))
}
bolt3_htlc_received(A, B, C, H1, 2 hours)
`
:arrow_forward: Try it live
- Advanced 2FA where the user has a 2-of-2 setup and the service provider is a 3-of-4 federation
`hack
fn two_factor($user, $provider, $delay) =
$user && (likely@$provider || older($delay));
$user = pk(desktop_pk) && pk(mobile_pk);
$providers = [ pk(A), pk(B), pk(C), pk(D) ];
two_factor($user, 3 of $providers, 4 months)
`
:arrow_forward: Try it live
More examples are available on https://min.sc.
Install Rust and:
`bash
$ cargo install minsc
Using the Rust API:
`rust
use minsc::{parse, run};let code = "pk(A) && older(1 week)";
let ast = parse(code).unwrap();
let result = run(ast).unwrap();
let policy = result.into_policy().unwrap();
println!("{}", policy);
// Also available: into_miniscript() and into_desc()
`Full documentation for the Rust API is available here.
JavaScript WASM package
Install with
npm install minsc and:`js
import { run } from 'minsc'const policy = run('pk(A) && older(1 week)')
const miniscript = run('miniscript(pk(A) && older(1 week))')
const descriptor = run('wsh(miniscript(pk(A) && older(1 week)))')
const address = run('address(wsh(miniscript(pk(A) && older(1 week))))')
const address2 = run('address(pk(A) && older(1 week))')
console.log({ policy, miniscript, descriptor, address, address2 })
``