mirror of
https://github.com/sparrowwallet/sparrow.git
synced 2024-12-24 12:46:45 +00:00
handle support for alternative (non-mainnet) networks
This commit is contained in:
parent
2cb667a671
commit
c68cda5b2f
5 changed files with 34 additions and 8 deletions
2
drongo
2
drongo
|
@ -1 +1 @@
|
||||||
Subproject commit e8d8fa61268ec8ac4dd5c14e6715d4a4bde2fe49
|
Subproject commit 747bfa915f1ecf743b5e8876b9a4c54062e57c94
|
|
@ -1,10 +1,7 @@
|
||||||
package com.sparrowwallet.sparrow.wallet;
|
package com.sparrowwallet.sparrow.wallet;
|
||||||
|
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
import com.sparrowwallet.drongo.ExtendedKey;
|
import com.sparrowwallet.drongo.*;
|
||||||
import com.sparrowwallet.drongo.KeyDerivation;
|
|
||||||
import com.sparrowwallet.drongo.SecureString;
|
|
||||||
import com.sparrowwallet.drongo.Utils;
|
|
||||||
import com.sparrowwallet.drongo.wallet.Keystore;
|
import com.sparrowwallet.drongo.wallet.Keystore;
|
||||||
import com.sparrowwallet.drongo.wallet.KeystoreSource;
|
import com.sparrowwallet.drongo.wallet.KeystoreSource;
|
||||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
import com.sparrowwallet.drongo.wallet.Wallet;
|
||||||
|
@ -148,7 +145,7 @@ public class KeystoreController extends WalletFormController implements Initiali
|
||||||
contextMenu.getItems().add(copyXPub);
|
contextMenu.getItems().add(copyXPub);
|
||||||
|
|
||||||
ExtendedKey.Header header = ExtendedKey.Header.fromScriptType(walletForm.getWallet().getScriptType(), false);
|
ExtendedKey.Header header = ExtendedKey.Header.fromScriptType(walletForm.getWallet().getScriptType(), false);
|
||||||
if(header != ExtendedKey.Header.xpub) {
|
if(header != Network.get().getXpubHeader()) {
|
||||||
String otherPub = extendedKey.getExtendedKey(header);
|
String otherPub = extendedKey.getExtendedKey(header);
|
||||||
|
|
||||||
MenuItem copyOtherPub = new MenuItem("Copy " + header.getName().replace('p', 'P'));
|
MenuItem copyOtherPub = new MenuItem("Copy " + header.getName().replace('p', 'P'));
|
||||||
|
|
|
@ -2,10 +2,12 @@ package com.sparrowwallet.sparrow.io;
|
||||||
|
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
import com.sparrowwallet.drongo.ExtendedKey;
|
import com.sparrowwallet.drongo.ExtendedKey;
|
||||||
|
import com.sparrowwallet.drongo.Network;
|
||||||
import com.sparrowwallet.drongo.policy.PolicyType;
|
import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
import com.sparrowwallet.drongo.wallet.Keystore;
|
import com.sparrowwallet.drongo.wallet.Keystore;
|
||||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
import com.sparrowwallet.drongo.wallet.Wallet;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -14,6 +16,7 @@ import java.io.*;
|
||||||
public class ColdcardMultisigTest extends IoTest {
|
public class ColdcardMultisigTest extends IoTest {
|
||||||
@Test
|
@Test
|
||||||
public void importKeystore1() throws ImportException {
|
public void importKeystore1() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
||||||
Keystore keystore = ccMultisig.getKeystore(ScriptType.P2SH_P2WSH, getInputStream("cc-multisig-keystore-1.json"), null);
|
Keystore keystore = ccMultisig.getKeystore(ScriptType.P2SH_P2WSH, getInputStream("cc-multisig-keystore-1.json"), null);
|
||||||
Assert.assertEquals("Coldcard", keystore.getLabel());
|
Assert.assertEquals("Coldcard", keystore.getLabel());
|
||||||
|
@ -31,6 +34,7 @@ public class ColdcardMultisigTest extends IoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void importKeystore2() throws ImportException {
|
public void importKeystore2() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
||||||
Keystore keystore = ccMultisig.getKeystore(ScriptType.P2SH, getInputStream("cc-multisig-keystore-2.json"), null);
|
Keystore keystore = ccMultisig.getKeystore(ScriptType.P2SH, getInputStream("cc-multisig-keystore-2.json"), null);
|
||||||
Assert.assertEquals("Coldcard", keystore.getLabel());
|
Assert.assertEquals("Coldcard", keystore.getLabel());
|
||||||
|
@ -42,6 +46,7 @@ public class ColdcardMultisigTest extends IoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void importKeystore2b() throws ImportException {
|
public void importKeystore2b() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
||||||
Keystore keystore = ccMultisig.getKeystore(ScriptType.P2WSH, getInputStream("cc-multisig-keystore-2.json"), null);
|
Keystore keystore = ccMultisig.getKeystore(ScriptType.P2WSH, getInputStream("cc-multisig-keystore-2.json"), null);
|
||||||
Assert.assertEquals("Coldcard", keystore.getLabel());
|
Assert.assertEquals("Coldcard", keystore.getLabel());
|
||||||
|
@ -65,6 +70,7 @@ public class ColdcardMultisigTest extends IoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void importWallet2() throws ImportException {
|
public void importWallet2() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
ColdcardMultisig ccMultisig = new ColdcardMultisig();
|
||||||
Wallet wallet = ccMultisig.importWallet(getInputStream("cc-multisig-export-2.txt"), null);
|
Wallet wallet = ccMultisig.importWallet(getInputStream("cc-multisig-export-2.txt"), null);
|
||||||
Assert.assertEquals("CC-2-of-4", wallet.getName());
|
Assert.assertEquals("CC-2-of-4", wallet.getName());
|
||||||
|
@ -117,4 +123,9 @@ public class ColdcardMultisigTest extends IoTest {
|
||||||
String exported = new String(exportedBytes);
|
String exported = new String(exportedBytes);
|
||||||
Assert.assertEquals(original.replaceAll("Exported from Electrum", ""), exported.replace("Coldcard Multisig setup file (created by Sparrow)\n#", ""));
|
Assert.assertEquals(original.replaceAll("Exported from Electrum", ""), exported.replace("Coldcard Multisig setup file (created by Sparrow)\n#", ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
Network.set(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
package com.sparrowwallet.sparrow.io;
|
package com.sparrowwallet.sparrow.io;
|
||||||
|
|
||||||
import com.sparrowwallet.drongo.ExtendedKey;
|
import com.sparrowwallet.drongo.ExtendedKey;
|
||||||
|
import com.sparrowwallet.drongo.Network;
|
||||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
import com.sparrowwallet.drongo.wallet.Keystore;
|
import com.sparrowwallet.drongo.wallet.Keystore;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class ColdcardSinglesigTest extends IoTest {
|
public class ColdcardSinglesigTest extends IoTest {
|
||||||
@Test
|
@Test
|
||||||
public void testImport() throws ImportException {
|
public void testImport() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
ColdcardSinglesig ccSingleSig = new ColdcardSinglesig();
|
ColdcardSinglesig ccSingleSig = new ColdcardSinglesig();
|
||||||
Keystore keystore = ccSingleSig.getKeystore(ScriptType.P2SH_P2WPKH, getInputStream("cc-singlesig-keystore-1.json"), null);
|
Keystore keystore = ccSingleSig.getKeystore(ScriptType.P2SH_P2WPKH, getInputStream("cc-singlesig-keystore-1.json"), null);
|
||||||
|
|
||||||
|
@ -21,6 +24,7 @@ public class ColdcardSinglesigTest extends IoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testImportWitness() throws ImportException {
|
public void testImportWitness() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
ColdcardSinglesig ccSingleSig = new ColdcardSinglesig();
|
ColdcardSinglesig ccSingleSig = new ColdcardSinglesig();
|
||||||
Keystore keystore = ccSingleSig.getKeystore(ScriptType.P2WPKH, getInputStream("cc-singlesig-keystore-1.json"), null);
|
Keystore keystore = ccSingleSig.getKeystore(ScriptType.P2WPKH, getInputStream("cc-singlesig-keystore-1.json"), null);
|
||||||
|
|
||||||
|
@ -30,4 +34,9 @@ public class ColdcardSinglesigTest extends IoTest {
|
||||||
Assert.assertEquals(ExtendedKey.fromDescriptor("tpubDC7jGaaSE66VDB6VhEDFYQSCAyugXmfnMnrMVyHNzW9wryyTxvha7TmfAHd7GRXrr2TaAn2HXn9T8ep4gyNX1bzGiieqcTUNcu2poyntrET"), keystore.getExtendedPublicKey());
|
Assert.assertEquals(ExtendedKey.fromDescriptor("tpubDC7jGaaSE66VDB6VhEDFYQSCAyugXmfnMnrMVyHNzW9wryyTxvha7TmfAHd7GRXrr2TaAn2HXn9T8ep4gyNX1bzGiieqcTUNcu2poyntrET"), keystore.getExtendedPublicKey());
|
||||||
Assert.assertTrue(keystore.isValid());
|
Assert.assertTrue(keystore.isValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
Network.set(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
package com.sparrowwallet.sparrow.io;
|
package com.sparrowwallet.sparrow.io;
|
||||||
|
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.sparrowwallet.drongo.Network;
|
||||||
import com.sparrowwallet.drongo.Utils;
|
import com.sparrowwallet.drongo.Utils;
|
||||||
import com.sparrowwallet.drongo.policy.PolicyType;
|
import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
import com.sparrowwallet.drongo.wallet.MnemonicException;
|
import com.sparrowwallet.drongo.wallet.MnemonicException;
|
||||||
import com.sparrowwallet.drongo.wallet.Wallet;
|
import com.sparrowwallet.drongo.wallet.Wallet;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -50,6 +52,7 @@ public class ElectrumTest extends IoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMultisigImport() throws ImportException {
|
public void testMultisigImport() throws ImportException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
Electrum electrum = new Electrum();
|
Electrum electrum = new Electrum();
|
||||||
Wallet wallet = electrum.importWallet(getInputStream("electrum-multisig-wallet.json"), null);
|
Wallet wallet = electrum.importWallet(getInputStream("electrum-multisig-wallet.json"), null);
|
||||||
|
|
||||||
|
@ -59,7 +62,7 @@ public class ElectrumTest extends IoTest {
|
||||||
Assert.assertEquals("sh(wsh(sortedmulti(2,coldcard6ba6cfd0,coldcard747b698e,coldcard7bb026be,coldcard0f056943)))", wallet.getDefaultPolicy().getMiniscript().getScript());
|
Assert.assertEquals("sh(wsh(sortedmulti(2,coldcard6ba6cfd0,coldcard747b698e,coldcard7bb026be,coldcard0f056943)))", wallet.getDefaultPolicy().getMiniscript().getScript());
|
||||||
Assert.assertEquals("6ba6cfd0", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("6ba6cfd0", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
||||||
Assert.assertEquals("xpub6FFEQVG6QR28chQzgSJ7Gjx5j5BGLkCMgZ9bc41YJCXfwYiCKUQdcwm4Fe1stvzRjosz5udMedYZFRL56AeZXCsiVmnVUysio4jkAKTukmN", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
Assert.assertEquals("tpubDFcrvj5n7gyatVbr8dHCUfHT4CGvL8hREBjtxc4ge7HZgqNuPhFimPRtVg6fRRwfXiQthV9EBjNbwbpgV2VoQeL1ZNXoAWXxP2L9vMtRjax", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
||||||
Assert.assertEquals("7bb026be", wallet.getKeystores().get(2).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("7bb026be", wallet.getKeystores().get(2).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(2).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(2).getKeyDerivation().getDerivationPath());
|
||||||
Assert.assertTrue(wallet.isValid());
|
Assert.assertTrue(wallet.isValid());
|
||||||
|
@ -67,6 +70,7 @@ public class ElectrumTest extends IoTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testMultisigExport() throws ImportException, ExportException, IOException {
|
public void testMultisigExport() throws ImportException, ExportException, IOException {
|
||||||
|
Network.set(Network.TESTNET);
|
||||||
Electrum electrum = new Electrum();
|
Electrum electrum = new Electrum();
|
||||||
byte[] walletBytes = ByteStreams.toByteArray(getInputStream("electrum-multisig-wallet.json"));
|
byte[] walletBytes = ByteStreams.toByteArray(getInputStream("electrum-multisig-wallet.json"));
|
||||||
Wallet wallet = electrum.importWallet(new ByteArrayInputStream(walletBytes), null);
|
Wallet wallet = electrum.importWallet(new ByteArrayInputStream(walletBytes), null);
|
||||||
|
@ -81,7 +85,7 @@ public class ElectrumTest extends IoTest {
|
||||||
Assert.assertEquals("sh(wsh(sortedmulti(2,coldcard6ba6cfd0,coldcard747b698e,coldcard7bb026be,coldcard0f056943)))", wallet.getDefaultPolicy().getMiniscript().getScript());
|
Assert.assertEquals("sh(wsh(sortedmulti(2,coldcard6ba6cfd0,coldcard747b698e,coldcard7bb026be,coldcard0f056943)))", wallet.getDefaultPolicy().getMiniscript().getScript());
|
||||||
Assert.assertEquals("6ba6cfd0", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("6ba6cfd0", wallet.getKeystores().get(0).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(0).getKeyDerivation().getDerivationPath());
|
||||||
Assert.assertEquals("xpub6FFEQVG6QR28chQzgSJ7Gjx5j5BGLkCMgZ9bc41YJCXfwYiCKUQdcwm4Fe1stvzRjosz5udMedYZFRL56AeZXCsiVmnVUysio4jkAKTukmN", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
Assert.assertEquals("tpubDFcrvj5n7gyatVbr8dHCUfHT4CGvL8hREBjtxc4ge7HZgqNuPhFimPRtVg6fRRwfXiQthV9EBjNbwbpgV2VoQeL1ZNXoAWXxP2L9vMtRjax", wallet.getKeystores().get(0).getExtendedPublicKey().toString());
|
||||||
Assert.assertEquals("7bb026be", wallet.getKeystores().get(2).getKeyDerivation().getMasterFingerprint());
|
Assert.assertEquals("7bb026be", wallet.getKeystores().get(2).getKeyDerivation().getMasterFingerprint());
|
||||||
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(2).getKeyDerivation().getDerivationPath());
|
Assert.assertEquals("m/48'/1'/0'/1'", wallet.getKeystores().get(2).getKeyDerivation().getDerivationPath());
|
||||||
}
|
}
|
||||||
|
@ -123,4 +127,9 @@ public class ElectrumTest extends IoTest {
|
||||||
Assert.assertEquals(wallet.getKeystores().get(0).getSeed().getMnemonicString().asString(), "coach fan denial rifle frost rival join install one wasp cool antique");
|
Assert.assertEquals(wallet.getKeystores().get(0).getSeed().getMnemonicString().asString(), "coach fan denial rifle frost rival join install one wasp cool antique");
|
||||||
Assert.assertEquals("e14c40c638e2c83d1f20e5ee9cd744bc2ba1ef64fa939926f3778fc8735e891f56852f687b32bbd044f272d2831137e3eeba61fd1f285fa73dcc97d9f2be3cd1", Utils.bytesToHex(wallet.getKeystores().get(0).getSeed().getSeedBytes()));
|
Assert.assertEquals("e14c40c638e2c83d1f20e5ee9cd744bc2ba1ef64fa939926f3778fc8735e891f56852f687b32bbd044f272d2831137e3eeba61fd1f285fa73dcc97d9f2be3cd1", Utils.bytesToHex(wallet.getKeystores().get(0).getSeed().getSeedBytes()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
Network.set(null);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue