diff --git a/app/build.gradle b/app/build.gradle index 62931566..a4f96be4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,6 +100,8 @@ dependencies { // implementation 'org.web3j:core:3.3.1-android' implementation 'com.yanzhenjie:permission:2.0.0-rc5' implementation 'io.reactivex:rxjava:1.2.4' + implementation 'com.github.TrustWallet:trust-web3-provider:0.2.1' + api 'com.github.TrustWallet:TrustCoreAndroid:0.01.6' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' @@ -115,7 +117,6 @@ dependencies { implementation files('libs/rlp-3.3.2-android.jar') implementation files('libs/tuples-3.3.2-android.jar') implementation files('libs/utils-3.3.2-android.jar') - implementation project(path: ':lib') } def getVersionName(boolean isDebug) { diff --git a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java index c4977505..aaec4273 100644 --- a/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/AppWebActivity.java @@ -7,7 +7,6 @@ import android.text.TextUtils; import android.view.KeyEvent; import android.view.View; -import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -19,7 +18,9 @@ import org.nervos.neuron.R; import org.nervos.neuron.dialog.SimpleDialog; +import org.nervos.neuron.item.AppItem; import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.service.SignService; import org.nervos.neuron.util.Blockies; import org.nervos.neuron.util.ConstUtil; import org.nervos.neuron.util.LogUtil; @@ -27,21 +28,16 @@ import org.nervos.neuron.util.crypto.AESCrypt; import org.nervos.neuron.util.web.WebAppUtil; import org.nervos.neuron.util.db.DBWalletUtil; -import org.web3j.crypto.ECKeyPair; -import org.web3j.crypto.Sign; import org.web3j.utils.Numeric; -import java.security.GeneralSecurityException; -import java.util.concurrent.Callable; import de.hdodenhof.circleimageview.CircleImageView; -import rx.Observable; import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.schedulers.Schedulers; import trust.core.entity.Address; -import trust.web3.Web3View; -import trust.web3.item.Transaction; +import org.nervos.neuron.webview.OnSignMessageListener; +import org.nervos.neuron.webview.Web3View; +import org.nervos.neuron.webview.item.Message; +import org.nervos.neuron.webview.item.Transaction; public class AppWebActivity extends BaseActivity { @@ -60,14 +56,15 @@ public class AppWebActivity extends BaseActivity { private BottomSheetDialog sheetDialog; private WalletItem walletItem; - private Transaction transaction; + private Transaction signTransaction; + private String url; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app_web); - String url = getIntent().getStringExtra(EXTRA_URL); + url = getIntent().getStringExtra(EXTRA_URL); walletItem = DBWalletUtil.getCurrentWallet(mActivity); initView(); @@ -142,22 +139,37 @@ private void initInjectWebView() { webView.setOnSignTransactionListener(transaction -> { Toast.makeText(mActivity, - "transaction information: payload: " + transaction.data - + " gasPrice: " + transaction.gasPrice, Toast.LENGTH_LONG).show(); - this.transaction = transaction; - if (walletItem == null) { - Toast.makeText(mActivity, R.string.no_wallet_suggestion, Toast.LENGTH_SHORT).show(); - startActivity(new Intent(mActivity, AddWalletActivity.class)); - } else { - Intent intent = new Intent(mActivity, PayTokenActivity.class); - intent.putExtra(EXTRA_PAYLOAD, new Gson().toJson(transaction)); - intent.putExtra(EXTRA_CHAIN, WebAppUtil.getAppItem()); - startActivityForResult(intent, REQUEST_CODE); - } + "transaction information: payload: " + transaction.data, Toast.LENGTH_LONG).show(); + signTxAction(transaction); + }); + webView.setOnSignMessageListener(new OnSignMessageListener() { + @Override + public void onSignMessage(Message message) { + Toast.makeText(mActivity, + "transaction information: message: " + message.url + " " + + message.value + " " + message.leafPosition, Toast.LENGTH_LONG).show(); + showSignMessageDialog(message); + } }); } + + private void signTxAction(Transaction transaction) { + this.signTransaction = transaction; + if (walletItem == null) { + Toast.makeText(mActivity, R.string.no_wallet_suggestion, Toast.LENGTH_SHORT).show(); + startActivity(new Intent(mActivity, AddWalletActivity.class)); + } else { + Intent intent = new Intent(mActivity, PayTokenActivity.class); + intent.putExtra(EXTRA_PAYLOAD, new Gson().toJson(transaction)); + intent.putExtra(EXTRA_CHAIN, WebAppUtil.getAppItem() == null? + new AppItem(url):WebAppUtil.getAppItem()); + startActivityForResult(intent, REQUEST_CODE); + } + } + + private void initWebView() { webView.setWebChromeClient(new WebChromeClient(){ @Override @@ -189,19 +201,6 @@ public void onPageFinished(WebView view, String url) { }); } - private class Nervos { - - @JavascriptInterface - public void signTransaction(String tx) { - if (walletItem == null) { - Toast.makeText(mActivity, R.string.no_wallet_suggestion, Toast.LENGTH_SHORT).show(); - startActivity(new Intent(mActivity, AddWalletActivity.class)); - } else { - showSignMessageDialog(tx); - } - } - } - @Override public void onDestroy() { if (sheetDialog != null && sheetDialog.isShowing()) { @@ -210,14 +209,14 @@ public void onDestroy() { super.onDestroy(); } - private void showSignMessageDialog(String tx) { + private void showSignMessageDialog(Message message) { sheetDialog = new BottomSheetDialog(mActivity); sheetDialog.setCanceledOnTouchOutside(true); - sheetDialog.setContentView(getSignMessageView(tx)); + sheetDialog.setContentView(getSignMessageView(message)); sheetDialog.show(); } - private View getSignMessageView(String tx) { + private View getSignMessageView(Message message) { View view = getLayoutInflater().inflate(R.layout.dialog_sign_message, null); TextView walletNameText = view.findViewById(R.id.wallet_name); TextView walletAddressText = view.findViewById(R.id.wallet_address); @@ -228,19 +227,19 @@ private View getSignMessageView(String tx) { walletNameText.setText(walletItem.name); walletAddressText.setText(walletItem.address); - payOwnerText.setText(WebAppUtil.getAppItem().entry); - payDataText.setText(tx); + payOwnerText.setText(WebAppUtil.getAppItem() == null? + url:WebAppUtil.getAppItem().entry); + payDataText.setText(message.value.data); photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); if (WebAppUtil.getAppItem() != null) { payOwnerText.setText(WebAppUtil.getAppItem().provider); - payDataText.setText(tx); } view.findViewById(R.id.sign_hex_layout).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { view.findViewById(R.id.pay_data_left_line).setVisibility(View.VISIBLE); view.findViewById(R.id.pay_data_right_line).setVisibility(View.GONE); - payDataText.setText(tx); + payDataText.setText(message.value.data); } }); @@ -249,8 +248,8 @@ public void onClick(View v) { public void onClick(View v) { view.findViewById(R.id.pay_data_left_line).setVisibility(View.GONE); view.findViewById(R.id.pay_data_right_line).setVisibility(View.VISIBLE); - if (Numeric.containsHexPrefix(tx)) { - payDataText.setText(NumberUtil.hexToUtf8(tx)); + if (Numeric.containsHexPrefix(message.value.data)) { + payDataText.setText(NumberUtil.hexToUtf8(message.value.data)); } } }); @@ -258,21 +257,22 @@ public void onClick(View v) { @Override public void onClick(View v) { sheetDialog.dismiss(); + webView.onSignCancel(message); } }); view.findViewById(R.id.pay_approve).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - showPasswordConfirmView(progressBar, tx); + showPasswordConfirmView(progressBar, message); } }); return view; } - private void showPasswordConfirmView(ProgressBar progressBar, String tx) { + private void showPasswordConfirmView(ProgressBar progressBar, Message message) { SimpleDialog simpleDialog = new SimpleDialog(mActivity); simpleDialog.setTitle(R.string.input_password_hint); - simpleDialog.setMessageHint("password"); + simpleDialog.setMessageHint(R.string.input_password_hint); simpleDialog.setEditInputType(SimpleDialog.PASSWORD); simpleDialog.setOnOkClickListener(new SimpleDialog.OnOkClickListener() { @Override @@ -286,77 +286,56 @@ public void onOkClick() { return; } progressBar.setVisibility(View.VISIBLE); - actionSignNervos(password, tx); simpleDialog.dismiss(); - + if (Transaction.TYPE_ETH.equals(message.value.chainType)) { + actionSignEth(password, message); + } else if (Transaction.TYPE_APPCHAIN.equals(message.value.chainType)){ + actionSignNervos(password, message); + } } }); simpleDialog.setOnCancelClickListener(() -> simpleDialog.dismiss()); simpleDialog.show(); } - private void actionSignEth(String password, String tx) { - Observable.fromCallable(new Callable() { - @Override - public Sign.SignatureData call() { - try { - String privateKey = AESCrypt.decrypt(password, walletItem.cryptPrivateKey); - return Sign.signMessage(tx.getBytes(), - ECKeyPair.create(Numeric.toBigInt(privateKey))); - } catch (GeneralSecurityException e) { + private void actionSignEth(String password, Message message) { + SignService.signEthMessage(mActivity, message.value.data, password). + subscribe(new Subscriber() { + @Override + public void onCompleted() { + sheetDialog.dismiss(); + } + @Override + public void onError(Throwable e) { e.printStackTrace(); + sheetDialog.dismiss(); + webView.onSignError(message, e.getMessage()); } - return null; - } - }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - sheetDialog.dismiss(); - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - sheetDialog.dismiss(); - } - @Override - public void onNext(Sign.SignatureData signatureData) { - LogUtil.d("signatureData: " + new String(signatureData.getR())); - } - }); + @Override + public void onNext(String hexSign) { + webView.onSignMessageSuccessful(message, hexSign); + } + }); } - private void actionSignNervos(String password, String tx) { - Observable.fromCallable(new Callable() { - @Override - public org.nervos.web3j.crypto.Sign.SignatureData call() { - try { - String privateKey = AESCrypt.decrypt(password, walletItem.cryptPrivateKey); - return org.nervos.web3j.crypto.Sign.signMessage(tx.getBytes(), - org.nervos.web3j.crypto.ECKeyPair.create(Numeric.toBigInt(privateKey))); - } catch (GeneralSecurityException e) { + private void actionSignNervos(String password, Message message) { + SignService.signNervosMessage(mActivity, message.value.data, password) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + sheetDialog.dismiss(); + } + @Override + public void onError(Throwable e) { e.printStackTrace(); + sheetDialog.dismiss(); + webView.onSignError(message, e.getMessage()); } - return null; - } - }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { - sheetDialog.dismiss(); - } - @Override - public void onError(Throwable e) { - e.printStackTrace(); - sheetDialog.dismiss(); - } - @Override - public void onNext(org.nervos.web3j.crypto.Sign.SignatureData signatureData) { - LogUtil.d("signatureData: " + new String(signatureData.get_signature())); - } - }); + @Override + public void onNext(String hexSign) { + webView.onSignMessageSuccessful(message, hexSign); + } + }); } @Override @@ -365,14 +344,14 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE) { switch (resultCode) { case RESULT_CODE_CANCEL: - webView.onSignCancel(transaction); + webView.onSignCancel(signTransaction); break; case RESULT_CODE_SUCCESS: - webView.onSignTransactionSuccessful(transaction, + webView.onSignTransactionSuccessful(signTransaction, data.getStringExtra(PayTokenActivity.EXTRA_HEX_HASH)); break; case RESULT_CODE_FAIL: - webView.onSignError(transaction, + webView.onSignError(signTransaction, data.getStringExtra(PayTokenActivity.EXTRA_PAY_ERROR)); break; default: diff --git a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java index 4b99e5d5..02ca7d61 100644 --- a/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java +++ b/app/src/main/java/org/nervos/neuron/activity/PayTokenActivity.java @@ -20,6 +20,7 @@ import org.nervos.neuron.service.NervosRpcService; import org.nervos.neuron.service.EthRpcService; import org.nervos.neuron.util.Blockies; +import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.nervos.neuron.util.crypto.AESCrypt; import org.nervos.neuron.util.db.DBWalletUtil; @@ -67,6 +68,7 @@ private void initData() { appItem = getIntent().getParcelableExtra(AppWebActivity.EXTRA_CHAIN); } + private void initView() { TextView walletNameText = findViewById(R.id.wallet_name); TextView walletAddressText = findViewById(R.id.wallet_address); @@ -81,18 +83,36 @@ private void initView() { walletAddressText.setText(walletItem.address); photoImage.setImageBitmap(Blockies.createIcon(walletItem.address)); payNameText.setText(appItem.entry); + payDataText.setText(transactionInfo.data); + payAddressText.setText(transactionInfo.to); if (transactionInfo.isEthereum()) { - payAddressText.setText(transactionInfo.to); - payAmountText.setText(NumberUtil.getDecimal_4(transactionInfo.getValue())); - paySumText.setText(NumberUtil.getDecimal_4(transactionInfo.getValue() + payAmountText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); + paySumText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue() + transactionInfo.getGas())); - payDataText.setText(transactionInfo.data); + if (TextUtils.isEmpty(transactionInfo.gasPrice) || "0".equals(transactionInfo.gasPrice)) { + showProgressCircle(); + EthRpcService.getEthGasPrice().subscribe(new Subscriber() { + @Override + public void onCompleted() { + dismissProgressCircle(); + } + @Override + public void onError(Throwable e) { + e.printStackTrace(); + dismissProgressCircle(); + } + @Override + public void onNext(BigInteger gasPrice) { + transactionInfo.gasPrice = gasPrice.toString(16); + paySumText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue() + + transactionInfo.getGas())); + } + }); + } } else { - payAddressText.setText(transactionInfo.to); - payAmountText.setText(NumberUtil.getDecimal_4(transactionInfo.getValue())); - paySumText.setText(NumberUtil.getDecimal_4(transactionInfo.getValue() + payAmountText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); + paySumText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue() + transactionInfo.getQuota())); - payDataText.setText(transactionInfo.data); } findViewById(R.id.sign_hex_layout).setOnClickListener(new View.OnClickListener() { @@ -146,8 +166,8 @@ private View getConfirmTransferView(BottomSheetDialog sheetDialog) { fromAddress.setText(walletItem.address); toAddress.setText(transactionInfo.to); - valueText.setText(NumberUtil.getDecimal_4(transactionInfo.getValue())); - feeConfirmText.setText(NumberUtil.getDecimal_4(transactionInfo.isEthereum()? + valueText.setText(NumberUtil.getDecimal_6(transactionInfo.getValue())); + feeConfirmText.setText(NumberUtil.getDecimal_6(transactionInfo.isEthereum()? transactionInfo.getGas():transactionInfo.getQuota())); view.findViewById(R.id.close_layout).setOnClickListener(v -> sheetDialog.dismiss()); view.findViewById(R.id.transfer_confirm_button).setOnClickListener(v -> @@ -159,7 +179,7 @@ private View getConfirmTransferView(BottomSheetDialog sheetDialog) { private void showPasswordConfirmView(ProgressBar progressBar) { SimpleDialog simpleDialog = new SimpleDialog(mActivity); simpleDialog.setTitle(R.string.input_password_hint); - simpleDialog.setMessageHint("password"); + simpleDialog.setMessageHint(R.string.input_password_hint); simpleDialog.setEditInputType(SimpleDialog.PASSWORD); simpleDialog.setOnOkClickListener(new SimpleDialog.OnOkClickListener() { @Override @@ -185,8 +205,18 @@ public void onOkClick() { private void transferEth(String password, ProgressBar progressBar) { - EthRpcService.getEthGasPrice() - .flatMap(new Func1>() { + Observable.just(transactionInfo.gasPrice) + .flatMap(new Func1>() { + @Override + public Observable call(String gasPrice) { + if (TextUtils.isEmpty(transactionInfo.gasPrice) + || "0".equals(transactionInfo.gasPrice)) { + return EthRpcService.getEthGasPrice(); + } else { + return Observable.just(Numeric.toBigInt(gasPrice)); + } + } + }).flatMap(new Func1>() { @Override public Observable call(BigInteger gasPrice) { return EthRpcService.transferEth(transactionInfo.to, @@ -215,7 +245,8 @@ public void onNext(EthSendTransaction ethSendTransaction) { private void transferNervos(String password, ProgressBar progressBar) { NervosRpcService.setHttpProvider(SharePrefUtil.getChainHostFromId(transactionInfo.chainId)); - NervosRpcService.transferNervos(transactionInfo.to, transactionInfo.getValue(), transactionInfo.data, password) + NervosRpcService.transferNervos(transactionInfo.to, transactionInfo.getValue(), + transactionInfo.data, password) .subscribe(new Subscriber() { @Override public void onCompleted() { diff --git a/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java b/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java index 735b1dfa..20341a32 100644 --- a/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java +++ b/app/src/main/java/org/nervos/neuron/dialog/TokenTransferDialog.java @@ -56,7 +56,7 @@ private void initView() { } else { tokenImage.setImageURI(tokenItem.avatar); } - tokenBalanceText.setText(NumberUtil.getDecimal_4(tokenItem.balance)); + tokenBalanceText.setText(NumberUtil.getDecimal_6(tokenItem.balance)); } private void initListener() { diff --git a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java index f7e2376c..bf4b897f 100644 --- a/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java +++ b/app/src/main/java/org/nervos/neuron/fragment/WalletFragment.java @@ -239,7 +239,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi } if (tokenItemList.get(position) != null) { viewHolder.tokenName.setText(tokenItemList.get(position).symbol); - viewHolder.tokenAmount.setText(NumberUtil.getDecimal_4(tokenItemList.get(position).balance)); + viewHolder.tokenAmount.setText(NumberUtil.getDecimal_6(tokenItemList.get(position).balance)); } viewHolder.itemView.setTag(position); } diff --git a/app/src/main/java/org/nervos/neuron/item/AppItem.java b/app/src/main/java/org/nervos/neuron/item/AppItem.java index d5f039d0..d5c84491 100644 --- a/app/src/main/java/org/nervos/neuron/item/AppItem.java +++ b/app/src/main/java/org/nervos/neuron/item/AppItem.java @@ -14,7 +14,7 @@ public class AppItem implements Parcelable { public String name; public String provider; public String blockViewer; - public Map chainset; + public Map chainSet = new HashMap<>(); public AppItem(String entry, String icon, String name, String provider) { this.entry = entry; @@ -23,6 +23,10 @@ public AppItem(String entry, String icon, String name, String provider) { this.provider = provider; } + public AppItem(String entry) { + this.entry = entry; + } + @Override public int describeContents() { @@ -36,8 +40,8 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.name); dest.writeString(this.provider); dest.writeString(this.blockViewer); - dest.writeInt(this.chainset.size()); - for (Map.Entry entry : this.chainset.entrySet()) { + dest.writeInt(this.chainSet.size()); + for (Map.Entry entry : this.chainSet.entrySet()) { dest.writeString(entry.getKey()); dest.writeString(entry.getValue()); } @@ -50,11 +54,11 @@ protected AppItem(Parcel in) { this.provider = in.readString(); this.blockViewer = in.readString(); int chainsetSize = in.readInt(); - this.chainset = new HashMap(chainsetSize); + this.chainSet = new HashMap(chainsetSize); for (int i = 0; i < chainsetSize; i++) { String key = in.readString(); String value = in.readString(); - this.chainset.put(key, value); + this.chainSet.put(key, value); } } diff --git a/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java b/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java index e5d85ee4..96abf46e 100644 --- a/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java +++ b/app/src/main/java/org/nervos/neuron/item/TransactionInfo.java @@ -6,33 +6,29 @@ import com.google.gson.annotations.SerializedName; +import org.nervos.neuron.util.ConstUtil; +import org.nervos.neuron.util.LogUtil; import org.nervos.neuron.util.NumberUtil; import org.web3j.utils.Numeric; +import java.math.BigInteger; + public class TransactionInfo implements Parcelable { - /** - * from : 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 - * nonce : 100 - * quota : 100 - * data : 0x627306090abaB3A6e1400e9345bC60c78a8BEf57 - * value : 0 - * chainId : 1 - * version : 0 - */ + private static final String TYPE_ETH = "ETH"; + private static final String TYPE_APPCHAIN = "AppChain"; public String from; public String to; public long nonce; private long quota = -1; public String data; - @SerializedName("value") - public String value; + private String value; public long chainId; public int version; - private String gasLimit; - private String gasPrice; - public String uuid; + public String gasLimit; + public String gasPrice; + public String chainType; public TransactionInfo(String to, String value) { this.to = to; @@ -40,6 +36,7 @@ public TransactionInfo(String to, String value) { } public double getValue() { + value = TextUtils.isEmpty(value)? "0":value; return NumberUtil.getEthFromWeiForDoubleDecimal6(value); } @@ -48,32 +45,15 @@ public double getQuota() { } public double getGas() { + BigInteger limitBig = TextUtils.isEmpty(gasLimit)? + ConstUtil.GAS_LIMIT:Numeric.toBigInt(gasLimit); + BigInteger priceBig = TextUtils.isEmpty(gasPrice)? BigInteger.ZERO:Numeric.toBigInt(gasPrice); return NumberUtil.getEthFromWeiForDoubleDecimal6( - Numeric.toBigInt(gasLimit).multiply(Numeric.toBigInt(gasPrice)).toString()); - } - - public String getGasLimit() { - return gasLimit; - } - - public String getGasPrice() { - return gasPrice; - } - - public void setGasLimit(String gasLimit) { - this.gasLimit = gasLimit; - } - - public void setQuota(long quota) { - this.quota = quota; - } - - public void setGasPrice(String gasPrice) { - this.gasPrice = gasPrice; + limitBig.multiply(priceBig).toString()); } public boolean isEthereum() { - return !TextUtils.isEmpty(gasPrice); + return !TextUtils.isEmpty(chainType) && TYPE_ETH.equals(chainType); } @@ -94,7 +74,6 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.version); dest.writeString(this.gasLimit); dest.writeString(this.gasPrice); - dest.writeString(this.uuid); } protected TransactionInfo(Parcel in) { @@ -108,7 +87,6 @@ protected TransactionInfo(Parcel in) { this.version = in.readInt(); this.gasLimit = in.readString(); this.gasPrice = in.readString(); - this.uuid = in.readString(); } public static final Creator CREATOR = new Creator() { diff --git a/app/src/main/java/org/nervos/neuron/service/SignService.java b/app/src/main/java/org/nervos/neuron/service/SignService.java new file mode 100644 index 00000000..6e2f31d4 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/service/SignService.java @@ -0,0 +1,66 @@ +package org.nervos.neuron.service; + +import android.content.Context; + +import org.nervos.neuron.item.WalletItem; +import org.nervos.neuron.util.NumberUtil; +import org.nervos.neuron.util.bip44.HexUtils; +import org.nervos.neuron.util.crypto.AESCrypt; +import org.nervos.neuron.util.db.DBWalletUtil; +import org.web3j.crypto.ECKeyPair; +import org.web3j.crypto.Sign; +import org.web3j.utils.Numeric; + +import java.security.GeneralSecurityException; +import java.util.concurrent.Callable; + +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class SignService { + + public static Observable signEthMessage( + Context context, String message, String password) { + return Observable.fromCallable(new Callable() { + @Override + public String call() throws GeneralSecurityException{ + WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); + String privateKey = AESCrypt.decrypt(password, walletItem.cryptPrivateKey); + Sign.SignatureData signatureData = Sign.signMessage(message.getBytes(), + ECKeyPair.create(Numeric.toBigInt(privateKey))); + return getSignature(signatureData); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + public static Observable signNervosMessage( + Context context, String message, String password) { + return Observable.fromCallable(new Callable() { + @Override + public String call() throws GeneralSecurityException { + WalletItem walletItem = DBWalletUtil.getCurrentWallet(context); + String privateKey = AESCrypt.decrypt(password, walletItem.cryptPrivateKey); + org.nervos.web3j.crypto.Sign.SignatureData signatureData = + org.nervos.web3j.crypto.Sign.signMessage(message.getBytes(), + org.nervos.web3j.crypto.ECKeyPair.create(Numeric.toBigInt(privateKey))); + return Numeric.toHexString(signatureData.get_signature()); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + + private static String getSignature(Sign.SignatureData signatureData) { + byte[] sig = new byte[65]; + System.arraycopy(signatureData.getR(), 0, sig, 0, 32); + System.arraycopy(signatureData.getS(), 0, sig, 32, 32); + sig[64] = signatureData.getV(); + return Numeric.toHexString(sig); + } + + +} diff --git a/app/src/main/java/org/nervos/neuron/util/LogUtil.java b/app/src/main/java/org/nervos/neuron/util/LogUtil.java index b7c6326f..d2bab05e 100644 --- a/app/src/main/java/org/nervos/neuron/util/LogUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/LogUtil.java @@ -7,7 +7,7 @@ public class LogUtil { - private static final String TAG = "Nervos"; + private static final String TAG = "Neuron"; public static void v(String tag, String msg) { if (BuildConfig.IS_DEBUG && !TextUtils.isEmpty(msg)) { diff --git a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java index d01ad22e..9a95fd6c 100644 --- a/app/src/main/java/org/nervos/neuron/util/NumberUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/NumberUtil.java @@ -20,11 +20,6 @@ public static String getDecimal_6(Double value) { return fmt.format(value); } - public static String getDecimal_4(Double value) { - DecimalFormat fmt = new DecimalFormat("0.####"); - return fmt.format(value); - } - public static String hexToUtf8(String hex) { hex = Numeric.cleanHexPrefix(hex); ByteBuffer buff = ByteBuffer.allocate(hex.length()/2); @@ -66,6 +61,7 @@ public static String getEthFromWeiForStringDecimal6(BigInteger value) { } public static double getEthFromWeiForDoubleDecimal6(String value) { + LogUtil.d("value: " + value); if (TextUtils.isEmpty(value)) return 0.0; if (Numeric.containsHexPrefix(value)) { return getEthFromWei(Numeric.toBigInt(value)); diff --git a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java index 2ed4f7e3..c75b5840 100644 --- a/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java +++ b/app/src/main/java/org/nervos/neuron/util/web/WebAppUtil.java @@ -96,12 +96,12 @@ public Observable call(String path) { }).filter(new Func1() { @Override public Boolean call(AppItem appItem) { - return appItem.chainset.size() > 0 && appItem.chainset.size() <= 5; + return appItem.chainSet.size() > 0 && appItem.chainSet.size() <= 5; } }).flatMap(new Func1>() { @Override public Observable call(AppItem appItem) { - Map chainSet = appItem.chainset; + Map chainSet = appItem.chainSet; List chainItemList = new ArrayList<>(); for(Map.Entry entry : chainSet.entrySet()) { ChainItem item = new ChainItem(); diff --git a/lib/src/main/java/trust/web3/JsInjectorClient.java b/app/src/main/java/org/nervos/neuron/webview/JsInjectorClient.java similarity index 97% rename from lib/src/main/java/trust/web3/JsInjectorClient.java rename to app/src/main/java/org/nervos/neuron/webview/JsInjectorClient.java index a257e840..89408950 100644 --- a/lib/src/main/java/trust/web3/JsInjectorClient.java +++ b/app/src/main/java/org/nervos/neuron/webview/JsInjectorClient.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.content.Context; import android.support.annotation.Nullable; @@ -6,9 +6,10 @@ import android.text.TextUtils; import android.util.Log; +import org.nervos.neuron.R; + import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; @@ -86,8 +87,6 @@ JsInjectorResponse loadUrl(final String url, final Map headers) String assembleJs(Context context, String template) { if (TextUtils.isEmpty(jsLibrary)) { -// jsLibrary = loadFile(context, trust.web3jprovider.R.raw.trust); - Log.d("Neuron", "assembleJs"); jsLibrary = loadFile(context, R.raw.trust_web3); } String initJs = loadInitJs(context); diff --git a/lib/src/main/java/trust/web3/JsInjectorResponse.java b/app/src/main/java/org/nervos/neuron/webview/JsInjectorResponse.java similarity index 92% rename from lib/src/main/java/trust/web3/JsInjectorResponse.java rename to app/src/main/java/org/nervos/neuron/webview/JsInjectorResponse.java index d9d52f74..c07841b1 100644 --- a/lib/src/main/java/trust/web3/JsInjectorResponse.java +++ b/app/src/main/java/org/nervos/neuron/webview/JsInjectorResponse.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; class JsInjectorResponse { final String data; diff --git a/app/src/main/java/org/nervos/neuron/webview/OnSignMessageListener.java b/app/src/main/java/org/nervos/neuron/webview/OnSignMessageListener.java new file mode 100644 index 00000000..c50432d1 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/webview/OnSignMessageListener.java @@ -0,0 +1,9 @@ +package org.nervos.neuron.webview; + + +import org.nervos.neuron.webview.item.Message; +import org.nervos.neuron.webview.item.Transaction; + +public interface OnSignMessageListener { + void onSignMessage(Message message); +} diff --git a/lib/src/main/java/trust/web3/OnSignPersonalMessageListener.java b/app/src/main/java/org/nervos/neuron/webview/OnSignPersonalMessageListener.java similarity index 57% rename from lib/src/main/java/trust/web3/OnSignPersonalMessageListener.java rename to app/src/main/java/org/nervos/neuron/webview/OnSignPersonalMessageListener.java index b283e010..e8fd8cf9 100644 --- a/lib/src/main/java/trust/web3/OnSignPersonalMessageListener.java +++ b/app/src/main/java/org/nervos/neuron/webview/OnSignPersonalMessageListener.java @@ -1,6 +1,6 @@ -package trust.web3; +package org.nervos.neuron.webview; -import trust.core.entity.Message; +import org.nervos.neuron.webview.item.Message; public interface OnSignPersonalMessageListener { void onSignPersonalMessage(Message message); diff --git a/lib/src/main/java/trust/web3/OnSignTransactionListener.java b/app/src/main/java/org/nervos/neuron/webview/OnSignTransactionListener.java similarity index 54% rename from lib/src/main/java/trust/web3/OnSignTransactionListener.java rename to app/src/main/java/org/nervos/neuron/webview/OnSignTransactionListener.java index 7a7d8346..b14e6719 100644 --- a/lib/src/main/java/trust/web3/OnSignTransactionListener.java +++ b/app/src/main/java/org/nervos/neuron/webview/OnSignTransactionListener.java @@ -1,6 +1,6 @@ -package trust.web3; +package org.nervos.neuron.webview; -import trust.web3.item.Transaction; +import org.nervos.neuron.webview.item.Transaction; public interface OnSignTransactionListener { void onSignTransaction(Transaction transaction); diff --git a/lib/src/main/java/trust/web3/OnSignTypedMessageListener.java b/app/src/main/java/org/nervos/neuron/webview/OnSignTypedMessageListener.java similarity index 63% rename from lib/src/main/java/trust/web3/OnSignTypedMessageListener.java rename to app/src/main/java/org/nervos/neuron/webview/OnSignTypedMessageListener.java index bb60cfd3..f73f955a 100644 --- a/lib/src/main/java/trust/web3/OnSignTypedMessageListener.java +++ b/app/src/main/java/org/nervos/neuron/webview/OnSignTypedMessageListener.java @@ -1,6 +1,7 @@ -package trust.web3; +package org.nervos.neuron.webview; + +import org.nervos.neuron.webview.item.Message; -import trust.core.entity.Message; import trust.core.entity.TypedData; public interface OnSignTypedMessageListener { diff --git a/lib/src/main/java/trust/web3/SignCallbackJSInterface.java b/app/src/main/java/org/nervos/neuron/webview/SignCallbackJSInterface.java similarity index 89% rename from lib/src/main/java/trust/web3/SignCallbackJSInterface.java rename to app/src/main/java/org/nervos/neuron/webview/SignCallbackJSInterface.java index b85fd0fb..e6746751 100644 --- a/lib/src/main/java/trust/web3/SignCallbackJSInterface.java +++ b/app/src/main/java/org/nervos/neuron/webview/SignCallbackJSInterface.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.support.annotation.NonNull; import android.text.TextUtils; @@ -7,11 +7,12 @@ import com.google.gson.Gson; +import org.nervos.neuron.webview.item.Message; +import org.nervos.neuron.webview.item.Transaction; + import trust.core.entity.Address; -import trust.core.entity.Message; import trust.core.entity.TypedData; import trust.core.util.Hex; -import trust.web3.item.Transaction; public class SignCallbackJSInterface { @@ -46,7 +47,7 @@ public void signTransaction( String nonce, String gasLimit, // quota String gasPrice, // validUntilBlock - String payload, + String data, String chainId, String version, String chainType) { @@ -57,7 +58,7 @@ public void signTransaction( gasLimit, gasPrice, Hex.hexToLong(nonce, -1), - payload, + data, Hex.hexToLong(chainId, -1), Hex.hexToInteger(version, 0), chainType, @@ -66,8 +67,9 @@ public void signTransaction( } @JavascriptInterface - public void signMessage(int callbackId, String data) { - webView.post(() -> onSignMessageListener.onSignMessage(new Message<>(data, getUrl(), callbackId))); + public void signMessage(int callbackId, String data, String chainType) { + Transaction transaction = new Transaction(data, chainType); + webView.post(() -> onSignMessageListener.onSignMessage(new Message<>(transaction, getUrl(), callbackId))); } @JavascriptInterface diff --git a/lib/src/main/java/trust/web3/UrlHandler.java b/app/src/main/java/org/nervos/neuron/webview/UrlHandler.java similarity index 75% rename from lib/src/main/java/trust/web3/UrlHandler.java rename to app/src/main/java/org/nervos/neuron/webview/UrlHandler.java index 9da4a75b..5db56491 100644 --- a/lib/src/main/java/trust/web3/UrlHandler.java +++ b/app/src/main/java/org/nervos/neuron/webview/UrlHandler.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.net.Uri; diff --git a/lib/src/main/java/trust/web3/UrlHandlerManager.java b/app/src/main/java/org/nervos/neuron/webview/UrlHandlerManager.java similarity index 96% rename from lib/src/main/java/trust/web3/UrlHandlerManager.java rename to app/src/main/java/org/nervos/neuron/webview/UrlHandlerManager.java index 4d94ab3e..137f8916 100644 --- a/lib/src/main/java/trust/web3/UrlHandlerManager.java +++ b/app/src/main/java/org/nervos/neuron/webview/UrlHandlerManager.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.net.Uri; import android.support.annotation.NonNull; diff --git a/lib/src/main/java/trust/web3/Web3View.java b/app/src/main/java/org/nervos/neuron/webview/Web3View.java similarity index 98% rename from lib/src/main/java/trust/web3/Web3View.java rename to app/src/main/java/org/nervos/neuron/webview/Web3View.java index 3f0aadc0..04cebf17 100644 --- a/lib/src/main/java/trust/web3/Web3View.java +++ b/app/src/main/java/org/nervos/neuron/webview/Web3View.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.annotation.SuppressLint; import android.content.Context; @@ -15,14 +15,15 @@ import android.webkit.WebView; import android.webkit.WebViewClient; +import org.nervos.neuron.webview.item.Message; +import org.nervos.neuron.webview.item.Transaction; + import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import trust.core.entity.Address; -import trust.core.entity.Message; import trust.core.entity.TypedData; -import trust.web3.item.Transaction; public class Web3View extends WebView { private static final String JS_PROTOCOL_CANCELLED = "cancelled"; @@ -139,7 +140,7 @@ public void setOnSignMessageListener(@Nullable OnSignMessageListener onSignMessa public void setOnSignPersonalMessageListener(@Nullable OnSignPersonalMessageListener onSignPersonalMessageListener) { this.onSignPersonalMessageListener = onSignPersonalMessageListener; } - + public void setOnSignTypedMessageListener(@Nullable OnSignTypedMessageListener onSignTypedMessageListener) { this.onSignTypedMessageListener = onSignTypedMessageListener; } diff --git a/lib/src/main/java/trust/web3/Web3ViewClient.java b/app/src/main/java/org/nervos/neuron/webview/Web3ViewClient.java similarity index 99% rename from lib/src/main/java/trust/web3/Web3ViewClient.java rename to app/src/main/java/org/nervos/neuron/webview/Web3ViewClient.java index f9ada3be..717bb6cf 100644 --- a/lib/src/main/java/trust/web3/Web3ViewClient.java +++ b/app/src/main/java/org/nervos/neuron/webview/Web3ViewClient.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.net.http.SslError; import android.text.TextUtils; diff --git a/lib/src/main/java/trust/web3/WebViewCookieJar.java b/app/src/main/java/org/nervos/neuron/webview/WebViewCookieJar.java similarity index 97% rename from lib/src/main/java/trust/web3/WebViewCookieJar.java rename to app/src/main/java/org/nervos/neuron/webview/WebViewCookieJar.java index d283b503..0714ad7a 100644 --- a/lib/src/main/java/trust/web3/WebViewCookieJar.java +++ b/app/src/main/java/org/nervos/neuron/webview/WebViewCookieJar.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.support.annotation.NonNull; import android.text.TextUtils; diff --git a/lib/src/main/java/trust/web3/WrapWebSettings.java b/app/src/main/java/org/nervos/neuron/webview/WrapWebSettings.java similarity index 99% rename from lib/src/main/java/trust/web3/WrapWebSettings.java rename to app/src/main/java/org/nervos/neuron/webview/WrapWebSettings.java index 3c8b114f..c0e92edd 100644 --- a/lib/src/main/java/trust/web3/WrapWebSettings.java +++ b/app/src/main/java/org/nervos/neuron/webview/WrapWebSettings.java @@ -1,4 +1,4 @@ -package trust.web3; +package org.nervos.neuron.webview; import android.os.Build; import android.support.annotation.Nullable; diff --git a/app/src/main/java/org/nervos/neuron/webview/item/Message.java b/app/src/main/java/org/nervos/neuron/webview/item/Message.java new file mode 100644 index 00000000..590a0c76 --- /dev/null +++ b/app/src/main/java/org/nervos/neuron/webview/item/Message.java @@ -0,0 +1,49 @@ +package org.nervos.neuron.webview.item; + +import android.os.Parcel; +import android.os.Parcelable; + +public class Message implements Parcelable { + + public final V value; + public final String url; + public final long leafPosition; + + public Message(V value, String url, long leafPosition) { + this.value = value; + this.url = url; + this.leafPosition = leafPosition; + } + + protected Message(Parcel in) { + Class type = (Class) in.readSerializable(); + value = (V) in.readValue(type.getClassLoader()); + url = in.readString(); + leafPosition = in.readLong(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeSerializable(value.getClass()); + dest.writeValue(value); + dest.writeString(url); + dest.writeLong(leafPosition); + } + + public static final Creator CREATOR = new Creator() { + @Override + public Message createFromParcel(Parcel in) { + return new Message(in); + } + + @Override + public Message[] newArray(int size) { + return new Message[size]; + } + }; +} diff --git a/lib/src/main/java/trust/web3/item/Transaction.java b/app/src/main/java/org/nervos/neuron/webview/item/Transaction.java similarity index 78% rename from lib/src/main/java/trust/web3/item/Transaction.java rename to app/src/main/java/org/nervos/neuron/webview/item/Transaction.java index 3e89bf14..d8d640d9 100644 --- a/lib/src/main/java/trust/web3/item/Transaction.java +++ b/app/src/main/java/org/nervos/neuron/webview/item/Transaction.java @@ -1,16 +1,14 @@ -package trust.web3.item; +package org.nervos.neuron.webview.item; import android.os.Parcel; import android.os.Parcelable; -import java.math.BigInteger; - import trust.core.entity.Address; public class Transaction implements Parcelable { - private static final String TYPE_ETH = "ETH"; - private static final String TYPE_APPCHAIN = "AppChain"; + public static final String TYPE_ETH = "ETH"; + public static final String TYPE_APPCHAIN = "AppChain"; public Address recipient; public Address contract; @@ -27,6 +25,29 @@ public class Transaction implements Parcelable { public String validUntilBlock; public int version; public long chainId; + public String chainType; + + public Transaction( + String data, + String chainType) { + this.data = data; + this.chainType = chainType; + } + + public Transaction( + Address recipient, + Address contract, + String value, + String gasLimit, + String gasPrice, + long nonce, + String data, + long chainId, + int version, + String chainType) { + this(recipient, contract, value, gasLimit, gasPrice, nonce, data, + chainId, version, chainType, 0); + } public Transaction( Address recipient, @@ -35,7 +56,7 @@ public Transaction( String gasLimit, String gasPrice, long nonce, - String payload, + String data, long chainId, int version, String chainType, @@ -44,6 +65,7 @@ public Transaction( this.contract = contract; this.value = value; this.to = recipient.toString(); + this.chainType = chainType; if (TYPE_ETH.equalsIgnoreCase(chainType)) { this.gasPrice = gasPrice; this.gasLimit = gasLimit; @@ -54,7 +76,7 @@ public Transaction( this.version = version; } this.nonce = nonce; - this.data = payload; + this.data = data; this.leafPosition = leafPosition; } diff --git a/lib/src/main/res/raw/init.js b/app/src/main/res/raw/init.js similarity index 71% rename from lib/src/main/res/raw/init.js rename to app/src/main/res/raw/init.js index 6764e943..da60f4db 100644 --- a/lib/src/main/res/raw/init.js +++ b/app/src/main/res/raw/init.js @@ -11,49 +11,43 @@ function onSignSuccessful(id, value) { function onSignError(id, error) { Trust.executeCallback(id, error, null) } -console.log("trust init") window.Trust.init(rpcURL, { getAccounts: function (cb) { cb(null, [addressHex]) }, processTransaction: function (tx, cb){ console.log('signing a transaction', tx) const { id = 8888 } = tx Trust.addCallback(id, cb) - if (typeof tx.gasPrice !== 'undefined') { + + var data = tx.data || null; + var nonce = tx.nonce || -1; + var chainId = tx.chainId || -1; + var version = tx.version || 0; + var value = tx.value || null; + var chainType = tx.chainType || null; + + if (tx.chainType == "ETH") { var gasLimit = tx.gasLimit || tx.gas || null; var gasPrice = tx.gasPrice || null; - var data = tx.data || null; - var nonce = tx.nonce || -1; - var chainId = -1; - var version = 0; - var chainType = "ETH"; - trust.signTransaction(id, tx.to || null, tx.value, nonce, gasLimit, gasPrice, + trust.signTransaction(id, tx.to || null, value, nonce, gasLimit, gasPrice, data, chainId, version, chainType); } else { var quota = tx.quota || null; var validUntilBlock = tx.validUntilBlock || 0; - var data = tx.data || null; - var nonce = tx.nonce || 0; - var chainId = tx.chainId; - var version = tx.version; - var chainType = "AppChain"; - trust.signTransaction(id, tx.to || null, tx.value, nonce, quota, validUntilBlock, + trust.signTransaction(id, tx.to || null, value, nonce, quota, validUntilBlock, data, chainId, version, chainType); } - }, signMessage: function (msgParams, cb) { console.log('signMessage', msgParams) - const { data } = msgParams + const { data, chainType } = msgParams const { id = 8888 } = msgParams - console.log("signing a message", msgParams) Trust.addCallback(id, cb) - trust.signMessage(id, data); + trust.signMessage(id, data, chainType); }, signPersonalMessage: function (msgParams, cb) { console.log('signPersonalMessage', msgParams) const { data } = msgParams const { id = 8888 } = msgParams - console.log("signing a personal message", msgParams) Trust.addCallback(id, cb) trust.signPersonalMessage(id, data); }, diff --git a/lib/src/main/res/raw/trust_web3.js b/app/src/main/res/raw/trust_web3.js similarity index 99% rename from lib/src/main/res/raw/trust_web3.js rename to app/src/main/res/raw/trust_web3.js index 1e822250..797aa095 100644 --- a/lib/src/main/res/raw/trust_web3.js +++ b/app/src/main/res/raw/trust_web3.js @@ -46192,15 +46192,25 @@ HookedWalletSubprovider.prototype.handleRequest = function(payload, next, end){ return case 'eth_sendTransaction': - case 'sendTransaction': - console.log("sendTransaction inject") + console.log("eth_sendTransaction inject") txParams = payload.params[0] + txParams.chainType = "ETH" waterfall([ // (cb) => self.validateTransaction(txParams, cb), (cb) => self.processTransaction(txParams, cb), ], end) return + case 'sendTransaction': + console.log("sendTransaction inject") + txParams = payload.params[0] + txParams.chainType = "AppChain" + waterfall([ + // (cb) => self.validateTransaction(txParams, cb), + (cb) => self.processTransaction(txParams, cb), + ], end) + return + case 'eth_signTransaction': console.log("eth_signTransaction") txParams = payload.params[0] @@ -46211,7 +46221,6 @@ HookedWalletSubprovider.prototype.handleRequest = function(payload, next, end){ return case 'eth_sign': - console.log("eth_sign") // process normally address = payload.params[0] message = payload.params[1] @@ -46222,12 +46231,33 @@ HookedWalletSubprovider.prototype.handleRequest = function(payload, next, end){ from: address, data: message, }) + msgParams.chainType = "ETH"; + console.log("eth_sign msgParams: ", msgParams) waterfall([ - (cb) => self.validateMessage(msgParams, cb), +// (cb) => self.validateMessage(msgParams, cb), (cb) => self.processMessage(msgParams, cb), ], end) return + case 'sign': + // process normally + address = payload.params[0] + message = payload.params[1] + // non-standard "extraParams" to be appended to our "msgParams" obj + // good place for metadata + extraParams = payload.params[2] || {} + msgParams = extend(extraParams, { + from: address, + data: message, + }) + msgParams.chainType = "AppChain"; + console.log("sign msgParams: ", msgParams) + waterfall([ + // (cb) => self.validateMessage(msgParams, cb), + (cb) => self.processMessage(msgParams, cb), + ], end) + return + case 'personal_sign': // process normally const first = payload.params[0] diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a2aa8e1..b9a64e50 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -161,4 +161,5 @@ 知道了 Can not get MetaData from host: 合约地址错误 + password diff --git a/lib/.gitignore b/lib/.gitignore deleted file mode 100644 index 796b96d1..00000000 --- a/lib/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/lib/build.gradle b/lib/build.gradle deleted file mode 100644 index 842a0d93..00000000 --- a/lib/build.gradle +++ /dev/null @@ -1,51 +0,0 @@ -apply plugin: 'com.android.library' - -apply plugin: 'com.github.dcendents.android-maven' - -group='trust.web3' - -android { - compileSdkVersion 27 - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 27 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - targetCompatibility 1.8 - sourceCompatibility 1.8 - } - - task androidSourcesJar(type: Jar) { - from android.sourceSets.main.java.source - classifier = 'sources' - } - - artifacts { - archives androidSourcesJar - } -} - -dependencies { - implementation 'com.squareup.okhttp3:okhttp:3.10.0' - implementation 'com.github.TrustWallet:trust-web3-provider:0.2.1' - implementation 'com.google.code.gson:gson:2.8.2' - api 'com.github.TrustWallet:TrustCoreAndroid:0.01.6' - - implementation 'com.android.support:appcompat-v7:27.1.1' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/lib/proguard-rules.pro b/lib/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/lib/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/lib/src/androidTest/java/com/trustwallet/ExampleInstrumentedTest.java b/lib/src/androidTest/java/com/trustwallet/ExampleInstrumentedTest.java deleted file mode 100644 index bc48de7b..00000000 --- a/lib/src/androidTest/java/com/trustwallet/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.trustwallet; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.trustwallet.test", appContext.getPackageName()); - } -} diff --git a/lib/src/main/AndroidManifest.xml b/lib/src/main/AndroidManifest.xml deleted file mode 100644 index a405dc7b..00000000 --- a/lib/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/src/main/java/trust/web3/OnSignMessageListener.java b/lib/src/main/java/trust/web3/OnSignMessageListener.java deleted file mode 100644 index 8f140186..00000000 --- a/lib/src/main/java/trust/web3/OnSignMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package trust.web3; - -import trust.core.entity.Message; - -public interface OnSignMessageListener { - void onSignMessage(Message message); -} diff --git a/lib/src/test/java/com/trustwallet/ExampleUnitTest.java b/lib/src/test/java/com/trustwallet/ExampleUnitTest.java deleted file mode 100644 index 0b538437..00000000 --- a/lib/src/test/java/com/trustwallet/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.trustwallet; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b6806f47..9d495b34 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ -include ':app', ':lib' -project(':lib').projectDir = new File('lib') \ No newline at end of file +include ':app' \ No newline at end of file