def GetWithdrawalBalance(wallet, contract_hash, from_addr, asset_type): sb = ScriptBuilder() sb.EmitAppCallWithOperationAndData(contract_hash, 'balance_%s' % asset_type, from_addr) try: tx, fee, results, num_ops = test_invoke(sb.ToArray(), wallet, []) return results[0].GetBigInteger() except Exception as e: print("could not get balance: %s " % e)
def CancelWithdrawalHolds(wallet, contract_hash, require_password=True): wallet.LoadHolds() to_cancel = [] for hold in wallet._holds: if hold.FromAddress == contract_hash: to_cancel.append(hold) if len(to_cancel) < 1: print("No holds to cancel") return sb = ScriptBuilder() for hold in to_cancel: sb.EmitAppCallWithOperationAndData(hold.InputHash, 'cancel_hold', hold.Vin) try: tx, fee, results, num_ops = test_invoke(sb.ToArray(), wallet, []) for i in results: if not i.GetBoolean(): print("Error executing hold cleanup") return if require_password: print( "\n---------------------------------------------------------------" ) print("Will cancel %s holds" % len(to_cancel)) print("FEE IS %s " % fee.ToString()) print("GAS IS %s " % tx.Gas.ToString()) print( "------------------------------------------------------------------\n" ) print("Enter your password to complete this request") passwd = prompt("[Password]> ", is_password=True) if not wallet.ValidatePassword(passwd): print("incorrect password") return result = InvokeContract(wallet, tx, fee) return result except Exception as e: print("could not cancel hold(s): %s " % e)
def CleanupCompletedHolds(wallet, require_password=True): completed = wallet.LoadCompletedHolds() if len(completed) < 1: print("No holds to cleanup") return False sb = ScriptBuilder() for hold in completed: sb.EmitAppCallWithOperationAndData(hold.InputHash, 'cleanup_hold', hold.Vin) try: tx, fee, results, num_ops = test_invoke(sb.ToArray(), wallet, []) for i in results: if not i.GetBoolean(): print("Error executing hold cleanup") return False if require_password: print( "\n---------------------------------------------------------------" ) print("Will cleanup %s holds" % len(completed)) print("FEE IS %s " % fee.ToString()) print("GAS IS %s " % tx.Gas.ToString()) print( "------------------------------------------------------------------\n" ) print("Enter your password to complete this request") passwd = prompt("[Password]> ", is_password=True) if not wallet.ValidatePassword(passwd): print("incorrect password") return result = InvokeContract(wallet, tx, fee) return result except Exception as e: print("could not cancel hold(s): %s " % e) return False
def RequestWithdrawFrom(wallet, asset_id, contract_hash, to_addr, amount, require_password=True): asset_type = asset_id.lower() if asset_type not in ['neo', 'gas']: raise Exception('please specify neo or gas to withdraw') readable_addr = to_addr asset_id = get_asset_id(wallet, asset_type) contract = Blockchain.Default().GetContract(contract_hash) shash = contract.Code.ScriptHash() contract_addr = Crypto.ToAddress(shash) to_addr = parse_param(to_addr, wallet) amount = get_asset_amount(amount, asset_id) if shash not in wallet._watch_only: print("Add withdrawal contract address to your watch only: import watch_addr %s " % contract_addr) return False if amount < Fixed8.Zero(): print("Cannot withdraw negative amount") return False unspents = wallet.FindUnspentCoinsByAssetAndTotal( asset_id=asset_id, amount=amount, from_addr=shash, use_standard=False, watch_only_val=64, reverse=True ) if not unspents or len(unspents) == 0: print("no eligible withdrawal vins") return False balance = GetWithdrawalBalance(wallet, shash, to_addr, asset_type) balance_fixed8 = Fixed8(balance) orig_amount = amount if amount <= balance_fixed8: sb = ScriptBuilder() for uns in unspents: if amount > Fixed8.Zero(): to_spend = amount if to_spend > uns.Output.Value: to_spend = uns.Output.Value amount_bytes = bytearray(to_spend.value.to_bytes(8, 'little')) data = to_addr + amount_bytes data = data + uns.RefToBytes() sb.EmitAppCallWithOperationAndData(shash, 'withdraw_%s' % asset_type, data) amount -= uns.Output.Value tx, fee, results, num_ops = test_invoke(sb.ToArray(), wallet, []) for item in results: if not item.GetBoolean(): print("Error performitng withdrawals") return False if require_password: print("\n---------------------------------------------------------------") print("Will make withdrawal request for %s %s from %s to %s " % (orig_amount.ToString(), asset_type, contract_addr, readable_addr)) print("FEE IS %s " % fee.ToString()) print("GAS IS %s " % tx.Gas.ToString()) print("------------------------------------------------------------------\n") print("Enter your password to complete this request") passwd = prompt("[Password]> ", is_password=True) if not wallet.ValidatePassword(passwd): print("incorrect password") return result = InvokeContract(wallet, tx, fee) return result else: print("insufficient balance") return False