Search in sources :

Example 1 with Tx0

use of com.samourai.whirlpool.client.tx0.Tx0 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();
            }
        }
    }
}
Also used : AlertDialog(android.app.AlertDialog) MonetaryUtil(com.samourai.wallet.util.MonetaryUtil) PoolViewModel(com.samourai.wallet.whirlpool.models.PoolViewModel) LinearLayout(android.widget.LinearLayout) Bundle(android.os.Bundle) Spannable(android.text.Spannable) Completable(io.reactivex.Completable) ImageView(android.widget.ImageView) UnspentOutputWithKey(com.samourai.whirlpool.client.tx0.UnspentOutputWithKey) Optional(java8.util.Optional) AndroidSchedulers(io.reactivex.android.schedulers.AndroidSchedulers) WhirlpoolMeta(com.samourai.wallet.whirlpool.WhirlpoolMeta) SelectPoolFragment(com.samourai.wallet.whirlpool.newPool.fragments.SelectPoolFragment) Tx0(com.samourai.whirlpool.client.tx0.Tx0) FragmentPagerAdapter(android.support.v4.app.FragmentPagerAdapter) WhirlpoolWallet(com.samourai.whirlpool.client.wallet.WhirlpoolWallet) Handler(android.os.Handler) View(android.view.View) Button(android.widget.Button) ReviewPoolFragment(com.samourai.wallet.whirlpool.newPool.fragments.ReviewPoolFragment) Schedulers(io.reactivex.schedulers.Schedulers) UTXOUtil(com.samourai.wallet.utxos.UTXOUtil) Log(android.util.Log) BOLD(android.graphics.Typeface.BOLD) PreSelectUtil(com.samourai.wallet.utxos.PreSelectUtil) FeeUtil(com.samourai.wallet.send.FeeUtil) AndroidWhirlpoolWalletService(com.samourai.whirlpool.client.wallet.AndroidWhirlpoolWalletService) Collection(java.util.Collection) Fragment(android.support.v4.app.Fragment) ContextCompat(android.support.v4.content.ContextCompat) ChooseUTXOsFragment(com.samourai.wallet.whirlpool.newPool.fragments.ChooseUTXOsFragment) AppCompatActivity(android.support.v7.app.AppCompatActivity) ECKey(org.bitcoinj.core.ECKey) AlertDialog(android.app.AlertDialog) List(java.util.List) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) Disposable(io.reactivex.disposables.Disposable) TextView(android.widget.TextView) Tx0FeeTarget(com.samourai.whirlpool.client.wallet.beans.Tx0FeeTarget) WhirlpoolTx0(com.samourai.wallet.whirlpool.WhirlpoolTx0) Snackbar(android.support.design.widget.Snackbar) WhirlpoolWalletAccount(com.samourai.whirlpool.client.wallet.beans.WhirlpoolWalletAccount) BlockedUTXO(com.samourai.wallet.send.BlockedUTXO) UnspentResponse(com.samourai.wallet.api.backend.beans.UnspentResponse) MenuItem(android.view.MenuItem) Hex(org.bouncycastle.util.encoders.Hex) ArrayList(java.util.ArrayList) SendFactory(com.samourai.wallet.send.SendFactory) PoolCyclePriority(com.samourai.wallet.whirlpool.models.PoolCyclePriority) Toast(android.widget.Toast) DialogInterface(android.content.DialogInterface) UTXOCoin(com.samourai.wallet.utxos.models.UTXOCoin) SpannableString(android.text.SpannableString) Tx0Config(com.samourai.whirlpool.client.tx0.Tx0Config) StyleSpan(android.text.style.StyleSpan) RelativeSizeSpan(android.text.style.RelativeSizeSpan) R(com.samourai.wallet.R) ViewPager(com.samourai.wallet.widgets.ViewPager) FragmentManager(android.support.v4.app.FragmentManager) Toolbar(android.support.v7.widget.Toolbar) WhirlpoolNotificationService(com.samourai.wallet.whirlpool.service.WhirlpoolNotificationService) Activity(android.app.Activity) LogUtil(com.samourai.wallet.util.LogUtil) DialogInterface(android.content.DialogInterface) ReviewPoolFragment(com.samourai.wallet.whirlpool.newPool.fragments.ReviewPoolFragment) SpannableString(android.text.SpannableString) UTXOCoin(com.samourai.wallet.utxos.models.UTXOCoin) SelectPoolFragment(com.samourai.wallet.whirlpool.newPool.fragments.SelectPoolFragment) Toolbar(android.support.v7.widget.Toolbar)

Example 2 with Tx0

use of com.samourai.whirlpool.client.tx0.Tx0 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;
    });
}
Also used : ArrayList(java.util.ArrayList) ECKey(org.bitcoinj.core.ECKey) SpannableString(android.text.SpannableString) UnspentOutputWithKey(com.samourai.whirlpool.client.tx0.UnspentOutputWithKey) Tx0(com.samourai.whirlpool.client.tx0.Tx0) WhirlpoolTx0(com.samourai.wallet.whirlpool.WhirlpoolTx0) UnspentResponse(com.samourai.wallet.api.backend.beans.UnspentResponse) UTXOCoin(com.samourai.wallet.utxos.models.UTXOCoin) WhirlpoolWallet(com.samourai.whirlpool.client.wallet.WhirlpoolWallet) Tx0Config(com.samourai.whirlpool.client.tx0.Tx0Config)

Example 3 with Tx0

use of com.samourai.whirlpool.client.tx0.Tx0 in project samourai-wallet-android by Samourai-Wallet.

the class AndroidWhirlpoolWalletService method computeWhirlpoolWalletConfig.

protected WhirlpoolWalletConfig computeWhirlpoolWalletConfig(TorManager torManager, WhirlpoolWalletPersistHandler persistHandler, boolean testnet, boolean onion, int mixsTarget, String scode, IHttpClient httpClient, BackendApi backendApi) {
    IStompClientService stompClientService = new AndroidStompClientService(torManager);
    WhirlpoolServer whirlpoolServer = testnet ? WhirlpoolServer.TESTNET : WhirlpoolServer.MAINNET;
    String serverUrl = whirlpoolServer.getServerUrl(onion);
    NetworkParameters params = whirlpoolServer.getParams();
    WhirlpoolWalletConfig whirlpoolWalletConfig = new WhirlpoolWalletConfig(httpClient, stompClientService, persistHandler, serverUrl, params, true, backendApi);
    // disable auto-tx0
    whirlpoolWalletConfig.setAutoTx0PoolId(null);
    // enable auto-mix
    whirlpoolWalletConfig.setAutoMix(true);
    whirlpoolWalletConfig.setMixsTarget(mixsTarget);
    whirlpoolWalletConfig.setScode(scode);
    whirlpoolWalletConfig.setMaxClients(1);
    whirlpoolWalletConfig.setSecretPointFactory(AndroidSecretPointFactory.getInstance());
    whirlpoolWalletConfig.setTx0Service(new AndroidTx0Service(whirlpoolWalletConfig));
    for (Map.Entry<String, String> configEntry : whirlpoolWalletConfig.getConfigInfo().entrySet()) {
        Log.v(TAG, "whirlpoolWalletConfig[" + configEntry.getKey() + "] = " + configEntry.getValue());
    }
    return whirlpoolWalletConfig;
}
Also used : AndroidTx0Service(com.samourai.whirlpool.client.tx0.AndroidTx0Service) WhirlpoolServer(com.samourai.whirlpool.client.wallet.beans.WhirlpoolServer) NetworkParameters(org.bitcoinj.core.NetworkParameters) IStompClientService(com.samourai.stomp.client.IStompClientService) AndroidStompClientService(com.samourai.stomp.client.AndroidStompClientService) Map(java.util.Map)

Example 4 with Tx0

use of com.samourai.whirlpool.client.tx0.Tx0 in project samourai-wallet-android by Samourai-Wallet.

the class WhirlpoolWalletTest method testTx0.

@Test
public void testTx0() throws Exception {
    Collection<UnspentOutputWithKey> spendFroms = new LinkedList<>();
    ECKey ecKey = bip84w.getAccountAt(0).getChain(0).getAddressAt(61).getECKey();
    UnspentResponse.UnspentOutput unspentOutput = newUnspentOutput("cc588cdcb368f894a41c372d1f905770b61ecb3fb8e5e01a97e7cedbf5e324ae", 1, 500000000);
    unspentOutput.addr = new SegwitAddress(ecKey, networkParameters).getBech32AsString();
    spendFroms.add(new UnspentOutputWithKey(unspentOutput, ecKey.getPrivKeyBytes()));
    Pool pool = whirlpoolWallet.findPoolById("0.01btc");
    Tx0Config tx0Config = whirlpoolWallet.getTx0Config().setMaxOutputs(1);
    Tx0Preview tx0Preview = whirlpoolWallet.tx0Preview(pool, spendFroms, tx0Config, Tx0FeeTarget.BLOCKS_2);
    Tx0 tx0 = whirlpoolWallet.tx0(pool, spendFroms, tx0Config, Tx0FeeTarget.BLOCKS_2);
    Assert.assertEquals("dc398c99cf9ce18123ea916d69bb99da44a3979a625eeaac5e17837f879a8874", tx0.getTx().getHashAsString());
    Assert.assertEquals("01000000000101ae24e3f5dbcee7971ae0e5b83fcb1eb67057901f2d371ca494f868b3dc8c58cc0100000000ffffffff040000000000000000426a408a9eb379a44ff4d4579118c64b64bbd327cd95ba826ac68f334155fd9ca4e3acd64acdfd75dd7c3cc5bc34d31af6c6e68b4db37eac62b574890f6cfc7b904d9950c300000000000016001441021632871b0f1cf61a7ac7b6a0187e88628291b44b0f00000000001600147e4a4628dd8fbd638681a728e39f7d92ada04070e954bd1d00000000160014df3a4bc83635917ad18621f3ba78cef6469c5f5902483045022100c48f02762ab9877533b5c7b0bc729479ce7809596b89cb9f62b740ea3350068f02205ef46ca67df39d35f940e33223c5ddd56669d953b6ef4948e355c1f3430f32e10121032e46baef8bcde0c3a19cadb378197fa31d69adb21535de3f84de699a1cf88b4500000000", new String(Hex.encode(tx0.getTx().bitcoinSerialize())));
}
Also used : SegwitAddress(com.samourai.wallet.segwit.SegwitAddress) ECKey(org.bitcoinj.core.ECKey) Pool(com.samourai.whirlpool.client.whirlpool.beans.Pool) Tx0Preview(com.samourai.whirlpool.client.tx0.Tx0Preview) UnspentOutputWithKey(com.samourai.whirlpool.client.tx0.UnspentOutputWithKey) Tx0(com.samourai.whirlpool.client.tx0.Tx0) LinkedList(java.util.LinkedList) UnspentResponse(com.samourai.wallet.api.backend.beans.UnspentResponse) Tx0Config(com.samourai.whirlpool.client.tx0.Tx0Config) Test(org.junit.Test)

Aggregations

UnspentResponse (com.samourai.wallet.api.backend.beans.UnspentResponse)3 Tx0 (com.samourai.whirlpool.client.tx0.Tx0)3 Tx0Config (com.samourai.whirlpool.client.tx0.Tx0Config)3 UnspentOutputWithKey (com.samourai.whirlpool.client.tx0.UnspentOutputWithKey)3 ECKey (org.bitcoinj.core.ECKey)3 SpannableString (android.text.SpannableString)2 UTXOCoin (com.samourai.wallet.utxos.models.UTXOCoin)2 WhirlpoolTx0 (com.samourai.wallet.whirlpool.WhirlpoolTx0)2 WhirlpoolWallet (com.samourai.whirlpool.client.wallet.WhirlpoolWallet)2 ArrayList (java.util.ArrayList)2 Activity (android.app.Activity)1 AlertDialog (android.app.AlertDialog)1 DialogInterface (android.content.DialogInterface)1 BOLD (android.graphics.Typeface.BOLD)1 Bundle (android.os.Bundle)1 Handler (android.os.Handler)1 Snackbar (android.support.design.widget.Snackbar)1 Fragment (android.support.v4.app.Fragment)1 FragmentManager (android.support.v4.app.FragmentManager)1 FragmentPagerAdapter (android.support.v4.app.FragmentPagerAdapter)1