Blockstream Enterprise Custody SDK
Investor & Venue Guide

Wallet registration

Wallet registration creates a wallet entry in AMP2 and returns a wallet ID. The page explains descriptor construction, registration behavior, wallet strategy, and next steps.

Registering a wallet descriptor creates a wallet entry in AMP2 and returns a wallet ID (WID) that is used in all subsequent operations.

Build a descriptor

An AMP2 wallet descriptor is a 2-of-2 confidential multisig combining your key and AMP2's server key:

let descriptor_str = "ct(elip151,elwsh(multi(2,[b805d768/87h/1h/0h]tpubDCYEgnLyCH2okSittQNNB8JHLwPgmoEAoKcMrJDHP9dFVamsadPAFJQ77C1htgR8ksie3VksLXoryng9AUaPZSF8FwTwEv6CaHp8j2YCrds/<0;1>/*,[c67f5991/87'/1'/0']tpubDC4SUtWGWcMQPtwjgQQ4DYnFmAYhiKxw3f3KKCvMGT9sojZNvHsQ4rVW6nQeCPtk4rLAxGKeuAzMmBmH92X3HDgLho3nRWpvuJrpCmYgeQj/<0;1>/*)))";

Descriptor components

PartMeaning
ct(elip151)Confidential Transaction blinding via ELIP-151
elwsh(multi(2,...))Elements witness script hash, 2-of-2 multisig
First tpub with [b805d768/...]AMP2 server's keyorigin xpub
Second tpub with [c67f5991/...]Your keyorigin xpub
/<0;1>/*Receive (0) and change (1) derivation
#6j2fne4sChecksum

You can construct the descriptor using the AMP2 Rust client:

let amp2 = Amp2::new(keyorigin_xpub.to_string(), amp_url.to_string()).unwrap();
let descriptor = amp2.descriptor_from_str(keyorigin_xpub).unwrap();
let desc_str = descriptor.descriptor().to_string();

Or parse an existing descriptor string:

use elements_miniscript::ConfidentialDescriptor;

let descriptor = ConfidentialDescriptor::from_str(descriptor_str).unwrap();

Register

let registration = amp2.register(descriptor).await.unwrap();
assert!(!registration.wid.is_empty());
println!("Wallet registered: wid={}", registration.wid);

The wid is deterministically derived from the descriptor. Store it for all future operations.

Registration behavior

ScenarioResult
New descriptorCreated, returns new WID
Same descriptor, same blinding keysReturns existing WID (idempotent)
Same descriptor, different blinding keys403 Forbidden
Invalid descriptor formatValidation error

Idempotent registration means it is safe to call register on startup without worrying about duplicate entries.

What happens after registration

Once a wallet is registered:

  • The issuer can see it in their wallet list.
  • The issuer can include it as a recipient in send operations.
  • The issuer can assign restriction policies to it.
  • Balance and UTXO tracking begins for this descriptor.

The wallet needs to be whitelisted (via restriction groups) before the issuer can send restricted assets to it.

Multiple wallets

A venue may register multiple wallets for different purposes:

  • Omnibus wallet: holds assets for all venue clients.
  • Per client wallets: separate wallets for individual clients (better isolation, more management overhead).
  • Hot/cold separation: active trading wallet and cold storage wallet.

Next steps

On this page