Skip to content

Commit 588e70c

Browse files
authored
Merge pull request #658 from cosmostation/feature/APP-main_hyuk_dev
Feature/app main hyuk dev
2 parents 708b79d + 4d3c7a2 commit 588e70c

34 files changed

+230
-72
lines changed

app/src/main/java/wannabit/io/cosmostaion/chain/BaseChain.kt

+6
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ import wannabit.io.cosmostaion.chain.cosmosClass.ChainCoreum
3131
import wannabit.io.cosmostaion.chain.cosmosClass.ChainCosmos
3232
import wannabit.io.cosmostaion.chain.cosmosClass.ChainCryptoorg
3333
import wannabit.io.cosmostaion.chain.cosmosClass.ChainDesmos
34+
import wannabit.io.cosmostaion.chain.cosmosClass.ChainDoravota
3435
import wannabit.io.cosmostaion.chain.cosmosClass.ChainDungeon
3536
import wannabit.io.cosmostaion.chain.cosmosClass.ChainDydx
3637
import wannabit.io.cosmostaion.chain.cosmosClass.ChainFetchAi
3738
import wannabit.io.cosmostaion.chain.cosmosClass.ChainFetchAi60Old
3839
import wannabit.io.cosmostaion.chain.cosmosClass.ChainFetchAi60Secp
3940
import wannabit.io.cosmostaion.chain.cosmosClass.ChainFinschia
41+
import wannabit.io.cosmostaion.chain.cosmosClass.ChainFirma
4042
import wannabit.io.cosmostaion.chain.cosmosClass.ChainGovgen
4143
import wannabit.io.cosmostaion.chain.cosmosClass.ChainGravityBridge
4244
import wannabit.io.cosmostaion.chain.cosmosClass.ChainInjective
@@ -107,6 +109,7 @@ import wannabit.io.cosmostaion.chain.evmClass.ChainDymensionEvm
107109
import wannabit.io.cosmostaion.chain.evmClass.ChainEthereum
108110
import wannabit.io.cosmostaion.chain.evmClass.ChainEvmosEvm
109111
import wannabit.io.cosmostaion.chain.evmClass.ChainFantom
112+
import wannabit.io.cosmostaion.chain.evmClass.ChainHaqqEvm
110113
import wannabit.io.cosmostaion.chain.evmClass.ChainHumansEvm
111114
import wannabit.io.cosmostaion.chain.evmClass.ChainKaia
112115
import wannabit.io.cosmostaion.chain.evmClass.ChainKavaEvm
@@ -585,6 +588,7 @@ fun allChains(): MutableList<BaseChain> {
585588
chains.add(ChainCronos())
586589
chains.add(ChainCryptoorg())
587590
chains.add(ChainDesmos())
591+
// chains.add(ChainDoravota())
588592
chains.add(ChainDungeon())
589593
chains.add(ChainDydx())
590594
chains.add(ChainDymensionEvm())
@@ -595,8 +599,10 @@ fun allChains(): MutableList<BaseChain> {
595599
chains.add(ChainFetchAi60Old())
596600
chains.add(ChainFetchAi60Secp())
597601
chains.add(ChainFinschia())
602+
// chains.add(ChainFirma())
598603
chains.add(ChainGovgen())
599604
chains.add(ChainGravityBridge())
605+
// chains.add(ChainHaqqEvm())
600606
chains.add(ChainHumansEvm())
601607
chains.add(ChainInjective())
602608
chains.add(ChainIris())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package wannabit.io.cosmostaion.chain.cosmosClass
2+
3+
import android.os.Parcelable
4+
import com.google.common.collect.ImmutableList
5+
import kotlinx.parcelize.Parcelize
6+
import org.bitcoinj.crypto.ChildNumber
7+
import wannabit.io.cosmostaion.R
8+
import wannabit.io.cosmostaion.chain.AccountKeyType
9+
import wannabit.io.cosmostaion.chain.BaseChain
10+
import wannabit.io.cosmostaion.chain.CosmosEndPointType
11+
import wannabit.io.cosmostaion.chain.PubKeyType
12+
13+
@Parcelize
14+
class ChainDoravota : BaseChain(), Parcelable {
15+
16+
override var name: String = "Dora vota"
17+
override var tag: String = "Doravota118"
18+
override var logo: Int = R.drawable.chain_doravota
19+
override var apiName: String = "doravota"
20+
21+
override var accountKeyType = AccountKeyType(PubKeyType.COSMOS_SECP256K1, "m/44'/118'/0'/0/X")
22+
override var setParentPath: List<ChildNumber> = ImmutableList.of(
23+
ChildNumber(44, true), ChildNumber(118, true), ChildNumber.ZERO_HARDENED, ChildNumber.ZERO
24+
)
25+
26+
override var cosmosEndPointType: CosmosEndPointType? = CosmosEndPointType.USE_LCD
27+
override var stakeDenom: String = "peaka"
28+
override var accountPrefix: String = "dora"
29+
override var grpcHost: String = "vota-grpc.dorafactory.org"
30+
override var lcdUrl: String = "https://vota-rest.dorafactory.org/"
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package wannabit.io.cosmostaion.chain.cosmosClass
2+
3+
import android.os.Parcelable
4+
import com.google.common.collect.ImmutableList
5+
import kotlinx.parcelize.Parcelize
6+
import org.bitcoinj.crypto.ChildNumber
7+
import wannabit.io.cosmostaion.R
8+
import wannabit.io.cosmostaion.chain.AccountKeyType
9+
import wannabit.io.cosmostaion.chain.BaseChain
10+
import wannabit.io.cosmostaion.chain.CosmosEndPointType
11+
import wannabit.io.cosmostaion.chain.PubKeyType
12+
13+
@Parcelize
14+
class ChainFirma : BaseChain(), Parcelable {
15+
16+
override var name: String = "Firmachain"
17+
override var tag: String = "Firmachain7777777"
18+
override var logo: Int = R.drawable.chain_firmachain
19+
override var apiName: String = "firmachain"
20+
21+
override var accountKeyType = AccountKeyType(PubKeyType.COSMOS_SECP256K1, "m/44'/7777777'/0'/0/X")
22+
override var setParentPath: List<ChildNumber> = ImmutableList.of(
23+
ChildNumber(44, true), ChildNumber(7777777, true), ChildNumber.ZERO_HARDENED, ChildNumber.ZERO
24+
)
25+
26+
override var cosmosEndPointType: CosmosEndPointType? = CosmosEndPointType.USE_LCD
27+
override var stakeDenom: String = "ufct"
28+
override var accountPrefix: String = "firma"
29+
override var grpcHost: String = ""
30+
override var lcdUrl: String = "https://lcd-mainnet.firmachain.dev:1317"
31+
}

app/src/main/java/wannabit/io/cosmostaion/chain/cosmosClass/ChainKi.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import wannabit.io.cosmostaion.chain.PubKeyType
1313
@Parcelize
1414
class ChainKi : BaseChain(), Parcelable {
1515

16-
override var name: String = "Ki Chain"
16+
override var name: String = "KiChain"
1717
override var tag: String = "ki118"
1818
override var logo: Int = R.drawable.chain_ki
1919
override var swipeLogo: Int = R.drawable.chain_swipe_ki

app/src/main/java/wannabit/io/cosmostaion/chain/cosmosClass/ChainOrai.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import wannabit.io.cosmostaion.chain.PubKeyType
1313
@Parcelize
1414
class ChainOrai : BaseChain(), Parcelable {
1515

16-
override var name: String = "Orai Chain"
16+
override var name: String = "OraiChain"
1717
override var tag: String = "orai118"
1818
override var logo: Int = R.drawable.chain_orai
1919
override var apiName: String = "orai-chain"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package wannabit.io.cosmostaion.chain.evmClass
2+
3+
import android.os.Parcelable
4+
import com.google.common.collect.ImmutableList
5+
import kotlinx.parcelize.Parcelize
6+
import org.bitcoinj.crypto.ChildNumber
7+
import wannabit.io.cosmostaion.R
8+
import wannabit.io.cosmostaion.chain.AccountKeyType
9+
import wannabit.io.cosmostaion.chain.BaseChain
10+
import wannabit.io.cosmostaion.chain.CosmosEndPointType
11+
import wannabit.io.cosmostaion.chain.PubKeyType
12+
13+
@Parcelize
14+
class ChainHaqqEvm : BaseChain(), Parcelable {
15+
16+
override var name: String = "Haqq"
17+
override var tag: String = "haqq60"
18+
override var logo: Int = R.drawable.chain_haqq
19+
override var apiName: String = "haqq"
20+
21+
override var accountKeyType = AccountKeyType(PubKeyType.ETH_KECCAK256, "m/44'/60'/0'/0/X")
22+
override var setParentPath: List<ChildNumber> = ImmutableList.of(
23+
ChildNumber(44, true), ChildNumber(60, true), ChildNumber.ZERO_HARDENED, ChildNumber.ZERO
24+
)
25+
26+
override var cosmosEndPointType: CosmosEndPointType? = CosmosEndPointType.USE_LCD
27+
override var stakeDenom: String = "aISLM"
28+
override var accountPrefix: String = "haqq"
29+
override var grpcHost: String = "grpc.haqq.sh"
30+
override var lcdUrl: String = "https://rest.cosmos.haqq.network/"
31+
32+
override var supportEvm: Boolean = true
33+
override var coinSymbol: String = "ISLM"
34+
override var coinGeckoId: String = "islamic-coin"
35+
override var coinLogo: Int = R.drawable.token_islm
36+
override var addressLogo: Int = R.drawable.icon_ethereum_address
37+
override var evmRpcURL: String = "https://rpc.eth.haqq.network"
38+
}

app/src/main/java/wannabit/io/cosmostaion/common/Extensions.kt

+19-2
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ fun gapPastTime(finishTime: Long): String {
547547
} else if (left >= BaseConstant.CONSTANT_M) {
548548
(left / BaseConstant.CONSTANT_M).toString() + " minutes ago"
549549
} else {
550-
gapTime(finishTime)
550+
"-"
551551
}
552552
return result
553553
}
@@ -564,7 +564,16 @@ fun gapTime(finishTime: Long): String {
564564
} else if (left >= BaseConstant.CONSTANT_M) {
565565
(left / BaseConstant.CONSTANT_M).toString() + " minutes left"
566566
} else {
567-
gapPastTime(finishTime)
567+
val after = now - finishTime
568+
if (after >= CONSTANT_D) {
569+
(after / CONSTANT_D).toString() + " days ago"
570+
} else if (after >= BaseConstant.CONSTANT_H) {
571+
(left / BaseConstant.CONSTANT_H).toString() + " hours ago"
572+
} else if (after >= BaseConstant.CONSTANT_M) {
573+
(left / BaseConstant.CONSTANT_M).toString() + " minutes ago"
574+
} else {
575+
"-"
576+
}
568577
}
569578
return result
570579
}
@@ -722,6 +731,14 @@ fun isHexString(value: String): Boolean {
722731
return hexRegex.matches(value)
723732
}
724733

734+
fun String.stripHexPrefix(): String {
735+
return if (this.startsWith("0x")) {
736+
this.substring(2)
737+
} else {
738+
this
739+
}
740+
}
741+
725742
fun Context.dialogResize(dialog: Dialog, width: Float, height: Float) {
726743
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
727744
val marginInDp = 8

app/src/main/java/wannabit/io/cosmostaion/data/model/res/Asset.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,7 @@ data class Asset(
4747
}
4848

4949
fun assetColor(): Int {
50-
color?.let {
51-
return Color.parseColor(it)
52-
} ?: run {
53-
return Color.parseColor("#ffffff")
54-
}
50+
return Color.parseColor("#ffffff")
5551
}
5652
}
5753

app/src/main/java/wannabit/io/cosmostaion/data/model/res/CosmosHistory.kt

+60-32
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import com.cosmos.base.v1beta1.CoinProto
55
import com.google.gson.Gson
66
import com.google.gson.JsonArray
7+
import com.google.gson.JsonElement
78
import com.google.gson.JsonObject
89
import com.squareup.moshi.Json
910
import com.squareup.moshi.JsonClass
@@ -651,30 +652,43 @@ data class CosmosHistory(
651652
} else if (msgType.contains("MsgInstantiateContract")) {
652653
result = c.getString(R.string.tx_cosmwasm_instantiate)
653654
} else if (msgType.contains("MsgExecuteContract")) {
654-
msgValue["msg__@stringify"].asString?.let { wasmMsg ->
655-
val wasmFunc = Gson().fromJson(wasmMsg, JsonObject::class.java)
656-
val recipient = try {
657-
wasmFunc.asJsonObject["transfer"].asJsonObject["recipient"].asString
658-
} catch (e: Exception) {
659-
null
655+
val msgStringify: JsonElement? = msgValue.get("msg__@stringify")
656+
when {
657+
msgStringify == null -> {
658+
result = c.getString(R.string.tx_cosmwasm_execontract)
660659
}
661-
if (recipient != null) {
662-
result = if (recipient.equals(address, true)) {
663-
c.getString(R.string.tx_cosmwasm_token_receive)
664-
} else {
665-
c.getString(R.string.tx_cosmwasm_token_send)
660+
661+
msgStringify.isJsonPrimitive && msgStringify.asJsonPrimitive.isString -> {
662+
val wasmMsg = msgStringify.asString
663+
val wasmFunc = Gson().fromJson(wasmMsg, JsonObject::class.java)
664+
val recipient = try {
665+
wasmFunc.asJsonObject["transfer"].asJsonObject["recipient"].asString
666+
} catch (e: Exception) {
667+
null
666668
}
669+
if (recipient != null) {
670+
result = if (recipient.equals(address, true)) {
671+
c.getString(R.string.tx_cosmwasm_token_receive)
672+
} else {
673+
c.getString(R.string.tx_cosmwasm_token_send)
674+
}
667675

668-
} else {
669-
val description = wasmFunc.entrySet().first().key ?: ""
670-
result = c.getString(R.string.tx_wasm) + "_" + description
671-
result = result.split('_').joinToString(" ") { des ->
672-
des.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
676+
} else {
677+
val description = if (wasmFunc.entrySet().isNotEmpty()) {
678+
wasmFunc.entrySet().first().key
679+
} else {
680+
""
681+
}
682+
result = c.getString(R.string.tx_wasm) + "_" + description
683+
result = result.split('_').joinToString(" ") { des ->
684+
des.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
685+
}
673686
}
674687
}
675688

676-
} ?: run {
677-
result = c.getString(R.string.tx_cosmwasm_execontract)
689+
else -> {
690+
result = c.getString(R.string.tx_cosmwasm_execontract)
691+
}
678692
}
679693
}
680694

@@ -1051,22 +1065,36 @@ data class CosmosHistory(
10511065
val msgValue = firstMsg.asJsonObject[msgType.replace(".", "-")]
10521066

10531067
if (msgType.contains("cosmwasm.") && msgType.contains("MsgExecuteContract")) {
1054-
msgValue.asJsonObject["contract"].asString?.let { contractAddress ->
1055-
val wasmMsg = msgValue.asJsonObject["msg__@stringify"].asString
1056-
val wasmFunc = Gson().fromJson(wasmMsg, JsonObject::class.java)
1057-
val amount = try {
1058-
wasmFunc.asJsonObject["transfer"].asJsonObject["amount"].asString
1059-
} catch (e: Exception) {
1060-
null
1061-
}
1062-
if (amount != null) {
1063-
chain.cosmosFetcher?.tokens?.firstOrNull { it.contract == contractAddress }
1064-
?.let { cw20 ->
1065-
return Pair(cw20, amount.toBigDecimal())
1068+
if (msgValue.asJsonObject["contract"] != null) {
1069+
val contractAddress = msgValue.asJsonObject["contract"].asString
1070+
val msgStringify: JsonElement? =
1071+
msgValue.asJsonObject.get("msg__@stringify")
1072+
when {
1073+
msgStringify?.isJsonPrimitive == true && msgStringify.asJsonPrimitive?.isString == true -> {
1074+
val wasmMsg = msgStringify.asString
1075+
val wasmFunc = Gson().fromJson(wasmMsg, JsonObject::class.java)
1076+
val amount = try {
1077+
wasmFunc.asJsonObject["transfer"].asJsonObject["amount"].asString
1078+
} catch (e: Exception) {
1079+
null
10661080
}
1067-
} else {
1068-
return null
1081+
if (amount != null) {
1082+
chain.cosmosFetcher?.tokens?.firstOrNull { it.contract == contractAddress }
1083+
?.let { cw20 ->
1084+
return Pair(cw20, amount.toBigDecimal())
1085+
}
1086+
} else {
1087+
return null
1088+
}
1089+
}
1090+
1091+
else -> {
1092+
null
1093+
}
10691094
}
1095+
1096+
} else {
1097+
null
10701098
}
10711099

10721100
} else if (msgType.contains("ethermint.evm") && msgType.contains("MsgEthereumTx")) {

app/src/main/java/wannabit/io/cosmostaion/ui/main/chain/cosmos/EcoSystemFragment.kt

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package wannabit.io.cosmostaion.ui.main.chain.cosmos
33
import android.content.Intent
44
import android.os.Build
55
import android.os.Bundle
6+
import android.os.Parcelable
67
import android.view.LayoutInflater
78
import android.view.View
89
import android.view.ViewGroup
@@ -85,6 +86,9 @@ class EcoSystemFragment : Fragment() {
8586

8687
ecoSystemAdapter.setOnItemClickListener {
8788
Intent(requireActivity(), DappActivity::class.java).apply {
89+
if (selectedChain.isSupportErc20()) {
90+
putExtra("selectedEvmChain", selectedChain as Parcelable)
91+
}
8892
putExtra("dapp", it)
8993
startActivity(this)
9094
}

app/src/main/java/wannabit/io/cosmostaion/ui/main/dapp/DappActivity.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,12 @@ class DappActivity : BaseActivity() {
124124
loadAsset()
125125
}
126126

127-
selectEvmChain = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
127+
val ecoChain = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
128128
intent.getParcelableExtra("selectedEvmChain", BaseChain::class.java)
129129
} else {
130130
(intent.getParcelableExtra("selectedEvmChain")) as? BaseChain
131131
}
132+
selectEvmChain = allChains?.firstOrNull { it.name == ecoChain?.name }
132133
}
133134

134135
private fun initAllKeyData(): MutableList<BaseChain> {
@@ -995,7 +996,8 @@ class DappActivity : BaseActivity() {
995996
currentEvmChainId = chainId
996997
selectEvmChain =
997998
allChains?.firstOrNull { it.chainIdEvm == currentEvmChainId }
998-
rpcUrl = selectEvmChain?.evmRpcFetcher?.getEvmRpc() ?: selectEvmChain?.evmRpcURL
999+
rpcUrl = selectEvmChain?.evmRpcFetcher?.getEvmRpc()
1000+
?: selectEvmChain?.evmRpcURL
9991001
web3j = Web3j.build(HttpService(rpcUrl))
10001002
appToWebResult(messageJson, JSONObject.NULL, messageId)
10011003
emitToWeb(chainId)

0 commit comments

Comments
 (0)