From 3166d7127e31a24b44fee481317b99ff5123edc2 Mon Sep 17 00:00:00 2001 From: Ed Rotthoff Date: Fri, 15 Jan 2021 15:28:21 -0700 Subject: [PATCH 1/6] fix issue when multiple tx per block these changes resolve the issue which was the kotlin sdk was throwing an error when there are multiple tx in a block, and getBlock is called. --- .../models/fionetworkprovider/Transaction.kt | 23 +++++++++++++++---- .../fionetworkprovider/actions/Action.kt | 2 +- .../fionetworkprovider/actions/IAction.kt | 5 +++- .../response/GetBlockResponse.kt | 4 +++- .../processors/TransactionProcessor.kt | 4 ++-- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt index 7e9fedb8..08f528f1 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt @@ -1,7 +1,7 @@ package fiofoundation.io.fiosdk.models.fionetworkprovider import com.google.gson.annotations.SerializedName -import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.IAction +import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.Action import java.io.Serializable import java.math.BigInteger @@ -12,6 +12,21 @@ open class Transaction( @SerializedName("max_net_usage_words") var maxNetUsageWords: BigInteger?, @SerializedName("max_cpu_usage_ms") var maxCpuUsageMs: BigInteger?, @SerializedName("delay_sec") var delaySec: BigInteger?, - @SerializedName("context_free_actions") var contextFreeActions: ArrayList?, - @SerializedName("actions") var actions: ArrayList, - @SerializedName("transaction_extensions") var transactionExtensions: ArrayList?):Serializable \ No newline at end of file + @SerializedName("context_free_actions") var contextFreeActions: ArrayList?, + @SerializedName("actions") var actions: ArrayList, + @SerializedName("transaction_extensions") var transactionExtensions: ArrayList?):Serializable + + +public class TxItem( @SerializedName("status") var status: String, + @SerializedName("cpu_usage_us") var cpuUsageUs: BigInteger?, + @SerializedName("net_usage_words") var netUsageWords: BigInteger?, + @SerializedName("trx") var trx: Trx?):Serializable + +public class Trx (@SerializedName("id") var id: String, + @SerializedName("signatures") var signatures: ArrayList?, + @SerializedName("compression") var compression: String, + @SerializedName("packed_context_free_data") var packedContextFreeData: String, + @SerializedName("context_free_data") var contextFreeData: ArrayList?, + @SerializedName("packed_trx") var packedTrx: String, + @SerializedName("transaction") var transaction: Transaction):Serializable + diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt index c5c41661..c100b9ff 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt @@ -9,7 +9,7 @@ open class Action(account: String, name: String,authorization:Authorization,data override var account = account override var name = name override var authorization = ArrayList() - override var data = data + @Transient override var data = data init { diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt index c46605b6..2b5c8203 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt @@ -1,7 +1,9 @@ package fiofoundation.io.fiosdk.models.fionetworkprovider.actions +import com.google.gson.* import fiofoundation.io.fiosdk.models.fionetworkprovider.Authorization import java.io.Serializable +import java.lang.reflect.Type interface IAction: Serializable { @@ -9,4 +11,5 @@ interface IAction: Serializable var name: String var authorization: ArrayList var data: String -} \ No newline at end of file +} + diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/response/GetBlockResponse.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/response/GetBlockResponse.kt index d457ab25..bdc51ef4 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/response/GetBlockResponse.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/response/GetBlockResponse.kt @@ -1,15 +1,17 @@ package fiofoundation.io.fiosdk.models.fionetworkprovider.response import com.google.gson.annotations.SerializedName +import fiofoundation.io.fiosdk.models.fionetworkprovider.TxItem import java.math.BigInteger + class GetBlockResponse: FIOResponse(){ val id: String? = null val producer: String? = null val confirmed: BigInteger? = null val previous: String? = null - val transactions: List? = null + val transactions: List? = null val timestamp: String? = null @SerializedName("action_mroot") diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt index b7f76c15..91a69a66 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt @@ -54,6 +54,7 @@ import fiofoundation.io.fiosdk.errors.session.TransactionCreateSignatureRequestA import fiofoundation.io.fiosdk.errors.abiprovider.GetAbiError import fiofoundation.io.fiosdk.models.FIOName +import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.Action import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.IAction import fiofoundation.io.fiosdk.models.serializationprovider.AbiFIOSerializationObject @@ -314,7 +315,6 @@ open class TransactionProcessor(val serializationProvider: ISerializationProvide private fun serializeTransaction(): String { val clonedTransaction: Transaction? - try { clonedTransaction = this.getDeepClone() @@ -411,7 +411,7 @@ open class TransactionProcessor(val serializationProvider: ISerializationProvide val preparingTransaction = Transaction( "", BigInteger.ZERO, BigInteger.ZERO, BigInteger.ZERO, BigInteger.ZERO, - BigInteger.ZERO, contextFreeActions, actions, ArrayList()) + BigInteger.ZERO, contextFreeActions as ArrayList, actions as ArrayList, ArrayList()) val getInfoResponse: GetInfoResponse From 509d58d8833de6c9b9d3cc404ecb262c2c20a37c Mon Sep 17 00:00:00 2001 From: Ed Rotthoff Date: Mon, 18 Jan 2021 13:19:02 -0700 Subject: [PATCH 2/6] serialize for signing, dont serialize for getblock these changes serialize required fields for signing purposes, and do not serialize action objects for getBlock. --- .../models/fionetworkprovider/Transaction.kt | 21 ++++++++++++++----- .../fionetworkprovider/actions/Action.kt | 2 +- .../processors/TransactionProcessor.kt | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt index 08f528f1..9ce355f0 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/Transaction.kt @@ -1,7 +1,7 @@ package fiofoundation.io.fiosdk.models.fionetworkprovider import com.google.gson.annotations.SerializedName -import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.Action +import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.IAction import java.io.Serializable import java.math.BigInteger @@ -12,11 +12,22 @@ open class Transaction( @SerializedName("max_net_usage_words") var maxNetUsageWords: BigInteger?, @SerializedName("max_cpu_usage_ms") var maxCpuUsageMs: BigInteger?, @SerializedName("delay_sec") var delaySec: BigInteger?, - @SerializedName("context_free_actions") var contextFreeActions: ArrayList?, - @SerializedName("actions") var actions: ArrayList, + @SerializedName("context_free_actions") var contextFreeActions: ArrayList?, + @SerializedName("actions") var actions: ArrayList, @SerializedName("transaction_extensions") var transactionExtensions: ArrayList?):Serializable +class TransactionResp( + @SerializedName("expiration") var expiration: String, + @SerializedName("ref_block_num") var refBlockNum: BigInteger?, + @SerializedName("ref_block_prefix") var refBlockPrefix: BigInteger?, + @SerializedName("max_net_usage_words") var maxNetUsageWords: BigInteger?, + @SerializedName("max_cpu_usage_ms") var maxCpuUsageMs: BigInteger?, + @SerializedName("delay_sec") var delaySec: BigInteger?, + @Transient var contextFreeActions: ArrayList?, + @Transient var actions: ArrayList, + @SerializedName("transaction_extensions") var transactionExtensions: ArrayList?):Serializable + public class TxItem( @SerializedName("status") var status: String, @SerializedName("cpu_usage_us") var cpuUsageUs: BigInteger?, @SerializedName("net_usage_words") var netUsageWords: BigInteger?, @@ -26,7 +37,7 @@ public class Trx (@SerializedName("id") var id: String, @SerializedName("signatures") var signatures: ArrayList?, @SerializedName("compression") var compression: String, @SerializedName("packed_context_free_data") var packedContextFreeData: String, - @SerializedName("context_free_data") var contextFreeData: ArrayList?, + @SerializedName("context_free_data") var contextFreeData: ArrayList?, @SerializedName("packed_trx") var packedTrx: String, - @SerializedName("transaction") var transaction: Transaction):Serializable + @SerializedName("transaction") var transaction: TransactionResp):Serializable diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt index c100b9ff..c5c41661 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/Action.kt @@ -9,7 +9,7 @@ open class Action(account: String, name: String,authorization:Authorization,data override var account = account override var name = name override var authorization = ArrayList() - @Transient override var data = data + override var data = data init { diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt index 91a69a66..23e25cd4 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt @@ -411,7 +411,7 @@ open class TransactionProcessor(val serializationProvider: ISerializationProvide val preparingTransaction = Transaction( "", BigInteger.ZERO, BigInteger.ZERO, BigInteger.ZERO, BigInteger.ZERO, - BigInteger.ZERO, contextFreeActions as ArrayList, actions as ArrayList, ArrayList()) + BigInteger.ZERO, contextFreeActions, actions, ArrayList()) val getInfoResponse: GetInfoResponse From 131fef043c809fe2a6cd5997c01f1b6069653009 Mon Sep 17 00:00:00 2001 From: Ed Rotthoff Date: Mon, 18 Jan 2021 13:38:26 -0700 Subject: [PATCH 3/6] revert changes. un-necessary for PR --- .../io/fiosdk/session/processors/TransactionProcessor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt index 23e25cd4..b7f76c15 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/session/processors/TransactionProcessor.kt @@ -54,7 +54,6 @@ import fiofoundation.io.fiosdk.errors.session.TransactionCreateSignatureRequestA import fiofoundation.io.fiosdk.errors.abiprovider.GetAbiError import fiofoundation.io.fiosdk.models.FIOName -import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.Action import fiofoundation.io.fiosdk.models.fionetworkprovider.actions.IAction import fiofoundation.io.fiosdk.models.serializationprovider.AbiFIOSerializationObject @@ -315,6 +314,7 @@ open class TransactionProcessor(val serializationProvider: ISerializationProvide private fun serializeTransaction(): String { val clonedTransaction: Transaction? + try { clonedTransaction = this.getDeepClone() From 9e1828f297e2932cf2b5cd31e06dec7b039df9e2 Mon Sep 17 00:00:00 2001 From: Ed Rotthoff Date: Mon, 18 Jan 2021 13:41:58 -0700 Subject: [PATCH 4/6] revert changes un-necessary --- .../io/fiosdk/models/fionetworkprovider/actions/IAction.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt index 2b5c8203..a2885489 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt @@ -1,9 +1,7 @@ package fiofoundation.io.fiosdk.models.fionetworkprovider.actions -import com.google.gson.* import fiofoundation.io.fiosdk.models.fionetworkprovider.Authorization import java.io.Serializable -import java.lang.reflect.Type interface IAction: Serializable { @@ -12,4 +10,3 @@ interface IAction: Serializable var authorization: ArrayList var data: String } - From d3390ffb96ddda5812d9e921489c3dba687a5026 Mon Sep 17 00:00:00 2001 From: Ed Rotthoff Date: Mon, 18 Jan 2021 13:44:38 -0700 Subject: [PATCH 5/6] revert un-necessary --- .../io/fiosdk/models/fionetworkprovider/actions/IAction.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt index a2885489..c46605b6 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/models/fionetworkprovider/actions/IAction.kt @@ -9,4 +9,4 @@ interface IAction: Serializable var name: String var authorization: ArrayList var data: String -} +} \ No newline at end of file From c950f389a644b0ec58b76275ae1863e24a974b7a Mon Sep 17 00:00:00 2001 From: Ed Rotthoff Date: Tue, 19 Jan 2021 14:04:16 -0700 Subject: [PATCH 6/6] make getblock accessible on SDK make the getBlock call accessible, also note the test that was used to verify the function. This may be added to tests later but is hard to set up blcoks in the expected configurations to verify, so we verfieid visually. --- .../io/fiokotlinsdktestapp/DevSdkTests.kt | 30 +++++++++++++++++ .../java/fiofoundation/io/fiosdk/FIOSDK.kt | 32 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/app/src/androidTest/java/fiofoundation/io/fiokotlinsdktestapp/DevSdkTests.kt b/app/src/androidTest/java/fiofoundation/io/fiokotlinsdktestapp/DevSdkTests.kt index d0b6aee2..c6b1f18a 100644 --- a/app/src/androidTest/java/fiofoundation/io/fiokotlinsdktestapp/DevSdkTests.kt +++ b/app/src/androidTest/java/fiofoundation/io/fiokotlinsdktestapp/DevSdkTests.kt @@ -73,6 +73,7 @@ class DevSdkTests { this.setupTestVariables() + println("testGenericActions: SUF Conversion Test") Log.i(this.logTag,"testGenericActions: SUF Conversion Test") @@ -482,6 +483,34 @@ class DevSdkTests throw AssertionError("Get Account Call Failed for Alice: " + generalException.message) } +/* + + This test was used to verify the getblock was working properly when + multiple tx are in a block. To test this we performed one off testing + on test net, and visually verified the results, This test was run in isolation. + all other tests were disabled (commented out) + This test is left here in case it is useful for any other purposes later. + println("testGenericActions: Test getBlock") + Log.i(this.logTag,"testGenericActions: Test getBlock") + + try + { + //this block is on test net and has multiple tx inside it. + val response = this.aliceFioSdk!!.getBlock("45844121") + // this gets a normal block. val response = this.aliceFioSdk!!.getBlock("2500") + print ("get block response " + response.toJson()) + } + catch (e: FIOError) + { + throw AssertionError("Get Block Call Failed for Alice: " + e.toJson()) + } + catch (generalException: Exception) + { + throw AssertionError("Get Block Call Failed for Alice: " + generalException.message) + } + +*/ + println("testGenericActions: End Test for Generic Actions") Log.i(this.logTag,"testGenericActions: End Test for Generic Actions") } @@ -1106,6 +1135,7 @@ class DevSdkTests } + } private fun registerFioNameForUser(fioSdk:FIOSDK, fioAddress:String) { diff --git a/fiosdk/src/main/java/fiofoundation/io/fiosdk/FIOSDK.kt b/fiosdk/src/main/java/fiofoundation/io/fiosdk/FIOSDK.kt index 60e35653..527313f7 100644 --- a/fiosdk/src/main/java/fiofoundation/io/fiosdk/FIOSDK.kt +++ b/fiosdk/src/main/java/fiofoundation/io/fiosdk/FIOSDK.kt @@ -1979,6 +1979,38 @@ class FIOSDK(private var privateKey: String, var publicKey: String,var technolog } } + + /** + * Get the block info for the specified block. + * + * @param blocknumorid block number, or id of specific block. + * @return [GetBlockResponse] + * + * @throws [FIOError] + */ + @Throws(FIOError::class) + fun getBlock(blocknumorid:String): GetBlockResponse + { + try + { + if(blocknumorid =="") + throw FIOError("Invalid Block info") + + val request:GetBlockRequest = + GetBlockRequest(blocknumorid) + + return this.networkProvider.getBlock(request) + } + catch(getFeeError: GetFeeError) + { + throw FIOError(getFeeError.message!!,getFeeError) + } + catch(e:Exception) + { + throw FIOError(e.message!!,e) + } + } + /** * Compute and return fee amount for New Funds Request *