From 80861a8353d5ee34075a6137633f1486ce3bc5ee Mon Sep 17 00:00:00 2001 From: Ebenezer Ackon Date: Tue, 17 Apr 2018 17:14:19 -0400 Subject: [PATCH] Support Handling contract Transactions #15 --- .../etherscan/helloetherescan/MainActivity.kt | 14 +++++++-- .../main/java/jfyg/model/TxExecutionStatus.kt | 5 +++ .../main/java/jfyg/model/TxReceiptStatus.kt | 3 ++ .../main/java/jfyg/network/NetworkService.kt | 14 +++++++++ .../main/java/jfyg/queries/QueryMediator.kt | 15 ++++++++- .../java/jfyg/queries/SmartContractQueries.kt | 3 +- .../java/jfyg/queries/TransactionQueries.kt | 23 ++++++++++++++ .../TransactionContractExecutionResponse.kt | 9 ++++++ .../TransactionContractReceiptResponse.kt | 9 ++++++ .../jfyg/transaction/TransactionContract.kt | 28 +++++++++++++++++ .../transaction/TransactionContractStatus.kt | 31 +++++++++++++++++++ 11 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 etherscanapi/src/main/java/jfyg/model/TxExecutionStatus.kt create mode 100644 etherscanapi/src/main/java/jfyg/model/TxReceiptStatus.kt create mode 100644 etherscanapi/src/main/java/jfyg/queries/TransactionQueries.kt create mode 100644 etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractExecutionResponse.kt create mode 100644 etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractReceiptResponse.kt create mode 100644 etherscanapi/src/main/java/jfyg/transaction/TransactionContract.kt create mode 100644 etherscanapi/src/main/java/jfyg/transaction/TransactionContractStatus.kt diff --git a/app/src/main/java/jfyg/etherscan/helloetherescan/MainActivity.kt b/app/src/main/java/jfyg/etherscan/helloetherescan/MainActivity.kt index fbb582b..827b3c7 100644 --- a/app/src/main/java/jfyg/etherscan/helloetherescan/MainActivity.kt +++ b/app/src/main/java/jfyg/etherscan/helloetherescan/MainActivity.kt @@ -8,6 +8,7 @@ import io.reactivex.rxkotlin.subscribeBy import jfyg.account.Account import jfyg.contract.SmartContract import jfyg.stat.Stat +import jfyg.transaction.TransactionContractStatus import kotlinx.android.synthetic.main.activity_main.* @@ -23,6 +24,7 @@ class MainActivity : AppCompatActivity() { val stat = Stat() val account = Account() val contract = SmartContract() + val transaction = TransactionContractStatus() fab.setOnClickListener { @@ -34,18 +36,26 @@ class MainActivity : AppCompatActivity() { } //account test - account.getTransactions("0x2c1ba59d6f58433fb1eaee7d20b26ed83bda51a3").observeOn(AndroidSchedulers.mainThread()) + account.getTransactions("0x2c1ba59d6f58433fb1eaee7d20b26ed83bda51a3") + .observeOn(AndroidSchedulers.mainThread()) ?.subscribeBy { Log.d(TAG, "The Account Size of Transactions is: ${it.size}") } //contracts test - contract.getContractABI("0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413").observeOn(AndroidSchedulers.mainThread()) + contract.getContractABI("0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413") + .observeOn(AndroidSchedulers.mainThread()) ?.subscribeBy { Log.d(TAG, "The ABI has returned: $it") } //transaction test + transaction.getTransactionExecutionStatus("0x15f8e5ea1079d9a0bb04a4c58ae5fe7654b5b2b4463375ff7ffb490aa0032f3a") + .observeOn(AndroidSchedulers.mainThread()) + ?.subscribeBy { + Log.d(TAG, "The transaction's Error Status is: ${it.isError} and " + + "transactions's error description is: ${it.errDescription}") + } } } diff --git a/etherscanapi/src/main/java/jfyg/model/TxExecutionStatus.kt b/etherscanapi/src/main/java/jfyg/model/TxExecutionStatus.kt new file mode 100644 index 0000000..3d13f01 --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/model/TxExecutionStatus.kt @@ -0,0 +1,5 @@ +package jfyg.model + +data class TxExecutionStatus(var isError: String? = null, + + var errDescription: String? = null) \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/model/TxReceiptStatus.kt b/etherscanapi/src/main/java/jfyg/model/TxReceiptStatus.kt new file mode 100644 index 0000000..df531ec --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/model/TxReceiptStatus.kt @@ -0,0 +1,3 @@ +package jfyg.model + +data class TxReceiptStatus(var status: String? = null) \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/network/NetworkService.kt b/etherscanapi/src/main/java/jfyg/network/NetworkService.kt index 2680f19..fa8d9df 100644 --- a/etherscanapi/src/main/java/jfyg/network/NetworkService.kt +++ b/etherscanapi/src/main/java/jfyg/network/NetworkService.kt @@ -9,6 +9,8 @@ import jfyg.response.account.AccountTransactionResponse import jfyg.response.contract.SmartContractResponse import jfyg.response.stat.StatPriceResponse import jfyg.response.stat.StatSupplyResponse +import jfyg.response.transaction.TransactionContractExecutionResponse +import jfyg.response.transaction.TransactionContractReceiptResponse import retrofit2.http.GET import retrofit2.http.Query @@ -72,4 +74,16 @@ internal interface NetworkService { @Query("address") address: String?, @Query("apikey") apikey: String?): Single + @GET("api") + fun getContractTransactionExecution(@Query("module") module: String?, + @Query("action") action: String?, + @Query("txhash") address: String?, + @Query("apikey") apikey: String?): Single + + @GET("api") + fun getContractTransactionReceipt(@Query("module") module: String?, + @Query("action") action: String?, + @Query("txhash") address: String?, + @Query("apikey") apikey: String?): Single + } \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/queries/QueryMediator.kt b/etherscanapi/src/main/java/jfyg/queries/QueryMediator.kt index 10a62fe..4b25794 100644 --- a/etherscanapi/src/main/java/jfyg/queries/QueryMediator.kt +++ b/etherscanapi/src/main/java/jfyg/queries/QueryMediator.kt @@ -11,11 +11,14 @@ import jfyg.response.account.AccountTransactionResponse import jfyg.response.contract.SmartContractResponse import jfyg.response.stat.StatPriceResponse import jfyg.response.stat.StatSupplyResponse +import jfyg.response.transaction.TransactionContractExecutionResponse +import jfyg.response.transaction.TransactionContractReceiptResponse /** * A mediator between the responses and errors that come from every query */ -internal class QueryMediator : AccountQueries, StatQueries, SmartContractQueries { +internal class QueryMediator : AccountQueries, StatQueries, SmartContractQueries, TransactionQueries { + override fun accountBalance(module: String?, action: String?, @@ -63,4 +66,14 @@ internal class QueryMediator : AccountQueries, StatQueries, SmartContractQueries action: String): Single = RestClient().getQuery().getStatSupply(module, action, ApiKey.takeOff.callApiKey()) + override fun transactionContractExecutionStatus(module: String?, + action: String?, + txHash: String?): Single = + RestClient().getQuery().getContractTransactionExecution(module, action, txHash, ApiKey.takeOff.callApiKey()) + + override fun transactionContractReceiptStatus(module: String?, + action: String?, + txHash: String?): Single = + RestClient().getQuery().getContractTransactionReceipt(module, action, txHash, ApiKey.takeOff.callApiKey()) + } \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/queries/SmartContractQueries.kt b/etherscanapi/src/main/java/jfyg/queries/SmartContractQueries.kt index 6215456..0691f66 100644 --- a/etherscanapi/src/main/java/jfyg/queries/SmartContractQueries.kt +++ b/etherscanapi/src/main/java/jfyg/queries/SmartContractQueries.kt @@ -1,13 +1,12 @@ package jfyg.queries import io.reactivex.Single -import jfyg.response.account.AccountBalanceResponse import jfyg.response.contract.SmartContractResponse internal interface SmartContractQueries { /** - * Get EBI for a contracts from a given address + * Get ABI for a contracts from a given address */ fun abiContract(module: String?, action: String?, diff --git a/etherscanapi/src/main/java/jfyg/queries/TransactionQueries.kt b/etherscanapi/src/main/java/jfyg/queries/TransactionQueries.kt new file mode 100644 index 0000000..3f49f13 --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/queries/TransactionQueries.kt @@ -0,0 +1,23 @@ +package jfyg.queries + +import io.reactivex.Single +import jfyg.response.transaction.TransactionContractExecutionResponse +import jfyg.response.transaction.TransactionContractReceiptResponse + +internal interface TransactionQueries { + + /** + * Check Contract Execution Status + */ + fun transactionContractExecutionStatus(module: String?, + action: String?, + txHash: String?): Single + /** + * Check Contract Receipt Status + */ + fun transactionContractReceiptStatus(module: String?, + action: String?, + txHash: String?): Single + + +} \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractExecutionResponse.kt b/etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractExecutionResponse.kt new file mode 100644 index 0000000..46d576c --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractExecutionResponse.kt @@ -0,0 +1,9 @@ +package jfyg.response.transaction + +import jfyg.model.TxExecutionStatus +import jfyg.response.BaseResponse + +/** + * Check Contract Execution Status + */ +internal data class TransactionContractExecutionResponse(var result: TxExecutionStatus) : BaseResponse() \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractReceiptResponse.kt b/etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractReceiptResponse.kt new file mode 100644 index 0000000..fec99e7 --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/response/transaction/TransactionContractReceiptResponse.kt @@ -0,0 +1,9 @@ +package jfyg.response.transaction + +import jfyg.model.TxReceiptStatus +import jfyg.response.BaseResponse + +/** + * Check Contract Receipt Status + */ +internal data class TransactionContractReceiptResponse(var result: TxReceiptStatus) : BaseResponse() \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/transaction/TransactionContract.kt b/etherscanapi/src/main/java/jfyg/transaction/TransactionContract.kt new file mode 100644 index 0000000..b33b88b --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/transaction/TransactionContract.kt @@ -0,0 +1,28 @@ +package jfyg.transaction + +import io.reactivex.Single +import jfyg.model.TxExecutionStatus +import jfyg.model.TxReceiptStatus + +interface TransactionContract { + + /** + * Return transaction Execution Status + */ + fun getTransactionExecutionStatus(txHash: String): Single + + /** + * Return transaction Receipt Status + */ + fun getTransactionReceiptStatus(txHash: String): Single + + /** + * Return network status + */ + fun getNetworkStatus(): Single + + /** + * Return network message + */ + fun getNetworkMessage(): Single +} \ No newline at end of file diff --git a/etherscanapi/src/main/java/jfyg/transaction/TransactionContractStatus.kt b/etherscanapi/src/main/java/jfyg/transaction/TransactionContractStatus.kt new file mode 100644 index 0000000..1526973 --- /dev/null +++ b/etherscanapi/src/main/java/jfyg/transaction/TransactionContractStatus.kt @@ -0,0 +1,31 @@ +package jfyg.transaction + +import io.reactivex.Single +import jfyg.model.TxExecutionStatus +import jfyg.model.TxReceiptStatus +import jfyg.queries.QueryMediator + + +class TransactionContractStatus : TransactionContract { + private val query = QueryMediator() + private val genericNetworkQuery = query.transactionContractReceiptStatus("transaction", + "getstatus", + "0x15f8e5ea1079d9a0bb04a4c58ae5fe7654b5b2b4463375ff7ffb490aa0032f3a") + + + override fun getTransactionExecutionStatus(txHash: String): Single = + query.transactionContractExecutionStatus("transaction", + "getstatus", + txHash).map { it.result } + + override fun getTransactionReceiptStatus(txHash: String): Single = + query.transactionContractReceiptStatus("transaction", + "gettxreceiptstatus", + txHash).map { it.result } + + override fun getNetworkStatus(): Single = genericNetworkQuery.map { it.status } + + override fun getNetworkMessage(): Single = genericNetworkQuery.map { it.message } + + +} \ No newline at end of file