Skip to content

Commit

Permalink
scripts: get descriptors on both external and internal chains
Browse files Browse the repository at this point in the history
  • Loading branch information
onyb committed Sep 28, 2020
1 parent db70ade commit d4b7a47
Showing 1 changed file with 27 additions and 9 deletions.
36 changes: 27 additions & 9 deletions scripts/getdescriptor
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

import hashlib
from dataclasses import dataclass, field
from typing import List, Literal
from enum import IntEnum
from typing import Callable, List, Literal

import base58
import click
Expand All @@ -28,6 +29,11 @@ GetPubKey = Struct(
)


class Change(IntEnum):
External = 0
Internal = 1


@dataclass
class Derivation:
_path_list: List["Level"] = field(default_factory=list)
Expand Down Expand Up @@ -97,10 +103,11 @@ class ExtendedPublicKey:
checksum = hash256(extended_key_bytes)[:4]
return base58.b58encode(extended_key_bytes + checksum).decode()

def to_descriptor(self, scheme: SCHEME, derivation: Derivation) -> str:
def to_descriptor(
self, scheme: SCHEME, derivation: Derivation, change: Change
) -> str:
key_origin = f"{self.parent_fingerprint.hex()}/{derivation.path}"

change = 0 # hard-code to external chain for simpler UX
fragment = f"[{key_origin}]{self.serialize()}/{change}/*"

if scheme == "legacy":
Expand Down Expand Up @@ -193,24 +200,35 @@ def get_derivation_from_scheme(

def derive_output_descriptors(
client: LedgerClient, scheme: SCHEME, chain: CHAIN, account: int
) -> str:
) -> Callable[[Change], str]:
derivation = get_derivation_from_scheme(scheme, chain, account)
extended_key = derive_extended_public_key(client, chain, derivation)
return extended_key.to_descriptor(scheme=scheme, derivation=derivation)

def g(change: Change):
return extended_key.to_descriptor(
scheme=scheme, derivation=derivation, change=change
)

return g


@click.command()
@click.option(
"--scheme", type=click.Choice(SCHEME.__args__), required=True,
"--scheme",
type=click.Choice(SCHEME.__args__),
required=True,
)
@click.option(
"--chain", type=click.Choice(CHAIN.__args__), required=True,
"--chain",
type=click.Choice(CHAIN.__args__),
required=True,
)
@click.option("--account", type=int, required=True)
def main(scheme: SCHEME, chain: CHAIN, account):
client = get_client()
descriptor = derive_output_descriptors(client, scheme, chain, account)
click.echo(descriptor)
descriptor_factory = derive_output_descriptors(client, scheme, chain, account)
click.echo(f"External: {descriptor_factory(Change.External)}")
click.echo(f"Internal: {descriptor_factory(Change.Internal)}")


if __name__ == "__main__":
Expand Down

0 comments on commit d4b7a47

Please sign in to comment.