### Core Lightning configuration ### see lightningd-config(5) ## General options # This enables developer mode, allowing developer options and commands to be # used. It also disables deprecated APIs; use `allow-deprecated-apis=true` to # re-enable them. #developer # Enable deprecated options, JSONRPC commands, fields, etc. It defaults to true # outside developer mode, but you should set it to false when testing to ensure # that an upgrade won't break your configuration. #allow-deprecated-apis=BOOL # Upgrades to Core Lightning often change the database: once this is done, # downgrades are not generally possible. By default, Core Lightning will exit # with an error rather than upgrade, unless this is an official released # version. If you really want to upgrade to a non-release version, you can set # this to true (or false to never allow a non-reversible upgrade!). #database-upgrade=BOOL # Deprecated features get removed slowly (over 3 releases), but sometimes # people still get surprised when they are finally removed. As long as they # haven't been actually fully removed, this option will re-enable it. Unless # we've made a horrible mistake, it's probably time to complain or fix whatever # is using the old API. It can be specified multiple times for different # features. #i-promise-to-fix-broken-api-user=FEATURE ## Bitcoin control options # Select the network parameters (bitcoin, testnet, signet, or regtest). #network=NETWORK network=testnet # The name of bitcoin-cli executable to run. #bitcoin-cli=PATH # -datadir argument to supply to bitcoin-cli(1). #bitcoin-datadir=DIR bitcoin-datadir=/var/lib/bitcoind # The RPC username for talking to bitcoind(1). #bitcoin-rpcuser=USER # The RPC password for talking to bitcoind(1). #bitcoin-rpcpassword=PASSWORD # The bitcoind(1) RPC host to connect to. #bitcoin-rpcconnect=HOST # The bitcoind(1) RPC port to connect to. #bitcoin-rpcport=PORT # The bitcoind(1) RPC client timeout in seconds. Default is set to 60 instead # of 900 to match bitcoin-retry-timeout default. When set explicitly, the # higher value of it and bitcoin-retry-timeout is used. #bitcoin-rpcclienttimeout=SECONDS # Number of seconds to keep trying a bitcoin-cli(1) command. If the command # keeps failing after this time, exit with a fatal error. #bitcoin-retry-timeout=SECONDS # Number of blocks to rescan from the current head, or absolute blockheight if # negative. This is only needed if something goes badly wrong. #rescan=BLOCKS ## Lightning daemon options # Sets the working directory. All files (except --conf and --lightning-dir on # the command line) are relative to this. #lightning-dir=DIR # Specify pid file to write to. #pid-file=PATH # What log level to print out: options are io, trace, debug, info, unusual, # broken. If SUBSYSTEM is supplied, this sets the logging level for any # subsystem (or nodeid) containing that string. If PATH is supplied, it means # this log-level filter is only applied to that `log-file`, which is useful for # creating logs to capture a specific subsystem. This option may be specified # multiple times. #log-level=LEVEL[:SUBSYSTEM][:PATH] # Prefix for all log lines: this can be customized if you want to merge logs # with multiple daemons. Usually you want to include a space at the end of # PREFIX, as the timestamp follows immediately. #log-prefix=PREFIX # Log to this file (instead of stdout). If you specify this more than once, # you'll get more than one log file. - is used to mean stdout. Sending # lightningd(8) SIGHUP will cause it to reopen each file (useful for log # rotation). #log-file=PATH # Set this to false to turn off timestamp prefixes (they will still appear in # crash log files). #log-timestamps=BOOL # Set JSON-RPC socket (or /dev/tty), such as for lightning-cli(1). #rpc-file=PATH # Set JSON-RPC socket file mode, as a 4-digit octal number. Default is 0600, # meaning only the user that launched lightningd can command it. Set to 0660 to # allow users with the same group to access the RPC as well. #rpc-file-mode=MODE rpc-file-mode=0660 # Identify the location of the wallet. This is a fully qualified data source # name, including a scheme such as sqlite3 or postgres followed by the # connection parameters. #wallet=DSN # Directory to keep the accounts.sqlite3 database file in. Defaults to # lightning-dir. #bookkeeper-dir=DIR # Identify the location of the bookkeeper data. This is a fully qualified data # source name, including a scheme such as sqlite3 or postgres followed by the # connection parameters. Defaults to sqlite3://accounts.sqlite3 in the # bookkeeper-dir. #bookkeeper-db=DSN # If set, you will be prompted to enter a password used to encrypt the # hsm_secret. Note that once you encrypt the hsm_secret this option will be # mandatory for lightningd to start. #encrypted-hsm # The port number for the GRPC plugin to listen for incoming connections; # default is not to activate the plugin at all. #grpc-port=PORTNUM # The size of the buffer used by the GRPC-plugin. This buffer stores # notifications between receiving them from lightningd and forwarding them over # grpc. If buffer overflow occurs, some notifications will not be delivered. #grpc-msg-buffer-size=NUMBER ## Lightning node customization options # Restore the node from a 32-byte secret encoded as either a codex32 secret # string or a 64-character hex string: this will fail if the hsm_secret file # exists. Your node will start the node in offline mode, for manual recovery. # The secret can be extracted from the hsm_secret using hsmtool(8). #recover=HSMSECRET # Up to 32 bytes of UTF-8 characters to tag your node. Completely silly, since # anyone can call their node anything they want. The default is an NSA-style # codename derived from your public key, but "Peter Todd" and "VAULTERO" are # good options, too. #alias=NAME # Your favorite color as a hex code. #rgb=RRGGBB # The base fee to charge for every payment which passes through. Note that # millisatoshis are a very, very small unit! Changing this value will only # affect new channels and not existing ones. If you want to change fees for # existing channels, use the RPC call lightning-setchannel(7). # Default: 1000. #fee-base=MILLISATOSHI # This is the proportional fee to charge for every payment which passes # through. As percentages are too coarse, it's in millionths, so 10000 is 1%, # 1000 is 0.1%. Changing this value will only affect new channels and not # existing ones. If you want to change fees for existing channels, use the RPC # call lightning-setchannel(7). Default: 10 (0.001%). #fee-per-satoshi=MILLIONTHS # This value defines the minimal effective channel capacity in satoshi to # accept for channel opening requests. This will reject any opening of a # channel which can't pass an HTLC of least this value. Usually this prevents a # peer opening a tiny channel, but it can also prevent a channel you open with # a reasonable amount and the peer requesting such a large reserve that the # capacity of the channel falls below this. Default: 10000. #min-capacity-sat=SATOSHI # Allow nodes which establish channels to us to set any fee they want. This may # result in a channel which cannot be closed, should fees increase, but make # channels far more reliable since we never close it due to unreasonable fees. # Note that this can be set on a per-channel basis with lightning- # setchannel(7). #ignore-fee-limits=BOOL # How long to wait before sending commitment messages to the peer: in theory # increasing this would reduce load, but your node would have to be extremely # busy node for you to even notice. #commit-time=MILLISECONDS # Networks like regtest and testnet have unreliable fee estimates: we usually # treat them as the minimum (253 sats/kw) if we can't get them. This allows # override of one or more of our standard feerates (see lightning-feerates(7)). # Up to 5 values, separated by '/' can be provided: if fewer are provided, then # the final value is used for the remainder. The values are in per-kw (roughly # 1/4 of bitcoind's per-kb values), and the order is "opening", "mutual_close", # "unilateral_close", "delayed_to_us", "htlc_resolution", and "penalty". #force-feerates=VALUES # Sets the minimal allowed HTLC value for newly created channels. If you want # to change the `htlc_minimum_msat` for existing channels, use the RPC call # lightning-setchannel(7). Default: 0. #htlc-minimum-msat=MILLISATOSHI # Sets the maximum allowed HTLC value for newly created channels. If you want # to change the `htlc_maximum_msat` for existing channels, use the RPC call # lightning-setchannel(7). Default: unset (no limit). #htlc-maximum-msat=MILLISATOSHI # Explicitly control the usage of discovered public IPs in `node_announcement` # updates. Default: 'auto' - Only if we don't have anything else to announce. # Note: You also need to open TCP port 9735 on your router towards your node. # Note: Will always be disabled if you use 'always-use-proxy'. #announce-addr-discovered=BOOL # Sets the public TCP port to use for announcing dynamically discovered IPs. # If unset, this defaults to the selected network's lightning port, which is # 9735 on mainnet. #announce-addr-discovered-port=PORT ## Lightning channel and HTLC options # As of v23.11, this is the default (and thus, the option is ignored). # Previously if you didn't specify this, channel sizes were limited to 16777215 # satoshi. #large-channels # How long we need to spot an outdated close attempt: on opening a channel we # tell our peer that this is how long they'll have to wait if they perform a # unilateral close. #watchtime-blocks=BLOCKS # The longest our funds can be delayed (ie. the longest watchtime-blocks our # peer can ask for, and also the longest HTLC timeout we will accept). If our # peer asks for longer, we'll refuse to create a channel, and if an HTLC asks # for longer, we'll refuse it. #max-locktime-blocks=BLOCKS # Confirmations required for the funding transaction when the other side opens # a channel before the channel is usable. #funding-confirms=BLOCKS # The percentage of estimatesmartfee 2/CONSERVATIVE to use for the commitment # transactions. Default: 100. #commit-fee=PERCENT # The additional feerate a channel opener adds to their preferred feerate to # lessen the odds of a disconnect due to feerate disagreement. Default: 5. #commit-feerate-offset=INTEGER # Number of HTLCs one channel can handle concurrently in each direction. Should # be between 1 and 483. Default: 30. #max-concurrent-htlcs=INTEGER # Option which limits the total amount of sats to be allowed as dust on a # channel. #max-dust-htlc-exposure-msat=MILLISATOSHI # The number of blocks between incoming payments and outgoing payments: this # needs to be enough to make sure that if we have to, we can close the outgoing # payment before the incoming, or redeem the incoming once the outgoing is # redeemed. #cltv-delta=BLOCKS # The number of blocks to allow for payments we receive: if we have to, we # might need to redeem this on-chain, so this is the number of blocks we have # to do that. #cltv-final=BLOCKS # Normally HTLC onions which contain unknown even fields are rejected. This # option specifies that this type is to be accepted and ignored. Can be # specified multuple times. #accept-htlc-tlv-type=TYPE # This is the amount of funds to keep in the wallet to close anchor channels # (which don't carry their own transaction fees). It defaults to 25000sat and # is only maintained if there are any anchor channels (or when opening an # anchor channel). This amount may be insufficient for multiple closes at once, # however. #min-emergency-msat=MILLISATOSHI ## Cleanup control options # Perform search for things to clean every SECONDS seconds (default 3600, or 1 # hour, which is usually sufficient). #autoclean-cycle=SECONDS # How old successful forwards (`settled` in listforwards `status`) have to be # before deletion (default 0, meaning never). #autoclean-succeededforwards-age=SECONDS # How old failed forwards (`failed` or `local_failed` in listforwards `status`) # have to be before deletion (default 0, meaning never). #autoclean-failedforwards-age=SECONDS # How old successful payments (`complete` in listpays `status`) have to be # before deletion (default 0, meaning never). #autoclean-succeededpays-age=SECONDS # How old failed payment attempts (`failed` in listpays `status`) have to be # before deletion (default 0, meaning never). #autoclean-failedpays-age=SECONDS # How old invoices which were paid (`paid` in listinvoices `status`) have to be # before deletion (default 0, meaning never). #autoclean-paidinvoices-age=SECONDS # How old invoices which were not paid (and cannot be) (`expired` in # listinvoices `status`) before deletion (default 0, meaning never). #autoclean-expiredinvoices-age=SECONDS ## Payment and invoice control options # Disable the multi-part payment sending support in the `pay` plugin. By # default the MPP support is enabled, but it can be desirable to disable in # situations in which each payment should result in a single HTLC being # forwarded in the network. #disable-mpp # Add a (taproot) fallback address to invoices produced by the `invoice` # command, so that invoices can also be paid onchain. #invoices-onchain-fallback ## Networking options # Set an IP address (v4 or v6) or automatic Tor address to listen on and # (maybe) announce as our node address. An empty 'IPADDRESS' is a special value # meaning bind to IPv4 and/or IPv6 on all interfaces, '0.0.0.0' means bind to # all IPv4 interfaces, '::' means 'bind to all IPv6 interfaces' (if you want to # specify an IPv6 address *and* a port, use `[]` around the IPv6 address, like # `[::]:9750`). If 'PORT' is not specified, the default port 9735 is used for # mainnet (testnet: 19735, signet: 39735, regtest: 19846). If we can determine # a public IP address from the resulting binding, the address is announced. # This option can be used multiple times to add more addresses, and its use # disables autolisten. If necessary, and 'always-use-proxy' is not specified, # a DNS lookup may be done to resolve `HOSTNAME` or `TORIPADDRESS`. #addr=[IPADDRESS[:PORT]]|autotor:TORIPADDRESS[:SERVICEPORT][/torport=TORPORT]|statictor:TORIPADDRESS[:SERVICEPORT][/torport=TORPORT][/torblob=[blob]]|HOSTNAME[:PORT] # Set an IP address or UNIX domain socket to listen to, but do not announce. A # UNIX domain socket is distinguished from an IP address by beginning with a /. # An empty 'IPADDRESS' is a special value meaning bind to IPv4 and/or IPv6 on # all interfaces, '0.0.0.0' means bind to all IPv4 interfaces, '::' means 'bind # to all IPv6 interfaces'. If 'PORT' is not specified, 9735 is used. This # option can be used multiple times to add more addresses, and its use disables # autolisten. If necessary, and 'always-use-proxy' is not specified, a DNS # lookup may be done to resolve 'HOSTNAME'. #bind-addr=[IPADDRESS[:PORT]]|SOCKETPATH|HOSTNAME[:PORT] # Set an IP (v4 or v6) address or Tor address to announce; a Tor address is # distinguished by ending in .onion. PORT defaults to 9735. Empty or wildcard # IPv4 and IPv6 addresses don't make sense here. Also, unlike the 'addr' # option, there is no checking that your announced addresses are public (e.g., # not localhost). This option can be used multiple times to add more addresses, # and its use disables autolisten. The `dns:` prefix can be used to indicate # that this hostname and port should be announced as a DNS hostname entry. # Please note that most mainnet nodes do not yet use, read, or propagate this # information correctly. #announce-addr=IPADDRESS[:PORT]|TORADDRESS.onion[:PORT]|dns:HOSTNAME[:PORT] # Do not bind to any ports, and do not try to reconnect to any peers. This can # be useful for maintenance and forensics, so is usually specified on the # command line. Overrides all addr and bind-addr options. #offline # By default, we bind (and maybe announce) on IPv4 and IPv6 interfaces if no # addr, bind-addr or announce-addr options are specified. Setting this to false # disables that. #autolisten=BOOL # Set a socks proxy to use to connect to Tor nodes (or for all connections if # always-use-proxy is set). The port defaults to 9050 if not specified. #proxy=IPADDRESS[:PORT] # Always use the proxy, even to connect to normal IP addresses (you can still # connect to Unix domain sockets manually). This also disables all DNS lookups, # to avoid leaking information. #always-use-proxy=BOOL # Disable the DNS bootstrapping mechanism to find a node by its node ID. #disable-dns # Set a Tor control password, which may be needed for autotor: to authenticate # to the Tor control port. #tor-service-password=PASSWORD ## Lightning plugins # Specify a plugin to run as part of Core Lightning. This can be specified # multiple times to add multiple plugins. Note that unless plugins themselves # specify ordering requirements for being called on various hooks, plugins will # be ordered by command line, then config file. #plugin=PATH # Specify a directory to look for plugins; all executable files not containing # punctuation (other than ., - or _) in DIRECTORY are loaded. DIRECTORY must # exist; this can be specified multiple times to add multiple directories. The # ordering of plugins within a directory is currently unspecified. #plugin-dir=DIRECTORY # This option clears all plugin, important-plugin, and plugin-dir options # preceding it, including the default built-in plugin directory. You can still # add plugin-dir, plugin, and important-plugin options following this and they # will have the normal effect. #clear-plugins # If PLUGIN contains a /, plugins with the same path as PLUGIN will not be # loaded at startup. Otherwise, no plugin with that base name will be loaded at # startup, whatever directory it is in. This option is useful for disabling a # single plugin inside a directory. You can still explicitly load plugins which # have been disabled, using lightning-plugin(7) start. #disable-plugin=PLUGIN # Specify a plugin to run as part of Core Lightning. This can be specified # multiple times to add multiple plugins. Plugins specified via this option are # considered so important, that if the plugin stops for any reason (including # via lightning-plugin(7) stop), Core Lightning will also stop running. This # way, you can monitor crashes of important plugins by simply monitoring if # Core Lightning terminates. Built-in plugins, which are installed with # lightningd(8), are automatically considered important. #important-plugin=PLUGIN