Node & Utility Methods
Not every RPC method gets a named, typed wrapper. Some are node-admin actions, side-effecty
by design, or simply too low-usage to justify a dedicated method — but they're all reachable
through call() and batch().
This is intentional, not incomplete: methods that mutate node/sync state or manage the local node itself are left untyped on purpose, so the caller has to be explicit about invoking them. A typed wrapper implies a stable, safe-to-call-anytime method — that's not true for something like resyncing masternode list state or dropping an InstantSend lock.
Typed Methods
createMultisig(nrequired, keys)
Creates a P2SH multisig address from a list of public keys. nrequired is the number of signatures needed to spend. Returns the address and its redeem script.
const result = await client.createMultisig(2, [pubkey1, pubkey2, pubkey3]);
console.log(`Address: ${result.address}`);
console.log(`Redeem script: ${result.redeemScript}`);
This creates the address but does not add it to your wallet. Use
importAddress(result.address)if you want your node to track its transactions.
signMessageWithPrivKey(privkey, message)
Signs a message with a raw WIF private key without needing an unlocked wallet. Returns a base64-encoded signature.
const signature = await client.signMessageWithPrivKey(wifKey, 'hello world');
verifyMessage(address, signature, message)
Verifies that a message was signed by the owner of a transparent Firo address. Returns true if valid.
const valid = await client.verifyMessage('a1B2c3...', signature, 'hello world');
verifyMessageWithSparkAddress(sparkAddress, signature, message)
Verifies that a message was signed by the owner of a Spark address.
const valid = await client.verifyMessageWithSparkAddress(
mySparkAddress,
signature,
'hello world',
);
Control
Basic node status and introspection.
const info = await client.call("getinfo");
const memInfo = await client.call("getmemoryinfo");
const helpText = await client.call<string>("help");
const helpForMethod = await client.call<string>("help", "getblockcount");
Mobile
const txHashes = await client.call<string[]>("getusedcoinstagstxhashes");
Evo — local-control operations
These affect your node's own sync/lock state rather than reading chain data. Call them deliberately, not as part of a routine batch of reads.
// Advances the znode sync state machine by one step
await client.call("evoznsync", "next");
// Resets znode sync progress entirely — node will need to re-sync znode list/state
await client.call("evoznsync", "reset");
// Removes a specific InstantSend lock by txid
await client.call("removeislock", "<txid>");
evoznsync reset and removeislock mutate local node state. Avoid grouping them into a
batch() call with unrelated reads — batch calls don't guarantee the kind of ordering or
isolation you'd get from sequential awaited calls, so a state-mutating call landing
mid-batch can make results from other calls in that batch harder to reason about.
Batching plain reads
Where these methods are safe to batch is alongside each other as reads:
const [info, memInfo] = await client.batch([
{ method: "getinfo", params: [] },
{ method: "getmemoryinfo", params: [] },
]);
When to reach for call() instead of a typed method
- The method is a node-admin action (sync control, ban management, wallet admin)
- The method has no stable/typed response shape in this SDK yet
- You need a method not listed anywhere in these docs —
call<T>('anyrpcmethod', ...params)reaches every RPC method the node exposes, typed or not