mirror of
https://github.com/sparrowwallet/drongo.git
synced 2024-12-26 10:06:45 +00:00
wallet copying
This commit is contained in:
parent
97cdd62173
commit
813781902b
8 changed files with 63 additions and 4 deletions
|
@ -111,6 +111,11 @@ public class ExtendedPublicKey {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ExtendedPublicKey copy() {
|
||||||
|
//DeterministicKey is effectively final
|
||||||
|
return new ExtendedPublicKey(pubKey, Arrays.copyOf(parentFingerprint, parentFingerprint.length), pubKeyChildNumber);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
|
|
@ -9,7 +9,7 @@ import java.util.List;
|
||||||
public class KeyDerivation {
|
public class KeyDerivation {
|
||||||
private final String masterFingerprint;
|
private final String masterFingerprint;
|
||||||
private final String derivationPath;
|
private final String derivationPath;
|
||||||
private final List<ChildNumber> derivation;
|
private final transient List<ChildNumber> derivation;
|
||||||
|
|
||||||
public KeyDerivation(String masterFingerprint, String derivationPath) {
|
public KeyDerivation(String masterFingerprint, String derivationPath) {
|
||||||
this.masterFingerprint = masterFingerprint;
|
this.masterFingerprint = masterFingerprint;
|
||||||
|
@ -73,6 +73,10 @@ public class KeyDerivation {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public KeyDerivation copy() {
|
||||||
|
return new KeyDerivation(masterFingerprint, derivationPath);
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return masterFingerprint + (derivationPath != null ? derivationPath.replace("m", "") : "");
|
return masterFingerprint + (derivationPath != null ? derivationPath.replace("m", "") : "");
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,14 @@ import com.sparrowwallet.drongo.protocol.Base58;
|
||||||
import com.sparrowwallet.drongo.protocol.Sha256Hash;
|
import com.sparrowwallet.drongo.protocol.Sha256Hash;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class DeterministicKey extends ECKey {
|
public class DeterministicKey extends ECKey {
|
||||||
private final DeterministicKey parent;
|
private final DeterministicKey parent;
|
||||||
private final List<ChildNumber> childNumberPath;
|
private final List<ChildNumber> childNumberPath;
|
||||||
private final int depth;
|
private final int depth;
|
||||||
private byte[] parentFingerprint; // 0 if this key is root node of key hierarchy
|
private final byte[] parentFingerprint; // 0 if this key is root node of key hierarchy
|
||||||
|
|
||||||
/** 32 bytes */
|
/** 32 bytes */
|
||||||
private final byte[] chainCode;
|
private final byte[] chainCode;
|
||||||
|
@ -80,7 +81,7 @@ public class DeterministicKey extends ECKey {
|
||||||
* the first child of that node.
|
* the first child of that node.
|
||||||
*/
|
*/
|
||||||
public List<ChildNumber> getPath() {
|
public List<ChildNumber> getPath() {
|
||||||
return childNumberPath;
|
return Collections.unmodifiableList(childNumberPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeterministicKey getParent() {
|
public DeterministicKey getParent() {
|
||||||
|
|
|
@ -35,4 +35,8 @@ public class Miniscript {
|
||||||
throw new IllegalArgumentException("Could not find multisig threshold in " + this);
|
throw new IllegalArgumentException("Could not find multisig threshold in " + this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Miniscript copy() {
|
||||||
|
return new Miniscript(script);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,4 +55,8 @@ public class Policy {
|
||||||
|
|
||||||
throw new PolicyException("No standard policy for " + policyType + " policy with script type " + scriptType);
|
throw new PolicyException("No standard policy for " + policyType + " policy with script type " + scriptType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Policy copy() {
|
||||||
|
return new Policy(name, miniscript.copy());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,16 @@ import com.sparrowwallet.drongo.ExtendedPublicKey;
|
||||||
import com.sparrowwallet.drongo.KeyDerivation;
|
import com.sparrowwallet.drongo.KeyDerivation;
|
||||||
|
|
||||||
public class Keystore {
|
public class Keystore {
|
||||||
|
public static final String DEFAULT_LABEL = "Keystore 1";
|
||||||
|
|
||||||
private String label;
|
private String label;
|
||||||
private KeyDerivation keyDerivation;
|
private KeyDerivation keyDerivation;
|
||||||
private ExtendedPublicKey extendedPublicKey;
|
private ExtendedPublicKey extendedPublicKey;
|
||||||
|
|
||||||
|
public Keystore() {
|
||||||
|
this(DEFAULT_LABEL);
|
||||||
|
}
|
||||||
|
|
||||||
public Keystore(String label) {
|
public Keystore(String label) {
|
||||||
this.label = label;
|
this.label = label;
|
||||||
}
|
}
|
||||||
|
@ -39,4 +45,15 @@ public class Keystore {
|
||||||
public void setExtendedPublicKey(ExtendedPublicKey extendedPublicKey) {
|
public void setExtendedPublicKey(ExtendedPublicKey extendedPublicKey) {
|
||||||
this.extendedPublicKey = extendedPublicKey;
|
this.extendedPublicKey = extendedPublicKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Keystore copy() {
|
||||||
|
Keystore copy = new Keystore(label);
|
||||||
|
if(keyDerivation != null) {
|
||||||
|
copy.setKeyDerivation(keyDerivation.copy());
|
||||||
|
}
|
||||||
|
if(extendedPublicKey != null) {
|
||||||
|
copy.setExtendedPublicKey(extendedPublicKey.copy());
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,14 +5,27 @@ import com.sparrowwallet.drongo.policy.PolicyType;
|
||||||
import com.sparrowwallet.drongo.protocol.ScriptType;
|
import com.sparrowwallet.drongo.protocol.ScriptType;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class Wallet {
|
public class Wallet {
|
||||||
|
|
||||||
private PolicyType policyType;
|
private PolicyType policyType;
|
||||||
private ScriptType scriptType;
|
private ScriptType scriptType;
|
||||||
private Policy defaultPolicy;
|
private Policy defaultPolicy;
|
||||||
private List<Keystore> keystores = new ArrayList<>();
|
private List<Keystore> keystores = new ArrayList<>();
|
||||||
|
|
||||||
|
public Wallet() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wallet(PolicyType policyType, ScriptType scriptType) {
|
||||||
|
this.policyType = policyType;
|
||||||
|
this.scriptType = scriptType;
|
||||||
|
this.keystores = Collections.singletonList(new Keystore());
|
||||||
|
this.defaultPolicy = Policy.getPolicy(policyType, scriptType, keystores, null);
|
||||||
|
}
|
||||||
|
|
||||||
public PolicyType getPolicyType() {
|
public PolicyType getPolicyType() {
|
||||||
return policyType;
|
return policyType;
|
||||||
}
|
}
|
||||||
|
@ -44,4 +57,15 @@ public class Wallet {
|
||||||
public void setKeystores(List<Keystore> keystores) {
|
public void setKeystores(List<Keystore> keystores) {
|
||||||
this.keystores = keystores;
|
this.keystores = keystores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Wallet copy() {
|
||||||
|
Wallet copy = new Wallet();
|
||||||
|
copy.setPolicyType(policyType);
|
||||||
|
copy.setScriptType(scriptType);
|
||||||
|
copy.setDefaultPolicy(defaultPolicy.copy());
|
||||||
|
for(Keystore keystore : keystores) {
|
||||||
|
copy.getKeystores().add(keystore.copy());
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module com.sparrowwallet.drongo {
|
open module com.sparrowwallet.drongo {
|
||||||
requires org.bouncycastle.provider;
|
requires org.bouncycastle.provider;
|
||||||
requires slf4j.api;
|
requires slf4j.api;
|
||||||
exports com.sparrowwallet.drongo;
|
exports com.sparrowwallet.drongo;
|
||||||
|
|
Loading…
Reference in a new issue