blitz_api/scripts/test_env.nu
2026-02-03 11:06:06 +01:00

243 lines
7.2 KiB
Text

const CORE_USER = "nixblitz"
const CORE_PASSWORD = "nixblitz"
const CORE_RAW_TX_ADDRESS = "tcp://127.0.0.1:28332"
const CORE_RAW_BLOCK_ADDRESS = "tcp://127.0.0.1:28333"
const BASE_DIR = "test_env_data"
const CORE_DIR = $"($BASE_DIR)/bitcoin"
const LND_DIR = $"($BASE_DIR)/lnd"
const CLN_DIR = $"($BASE_DIR)/cln"
const ENV_FILE = '
BAPI_JWT_SECRET=please_please_update_me_please
BAPI_JWT_ALGORITHM=HS256
BAPI_JWT_EXPIRY_TIME=3600000
BAPI_ROOT_PATH = "/"
BAPI_LOG_LEVEL=INFO
BAPI_ENABLE_LOCAL_COOKIE_AUTH = true
BAPI_PLATFORM={{platform}}
BAPI_RB_SHELL_SCRIPT_PATH={{schell_script_path}}
BAPI_GATHER_HW_INFO_INTERVAL = 2
BAPI_CPU_USAGE_AVERAGING_PERIOD = 0.5
BAPI_GATHER_LN_INFO_INTERVAL = 5.0
BAPI_NETWORK=regtest
BAPI_BITCOIND_ADDRESS=127.0.0.1
BAPI_BITCOIND_PORT_RPC=18443
BAPI_BITCOIND_ZMQ_BLOCK_RPC="hashblock"
BAPI_BITCOIND_ZMQ_BLOCK_PORT=28333
BAPI_BITCOIND_USER=nixblitz
BAPI_BITCOIND_RPC_PW=nixblitz
BAPI_LN_NODE={{node_type}}
BAPI_LND_MACAROON={{lnd_macaroon}}
BAPI_LND_CERT={{lnd_cert}}
BAPI_LND_GRPC_IP=127.0.0.1
BAPI_LND_GRPC_PORT=10009
BAPI_CLN_JRPC_PATH={{cln_jrpc_path}}
BAPI_CLN_GRPC_CERT={{cln_cert}}
BAPI_CLN_GRPC_KEY={{cln_grpc_key}}
BAPI_CLN_GRPC_CA={{cln_grpc_ca}}
BAPI_CLN_GRPC_IP=127.0.0.1
BAPI_CLN_GRPC_PORT=9537
BAPI_NATIVE_LOGIN_PASSWORD=nixblitz
BAPI_REDIS_URL=redis://127.0.0.1:6379/0
BAPI_APP_STATUS_UPDATE_INTERVAL_MIN = 30
BAPI_CACHE_TTL_SECONDS = 2100
BAPI_LOCK_TTL_SECONDS = 300
'
# init the bitcon core daemon in regtest mode
def init_env [] {
print "Creating wallet \"testwallet\", if not created yet..."
bitcli createwallet testwallet out+err>| ignore
print "Loading wallet \"testwallet\", if not loaded yet..."
bitcli loadwallet testwallet out+err>| ignore
}
# Generates a '.env' file for use with
# Blitz Api using the local node.
#
# Required: node options are "lnd" and "cln".
#
# Platform options are "native_python", "raspiblitz" and "fake_blitz".
# If no platform is specified, "native_python" is used.
#
# NOTE: Run this in the directory where the
# data folder is located (test_env_data)
# as it'll be relative to that path
#
# Example:
# reg-mk-api-env lnd raspiblitz | save .env
def "reg-mk-api-env" [
node: string = "lnd", # The node to use
platform: string = "native_python" # The platform to use
] {
let folders = (ls | where type == "dir" | get name)
if not ($folders | any {|f| $f == $BASE_DIR}) {
print $"Error: ($BASE_DIR) is not a subfolder of the current working directory."
return
}
if ($node != "cln" and $node != "lnd") {
print $"node must either be \"lnd\" or \"cln\". Got: ($node)"
return
}
if ($platform != "native_python"
and $platform != "raspiblitz"
and $platform != "fake_blitz") {
print "node must either be \"native_python\", \"raspiblitz\" or \"fake_blitz\". Got: ($platform)"
return
}
let platform_value = (if $platform == "raspiblitz" or $platform == "fake_blitz" { "raspiblitz" } else { "native_python" })
let shell_script_path = (if $platform == "raspiblitz" { "/home/admin" } else if $platform == "fake_blitz" { "./scripts/fake_blitz_scripts" } else { "/dev/null" })
let replacements = {
"{{platform}}": $platform_value,
"{{schell_script_path}}": $shell_script_path,
"{{node_type}}": (if $node == "lnd" { "lnd_grpc" } else { "cln_jrpc" }),
"{{lnd_cert}}": $"(pwd)/($LND_DIR)/tls.cert",
"{{lnd_macaroon}}": $"(pwd)/($LND_DIR)/data/chain/bitcoin/regtest/admin.macaroon",
"{{cln_jrpc_path}}": $"(pwd)/($CLN_DIR)/regtest/lightning-rpc",
"{{cln_cert}}": $"(pwd)/($CLN_DIR)/regtest/lightning-rpc",
}
let keys = ($replacements | transpose key value | each {|f| $f.key} | collect)
mut file_content = $ENV_FILE
for key in $keys {
$file_content = $file_content | str replace $key ($replacements | get $key)
}
$file_content
}
# regtest command for bitcoin core
def bitcli --wrapped [...args] {
let coreDir = $"(pwd)/($CORE_DIR)"
bitcoin-cli -regtest --datadir=($coreDir) ...$args
}
# short for lncli with all connection settings applied
def lndcli --wrapped [...args] {
(
lncli --lnddir=(pwd)/($LND_DIR)
--chain "bitcoin"
--network "regtest"
...$args
)
}
# short for lightning-cli with all connection settings applied
def clncli --wrapped [...args] {
let cwd = readlink -f .
(
lightning-cli
--regtest
--lightning-dir=(pwd)/($CLN_DIR)
--rpc-file=(pwd)/($CLN_DIR)/regtest/lightning-rpc
...$args
)
}
# Sends a transaction using the default loaded wallet
def bitsend [
address: string, # The address to send the funds to
amount: float = 15.0 # The amount of funds to send in Bitcoin
] {
bitcli -named -regtest sendtoaddress address=($address) amount=($amount) fee_rate=100
}
# Generates regtest blocks
def bitgen [
num_blocks: int=10 # The number of blocks to generate
] {
bitcli -generate $num_blocks
}
# Get the pubkey of the given node
def regpubkey [
node: string # The node to get the pubkey of ("lnd" or "cln")
] {
match $node {
"cln" => { clncli getinfo | from json | echo $in.id }
"lnd" => { lndcli getinfo | from json | echo $in.identity_pubkey }
_ => { print "node must either be \"lnd\" or \"cln\"." }
}
}
# Generate a new onchain address for the given node
def regaddress [
node: string # The node to generate an address for ("lnd" or "cln")
] {
match $node {
"cln" => { clncli newaddr | from json | $in.bech32 }
"lnd" => { lndcli newaddress np2wkh | from json | $in.address }
_ => { print "node must either be \"lnd\" or \"cln\"." }
}
}
# List funds in the given node
def reglistfunds [
node: string # The node to list funds for ("lnd" or "cln")
] {
match $node {
"cln" => { clncli listfunds | from json | echo $in }
"lnd" => {
let channel_balance = lndcli channelbalance | from json
let wallet_balance = lndcli walletbalance | from json
echo {
channel: $channel_balance,
onchain: $wallet_balance
}
}
_ => { print "node must either be \"lnd\" or \"cln\"." }
}
}
# open a channel `to` the other node
def regopenchannel [
to: string, # The node to open a channel to ("lnd" or "cln"). From will be the "other" node.
local_amount: int = 10_000_000, # The amount in satoshis to commit to the channel
push_amount: int = 5_000_000 # The amount in satoshis to push to the remote node as part of the channel opening
] {
match $to {
"cln" => {
let k = regpubkey cln
lndcli connect $"($k)@127.0.0.1:9736"
lndcli openchannel --node_key $k --local_amt $local_amount --push_amt $push_amount
}
"lnd" => {
let k = regpubkey lnd
clncli fundchannel $"($k)@127.0.0.0:9735" $local_amount
}
_ => { print "to must either be \"lnd\" or \"cln\"." }
}
}
# fund all nodes with onchain testnet coins
def regfundnodes [
amount: float = 15.0 # The amount of funds to send to the nodes
] {
let cln = (regaddress "cln")
let lnd = (regaddress "lnd")
bitsend $cln $amount
bitsend $lnd $amount
}
# generate a syntetic history by making random payments between nodes
def regmakehistory [
rounds: int = 100 # How many rounds of history you want to make
] {
for i in 0..$rounds {
let from = (random int 0..3)
mut to = (random int 0..3)
while $from == $to {
$to = (random int 0..3)
}
}
}