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")
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
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
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)
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
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
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
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)
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
def pa_parameters(self) -> PAParams: '''load network PeerAssets parameters.''' return param_query(self.network)