Skip to main content

SubmitPackage

SubmitPackage submits a package of related transactions (topologically sorted, unconfirmed parents first and the child last) for atomic validation and acceptance. Real package submission is only performed by the bitcoind backend, via the node's submitpackage RPC, which lets a zero-fee v3/TRUC parent be accepted via its fee-paying CPFP child. The btcd backend does not support submitpackage and returns an error. A neutrino light client has no mempool and cannot atomically accept a package; as a best effort it broadcasts the transactions individually and relies on a peer's 1p1c package relay, returning an unverified result (not a package-accept verdict).

Source: walletrpc/walletkit.proto

gRPC

rpc SubmitPackage (SubmitPackageRequest) returns (SubmitPackageResponse);

REST

HTTP MethodPath
POST /v2/wallet/tx/package

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 = {
raw_txs: <bytes>,
sat_per_vbyte: <uint64>,
};
client.submitPackage(request, function(err, response) {
console.log(response);
});
// Console output:
// {
// "package_msg": <string>,
// "tx_results": <TxResultsEntry>,
// "replaced_transactions": <string>,
// }

Messages

walletrpc.SubmitPackageRequest

Source: walletrpc/walletkit.proto

FieldgRPC TypeREST TypeREST Placement
raw_txs
bytes[]arraybody
sat_per_vbyte
uint64stringbody

walletrpc.SubmitPackageResponse

Source: walletrpc/walletkit.proto

FieldgRPC TypeREST Type
package_msg
stringstring
tx_results
TxResultsEntry[]object
replaced_transactions
string[]array

Nested Messages

walletrpc.SubmitPackageResponse.TxResultsEntry

FieldgRPC TypeREST Type
key
stringunknown
value
SubmitPackageTxResultunknown

walletrpc.SubmitPackageTxResult

FieldgRPC TypeREST Type
txid
stringstring
error
stringstring
other_wtxid
stringstring