导航菜单

页面标题

页面副标题

imToken v3.28.8 - WalletAPI.java 源代码

正在查看: imToken v3.28.8 应用的 WalletAPI.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package org.consenlabs.imtoken.walletapi;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.meituan.android.walle.WalleChannelReader;
import com.microsoft.codepush.react.CodePushConstants;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.bitcoinj.core.Sha256Hash;
import org.consenlabs.imtoken.MainApplication;
import org.consenlabs.imtoken.walletapi.TokenBaseJavaModule;
import org.consenlabs.tokencore.foundation.utils.CachedDerivedKey;
import org.consenlabs.tokencore.foundation.utils.NumericUtil;
import org.consenlabs.tokencore.wallet.Identity;
import org.consenlabs.tokencore.wallet.Wallet;
import org.consenlabs.tokencore.wallet.WalletManager;
import org.consenlabs.tokencore.wallet.keystore.EOSKeystore;
import org.consenlabs.tokencore.wallet.keystore.HDMnemonicKeystore;
import org.consenlabs.tokencore.wallet.model.ChainType;
import org.consenlabs.tokencore.wallet.model.KeyPair;
import org.consenlabs.tokencore.wallet.model.Messages;
import org.consenlabs.tokencore.wallet.model.Metadata;
import org.consenlabs.tokencore.wallet.model.MnemonicAndPath;
import org.consenlabs.tokencore.wallet.model.TokenException;
import org.consenlabs.tokencore.wallet.transaction.BitcoinTransaction;
import org.consenlabs.tokencore.wallet.transaction.EOSTransaction;
import org.consenlabs.tokencore.wallet.transaction.EthereumSign;
import org.consenlabs.tokencore.wallet.transaction.EthereumTransaction;
import org.consenlabs.tokencore.wallet.transaction.OmniTransaction;
import org.consenlabs.tokencore.wallet.transaction.TxSignResult;
import org.consenlabs.tokencore.wallet.transaction.cosmos.Coin;
import org.consenlabs.tokencore.wallet.transaction.cosmos.CosmosTransaction;
import org.consenlabs.tokencore.wallet.transaction.cosmos.StdFee;
import org.consenlabs.tokencore.wallet.validators.ETHAddressValidator;
import org.consenlabs.tokencore.wallet.validators.MetadataValidator;
import org.json.JSONException;
import org.json.JSONObject;

public class WalletAPI extends TokenBaseJavaModule {
    public String getName() {
        return "WalletAPI";
    }

    public WalletAPI(ReactApplicationContext reactApplicationContext) {
        super(reactApplicationContext);
    }

    @ReactMethod
    public void createIdentity(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                Identity createIdentity = Identity.createIdentity(readableMap.getString("name"), readableMap.getString("password"), readableMap.getString("passwordHint"), readableMap.getString("network").toUpperCase(), readableMap.getString("segWit").toUpperCase());
                WritableArray createArray = TokenBaseJavaModule.sArgumentMapper.createArray();
                Iterator<Wallet> it = createIdentity.getWallets().iterator();
                while (it.hasNext()) {
                    createArray.pushMap(TokenBaseJavaModule.createBuilder(it.next()).toMap());
                }
                WritableMap map = new WritableMapBuilder().put("identifier", createIdentity.getIdentifier()).put("ipfsId", createIdentity.getIpfsId()).toMap();
                map.putArray("wallets", createArray);
                return map;
            }
        }, promise);
    }

    @ReactMethod
    public void recoverIdentity(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("name");
                String string2 = readableMap.getString("mnemonic");
                Identity recoverIdentity = Identity.recoverIdentity(string2, string, readableMap.getString("password"), readableMap.getString("passwordHint"), readableMap.getString("network").toUpperCase(), readableMap.getString("segWit").toUpperCase());
                WritableArray createArray = TokenBaseJavaModule.sArgumentMapper.createArray();
                Iterator<Wallet> it = recoverIdentity.getWallets().iterator();
                while (it.hasNext()) {
                    createArray.pushMap(TokenBaseJavaModule.createBuilder(it.next()).toMap());
                }
                WritableMap map = new WritableMapBuilder().put("identifier", recoverIdentity.getIdentifier()).put("mnemonic", string2).put("ipfsId", recoverIdentity.getIpfsId()).toMap();
                map.putArray("wallets", createArray);
                return map;
            }
        }, promise);
    }

    @ReactMethod
    public void exportIdentity(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("identifier");
                String string2 = readableMap.getString("password");
                Identity currentIdentity = Identity.getCurrentIdentity();
                Preconditions.checkState(currentIdentity.getIdentifier().equals(string), Messages.INVALID_IDENTITY);
                return new WritableMapBuilder().put("identifier", string).put("mnemonic", currentIdentity.exportIdentity(string2)).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void removeIdentity(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("identifier");
                String string2 = readableMap.getString("password");
                Identity currentIdentity = Identity.getCurrentIdentity();
                Preconditions.checkState(currentIdentity.getIdentifier().equals(string), Messages.INVALID_IDENTITY);
                currentIdentity.deleteIdentity(string2);
                return new WritableMapBuilder().put("identifier", string).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void deriveWalletsFromIdentity(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("identifier");
                String string2 = readableMap.getString("password");
                ReadableArray array = readableMap.getArray("chainTypes");
                ArrayList arrayList = new ArrayList(array.size());
                for (int i = 0; i < array.size(); i++) {
                    arrayList.add(array.getString(i));
                }
                Identity currentIdentity = Identity.getCurrentIdentity();
                Preconditions.checkState(currentIdentity.getIdentifier().equals(string), Messages.INVALID_IDENTITY);
                List<Wallet> deriveWallets = currentIdentity.deriveWallets(arrayList, string2);
                WritableArray createArray = TokenBaseJavaModule.sArgumentMapper.createArray();
                for (int i2 = 0; i2 < deriveWallets.size(); i2++) {
                    createArray.pushMap(TokenBaseJavaModule.createBuilder(deriveWallets.get(i2)).toMap());
                }
                return createArray;
            }
        }, promise);
    }

    @ReactMethod
    public void encryptDataToIpfs(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("content");
                String string2 = readableMap.getString("identifier");
                Identity currentIdentity = Identity.getCurrentIdentity();
                Preconditions.checkState(currentIdentity.getIdentifier().equals(string2), Messages.INVALID_IDENTITY);
                return new WritableMapBuilder().put("encrypted", currentIdentity.encryptDataToIPFS(string)).put("identifier", string2).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void decryptDataFromIpfs(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("encrypted");
                String string2 = readableMap.getString("identifier");
                Identity currentIdentity = Identity.getCurrentIdentity();
                Preconditions.checkState(currentIdentity.getIdentifier().equals(string2), Messages.INVALID_IDENTITY);
                return new WritableMapBuilder().put("content", currentIdentity.decryptDataFromIPFS(string)).put("identifier", string2).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void generateMnemonic(ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return WalletManager.generateMnemonic();
            }
        }, promise);
    }

    @ReactMethod
    public void mnemonicToPublicKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return WalletManager.mnemonicToPublic(readableMap.getString("mnemonic"), readableMap.getString("path"), readableMap.getString("encodeTo"));
            }
        }, promise);
    }

    @ReactMethod
    public void privateKeyToPublicKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return WalletManager.privateKeyToPublic(readableMap.getString("privateKey"), readableMap.getString("privateKeyType"), readableMap.getString("encodeTo"));
            }
        }, promise);
    }

    @ReactMethod
    public void importWalletFromMnemonic(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("password");
                String string2 = readableMap.getString("mnemonic");
                String string3 = readableMap.getString("path");
                boolean z = readableMap.getBoolean("overwrite");
                Metadata validate = new MetadataValidator(readableMap.toHashMap()).validate();
                List<EOSKeystore.PermissionObject> readPermissions = WalletAPI.this.readPermissions(readableMap);
                if (readPermissions != null) {
                    return TokenBaseJavaModule.createBuilder(WalletManager.importWalletFromMnemonic(validate, readableMap.hasKey("accountName") ? readableMap.getString("accountName") : "", string2, string3, readPermissions, string, z)).toMap();
                }
                return TokenBaseJavaModule.createBuilder(WalletManager.importWalletFromMnemonic(validate, string2, string3, string, z)).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void findWalletByMnemonic(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("mnemonic");
                String string2 = readableMap.getString("path");
                Wallet findWalletByMnemonic = WalletManager.findWalletByMnemonic(readableMap.getString("chainType"), readableMap.getString("network"), string, string2, readableMap.hasKey("segWit") ? readableMap.getString("segWit") : "");
                if (findWalletByMnemonic != null) {
                    return TokenBaseJavaModule.createBuilder(findWalletByMnemonic).toMap();
                }
                return null;
            }
        }, promise);
    }

    @ReactMethod
    public void importWalletFromKeystore(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return TokenBaseJavaModule.createBuilder(WalletManager.importWalletFromKeystore(new MetadataValidator(readableMap.toHashMap()).validate(), readableMap.getString("keystore"), readableMap.getString("password"), readableMap.getBoolean("overwrite"))).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void findWalletByKeystore(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                Wallet findWalletByKeystore = WalletManager.findWalletByKeystore(readableMap.getString("chainType"), readableMap.getString("keystore"), readableMap.getString("password"));
                if (findWalletByKeystore != null) {
                    return TokenBaseJavaModule.createBuilder(findWalletByKeystore).toMap();
                }
                return null;
            }
        }, promise);
    }

    @ReactMethod
    public void importWalletFromPrivateKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                Wallet importWalletFromPrivateKey;
                String string = readableMap.getString("password");
                boolean z = readableMap.getBoolean("overwrite");
                boolean hasKey = readableMap.hasKey("privateKeys");
                String str = Metadata.FROM_WIF;
                if (hasKey) {
                    ArrayList arrayList = readableMap.getArray("privateKeys").toArrayList();
                    ArrayList arrayList2 = new ArrayList(arrayList.size());
                    Iterator it = arrayList.iterator();
                    while (it.hasNext()) {
                        arrayList2.add((String) it.next());
                    }
                    List<EOSKeystore.PermissionObject> readPermissions = WalletAPI.this.readPermissions(readableMap);
                    Metadata validate = new MetadataValidator(readableMap.toHashMap()).validate();
                    validate.setSource(Metadata.FROM_WIF);
                    return TokenBaseJavaModule.createBuilder(WalletManager.importWalletFromPrivateKeys(validate, readableMap.hasKey("accountName") ? readableMap.getString("accountName") : "", arrayList2, readPermissions, string, z)).toMap();
                }
                String string2 = readableMap.getString("privateKey");
                Metadata validate2 = new MetadataValidator(readableMap.toHashMap()).validate();
                if (ChainType.ETHEREUM.equals(validate2.getChainType())) {
                    str = Metadata.FROM_PRIVATE;
                }
                validate2.setSource(str);
                if (readableMap.hasKey("accountName")) {
                    importWalletFromPrivateKey = WalletManager.importWalletFromPrivateKey(validate2, readableMap.getString("accountName"), string2, string, z);
                } else {
                    importWalletFromPrivateKey = WalletManager.importWalletFromPrivateKey(validate2, string2, string, z);
                }
                return TokenBaseJavaModule.createBuilder(importWalletFromPrivateKey).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void findWalletByPrivateKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                Wallet findWalletByPrivateKey = WalletManager.findWalletByPrivateKey(readableMap.getString("chainType"), readableMap.getString("network"), readableMap.getString("privateKey"), readableMap.getString("segWit"));
                if (findWalletByPrivateKey != null) {
                    return TokenBaseJavaModule.createBuilder(findWalletByPrivateKey).toMap();
                }
                return null;
            }
        }, promise);
    }

    @ReactMethod
    public void exportPrivateKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                char c;
                String string = readableMap.getString("id");
                String string2 = readableMap.getString("password");
                Wallet mustFindWalletById = WalletManager.mustFindWalletById(string);
                String chainType = mustFindWalletById.getMetadata().getChainType();
                int hashCode = chainType.hashCode();
                if (hashCode == -636739593) {
                    if (chainType.equals(ChainType.ETHEREUM)) {
                        c = 1;
                    }
                    c = 65535;
                } else if (hashCode != 68841) {
                    if (hashCode == 615278846 && chainType.equals(ChainType.BITCOIN)) {
                        c = 2;
                    }
                    c = 65535;
                } else {
                    if (chainType.equals(ChainType.EOS)) {
                        c = 0;
                    }
                    c = 65535;
                }
                if (c != 0) {
                    if (c == 1) {
                        return new WritableMapBuilder().put("privateKey", WalletManager.exportPrivateKey(string, string2)).toMap();
                    }
                    if (c == 2) {
                        return new WritableMapBuilder().put("privateKey", WalletManager.exportPrivateKeyByAddress(string, string2, readableMap.hasKey("derivedPath") ? readableMap.getString("derivedPath") : null, readableMap.hasKey("address") ? readableMap.getString("address") : null)).toMap();
                    }
                    throw new TokenException("Not support the chain  of " + mustFindWalletById.getMetadata().getChainType());
                }
                List<KeyPair> exportPrivateKeys = mustFindWalletById.exportPrivateKeys(string2);
                WritableArray createArray = WalletAPI.sArgumentMapper.createArray();
                for (KeyPair keyPair : exportPrivateKeys) {
                    WritableMap createMap = WalletAPI.sArgumentMapper.createMap();
                    createMap.putString("privateKey", keyPair.getPrivateKey());
                    createMap.putString("publicKey", keyPair.getPublicKey());
                    createArray.pushMap(createMap);
                }
                return createArray;
            }
        }, promise);
    }

    @ReactMethod
    public void exportMnemonic(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                MnemonicAndPath exportMnemonic = WalletManager.exportMnemonic(readableMap.getString("id"), readableMap.getString("password"));
                return new WritableMapBuilder().put("mnemonic", exportMnemonic.getMnemonic()).put("path", exportMnemonic.getPath()).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void verifyPassword(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("id");
                if (!WalletManager.mustFindWalletById(string).getKeystore().verifyPassword(readableMap.getString("password"))) {
                    throw new TokenException(Messages.WALLET_INVALID_PASSWORD);
                }
                return new WritableMapBuilder().put("id", string).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void exportKeystore(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return new WritableMapBuilder().put("json", WalletManager.exportKeystore(readableMap.getString("id"), readableMap.getString("password"))).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void removeWallet(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("id");
                WalletManager.removeWallet(string, readableMap.getString("password"));
                return new WritableMapBuilder().put("id", string).toMap();
            }
        }, promise);
    }

    @Override
    BigInteger parseBigInt(ReadableMap readableMap, String str) {
        String string = readableMap.getString(str);
        if (string != null && string.startsWith("0x")) {
            return new BigInteger(string.substring(2), 16);
        }
        return new BigInteger(string);
    }

    @ReactMethod
    public void calcExternalAddress(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                Wallet mustFindWalletById = WalletManager.mustFindWalletById(readableMap.getString("id"));
                int i = readableMap.getInt("externalIdx");
                String newReceiveAddress = mustFindWalletById.newReceiveAddress(i);
                WritableMap createMap = TokenBaseJavaModule.sArgumentMapper.createMap();
                createMap.putString("address", newReceiveAddress);
                createMap.putString("type", "EXTERNAL");
                createMap.putString("derivedPath", String.format("0/%d", Integer.valueOf(i)));
                return createMap;
            }
        }, promise);
    }

    @ReactMethod
    public void personalSign(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                ReadableMap transformToPasswordFreeMap = WalletAPI.this.transformToPasswordFreeMap(readableMap);
                String string = transformToPasswordFreeMap.getString("id");
                return NumericUtil.prependHexPrefix(EthereumSign.personalSign(transformToPasswordFreeMap.getString("data"), WalletManager.mustFindWalletById(string).decryptMainKey(transformToPasswordFreeMap.getString("password"))));
            }
        }, promise);
    }

    @ReactMethod
    public void sign(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                ReadableMap transformToPasswordFreeMap = WalletAPI.this.transformToPasswordFreeMap(readableMap);
                String string = transformToPasswordFreeMap.getString("id");
                String string2 = transformToPasswordFreeMap.getString("data");
                byte[] decryptMainKey = WalletManager.mustFindWalletById(string).decryptMainKey(transformToPasswordFreeMap.getString("password"));
                if (readableMap.hasKey("isHex") && readableMap.getBoolean("isHex")) {
                    return NumericUtil.prependHexPrefix(EthereumSign.signHex(string2, decryptMainKey));
                }
                return NumericUtil.prependHexPrefix(EthereumSign.signStr(string2, decryptMainKey));
            }
        }, promise);
    }

    @ReactMethod
    public void batchSign(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String signStr;
                ReadableMap transformToPasswordFreeMap = WalletAPI.this.transformToPasswordFreeMap(readableMap);
                String string = transformToPasswordFreeMap.getString("id");
                String string2 = transformToPasswordFreeMap.getString("password");
                ArrayList arrayList = transformToPasswordFreeMap.getArray("data").toArrayList();
                WritableArray createArray = TokenBaseJavaModule.sArgumentMapper.createArray();
                byte[] decryptMainKey = WalletManager.mustFindWalletById(string).decryptMainKey(string2);
                boolean z = readableMap.hasKey("isHex") && readableMap.getBoolean("isHex");
                Iterator it = arrayList.iterator();
                while (it.hasNext()) {
                    Object next = it.next();
                    if (z) {
                        signStr = EthereumSign.signHex((String) next, decryptMainKey);
                    } else {
                        signStr = EthereumSign.signStr((String) next, decryptMainKey);
                    }
                    createArray.pushString(NumericUtil.prependHexPrefix(signStr));
                }
                return createArray;
            }
        }, promise);
    }

    @ReactMethod
    public void ecRecover(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("data");
                String string2 = readableMap.getString("signature");
                if (readableMap.hasKey("isHex") && readableMap.getBoolean("isHex")) {
                    return EthereumSign.recoverAddressFromHex(string, string2);
                }
                return EthereumSign.recoverAddressFromStr(string, string2);
            }
        }, promise);
    }

    @ReactMethod
    public void batchECRecover(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                ArrayList arrayList = readableMap.getArray("dataAndSignatures").toArrayList();
                WritableArray createArray = TokenBaseJavaModule.sArgumentMapper.createArray();
                for (int i = 0; i < arrayList.size(); i++) {
                    ReadableMap readableMap2 = (ReadableMap) arrayList.get(i);
                    String string = readableMap2.getString("data");
                    String string2 = readableMap2.getString("signature");
                    if (readableMap.hasKey("isHex") && readableMap.getBoolean("isHex")) {
                        createArray.pushString(EthereumSign.recoverAddressFromHex(string, string2));
                    } else {
                        createArray.pushString(EthereumSign.recoverAddressFromStr(string, string2));
                    }
                }
                return createArray;
            }
        }, promise);
    }

    @ReactMethod
    public void signTransaction(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                ReadableMap transformToPasswordFreeMap = WalletAPI.this.transformToPasswordFreeMap(readableMap);
                Wallet mustFindWalletById = WalletManager.mustFindWalletById(transformToPasswordFreeMap.getString("id"));
                if (ChainType.ETHEREUM.equals(mustFindWalletById.getMetadata().getChainType())) {
                    return WalletAPI.this.signEthereumTransaction(transformToPasswordFreeMap, mustFindWalletById);
                }
                if (ChainType.BITCOIN.equals(mustFindWalletById.getMetadata().getChainType())) {
                    return WalletAPI.this.signBitcoinTransaction(transformToPasswordFreeMap, mustFindWalletById);
                }
                if (ChainType.EOS.equals(mustFindWalletById.getMetadata().getChainType())) {
                    return WalletAPI.this.signEOSTransaction(transformToPasswordFreeMap, mustFindWalletById);
                }
                if (ChainType.COSMOS.equalsIgnoreCase(mustFindWalletById.getMetadata().getChainType())) {
                    return WalletAPI.this.signCosmosTransaction(transformToPasswordFreeMap, mustFindWalletById);
                }
                mustFindWalletById.getKeystore().getCrypto().clearCachedDerivedKey();
                throw new TokenException("Unsupport ChainType ");
            }
        }, promise);
    }

    @ReactMethod
    public void signMessage(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                WalletAPI.this.transformToPasswordFreeMap(readableMap);
                throw new TokenException(Messages.WALLET_INVALID_TYPE);
            }
        }, promise);
    }

    @ReactMethod
    public void switchBTCWalletMode(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return TokenBaseJavaModule.createBuilder(WalletManager.switchBTCWalletMode(readableMap.getString("id"), readableMap.getString("password"), readableMap.getString("segWit"))).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void signAuthenticationMessage(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("identifier");
                int i = readableMap.getInt("accessTime");
                String string2 = readableMap.getString("deviceToken");
                String string3 = readableMap.getString("password");
                Identity currentIdentity = Identity.getCurrentIdentity();
                if (!currentIdentity.getIdentifier().equals(string)) {
                    throw new TokenException(Messages.INVALID_IDENTITY);
                }
                return NumericUtil.prependHexPrefix(currentIdentity.signAuthenticationMessage(i, string2, string3));
            }
        }, promise);
    }

    @ReactMethod
    public void updateEOSWalletAccountName(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return TokenBaseJavaModule.createBuilder(WalletManager.setAccountName(readableMap.getString("id"), readableMap.getString("accountName"), readableMap.hasKey("password") ? readableMap.getString("password") : "")).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void findEOSWalletByAccountName(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return TokenBaseJavaModule.createBuilder(WalletManager.findWalletByAddress(ChainType.EOS, readableMap.getString("accountName"))).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void eosEcSign(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                ReadableMap transformToPasswordFreeMap = WalletAPI.this.transformToPasswordFreeMap(readableMap);
                return WalletManager.eosEcSign(transformToPasswordFreeMap.getString("id"), transformToPasswordFreeMap.getString("data"), transformToPasswordFreeMap.getBoolean("isHex"), transformToPasswordFreeMap.getString("password"), transformToPasswordFreeMap.hasKey("publicKey") ? transformToPasswordFreeMap.getString("publicKey") : null);
            }
        }, promise);
    }

    @ReactMethod
    public void eosEcRecover(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return WalletManager.eosEcRecover(readableMap.getString("data"), readableMap.getBoolean("isHex"), readableMap.getString("signature"));
            }
        }, promise);
    }

    @ReactMethod
    public void migrateEOSDerivingToMnemonicPath(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return TokenBaseJavaModule.createBuilder(WalletManager.migrateEOSDerivingToMnemonicPath(readableMap.getString("id"), readableMap.getString("password"), readableMap.hasKey("path") ? readableMap.getString("path") : "")).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void decryptData(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("cipherText");
                String string2 = readableMap.getString("password");
                String string3 = readableMap.hasKey("salt") ? readableMap.getString("salt") : "e65cc9bdc3ad15a9f6e0931b24fbf3cf";
                String string4 = readableMap.hasKey("cipher") ? readableMap.getString("cipher") : "aes-128-ctr";
                String string5 = readableMap.hasKey("padding") ? readableMap.getString("padding") : "nopadding";
                String substring = string.substring(string.length() - 64, string.length());
                byte[] decryptData = WalletManager.decryptData(string.substring(0, string.length() - 64), string4, string5, Sha256Hash.hash(string2.getBytes(Charset.forName("UTF-8"))), string3);
                if (!NumericUtil.bytesToHex(Sha256Hash.hash(decryptData)).equalsIgnoreCase(substring)) {
                    throw new TokenException(Messages.WALLET_INVALID_PASSWORD);
                }
                return NumericUtil.bytesToHex(decryptData);
            }
        }, promise);
    }

    @ReactMethod
    public void tryImportWalletFromUnknownKeystore(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return TokenBaseJavaModule.createBuilder(WalletManager.tryImportWalletFromUnknownKeystore(readableMap.getString("keystore"), readableMap.getString("password"))).toMap();
            }
        }, promise);
    }

    @ReactMethod
    public void checkBiometricMode(ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return BiometricProtectedData.checkBiometricMode();
            }
        }, promise);
    }

    @ReactMethod
    public void cacheDerivedKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("id");
                String string2 = readableMap.getString("password");
                WalletManager.mustFindWalletById(string);
                new BiometricProtectedData(WalletAPI.this.getReactApplicationContext(), string).encryptData(WalletManager.getDerivedKey(string, string2));
                WritableMap createMap = TokenBaseJavaModule.sArgumentMapper.createMap();
                createMap.putString("id", string);
                createMap.putBoolean("enableDerivedKey", true);
                createMap.putString("mode", "fingerprint");
                return createMap;
            }
        }, promise);
    }

    @ReactMethod
    public void getDerivedKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("id");
                byte[] decryptData = new BiometricProtectedData(WalletAPI.this.getReactApplicationContext(), string).decryptData();
                WritableMap createMap = TokenBaseJavaModule.sArgumentMapper.createMap();
                createMap.putString("id", string);
                createMap.putString("derivedKey", NumericUtil.bytesToHex(decryptData));
                if (WalletManager.mustFindWalletById(string).verifyDerivedKey(decryptData)) {
                    return createMap;
                }
                throw new TokenException(Messages.INVALID_CACHED_DERIVED_KEY);
            }
        }, promise);
    }

    @ReactMethod
    public void deleteDerivedKey(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                String string = readableMap.getString("id");
                new BiometricProtectedData(WalletAPI.this.getReactApplicationContext(), string).deleteEncrypted();
                WritableMap createMap = TokenBaseJavaModule.sArgumentMapper.createMap();
                createMap.putString("id", string);
                return createMap;
            }
        }, promise);
    }

    @ReactMethod
    public void exportWalletMetadata(final ReadableMap readableMap, Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                Wallet mustFindWalletById = WalletManager.mustFindWalletById(readableMap.getString("id"));
                if (!(mustFindWalletById.getKeystore() instanceof HDMnemonicKeystore)) {
                    throw new TokenException("Only allow debug BTC HD wallet");
                }
                HDMnemonicKeystore hDMnemonicKeystore = (HDMnemonicKeystore) mustFindWalletById.getKeystore();
                WritableMap createMap = TokenBaseJavaModule.sArgumentMapper.createMap();
                createMap.putString("path", hDMnemonicKeystore.getMnemonicPath());
                createMap.putString("network", hDMnemonicKeystore.getMetadata().getNetwork());
                return createMap;
            }
        }, promise);
    }

    List<EOSKeystore.PermissionObject> readPermissions(ReadableMap readableMap) {
        if (!readableMap.hasKey("permissions")) {
            return null;
        }
        ReadableArray array = readableMap.getArray("permissions");
        ArrayList arrayList = new ArrayList(array.size());
        for (int i = 0; i < array.size(); i++) {
            ReadableMap map = array.getMap(i);
            EOSKeystore.PermissionObject permissionObject = new EOSKeystore.PermissionObject();
            if (map.hasKey("parent")) {
                permissionObject.setParent(map.getString("parent"));
            }
            permissionObject.setPermission(map.getString("permission"));
            permissionObject.setPublicKey(map.getString("publicKey"));
            arrayList.add(permissionObject);
        }
        return arrayList;
    }

    public ReadableMap signEthereumTransaction(ReadableMap readableMap, Wallet wallet) {
        String string = readableMap.getString("to");
        if (!string.equals("")) {
            new ETHAddressValidator(string).validate();
        }
        TxSignResult signTransaction = new EthereumTransaction(parseBigInt(readableMap, "nonce"), parseBigInt(readableMap, "gasPrice"), parseBigInt(readableMap, "gasLimit"), readableMap.getString("to"), parseBigInt(readableMap, "value"), readableMap.getString("data")).signTransaction(readableMap.getString("chainId"), readableMap.getString("password"), wallet);
        return new WritableMapBuilder().put("sign", signTransaction.getSignature()).put(CodePushConstants.PENDING_UPDATE_HASH_KEY, signTransaction.getTxHash()).toMap();
    }

    public Object signBitcoinTransaction(ReadableMap readableMap, Wallet wallet) {
        char c;
        TxSignResult signTransaction;
        TxSignResult signTransaction2;
        ArrayList arrayList = new ArrayList();
        int i = readableMap.getInt("internalUsed") + 1;
        String string = readableMap.getString("segWit");
        String string2 = readableMap.getString("to");
        long parseLong = Long.parseLong(readableMap.getString("amount"));
        long parseLong2 = Long.parseLong(readableMap.getString("fee"));
        ReadableMap map = readableMap.hasKey("extra") ? readableMap.getMap("extra") : null;
        String string3 = readableMap.getString("password");
        String string4 = readableMap.getString("chainId");
        int i2 = 0;
        for (ReadableArray array = readableMap.getArray("outputs"); i2 < array.size(); array = array) {
            ReadableMap map2 = array.getMap(i2);
            arrayList.add(new BitcoinTransaction.UTXO(map2.getString("txHash"), map2.getInt("vout"), Long.parseLong(map2.getString("amount")), map2.getString("address"), map2.getString("scriptPubKey"), map2.getString("derivedPath")));
            i2++;
        }
        String upperCase = (readableMap.hasKey("protocol") ? readableMap.getString("protocol") : ChainType.BITCOIN).toUpperCase();
        int hashCode = upperCase.hashCode();
        char c2 = 65535;
        if (hashCode != 2429977) {
            if (hashCode == 615278846 && upperCase.equals(ChainType.BITCOIN)) {
                c = 0;
            }
            c = 65535;
        } else {
            if (upperCase.equals("OMNI")) {
                c = 1;
            }
            c = 65535;
        }
        if (c == 0) {
            BitcoinTransaction bitcoinTransaction = new BitcoinTransaction(string2, i, parseLong, parseLong2, arrayList, map != null ? map.toHashMap() : null);
            if (Metadata.P2WPKH.equalsIgnoreCase(string)) {
                signTransaction = bitcoinTransaction.signSegWitTransaction(string4, string3, wallet);
            } else {
                signTransaction = bitcoinTransaction.signTransaction(string4, string3, wallet);
            }
            return serializeSignResult(signTransaction);
        }
        if (c == 1) {
            int i3 = map.getInt("propertyId");
            String upperCase2 = map.getString("feeMode").toUpperCase();
            int hashCode2 = upperCase2.hashCode();
            if (hashCode2 != 66097) {
                if (hashCode2 == 2614190 && upperCase2.equals("USDT")) {
                    c2 = 1;
                }
            } else if (upperCase2.equals("BTC")) {
                c2 = 0;
            }
            if (c2 == 0) {
                OmniTransaction omniTransaction = new OmniTransaction(string2, parseLong, parseLong2, i3, arrayList);
                if (Metadata.P2WPKH.equalsIgnoreCase(string)) {
                    signTransaction2 = omniTransaction.signSegWitTransaction(string4, string3, wallet);
                } else {
                    signTransaction2 = omniTransaction.signTransaction(string4, string3, wallet);
                }
                return serializeSignResult(signTransaction2);
            }
            if (c2 == 1) {
                List<TxSignResult> signServerPayFeeOmniTx = OmniTransaction.signServerPayFeeOmniTx(string2, parseLong, parseLong2, i3, Long.parseLong(map.getString("usdtFee")), map.getString("serverPubKey"), arrayList, string3, wallet);
                WritableArray createArray = sArgumentMapper.createArray();
                createArray.pushMap(serializeSignResult(signServerPayFeeOmniTx.get(0)));
                createArray.pushMap(serializeSignResult(signServerPayFeeOmniTx.get(1)));
                return createArray;
            }
            throw new TokenException("Unsupport fee mode");
        }
        throw new TokenException("Only support Bitcoin or omni network");
    }

    private WritableMap serializeSignResult(TxSignResult txSignResult) {
        return new WritableMapBuilder().put("sign", txSignResult.getSignature()).put(CodePushConstants.PENDING_UPDATE_HASH_KEY, txSignResult.getTxHash()).put("wtxID", txSignResult.getWtxID()).toMap();
    }

    public ReadableArray signEOSTransaction(ReadableMap readableMap, Wallet wallet) {
        List<EOSTransaction.ToSignObj> readEOSToSignObjs = readEOSToSignObjs(readableMap);
        return presentEOSSignResult(new EOSTransaction(readEOSToSignObjs).signTransactions(readableMap.getString("chainId"), readableMap.getString("password"), wallet));
    }

    public ReadableMap signCosmosTransaction(ReadableMap readableMap, Wallet wallet) {
        String string = readableMap.getString("password");
        long parseLong = Long.parseLong(readableMap.getString("accountNumber"));
        String string2 = readableMap.getString("chainId");
        String string3 = readableMap.getString("memo");
        long parseLong2 = Long.parseLong(readableMap.getString("sequence"));
        ReadableMap map = readableMap.getMap("fee");
        StdFee stdFee = new StdFee(parseCosmosCoins(map.getArray("amount")), Long.parseLong(map.getString("gas")));
        ArrayList arrayList = new ArrayList();
        ReadableArray array = readableMap.getArray("msgs");
        for (int i = 0; i < array.size(); i++) {
            arrayList.add(array.getMap(i).toHashMap());
        }
        try {
            return new WritableMapBuilder().put("sign", convertJsonToWritableMap(new JSONObject(new CosmosTransaction(parseLong, string2, stdFee, string3, arrayList, parseLong2).signTransaction(string2, string, wallet).getSignature()))).put(CodePushConstants.PENDING_UPDATE_HASH_KEY, "").toMap();
        } catch (JSONException unused) {
            throw new TokenException(Messages.UNKNOWN_ENCODE);
        }
    }

    private List<Coin> parseCosmosCoins(ReadableArray readableArray) {
        ArrayList arrayList = new ArrayList(readableArray.size());
        for (int i = 0; i < readableArray.size(); i++) {
            arrayList.add(parseCosmosCoin(readableArray.getMap(i)));
        }
        return arrayList;
    }

    private Coin parseCosmosCoin(ReadableMap readableMap) {
        return new Coin(readableMap.getString("denom"), Long.parseLong(readableMap.getString("amount")));
    }

    @ReactMethod
    public void getChannel(Promise promise) {
        asyncCall(new TokenBaseJavaModule.Callable() {
            @Override
            public Object call() {
                return WalleChannelReader.getChannel(MainApplication.getsInstance());
            }
        }, promise);
    }

    public ReadableMap transformToPasswordFreeMap(ReadableMap readableMap) {
        WritableMap createMap = sArgumentMapper.createMap();
        createMap.merge(readableMap);
        if (readableMap.hasKey("derivedKey") && !Strings.isNullOrEmpty(readableMap.getString("derivedKey"))) {
            String string = readableMap.getString("derivedKey");
            String bytesToHex = NumericUtil.bytesToHex(NumericUtil.generateRandomBytes(8));
            WalletManager.mustFindWalletById(readableMap.getString("id")).getKeystore().getCrypto().setCachedDerivedKey(new CachedDerivedKey(bytesToHex, NumericUtil.hexToBytes(string)));
            createMap.putString("password", bytesToHex);
        }
        return createMap;
    }
}