§ 04

§ 04 · Keys & addresses

Derivation paths

The street address of every key in your wallet

A derivation path is a list of child numbers that leads from the master key to one particular key. Pearl’s first receive address lives at:

m/86'/808276'/0'/0/0

Read it left to right like a street address: master, then purpose, coin, account, branch, house number. Every Pearl wallet walks the same path, which is why the same 12 words give the same addresses in Oyster, oystercli and the desktop wallet.

Try it

Type a phrase and choose a path level. The tool shows each node of the tree and the address at the end.

Seed words

12 words → seed → keys → prl1 addresses, the way Oyster does it

Never type a real seed phrase into any website, this one included. Anyone with your 12 words owns your coins. This tool is for learning: use the test words or a phrase it generates, and never send funds to these addresses.

Network
Hardened derivation

Valid: 12 known words and the checksum matches.

  1. 1

    Words → bits 11 bits each

    Each word is a position in a list of 2,048 (2¹¹). 12 × 11 = 132 bits: 128 random bits, then 4 bits of checksum.

    1. 1abandon 00000000000
    2. 2abandon 00000000000
    3. 3abandon 00000000000
    4. 4abandon 00000000000
    5. 5abandon 00000000000
    6. 6abandon 00000000000
    7. 7abandon 00000000000
    8. 8abandon 00000000000
    9. 9abandon 00000000000
    10. 10abandon 00000000000
    11. 11abandon 00000000000
    12. 12about 00000000011

    Entropy (128 bits): 0000000000000000…00000000 · checksum = first 4 bits of SHA-256(entropy) = 0011, matching the last 4 bits of word 12.

  2. 2

    Seed 64 bytes

    PBKDF2-HMAC-SHA512(words, “mnemonic”, 2,048 rounds)

    5eb00bbd dcf06908 4889a8ab 91555681 65f5c453 ccb85e70 811aaed6 f6da5fc1 9a5ac40b 389cd370 d086206d ec8aa6c4 3daea669 0f20ad3d 8d48b2d2 ce9e38e4

    2,048 rounds make each guess slow on purpose. Pearl wallets use no extra passphrase.

  3. 3

    Master key m

    HMAC-SHA512(“Bitcoin seed”, seed) → private key ‖ chain code

    private key
    1837c1be8e2995ec11cda2b066151be2cfb48adf9e47b151d46adab3a21cdf67
    chain code
    7923408dadd3c7b56eed15567707ae5e5dca089de972e07f3b860450e2a3b70e
    fingerprint
    73c5da0a

    The HMAC key is still the text “Bitcoin seed”, unchanged from Bitcoin.

  4. 4

    Down the path m/86'/808276'/0'/0/i

    1. mmaster73c5da0a
    2. 86'purpose: BIP-86 Taproot4e83b613
    3. 808276'coin: “PRL” as decimal ASCIIf124e0d0
    4. 0'account 073bf7af8
    5. 0receive (1 = change)edfa853f

    An apostrophe means hardened: the child is made from the parent’s private key, so the parent’s public key can’t derive it, and a leaked child key can’t expose the parent.

  5. 5

    Account key zpub

    The public half of m/86'/808276'/0', as Oyster shows it (zprv for the private half). It can make every address without being able to spend.

    zpub6s66goCpFBSqGDZyyD6a1Xf8C5TseQYcPFQNpjMzFeTCZpZD6ShaEzAKqv8tDiv81N1RmPyRTu1D65iQv59c7wHZyCbQmnaARE7P6UFNJeG

  6. 6

    First receive addresses BIP-86 Taproot

    1. /0/0prl1pr6yuq8u2r95wjzzgpdy8cpnncpl7l8zgy6x5q0367pnc53s2famqg7pt74
    2. /0/1prl1pyx3nlscz8rvsxqhcjtyqt2g5szuk9ss7m5saszu3afwwhvn9zp2sz62rhm
    3. /0/2prl1pfrfqcvcmghjc3mpsazm9p9ktttyuewzlfmn40dzkwh0muejgkr3sfx9jwd
    4. /0/3prl1prmdvgxfgzmqzq5dj58enw6y7c55wpsfdpr0af7t79x65z6gmms8q4qa93j
    5. /0/4prl1pc9xyu484gw5wsnq7hg00733jlcr4ethphyxmavynyl8me0q7ec7q6qu3wx

Oyster and standard BIP-32 give the same addresses for this phrase, as for almost every phrase. Try “A phrase where Oyster differs”.

Runs in your browser · nothing is sent or saved src/lib/hd.ts · keys.ts · bech32m.ts

What does each level mean?

m/86'/808276'/0'/0/i on Pearl mainnet
Field Size Description
m – The master key, made from the seed with HMAC-SHA512 ("Bitcoin seed").
86' hardened Purpose: BIP-86, single-key Taproot addresses. The only purpose Oyster uses for addresses.
808276' hardened Coin type: Pearl mainnet. All test networks use 1'.
0' hardened Account. The desktop wallet uses account 0.
0 or 1 normal Branch: 0 = receive addresses you hand out, 1 = change the wallet pays back to itself.
i normal Index: 0, 1, 2… a new one each time you ask for an address.

The ’ marks a hardened level: its child number has 2³¹ added, and deriving it needs the parent’s private key. The first three levels are hardened, the last two are not. That split lets an account’s zpub derive every address in the account while keeping other accounts and coins separate.

Where does 808276 come from?

From the letters P, R, L. Their ASCII codes are 80, 82 and 76; write the three decimal numbers side by side and you get 808276. Pearl’s code says so in a comment: “Derived from ASCII ‘PRL’: 808276 (0xC5554)”.

Value
Coin type 808276 = 0x000C5554
Hardened child number 808276 + 2³¹ = 0x800C5554
Bitcoin’s coin type, for comparison 0 (0x80000000 hardened)
Test networks 1

Note what it is not: the hex bytes of “PRL” (50 52 4c) read as one number would be 5,263,948. And as of 2026-10-20, 808276 is not registered in SLIP-44, the public list of coin types.

How does a phrase become an address?

Here is the BIP-39 test phrase (“abandon … about”, public, never use it) walked down the path with Pearl’s derivation:

Path Child number Private key (first bytes) Public key (compressed, first bytes)
m – 1837c1be… 03d902f3…
m/86’ 80000056 f27e267a… 029d1bd8…
m/86’/808276’ 800c5554 c4b834ae… 023b77e1…
m/86’/808276’/0’ 80000000 f97b8a1b… 03ddeae3…
m/86’/808276’/0’/0 00000000 d6f68f41… 03a34659…
m/86’/808276’/0’/0/0 00000000 c08fd707… 02e0cafb…

The last key is an ordinary private key. Its x-only public key e0cafb2d…f4ec4e gets the Taproot tweak, giving the output key 1e89c01f…0a4f76, and that becomes the address:

Path Address
m/86’/808276’/0’/0/0 prl1pr6yuq8u2r95wjzzgpdy8cpnncpl7l8zgy6x5q0367pnc53s2famqg7pt74
m/86’/808276’/0’/0/1 prl1pyx3nlscz8rvsxqhcjtyqt2g5szuk9ss7m5saszu3afwwhvn9zp2sz62rhm
m/86’/808276’/0’/0/2 prl1pfrfqcvcmghjc3mpsazm9p9ktttyuewzlfmn40dzkwh0muejgkr3sfx9jwd
m/86’/808276’/0’/1/0 (change) prl1puwagcza86exfh3cx6ur08wq7njc32e66ep0zje7le6c7cak8lqeq655gqa
m/86’/1’/0’/0/0 (testnet) tprl1p8wpt9v4frpf3tkn0srd97pksgsxc5hs52lafxwru9kgeephvs7rqm5v93u

These match what a real Oyster wallet produced for the same phrase in the research for this site.

m86’808276’0’01/0 prl1pr6yu…/1 prl1pyx3n…/2 prl1pfrfq…/0 prl1puwag…/1 …purposecoinaccountreceivechange
The branch of the key tree a Pearl wallet uses. Hardened levels (solid) need private keys; normal levels (dashed) can be derived from the account's zpub.

What is the m/222’ branch?

Pearl’s quantum-safe option. Every Oyster wallet also creates a second key scope, purpose 222, which is 0xDE, the byte of OP_CHECKXMSSSIG. It is used only when someone calls getnewaddress … pq=true:

  1. The normal Schnorr key comes from m/86’/808276’/0’/branch/index as usual.
  2. A second key comes from m/222’/808276’/0’/branch/index. Its public key is never used. Its private key is stretched with HKDF-SHA256 (info “XMSS-SEED-EXPANSION”) into the seeds of an XMSS key pair.
  3. The XMSS public key goes into a script leaf, and the leaf is committed into the Taproot tweak of the normal key.

Both keys come from the same 12 words, and the pq address takes the next index on the same branch counter. The desktop wallet never requests one, and change addresses never use it.

Why does Oyster’s README say m/44’?

It’s out of date. The wallet’s README and some comments describe a m/44'/<coin type>'/… path, from the BIP-44 wallets Oyster’s code was forked from. Pearl’s code registers only the BIP-86 scope and the PQ scope; BIP-44, 49 and 84 are commented out. “BIP-44 coin type” in the comments just names the coin-type level. Trust the code: purpose 86.

Why can another wallet show different addresses?

Because Oyster inherited an old bug from btcd, the Go library Pearl’s node and wallet are built on.

btcd stores a private key as a big number, which drops a leading zero byte: a key starting 00 is kept as 31 bytes. Its old hardened derivation, now called DeriveNonStandard, then copied those 31 bytes into the HMAC input one position off. The child it computes is a valid key, just not the one BIP-32 specifies. Oyster still uses that routine for the three hardened levels.

So when a hardened step’s parent key starts with a zero byte, Oyster’s child differs from everyone else’s, and every key below it does too. A real example:

Phrase duty grid canyon okay pledge turkey uniform cook disease garment satisfy luggage
m/86’ private key 004f2e93f278324d… (starts with a zero byte)
Oyster, /0/0 prl1p6ldp0y2w4d8v6mgt0fhvqqxw0ud5jzn5fdv4qyu25sv5a66ll6lqrzeuju
Standard BIP-32, /0/0 prl1pfwfe3gt75qw665u7dhh676fc8x653u6cqy4xqa2gryfflmqsp6ksn5ae9l

The master key is kept as 32 bytes, so only two hardened steps (from m/86’ and from m/86’/808276’) can be hit, each with a 1-in-256 chance. About 2 in 256 seeds are affected: the research for this site measured 160 of 20,000 seeds, 0.8%. The test phrase “abandon … about” is not one of them.

The codex

Suggested

Up and down arrows move through the results, Enter opens one, Escape closes. Anywhere on the site, slash or Command K opens this search, and the square brackets [ and ] go to the previous and next page.