update
This commit is contained in:
parent
9d22007f73
commit
7e9bd0faf1
13
app/AndroidManifest.xml
Executable file → Normal file
13
app/AndroidManifest.xml
Executable file → Normal file
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="games.cebg.metaverse.nft.btc.blockchain.eth.coinbase.binance.FTX.kucoin"
|
||||
package="com.shjc.cebg"
|
||||
android:installLocation="auto">
|
||||
|
||||
<uses-feature android:glEsVersion="0x00020000" />
|
||||
@ -8,8 +8,11 @@
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
@ -20,11 +23,11 @@
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:name="org.cocos2dx.javascript.ExampleApplication">
|
||||
|
||||
|
||||
<!-- Tell Cocos2dxActivity the name of our .so -->
|
||||
<meta-data android:name="android.app.lib_name"
|
||||
android:value="cocos2djs" />
|
||||
|
||||
android:value="cocos2djs" />
|
||||
|
||||
<activity
|
||||
android:name="org.cocos2dx.javascript.AppActivity"
|
||||
android:screenOrientation="sensorLandscape"
|
||||
@ -41,5 +44,5 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
|
||||
</manifest>
|
||||
|
123
app/build.gradle
Executable file → Normal file
123
app/build.gradle
Executable file → Normal file
@ -10,23 +10,15 @@ android {
|
||||
compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
|
||||
buildToolsVersion PROP_BUILD_TOOLS_VERSION
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = '1.8'
|
||||
targetCompatibility = '1.8'
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId "games.cebg.metaverse.nft.btc.blockchain.eth.coinbase.binance.FTX.kucoin"
|
||||
applicationId "com.shjc.cebg"
|
||||
minSdkVersion PROP_MIN_SDK_VERSION
|
||||
targetSdkVersion PROP_TARGET_SDK_VERSION
|
||||
versionCode 3
|
||||
versionName "1.0.2"
|
||||
|
||||
|
||||
multiDexEnabled true
|
||||
ndk{
|
||||
abiFilters 'armeabi-v7a','arm64-v8a', 'x86'
|
||||
abiFilters 'armeabi-v7a','arm64-v8a'
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
@ -35,7 +27,6 @@ android {
|
||||
// skip the NDK Build step if PROP_NDK_MODE is none
|
||||
targets 'cocos2djs'
|
||||
arguments 'NDK_TOOLCHAIN_VERSION=clang'
|
||||
|
||||
def module_paths = [project.file("/Applications/CocosCreator.app/Contents/Resources/cocos2d-x"),
|
||||
project.file("/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos"),
|
||||
project.file("/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/external")]
|
||||
@ -45,7 +36,7 @@ android {
|
||||
else {
|
||||
arguments 'NDK_MODULE_PATH=' + module_paths.join(':')
|
||||
}
|
||||
|
||||
|
||||
arguments '-j' + Runtime.runtime.availableProcessors()
|
||||
abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
|
||||
}
|
||||
@ -83,33 +74,21 @@ android {
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
|
||||
debuggable false
|
||||
jniDebuggable false
|
||||
renderscriptDebuggable false
|
||||
// useProguard true
|
||||
// minifyEnabled true
|
||||
externalNativeBuild {
|
||||
ndkBuild {
|
||||
arguments 'NDK_DEBUG=1'
|
||||
}
|
||||
minifyEnabled true
|
||||
shrinkResources true
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
if (project.hasProperty("RELEASE_STORE_FILE")) {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
|
||||
// debuggable false
|
||||
// jniDebuggable false
|
||||
// renderscriptDebuggable false
|
||||
// minifyEnabled true
|
||||
// shrinkResources true
|
||||
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
// if (project.hasProperty("RELEASE_STORE_FILE")) {
|
||||
// signingConfig signingConfigs.release
|
||||
// }
|
||||
//
|
||||
// externalNativeBuild {
|
||||
// ndkBuild {
|
||||
// arguments 'NDK_DEBUG=0'
|
||||
// }
|
||||
// }
|
||||
externalNativeBuild {
|
||||
ndkBuild {
|
||||
arguments 'NDK_DEBUG=0'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debug {
|
||||
@ -123,8 +102,6 @@ android {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assetPacks = [":install_time_asset_pack"]
|
||||
}
|
||||
|
||||
android.applicationVariants.all { variant ->
|
||||
@ -132,57 +109,43 @@ android.applicationVariants.all { variant ->
|
||||
delete "${buildDir}/intermediates/merged_assets/${variant.dirName}"
|
||||
|
||||
variant.mergeAssets.doLast {
|
||||
def sourceDir = "${buildDir}/../../../jsb-default"
|
||||
def sourceDir = "${buildDir}/../../../../.."
|
||||
|
||||
// copy {
|
||||
// from "${sourceDir}/res"
|
||||
// into "${outputDir}/res"
|
||||
// }
|
||||
copy {
|
||||
from "${sourceDir}/res"
|
||||
into "${outputDir}/res"
|
||||
}
|
||||
|
||||
// copy {
|
||||
// from "${sourceDir}/subpackages"
|
||||
// into "${outputDir}/subpackages"
|
||||
// }
|
||||
copy {
|
||||
from "${sourceDir}/subpackages"
|
||||
into "${outputDir}/subpackages"
|
||||
}
|
||||
|
||||
// copy {
|
||||
// from "${sourceDir}/src"
|
||||
// into "${outputDir}/src"
|
||||
// }
|
||||
copy {
|
||||
from "${sourceDir}/src"
|
||||
into "${outputDir}/src"
|
||||
}
|
||||
|
||||
// copy {
|
||||
// from "${sourceDir}/jsb-adapter"
|
||||
// into "${outputDir}/jsb-adapter"
|
||||
// }
|
||||
copy {
|
||||
from "${sourceDir}/jsb-adapter"
|
||||
into "${outputDir}/jsb-adapter"
|
||||
}
|
||||
|
||||
// copy {
|
||||
// from "${sourceDir}/main.js"
|
||||
// from "${sourceDir}/project.json"
|
||||
// into outputDir
|
||||
// }
|
||||
// copy{
|
||||
// from "${sourceDir}"
|
||||
// include "res/**"
|
||||
// include "src/**"
|
||||
// include "jsb-adapter/**"
|
||||
//
|
||||
// into outputDir
|
||||
// }
|
||||
//
|
||||
// copy {
|
||||
// from "${sourceDir}/main.js"
|
||||
// from "${sourceDir}/project.json"
|
||||
// into outputDir
|
||||
// }
|
||||
copy {
|
||||
from "${sourceDir}/main.js"
|
||||
from "${sourceDir}/project.json"
|
||||
into outputDir
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
|
||||
implementation fileTree(dir: "/Applications/CocosCreator/Creator/2.0.10/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
|
||||
implementation fileTree(dir: "/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/platform/android/java/libs", include: ['*.jar'])
|
||||
implementation project(':libcocos2dx')
|
||||
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
|
||||
|
||||
implementation "org.java-websocket:Java-WebSocket:1.4.0"
|
||||
implementation "org.java-websocket:Java-WebSocket:1.4.0"
|
||||
implementation "com.github.komputing:khex:1.0.0-RC6"
|
||||
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}"
|
||||
@ -196,7 +159,13 @@ dependencies {
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0'
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
|
||||
|
||||
implementation 'com.github.WalletConnect:kotlin-walletconnect-lib:0.9.6'
|
||||
|
||||
implementation 'com.google.android.play:core:1.10.2'
|
||||
|
||||
implementation ('com.github.WalletConnect:kotlin-walletconnect-lib:0.9.6') {
|
||||
exclude group: 'org.bouncycastle', module: '*'
|
||||
}
|
||||
|
||||
implementation "org.bouncycastle:bcprov-jdk15to18:1.68"
|
||||
|
||||
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := cocos2djs
|
||||
LOCAL_MODULE := cocos2djs_shared
|
||||
|
||||
LOCAL_MODULE_FILENAME := libcocos2djs
|
||||
|
||||
@ -11,10 +11,10 @@ LOCAL_ARM_MODE := arm
|
||||
endif
|
||||
|
||||
LOCAL_SRC_FILES := hellojavascript/main.cpp \
|
||||
../../Classes/AppDelegate.cpp \
|
||||
../../Classes/jsb_module_register.cpp \
|
||||
../../../Classes/AppDelegate.cpp \
|
||||
../../../Classes/jsb_module_register.cpp \
|
||||
|
||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
|
||||
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes
|
||||
|
||||
LOCAL_STATIC_LIBRARIES := cocos2dx_static
|
||||
|
||||
|
@ -14,7 +14,7 @@ USE_ARM_MODE := 1
|
||||
# MUST be careful to modify this manually
|
||||
# disable module will speed up compile time, and reduce package size
|
||||
USE_GFX_RENDERER := 0
|
||||
USE_VIDEO := 1
|
||||
USE_VIDEO := 0
|
||||
USE_WEB_VIEW := 0
|
||||
USE_AUDIO := 1
|
||||
USE_SOCKET := 1
|
||||
|
1
app/proguard-rules.pro
vendored
Executable file → Normal file
1
app/proguard-rules.pro
vendored
Executable file → Normal file
@ -36,7 +36,6 @@
|
||||
-keep public class com.anysdk.** { *; }
|
||||
-dontwarn com.anysdk.**
|
||||
|
||||
|
||||
-keep class com.youme.**{*;}
|
||||
-keepattributes Signature
|
||||
|
||||
|
250
app/src/org/cocos2dx/javascript/wc/JMoshiPayloadAdapter.kt
Normal file
250
app/src/org/cocos2dx/javascript/wc/JMoshiPayloadAdapter.kt
Normal file
@ -0,0 +1,250 @@
|
||||
package org.cocos2dx.javascript.wc
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.Types
|
||||
import org.bouncycastle.crypto.digests.SHA256Digest
|
||||
import org.bouncycastle.crypto.engines.AESEngine
|
||||
import org.bouncycastle.crypto.macs.HMac
|
||||
import org.bouncycastle.crypto.modes.CBCBlockCipher
|
||||
import org.bouncycastle.crypto.paddings.PKCS7Padding
|
||||
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
|
||||
import org.bouncycastle.crypto.params.KeyParameter
|
||||
import org.bouncycastle.crypto.params.ParametersWithIV
|
||||
import org.komputing.khex.decode
|
||||
import org.komputing.khex.extensions.toNoPrefixHexString
|
||||
import org.walletconnect.Session
|
||||
import org.walletconnect.types.*
|
||||
import java.security.SecureRandom
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
class JMoshiPayloadAdapter(moshi: Moshi) : Session.PayloadAdapter {
|
||||
|
||||
private val payloadAdapter = moshi.adapter(EncryptedPayload::class.java)
|
||||
private val mapAdapter = moshi.adapter<Map<String, Any?>>(
|
||||
Types.newParameterizedType(
|
||||
Map::class.java,
|
||||
String::class.java,
|
||||
Any::class.java
|
||||
)
|
||||
)
|
||||
|
||||
private val requests: MutableMap<Long, Session.MethodCall> = ConcurrentHashMap()
|
||||
|
||||
private fun createRandomBytes(i: Int) = ByteArray(i).also { SecureRandom().nextBytes(it) }
|
||||
|
||||
override fun parse(payload: String, key: String): Session.MethodCall {
|
||||
val encryptedPayload = payloadAdapter.fromJson(payload) ?: throw IllegalArgumentException("Invalid json payload!")
|
||||
|
||||
// TODO verify hmac
|
||||
|
||||
val padding = PKCS7Padding()
|
||||
val aes = PaddedBufferedBlockCipher(
|
||||
CBCBlockCipher(AESEngine()),
|
||||
padding
|
||||
)
|
||||
val ivAndKey = ParametersWithIV(
|
||||
KeyParameter(decode(key)),
|
||||
decode(encryptedPayload.iv)
|
||||
)
|
||||
aes.init(false, ivAndKey)
|
||||
|
||||
val encryptedData = decode(encryptedPayload.data)
|
||||
val minSize = aes.getOutputSize(encryptedData.size)
|
||||
val outBuf = ByteArray(minSize)
|
||||
var len = aes.processBytes(encryptedData, 0, encryptedData.size, outBuf, 0)
|
||||
len += aes.doFinal(outBuf, len)
|
||||
|
||||
return outBuf.copyOf(len).toMethodCall()
|
||||
}
|
||||
|
||||
override fun prepare(data: Session.MethodCall, key: String): String {
|
||||
val bytesData = data.toBytes()
|
||||
val hexKey = decode(key)
|
||||
val iv = createRandomBytes(16)
|
||||
|
||||
val padding = PKCS7Padding()
|
||||
val aes = PaddedBufferedBlockCipher(
|
||||
CBCBlockCipher(AESEngine()),
|
||||
padding
|
||||
)
|
||||
aes.init(true, ParametersWithIV(KeyParameter(hexKey), iv))
|
||||
|
||||
val minSize = aes.getOutputSize(bytesData.size)
|
||||
val outBuf = ByteArray(minSize)
|
||||
val length1 = aes.processBytes(bytesData, 0, bytesData.size, outBuf, 0)
|
||||
aes.doFinal(outBuf, length1)
|
||||
|
||||
|
||||
val hmac = HMac(SHA256Digest())
|
||||
hmac.init(KeyParameter(hexKey))
|
||||
|
||||
val hmacResult = ByteArray(hmac.macSize)
|
||||
hmac.update(outBuf, 0, outBuf.size)
|
||||
hmac.update(iv, 0, iv.size)
|
||||
hmac.doFinal(hmacResult, 0)
|
||||
requests[data.id()] = data
|
||||
return payloadAdapter.toJson(
|
||||
EncryptedPayload(
|
||||
outBuf.toNoPrefixHexString(),
|
||||
hmac = hmacResult.toNoPrefixHexString(),
|
||||
iv = iv.toNoPrefixHexString()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert FROM request bytes
|
||||
*/
|
||||
private fun ByteArray.toMethodCall(): Session.MethodCall =
|
||||
String(this).let { json ->
|
||||
mapAdapter.fromJson(json)?.let {
|
||||
try {
|
||||
var method = it["method"]
|
||||
when (method) {
|
||||
"wc_sessionRequest" -> it.toSessionRequest()
|
||||
"wc_sessionUpdate" -> it.toSessionUpdate()
|
||||
"eth_sendTransaction" -> it.toSendTransaction()
|
||||
"eth_sign" -> it.toSignMessage()
|
||||
null -> it.toResponse()
|
||||
else -> it.toCustom()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
throw Session.MethodCallException.InvalidRequest(it.getId(), "$json (${e.message ?: "Unknown error"})")
|
||||
}
|
||||
} ?: throw IllegalArgumentException("Invalid json")
|
||||
}
|
||||
|
||||
private fun Map<String, *>.toSessionUpdate(): Session.MethodCall.SessionUpdate {
|
||||
val params = this["params"] as? List<*> ?: throw IllegalArgumentException("params missing")
|
||||
val data = params.firstOrNull() as? Map<String, *> ?: throw IllegalArgumentException("Invalid params")
|
||||
return Session.MethodCall.SessionUpdate(
|
||||
getId(),
|
||||
data.extractSessionParams()
|
||||
)
|
||||
}
|
||||
|
||||
private fun Map<String, *>.toSendTransaction(): Session.MethodCall.SendTransaction {
|
||||
val params = this["params"] as? List<*> ?: throw IllegalArgumentException("params missing")
|
||||
val data = params.firstOrNull() as? Map<*, *> ?: throw IllegalArgumentException("Invalid params")
|
||||
val from = data["from"] as? String ?: throw IllegalArgumentException("from key missing")
|
||||
val to = data["to"] as? String ?: throw IllegalArgumentException("to key missing")
|
||||
val nonce = data["nonce"] as? String ?: (data["nonce"] as? Double)?.toLong()?.toString()
|
||||
val gasPrice = data["gasPrice"] as? String
|
||||
val gasLimit = data["gasLimit"] as? String
|
||||
val value = data["value"] as? String ?: "0x0"
|
||||
val txData = data["data"] as? String ?: throw IllegalArgumentException("data key missing")
|
||||
return Session.MethodCall.SendTransaction(getId(), from, to, nonce, gasPrice, gasLimit, value, txData)
|
||||
}
|
||||
|
||||
private fun Map<String, *>.toSignMessage(): Session.MethodCall.SignMessage {
|
||||
val params = this["params"] as? List<*> ?: throw IllegalArgumentException("params missing")
|
||||
val address = params.getOrNull(0) as? String ?: throw IllegalArgumentException("Missing address")
|
||||
val message = params.getOrNull(1) as? String ?: throw IllegalArgumentException("Missing message")
|
||||
return Session.MethodCall.SignMessage(getId(), address, message)
|
||||
}
|
||||
|
||||
private fun Map<String, *>.toCustom(): Session.MethodCall.Custom {
|
||||
val method = this["method"] as? String ?: throw IllegalArgumentException("method missing")
|
||||
val params = this["params"] as? List<*>
|
||||
return Session.MethodCall.Custom(getId(), method, params)
|
||||
}
|
||||
|
||||
private fun Map<String, *>.toResponse(): Session.MethodCall.Response {
|
||||
var result = this["result"]
|
||||
val error = this["error"] as? Map<*, *>
|
||||
if (result == null && error == null) {
|
||||
var hasErr = true
|
||||
if (requests[getId()] != null) {
|
||||
when (val localData: Session.MethodCall? = requests[getId()]) {
|
||||
is Session.MethodCall.Custom -> {
|
||||
if (localData.method == "wallet_switchEthereumChain" || localData.method == "wallet_addEthereumChain") {
|
||||
hasErr = false
|
||||
result = "success"
|
||||
}
|
||||
}
|
||||
}
|
||||
requests.remove(getId())
|
||||
}
|
||||
if (hasErr) {
|
||||
throw IllegalArgumentException("no result or error")
|
||||
}
|
||||
}
|
||||
return Session.MethodCall.Response(
|
||||
getId(),
|
||||
result,
|
||||
error?.extractError()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert INTO request bytes
|
||||
*/
|
||||
private fun Session.MethodCall.toBytes() =
|
||||
mapAdapter.toJson(
|
||||
when (this) {
|
||||
is Session.MethodCall.SessionRequest -> this.toMap()
|
||||
is Session.MethodCall.Response -> this.toMap()
|
||||
is Session.MethodCall.SessionUpdate -> this.toMap()
|
||||
is Session.MethodCall.SendTransaction -> this.toMap()
|
||||
is Session.MethodCall.SignMessage -> this.toMap()
|
||||
is Session.MethodCall.Custom -> this.toMap()
|
||||
}
|
||||
).toByteArray()
|
||||
|
||||
private fun Session.MethodCall.SessionRequest.toMap() =
|
||||
jsonRpc(id, "wc_sessionRequest", peer.intoMap())
|
||||
|
||||
private fun Session.MethodCall.SessionUpdate.toMap() =
|
||||
jsonRpc(id, "wc_sessionUpdate", params.intoMap())
|
||||
|
||||
private fun Session.MethodCall.SendTransaction.toMap() =
|
||||
jsonRpc(
|
||||
id, "eth_sendTransaction", mapOf(
|
||||
"from" to from,
|
||||
"to" to to,
|
||||
"nonce" to nonce,
|
||||
"gasPrice" to gasPrice,
|
||||
"gasLimit" to gasLimit,
|
||||
"value" to value,
|
||||
"data" to data
|
||||
)
|
||||
)
|
||||
|
||||
private fun Session.MethodCall.SignMessage.toMap() =
|
||||
jsonRpc(
|
||||
id, "eth_sign", address, message
|
||||
)
|
||||
|
||||
private fun Session.MethodCall.Response.toMap() =
|
||||
mutableMapOf<String, Any>(
|
||||
"id" to id,
|
||||
"jsonrpc" to "2.0"
|
||||
).apply {
|
||||
result?.let { this["result"] = result!! }
|
||||
error?.let { this["error"] = error!!.intoMap() }
|
||||
}
|
||||
|
||||
private fun Session.MethodCall.Custom.toMap() =
|
||||
jsonRpcWithList(
|
||||
id, method, params ?: emptyList<Any>()
|
||||
)
|
||||
|
||||
private fun jsonRpc(id: Long, method: String, vararg params: Any) =
|
||||
jsonRpcWithList(id, method, params.asList())
|
||||
|
||||
private fun jsonRpcWithList(id: Long, method: String, params: List<*>) =
|
||||
mapOf(
|
||||
"id" to id,
|
||||
"jsonrpc" to "2.0",
|
||||
"method" to method,
|
||||
"params" to params
|
||||
)
|
||||
|
||||
// TODO: @JsonClass(generateAdapter = true)
|
||||
data class EncryptedPayload(
|
||||
@Json(name = "data") val data: String,
|
||||
@Json(name = "iv") val iv: String,
|
||||
@Json(name = "hmac") val hmac: String
|
||||
)
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package org.cocos2dx.javascript.wc
|
||||
|
||||
import android.util.Log
|
||||
import org.walletconnect.Session
|
||||
import org.walletconnect.impls.WCSessionStore
|
||||
import org.walletconnect.nullOnThrow
|
||||
import org.walletconnect.types.extractSessionParams
|
||||
import org.walletconnect.types.intoMap
|
||||
import java.util.*
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
@ -108,8 +108,7 @@ class JWCSession(
|
||||
peerId = params.peerData?.id
|
||||
peerMeta = params.peerData?.meta
|
||||
approvedAccounts = params.accounts
|
||||
// chainId = params.chainId
|
||||
chainId = ((resp.result as Map<*, *>).get("chainId") as Double).toLong()
|
||||
chainId = params.chainId
|
||||
storeSession()
|
||||
propagateToCallbacks { onStatus(if (params.approved) Session.Status.Approved else Session.Status.Closed) }
|
||||
}
|
||||
@ -193,6 +192,7 @@ class JWCSession(
|
||||
}
|
||||
}
|
||||
var accountToCheck: String? = null
|
||||
Log.i("JWCSession", "handle msg: $data")
|
||||
when (data) {
|
||||
is Session.MethodCall.SessionRequest -> {
|
||||
handshakeId = data.id
|
||||
@ -203,6 +203,8 @@ class JWCSession(
|
||||
is Session.MethodCall.SessionUpdate -> {
|
||||
if (!data.params.approved) {
|
||||
endSession()
|
||||
} else {
|
||||
chainId = data.params.chainId
|
||||
}
|
||||
// TODO handle session update -> not important for our usecase
|
||||
}
|
||||
@ -269,6 +271,7 @@ class JWCSession(
|
||||
): Boolean {
|
||||
topic ?: return false
|
||||
|
||||
Log.i("JWCSession", "sendMsg: $msg.id()")
|
||||
val payload: String
|
||||
synchronized(keyLock) {
|
||||
payload = payloadAdapter.prepare(msg, encryptionKey)
|
||||
|
15
app/src/org/cocos2dx/javascript/wc/TypeMapConversion.kt
Normal file
15
app/src/org/cocos2dx/javascript/wc/TypeMapConversion.kt
Normal file
@ -0,0 +1,15 @@
|
||||
package org.cocos2dx.javascript.wc
|
||||
|
||||
import org.walletconnect.Session
|
||||
import org.walletconnect.nullOnThrow
|
||||
import org.walletconnect.types.extractPeerData
|
||||
import org.walletconnect.types.toStringList
|
||||
|
||||
|
||||
fun Map<String, *>.extractSessionParams(): Session.SessionParams {
|
||||
val approved = this["approved"] as? Boolean ?: throw IllegalArgumentException("approved missing")
|
||||
val chainId = (this["chainId"] as? Double)?.toLong()
|
||||
val accounts = nullOnThrow { (this["accounts"] as? List<*>)?.toStringList() }
|
||||
|
||||
return Session.SessionParams(approved, chainId, accounts, nullOnThrow { this.extractPeerData() })
|
||||
}
|
44
app/src/org/cocos2dx/javascript/wc/entity/CallResult.java
Normal file
44
app/src/org/cocos2dx/javascript/wc/entity/CallResult.java
Normal file
@ -0,0 +1,44 @@
|
||||
package org.cocos2dx.javascript.wc.entity;
|
||||
|
||||
public class CallResult {
|
||||
private String type;
|
||||
private long errCode;
|
||||
private String errMsg;
|
||||
private String data;
|
||||
|
||||
public CallResult(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public long getErrCode() {
|
||||
return errCode;
|
||||
}
|
||||
|
||||
public void setErrCode(long errCode) {
|
||||
this.errCode = errCode;
|
||||
}
|
||||
|
||||
public String getErrMsg() {
|
||||
return errMsg;
|
||||
}
|
||||
|
||||
public void setErrMsg(String errMsg) {
|
||||
this.errMsg = errMsg;
|
||||
}
|
||||
|
||||
public String getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(String data) {
|
||||
this.data = data;
|
||||
}
|
||||
}
|
49
app/src/org/cocos2dx/javascript/wc/entity/ChainObj.java
Normal file
49
app/src/org/cocos2dx/javascript/wc/entity/ChainObj.java
Normal file
@ -0,0 +1,49 @@
|
||||
package org.cocos2dx.javascript.wc.entity;
|
||||
|
||||
public class ChainObj {
|
||||
private String chainId;
|
||||
private String chainName;
|
||||
private String[] blockExplorerUrls;
|
||||
private String[] rpcUrls;
|
||||
private CurrencyObj nativeCurrency;
|
||||
|
||||
public String getChainId() {
|
||||
return chainId;
|
||||
}
|
||||
|
||||
public void setChainId(String chainId) {
|
||||
this.chainId = chainId;
|
||||
}
|
||||
|
||||
public String getChainName() {
|
||||
return chainName;
|
||||
}
|
||||
|
||||
public void setChainName(String chainName) {
|
||||
this.chainName = chainName;
|
||||
}
|
||||
|
||||
public String[] getBlockExplorerUrls() {
|
||||
return blockExplorerUrls;
|
||||
}
|
||||
|
||||
public void setBlockExplorerUrls(String[] blockExplorerUrls) {
|
||||
this.blockExplorerUrls = blockExplorerUrls;
|
||||
}
|
||||
|
||||
public String[] getRpcUrls() {
|
||||
return rpcUrls;
|
||||
}
|
||||
|
||||
public void setRpcUrls(String[] rpcUrls) {
|
||||
this.rpcUrls = rpcUrls;
|
||||
}
|
||||
|
||||
public CurrencyObj getNativeCurrency() {
|
||||
return nativeCurrency;
|
||||
}
|
||||
|
||||
public void setNativeCurrency(CurrencyObj nativeCurrency) {
|
||||
this.nativeCurrency = nativeCurrency;
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package org.cocos2dx.javascript.wc.entity;
|
||||
|
||||
public class ChangeChainObj {
|
||||
private String chainId;
|
||||
|
||||
public String getChainId() {
|
||||
return chainId;
|
||||
}
|
||||
|
||||
public void setChainId(String chainId) {
|
||||
this.chainId = chainId;
|
||||
}
|
||||
}
|
31
app/src/org/cocos2dx/javascript/wc/entity/CurrencyObj.java
Normal file
31
app/src/org/cocos2dx/javascript/wc/entity/CurrencyObj.java
Normal file
@ -0,0 +1,31 @@
|
||||
package org.cocos2dx.javascript.wc.entity;
|
||||
|
||||
public class CurrencyObj {
|
||||
private String name;
|
||||
private String symbol;
|
||||
private long decimals;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getSymbol() {
|
||||
return symbol;
|
||||
}
|
||||
|
||||
public void setSymbol(String symbol) {
|
||||
this.symbol = symbol;
|
||||
}
|
||||
|
||||
public long getDecimals() {
|
||||
return decimals;
|
||||
}
|
||||
|
||||
public void setDecimals(long decimals) {
|
||||
this.decimals = decimals;
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
{
|
||||
"ndk_module_path" :[
|
||||
"/Applications/CocosCreator/Creator/2.0.10/CocosCreator.app/Contents/Resources/cocos2d-x",
|
||||
"/Applications/CocosCreator/Creator/2.0.10/CocosCreator.app/Contents/Resources/cocos2d-x/cocos",
|
||||
"/Applications/CocosCreator/Creator/2.0.10/CocosCreator.app/Contents/Resources/cocos2d-x/external"
|
||||
"/Applications/CocosCreator.app/Contents/Resources/cocos2d-x",
|
||||
"/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos",
|
||||
"/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/external"
|
||||
],
|
||||
"copy_resources": []
|
||||
}
|
||||
|
2
build.gradle
Executable file → Normal file
2
build.gradle
Executable file → Normal file
@ -37,7 +37,7 @@ buildscript {
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.1.3'
|
||||
classpath 'com.android.tools.build:gradle:3.2.0'
|
||||
|
||||
classpath 'com.github.ben-manes:gradle-versions-plugin:+'
|
||||
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
|
||||
|
@ -21,25 +21,22 @@
|
||||
PROP_COMPILE_SDK_VERSION=30
|
||||
|
||||
# Android SDK version that will be used as the earliest version of android this application can run on
|
||||
PROP_MIN_SDK_VERSION=23
|
||||
PROP_MIN_SDK_VERSION=16
|
||||
|
||||
# Android SDK version that will be used as the latest version of android this application has been tested on
|
||||
PROP_TARGET_SDK_VERSION=30
|
||||
|
||||
# Android Build Tools version that will be used as the compile project
|
||||
PROP_BUILD_TOOLS_VERSION=30.0.2
|
||||
PROP_BUILD_TOOLS_VERSION=28.0.3
|
||||
|
||||
# List of CPU Archtexture to build that application with
|
||||
# Available architextures (armeabi-v7a | arm64-v8a | x86)
|
||||
# To build for multiple architexture, use the `:` between them
|
||||
# Example - PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86
|
||||
PROP_APP_ABI=armeabi-v7a:arm64-v8a:x86
|
||||
# Example - PROP_APP_ABI=armeabi-v7a:arm64-v8a
|
||||
PROP_APP_ABI=armeabi-v7a:arm64-v8a
|
||||
|
||||
# fill in sign information for release mode
|
||||
RELEASE_STORE_FILE=/Applications/CocosCreator.app/Contents/Resources/static/build-templates/native/debug.keystore
|
||||
RELEASE_STORE_PASSWORD=123456
|
||||
RELEASE_KEY_ALIAS=debug_keystore
|
||||
RELEASE_KEY_PASSWORD=123456
|
||||
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
6
gradle/wrapper/gradle-wrapper.properties
vendored
6
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
||||
#Wed Mar 30 17:25:47 CST 2022
|
||||
#Sat May 28 21:47:53 CST 2022
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.3-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
@ -1,5 +1,4 @@
|
||||
include ':libcocos2dx'
|
||||
project(':libcocos2dx').projectDir = new File('/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/platform/android/libcocos2dx')
|
||||
include ':install_time_asset_pack'
|
||||
include ':TestChain'
|
||||
project(':TestChain').projectDir = new File(settingsDir, 'app')
|
||||
include ':CEBG'
|
||||
project(':CEBG').projectDir = new File(settingsDir, 'app')
|
||||
|
Loading…
x
Reference in New Issue
Block a user