Activate the memo functionality in SendTransactionFragment.
The memo encryption was not working properly for two reasons, there is a number called nonce used to encrypt the memo and it has to be positive. The app was sometimes using a negative nonce which caused encryption problems. The second problem was that the nonce was being serialized as an hexadecimal but the node was expecting a decimal so it was not able to convert back the nonce from string to decimal.
This commit is contained in:
parent
98cfbbf90a
commit
33f45a6775
3 changed files with 29 additions and 18 deletions
|
@ -30,6 +30,7 @@ import cy.agorise.graphenej.api.calls.BroadcastTransaction
|
|||
import cy.agorise.graphenej.api.calls.GetAccountByName
|
||||
import cy.agorise.graphenej.api.calls.GetDynamicGlobalProperties
|
||||
import cy.agorise.graphenej.api.calls.GetRequiredFees
|
||||
import cy.agorise.graphenej.crypto.SecureRandomGenerator
|
||||
import cy.agorise.graphenej.models.AccountProperties
|
||||
import cy.agorise.graphenej.models.DynamicGlobalProperties
|
||||
import cy.agorise.graphenej.models.JsonRpcResponse
|
||||
|
@ -49,15 +50,22 @@ import java.util.concurrent.TimeUnit
|
|||
import javax.crypto.AEADBadTagException
|
||||
|
||||
class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHandler {
|
||||
private val TAG = this.javaClass.simpleName
|
||||
|
||||
// Camera Permission
|
||||
private val REQUEST_CAMERA_PERMISSION = 1
|
||||
companion object {
|
||||
private const val TAG = "SendTransactionFragment"
|
||||
|
||||
private val RESPONSE_GET_ACCOUNT_BY_NAME = 1
|
||||
private val RESPONSE_GET_DYNAMIC_GLOBAL_PARAMETERS = 2
|
||||
private val RESPONSE_GET_REQUIRED_FEES = 3
|
||||
private val RESPONSE_BROADCAST_TRANSACTION = 4
|
||||
/** The account used to send the fees */
|
||||
private val FEE_ACCOUNT = UserAccount("1.2.390320", "agorise")
|
||||
|
||||
// Camera Permission
|
||||
private const val REQUEST_CAMERA_PERMISSION = 1
|
||||
|
||||
// Constants used to organize NetworkService requests
|
||||
private const val RESPONSE_GET_ACCOUNT_BY_NAME = 1
|
||||
private const val RESPONSE_GET_DYNAMIC_GLOBAL_PARAMETERS = 2
|
||||
private const val RESPONSE_GET_REQUIRED_FEES = 3
|
||||
private const val RESPONSE_BROADCAST_TRANSACTION = 4
|
||||
}
|
||||
|
||||
private var isCameraPreviewVisible = false
|
||||
private var isToAccountCorrect = false
|
||||
|
@ -350,7 +358,7 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand
|
|||
amount += nextItem.quantity * nextItem.price
|
||||
}
|
||||
// TODO Improve pattern to account for different asset precisions
|
||||
val df = DecimalFormat("####.#####")
|
||||
val df = DecimalFormat("####.########")
|
||||
df.roundingMode = RoundingMode.CEILING
|
||||
df.decimalFormatSymbols = DecimalFormatSymbols(Locale.getDefault())
|
||||
tietAmount.setText(df.format(amount))
|
||||
|
@ -415,15 +423,15 @@ class SendTransactionFragment : ConnectedFragment(), ZXingScannerView.ResultHand
|
|||
val privateKey = ECKey.fromPrivate(DumpedPrivateKey.fromBase58(null, wifKey).key.privKeyBytes)
|
||||
|
||||
// Add memo if exists TODO enable memo
|
||||
// val memoMsg = tietMemo.text.toString()
|
||||
// if (memoMsg.isNotEmpty()) {
|
||||
// val nonce = SecureRandomGenerator.getSecureRandom().nextLong().toBigInteger()
|
||||
// val encryptedMemo = Memo.encryptMessage(privateKey, destinationPublicKey!!, nonce, memoMsg)
|
||||
// val from = Address(ECKey.fromPublicOnly(privateKey.pubKey))
|
||||
// val to = Address(destinationPublicKey!!.key)
|
||||
// val memo = Memo(from, to, nonce, encryptedMemo)
|
||||
// operationBuilder.setMemo(memo)
|
||||
// }
|
||||
val memoMsg = tietMemo.text.toString()
|
||||
if (memoMsg.isNotEmpty()) {
|
||||
val nonce = Math.abs(SecureRandomGenerator.getSecureRandom().nextLong()).toBigInteger()
|
||||
val encryptedMemo = Memo.encryptMessage(privateKey, destinationPublicKey!!, nonce, memoMsg)
|
||||
val from = Address(ECKey.fromPublicOnly(privateKey.pubKey))
|
||||
val to = Address(destinationPublicKey!!.key)
|
||||
val memo = Memo(from, to, nonce, encryptedMemo)
|
||||
operationBuilder.setMemo(memo)
|
||||
}
|
||||
|
||||
val operations = ArrayList<BaseOperation>()
|
||||
operations.add(operationBuilder.build())
|
||||
|
|
|
@ -23,6 +23,9 @@ object Constants {
|
|||
/** The user selected encrypted PIN */
|
||||
const val KEY_ENCRYPTED_PIN = "key_encrypted_pin"
|
||||
|
||||
/** The fee to send in every transfer (0.01%) */
|
||||
const val FEE_PERCENTAGE = 0.0001
|
||||
|
||||
/**
|
||||
* LTM accounts come with an expiration date expressed as this string.
|
||||
* This is used to recognize such accounts from regular ones.
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 13faf6c25369d047037b639f4b838220ace916b3
|
||||
Subproject commit 4c7c7b29b2d403e8f44a2a955e0ba22169d02a48
|
Loading…
Reference in a new issue