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)
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
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
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"
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
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)
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