Metadata-Version: 2.4
Name: bip46
Version: 1.0.0
Summary: A Python implementation of BIP46: Address Scheme for Timelocked Fidelity Bonds
Author-email: dni <dni@lnbits.com>
License-Expression: MIT
License-File: LICENSE
Requires-Python: >=3.12
Requires-Dist: bech32<2.0.0,>=1.2.0
Requires-Dist: click<9.0.0,>=8.1.7
Requires-Dist: embit<0.9.0,>=0.8.0
Requires-Dist: httpx<1.0.0,>=0.27.2
Requires-Dist: secp256k1<0.15.0,>=0.14.0
Description-Content-Type: text/markdown

# BIP46 - Address Scheme for Timelocked Fidelity Bonds

Python implementation of BIP46: Address Scheme for Timelocked Fidelity Bonds.

## Example

### Create a redeem script from a mnemonic

```python
from datetime import UTC, datetime

from bip46 import (
    create_redeemscript,
    hdkey_derive,
    hdkey_from_mnemonic,
    hdkey_to_pubkey,
    lockdate_to_derivation_path,
    redeemscript_address,
    redeemscript_pubkey,
)

network = "mainnet"
lock_date = datetime(2042, 6, 1, tzinfo=UTC)
lock_path = lockdate_to_derivation_path(lock_date, network=network)

hdkey = hdkey_from_mnemonic(
    "abandon abandon abandon abandon abandon abandon"
    " abandon abandon abandon abandon abandon about",
    network=network,
)
redeem_key = hdkey_derive(hdkey, lock_path)
redeem_pub_key = hdkey_to_pubkey(redeem_key)
redeem_script = create_redeemscript(lock_date, redeem_pub_key)
script_pubkey = redeemscript_pubkey(redeem_script)
script_address = redeemscript_address(script_pubkey, network=network)
```

### Create addresses from an xpub

BIP46 paths include hardened account components: `m/84'/coin_type'/0'/2/index`.
A public key cannot derive those hardened components, so pass an account-level xpub
for `m/84'/coin_type'/0'`. The library will derive the public BIP46 suffix
`2/index` from that account xpub.

```python
from datetime import UTC, datetime

from bip46 import (
    create_redeemscript,
    hdkey_derive,
    hdkey_from_xpub,
    hdkey_to_pubkey,
    lockdate_to_derivation_path,
    redeemscript_address,
    redeemscript_pubkey,
)

network = "mainnet"
lock_date = datetime(2042, 6, 1, tzinfo=UTC)
lock_path = lockdate_to_derivation_path(lock_date, network=network)

hdkey = hdkey_from_xpub("xpub...")
redeem_key = hdkey_derive(hdkey, lock_path)
redeem_pub_key = hdkey_to_pubkey(redeem_key)
redeem_script = create_redeemscript(lock_date, redeem_pub_key)
script_pubkey = redeemscript_pubkey(redeem_script)
script_address = redeemscript_address(script_pubkey, network=network)
```

The CLI also accepts an account xpub:

```sh
XPUB="xpub..." uv run bip46 create-timelock 2042 6 mainnet
```
