Added BitcoinUriRequest

This commit is contained in:
hvarona 2018-11-10 23:21:49 -04:00
parent 42c48d31ea
commit 8ff53de0ae
3 changed files with 141 additions and 23 deletions

View file

@ -38,6 +38,7 @@ import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCurrency; import cy.agorise.crystalwallet.models.CryptoCurrency;
import cy.agorise.crystalwallet.models.CryptoNetAccount; import cy.agorise.crystalwallet.models.CryptoNetAccount;
import cy.agorise.crystalwallet.requestmanagers.BitcoinSendRequest; import cy.agorise.crystalwallet.requestmanagers.BitcoinSendRequest;
import cy.agorise.crystalwallet.requestmanagers.CalculateBitcoinUriRequest;
import cy.agorise.crystalwallet.requestmanagers.CreateBitcoinAccountRequest; import cy.agorise.crystalwallet.requestmanagers.CreateBitcoinAccountRequest;
import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequest; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequest;
import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestsListener; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestsListener;
@ -153,6 +154,8 @@ public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInf
this.getNextAddress((NextBitcoinAccountAddressRequest) request); this.getNextAddress((NextBitcoinAccountAddressRequest) request);
}else if(request instanceof ValidateBitcoinAddressRequest){ }else if(request instanceof ValidateBitcoinAddressRequest){
this.validateAddress((ValidateBitcoinAddressRequest) request); this.validateAddress((ValidateBitcoinAddressRequest) request);
}else if(request instanceof CalculateBitcoinUriRequest){
this.calculateUri((CalculateBitcoinUriRequest) request);
}else{ }else{
System.out.println("Invalid " +this.cryptoCoin.getLabel() + " request "); System.out.println("Invalid " +this.cryptoCoin.getLabel() + " request ");
} }
@ -461,6 +464,11 @@ public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInf
private void getNextAddress(NextBitcoinAccountAddressRequest request){ private void getNextAddress(NextBitcoinAccountAddressRequest request){
CrystalDatabase db = CrystalDatabase.getAppDatabase(request.getContext()); CrystalDatabase db = CrystalDatabase.getAppDatabase(request.getContext());
long index = db.bitcoinAddressDao().getLastExternalAddress(request.getAccount().getId()); long index = db.bitcoinAddressDao().getLastExternalAddress(request.getAccount().getId());
BitcoinAddress address = db.bitcoinAddressDao().getExternalByIndex(index);
if(db.bitcoinTransactionDao().getGtxIOByAddress(address.getAddress()).size()<=0){
request.setAddress(address.getAddress());
request.setStatus(NextBitcoinAccountAddressRequest.StatusCode.SUCCEEDED);
}else {
index++; index++;
AccountSeed seed = db.accountSeedDao().findById(request.getAccount().getSeedId()); AccountSeed seed = db.accountSeedDao().findById(request.getAccount().getSeedId());
DeterministicKey purposeKey = HDKeyDerivation.deriveChildKey((DeterministicKey) seed.getPrivateKey(), DeterministicKey purposeKey = HDKeyDerivation.deriveChildKey((DeterministicKey) seed.getPrivateKey(),
@ -472,18 +480,59 @@ public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInf
DeterministicKey externalKey = HDKeyDerivation.deriveChildKey(accountKey, DeterministicKey externalKey = HDKeyDerivation.deriveChildKey(accountKey,
new ChildNumber(0, false)); new ChildNumber(0, false));
ECKey addrKey = HDKeyDerivation.deriveChildKey(externalKey, new ChildNumber((int) index, true)); ECKey addrKey = HDKeyDerivation.deriveChildKey(externalKey, new ChildNumber((int) index, true));
BitcoinAddress address = new BitcoinAddress(); address = new BitcoinAddress();
address.setChange(false); address.setChange(false);
address.setAccountId(request.getAccount().getId()); address.setAccountId(request.getAccount().getId());
address.setIndex(index); address.setIndex(index);
String addressString =addrKey.toAddress(this.cryptoCoin.getParameters()).toString(); String addressString = addrKey.toAddress(this.cryptoCoin.getParameters()).toString();
address.setAddress(addressString); address.setAddress(addressString);
db.bitcoinAddressDao().insertBitcoinAddresses(address); db.bitcoinAddressDao().insertBitcoinAddresses(address);
InsightApiGenerator.getTransactionFromAddress(this.cryptoCoin,addressString,true, null); InsightApiGenerator.getTransactionFromAddress(this.cryptoCoin, addressString, true, null);
request.setAddress(addressString); request.setAddress(addressString);
request.setStatus(NextBitcoinAccountAddressRequest.StatusCode.SUCCEEDED); request.setStatus(NextBitcoinAccountAddressRequest.StatusCode.SUCCEEDED);
} }
}
private void calculateUri(CalculateBitcoinUriRequest request) {
StringBuilder uri = new StringBuilder(this.cryptoCoin.getLabel()+":");
CrystalDatabase db = CrystalDatabase.getAppDatabase(request.getContext());
long index = db.bitcoinAddressDao().getLastExternalAddress(request.getAccount().getId());
BitcoinAddress address = db.bitcoinAddressDao().getExternalByIndex(index);
if(db.bitcoinTransactionDao().getGtxIOByAddress(address.getAddress()).size()<=0){
uri.append(address.getAddress());
}else {
index++;
AccountSeed seed = db.accountSeedDao().findById(request.getAccount().getSeedId());
DeterministicKey purposeKey = HDKeyDerivation.deriveChildKey((DeterministicKey) seed.getPrivateKey(),
new ChildNumber(44, true));
DeterministicKey coinKey = HDKeyDerivation.deriveChildKey(purposeKey,
new ChildNumber(cryptoCoin.getCoinNumber(), true));
DeterministicKey accountKey = HDKeyDerivation.deriveChildKey(coinKey,
new ChildNumber(request.getAccount().getAccountIndex(), true));
DeterministicKey externalKey = HDKeyDerivation.deriveChildKey(accountKey,
new ChildNumber(0, false));
ECKey addrKey = HDKeyDerivation.deriveChildKey(externalKey, new ChildNumber((int) index, true));
address = new BitcoinAddress();
address.setChange(false);
address.setAccountId(request.getAccount().getId());
address.setIndex(index);
String addressString = addrKey.toAddress(this.cryptoCoin.getParameters()).toString();
address.setAddress(addressString);
db.bitcoinAddressDao().insertBitcoinAddresses(address);
InsightApiGenerator.getTransactionFromAddress(this.cryptoCoin, addressString, true, null);
uri.append(address.getAddress());
}
if(request.getCurrency()!= null){
uri.append("?amount=");
uri.append(request.getAmount());
}
request.setUri(uri.toString());
request.validate();
}
private List<BitcoinTransactionGTxIO> getUtxos(long accountId, CrystalDatabase db){ private List<BitcoinTransactionGTxIO> getUtxos(long accountId, CrystalDatabase db){
List<BitcoinTransactionGTxIO> answer = new ArrayList<>(); List<BitcoinTransactionGTxIO> answer = new ArrayList<>();

View file

@ -215,7 +215,7 @@ public class SteemAccountManager implements CryptoAccountManager, CryptoNetInfoR
long idSeed = accountSeedDao.insertAccountSeed(seed); long idSeed = accountSeedDao.insertAccountSeed(seed);
if (idSeed >= 0) { if (idSeed >= 0) {
GrapheneAccount account = new GrapheneAccount(); GrapheneAccount account = new GrapheneAccount();
account.setCryptoNet(CryptoNet.BITSHARES); account.setCryptoNet(CryptoNet.STEEM);
account.setAccountIndex(0); account.setAccountIndex(0);
account.setSeedId(idSeed); account.setSeedId(idSeed);
account.setAccountId(userAccount.getObjectId()); account.setAccountId(userAccount.getObjectId());
@ -242,7 +242,7 @@ public class SteemAccountManager implements CryptoAccountManager, CryptoNetInfoR
long idSeed = accountSeedDao.insertAccountSeed(seed); long idSeed = accountSeedDao.insertAccountSeed(seed);
if (idSeed >= 0) { if (idSeed >= 0) {
GrapheneAccount account = new GrapheneAccount(); GrapheneAccount account = new GrapheneAccount();
account.setCryptoNet(CryptoNet.BITSHARES); account.setCryptoNet(CryptoNet.STEEM);
account.setAccountIndex(0); account.setAccountIndex(0);
account.setSeedId(idSeed); account.setSeedId(idSeed);
account.setAccountId(userAccount.getObjectId()); account.setAccountId(userAccount.getObjectId());

View file

@ -0,0 +1,69 @@
package cy.agorise.crystalwallet.requestmanagers;
import android.content.Context;
import cy.agorise.crystalwallet.enums.CryptoCoin;
import cy.agorise.crystalwallet.models.CryptoCurrency;
import cy.agorise.crystalwallet.models.CryptoNetAccount;
/**
* This class validates that an account name exist, this can be used to verified the existing accounts
* or to verified if the name is available to create an Account
*
* Created by henry on 8/10/2017.
*/
public class CalculateBitcoinUriRequest extends CryptoNetInfoRequest {
private CryptoNetAccount account;
private CryptoCurrency currency;
private double amount;
private Context context;
private String uri;
public CalculateBitcoinUriRequest(CryptoCoin coin, CryptoNetAccount account, Context context) {
super(coin);
this.account = account;
this.context = context;
}
public CalculateBitcoinUriRequest(CryptoCoin coin, CryptoNetAccount account, CryptoCurrency currency, double amount, Context context) {
super(coin);
this.account = account;
this.currency = currency;
this.amount = amount;
this.context = context;
}
public CryptoNetAccount getAccount() {
return account;
}
public CryptoCurrency getCurrency() {
return currency;
}
public double getAmount() {
return amount;
}
public Context getContext() {
return context;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
this.validate();
}
public void validate(){
if ((this.uri != null)){
this._fireOnCarryOutEvent();
}
}
}