Source code for cryptnox_cli.lib.cryptos.composite

# flake8: noqa
# -*- coding: utf-8 -*-
"""
High-level composition utilities combining deterministic keys and transactions.
"""
from .deterministic import *
from .transaction import *
from .main import *


# BIP32 hierarchical deterministic multisig script
[docs] def bip32_hdm_script(*args): if len(args) == 3: keys, req, path = args else: i, keys, path = 0, [], [] while len(args[i]) > 40: keys.append(args[i]) i += 1 req = int(args[i]) path = map(int, args[i+1:]) pubs = sorted(map(lambda x: bip32_descend(x, path), keys)) return mk_multisig_script(pubs, req)
# BIP32 hierarchical deterministic multisig address
[docs] def bip32_hdm_addr(*args): return scriptaddr(bip32_hdm_script(*args))
# Setup a coinvault transaction
[docs] def setup_coinvault_tx(tx, script): txobj = deserialize(tx) N = deserialize_script(script)[-2] for inp in txobj["ins"]: inp["script"] = serialize_script([None] * (N+1) + [script]) return serialize(txobj)
# Sign a coinvault transaction
[docs] def sign_coinvault_tx(tx, priv): pub = privtopub(priv) txobj = deserialize(tx) subscript = deserialize_script(txobj['ins'][0]['script']) oscript = deserialize_script(subscript[-1]) k, pubs = oscript[0], oscript[1:-2] for j in range(len(txobj['ins'])): scr = deserialize_script(txobj['ins'][j]['script']) for i, p in enumerate(pubs): if p == pub: scr[i+1] = multisign(tx, j, subscript[-1], priv) if len(filter(lambda x: x, scr[1:-1])) >= k: scr = [None] + filter(lambda x: x, scr[1:-1])[:k] + [scr[-1]] txobj['ins'][j]['script'] = serialize_script(scr) return serialize(txobj)