Example #1
0
    def sign_tx(self, pw):
        if not self.is_wallet_loaded:
            raise Exception('Tried to spend when wallet not loaded.')

        if not self.is_dest_addr_set:
            raise Exception('Tried to spend when destination address not set.')

        if not self.is_send_amount_set:
            raise Exception('Tried to spend when amount not set.')
        
        if self.send_amount + self.txfee > self.balance:
            raise LowBalanceError("Insufficient funds to send {0} + {1} BTC.".format(core.satoshi_to_btc(self.send_amount), core.satoshi_to_btc(self.txfee)))
            
        try:
            prv = wallet.decrypt_privkey(self.encr_privkey, pw)
            addr = bc.privtoaddr(prv, self.magic_byte)
        except:
            raise PasswordError("Wrong password!")
        
        if addr != self.addr:
            raise Exception('Address from wallet does not match address from private key!')

        tx_ins, tx_outs = core.simple_tx_inputs_outputs(self.addr, self.unspent, self.dest_addr, self.send_amount, self.txfee)
        
        # Make transaction
        tx = bc.mktx(tx_ins, tx_outs)
        
        # Sign transaction
        for i in range(len(tx_ins)):
            tx = bc.sign(tx,i,prv)
        
        return tx_ins, tx_outs, tx, bc.deserialize(tx)
Example #2
0
 def build_transaction(self, inputs, outputs):
     # prepare inputs and outputs for pybitcointools
     inputs = [{
         'output': '{}:{}'.format(input['txid'], input['vout']),
         'value': input['amount']
     } for input in inputs]
     tx = pybitcointools.mktx(inputs, outputs)
     return tx
Example #3
0
    def build_transaction(self, inputs, outputs):
        """
        Thin wrapper around ``pybitcointools.mktx(inputs, outputs)``

        Args:
            inputs (dict): inputs in the form of
                ``{'output': 'txid:vout', 'value': amount in satoshi}``
            outputs (dict): outputs in the form of
                ``{'address': to_address, 'value': amount in satoshi}``
        Returns:
            transaction
        """
        # prepare inputs and outputs for pybitcointools
        inputs = [{'output': '{}:{}'.format(input['txid'], input['vout']),
                   'value': input['amount']} for input in inputs]
        tx = pybitcointools.mktx(inputs, outputs)
        return tx
Example #4
0
def make_raw_transaction_from_specific_inputs(fromaddress, amount, \
    destination, unspents, fee=default_fee):
    ins = []
    outs = []
    totalin = 0

    for uns in unspents:
        totalin = totalin+uns['value']
        ins.append(uns)

    if totalin >= amount + fee:
        if amount >= dust:
            outs.append({'value': amount, 'address': destination})

        extra = totalin-amount-fee
        if extra >= dust:
            outs.append({'value':extra, 'address':fromaddress})
        tx = pybitcointools.mktx(ins, outs)
        return tx
    else:
        print "INSUFFICIENT BITCOIN"
Example #5
0
def make_raw_transaction_from_specific_inputs_arrays(fromaddress, \
    amounts_array, destinations_array, unspents, fee=default_fee):
    ins = []
    outs = []
    totalin = 0
    total_amounts = 0
    for uns in unspents:
        totalin = totalin + uns['value']
        ins.append(uns)
    for x in amounts_array:
        total_amounts += x
    if totalin >= total_amounts + fee:
        for n, x in enumerate(amounts_array):
            if x >= dust:
                d = destinations_array[n]
                outs.append({'value': x, 'address': d})
        extra = totalin - total_amounts - fee
        if extra >= dust:
            outs.append({'value': extra, 'address': fromaddress})
        tx = pybitcointools.mktx(ins, outs)

        return tx
Example #6
0
                data = json.loads(data)
                break
            except ValueError:
                print "Decode error (carriage returns are not allowed)"
                continue

        availableBalance = base.check_unspent(data["u"])

        # build tx
        outs = [{'value' : availableBalance - sum(data["amounts"]), 'address' : data["source"]}]  # change
        if outs[0]["value"] == 0:
            outs = []
        for i, t in enumerate(data["targets"]):
            outs.append({'value' : data["amounts"][i], 'address' : data["targets"][i]})

        rtx = pbt.mktx(data["u"], outs)  # serialized tx
        dtx = pbt.deserialize(rtx)

        base.display_dtx(dtx, data)

        print "Check balance and targets. Remove your data source (USB-stick)."
        print "Press <enter> to proceed, <ctrl-c> to cancel."
        raw_input()
        print

        print "Enter private key or (double) Electrum seed:"
        priv = raw_input().strip()
        if " " in priv:
            seed = mnemonic.mn_decode(priv.split(" "))
            priv = pbt.electrum_privkey(seed, 0, 0)  # root key
        source = pbt.privkey_to_address(priv)
Example #7
0
 def build_transaction(self, inputs, outputs):
     # prepare inputs and outputs for pybitcointools
     inputs = [{'output': '{}:{}'.format(input['txid'], input['vout']),
                'value': input['amount']} for input in inputs]
     tx = pybitcointools.mktx(inputs, outputs)
     return tx