2018-09-17 03:43:59 +00:00
|
|
|
package cy.agorise.crystalwallet.manager;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
|
|
|
import org.bitcoinj.core.Address;
|
2018-11-07 03:34:54 +00:00
|
|
|
import org.bitcoinj.core.AddressFormatException;
|
2018-09-17 03:43:59 +00:00
|
|
|
import org.bitcoinj.core.Coin;
|
2018-10-19 04:13:42 +00:00
|
|
|
import org.bitcoinj.core.ECKey;
|
2018-09-17 03:43:59 +00:00
|
|
|
import org.bitcoinj.core.Sha256Hash;
|
|
|
|
import org.bitcoinj.core.Transaction;
|
|
|
|
import org.bitcoinj.core.TransactionOutPoint;
|
|
|
|
import org.bitcoinj.crypto.ChildNumber;
|
2018-10-19 04:13:42 +00:00
|
|
|
import org.bitcoinj.crypto.DeterministicKey;
|
2018-09-17 03:43:59 +00:00
|
|
|
import org.bitcoinj.crypto.HDKeyDerivation;
|
|
|
|
import org.bitcoinj.script.Script;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2018-10-05 03:59:32 +00:00
|
|
|
import java.util.Arrays;
|
2018-09-28 02:19:19 +00:00
|
|
|
import java.util.Date;
|
2018-10-05 03:59:32 +00:00
|
|
|
import java.util.HashMap;
|
2018-09-17 03:43:59 +00:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import cy.agorise.crystalwallet.apigenerator.ApiRequest;
|
|
|
|
import cy.agorise.crystalwallet.apigenerator.ApiRequestListener;
|
|
|
|
import cy.agorise.crystalwallet.apigenerator.InsightApiGenerator;
|
2018-09-28 02:19:19 +00:00
|
|
|
import cy.agorise.crystalwallet.apigenerator.insightapi.models.Txi;
|
|
|
|
import cy.agorise.crystalwallet.apigenerator.insightapi.models.Vin;
|
|
|
|
import cy.agorise.crystalwallet.apigenerator.insightapi.models.Vout;
|
2018-11-01 03:14:13 +00:00
|
|
|
import cy.agorise.crystalwallet.dao.BitcoinAddressDao;
|
2018-10-05 03:59:32 +00:00
|
|
|
import cy.agorise.crystalwallet.dao.CrystalDatabase;
|
2018-09-28 02:19:19 +00:00
|
|
|
import cy.agorise.crystalwallet.enums.CryptoCoin;
|
2018-10-19 04:13:42 +00:00
|
|
|
import cy.agorise.crystalwallet.models.AccountSeed;
|
|
|
|
import cy.agorise.crystalwallet.models.BitcoinAddress;
|
2018-10-05 03:59:32 +00:00
|
|
|
import cy.agorise.crystalwallet.models.BitcoinTransaction;
|
2018-10-18 03:32:17 +00:00
|
|
|
import cy.agorise.crystalwallet.models.BitcoinTransactionGTxIO;
|
2018-10-19 04:13:42 +00:00
|
|
|
import cy.agorise.crystalwallet.models.CryptoCoinBalance;
|
2018-10-18 03:32:17 +00:00
|
|
|
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
|
2018-10-19 04:13:42 +00:00
|
|
|
import cy.agorise.crystalwallet.models.CryptoCurrency;
|
2018-09-17 03:43:59 +00:00
|
|
|
import cy.agorise.crystalwallet.models.CryptoNetAccount;
|
2018-10-24 03:28:53 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.BitcoinSendRequest;
|
2018-11-14 02:02:22 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.BitcoinUriParseRequest;
|
2018-11-11 03:21:49 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.CalculateBitcoinUriRequest;
|
2018-10-24 03:28:53 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.CreateBitcoinAccountRequest;
|
2018-09-17 03:43:59 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequest;
|
|
|
|
import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestsListener;
|
2018-10-24 03:28:53 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.NextBitcoinAccountAddressRequest;
|
2018-11-07 03:34:54 +00:00
|
|
|
import cy.agorise.crystalwallet.requestmanagers.ValidateBitcoinAddressRequest;
|
2018-09-17 03:43:59 +00:00
|
|
|
import cy.agorise.graphenej.Util;
|
|
|
|
|
|
|
|
public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInfoRequestsListener {
|
|
|
|
|
2018-10-05 03:59:32 +00:00
|
|
|
static HashMap<CryptoCoin, GeneralAccountManager> generalAccountManagers = new HashMap();
|
|
|
|
|
|
|
|
private static CryptoCoin[] SUPPORTED_COINS = new CryptoCoin[]{
|
|
|
|
CryptoCoin.BITCOIN,
|
|
|
|
CryptoCoin.BITCOIN_TEST,
|
|
|
|
CryptoCoin.DASH,
|
|
|
|
CryptoCoin.LITECOIN
|
|
|
|
} ;
|
|
|
|
|
|
|
|
final CryptoCoin cryptoCoin;
|
|
|
|
final Context context;
|
|
|
|
|
|
|
|
public static GeneralAccountManager getAccountManager(CryptoCoin coin){
|
|
|
|
return generalAccountManagers.get(coin);
|
|
|
|
}
|
|
|
|
|
|
|
|
public GeneralAccountManager(CryptoCoin cryptoCoin, Context context) {
|
|
|
|
this.cryptoCoin = cryptoCoin;
|
|
|
|
this.context = context;
|
|
|
|
generalAccountManagers.put(cryptoCoin,this);
|
|
|
|
}
|
2018-09-28 02:19:19 +00:00
|
|
|
|
2018-09-17 03:43:59 +00:00
|
|
|
@Override
|
|
|
|
public void createAccountFromSeed(CryptoNetAccount account, ManagerRequest request, Context context) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void importAccountFromSeed(CryptoNetAccount account, Context context) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2018-11-01 03:14:13 +00:00
|
|
|
public void loadAccountFromDB(final CryptoNetAccount account, Context context) {
|
|
|
|
final CrystalDatabase db = CrystalDatabase.getAppDatabase(context);
|
2018-09-17 03:43:59 +00:00
|
|
|
|
2018-11-01 03:14:13 +00:00
|
|
|
AccountSeed seed = db.accountSeedDao().findById(account.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(account.getAccountIndex(), true));
|
|
|
|
final DeterministicKey externalKey = HDKeyDerivation.deriveChildKey(accountKey,
|
|
|
|
new ChildNumber(0, false));
|
|
|
|
final DeterministicKey changeKey = HDKeyDerivation.deriveChildKey(accountKey,
|
|
|
|
new ChildNumber(1, false));
|
|
|
|
|
2018-11-06 03:06:12 +00:00
|
|
|
CryptoCoinBalance balance = new CryptoCoinBalance();
|
|
|
|
balance.setBalance(0);
|
2018-11-13 02:40:44 +00:00
|
|
|
balance.setCryptoCurrencyId(db.cryptoCurrencyDao().getByName(cryptoCoin.getLabel(),cryptoCoin.name()).getId());
|
2018-11-06 03:06:12 +00:00
|
|
|
balance.setAccountId(account.getId());
|
|
|
|
db.cryptoCoinBalanceDao().insertCryptoCoinBalance(balance);
|
|
|
|
|
2018-11-01 03:14:13 +00:00
|
|
|
long indexExternal = db.bitcoinAddressDao().getLastExternalAddress(account.getId());
|
|
|
|
if(indexExternal > 0){
|
|
|
|
for(int i = 0; i < indexExternal;i++){
|
|
|
|
BitcoinAddress address = db.bitcoinAddressDao().getExternalByIndex(i);
|
|
|
|
InsightApiGenerator.getTransactionFromAddress(cryptoCoin,address.getAddress(),true,null);
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
ECKey externalAddrKey = HDKeyDerivation.deriveChildKey(externalKey, new ChildNumber((int) 0, true));
|
|
|
|
BitcoinAddress address = new BitcoinAddress();
|
|
|
|
address.setChange(false);
|
|
|
|
address.setAccountId(account.getId());
|
|
|
|
address.setIndex(0);
|
|
|
|
String addressString =externalAddrKey.toAddress(this.cryptoCoin.getParameters()).toString();
|
|
|
|
address.setAddress(addressString);
|
|
|
|
db.bitcoinAddressDao().insertBitcoinAddresses(address);
|
|
|
|
InsightApiGenerator.getTransactionFromAddress(cryptoCoin,addressString,true,
|
|
|
|
new CheckAddressForTransaction(db.bitcoinAddressDao(),account.getId(),externalKey,false,0));
|
|
|
|
}
|
|
|
|
|
|
|
|
long indexChange = db.bitcoinAddressDao().getLastChangeAddress(account.getId());
|
|
|
|
if(indexChange > 0){
|
|
|
|
for(int i = 0; i < indexChange;i++){
|
|
|
|
BitcoinAddress address = db.bitcoinAddressDao().getChangeByIndex(i);
|
|
|
|
InsightApiGenerator.getTransactionFromAddress(cryptoCoin,address.getAddress(),true,null);
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
ECKey changeAddrKey = HDKeyDerivation.deriveChildKey(changeKey, new ChildNumber((int) 0, true));
|
|
|
|
BitcoinAddress address = new BitcoinAddress();
|
|
|
|
address.setChange(true);
|
|
|
|
address.setAccountId(account.getId());
|
|
|
|
address.setIndex(0);
|
|
|
|
String addressString =changeAddrKey.toAddress(this.cryptoCoin.getParameters()).toString();
|
|
|
|
address.setAddress(addressString);
|
|
|
|
db.bitcoinAddressDao().insertBitcoinAddresses(address);
|
|
|
|
InsightApiGenerator.getTransactionFromAddress(cryptoCoin,addressString,true,
|
|
|
|
new CheckAddressForTransaction(db.bitcoinAddressDao(),account.getId(),externalKey,true,0));
|
|
|
|
}
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|
|
|
|
|
2018-11-01 03:14:13 +00:00
|
|
|
|
|
|
|
|
2018-09-17 03:43:59 +00:00
|
|
|
@Override
|
|
|
|
public void onNewRequest(CryptoNetInfoRequest request) {
|
2018-10-24 03:28:53 +00:00
|
|
|
//if(Arrays.asList(SUPPORTED_COINS).contains(request.getCoin())){
|
|
|
|
if(request.getCoin().equals(this.cryptoCoin)){
|
|
|
|
if(request instanceof BitcoinSendRequest) {
|
|
|
|
}else if(request instanceof CreateBitcoinAccountRequest){
|
2018-11-01 03:14:13 +00:00
|
|
|
this.createGeneralAccount((CreateBitcoinAccountRequest) request);
|
2018-10-24 03:28:53 +00:00
|
|
|
}else if(request instanceof NextBitcoinAccountAddressRequest){
|
|
|
|
this.getNextAddress((NextBitcoinAccountAddressRequest) request);
|
2018-11-07 03:34:54 +00:00
|
|
|
}else if(request instanceof ValidateBitcoinAddressRequest){
|
|
|
|
this.validateAddress((ValidateBitcoinAddressRequest) request);
|
2018-11-11 03:21:49 +00:00
|
|
|
}else if(request instanceof CalculateBitcoinUriRequest){
|
|
|
|
this.calculateUri((CalculateBitcoinUriRequest) request);
|
2018-11-14 02:02:22 +00:00
|
|
|
}else if(request instanceof BitcoinUriParseRequest){
|
|
|
|
this.parseUri((BitcoinUriParseRequest) request);
|
2018-10-05 03:59:32 +00:00
|
|
|
}else{
|
|
|
|
System.out.println("Invalid " +this.cryptoCoin.getLabel() + " request ");
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|
|
|
|
|
2018-09-28 02:19:19 +00:00
|
|
|
/**
|
|
|
|
* Class that process each transaction fetched by the insight api
|
|
|
|
* @param txi
|
|
|
|
*/
|
|
|
|
public void processTxi(Txi txi){
|
2018-10-05 03:59:32 +00:00
|
|
|
CrystalDatabase db = CrystalDatabase.getAppDatabase(this.context);
|
2018-10-18 03:32:17 +00:00
|
|
|
List<BitcoinTransaction> btTransactions = db.bitcoinTransactionDao().getTransactionsByTxid(txi.txid);
|
|
|
|
if(!btTransactions.isEmpty()){
|
|
|
|
for(BitcoinTransaction btTransaction : btTransactions) {
|
|
|
|
btTransaction.setConfirmations(txi.confirmations);
|
|
|
|
CryptoCoinTransaction ccTransaction = db.transactionDao().getById(btTransaction.getCryptoCoinTransactionId());
|
|
|
|
if (!ccTransaction.isConfirmed() && btTransaction.getConfirmations() >= cryptoCoin.getCryptoNet().getConfirmationsNeeded()) {
|
|
|
|
ccTransaction.setConfirmed(true);
|
|
|
|
db.transactionDao().insertTransaction(ccTransaction);
|
2018-10-19 04:13:42 +00:00
|
|
|
updateBalance(ccTransaction,(ccTransaction.getInput()?1:-1)*ccTransaction.getAmount(),db);
|
2018-10-18 03:32:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
db.bitcoinTransactionDao().insertBitcoinTransaction(btTransaction);
|
|
|
|
}
|
2018-10-05 03:59:32 +00:00
|
|
|
}else {
|
2018-10-18 03:32:17 +00:00
|
|
|
/*List<CryptoCoinTransaction> ccTransactions = new ArrayList();
|
|
|
|
btTransactions = new ArrayList();*/ //TODO transactions involving multiples accounts
|
|
|
|
CryptoCoinTransaction ccTransaction = new CryptoCoinTransaction();
|
|
|
|
BitcoinTransaction btTransaction = new BitcoinTransaction();
|
|
|
|
btTransaction.setTxId(txi.txid);
|
|
|
|
btTransaction.setBlock(txi.blockheight);
|
|
|
|
btTransaction.setFee((long) (txi.fee * Math.pow(10, cryptoCoin.getPrecision())));
|
|
|
|
btTransaction.setConfirmations(txi.confirmations);
|
|
|
|
ccTransaction.setDate(new Date(txi.time * 1000));
|
|
|
|
if(txi.txlock || txi.confirmations >= cryptoCoin.getCryptoNet().getConfirmationsNeeded()) {
|
|
|
|
ccTransaction.setConfirmed(true);
|
|
|
|
}else{
|
|
|
|
ccTransaction.setConfirmed(false);
|
|
|
|
}
|
2018-10-05 03:59:32 +00:00
|
|
|
|
2018-10-18 03:32:17 +00:00
|
|
|
ccTransaction.setInput(false);
|
|
|
|
|
|
|
|
long amount = 0;
|
2018-10-05 03:59:32 +00:00
|
|
|
|
|
|
|
|
2018-10-18 03:32:17 +00:00
|
|
|
//transaction.setAccount(this.mAccount);
|
|
|
|
//transaction.setType(cryptoCoin);
|
|
|
|
List<BitcoinTransactionGTxIO> gtxios = new ArrayList();
|
2018-10-05 03:59:32 +00:00
|
|
|
for (Vin vin : txi.vin) {
|
2018-10-18 03:32:17 +00:00
|
|
|
BitcoinTransactionGTxIO input = new BitcoinTransactionGTxIO();
|
2018-10-05 03:59:32 +00:00
|
|
|
String addr = vin.addr;
|
2018-10-18 03:32:17 +00:00
|
|
|
input.setAddress(addr);
|
2018-10-05 03:59:32 +00:00
|
|
|
input.setIndex(vin.n);
|
2018-10-18 03:32:17 +00:00
|
|
|
input.setOutput(true);
|
|
|
|
input.setAmount((long) (vin.value * Math.pow(10, cryptoCoin.getPrecision())));
|
|
|
|
input.setOriginalTxId(vin.txid);
|
2018-10-05 03:59:32 +00:00
|
|
|
input.setScriptHex(vin.scriptSig.hex);
|
2018-10-18 03:32:17 +00:00
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
BitcoinAddress address = db.bitcoinAddressDao().getdadress(addr);
|
|
|
|
if(address != null){
|
|
|
|
if(ccTransaction.getAccountId() < 0){
|
|
|
|
ccTransaction.setAccountId(address.getAccountId());
|
|
|
|
ccTransaction.setFrom(addr);
|
|
|
|
ccTransaction.setInput(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ccTransaction.getAccountId()== address.getAccountId()){
|
|
|
|
amount -= vin.value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(ccTransaction.getFrom() == null || ccTransaction.getFrom().isEmpty()){
|
|
|
|
ccTransaction.setFrom(addr);
|
|
|
|
}
|
|
|
|
|
2018-10-18 03:32:17 +00:00
|
|
|
gtxios.add(input);
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
|
2018-10-05 03:59:32 +00:00
|
|
|
}
|
2018-09-28 02:19:19 +00:00
|
|
|
|
2018-10-05 03:59:32 +00:00
|
|
|
for (Vout vout : txi.vout) {
|
|
|
|
if (vout.scriptPubKey.addresses == null || vout.scriptPubKey.addresses.length <= 0) {
|
2018-10-18 03:32:17 +00:00
|
|
|
|
2018-10-05 03:59:32 +00:00
|
|
|
} else {
|
2018-10-18 03:32:17 +00:00
|
|
|
BitcoinTransactionGTxIO output = new BitcoinTransactionGTxIO();
|
2018-10-05 03:59:32 +00:00
|
|
|
String addr = vout.scriptPubKey.addresses[0];
|
2018-10-18 03:32:17 +00:00
|
|
|
output.setAddress(addr);
|
2018-10-05 03:59:32 +00:00
|
|
|
output.setIndex(vout.n);
|
2018-10-18 03:32:17 +00:00
|
|
|
output.setOutput(false);
|
|
|
|
output.setAmount((long) (vout.value * Math.pow(10, cryptoCoin.getPrecision())));
|
2018-10-05 03:59:32 +00:00
|
|
|
output.setScriptHex(vout.scriptPubKey.hex);
|
2018-10-19 04:13:42 +00:00
|
|
|
output.setOriginalTxId(txi.txid);
|
2018-10-18 03:32:17 +00:00
|
|
|
|
|
|
|
gtxios.add(output);
|
2018-10-19 04:13:42 +00:00
|
|
|
BitcoinAddress address = db.bitcoinAddressDao().getdadress(addr);
|
|
|
|
if(address != null){
|
|
|
|
if(ccTransaction.getAccountId() < 0){
|
|
|
|
ccTransaction.setAccountId(address.getAccountId());
|
|
|
|
ccTransaction.setInput(true);
|
|
|
|
ccTransaction.setTo(addr);
|
|
|
|
}
|
2018-09-28 02:19:19 +00:00
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
if(ccTransaction.getAccountId()== address.getAccountId()){
|
|
|
|
amount += vout.value;
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
//TOOD multiple send address
|
|
|
|
if(ccTransaction.getTo() == null || ccTransaction.getTo().isEmpty()){
|
|
|
|
ccTransaction.setTo(addr);
|
2018-09-28 02:19:19 +00:00
|
|
|
}
|
|
|
|
}
|
2018-10-05 03:59:32 +00:00
|
|
|
}
|
2018-09-28 02:19:19 +00:00
|
|
|
}
|
2018-10-18 03:32:17 +00:00
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
ccTransaction.setAmount(amount);
|
|
|
|
CryptoCurrency currency = db.cryptoCurrencyDao().getByNameAndCryptoNet(this.cryptoCoin.name(), this.cryptoCoin.getCryptoNet().name());
|
|
|
|
if (currency == null) {
|
|
|
|
currency = new CryptoCurrency();
|
|
|
|
currency.setCryptoNet(this.cryptoCoin.getCryptoNet());
|
|
|
|
currency.setName(this.cryptoCoin.name());
|
|
|
|
currency.setPrecision(this.cryptoCoin.getPrecision());
|
|
|
|
long idCurrency = db.cryptoCurrencyDao().insertCryptoCurrency(currency)[0];
|
|
|
|
currency.setId(idCurrency);
|
|
|
|
}
|
|
|
|
|
|
|
|
ccTransaction.setIdCurrency((int)currency.getId());
|
|
|
|
|
2018-10-18 03:32:17 +00:00
|
|
|
long ccId = db.transactionDao().insertTransaction(ccTransaction)[0];
|
|
|
|
btTransaction.setCryptoCoinTransactionId(ccId);
|
|
|
|
long btId = db.bitcoinTransactionDao().insertBitcoinTransaction(btTransaction)[0];
|
|
|
|
for(BitcoinTransactionGTxIO gtxio : gtxios){
|
|
|
|
gtxio.setBitcoinTransactionId(btId);
|
2018-10-19 04:13:42 +00:00
|
|
|
db.bitcoinTransactionDao().insertBitcoinTransactionGTxIO(gtxio);
|
2018-10-05 03:59:32 +00:00
|
|
|
}
|
2018-09-28 02:19:19 +00:00
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
if(ccTransaction.isConfirmed()) {
|
|
|
|
updateBalance(ccTransaction,amount,db);
|
2018-09-28 02:19:19 +00:00
|
|
|
}
|
2018-10-05 03:59:32 +00:00
|
|
|
}
|
2018-09-28 02:19:19 +00:00
|
|
|
}
|
|
|
|
|
2018-11-01 03:14:13 +00:00
|
|
|
private void createGeneralAccount(CreateBitcoinAccountRequest request){
|
|
|
|
CrystalDatabase db = CrystalDatabase.getAppDatabase(this.context);
|
|
|
|
CryptoNetAccount account = new CryptoNetAccount();
|
|
|
|
account.setAccountIndex(0);
|
|
|
|
account.setCryptoNet(this.cryptoCoin.getCryptoNet());
|
|
|
|
account.setName(request.getAccountSeed().getName());
|
|
|
|
account.setSeedId(request.getAccountSeed().getId());
|
|
|
|
long idAccount = db.cryptoNetAccountDao().insertCryptoNetAccount(account)[0];
|
|
|
|
account.setId(idAccount);
|
|
|
|
|
|
|
|
loadAccountFromDB(account,request.getContext());
|
|
|
|
request.setStatus(CreateBitcoinAccountRequest.StatusCode.SUCCEEDED);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
private void updateBalance(CryptoCoinTransaction ccTransaction, long amount, CrystalDatabase db){
|
|
|
|
CryptoCurrency currency = db.cryptoCurrencyDao().getByNameAndCryptoNet(this.cryptoCoin.name(), this.cryptoCoin.getCryptoNet().name());
|
|
|
|
if (currency == null) {
|
|
|
|
currency = new CryptoCurrency();
|
|
|
|
currency.setCryptoNet(this.cryptoCoin.getCryptoNet());
|
|
|
|
currency.setName(this.cryptoCoin.name());
|
|
|
|
currency.setPrecision(this.cryptoCoin.getPrecision());
|
|
|
|
long idCurrency = db.cryptoCurrencyDao().insertCryptoCurrency(currency)[0];
|
|
|
|
currency.setId(idCurrency);
|
|
|
|
}
|
|
|
|
|
|
|
|
CryptoCoinBalance balance = db.cryptoCoinBalanceDao().getBalanceFromAccount(ccTransaction.getAccountId(), currency.getId());
|
|
|
|
if (balance == null) {
|
|
|
|
balance = new CryptoCoinBalance();
|
|
|
|
balance.setAccountId(ccTransaction.getAccountId());
|
|
|
|
balance.setCryptoCurrencyId(currency.getId());
|
|
|
|
long idBalance = db.cryptoCoinBalanceDao().insertCryptoCoinBalance(balance)[0];
|
|
|
|
balance.setId(idBalance);
|
|
|
|
}
|
|
|
|
balance.setBalance(balance.getBalance()+amount);
|
|
|
|
db.cryptoCoinBalanceDao().insertCryptoCoinBalance(balance);
|
|
|
|
}
|
|
|
|
|
2018-11-07 03:34:54 +00:00
|
|
|
private void validateAddress(ValidateBitcoinAddressRequest request){
|
|
|
|
try{
|
|
|
|
Address address = Address.fromBase58(this.cryptoCoin.getParameters(), request.getAddress());
|
|
|
|
request.setAddressValid(true);
|
|
|
|
}catch(AddressFormatException ex){
|
|
|
|
request.setAddressValid(false);
|
|
|
|
}
|
|
|
|
request.validate();
|
|
|
|
}
|
|
|
|
|
2018-10-24 03:28:53 +00:00
|
|
|
public void send(final BitcoinSendRequest request){
|
2018-09-17 03:43:59 +00:00
|
|
|
//TODO check server connection
|
|
|
|
//TODO validate to address
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
InsightApiGenerator.getEstimateFee(this.cryptoCoin,new ApiRequest(1, new ApiRequestListener() {
|
2018-09-17 03:43:59 +00:00
|
|
|
@Override
|
|
|
|
public void success(Object answer, int idPetition) {
|
2018-10-19 04:13:42 +00:00
|
|
|
Transaction tx = new Transaction(cryptoCoin.getParameters());
|
2018-09-17 03:43:59 +00:00
|
|
|
long currentAmount = 0;
|
|
|
|
long fee = -1;
|
|
|
|
long feeRate = (Long) answer;
|
|
|
|
fee = 226 * feeRate;
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
CrystalDatabase db = CrystalDatabase.getAppDatabase(request.getContext());
|
|
|
|
db.bitcoinTransactionDao();
|
2018-09-17 03:43:59 +00:00
|
|
|
|
2018-10-24 03:28:53 +00:00
|
|
|
List<BitcoinTransactionGTxIO> utxos = getUtxos(request.getSourceAccount().getId(),db);
|
2018-09-17 03:43:59 +00:00
|
|
|
|
|
|
|
if(currentAmount< request.getAmount() + fee){
|
2018-10-24 03:28:53 +00:00
|
|
|
request.setStatus(BitcoinSendRequest.StatusCode.NO_BALANCE);
|
2018-09-17 03:43:59 +00:00
|
|
|
return;
|
|
|
|
}
|
2018-10-24 03:28:53 +00:00
|
|
|
AccountSeed seed = db.accountSeedDao().findById(request.getSourceAccount().getSeedId());
|
2018-10-19 04:13:42 +00:00
|
|
|
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,
|
2018-10-24 03:28:53 +00:00
|
|
|
new ChildNumber(request.getSourceAccount().getAccountIndex(), true));
|
2018-10-19 04:13:42 +00:00
|
|
|
DeterministicKey externalKey = HDKeyDerivation.deriveChildKey(accountKey,
|
|
|
|
new ChildNumber(0, false));
|
|
|
|
DeterministicKey changeKey = HDKeyDerivation.deriveChildKey(accountKey,
|
|
|
|
new ChildNumber(1, false));
|
2018-09-17 03:43:59 +00:00
|
|
|
|
|
|
|
//String to an address
|
2018-10-19 04:13:42 +00:00
|
|
|
Address toAddr = Address.fromBase58(cryptoCoin.getParameters(), request.getToAccount());
|
2018-09-17 03:43:59 +00:00
|
|
|
tx.addOutput(Coin.valueOf(request.getAmount()), toAddr);
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
/*if(request.getMemo()!= null && !request.getMemo().isEmpty()){
|
2018-09-17 03:43:59 +00:00
|
|
|
String memo = request.getMemo();
|
|
|
|
if(request.getMemo().length()>40){
|
|
|
|
memo = memo.substring(0,40);
|
|
|
|
}
|
|
|
|
byte[]scriptByte = new byte[memo.length()+2];
|
|
|
|
scriptByte[0] = 0x6a;
|
|
|
|
scriptByte[1] = (byte) memo.length();
|
|
|
|
System.arraycopy(memo.getBytes(),0,scriptByte,2,memo.length());
|
|
|
|
Script memoScript = new Script(scriptByte);
|
|
|
|
tx.addOutput(Coin.valueOf(0),memoScript);
|
2018-10-19 04:13:42 +00:00
|
|
|
}*/
|
2018-09-17 03:43:59 +00:00
|
|
|
|
|
|
|
//Change address
|
|
|
|
long remain = currentAmount - request.getAmount() - fee;
|
|
|
|
if( remain > 0 ) {
|
2018-10-24 03:28:53 +00:00
|
|
|
long index = db.bitcoinAddressDao().getLastChangeAddress(request.getSourceAccount().getId());
|
2018-10-19 04:13:42 +00:00
|
|
|
BitcoinAddress btAddress = db.bitcoinAddressDao().getChangeByIndex(index);
|
|
|
|
Address changeAddr;
|
|
|
|
if(btAddress != null && db.bitcoinTransactionDao().getGtxIOByAddress(btAddress.getAddress()).size()<=0){
|
|
|
|
changeAddr = Address.fromBase58(cryptoCoin.getParameters(), btAddress.getAddress());
|
|
|
|
|
|
|
|
}else{
|
|
|
|
if(btAddress == null){
|
|
|
|
index = 0;
|
|
|
|
}else{
|
|
|
|
index++;
|
|
|
|
}
|
|
|
|
btAddress = new BitcoinAddress();
|
|
|
|
btAddress.setIndex(index);
|
2018-10-24 03:28:53 +00:00
|
|
|
btAddress.setAccountId(request.getSourceAccount().getId());
|
2018-10-19 04:13:42 +00:00
|
|
|
btAddress.setChange(true);
|
|
|
|
btAddress.setAddress(HDKeyDerivation.deriveChildKey(changeKey, new ChildNumber((int) btAddress.getIndex(), false)).toAddress(cryptoCoin.getParameters()).toString());
|
|
|
|
db.bitcoinAddressDao().insertBitcoinAddresses(btAddress);
|
|
|
|
changeAddr = Address.fromBase58(cryptoCoin.getParameters(), btAddress.getAddress());
|
|
|
|
}
|
2018-09-17 03:43:59 +00:00
|
|
|
tx.addOutput(Coin.valueOf(remain), changeAddr);
|
|
|
|
}
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
for(BitcoinTransactionGTxIO utxo: utxos) {
|
|
|
|
Sha256Hash txHash = Sha256Hash.wrap(utxo.getOriginalTxId());
|
2018-09-17 03:43:59 +00:00
|
|
|
Script script = new Script(Util.hexToBytes(utxo.getScriptHex()));
|
2018-10-19 04:13:42 +00:00
|
|
|
TransactionOutPoint outPoint = new TransactionOutPoint(cryptoCoin.getParameters(), utxo.getIndex(), txHash);
|
|
|
|
BitcoinAddress btAddress = db.bitcoinAddressDao().getdadress(utxo.getAddress());
|
|
|
|
ECKey addrKey;
|
|
|
|
|
|
|
|
if(btAddress.isChange()){
|
|
|
|
addrKey = HDKeyDerivation.deriveChildKey(changeKey, new ChildNumber((int) btAddress.getIndex(), false));
|
|
|
|
}else{
|
2018-10-24 03:28:53 +00:00
|
|
|
addrKey = HDKeyDerivation.deriveChildKey(externalKey, new ChildNumber((int) btAddress.getIndex(), true));
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|
2018-10-19 04:13:42 +00:00
|
|
|
tx.addSignedInput(outPoint, script, addrKey, Transaction.SigHash.ALL, true);
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
InsightApiGenerator.broadcastTransaction(cryptoCoin,Util.bytesToHex(tx.bitcoinSerialize()),new ApiRequest(1, new ApiRequestListener() {
|
2018-09-17 03:43:59 +00:00
|
|
|
@Override
|
|
|
|
public void success(Object answer, int idPetition) {
|
2018-10-24 03:28:53 +00:00
|
|
|
request.setStatus(BitcoinSendRequest.StatusCode.SUCCEEDED);
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void fail(int idPetition) {
|
2018-10-24 03:28:53 +00:00
|
|
|
request.setStatus(BitcoinSendRequest.StatusCode.PETITION_FAILED);
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void fail(int idPetition) {
|
2018-10-24 03:28:53 +00:00
|
|
|
request.setStatus(BitcoinSendRequest.StatusCode.NO_FEE);
|
2018-09-17 03:43:59 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
}
|
2018-10-19 04:13:42 +00:00
|
|
|
|
2018-10-24 03:28:53 +00:00
|
|
|
private void getNextAddress(NextBitcoinAccountAddressRequest request){
|
|
|
|
CrystalDatabase db = CrystalDatabase.getAppDatabase(request.getContext());
|
|
|
|
long index = db.bitcoinAddressDao().getLastExternalAddress(request.getAccount().getId());
|
2018-11-11 03:21:49 +00:00
|
|
|
BitcoinAddress address = db.bitcoinAddressDao().getExternalByIndex(index);
|
2018-11-12 03:06:09 +00:00
|
|
|
if(address != null && db.bitcoinTransactionDao().getGtxIOByAddress(address.getAddress()).size()<=0){
|
2018-11-11 03:21:49 +00:00
|
|
|
request.setAddress(address.getAddress());
|
|
|
|
request.setStatus(NextBitcoinAccountAddressRequest.StatusCode.SUCCEEDED);
|
|
|
|
}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);
|
|
|
|
|
|
|
|
request.setAddress(addressString);
|
|
|
|
request.setStatus(NextBitcoinAccountAddressRequest.StatusCode.SUCCEEDED);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void calculateUri(CalculateBitcoinUriRequest request) {
|
2018-11-13 02:40:44 +00:00
|
|
|
StringBuilder uri = new StringBuilder(this.cryptoCoin.name().toLowerCase()+":");
|
2018-11-11 03:21:49 +00:00
|
|
|
|
|
|
|
CrystalDatabase db = CrystalDatabase.getAppDatabase(request.getContext());
|
|
|
|
long index = db.bitcoinAddressDao().getLastExternalAddress(request.getAccount().getId());
|
|
|
|
BitcoinAddress address = db.bitcoinAddressDao().getExternalByIndex(index);
|
2018-11-12 02:26:34 +00:00
|
|
|
if(address != null && db.bitcoinTransactionDao().getGtxIOByAddress(address.getAddress()).size()<=0){
|
2018-11-11 03:21:49 +00:00
|
|
|
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());
|
|
|
|
}
|
2018-11-19 01:55:32 +00:00
|
|
|
if(request.getAmount() > 0 ){
|
2018-11-11 03:21:49 +00:00
|
|
|
uri.append("?amount=");
|
2018-11-19 01:55:32 +00:00
|
|
|
uri.append(Double.toString(request.getAmount()));
|
2018-11-11 03:21:49 +00:00
|
|
|
}
|
|
|
|
|
2018-11-13 02:40:44 +00:00
|
|
|
System.out.println("GeneralAccountMAnager uri calculated : " + uri.toString());
|
|
|
|
|
2018-11-11 03:21:49 +00:00
|
|
|
request.setUri(uri.toString());
|
|
|
|
request.validate();
|
2018-10-24 03:28:53 +00:00
|
|
|
}
|
|
|
|
|
2018-11-14 02:02:22 +00:00
|
|
|
private void parseUri(BitcoinUriParseRequest request){
|
|
|
|
String uri = request.getUri();
|
|
|
|
if(uri.indexOf(":")>0){
|
|
|
|
String cryptoNet = uri.substring(0,uri.indexOf(":"));
|
2018-11-19 01:30:42 +00:00
|
|
|
if(cryptoNet.equalsIgnoreCase(this.cryptoCoin.name().toLowerCase())){
|
2018-11-14 02:02:22 +00:00
|
|
|
try{
|
2018-11-19 01:41:29 +00:00
|
|
|
int parameterIndex =uri.indexOf("?");
|
|
|
|
Address address = Address.fromBase58(this.cryptoCoin.getParameters(), uri.substring(uri.indexOf(":")+1,parameterIndex>0?parameterIndex:uri.length()));
|
2018-11-14 02:02:22 +00:00
|
|
|
request.setAddress(address.toString());
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.VALID);
|
2018-11-19 01:41:29 +00:00
|
|
|
if(parameterIndex>0){
|
2018-11-14 02:02:22 +00:00
|
|
|
try {
|
2018-11-19 01:41:29 +00:00
|
|
|
String[] parameters = uri.substring(parameterIndex + 1).split("&");
|
2018-11-14 02:02:22 +00:00
|
|
|
for (String parameter : parameters) {
|
|
|
|
int idx = parameter.indexOf("=");
|
|
|
|
if (idx > 0 && parameter.substring(0, idx).equalsIgnoreCase("amount")) {
|
|
|
|
request.setAmount(Double.parseDouble(parameter.substring(idx + 1)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}catch(Exception ignored){}
|
|
|
|
}
|
|
|
|
}catch(AddressFormatException ex){
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.NOT_VALID);
|
|
|
|
}
|
|
|
|
|
|
|
|
}else{
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.NOT_VALID);
|
|
|
|
}
|
|
|
|
}else{
|
2018-11-19 01:41:29 +00:00
|
|
|
int parameterIndex =uri.indexOf("?");
|
|
|
|
if(parameterIndex>0){
|
2018-11-14 02:02:22 +00:00
|
|
|
try{
|
2018-11-19 01:41:29 +00:00
|
|
|
Address address = Address.fromBase58(this.cryptoCoin.getParameters(), uri.substring(uri.indexOf(":")+1,parameterIndex>0?parameterIndex:uri.length()));
|
2018-11-14 02:02:22 +00:00
|
|
|
request.setAddress(address.toString());
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.VALID);
|
|
|
|
try{
|
2018-11-19 01:41:29 +00:00
|
|
|
String[] parameters = uri.substring(parameterIndex+1).split("&");
|
2018-11-14 02:02:22 +00:00
|
|
|
for(String parameter : parameters){
|
|
|
|
int idx = parameter.indexOf("=");
|
|
|
|
if(idx > 0 && parameter.substring(0,idx).equalsIgnoreCase("amount")){
|
|
|
|
request.setAmount(Double.parseDouble(parameter.substring(idx+1)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}catch(Exception ignored){}
|
|
|
|
|
|
|
|
}catch(AddressFormatException ex){
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.NOT_VALID);
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
try{
|
2018-11-19 01:41:29 +00:00
|
|
|
Address address = Address.fromBase58(this.cryptoCoin.getParameters(), uri);
|
2018-11-14 02:02:22 +00:00
|
|
|
request.setAddress(address.toString());
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.VALID);
|
|
|
|
|
|
|
|
}catch(AddressFormatException ex){
|
|
|
|
request.setStatus(BitcoinUriParseRequest.StatusCode.NOT_VALID);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
request.validate();
|
|
|
|
}
|
|
|
|
|
2018-10-19 04:13:42 +00:00
|
|
|
private List<BitcoinTransactionGTxIO> getUtxos(long accountId, CrystalDatabase db){
|
|
|
|
List<BitcoinTransactionGTxIO> answer = new ArrayList<>();
|
|
|
|
List<BitcoinTransactionGTxIO> bTGTxI = new ArrayList<>();
|
|
|
|
List<BitcoinTransactionGTxIO> bTGTxO = new ArrayList<>();
|
|
|
|
List<CryptoCoinTransaction> ccTransactions = db.transactionDao().getByIdAccount(accountId);
|
|
|
|
for(CryptoCoinTransaction ccTransaction : ccTransactions) {
|
|
|
|
List<BitcoinTransactionGTxIO> gtxios = db.bitcoinTransactionDao().getGtxIOByTransaction(ccTransaction.getId());
|
|
|
|
for(BitcoinTransactionGTxIO gtxio : gtxios){
|
|
|
|
if(db.bitcoinAddressDao().addressExists(gtxio.getAddress())){
|
|
|
|
if(gtxio.isOutput()){
|
|
|
|
bTGTxO.add(gtxio);
|
|
|
|
}else{
|
|
|
|
bTGTxI.add(gtxio);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for(BitcoinTransactionGTxIO gtxi : bTGTxI){
|
|
|
|
boolean find = false;
|
|
|
|
for(BitcoinTransactionGTxIO gtxo : bTGTxO){
|
|
|
|
if(gtxo.getOriginalTxId().equals(gtxi.getOriginalTxId())){
|
|
|
|
find = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(!find){
|
|
|
|
answer.add(gtxi);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return answer;
|
|
|
|
}
|
2018-11-01 03:14:13 +00:00
|
|
|
|
|
|
|
class CheckAddressForTransaction implements InsightApiGenerator.HasTransactionListener{
|
|
|
|
BitcoinAddressDao bitcoinAddressDao;
|
|
|
|
long idAccount;
|
|
|
|
DeterministicKey addressKey;
|
|
|
|
boolean isChange;
|
|
|
|
int lastIndex;
|
|
|
|
|
|
|
|
public CheckAddressForTransaction(BitcoinAddressDao bitcoinAddressDao, long idAccount, DeterministicKey addressKey, boolean isChange, int lastIndex) {
|
|
|
|
this.bitcoinAddressDao = bitcoinAddressDao;
|
|
|
|
this.idAccount = idAccount;
|
|
|
|
this.addressKey = addressKey;
|
|
|
|
this.isChange = isChange;
|
|
|
|
this.lastIndex = lastIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void hasTransaction(boolean value) {
|
|
|
|
if(value){
|
|
|
|
|
|
|
|
ECKey externalAddrKey = HDKeyDerivation.deriveChildKey(addressKey, new ChildNumber(lastIndex+1, true));
|
|
|
|
BitcoinAddress address = new BitcoinAddress();
|
|
|
|
address.setChange(isChange);
|
|
|
|
address.setAccountId(idAccount);
|
|
|
|
address.setIndex(lastIndex+1);
|
|
|
|
String addressString =externalAddrKey.toAddress(cryptoCoin.getParameters()).toString();
|
|
|
|
address.setAddress(addressString);
|
|
|
|
bitcoinAddressDao.insertBitcoinAddresses(address);
|
|
|
|
InsightApiGenerator.getTransactionFromAddress(cryptoCoin,addressString,true,
|
|
|
|
new CheckAddressForTransaction(bitcoinAddressDao,idAccount,addressKey,isChange,lastIndex+1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-09-17 03:43:59 +00:00
|
|
|
}
|