def test_find_deck(prov): provider = prov(network="tppc") deck = pa.find_deck( provider, 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 1) deck.confirms = 100 # make it deterministic assert deck.__dict__ == { 'asset_specific_data': b'', 'id': 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 'issue_mode': 4, 'issue_time': 1488840533, 'issuer': 'msYThv5bf7KjhHT1Cj5D7Y1tofyhq9vhWM', 'name': 'hopium_v2', 'network': 'peercoin-testnet', 'number_of_decimals': 2, 'production': True, 'testnet': True, 'version': 1, 'confirms': 100 }
def update_decks(txid): try: deck = pa.find_deck(node, txid, version) add_deck(deck) except KeyError: ''' Transaction most likely still in mempool ''' pass
def card_burn(provider, args): ''' Burn cards of this deck. pacli card -burn '{"deck": "deck_id", "amount": ["amount"]}' ''' args = json.loads(args) try: deck = pa.find_deck(provider, args["deck"])[0] except IndexError: print("\n", {"error": "Deck not found!"}) return if not provider.getaddressesbyaccount(deck.name): print( "\n", { "error": "You are not even subscribed to this deck, how can you burn cards?" }) return utxo = provider.select_inputs(0.02) change_address = change(utxo) args["amounts"] = [float(i) for i in args["amounts"]] cb = pa.CardTransfer(deck, [deck.issuer], args["amounts"]) raw_cb = hexlify( pa.card_burn(deck, cb, utxo, change_address, Settings.prod)).decode() signed = provider.signrawtransaction(raw_cb) print("\n", provider.sendrawtransaction(signed["hex"]), "\n") # send the tx
def test_find_deck(prov): provider = prov(network="tppc") deck = pa.find_deck( provider, 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 1) deck.tx_confirmations = 100 # make it deterministic assert deck.to_json() == { 'asset_specific_data': b'', 'id': 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 'issue_mode': 4, 'issue_time': 1488840533, 'issuer': 'msYThv5bf7KjhHT1Cj5D7Y1tofyhq9vhWM', 'name': 'hopium_v2', 'network': 'peercoin-testnet', 'number_of_decimals': 2, 'production': True, 'version': 1, 'tx_confirmations': 100, 'p2th_wif': 'cThmj6Qu6aTUeA5f4FoNJTsBA8K6ZjhXbZkwsqcmv94xjWiCBr5d' }
def deck_search(provider, key): '''search commands, query decks by <key>''' decks = pa.find_deck(provider, key) d = ListDecks(provider, decks) d.pack_decks_for_printing() print(d.table.table)
def test_validate_card_transfer_p2th(): provider = Cryptoid(network="peercoin-testnet") deck = find_deck(provider, "643dccd585211766fc03f71e92fbf299cfc2bdbf3f2cae0ad85adec3141069f3", 1) raw_tx = provider.getrawtransaction("809c506bc3add9e46a4d3a65348426688545213da5fb5b524acd380f2cdaf3cc", 1) validate_card_transfer_p2th(deck, raw_tx['vout'][0])
def card_transfer(provider, args): ''' Transfer cards to <receivers> pacli card -transfer '{"deck": "deck_id", "receivers": [list of receiver addresses], "amounts": [list of amounts] } ''' args = json.loads(args) try: deck = pa.find_deck(provider, args["deck"])[0] except IndexError: print({"error": "Deck not found!"}) return if not provider.getaddressesbyaccount(deck.name): print( "\n", { "error": "You are not even subscribed to this deck, how can you transfer cards?" }) utxo = provider.select_inputs(0.02) change_address = change(utxo) args["amounts"] = [float(i) for i in args["amounts"]] ct = pa.CardTransfer(deck, args["receivers"], args["amounts"]) raw_ct = hexlify( pa.card_transfer(deck, ct, utxo, change_address, Settings.prod)).decode() signed = provider.signrawtransaction(raw_ct) print("\n", provider.sendrawtransaction(signed["hex"]), "\n") # send the tx
def __find_deck(self, deckid) -> Deck: deck = pa.find_deck(provider, deckid, Settings.deck_version, Settings.production) if deck: return deck
def test_postprocess_card(): provider = Explorer(network="peercoin-testnet") deck = find_deck( provider, "643dccd585211766fc03f71e92fbf299cfc2bdbf3f2cae0ad85adec3141069f3", 1) raw_tx = provider.getrawtransaction( '809c506bc3add9e46a4d3a65348426688545213da5fb5b524acd380f2cdaf3cc', 1) vout = raw_tx["vout"] blockseq = tx_serialization_order(provider, raw_tx["blockhash"], raw_tx["txid"]) blocknum = provider.getblock(raw_tx["blockhash"])["height"] sender = 'moQzpzzcCYZMnAz224EY4att5A9psxN8X2' card_transfer = CardTransfer( deck=deck, receiver=["n4KuTR5CzyQTbrpwbAKEdTfJERKmtHWWgr"], amount=[1], version=1, ) card = postprocess_card(card_metainfo=card_transfer.metainfo_to_dict, raw_tx=raw_tx, sender=sender, vout=vout, blockseq=blockseq, blocknum=blocknum, tx_confirmations=raw_tx['confirmations'], deck=deck) assert isinstance(card, list)
def deck_subscribe(provider, deck_id): '''subscribe command, load deck p2th into local node, pass <deck_id>''' try: deck = pa.find_deck(provider, deck_id)[0] except IndexError: print({"error": "Deck not found!"}) return pa.load_deck_p2th_into_local_node(provider, deck)
def test_find_card_bundles(): provider = Explorer(network="tppc") deck = pa.find_deck(provider, 'adc6d888508ebfcad5c182df4ae94553bae6287735d76b8d64b3de8d29fc2b5b', 1) bundles = find_card_bundles(provider, deck) assert bundles assert isinstance(next(bundles), CardBundle)
def test_find_cards(): provider = pa.Cryptoid(network="tppc") deck = pa.find_deck(provider, 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 1) cards = pa.find_card_transfers(provider, deck) assert cards assert isinstance(cards[0], pa.CardTransfer)
def test_find_all_valid_cards(prov): provider = prov(network="tppc") deck = pa.find_deck(provider, 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 1) cards = pa.find_all_valid_cards(provider, deck) assert cards assert isinstance(next(cards), pa.CardTransfer)
def test_get_card_transfer(): '''test finding a single card tranfer''' provider = Explorer(network="tppc") deck = pa.find_deck(provider, '98694bb54fafe315051d2a8f1f5ea4c0050947741ced184a5f33bf4a0081a0bb', 1, True) card = list(get_card_transfer(provider, deck, 'e04fb602bd9d9c33d1d1af8bb680108057c2ae37ea987cc15295cc6fc4fd8d97')) assert isinstance(card[0], CardTransfer)
def test_get_card_bundles(prov): provider = prov(network="tppc") deck = pa.find_deck(provider, 'b6a95f94fef093ee9009b04a09ecb9cb5cba20ab6f13fe0926aeb27b8671df43', 1) bundles = pa.get_card_bundles(provider, deck) assert bundles assert isinstance(list(next(bundles))[0], pa.CardTransfer)
def deck_info(provider, deck_id): '''info commands, show full deck details''' try: deck = pa.find_deck(provider, deck_id)[0] except IndexError: print("\n", {"error": "Deck not found!"}) return info = DeckInfo(deck) info.pack_decks_for_printing() print(info.table.table)
def test_postprocess_card(): provider = Holy(network="peercoin-testnet") deck = find_deck( provider, "643dccd585211766fc03f71e92fbf299cfc2bdbf3f2cae0ad85adec3141069f3")[0] raw_tx = provider.getrawtransaction( '809c506bc3add9e46a4d3a65348426688545213da5fb5b524acd380f2cdaf3cc') vout = raw_tx["vout"] blockseq = tx_serialization_order(provider, raw_tx["blockhash"], raw_tx["txid"]) blocknum = provider.getblock(raw_tx["blockhash"])["height"] sender = 'moQzpzzcCYZMnAz224EY4att5A9psxN8X2' card_metainfo = b'\x08\x01\x12\n\xd0\xd2=\x80\x89z\xee\x83\xb8\x01\x18\x05' card = postprocess_card(card_metainfo, raw_tx, sender, vout, blockseq, blocknum, deck) assert isinstance(card, list)
def checkpoint(deck): ''' check if deck_id is loaded into the node''' validate(deck) ''' list all transactions for a particular deck ''' txs = node.listtransactions(deck.id) ''' get deck object of current deck.id ''' try: deck = pa.find_deck(node, deck.id, version) except KeyError: return True if isinstance(txs,list): ''' Make sure txs is a list rather than a dict with an error. Reverse list order.''' checkpoint = txs[::-1] ''' Get the most recent card transaction recorded in the database for the given deck ''' try: _checkpoint = session.query(Card).filter(Card.deck_id == deck.id).order_by(Card.blocknum.desc()).first() except: _checkpoint = None if _checkpoint is not None and _checkpoint.blockhash: ''' If database query doesn't return None type then checkpoint exists''' for i, v in enumerate(checkpoint): ''' for each transaction in local node listtransactions ''' if ('txid','blockhash') in v.keys(): ''' Check that keys exists within dict ''' if v['blockhash'] == _checkpoint.blockhash: return True else: txid = v['txid'] rawtx = node.getrawtransaction(txid,1) try: ''' check if it's a valid PeerAssets transaction ''' pa.pautils.validate_card_transfer_p2th(deck, rawtx) ''' return False if checkpoints don't match and True if they do ''' return _checkpoint.blockhash == v['blockhash'] except: continue return False
def test_card_transfer(): provider = Explorer(network='tppc') address = "mthKQHpr7zUbMvLcj8GHs33mVcf91DtN6L" inputs = provider.select_inputs(address, 0.02) change_address = address deck = pa.find_deck(provider, '078f41c257642a89ade91e52fd484c141b11eda068435c0e34569a5dfcce7915', 1, True) card = pa.CardTransfer(deck=deck, receiver=['n12h8P5LrVXozfhEQEqg8SFUmVKtphBetj', 'n422r6tcJ5eofjsmRvF6TcBMigmGbY5P7E'], amount=[1, 2] ) card_transfer = pa.card_transfer(provider, card, inputs, change_address, locktime=300000) assert isinstance(card_transfer, Transaction)
def card_issue(provider, args): ''' Issue new cards of this deck. pacli card -issue '{"deck": "deck_id", "receivers": [list of receiver addresses], "amounts": [list of amounts] } ''' issue = json.loads(args) try: deck = pa.find_deck(provider, issue["deck"])[0] except IndexError: print("\n", {"error": "Deck not found."}) return if not provider.getaddressesbyaccount(deck.name): print( "\n", { "error": "You are not even subscribed to this deck, how can you issue cards?" }) return try: utxo = provider.select_inputs(0.02, deck.issuer) except ValueError: print("\n", { "error": "You are not owner of this deck, you can not issue cards." }) return change_address = change(utxo) issue["amounts"] = [float(i) for i in issue["amounts"]] ct = pa.CardTransfer(deck, issue["receivers"], issue["amounts"]) raw_ct = hexlify( pa.card_issue(deck, ct, utxo, change_address, Settings.prod)).decode() signed = provider.signrawtransaction(raw_ct) txid = provider.sendrawtransaction(signed["hex"]) # send the tx print("\n", txid, "\n")
def list_cards(provider, args): ''' List cards of this <deck>.abs pacli card -list <deck> ''' try: deck = pa.find_deck(provider, args)[0] except IndexError: print("\n", {"error": "Deck not found!"}) return if not provider.getaddressesbyaccount(deck.name): print("\n", { "error": "You must subscribe to deck to be able to list transactions." }) return c = ListCards(provider, pa.find_all_card_transfers(provider, deck)) c.pack_cards_for_printing() print(c.table.table)
def which_deck(txid): deck = node.gettransaction(txid) deck_id = None if 'details' in deck.keys(): owneraccounts = [details['account'] for details in deck['details'] if details['account']] if owneraccounts: deck_id = [details['account'] for details in deck['details'] if details['account']][0] if deck_id is not None: if deck_id in ('PAPROD','PATEST'): update_decks(txid) elif any(i in subscribed for i in ('*', deck_id)): deck = pa.find_deck(node, deck_id, version) if not checkpoint(deck): remove_no_confirms(deck_id) add_cards( deck ) init_state(deck.id) return {'walletnotify': True, 'deck_id':deck_id} else: return {'walletnotify': False, 'deck_id': deck_id}
''' Find card transfers for <deck>. ''' import sys import pypeerassets as pa provider = pa.RpcNode(testnet=True) print("Searching for deck {deck}.".format(deck=sys.argv[1])) deck = pa.find_deck(provider, sys.argv[1])[0] cards = pa.find_card_transfers(provider, deck) print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") print( "This deck issuer has issued: {cards} cards in {transfers} card issue transactions." .format(cards=round( sum((i.amount[0] for i in cards if i.type == "CardIssue")), deck.number_of_decimals), transfers=len([i for i in cards if i.type == "CardIssue"]))) print( "Peers on this deck have transacted {cards} cards in {transfers} card transactions." .format(cards=round( sum((i.amount[0] for i in cards if i.type == "CardTransfer")), deck.number_of_decimals), transfers=len([i for i in cards if i.type == "CardTransfer"]))) print( "Peers on this deck have burned {cards} cards in {transfers} card transactions." .format(cards=round( sum((i.amount[0] for i in cards if i.type == "CardBurn")),
def info(self, deck_id): '''display deck info''' deck = pa.find_deck(provider, deck_id, Settings.deck_version, Settings.production) print_deck_info(deck)
def get_state(deck): deck = pa.find_deck(provider,deck)[0] cards = pa.find_card_transfers(provider,deck) return DeckState(cards)
MAX_TRANFERS = 3600 MAX_BURNS = 800 import pypeerassets as pa from binascii import hexlify import random import datetime, time import pickle import logging logging.basicConfig(filename='pypa.log', level=logging.INFO) logging.info("Started new session: {0}".format( datetime.datetime.now().isoformat())) provider = pa.RpcNode(testnet=True) deck = pa.find_deck(provider, "clementines")[0] change_addr = deck.issuer try: # try to load keypairs from the file keypairs = pickle.load(open("keypairs.db", "rb")) except: keys = [pa.Kutil(network="tppc") for i in range(MAX_RECEIVERS)] keypairs = {k.address: v.wif for k, v in zip(keys, keys)} class Session: pass def total_issuance(): return len([
def init_decks(): n = 0 def message(n): sys.stdout.flush() sys.stdout.write('{} Decks Loaded\r'.format(n)) def add_deck(deck): if deck is not None: entry = db.session.query(Deck).filter(Deck.id == deck.id).first() subscribe = deck.id in subscribed if not entry: try: D = Deck(deck.id, deck.name, deck.issuer, deck.issue_mode, deck.number_of_decimals, subscribe) db.session.add(D) db.session.commit() except Exception as e: print(e) pass else: db.session.query(Deck).filter(Deck.id == deck.id).update( {"subscribed": subscribe}) db.session.commit() def add_cards(cards): if cards is not None: for cardset in cards: for card in cardset: sys.stdout.write(card.txid + '\r') sys.stdout.flush() card_id = card.txid + str(card.blockseq) + str( card.cardseq) entry = db.session.query(Card).filter( Card.id == card_id).first() if not entry: C = Card(card_id, card.txid, card.cardseq, card.receiver[0], card.sender, card.amount[0], card.type, card.blocknum, card.blockseq, card.deck_id) db.session.add(C) db.session.commit() sys.stdout.flush() if not autoload: decks = [pa.find_deck(node, txid, version)[0] for txid in subscribed] for deck in decks: if deck is not None: add_deck(deck) add_cards(pa.find_card_transfers(node, deck)) n += 1 message(n) else: decks = pa.find_all_valid_decks(node, 1, True) while True: try: deck = next(decks) add_deck(deck) if deck.id in subscribed: add_cards(pa.find_card_transfers(node, deck)) n += 1 message(n) except StopIteration: break
deck_spawn_tx = sign_transaction(rpc_node, deck_spawn_tx, friendly_co_key) rpc_node.sendrawtransaction(deck_spawn_tx.hexlify()) print("Transaction to create the Friendly Co. Deck sent to the network!") print("Transaction ID: " + deck_spawn_tx.txid) print("Waiting for confirmation...") wait_for_confirmation(rpc_node, deck_spawn_tx.txid) print("Friendly Co. Deck created!") deck.id = deck_spawn_tx.txid print("Deck ID: " + deck.id) print("Deck P2TH Address: " + deck.p2th_address) print("Double checking that the Friendly Co. Deck exists...") found_deck = pa.find_deck( provider=rpc_node, key=deck.id, version=1, prod=False, ) assert found_deck is not None, "Should have found the Friendly Co. Deck." print("Found the Friendly Co. Deck!") # Card Issue print("Build, sign and send the Card Issue transaction to Alice...") card_transfer = pa.CardTransfer( deck=deck, receiver=[ALICE], amount=[1000000], sender=FRIENDLY_CO, )