use of com.samourai.wallet.utxos.models.UTXOCoin in project samourai-wallet-android by Samourai-Wallet.
the class ChooseUTXOsFragment method selectOrDeselect.
private void selectOrDeselect(int position) {
utxos.get(position).isSelected = !utxos.get(position).isSelected;
utxoRecyclerView.post(() -> utxoAdapter.notifyItemChanged(position));
List<UTXOCoin> selectedList = new ArrayList<>();
for (UTXOCoin model : utxos) {
if (model.isSelected) {
selectedList.add(model);
}
}
if (onUTXOSelectionListener != null)
onUTXOSelectionListener.onSelect(selectedList);
}
use of com.samourai.wallet.utxos.models.UTXOCoin in project samourai-wallet-android by Samourai-Wallet.
the class NewPoolActivity method onCreate.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_whirlpool_cycle);
Toolbar toolbar = findViewById(R.id.toolbar_new_whirlpool);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
cycleTotalAmount = findViewById(R.id.cycle_total_amount);
cycleTotalAmount.setText(MonetaryUtil.getInstance().getBTCFormat().format(((double) getCycleTotalAmount(new ArrayList<UTXOCoin>())) / 1e8) + " BTC");
fees.add(FeeUtil.getInstance().getLowFee().getDefaultPerKB().longValue() / 1000L);
fees.add(FeeUtil.getInstance().getNormalFee().getDefaultPerKB().longValue() / 1000L);
fees.add(FeeUtil.getInstance().getHighFee().getDefaultPerKB().longValue() / 1000L);
String preselectId = null;
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("preselected")) {
preselectId = getIntent().getExtras().getString("preselected");
}
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("_account")) {
account = getIntent().getExtras().getInt("_account");
}
chooseUTXOsFragment = ChooseUTXOsFragment.newInstance(preselectId);
selectPoolFragment = new SelectPoolFragment();
reviewPoolFragment = new ReviewPoolFragment();
selectPoolFragment.setFees(this.fees);
tx0Progress = findViewById(R.id.new_pool_tx0_progress);
newPoolViewPager = findViewById(R.id.new_pool_viewpager);
setUpStepper();
newPoolViewPager.setAdapter(new NewPoolStepsPager(getSupportFragmentManager()));
newPoolViewPager.enableSwipe(false);
confirmButton = findViewById(R.id.utxo_selection_confirm_btn);
confirmButton.setVisibility(View.VISIBLE);
enableConfirmButton(false);
// Disable selection from fragment since post mix utxo's are populated by the activity
if (account != WhirlpoolMeta.getInstance(getApplicationContext()).getWhirlpoolPostmix())
chooseUTXOsFragment.setOnUTXOSelectionListener(this::onUTXOSelected);
selectPoolFragment.setOnPoolSelectionComplete((poolViewModel, priority) -> {
selectedPoolViewModel = poolViewModel;
selectedPoolPriority = priority;
if (tx0 != null && poolViewModel != null) {
tx0.setPool(poolViewModel.getDenomination());
}
enableConfirmButton(selectedPoolViewModel != null);
});
confirmButton.setOnClickListener(view -> {
switch(newPoolViewPager.getCurrentItem()) {
case 0:
{
newPoolViewPager.setCurrentItem(1);
initUTXOReviewButton(selectedCoins);
enableConfirmButton(selectedPoolViewModel != null);
break;
}
case 1:
{
try {
tx0.make();
} catch (Exception ex) {
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
return;
}
calculateTx0(selectedPoolViewModel.getDenomination(), selectedPoolViewModel.getMinerFee() / 1000L);
newPoolViewPager.setCurrentItem(2);
confirmButton.setText(getString(R.string.begin_cycle));
confirmButton.setBackgroundResource(R.drawable.button_green);
reviewPoolFragment.setTx0(tx0);
break;
}
case 2:
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.block_tx0_change).setCancelable(false);
AlertDialog alert = builder.create();
alert.setTitle(R.string.doxxic_change_warning);
alert.setButton(AlertDialog.BUTTON_POSITIVE, getString(R.string.yes), (dialog, id) -> {
dialog.dismiss();
blockChangeOutput = true;
processWhirlPool();
});
alert.setButton(AlertDialog.BUTTON_NEGATIVE, getString(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
blockChangeOutput = false;
processWhirlPool();
}
});
if (!isFinishing()) {
alert.show();
}
break;
}
}
});
setUpViewPager();
if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("_account")) {
if (account == WhirlpoolMeta.getInstance(getApplication()).getWhirlpoolPostmix()) {
selectedCoins.clear();
List<UTXOCoin> coinList = PreSelectUtil.getInstance().getPreSelected(preselectId);
try {
onUTXOSelected(coinList);
newPoolViewPager.setCurrentItem(1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
use of com.samourai.wallet.utxos.models.UTXOCoin in project samourai-wallet-android by Samourai-Wallet.
the class NewPoolActivity method beginTx0.
private Completable beginTx0(List<UTXOCoin> coins) {
return Completable.fromCallable(() -> {
Optional<WhirlpoolWallet> whirlpoolWalletOpt = AndroidWhirlpoolWalletService.getInstance().getWhirlpoolWallet();
if (!whirlpoolWalletOpt.isPresent()) {
return true;
}
WhirlpoolWallet whirlpoolWallet = whirlpoolWalletOpt.get();
Collection<UnspentOutputWithKey> spendFroms = new ArrayList<UnspentOutputWithKey>();
for (UTXOCoin coin : coins) {
UnspentResponse.UnspentOutput unspentOutput = new UnspentResponse.UnspentOutput();
unspentOutput.addr = coin.address;
unspentOutput.script = Hex.toHexString(coin.getOutPoint().getScriptBytes());
unspentOutput.confirmations = coin.getOutPoint().getConfirmations();
unspentOutput.tx_hash = coin.getOutPoint().getTxHash().toString();
unspentOutput.tx_output_n = coin.getOutPoint().getTxOutputN();
unspentOutput.value = coin.amount;
unspentOutput.xpub = new UnspentResponse.UnspentOutput.Xpub();
unspentOutput.xpub.path = "M/0/0";
ECKey eckey = SendFactory.getPrivKey(coin.address, account);
UnspentOutputWithKey spendFrom = new UnspentOutputWithKey(unspentOutput, eckey.getPrivKeyBytes());
spendFroms.add(spendFrom);
}
if (selectedPoolPriority == PoolCyclePriority.HIGH) {
tx0FeeTarget = Tx0FeeTarget.BLOCKS_2;
} else if (selectedPoolPriority == PoolCyclePriority.NORMAL) {
tx0FeeTarget = Tx0FeeTarget.BLOCKS_6;
} else if (selectedPoolPriority == PoolCyclePriority.LOW) {
tx0FeeTarget = Tx0FeeTarget.BLOCKS_24;
}
com.samourai.whirlpool.client.whirlpool.beans.Pool pool = whirlpoolWallet.findPoolById(selectedPoolViewModel.getPoolId());
Tx0Config tx0Config;
if (account == WhirlpoolMeta.getInstance(getApplicationContext()).getWhirlpoolPostmix()) {
tx0Config = whirlpoolWallet.getTx0Config().setChangeWallet(WhirlpoolWalletAccount.POSTMIX);
} else {
tx0Config = whirlpoolWallet.getTx0Config().setChangeWallet(WhirlpoolWalletAccount.DEPOSIT);
}
Tx0 tx0 = null;
try {
tx0 = whirlpoolWallet.tx0(pool, spendFroms, tx0Config, tx0FeeTarget);
final String txHash = tx0.getTx().getHashAsString();
// tx0 success
if (tx0.getChangeOutput() != null) {
Log.i("NewPoolActivity", "change:" + tx0.getChangeOutput().toString());
Log.i("NewPoolActivity", "change index:" + tx0.getChangeOutput().getIndex());
UTXOUtil.getInstance().add(txHash + "-" + tx0.getChangeOutput().getIndex(), "\u2623 tx0 change\u2623");
UTXOUtil.getInstance().addNote(txHash, "tx0");
if (blockChangeOutput) {
if (account == WhirlpoolMeta.getInstance(getApplicationContext()).getWhirlpoolPostmix()) {
BlockedUTXO.getInstance().addPostMix(txHash, tx0.getChangeOutput().getIndex(), tx0.getChangeValue());
} else {
BlockedUTXO.getInstance().add(txHash, tx0.getChangeOutput().getIndex(), tx0.getChangeValue());
}
}
}
NewPoolActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(NewPoolActivity.this, txHash, Toast.LENGTH_SHORT).show();
}
});
Log.i("NewPoolActivity", "result:" + txHash);
} catch (Exception e) {
// tx0 failed
NewPoolActivity.this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(NewPoolActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
Log.i("NewPoolActivity", "result:" + e.getMessage());
}
return true;
});
}
use of com.samourai.wallet.utxos.models.UTXOCoin in project samourai-wallet-android by Samourai-Wallet.
the class UTXOSActivity method markAsSpendable.
private void markAsSpendable() {
for (UTXOCoin model : filteredUTXOs) {
if (model.isSelected) {
if (model.amount < BlockedUTXO.BLOCKED_UTXO_THRESHOLD && BlockedUTXO.getInstance().contains(model.hash, model.idx)) {
BlockedUTXO.getInstance().remove(model.hash, model.idx);
BlockedUTXO.getInstance().addNotDusted(model.hash, model.idx);
} else if (BlockedUTXO.getInstance().contains(model.hash, model.idx)) {
BlockedUTXO.getInstance().remove(model.hash, model.idx);
} else if (BlockedUTXO.getInstance().containsPostMix(model.hash, model.idx)) {
BlockedUTXO.getInstance().removePostMix(model.hash, model.idx);
}
utxoList.post(() -> loadUTXOs(true));
setResult(RESULT_OK);
}
}
saveWalletState();
}
use of com.samourai.wallet.utxos.models.UTXOCoin in project samourai-wallet-android by Samourai-Wallet.
the class UTXOSActivity method calculateSelectedAmount.
private void calculateSelectedAmount() {
long amount = 0L;
for (UTXOCoin model : this.filteredUTXOs) {
if (model.isSelected) {
amount = amount + model.amount;
}
}
toolbarActionMode.setTitle(df.format(((double) (amount) / 1e8)) + " BTC");
}
Aggregations