├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── menu │ │ │ │ └── menu_main.xml │ │ │ ├── layout │ │ │ │ ├── content_main.xml │ │ │ │ ├── fragment_main.xml │ │ │ │ └── activity_main.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ └── drawable │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── org │ │ │ │ └── nkn │ │ │ │ └── app │ │ │ │ ├── MainActivityFragment.kt │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── org │ │ │ └── nkn │ │ │ └── app │ │ │ └── ExampleUnitTest.kt │ └── androidTest │ │ └── java │ │ └── org │ │ └── nkn │ │ └── app │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── library ├── consumer-rules.pro ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ └── strings.xml │ │ │ └── xml │ │ │ │ └── network_security_config.xml │ │ ├── java │ │ │ └── org │ │ │ │ └── nkn │ │ │ │ └── sdk │ │ │ │ ├── configure │ │ │ │ ├── Rpc.kt │ │ │ │ ├── Configure.kt │ │ │ │ └── Seed.kt │ │ │ │ ├── const │ │ │ │ ├── StatusCode.kt │ │ │ │ └── crypto.kt │ │ │ │ ├── error │ │ │ │ ├── RpcError.kt │ │ │ │ └── WalletError.kt │ │ │ │ ├── cache │ │ │ │ └── memberCache.kt │ │ │ │ ├── crypto │ │ │ │ ├── Account.kt │ │ │ │ ├── encryption.kt │ │ │ │ ├── hash.kt │ │ │ │ └── Key.kt │ │ │ │ ├── ClientListener.kt │ │ │ │ ├── transaction │ │ │ │ ├── transaction.kt │ │ │ │ └── payload.kt │ │ │ │ ├── utils │ │ │ │ ├── EncodeUtils.kt │ │ │ │ ├── Base58.kt │ │ │ │ └── Utils.kt │ │ │ │ ├── network │ │ │ │ ├── RpcApi.kt │ │ │ │ └── WsApi.kt │ │ │ │ ├── protocol │ │ │ │ ├── encryption.kt │ │ │ │ └── protocol.kt │ │ │ │ ├── Client.kt │ │ │ │ ├── Wallet.kt │ │ │ │ └── pb │ │ │ │ └── NodeProto.java │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── org │ │ │ └── nkn │ │ │ └── sdk │ │ │ ├── ExampleUnitTest.kt │ │ │ ├── RpcApiTest.kt │ │ │ ├── WalletTest.kt │ │ │ ├── EncryptionTest.kt │ │ │ ├── HashTest.kt │ │ │ └── UtilsTest.kt │ └── androidTest │ │ └── java │ │ └── org │ │ └── nkn │ │ └── sdk │ │ └── ExampleInstrumentedTest.kt ├── pb │ ├── node.proto │ ├── payloads.proto │ ├── sigchain.proto │ ├── block.proto │ ├── clientmessage.proto │ ├── transaction.proto │ └── nodemessage.proto ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── gradle.properties ├── gradlew.bat ├── README.md └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /library/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':library', ':app' 2 | rootProject.name='nkn-sdk-android' 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 4 | -------------------------------------------------------------------------------- /library/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | library 3 | 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nknorg/nkn-sdk-android/master/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/configure/Rpc.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.configure 2 | 3 | const val RPC_ADDR = "https://mainnet-rpc-node-0001.nkn.org/mainnet/api/wallet" -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | app 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/const/StatusCode.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.const 2 | 3 | enum class StatusCode(val code: Int) { 4 | SUCCESS(0), 5 | WRONG_NODE(48001) 6 | } -------------------------------------------------------------------------------- /library/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | .idea -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Dec 03 14:38:24 CST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip 7 | -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/configure/Configure.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.configure 2 | 3 | const val NKN_ACC_MUL = 100000000 4 | const val ENCRYPT = true 5 | const val MSG_HOLDING_SECONDS = 3600 6 | const val RECONNECT_INTERVAL_MIN = 1000L 7 | const val RECONNECT_INTERVAL_MAX = 64000L 8 | const val RESPONSE_TIMEOUT = 10 9 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/error/RpcError.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.error 2 | 3 | 4 | enum class RpcErrorCode(val code: Int) { 5 | UNKNOWN_ERROR(0) 6 | 7 | } 8 | 9 | class RpcError(val code: RpcErrorCode, override val message: String) : Throwable() { 10 | companion object { 11 | const val UNKNOWN_ERROR = "unknown error" 12 | } 13 | } -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/cache/memberCache.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.cache 2 | 3 | import android.util.LruCache 4 | 5 | const val MULTI_CLIENT_CACHE_SIZE = 4 * 1024 * 1024 6 | const val SHARED_KEY_CACHE_SIZE = 16 * 1024 * 1024 7 | 8 | val multiClientCache = LruCache(MULTI_CLIENT_CACHE_SIZE) 9 | val sharedKeyCache = LruCache(SHARED_KEY_CACHE_SIZE) 10 | -------------------------------------------------------------------------------- /library/src/test/java/org/nkn/sdk/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk 2 | 3 | import org.junit.Test 4 | 5 | 6 | /** 7 | * Example local unit test, which will execute on the development machine (host). 8 | * 9 | * See [testing documentation](http://d.android.com/tools/testing). 10 | */ 11 | class ExampleUnitTest { 12 | @Test 13 | fun addition_isCorrect() { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/const/crypto.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.const 2 | 3 | const val SEED_SIZE: Int = 32 4 | const val SECRET_KEY_SIZE: Int = 64 5 | const val PUBLICKEY_SIZE: Int = 32 6 | const val SHARED_SIZE: Int = 32 7 | const val KEY_SIZE: Int = 32 8 | const val NONCE_SIZE: Int = 24 9 | const val SECRETBOX_NONCE_SIZE: Int = 24 10 | const val SECRET_NONCE_SIZE: Int = 24 11 | const val SIGNATURE_SIZE: Int = 64 12 | 13 | -------------------------------------------------------------------------------- /app/src/test/java/org/nkn/app/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.app 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /library/pb/node.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package pb; 4 | 5 | option java_package = "org.nkn.sdk.pb"; 6 | option java_outer_classname = "NodeProto"; 7 | 8 | enum SyncState { 9 | WAIT_FOR_SYNCING = 0; 10 | SYNC_STARTED = 1; 11 | SYNC_FINISHED = 2; 12 | PERSIST_FINISHED = 3; 13 | } 14 | 15 | message NodeData { 16 | bytes public_key = 1; 17 | uint32 websocket_port = 2; 18 | uint32 json_rpc_port = 3; 19 | uint32 protocol_version = 4; 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /library/src/test/java/org/nkn/sdk/RpcApiTest.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk 2 | 3 | 4 | import org.json.JSONObject 5 | import org.junit.Assert 6 | import org.junit.Test 7 | import org.nkn.sdk.network.RpcApi 8 | import kotlinx.coroutines.* 9 | import kotlin.system.measureTimeMillis 10 | 11 | class RpcApiTest { 12 | @Test 13 | fun rpcApi_test() = runBlocking { 14 | var api = RpcApi() 15 | var res = api.request("getbalancebyaddr", mapOf("address" to "NKNVCZYpUk94xe3p3miNGSoQnkidQUfPMQxx")) 16 | println(res) 17 | 18 | } 19 | } -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/crypto/Account.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk.crypto 2 | 3 | import org.nkn.sdk.utils.Utils 4 | 5 | class Account { 6 | val key: Key 7 | val address: String 8 | val contract: String 9 | val signatureRedeem: String 10 | 11 | constructor(seed: Any? = null) { 12 | key = Key(seed) 13 | address = Utils.programHashStringToAddress(key.programHash) 14 | contract = Utils.genAccountContractString(key.signatureRedeem, key.programHash) 15 | signatureRedeem = key.signatureRedeem 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /library/src/main/java/org/nkn/sdk/ClientListener.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk 2 | 3 | abstract class ClientListener { 4 | abstract fun onConnect() 5 | abstract fun onMessage(src: String, data: String?, pid: ByteArray, type: Int, encrypted: Boolean): Any? 6 | abstract fun onBinaryMessage( 7 | src: String, 8 | data: ByteArray?, 9 | pid: ByteArray, 10 | type: Int, 11 | encrypted: Boolean 12 | ): Any? 13 | abstract fun onClosing() 14 | abstract fun onClosed() 15 | abstract fun onError(e: Throwable) 16 | abstract fun onBlock() 17 | } -------------------------------------------------------------------------------- /library/pb/payloads.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package pb.client; 4 | 5 | option java_package = "org.nkn.sdk.pb"; 6 | option java_outer_classname = "PayloadsProto"; 7 | 8 | enum PayloadType { 9 | BINARY = 0; 10 | TEXT = 1; 11 | ACK = 2; 12 | } 13 | 14 | message Message { 15 | bytes payload = 1; 16 | bool encrypted = 2; 17 | bytes nonce = 3; 18 | bytes encrypted_key = 4; 19 | } 20 | 21 | message Payload { 22 | PayloadType type = 1; 23 | bytes pid = 2; 24 | bytes data = 3; 25 | bytes reply_to_pid = 4; 26 | bool no_ack = 5; 27 | } 28 | 29 | message TextData { 30 | string text = 1; 31 | } 32 | 33 | -------------------------------------------------------------------------------- /library/src/test/java/org/nkn/sdk/WalletTest.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.sdk 2 | 3 | 4 | import android.util.LruCache 5 | import org.json.JSONObject 6 | import org.junit.Assert 7 | import org.junit.Test 8 | import org.nkn.sdk.network.RpcApi 9 | import kotlinx.coroutines.* 10 | import kotlin.system.measureTimeMillis 11 | import org.nkn.sdk.utils.* 12 | import org.nkn.sdk.Wallet 13 | import org.nkn.sdk.Client 14 | import org.nkn.sdk.ClientListener 15 | import org.nkn.sdk.utils.Utils 16 | 17 | class WalletTest { 18 | @Test 19 | fun transfer_test() = runBlocking { 20 | val wallet = Wallet.createRandom() 21 | val client = Client(Utils.hexEncode(wallet.seed), "identifier") 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/main/java/org/nkn/app/MainActivityFragment.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.app 2 | 3 | import androidx.fragment.app.Fragment 4 | import android.os.Bundle 5 | import android.view.LayoutInflater 6 | import android.view.View 7 | import android.view.ViewGroup 8 | import com.google.android.material.snackbar.Snackbar 9 | import kotlinx.android.synthetic.main.fragment_main.* 10 | 11 | /** 12 | * A placeholder fragment containing a simple view. 13 | */ 14 | class MainActivityFragment : Fragment() { 15 | 16 | override fun onCreateView( 17 | inflater: LayoutInflater, container: ViewGroup?, 18 | savedInstanceState: Bundle? 19 | ): View? { 20 | return inflater.inflate(R.layout.fragment_main, container, false) 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/androidTest/java/org/nkn/app/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package org.nkn.app 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("org.nkn.app", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 |