Skip to main content

FundPsbt

FundPsbt creates a fully populated PSBT that contains enough inputs to fund the outputs specified in the template. There are three ways a user can specify what we call the template (a list of inputs and outputs to use in the PSBT): Either as a PSBT packet directly with no coin selection (using the legacy "psbt" field), a PSBT with advanced coin selection support (using the new "coin_select" field) or as a raw RPC message (using the "raw" field). The legacy "psbt" and "raw" modes, the following restrictions apply:

  1. If there are no inputs specified in the template, coin selection is performed automatically.
  2. If the template does contain any inputs, it is assumed that full coin selection happened externally and no additional inputs are added. If the specified inputs aren't enough to fund the outputs with the given fee rate, an error is returned.

The new "coin_select" mode does not have these restrictions and allows the user to specify a PSBT with inputs and outputs and still perform coin selection on top of that. For all modes this RPC requires any inputs that are specified to be locked by the user (if they belong to this node in the first place).

After either selecting or verifying the inputs, all input UTXOs are locked with an internal app ID.

NOTE: If this method returns without an error, it is the caller's responsibility to either spend the locked UTXOs (by finalizing and then publishing the transaction) or to unlock/release the locked UTXOs in case of an error on the caller's side.

Source: walletrpc/walletkit.proto

gRPC

rpc FundPsbt (FundPsbtRequest) returns (FundPsbtResponse);

REST

HTTP MethodPath
POST /v2/wallet/psbt/fund

Code Samples

const fs = require('fs');
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

const GRPC_HOST = 'localhost:10009'
const MACAROON_PATH = 'LND_DIR/data/chain/bitcoin/regtest/admin.macaroon'
const TLS_PATH = 'LND_DIR/tls.cert'

const loaderOptions = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
const packageDefinition = protoLoader.loadSync(['lightning.proto', 'walletrpc/walletkit.proto'], loaderOptions);
const walletrpc = grpc.loadPackageDefinition(packageDefinition).walletrpc;
process.env.GRPC_SSL_CIPHER_SUITES = 'HIGH+ECDSA';
const tlsCert = fs.readFileSync(TLS_PATH);
const sslCreds = grpc.credentials.createSsl(tlsCert);
const macaroon = fs.readFileSync(MACAROON_PATH).toString('hex');
const macaroonCreds = grpc.credentials.createFromMetadataGenerator(function(args, callback) {
let metadata = new grpc.Metadata();
metadata.add('macaroon', macaroon);
callback(null, metadata);
});
let creds = grpc.credentials.combineChannelCredentials(sslCreds, macaroonCreds);
let client = new walletrpc.WalletKit(GRPC_HOST, creds);
let request = {
psbt: <bytes>,
raw: <TxTemplate>,
coin_select: <PsbtCoinSelect>,
target_conf: <uint32>,
sat_per_vbyte: <uint64>,
sat_per_kw: <uint64>,
account: <string>,
min_confs: <int32>,
spend_unconfirmed: <bool>,
change_type: <ChangeAddressType>,
coin_selection_strategy: <CoinSelectionStrategy>,
max_fee_ratio: <double>,
};
client.fundPsbt(request, function(err, response) {
console.log(response);
});
// Console output:
// {
// "funded_psbt": <bytes>,
// "change_output_index": <int32>,
// "locked_utxos": <UtxoLease>,
// }

Messages

walletrpc.FundPsbtRequest

Source: walletrpc/walletkit.proto

FieldgRPC TypeREST TypeREST Placement
psbt
bytesstringbody
raw
TxTemplateobjectbody
coin_select
PsbtCoinSelectobjectbody
target_conf
uint32integerbody
sat_per_vbyte
uint64stringbody
sat_per_kw
uint64stringbody
account
stringstringbody
min_confs
int32integerbody
spend_unconfirmed
boolbooleanbody
change_type
ChangeAddressTypestringbody
coin_selection_strategy
CoinSelectionStrategystringbody
max_fee_ratio
doublenumberbody

walletrpc.FundPsbtResponse

Source: walletrpc/walletkit.proto

FieldgRPC TypeREST Type
funded_psbt
bytesstring
change_output_index
int32integer
locked_utxos
UtxoLease[]array

Nested Messages

lnrpc.OutPoint

FieldgRPC TypeREST Type
txid_bytes
bytesstring
txid_str
stringstring
output_index
uint32integer

walletrpc.PsbtCoinSelect

FieldgRPC TypeREST Type
psbt
bytesstring
existing_output_index
int32integer
add
boolboolean

walletrpc.TxTemplate

FieldgRPC TypeREST Type
inputs
OutPoint[]array
outputs
OutputsEntry[]object

walletrpc.TxTemplate.OutputsEntry

FieldgRPC TypeREST Type
key
stringunknown
value
uint64unknown

walletrpc.UtxoLease

FieldgRPC TypeREST Type
id
bytesstring
outpoint
OutPointobject
expiration
uint64string
pk_script
bytesstring
value
uint64string

Enums

lnrpc.CoinSelectionStrategy

NameNumber
STRATEGY_USE_GLOBAL_CONFIG
0
STRATEGY_LARGEST
1
STRATEGY_RANDOM
2

walletrpc.ChangeAddressType

NameNumber
CHANGE_ADDRESS_TYPE_UNSPECIFIED
0
CHANGE_ADDRESS_TYPE_P2TR
1