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
    }
Ejemplo n.º 2
0
def update_decks(txid):
    try:
        deck = pa.find_deck(node, txid, version)
        add_deck(deck) 
    except KeyError:
        ''' Transaction most likely still in mempool '''
        pass
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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'
    }
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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])
Ejemplo n.º 7
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
Ejemplo n.º 8
0
    def __find_deck(self, deckid) -> Deck:

        deck = pa.find_deck(provider, deckid, Settings.deck_version,
                            Settings.production)

        if deck:
            return deck
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
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)
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
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)
Ejemplo n.º 20
0
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")
Ejemplo n.º 21
0
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)
Ejemplo n.º 22
0
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}
Ejemplo n.º 23
0
'''
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")),
Ejemplo n.º 24
0
    def info(self, deck_id):
        '''display deck info'''

        deck = pa.find_deck(provider, deck_id, Settings.deck_version,
                            Settings.production)
        print_deck_info(deck)
Ejemplo n.º 25
0
def get_state(deck):
    deck = pa.find_deck(provider,deck)[0]
    cards = pa.find_card_transfers(provider,deck)
    return DeckState(cards)
Ejemplo n.º 26
0
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([
Ejemplo n.º 27
0
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
Ejemplo n.º 28
0
    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,
    )