diff --git a/app/src/main/java/cy/agorise/crystalwallet/manager/GeneralAccountManager.java b/app/src/main/java/cy/agorise/crystalwallet/manager/GeneralAccountManager.java index c051b8b..9b49076 100644 --- a/app/src/main/java/cy/agorise/crystalwallet/manager/GeneralAccountManager.java +++ b/app/src/main/java/cy/agorise/crystalwallet/manager/GeneralAccountManager.java @@ -3,6 +3,7 @@ package cy.agorise.crystalwallet.manager; import android.content.Context; import org.bitcoinj.core.Address; +import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Sha256Hash; @@ -41,6 +42,7 @@ import cy.agorise.crystalwallet.requestmanagers.CreateBitcoinAccountRequest; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequest; import cy.agorise.crystalwallet.requestmanagers.CryptoNetInfoRequestsListener; import cy.agorise.crystalwallet.requestmanagers.NextBitcoinAccountAddressRequest; +import cy.agorise.crystalwallet.requestmanagers.ValidateBitcoinAddressRequest; import cy.agorise.graphenej.Util; public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInfoRequestsListener { @@ -93,6 +95,12 @@ public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInf final DeterministicKey changeKey = HDKeyDerivation.deriveChildKey(accountKey, new ChildNumber(1, false)); + CryptoCoinBalance balance = new CryptoCoinBalance(); + balance.setBalance(0); + balance.setCryptoCurrencyId(db.cryptoCurrencyDao().getByName(cryptoCoin.name(),cryptoCoin.name()).getId()); + balance.setAccountId(account.getId()); + db.cryptoCoinBalanceDao().insertCryptoCoinBalance(balance); + long indexExternal = db.bitcoinAddressDao().getLastExternalAddress(account.getId()); if(indexExternal > 0){ for(int i = 0; i < indexExternal;i++){ @@ -143,6 +151,8 @@ public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInf this.createGeneralAccount((CreateBitcoinAccountRequest) request); }else if(request instanceof NextBitcoinAccountAddressRequest){ this.getNextAddress((NextBitcoinAccountAddressRequest) request); + }else if(request instanceof ValidateBitcoinAddressRequest){ + this.validateAddress((ValidateBitcoinAddressRequest) request); }else{ System.out.println("Invalid " +this.cryptoCoin.getLabel() + " request "); } @@ -325,6 +335,16 @@ public class GeneralAccountManager implements CryptoAccountManager, CryptoNetInf db.cryptoCoinBalanceDao().insertCryptoCoinBalance(balance); } + 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(); + } + public void send(final BitcoinSendRequest request){ //TODO check server connection //TODO validate to address diff --git a/app/src/main/java/cy/agorise/crystalwallet/network/GetDatabaseVersion.java b/app/src/main/java/cy/agorise/crystalwallet/network/GetDatabaseVersion.java new file mode 100644 index 0000000..6625030 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/network/GetDatabaseVersion.java @@ -0,0 +1,68 @@ +package cy.agorise.crystalwallet.network; + +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.neovisionaries.ws.client.WebSocket; +import com.neovisionaries.ws.client.WebSocketFrame; + +import java.io.Serializable; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import cy.agorise.graphenej.RPC; +import cy.agorise.graphenej.api.BaseGrapheneHandler; +import cy.agorise.graphenej.interfaces.WitnessResponseListener; +import cy.agorise.graphenej.models.ApiCall; +import cy.agorise.graphenej.models.WitnessResponse; + +/** + * Created by henry on 28/2/2018. + */ + +public class GetDatabaseVersion extends BaseGrapheneHandler { + + private final WitnessResponseListener mListener; + + public GetDatabaseVersion(WitnessResponseListener listener) { + super(listener); + this.mListener = listener; + } + + @Override + public void onConnected(WebSocket websocket, Map> headers) throws Exception { + ApiCall getAccountByName = new ApiCall(0, "database_api.get_version", new ArrayList(), RPC.VERSION, 1); + websocket.sendText(getAccountByName.toJsonString()); + } + + @Override + public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception { + System.out.println("<<< "+frame.getPayloadText()); + String response = frame.getPayloadText(); + + Type GetChainIdResponse = new TypeToken>(){}.getType(); + GsonBuilder builder = new GsonBuilder(); + WitnessResponse witnessResponse = builder.create().fromJson(response, GetChainIdResponse); + if(witnessResponse.error != null){ + this.mListener.onError(witnessResponse.error); + }else{ + this.mListener.onSuccess(witnessResponse); + } + + websocket.disconnect(); + } + + @Override + public void onFrameSent(WebSocket websocket, WebSocketFrame frame) throws Exception { + if(frame.isTextFrame()) + System.out.println(">>> "+frame.getPayloadText()); + } + + public class VersionResponse{ + public String blockchain_version; + public String steem_revision; + public String fc_revision; + public String chain_id; + } +} diff --git a/app/src/main/java/cy/agorise/crystalwallet/network/SteemCryptoNetVerifier.java b/app/src/main/java/cy/agorise/crystalwallet/network/SteemCryptoNetVerifier.java new file mode 100644 index 0000000..3374883 --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/network/SteemCryptoNetVerifier.java @@ -0,0 +1,49 @@ +package cy.agorise.crystalwallet.network; + +import cy.agorise.crystalwallet.enums.CryptoNet; +import cy.agorise.graphenej.interfaces.WitnessResponseListener; +import cy.agorise.graphenej.models.BaseResponse; +import cy.agorise.graphenej.models.WitnessResponse; + +/** + * + * Created by henry on 28/2/2018. + */ + +public class SteemCryptoNetVerifier extends CryptoNetVerifier { + private final CryptoNet cryptoNet = CryptoNet.STEEM; + private final String CHAIN_ID = "0000000000000000000000000000000000000000000000000000000000000000";//mainnet + + @Override + public void checkURL(final String url) { + final long startTime = System.currentTimeMillis(); + WebSocketThread thread = new WebSocketThread(new GetChainId(new WitnessResponseListener() { + @Override + public void onSuccess(WitnessResponse response) { + if(response.result instanceof GetDatabaseVersion.VersionResponse) { + GetDatabaseVersion.VersionResponse result = (GetDatabaseVersion.VersionResponse) response.result; + if(result.chain_id.equals(CHAIN_ID)) { + CryptoNetManager.verifiedCryptoNetURL(cryptoNet, url, System.currentTimeMillis() - startTime); + }else{ + System.out.println(" BitsharesCryptoNetVerifier Error we are not in the net current chain id " + result.chain_id + " excepted " + CHAIN_ID); + //TODO handle error bad chain + } + }else{ + //TODO handle error bad answer + } + } + + @Override + public void onError(BaseResponse.Error error) { + //TODO handle error + System.out.println("Bad server response " + url); + } + }),url); + thread.start(); + } + + @Override + public String getChainId() { + return CHAIN_ID; + } +} \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateBitcoinAddressRequest.java b/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateBitcoinAddressRequest.java new file mode 100644 index 0000000..6bdea4b --- /dev/null +++ b/app/src/main/java/cy/agorise/crystalwallet/requestmanagers/ValidateBitcoinAddressRequest.java @@ -0,0 +1,42 @@ +package cy.agorise.crystalwallet.requestmanagers; + +import cy.agorise.crystalwallet.enums.CryptoCoin; + +/** + * 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 ValidateBitcoinAddressRequest extends CryptoNetInfoRequest { + // The account name to validate + private String address; + // The result of the validation, or null if there isn't a response + private Boolean addressValid; + + public ValidateBitcoinAddressRequest(CryptoCoin cryptoCoin, String address) { + super(cryptoCoin); + this.address = address; + } + + public boolean getAddressValid(){ + return this.addressValid; + } + + public void setAddressValid(boolean value){ + this.addressValid = value; + this.validate(); + } + + public void validate(){ + if ((this.addressValid != null)){ + this._fireOnCarryOutEvent(); + } + } + + public String getAddress() { + return address; + } + +}