What you need
1
The vault's address
From your Recovery Kit, on the vault’s page. It is an ordinary
r... address.2
Enough owners' keys to reach the quorum
Each signer is an owner’s ordinary XRP wallet key — not a separate cosigner key. Each owner
derives theirs from their own recovery phrase at the index they joined with, as described on
XRP Ledger.
3
An XRPL node and xrpl.js
npm install xrpl. A public node such as wss://xrplcluster.com is enough; nothing here needs a
node of your own.Read the signer list from the chain
Do this first. It is authoritative — the kit records what the vault was configured with, the chain holds what it actually has.Turn a phrase-derived key into a signing wallet
Deriving onm/44'/144'/0'/0/{index} gives you a public and a private key, not a family seed. That
is the form Wallet takes directly:
Wallet.fromSeed(seed) is equivalent.
Move the funds
1
Build the transaction once, sized for the number of signatures
A multi-signed transaction pays a fee of
(1 + number of signatures) × base fee. Passing the
signer count to autofill is what sets it; the default would be too low and the transaction would
be rejected.2
Have each owner sign that exact object
The second argument, Owners can do this separately, on their own machines, and send only the resulting
true, is what makes it a multi-signature rather than a normal one.tx_blob. A blob
is useless on its own and carries no private key.3
Combine and submit
What you cannot do
- Empty the account. The XRP Ledger holds a reserve that cannot be sent. Moving it requires deleting the account, which has its own conditions.
- Send to an exchange without a destination tag. A payment that needs one and arrives without it is credited to nobody.
Changing the signer list
The same procedure with aSignerListSet transaction in place of the Payment. It is signed by a
quorum of the current signer list, exactly like a payment, because the master key is off.