Skip to content
LogoLogo

Accounts & keys

from arrekta_sdk import generate_seed, keychain_from_seed
 
seed = generate_seed()
keychain = keychain_from_seed(seed, network="regtest")   # ML-DSA-65 by default
 
keychain.addresses(1)[0]      # 'rarrk1p…'
keychain.account_at(0)        # receive key #0 (an Account)
keychain.account_at(0, 1)     # change key #0

Derivation follows §3.2: HMAC-SHA3-512 and hardened-only paths m/9000'/0'/account'/change'/index'.

Single keys

from arrekta_sdk import private_key_from_seed
 
account = private_key_from_seed(seed32)     # 32-byte ML-DSA seed (FIPS 204 ξ)
account.public_key                          # scheme id ‖ raw key
account.key_hash                            # TH("pubkey", public key)
signature = account.sign(message)           # context "ARRK-TX-v1" by default

Addresses and locks

from arrekta_sdk import encode_address, decode_address, lock_from_public_key
 
lock = lock_from_public_key(account.public_key)
address = encode_address(lock, "regtest")
assert decode_address(address, "regtest") == lock

Any coin can show the same account under its own ticker (gold1…, gold-t1…, gold-r1… for a coin GOLD). Every function that takes an address accepts both forms.

from arrekta_sdk import encode_coin_address, decode_coin_address, coin_hrp
 
gold = encode_coin_address(lock, asset["ticker"], "regtest")    # 'gold-r1p…'
assert decode_coin_address(gold, "regtest") == (lock, "GOLD")   # ticker None for a plain address
assert decode_coin_address(gold) == (lock, "GOLD")              # without a network: any known one
coin_hrp("GOLD", "testnet")                                     # 'gold-t'

The ticker is a label; the asset id decides what moves. See §3.3.1.

Multisig and policy locks (multisig_lock, policy_lock, builders key/multi/after/older/ sha3/and_/or_/thresh, templates htlc/vault/vesting) follow the same contract; see Locks & policy locks.