Пример #1
0
    def setup_api_client(self, api_key=None, api_secret=None, debug=True):
        if api_key is None:
            api_key = os.environ.get('BLOCKTRAIL_SDK_APIKEY',
                                     'EXAMPLE_BLOCKTRAIL_SDK_PYTHON_APIKEY')
        if api_secret is None:
            api_secret = os.environ.get(
                'BLOCKTRAIL_SDK_APISECRET',
                'EXAMPLE_BLOCKTRAIL_SDK_PYTHON_APISECRET')

        return blocktrail.APIClient(api_key, api_secret, debug=debug)
Пример #2
0
from __future__ import print_function
import blocktrail
from blocktrail.exceptions import ObjectNotFound

client = blocktrail.APIClient("MY_APIKEY", "MY_APISECRET", testnet=True)

try:
    wallet = client.init_wallet("example-wallet", "example-strong-password")
except ObjectNotFound:
    wallet, primary_mnemonic, backup_mnemonic, blocktrail_pubkeys = client.create_new_wallet(
        "example-wallet", "example-strong-password", key_index=9999)
    wallet.do_discovery()

print(wallet.get_new_address_pair())

print(wallet.get_balance())

path, address = wallet.get_new_address_pair()

print(wallet.pay([(address, blocktrail.to_satoshi(0.001))]))
Пример #3
0
from __future__ import print_function

import os
import glob
from time import sleep

import blocktrail

while True:
    try:
        client = blocktrail.APIClient(api_key="731ac7a92afe05e7640b3e89d69ecce514d3ea1d", api_secret="cb816f06d9722244f7489deb71cc65c43b97bccd", network="BTC", testnet=False)

        # address = client.address('3ETGrUjxeuC1e8nY8EP7U2EUcvffX76AKC')

        try:
            newest = max(glob.iglob('*.json'))
            prev_block = int(os.path.splitext(newest)[0])
        except ValueError as e:
            print(e)
            prev_block = 0

        print('Last block at the system: %s' % str(prev_block))
        print('Pause before the main loop... :)')
        sleep(10)

        while True:
            latest_block = client.block_latest()
            last_block = latest_block['height']
            for i in xrange(prev_block, last_block):
                try:
                    b = client.block(i)
Пример #4
0
class SpoolAction(Task):
    abstract = True
    spool = None
    transactions = None

    # initialize if BTC is enabled
    if settings.BTC_ENABLED:
        logger.info('Using service: {}'.format(settings.BTC_SERVICE))
        spool = BackendSpool(service=settings.BTC_SERVICE,
                             username=settings.BTC_USERNAME,
                             password=settings.BTC_PASSWORD,
                             host=settings.BTC_HOST,
                             port=settings.BTC_PORT,
                             testnet=settings.BTC_TESTNET,
                             fee=settings.BTC_FEE,
                             token=settings.BTC_TOKEN)
        transactions = spool._t

        # blocktrail client
        blocktrail_client = blocktrail.APIClient(
            api_key=settings.BLOCKTRAIL_API_KEY,
            api_secret=settings.BLOCKTRAIL_API_SECRET,
            testnet=settings.BTC_TESTNET)

    def __call__(self, *args, **kwargs):
        # we will catch exceptions here, analyse them and decide what to do later
        try:
            # call only if btc is enabled
            if settings.BTC_ENABLED:
                return super(SpoolAction, self).__call__(*args, **kwargs)
            else:
                logger.info('BTC_ENABLED is False. Skipping: {}'.format(
                    self.name))

        except Exception as e:
            # TODO: Log exception
            print e
            if super(SpoolAction, self).__name__ not in [
                    'monitor', 'do_transaction', 'monitor_refill',
                    'transaction_monitor', 'initialize'
            ]:
                countdown = randint(100, 120)
                logger.info('retrying task {} in {}s'.format(
                    super(SpoolAction, self).__name__, countdown))
                self.retry(exc=e, countdown=countdown, max_retries=5)
            else:
                raise

    def after_return(self, status, retval, task_id, args, kwargs, einfo):
        pass

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        analyser.apply_async((exc, task_id, args, kwargs, einfo))

    def on_retry(self, exc, task_id, args, kwargs, einfo):
        pass

    def on_success(self, retval, task_id, args, kwargs):
        # call subscribe to blocktrail event
        if settings.BTC_ENABLED and self.name not in [
                'bitcoin.tasks.transaction_monitor',
                'bitcoin.tasks.check_status',
                'bitcoin.tasks.refill_main_wallet', 'bitcoin.tasks.initialize',
                'bitcoin.tasks.initialize_federation_wallet',
                'bitcoin.tasks.import_addresses',
                'bitcoin.tasks.import_address',
                'bitcoin.tasks.create_refill_chunks'
        ]:
            self.blocktrail_subscribe(retval)

    def blocktrail_subscribe(self, txid):
        logger.info('Subscribing to events on {}'.format(txid))
        self.blocktrail_client.subscribe_transaction(
            identifier='confirmations', transaction=txid, confirmations=1)

    def blocktrail_unsubscribe(self, txid):
        logger.info('Unsubscribing to events on {}'.format(txid))
        try:
            self.blocktrail_client.unsubscribe_transaction(
                identifier='confirmations', transaction=txid)
        except blocktrail.exceptions.ObjectNotFound:
            logger.info('{} webhook not found'.format(txid))

    def select_chunk(self):
        """
        Select chunk to refill_main_wallet with a locked table to avoid race conditions
        """

        print 'selecting chunks'
        cursor = connection.cursor()
        cursor.execute(query_sql_refill)
        desc = cursor.description
        unspents = [
            dict(zip([col[0] for col in desc], row))
            for row in cursor.fetchall()
        ]

        if len(unspents) == 0:
            raise SpoolFundsError('Not enough unspents for transaction')

        chunks = filter(lambda d: d['amount'] == settings.BTC_CHUNK, unspents)
        return chunks
from __future__ import print_function
import blocktrail

client = blocktrail.APIClient("YOUR_APIKEY_HERE", "YOUR_APISECRET_HERE")

address = client.address("1dice8EMZmqKvrGE4Qc9bUFf9PX3xaYDp")
print(address['address'], address['balance'])

print(
    len(
        client.address_transactions("1dice8EMZmqKvrGE4Qc9bUFf9PX3xaYDp")
        ['data']))

print(
    client.verify_address(
        "16dwJmR4mX5RguGrocMfN9Q9FR2kZcLw2z",
        "HPMOHRgPSMKdXrU6AqQs/i9S7alOakkHsJiqLGmInt05Cxj6b/WhS7kJxbIQxKmDW08YKzoFnbVZIoTI2qofEzk="
    ))

# Dealing with numbers
print("123456789 Satoshi to BTC: ", blocktrail.to_btc(123456789))
print("1.23456789 BTC to Satoshi: ", blocktrail.to_satoshi(1.23456789))
Пример #6
0
def main():
    parser = argparse.ArgumentParser(
        description="Process blinktrade withdrawals requests")

    parser.add_argument('-c',
                        "--config",
                        action="store",
                        dest="config",
                        help='Configuration file',
                        type=str)

    arguments = parser.parse_args()

    candidates = [
        os.path.join(site_config_dir('blinktrade'),
                     'blinktrade_withdrawer.ini'),
        os.path.expanduser('~/.blinktrade/blinktrade_withdrawer.ini')
    ]
    if arguments.config:
        candidates.append(arguments.config)

    config = ConfigParser.SafeConfigParser()
    config.read(candidates)

    password = getpass.getpass('password: '******'ws':
        should_connect_on_ssl = False
        blinktrade_port = 80

    db_engine = config.get("database", "sqlalchemy_engine") + ':///' +\
                os.path.expanduser(config.get("database", "sqlalchemy_connection_string"))
    engine = create_engine(db_engine,
                           echo=config.getboolean('database',
                                                  'sqlalchmey_verbose'))
    Base.metadata.create_all(engine)

    factory = BlinkTradeClientFactory(blinktrade_url.geturl())
    factory.db_session = scoped_session(sessionmaker(bind=engine))
    factory.verbose = config.getboolean("blinktrade", "verbose")
    factory.blinktrade_broker_id = config.get("blinktrade", "broker_id")
    factory.blinktrade_user = config.get("blinktrade", "api_key")
    factory.blinktrade_password = decrypt(
        password, unhexlify(config.get("blinktrade", "api_password")))
    factory.currencies = json.loads(config.get("blinktrade", "currencies"))
    factory.methods = json.loads(config.get("blinktrade", "methods"))
    factory.blocked_accounts = json.loads(
        config.get("blinktrade", "blocked_accounts"))
    factory.mandrill_api = mandrill_api

    if config.has_section('blockchain_info'):
        from blockchain_info import BlockchainInfoWithdrawalProtocol
        factory.blockchain_guid = decrypt(
            password, unhexlify(config.get("blockchain_info", "guid")))
        factory.blockchain_main_password = decrypt(
            password, unhexlify(config.get("blockchain_info",
                                           "main_password")))
        factory.blockchain_second_password = decrypt(
            password,
            unhexlify(config.get("blockchain_info", "second_password")))
        factory.blockchain_api_key = config.get("blockchain_info", "api_key")
        factory.from_address = config.get("blockchain_info", "from_address")
        factory.note = config.get("blockchain_info", "note")
        factory.protocol = BlockchainInfoWithdrawalProtocol

    if config.has_section('blocktrail'):
        import blocktrail
        from mnemonic.mnemonic import Mnemonic
        from pycoin.key.BIP32Node import BIP32Node
        is_testnet = False
        if config.get("blocktrail", "testnet") == '1':
            is_testnet = True

        client = blocktrail.APIClient(
            api_key=config.get("blocktrail", "api_key"),
            api_secret=decrypt(
                password, unhexlify(config.get("blocktrail", "api_secret"))),
            network='BTC',
            testnet=is_testnet)
        data = client.get_wallet(config.get("blocktrail", "wallet_identifier"))

        primary_seed = Mnemonic.to_seed(
            data['primary_mnemonic'],
            decrypt(password,
                    unhexlify(config.get("blocktrail", "wallet_passphrase"))))
        primary_private_key = BIP32Node.from_master_secret(
            primary_seed, netcode='XTN' if client.testnet else 'BTC')
        backup_public_key = BIP32Node.from_hwif(data['backup_public_key'][0])
        checksum = client.create_checksum(primary_private_key)
        if checksum != data['checksum']:
            raise Exception("Checksum [%s] does not match expected checksum [%s], " \
                            "most likely due to incorrect password" % (checksum, data['checksum']))

        blocktrail_public_keys = {}
        for v, k in data['blocktrail_public_keys']:
            if k in blocktrail_public_keys:
                blocktrail_public_keys[k].append(v)
            else:
                blocktrail_public_keys[k] = [v]

        key_index = data['key_index']

        wallet = blocktrail.wallet.Wallet(
            client=client,
            identifier=config.get("blocktrail", "wallet_identifier"),
            primary_mnemonic=data['primary_mnemonic'],
            primary_private_key=primary_private_key,
            backup_public_key=backup_public_key,
            blocktrail_public_keys=blocktrail_public_keys,
            key_index=key_index,
            testnet=client.testnet)

        from blocktrail_protocol import BlocktrailWithdrawalProtocol
        factory.blocktrail_wallet = wallet
        factory.blocktrail_change_address = config.get("blocktrail",
                                                       "change_address")
        factory.protocol = BlocktrailWithdrawalProtocol

    if config.has_section('mailer'):
        from mailer_protocol import MailerWithdrawalProtocol
        factory.mandrill_apikey = config.get("mailer", "mandrill_apikey")
        factory.mandrill_template_name = config.get("mailer", "template_name")
        factory.mandrill_from_email = config.get("mailer", "from_email")
        factory.mandrill_from_name = config.get("mailer", "from_name")
        factory.mandrill_to_email = config.get("mailer", "to_email")
        factory.mandrill_to_name = config.get("mailer", "to_name")
        factory.mandrill_website = config.get("mailer", "website")
        factory.protocol = MailerWithdrawalProtocol

    if should_connect_on_ssl:
        reactor.connectSSL(blinktrade_url.netloc, blinktrade_port, factory,
                           ssl.ClientContextFactory())
    else:
        reactor.connectTCP(blinktrade_url.netloc, blinktrade_port, factory)

    reactor.run()
Пример #7
0
import os
import blocktrail
import json
import sys
from utils import *

FETCH_HISTORY = 'FETCH_HISTORY'
if __name__ == '__main__':
    client = blocktrail.APIClient(api_key=os.environ['BLOCKTRAIL_KEY'],
                                  api_secret=os.environ['BLOCKTRAIL_SECRET'],
                                  network="BTC",
                                  testnet=False)

    block_hash = ''
    prev_block_hash = ''
    block = None

    blocks = {'fetch_next': None, 'fetched': []}
    if not os.path.exists(FETCH_HISTORY) or len(sys.argv) > 1:
        block = client.block_latest()
        block_hash = block['hash']
    else:
        with open(FETCH_HISTORY) as fin:
            blocks = json.loads(fin.read().strip())
            block = client.block(blocks['fetch_next'])

    per_page = 100
    page = 1
    print("Fetching transactions for block", block['hash'])
    print("There are a total of %d transactions in this block" %
          block['transactions'])
Пример #8
0
from django.conf import settings
from getenv import env

import blocktrail


#Blocktrail API config
NETWORK = env('NETWORK','BTC')
TESTNET = env('TESTNET', True)

#Blocktrail webhook
IDENTIFIER = "towan"
CONFIRMATIONS = 0

client = blocktrail.APIClient(api_key=settings.MY_APIKEY, api_secret=settings.MY_APISECRET, network=NETWORK, testnet=TESTNET)

def subscribe_address_event(address):
    """ Suscribe to blocktrail transaction event webhook on address """
    try:
        client.subscribe_address_transactions(identifier=IDENTIFIER, address=address, confirmations=CONFIRMATIONS)
    except Exception as e:
        print '%s (%s)' % (e.message, type(e))

def unsubscribe_address_event(address):
    """ Unsuscribe to blocktrail transaction event webhook on address """
    try:
        client.unsubscribe_address_transactions(identifier=IDENTIFIER, address=address)
    except Exception as e:
        print '%s (%s)' % (e.message, type(e))