Exemple #1
0
def test_param_query():
    "Check that we can find PAParams for networks by name."

    # Use a network's long name
    pa_params = param_query("peercoin")
    assert pa_params.network_shortname == "ppc"

    # Use a network's short name
    pa_params = param_query("tppc")
    assert pa_params.network_name == "peercoin-testnet"

    # Try to find a network we don't know about.
    with pytest.raises(UnsupportedNetwork):
        param_query("not a network name we know")
Exemple #2
0
def find_all_valid_decks(provider: Provider, deck_version: int,
                         prod: bool=True) -> Generator:
    '''
    Scan the blockchain for PeerAssets decks, returns list of deck objects.
    : provider - provider instance
    : version - deck protocol version (0, 1, 2, ...)
    : test True/False - test or production P2TH
    '''

    pa_params = param_query(provider.network)

    if prod:
        p2th = pa_params.P2TH_addr
    else:
        p2th = pa_params.test_P2TH_addr

    if isinstance(provider, RpcNode):
        deck_spawns = (provider.getrawtransaction(i, 1)
                       for i in find_deck_spawns(provider))

    else:
        try:
            deck_spawns = (provider.getrawtransaction(i, 1) for i in
                           provider.listtransactions(p2th))
        except TypeError as err:  # it will except if no transactions are found on this P2TH
            raise EmptyP2THDirectory(err)

    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as th:
        for result in th.map(deck_parser, ((provider, rawtx, deck_version, p2th) for rawtx in deck_spawns)):
            if result:
                yield result
Exemple #3
0
def find_deck_spawns(provider: Provider, prod: bool = True) -> Iterable[str]:
    '''find deck spawn transactions via Provider,
    it requires that Deck spawn P2TH were imported in local node or
    that remote API knows about P2TH address.'''

    pa_params = param_query(provider.network)

    if isinstance(provider, RpcNode):

        if prod:
            decks = (i["txid"] for i in provider.listtransactions("PAPROD"))
        else:
            decks = (i["txid"] for i in provider.listtransactions("PATEST"))

    if isinstance(provider, Mintr):

        if prod:
            decks = (i["txid"]
                     for i in provider.listtransactions(pa_params.P2TH_addr))
        else:
            raise NotImplementedError

    if isinstance(provider, Cryptoid) or isinstance(provider, Explorer):

        if prod:
            decks = (i for i in provider.listtransactions(pa_params.P2TH_addr))
        else:
            decks = (
                i for i in provider.listtransactions(pa_params.test_P2TH_addr))

    return decks
Exemple #4
0
def test_validate_deckspawn_p2th():
    '''test deckspawn p2th validation'''

    provider = Explorer(network="peercoin-testnet")
    p2th = param_query('peercoin-testnet').P2TH_addr
    raw_tx = provider.getrawtransaction('643dccd585211766fc03f71e92fbf299cfc2bdbf3f2cae0ad85adec3141069f3', 1,)

    assert validate_deckspawn_p2th(provider, raw_tx, p2th)
Exemple #5
0
def card_transfer(provider: Provider,
                  card: CardTransfer,
                  inputs: dict,
                  change_address: str,
                  locktime: int = 0) -> Transaction:
    '''Prepare the CardTransfer Transaction object

       : card - CardTransfer object
       : inputs - utxos (has to be owned by deck issuer)
       : change_address - address to send the change to
       : locktime - tx locked until block n=int
       '''

    network_params = net_query(provider.network)
    pa_params = param_query(provider.network)

    if card.deck_p2th is None:
        raise Exception("card.deck_p2th required for tx_output")

    outs = [
        tx_output(network=provider.network,
                  value=pa_params.P2TH_fee,
                  n=0,
                  script=p2pkh_script(address=card.deck_p2th,
                                      network=provider.network)),  # deck p2th
        tx_output(network=provider.network,
                  value=Decimal(0),
                  n=1,
                  script=nulldata_script(
                      card.metainfo_to_protobuf))  # op_return
    ]

    for addr, index in zip(card.receiver, range(len(card.receiver))):
        outs.append(  # TxOut for each receiver, index + 2 because we have two outs already
            tx_output(network=provider.network,
                      value=Decimal(0),
                      n=index + 2,
                      script=p2pkh_script(address=addr,
                                          network=provider.network)))

    #  first round of txn making is done by presuming minimal fee
    change_sum = Decimal(inputs['total'] - network_params.min_tx_fee -
                         pa_params.P2TH_fee)

    outs.append(
        tx_output(network=provider.network,
                  value=change_sum,
                  n=len(outs) + 1,
                  script=p2pkh_script(address=change_address,
                                      network=provider.network)))

    unsigned_tx = make_raw_transaction(network=provider.network,
                                       inputs=inputs['utxos'],
                                       outputs=outs,
                                       locktime=Locktime(locktime))
    return unsigned_tx
Exemple #6
0
def find_deck(provider: Provider, key: str, version: int, prod: bool=True) -> Optional[Deck]:
    '''Find specific deck by deck id.'''

    pa_params = param_query(provider.network)
    if prod:
        p2th = pa_params.P2TH_addr
    else:
        p2th = pa_params.test_P2TH_addr

    rawtx = provider.getrawtransaction(key, 1)
    deck = deck_parser((provider, rawtx, 1, p2th))

    return deck
Exemple #7
0
def deck_spawn(provider: Provider,
               deck: Deck,
               inputs: dict,
               change_address: str,
               locktime: int = 0) -> Transaction:
    '''Creates Deck spawn raw transaction.

       : key - Kutil object which we'll use to sign the tx
       : deck - Deck object
       : card - CardTransfer object
       : inputs - utxos (has to be owned by deck issuer)
       : change_address - address to send the change to
       : locktime - tx locked until block n=int
    '''

    network_params = net_query(deck.network)
    pa_params = param_query(deck.network)

    if deck.production:
        p2th_addr = pa_params.P2TH_addr
    else:
        p2th_addr = pa_params.test_P2TH_addr

    #  first round of txn making is done by presuming minimal fee
    change_sum = Decimal(inputs['total'] - network_params.min_tx_fee -
                         pa_params.P2TH_fee)

    txouts = [
        tx_output(network=deck.network,
                  value=pa_params.P2TH_fee,
                  n=0,
                  script=p2pkh_script(address=p2th_addr,
                                      network=deck.network)),  # p2th
        tx_output(network=deck.network,
                  value=Decimal(0),
                  n=1,
                  script=nulldata_script(
                      deck.metainfo_to_protobuf)),  # op_return
        tx_output(network=deck.network,
                  value=change_sum,
                  n=2,
                  script=p2pkh_script(address=change_address,
                                      network=deck.network))  # change
    ]

    unsigned_tx = make_raw_transaction(network=deck.network,
                                       inputs=inputs['utxos'],
                                       outputs=txouts,
                                       locktime=Locktime(locktime))
    return unsigned_tx
Exemple #8
0
def load_p2th_privkey_into_local_node(provider: RpcNode, prod: bool=True) -> None:
    '''Load PeerAssets P2TH privkey into the local node.'''

    assert isinstance(provider, RpcNode), {"error": "Import only works with local node."}
    error = {"error": "Loading P2TH privkey failed."}
    pa_params = param_query(provider.network)

    if prod:
        provider.importprivkey(pa_params.P2TH_wif, "PAPROD")
        #  now verify if ismine == True
        if not provider.validateaddress(pa_params.P2TH_addr)['ismine']:
            raise P2THImportFailed(error)
    else:
        provider.importprivkey(pa_params.test_P2TH_wif, "PATEST")
        if not provider.validateaddress(pa_params.test_P2TH_addr)['ismine']:
            raise P2THImportFailed(error)
Exemple #9
0
def read_conf(conf_file):

    config = configparser.ConfigParser()
    config.read(conf_file)

    settings = dict(config["settings"])
    if not set(settings.keys()).issuperset(required):

        print("config is outdated, saving current default config to",
              conf_file)
        write_default_config(conf_file + ".sample")

    if settings["network"].startswith("t"):
        settings["testnet"] = True

    settings['p2th_address'] = param_query(settings['network']).P2TH_addr

    return settings
Exemple #10
0
    def pa_parameters(self) -> PAParams:
        '''load network PeerAssets parameters.'''

        return param_query(self.network)