mirror of
https://github.com/fusion44/blitz_api.git
synced 2026-08-13 11:52:45 +02:00
feat: add a devenv.sh environment
This commit is contained in:
parent
1127b60904
commit
46285b9d47
7 changed files with 424 additions and 0 deletions
3
.envrc
Normal file
3
.envrc
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
source_url "https://raw.githubusercontent.com/cachix/devenv/82c0147677e510b247d8b9165c54f73d32dfd899/direnvrc" "sha256-7u4iDd1nZpxL4tCzmPG0dQgC5V+/44Ba+tHkPob1v2k="
|
||||
|
||||
use devenv
|
||||
11
.gitignore
vendored
11
.gitignore
vendored
|
|
@ -8,5 +8,16 @@ docker/.env
|
|||
.venv
|
||||
pyrightconfig.json
|
||||
|
||||
test_env_data
|
||||
|
||||
# Nix
|
||||
result
|
||||
# Devenv
|
||||
.devenv*
|
||||
devenv.local.nix
|
||||
|
||||
# direnv
|
||||
.direnv
|
||||
|
||||
# pre-commit
|
||||
.pre-commit-config.yaml
|
||||
|
|
|
|||
119
devenv.lock
Normal file
119
devenv.lock
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
{
|
||||
"nodes": {
|
||||
"devenv": {
|
||||
"locked": {
|
||||
"dir": "src/modules",
|
||||
"lastModified": 1739444039,
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"rev": "1235cd13f47df6ad19c8a183c6eabc1facb7c399",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"dir": "src/modules",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1733328505,
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"git-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1737465171,
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gitignore": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"git-hooks",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709087332,
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1733477122,
|
||||
"owner": "cachix",
|
||||
"repo": "devenv-nixpkgs",
|
||||
"rev": "7bd9e84d0452f6d2e63b6e6da29fe73fac951857",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"ref": "rolling",
|
||||
"repo": "devenv-nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1739451785,
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "1128e89fd5e11bb25aedbfc287733c6502202ea9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"devenv": "devenv",
|
||||
"git-hooks": "git-hooks",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||
"pre-commit-hooks": [
|
||||
"git-hooks"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
99
devenv.nix
Normal file
99
devenv.nix
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
inputs,
|
||||
...
|
||||
}: let
|
||||
dataDir = "$(pwd)/test_env_data";
|
||||
bitcoinConfigText = builtins.readFile ./scripts/bitcoin_regtest.conf;
|
||||
bitcoinDataDir = "${dataDir}/bitcoin";
|
||||
bitcoinConfFilePath = "${bitcoinDataDir}/bitcoin.conf";
|
||||
lndDataDir = "${dataDir}/lnd";
|
||||
clnDataDir = "${dataDir}/cln";
|
||||
|
||||
pkgs-unstable = import inputs.nixpkgs-unstable {system = pkgs.stdenv.system;};
|
||||
in {
|
||||
# https://devenv.sh/basics/
|
||||
env.GREET = "devenv";
|
||||
|
||||
# https://devenv.sh/packages/
|
||||
packages = with pkgs; [
|
||||
stdenv.cc.cc
|
||||
poetry
|
||||
pyright
|
||||
alejandra
|
||||
statix
|
||||
ruff
|
||||
ruff-lsp
|
||||
redis
|
||||
nushell
|
||||
|
||||
pkgs-unstable.bitcoind
|
||||
pkgs-unstable.lnd
|
||||
pkgs-unstable.clightning
|
||||
];
|
||||
|
||||
# https://devenv.sh/processes/
|
||||
processes = {
|
||||
bitcoind.exec = ''
|
||||
if [ ! -d ${dataDir} ]; then
|
||||
echo "Setup Script: Creating directory ${bitcoinDataDir}"
|
||||
mkdir -p ${bitcoinDataDir}
|
||||
echo "Setup Script: Creating directory ${lndDataDir}"
|
||||
mkdir -p ${lndDataDir}
|
||||
echo "Setup Script: Creating directory ${clnDataDir}"
|
||||
mkdir -p ${clnDataDir}
|
||||
fi
|
||||
|
||||
if [ -f ${bitcoinConfFilePath} ]; then
|
||||
echo "Setup Script: Deleting ${bitcoinConfFilePath}"
|
||||
rm ${bitcoinConfFilePath}
|
||||
fi
|
||||
|
||||
touch ${bitcoinConfFilePath}
|
||||
echo "${bitcoinConfigText}" >> ${bitcoinConfFilePath}
|
||||
bitcoind -regtest -datadir=${bitcoinDataDir} -conf=${bitcoinConfFilePath}
|
||||
'';
|
||||
lnd.exec = ''
|
||||
sleep 3
|
||||
lnd --lnddir=${lndDataDir} \
|
||||
--bitcoin.node=bitcoind \
|
||||
--bitcoin.regtest \
|
||||
--bitcoind.dir=${bitcoinDataDir}
|
||||
'';
|
||||
cln.exec = ''
|
||||
sleep 3
|
||||
lightningd \
|
||||
--regtest \
|
||||
--lightning-dir=${clnDataDir} \
|
||||
--bitcoin-datadir=${bitcoinDataDir}
|
||||
'';
|
||||
};
|
||||
|
||||
# https://devenv.sh/services/
|
||||
services = {
|
||||
redis.enable = true;
|
||||
};
|
||||
|
||||
# https://devenv.sh/tasks/
|
||||
# tasks = {
|
||||
# "myproj:setup".exec = "mytool build";
|
||||
# "devenv:enterShell".after = [ "myproj:setup" ];
|
||||
# };
|
||||
|
||||
# enterShell = ''
|
||||
# nu -e 'source scripts/test_env.nu; init_env'
|
||||
# '';
|
||||
|
||||
# https://devenv.sh/tests/
|
||||
enterTest = ''
|
||||
echo "Running tests"
|
||||
git --version | grep --color=auto "${pkgs.git.version}"
|
||||
'';
|
||||
|
||||
# https://devenv.sh/pre-commit-hooks/
|
||||
# pre-commit.hooks.shellcheck.enable = true;
|
||||
|
||||
# See full reference at https://devenv.sh/reference/options/
|
||||
}
|
||||
16
devenv.yaml
Normal file
16
devenv.yaml
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
|
||||
inputs:
|
||||
nixpkgs:
|
||||
url: github:cachix/devenv-nixpkgs/rolling
|
||||
nixpkgs-unstable:
|
||||
url: github:nixos/nixpkgs/nixpkgs-unstable
|
||||
# If you're using non-OSS software, you can set allowUnfree to true.
|
||||
# allowUnfree: true
|
||||
|
||||
# If you're willing to use a package that's vulnerable
|
||||
# permittedInsecurePackages:
|
||||
# - "openssl-1.1.1w"
|
||||
|
||||
# If you have more than one devenv you can merge them
|
||||
#imports:
|
||||
# - ./backend
|
||||
32
scripts/bitcoin_regtest.conf
Normal file
32
scripts/bitcoin_regtest.conf
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
# Generated by https://jlopp.github.io/bitcoin-core-config-generator/
|
||||
|
||||
# This config should be placed in following path:
|
||||
# ~/.bitcoin/bitcoin.conf
|
||||
|
||||
# [rpc]
|
||||
# Accept command line and JSON-RPC commands.
|
||||
server=1
|
||||
# Location of the RPC auth cookie
|
||||
rpccookiefile=.cookie_ext
|
||||
rpcuser=nixblitz
|
||||
rpcpassword=nixlibtz
|
||||
|
||||
# [chain]
|
||||
# chain=regtest
|
||||
|
||||
# [debug]
|
||||
# Enable RPC logging
|
||||
debug=rpc
|
||||
# Log IP Addresses in debug output.
|
||||
logips=1
|
||||
|
||||
# [zeromq]
|
||||
# Enable publishing of raw block hex to <address>.
|
||||
zmqpubrawblock=tcp://127.0.0.1:28332
|
||||
# Enable publishing of raw transaction hex to <address>.
|
||||
zmqpubrawtx=tcp://127.0.0.1:28333
|
||||
|
||||
[regtest]
|
||||
# Bind to given address to listen for JSON-RPC connections. This option is ignored unless -rpcallowip is also passed. Port is optional and overrides -rpcport. Use [host]:port notation for IPv6. This option can be specified multiple times. (default: 127.0.0.1 and ::1 i.e., localhost)
|
||||
rpcbind=127.0.0.1
|
||||
rpcallowip=127.0.0.1
|
||||
144
scripts/test_env.nu
Normal file
144
scripts/test_env.nu
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
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"
|
||||
|
||||
# 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
|
||||
}
|
||||
|
||||
# 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 = (clnpubkey)
|
||||
lndcli openchannel $k --local_amt $local_amount --push_amt $push_amount
|
||||
}
|
||||
"lnd" => {
|
||||
let k = (lndpubkey)
|
||||
clncli fundchannel $k $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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue