support EIP-712 tx

This commit is contained in:
Michele Balistreri 2020-10-12 14:45:41 +02:00 committed by Ksenia Balistreri
parent 2de8b5caf2
commit e477d8c217
3 changed files with 22 additions and 4 deletions

View File

@ -14,6 +14,7 @@ At the moment all dApps tested worked fine. The implemented functions are:
* eth_sendRawTransaction * eth_sendRawTransaction
* eth_signTransaction * eth_signTransaction
* eth_sign * eth_sign
* eth_signTypedData
* personal_sign * personal_sign
### Seed management ### Seed management
@ -36,7 +37,6 @@ At the moment all dApps tested worked fine. The implemented functions are:
* allow switching account (BIP32 path) on card and used network (for WalletConnect) * allow switching account (BIP32 path) on card and used network (for WalletConnect)
## What needs to be done for 1.0 ## What needs to be done for 1.0
* implement signedTypedData (WalletConnect integration)
* design and implement a user-friendly UI * design and implement a user-friendly UI
## Future plans (after 1.0) ## Future plans (after 1.0)

View File

@ -68,6 +68,8 @@ dependencies {
implementation "com.github.komputing.kethereum:extensions_kotlin:$kethereum_version" implementation "com.github.komputing.kethereum:extensions_kotlin:$kethereum_version"
implementation "com.github.komputing.kethereum:keccak_shortcut:$kethereum_version" implementation "com.github.komputing.kethereum:keccak_shortcut:$kethereum_version"
implementation 'com.github.komputing:khex:1.0.0' implementation 'com.github.komputing:khex:1.0.0'
implementation 'com.github.gnosis.svalinn-kotlin:eip712-adapter-moshi:v0.13.0'
implementation 'com.github.gnosis.svalinn-kotlin:eip712:v0.13.0'
testImplementation 'junit:junit:4.13' testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

View File

@ -39,7 +39,11 @@ import org.walletconnect.impls.FileWCSessionStore
import org.walletconnect.impls.MoshiPayloadAdapter import org.walletconnect.impls.MoshiPayloadAdapter
import org.walletconnect.impls.OkHttpTransport import org.walletconnect.impls.OkHttpTransport
import org.walletconnect.impls.WCSession import org.walletconnect.impls.WCSession
import pm.gnosis.eip712.EIP712JsonParser
import pm.gnosis.eip712.adapters.moshi.MoshiAdapter
import pm.gnosis.eip712.typedDataHash
import java.io.File import java.io.File
import kotlin.reflect.typeOf
class WalletConnect(var bip32Path: String, var chainID: Long) : ExportKeyCommand.Listener, SignCommand.Listener, Session.Callback { class WalletConnect(var bip32Path: String, var chainID: Long) : ExportKeyCommand.Listener, SignCommand.Listener, Session.Callback {
@ -91,7 +95,7 @@ class WalletConnect(var bip32Path: String, var chainID: Long) : ExportKeyCommand
private fun onCustomCall(call: Session.MethodCall.Custom) { private fun onCustomCall(call: Session.MethodCall.Custom) {
when(call.method) { when(call.method) {
"personal_sign" -> runOnValidParam<String>(call, 0) { signText(call.id, it) } "personal_sign" -> runOnValidParam<String>(call, 0) { signText(call.id, it) }
"eth_signTypedData" -> { runOnValidParam<Map<*, *>>(call, 1) { @Suppress("UNCHECKED_CAST") signTypedData(call.id, it as Map<String, String>) } } "eth_signTypedData" -> { runOnValidParam<String>(call, 1) { @Suppress("UNCHECKED_CAST") signTypedData(call.id, it) } }
"eth_signTransaction" -> { runOnValidParam<Map<*, *>>(call, 0) { signTransaction(call.id, toTransaction(toSendTransaction(call.id, it)), false)} } "eth_signTransaction" -> { runOnValidParam<Map<*, *>>(call, 0) { signTransaction(call.id, toTransaction(toSendTransaction(call.id, it)), false)} }
"eth_sendRawTransaction" -> { runOnValidParam<String>(call, 0) { relayTX(call.id, it) } } "eth_sendRawTransaction" -> { runOnValidParam<String>(call, 0) { relayTX(call.id, it) } }
else -> session?.rejectRequest(call.id, 1L, "Not implemented") else -> session?.rejectRequest(call.id, 1L, "Not implemented")
@ -140,9 +144,21 @@ class WalletConnect(var bip32Path: String, var chainID: Long) : ExportKeyCommand
Registry.mainActivity.startActivityForResult(intent, REQ_WALLETCONNECT) Registry.mainActivity.startActivityForResult(intent, REQ_WALLETCONNECT)
} }
private fun signTypedData(id: Long, message: Map<String, String>) { private fun signTypedData(id: Long, message: String) {
requestId = id requestId = id
session?.rejectRequest(id, 1L, "Not implemented yet") uiAction = {
val domainWithMessage = EIP712JsonParser(MoshiAdapter()).parseMessage(message)
val hash = typedDataHash(domainWithMessage.message, domainWithMessage.domain)
Registry.scriptExecutor.runScript(scriptWithAuthentication().plus(SignCommand(Registry.walletConnect, hash)))
}
signAction = { session?.approveRequest(requestId, "0x${it.r.toNoPrefixHexString()}${it.s.toNoPrefixHexString()}${encode((it.recId + 27).toByte())}") }
val intent = Intent(Registry.mainActivity, SignMessageActivity::class.java).apply {
putExtra(SIGN_TEXT_MESSAGE, message)
}
Registry.mainActivity.startActivityForResult(intent, REQ_WALLETCONNECT)
} }
private fun signTransaction(id: Long, tx: Transaction, send: Boolean) { private fun signTransaction(id: Long, tx: Transaction, send: Boolean) {