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 two ways of specifying a template: Either by passing in a PSBT with at least one output declared or by passing in a raw TxTemplate message.

If there are no inputs specified in the template, coin selection is performed automatically. 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.

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>,
target_conf: <uint32>,
sat_per_vbyte: <uint64>,
account: <string>,
min_confs: <int32>,
spend_unconfirmed: <bool>,
};
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
target_conf
uint32integerbody
sat_per_vbyte
uint64stringbody
account
stringstringbody
min_confs
int32integerbody
spend_unconfirmed
boolbooleanbody

walletrpc.FundPsbtResponse

Source: walletrpc/walletkit.proto

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

Nested Messages

walletrpc.TxTemplate

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

lnrpc.OutPoint

FieldgRPC TypeREST Type
txid_bytes
bytesstring
txid_str
stringstring
output_index
uint32integer

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