def test_get_hub_liquidity(server_db):

    # confirmed fund
    hub_wif = lib.load_wif()
    hub_address = keys.address_from_wif(hub_wif)
    unsigned_rawtx = api.create_send(**{
        'source': FUNDING_ADDRESS,
        'destination': hub_address,
        'asset': ASSET,
        'quantity': 2000000,
        'regular_dust_size': 2000000
    })
    signed_rawtx = scripts.sign_deposit(get_txs, FUNDING_WIF, unsigned_rawtx)
    api.sendrawtransaction(tx_hex=signed_rawtx)
    assert lib.get_hub_liquidity() == {
        'A7736697071037023001': 0,
        'BTC': 2000000,
        'XCP': 2000000
    }

    # unconfirmed send
    wif = keys.generate_wif("XTN")
    address = keys.address_from_wif(wif)
    unsigned_rawtx = api.create_send(**{
        'source': hub_address,
        'destination': address,
        'asset': ASSET,
        'quantity': 1000000,
        'fee': 1000000
    })
    signed_rawtx = scripts.sign_deposit(get_txs, hub_wif, unsigned_rawtx)
    util_test.insert_unconfirmed_raw_transaction(signed_rawtx, server_db)

    # counts unconfurmed sends
    assert lib.get_hub_liquidity() == {
        'A7736697071037023001': 0,
        'BTC': 0,  # no utxos left
        'XCP': 1000000
    }

    # unconfurmed fund
    unsigned_rawtx = api.create_send(**{
        'source': FUNDING_ADDRESS,
        'destination': hub_address,
        'asset': ASSET,
        'quantity': 2000000,
        'regular_dust_size': 2000000
    })
    signed_rawtx = scripts.sign_deposit(get_txs, FUNDING_WIF, unsigned_rawtx)
    util_test.insert_unconfirmed_raw_transaction(signed_rawtx, server_db)

    # doesnt counts unconfurmed funds
    assert lib.get_hub_liquidity() == {
        'A7736697071037023001': 0,
        'BTC': 0,  # no utxos left
        'XCP': 1000000
    }

    utxos = api.get_unspent_txouts(address=hub_address, unconfirmed=False)
    assert utxos == []
예제 #2
0
파일: util.py 프로젝트: F483/picopayments
def gen_funded_wif(asset, asset_quantity, btc_quantity):
    src_wif = DP["addresses"][0][2]
    src_address = address_from_wif(src_wif)
    dest_wif = generate_wif(netcode=etc.netcode)
    dest_address = address_from_wif(dest_wif)
    unsigned_rawtx = api.create_send(**{
        'source': src_address,
        'destination': dest_address,
        'asset': asset,
        'quantity': asset_quantity,
        'regular_dust_size': btc_quantity
    })
    signed_rawtx = scripts.sign_deposit(get_txs, src_wif, unsigned_rawtx)
    api.sendrawtransaction(tx_hex=signed_rawtx)
    return dest_wif
예제 #3
0
def gen_funded_wif(asset, asset_quantity, btc_quantity):
    src_wif = DP["addresses"][0][2]
    src_address = address_from_wif(src_wif)
    dest_wif = generate_wif(netcode=etc.netcode)
    dest_address = address_from_wif(dest_wif)
    unsigned_rawtx = api.create_send(
        **{
            'source': src_address,
            'destination': dest_address,
            'asset': asset,
            'quantity': asset_quantity,
            'regular_dust_size': btc_quantity
        })
    signed_rawtx = scripts.sign_deposit(get_tx, src_wif, unsigned_rawtx)
    api.sendrawtransaction(tx_hex=signed_rawtx)
    return dest_wif
예제 #4
0
파일: lib.py 프로젝트: F483/picopayments
def send_funds(destination, asset, quantity):

    from picopayments_hub import api
    try:
        regular_dust_size = 5500  # TODO get from cplib
        fee_per_kb = 25000  # TODO get from cplib
        fee = int(fee_per_kb / 2)
        extra_btc = (fee + regular_dust_size) * 3
        wif = load_wif()
        address = keys.address_from_wif(wif)
        utxos = _get_hub_utxos(address, asset, quantity, extra_btc)
        unsigned_rawtx = api.create_send(
            source=address,
            destination=destination,
            asset=asset,
            regular_dust_size=extra_btc,
            quantity=quantity,
            disable_utxo_locks=True,
            custom_inputs=utxos,
        )
        signed_rawtx = scripts.sign_deposit(get_txs, wif, unsigned_rawtx)
        txid = publish(signed_rawtx)
        assert txid, "Failed to publish transaction: {0}".format(signed_rawtx)
        return {"txid": txid, "rawtx": signed_rawtx}
    except err.InsufficientFunds:
        print("Insufficient funds!")
        return None
예제 #5
0
def test_block_send():
    alice_wif = util.gen_funded_wif("XCP", 1000000, 1000000)
    client = Mpc(util.MockAPI(auth_wif=alice_wif))
    bob_wif = keys.generate_wif(netcode=etc.netcode)
    bob_address = keys.address_from_wif(bob_wif)
    txid = client.block_send(source=alice_wif, destination=bob_address,
                             asset="XCP", quantity=42)
    assert txid is not None
def test_block_send():
    alice_wif = util.gen_funded_wif("XCP", 1000000, 1000000)
    client = Mpc(util.MockAPI(auth_wif=alice_wif))
    bob_wif = keys.generate_wif(netcode=etc.netcode)
    bob_address = keys.address_from_wif(bob_wif)
    txid = client.block_send(source=alice_wif,
                             destination=bob_address,
                             asset="XCP",
                             quantity=42)
    assert txid is not None
예제 #7
0
    def block_send(self, **kwargs):
        """TODO doc string"""

        # replace source wif with address
        wif = kwargs.pop("source")
        kwargs["source"] = keys.address_from_wif(wif)

        # create, sign and publish transaction
        unsigned_rawtx = self.api.create_send(**kwargs)
        signed_rawtx = self.sign(unsigned_rawtx, wif)
        return self.publish(signed_rawtx)
예제 #8
0
def status(handle=None, verbose=False):
    """ Get status of connections and wallet.

    Args:
        handle (str, default=None): Optionally limit to given handle.
        verbose (bool, default=False): Optionally show additional information.

    Returns:
        {
          "connections": {
            "a0b206d1f68edb1aa24084752b5693a9022349dc547fb9952aa510003e93": {
              "asset": "XCP",
              "balance": 31337,
              "status": "open",
              "ttl": 404
            }
          },
          "wallet": {
            "address": "n2WQGAvnDS1vf7uXToLou6kLxJXRGFHo2b",
            "balances": {
              "BTC": 926109330,
              "XCP": 140982404156
            }
          }
        }
    """
    data = _load_data()
    hub_api = _hub_api()
    result = {
        "connections": {},
        "wallet": {
            "address": keys.address_from_wif(load_wif()),
            "balances": balances()
        }
    }
    for _handle, connection_data in data["connections"].items():
        if handle is not None and _handle != handle:
            continue
        client = Mph.deserialize(hub_api, connection_data)
        status = client.get_status()
        if verbose:
            status["data"] = connection_data
            result["connections"][_handle] = status
        else:
            result["connections"][_handle] = {
                "asset": status["asset"],
                "balance": status["balance"],
                "ttl": status["ttl"],
                "status": status["status"],
                "payments_queued": connection_data["payments_queued"]
            }
    return result
예제 #9
0
def gen_funded_wif(asset, asset_quantity, btc_quantity):
    src_wif = DP["addresses"][0][2]
    src_address = address_from_wif(src_wif)
    dest_wif = generate_wif(netcode=etc.netcode)
    dest_address = address_from_wif(dest_wif)
    rawtx = api.create_send(
        **{
            'source': src_address,
            'destination': dest_address,
            'asset': asset,
            'quantity': asset_quantity,
            'regular_dust_size': btc_quantity
        })
    api.sendrawtransaction(tx_hex=rawtx)
    # entries = api.get_balances(filters=[
    #     {"field": "address", "op": "==", "value": dest_address},
    #     {"field": "asset", "op": "==", "value": asset},
    # ])
    # assert entries[0]["quantity"] == asset_quantity
    # assert entries[0]["address"] == dest_address
    # assert entries[0]["asset"] == asset
    return dest_wif
예제 #10
0
 def _history_add_rawtx(self, rawtx, action, wallet_tx=True):
     address = None
     if wallet_tx:  # FIXME deduce from input/output addresses
         address = keys.address_from_wif(self.api.auth_wif)
     asset_quantity, btc_quantity = self.get_transferred(rawtx,
                                                         asset=self.asset,
                                                         address=address)
     history_add_entry(
         handle=self.handle,
         action=action,
         id=util.gettxid(rawtx),
         fee="{quantity}{asset}".format(quantity=abs(btc_quantity),
                                        asset="BTC"),
         quantity='{quantity}{asset}'.format(quantity=abs(asset_quantity),
                                             asset=self.asset))
예제 #11
0
def balances(asset=None, address=None):
    """ Get balances for address or current wallet.

    Args:
        asset (str, default=None): Optionally filter for given asset.
        address (str, default=None): Optionally provide address to check,
                                     uses wallet by default

    Returns:
        Dict mapping asset to available quantity in satoshis,
        Unconfirmed assets are ignored.

        {
            "BTC": 926109330,
            "XCP": 140982404156
        }
    """
    hub_api = _hub_api()
    assets = [asset] if asset else None
    if address is None:
        address = keys.address_from_wif(_load_wif())
    return Mpc(hub_api).get_balances(address, assets=assets)
예제 #12
0
파일: lib.py 프로젝트: F483/picopayments
def create_hub_connection(asset, client_pubkey,
                          h2c_spend_secret_hash, hub_rpc_url):

    # current terms and asset
    data = {"asset": asset}
    current_terms = get_terms().get(asset)
    data.update(current_terms)

    # new hub key
    hub_wif = load_wif()
    data["hub_pubkey"] = keys.pubkey_from_wif(hub_wif)
    data["hub_address"] = keys.address_from_wif(hub_wif)

    # client key
    data["client_pubkey"] = client_pubkey
    data["client_address"] = keys.address_from_pubkey(client_pubkey,
                                                      netcode=etc.netcode)

    # spend secret for receive channel
    data.update(create_secret())

    # send micropayment channel
    data["h2c_spend_secret_hash"] = h2c_spend_secret_hash

    # connection
    handle = util.b2h(os.urandom(32))
    data["handle"] = handle
    data["hub_rpc_url"] = hub_rpc_url

    db.add_hub_connection(data)
    return (
        {
            "handle": handle,
            "spend_secret_hash": data["secret_hash"],
            "channel_terms": current_terms
        },
        hub_wif
    )
예제 #13
0
파일: lib.py 프로젝트: F483/picopayments
def get_hub_liquidity(assets=None):
    assets = _terms_assets(assets=assets)
    if "BTC" not in assets:
        assets.append("BTC")
    address = keys.address_from_wif(load_wif())
    return get_balances(address, assets=assets)
예제 #14
0
# this is require near the top to do setup of the test suite
# from counterpartylib.test import conftest

from counterpartylib.test.util_test import CURR_DIR as CPLIB_TESTDIR
from counterpartylib.test.fixtures.params import DP
from counterpartylib.lib.micropayments.control import get_balance
from counterpartylib.lib.api import dispatcher
from micropayment_core.keys import address_from_wif
from micropayment_core.keys import generate_wif
from picopayments import api

FIXTURE_SQL_FILE = CPLIB_TESTDIR + '/fixtures/scenarios/unittest_fixture.sql'
FIXTURE_DB = tempfile.gettempdir() + '/fixtures.unittest_fixture.db'

ALICE_WIF = DP["addresses"][0][2]
ALICE_ADDRESS = address_from_wif(ALICE_WIF)
BOB_WIF = generate_wif(netcode="XTN")
BOB_ADDRESS = address_from_wif(BOB_WIF)


@pytest.mark.usefixtures("picopayments_server")
def test_commit_tx_alpha():

    rawtx = api.create_send(
        **{
            'source': ALICE_ADDRESS,
            'destination': BOB_ADDRESS,
            'asset': 'XCP',
            'quantity': 33,
            'regular_dust_size': 42
        })
# from counterpartylib.test import conftest

from counterpartylib.test.util_test import CURR_DIR as CPLIB_TESTDIR
from counterpartylib.test.fixtures.params import DP
from counterpartylib.test import util_test
from micropayment_core import keys
from picopayments_hub import api
from picopayments_hub import lib
from micropayment_core import scripts


FIXTURE_SQL_FILE = CPLIB_TESTDIR + '/fixtures/scenarios/unittest_fixture.sql'
FIXTURE_DB = tempfile.gettempdir() + '/fixtures.unittest_fixture.db'
ASSET = "XCP"
FUNDING_WIF = DP["addresses"][0][2]  # XTC: 91950000000, BTC: 199909140
FUNDING_ADDRESS = keys.address_from_wif(FUNDING_WIF)


def get_txs(txids):
    return api.getrawtransaction_batch(txhash_list=txids)


@pytest.mark.usefixtures("picopayments_server")
def test_get_hub_liquidity(server_db):

    # confirmed fund
    hub_wif = lib.load_wif()
    hub_address = keys.address_from_wif(hub_wif)
    unsigned_rawtx = api.create_send(**{
        'source': FUNDING_ADDRESS,
        'destination': hub_address,
예제 #16
0
from picopayments_hub import api
from picopayments_hub import lib
from picopayments_hub import cron
from tests import util


# from tests.util import MockAPI


FIXTURE_SQL_FILE = CPLIB_TESTDIR + '/fixtures/scenarios/unittest_fixture.sql'
FIXTURE_DB = tempfile.gettempdir() + '/fixtures.unittest_fixture.db'


ASSET = "XCP"
FUNDING_WIF = DP["addresses"][0][2]  # XTC: 91950000000, BTC: 199909140
FUNDING_ADDRESS = address_from_wif(FUNDING_WIF)


def get_txs(txids):
    return api.getrawtransaction_batch(txhash_list=txids)


@pytest.mark.usefixtures("picopayments_server")
def test_simulation_xcp():

    # fund server
    for i in range(2):
        address = lib.get_funding_address()
        unsigned_rawtx = api.create_send(**{
            'source': FUNDING_ADDRESS,
            'destination': address,
예제 #17
0
# this is require near the top to do setup of the test suite
# from counterpartylib.test import conftest

from counterpartylib.test.util_test import CURR_DIR as CPLIB_TESTDIR
from picopayments_hub import lib
from picopayments_hub import api
from pycoin.key.validate import is_address_valid
from micropayment_core.keys import address_from_wif
from counterpartylib.test.fixtures.params import DP
# from micropayment_core import scripts

FIXTURE_SQL_FILE = CPLIB_TESTDIR + '/fixtures/scenarios/unittest_fixture.sql'
FIXTURE_DB = tempfile.gettempdir() + '/fixtures.unittest_fixture.db'
FUNDING_WIF = DP["addresses"][0][2]  # XTC: 91950000000, BTC: 199909140
FUNDING_ADDRESS = address_from_wif(FUNDING_WIF)


def get_txs(txids):
    return api.getrawtransaction_batch(txhash_list=txids)


@pytest.mark.usefixtures("picopayments_server")
def test_get_funding_addresses():
    address = lib.get_funding_address()
    assert (is_address_valid(address, allowable_netcodes=["XTN"]))


@pytest.mark.usefixtures("picopayments_server")
def test_validate_read_unknown_asset():
    terms = lib.get_terms(["deadbeef"])
예제 #18
0
파일: lib.py 프로젝트: F483/picopayments
def get_funding_address():
    return keys.address_from_wif(load_wif())