Skip to content

Commit

Permalink
Feature/custom chain dapps (#586)
Browse files Browse the repository at this point in the history
* custom chain dapps

* [APP] support custom chain dapp

* [APP] support custom chain dapp

---------

Co-authored-by: soaryong-stamper <[email protected]>
  • Loading branch information
Kwonhyukjoon and soaryong-c authored Jul 7, 2023
1 parent 313e512 commit cffda90
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,7 @@ import android.util.Log
import android.view.MenuItem
import android.view.MotionEvent
import android.view.View
import android.webkit.JavascriptInterface
import android.webkit.JsResult
import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest
import android.webkit.WebSettings
import android.webkit.WebStorage
import android.webkit.WebView
import android.webkit.WebViewClient
import android.webkit.*
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
Expand Down Expand Up @@ -72,13 +65,9 @@ import wannabit.io.cosmostaion.cosmos.MsgGenerator
import wannabit.io.cosmostaion.crypto.CryptoHelper
import wannabit.io.cosmostaion.dao.Account
import wannabit.io.cosmostaion.databinding.ActivityConnectWalletBinding
import wannabit.io.cosmostaion.dialog.CommonAlertDialog
import wannabit.io.cosmostaion.dialog.DappSignDialog
import wannabit.io.cosmostaion.dialog.*
import wannabit.io.cosmostaion.dialog.DappSignDialog.WcSignRawDataListener
import wannabit.io.cosmostaion.dialog.DappUrlDialog
import wannabit.io.cosmostaion.dialog.Dialog_Wc_Account
import wannabit.io.cosmostaion.dialog.Dialog_Wc_Account.OnDialogSelectListener
import wannabit.io.cosmostaion.dialog.Dialog_Wc_Raw_Data_Evmos
import wannabit.io.cosmostaion.dialog.Dialog_Wc_Raw_Data_Evmos.WcEvmosSignRawDataListener
import wannabit.io.cosmostaion.model.WcSignDirectModel
import wannabit.io.cosmostaion.model.WcSignModel
Expand Down Expand Up @@ -1499,24 +1488,24 @@ class WalletConnectActivity : BaseActivity() {

"cos_supportedChainIds" -> {
val dataJson = JSONObject()
dataJson.put("official", JSONArray(arrayListOf("cosmoshub-4", "osmosis-1", "stride-1", "stargaze-1", "omniflixhub-1", "crescent-1")))
dataJson.put("official", JSONArray(baseDao.mSupportConfig.supportChainIds))
dataJson.put("unofficial", JSONArray(arrayListOf<String>()))
appToWebResult(messageJson, dataJson, messageId)
}

"cos_supportedChainNames", "ten_supportedChainNames" -> {
val dataJson = JSONObject()
dataJson.put("official", JSONArray(arrayListOf("cosmos", "osmosis", "stride", "stargaze", "omniflix", "crescent")))
dataJson.put("official", JSONArray(baseDao.mSupportConfig.supportChainNames))
dataJson.put("unofficial", JSONArray(arrayListOf<String>()))
appToWebResult(messageJson, dataJson, messageId)
}

"cos_activatedChainIds" -> {
appToWebResult(messageJson, JSONArray(arrayListOf("cosmoshub-4", "osmosis-1", "stride-1", "stargaze-1", "omniflixhub-1", "crescent-1")), messageId)
appToWebResult(messageJson, JSONArray(baseDao.mSupportConfig.supportChainIds), messageId)
}

"cos_activatedChainNames" -> {
appToWebResult(messageJson, JSONArray(arrayListOf("cosmos", "osmosis", "stride", "stargaze", "omniflix", "crescent")), messageId)
appToWebResult(messageJson, JSONArray(baseDao.mSupportConfig.supportChainNames), messageId)
}

"cos_signAmino" -> {
Expand Down Expand Up @@ -1587,7 +1576,13 @@ class WalletConnectActivity : BaseActivity() {
baseChain = WDp.getChainTypeByChainName(chainId)
}
val key = getBaseAccountKey()
accountJson.put("address", WKey.genTendermintBech32Address(baseChain, Utils.bytesToHex(key.pubKey)))
if (baseChain == null) {
baseDao.mSupportConfig.customChains?.find { chainId.equals(it.chainId, true) }?.let {
accountJson.put("address", WKey.genTendermintBech32Address(it.prefix, Utils.bytesToHex(key.pubKey)))
}
} else {
accountJson.put("address", WKey.genTendermintBech32Address(baseChain, Utils.bytesToHex(key.pubKey)))
}
accountJson.put("name", WUtil.getWalletName(this, baseDao.onSelectAccount(baseDao.lastUser)))
accountJson.put("publicKey", Utils.bytesToHex(key.pubKey))
return accountJson
Expand Down
15 changes: 14 additions & 1 deletion app/src/main/java/wannabit/io/cosmostaion/base/BaseActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_BNB_FEES;
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_BNB_MINI_TICKER;
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_BNB_TICKER;
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_DAPP_CONFIG_LIST;
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_KAVA_INCENTIVE_REWARD;
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_MINTSCAN_CW20_ASSETS;
import static wannabit.io.cosmostaion.base.BaseConstant.TASK_FETCH_MINTSCAN_ERC20_ASSETS;
Expand Down Expand Up @@ -103,6 +104,7 @@
import wannabit.io.cosmostaion.dao.MintscanToken;
import wannabit.io.cosmostaion.dao.NameService;
import wannabit.io.cosmostaion.dao.Price;
import wannabit.io.cosmostaion.dao.SupportConfig;
import wannabit.io.cosmostaion.dialog.AccountShowDialog;
import wannabit.io.cosmostaion.dialog.CommonAlertDialog;
import wannabit.io.cosmostaion.dialog.FilledVerticalButtonAlertDialog;
Expand All @@ -124,6 +126,7 @@
import wannabit.io.cosmostaion.task.FetchTask.BnbMiniTokenListTask;
import wannabit.io.cosmostaion.task.FetchTask.BnbTickerTask;
import wannabit.io.cosmostaion.task.FetchTask.BnbTokenListTask;
import wannabit.io.cosmostaion.task.FetchTask.DappConfigListTask;
import wannabit.io.cosmostaion.task.FetchTask.KavaIncentiveRewardTask;
import wannabit.io.cosmostaion.task.FetchTask.MintScanAssetsTask;
import wannabit.io.cosmostaion.task.FetchTask.MintScanCw20AssetsTask;
Expand Down Expand Up @@ -161,6 +164,7 @@
import wannabit.io.cosmostaion.utils.LanguageUtil;
import wannabit.io.cosmostaion.utils.WDp;
import wannabit.io.cosmostaion.utils.WKey;
import wannabit.io.cosmostaion.utils.WLog;
import wannabit.io.cosmostaion.utils.WUtil;

public class BaseActivity extends AppCompatActivity implements TaskListener {
Expand Down Expand Up @@ -561,6 +565,8 @@ public void onFetchAccountInfo(FetchCallBack callback) {
getBaseDao().mVaultAmount = null;
getBaseDao().mResVestingData = null;

getBaseDao().mSupportConfig = null;


if (mBaseChain.equals(BNB_MAIN)) {
mTaskCount = 6;
Expand Down Expand Up @@ -739,12 +745,13 @@ else if (result.taskType == TASK_GRPC_FETCH_NODE_INFO) {
tendermint.p2p.Types.NodeInfo tempNodeInfo = (tendermint.p2p.Types.NodeInfo) result.resultData;
if (tempNodeInfo != null) {
getBaseDao().mGRpcNodeInfo = tempNodeInfo;
mTaskCount = mTaskCount + 5;
mTaskCount = mTaskCount + 6;
new MintScanAssetsTask(getBaseApplication(), this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new MintScanCw20AssetsTask(getBaseApplication(), this, mBaseChain).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new MintscanErc20AssetsTask(getBaseApplication(), this, mBaseChain).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new MintScanUtilityParamTask(getBaseApplication(), this, mBaseChain).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new OsmosisCheckIcnsGrpcTask(getBaseApplication(), this, mChainConfig, mAccount.address).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new DappConfigListTask(getBaseApplication(), this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
// new StargazeCheckNSGrpcTask(getBaseApplication(), this, mChainConfig, mAccount.address).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

Expand Down Expand Up @@ -898,6 +905,12 @@ else if (result.taskType == TASK_FETCH_MINTSCAN_CW20_ASSETS) {
}
}

else if (result.taskType == TASK_FETCH_DAPP_CONFIG_LIST) {
if (result.isSuccess && result.resultData != null) {
getBaseDao().mSupportConfig = (SupportConfig) result.resultData;
}
}

if (mTaskCount == 0) {
if (isGRPC(mBaseChain)) {
getBaseDao().mGRpcAllValidators.addAll(getBaseDao().mGRpcTopValidators);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ public class BaseConstant {
public final static int TASK_GRPC_FETCH_VAULT_BALANCE = 4313;
public final static int TASK_GRPC_FETCH_NEUTRON_VESTING = 4314;

public final static int TASK_FETCH_DAPP_CONFIG_LIST = 4330;


public final static String COSMOS_AUTH_TYPE_STDTX = "auth/StdTx";
public final static String COSMOS_AUTH_TYPE_OKEX_ACCOUNT = "okexchain/EthAccount";
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/wannabit/io/cosmostaion/base/BaseData.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
import wannabit.io.cosmostaion.dao.Param;
import wannabit.io.cosmostaion.dao.Password;
import wannabit.io.cosmostaion.dao.Price;
import wannabit.io.cosmostaion.dao.SupportConfig;
import wannabit.io.cosmostaion.model.BondingInfo;
import wannabit.io.cosmostaion.model.NodeInfo;
import wannabit.io.cosmostaion.model.RewardInfo;
Expand Down Expand Up @@ -398,6 +399,8 @@ public BigDecimal getAllExToken(String denom) {
public String mVaultAmount = null;
public ResVestingData mResVestingData = null;

public SupportConfig mSupportConfig = null;

//gRPC funcs
public String getChainIdGrpc() {
if (mGRpcNodeInfo != null) {
Expand Down
14 changes: 14 additions & 0 deletions app/src/main/java/wannabit/io/cosmostaion/dao/SupportConfig.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package wannabit.io.cosmostaion.dao

data class SupportConfig(
val supportChainNames: List<String>?,
val supportChainIds: List<String>?,
val customChains: List<CustomChain>?
)

data class CustomChain(
val chainId: String?,
val denom: String?,
val prefix: String?,
val default_address_type: Boolean?
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import retrofit2.http.Query;
import wannabit.io.cosmostaion.dao.Param;
import wannabit.io.cosmostaion.dao.Price;
import wannabit.io.cosmostaion.dao.SupportConfig;
import wannabit.io.cosmostaion.dao.SupportPool;
import wannabit.io.cosmostaion.network.res.ResApiNewTxListCustom;
import wannabit.io.cosmostaion.network.res.ResAssets;
Expand Down Expand Up @@ -52,6 +53,9 @@ public interface Station {
@GET("/cosmostation/chainlist/master/chain/{chain}/pool.json")
Call<ArrayList<SupportPool>> getSupportPools(@Path("chain") String chain);

@GET("/cosmostation/chainlist/master/dapp/config.json")
Call<SupportConfig> getSupportConfigs();

@GET("v1/boards")
Call<ResNotice> getNotice(@Query("chain") String chain, @Query("dashboard") boolean dashboard);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package wannabit.io.cosmostaion.task.FetchTask

import wannabit.io.cosmostaion.base.BaseApplication
import wannabit.io.cosmostaion.base.BaseConstant
import wannabit.io.cosmostaion.network.ApiClient
import wannabit.io.cosmostaion.task.CommonTask
import wannabit.io.cosmostaion.task.TaskListener
import wannabit.io.cosmostaion.task.TaskResult
import wannabit.io.cosmostaion.utils.WLog

class DappConfigListTask(
app: BaseApplication?,
listener: TaskListener?,
) : CommonTask(app, listener) {

override fun doInBackground(vararg strings: String?): TaskResult {
mResult.taskType = BaseConstant.TASK_FETCH_DAPP_CONFIG_LIST
try {
val response = ApiClient.getChainBase().supportConfigs.execute()
if (!response.isSuccessful) {
mResult.isSuccess = false
mResult.errorCode = BaseConstant.ERROR_CODE_NETWORK
return mResult
}
if (response.body() != null) {
mResult.resultData = response.body()
mResult.isSuccess = true
}
} catch (e: Exception) {
WLog.w("DappConfigListTask Error " + e.message)
}
return mResult
}
}
10 changes: 6 additions & 4 deletions app/src/main/java/wannabit/io/cosmostaion/utils/WKey.java
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,11 @@ public static String genLegegacyOkcAddres(String privateKey) {

// ripemd160 + bech32 for base cosmos sdk style (cosmos1.........)
public static String genTendermintBech32Address(BaseChain chain, String pubHex) {
ChainConfig chainConfig = ChainFactory.getChain(chain);
return genTendermintBech32Address(chainConfig.addressPrefix(), pubHex);
}

public static String genTendermintBech32Address(String prefix, String pubHex) {
String result = null;
MessageDigest digest = Sha256.getSha256Digest();
byte[] hash = digest.digest(WUtil.HexStringToByteArray(pubHex));
Expand All @@ -345,10 +350,7 @@ public static String genTendermintBech32Address(BaseChain chain, String pubHex)

try {
byte[] converted = convertBits(hash3, 8, 5, true);
if (chain != null) {
ChainConfig chainConfig = ChainFactory.getChain(chain);
result = bech32Encode(chainConfig.addressPrefix().getBytes(), converted);
}
result = bech32Encode(prefix.getBytes(), converted);
} catch (Exception e) {
WLog.w("Secp256k1 genDPAddress Error");
}
Expand Down

0 comments on commit cffda90

Please sign in to comment.