diff --git a/src/config/chain_config.ts b/src/config/chain_config.ts index 30df9e8..050a86a 100644 --- a/src/config/chain_config.ts +++ b/src/config/chain_config.ts @@ -94,13 +94,13 @@ export const DEFALUT_TOKENS = { }, { type: "erc20", - address: "0x94247cc867ED6277b901AFED817F3b13962814eD", + address: "0x89c320c75520777AB36f4924cE57c65960370fE1", symbol: "CEC", decimal: 18, }, { type: "erc20", - address: "0x28901774C7C74D3C78a17A18697D7BFFB999d3f7", + address: "0x070a69230a08B93807c43a96327ff091aE7fC04D", symbol: "CEG", decimal: 18, }, @@ -223,9 +223,9 @@ export const JC_CONTRACTS = { chipLocker: "0x4Ef766854EE104053cF2D243620b7A643fCC2B54", }, 1338: { - nftMall: "0xC04F9c0461DA8C19a60c8d4C95733b12D51e6Eca", - evolveFactory: "0x54B6f621e8c8dD2Cfcd49f2E7aD1dF19E60bf4B9", - minterFactory: "0x4b848789f6994d24cAEfaB187fD6c8bE3E0B97cf", - chipLocker: "0xb288bA87a02d34ec827a15487633D11faB79b718", + nftMall: "0x24eB97E328d7D513a9eb4AA91206d0cF2Ab78Ee0", + evolveFactory: "0x12F2df43A6385B8D5D6730822A09a2D6c42b61c0", + minterFactory: "0x0Ca8A551544d39eb71BD0F70Af22e126C263409A", + chipLocker: "0x757dbc31BB286832d21C505F1D80FbcfF6756e49", }, }; diff --git a/src/config/constants.ts b/src/config/constants.ts index bca8c0e..b3252c9 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -1,3 +1,7 @@ export const WALLET_STORAGE_KEY_NAME = "jc_wallet_data"; -export const WALLET_API_HOST = "http://10.0.1.3:3007"; +export const WALLET_API_HOST = "https://wallet.cebggame.com"; + +export const MAX_TRY_COUNT = 6; + +export const MAX_UPLOAD_COUNT = 10; diff --git a/src/index.ts b/src/index.ts index 447bc6c..1c81e68 100644 --- a/src/index.ts +++ b/src/index.ts @@ -284,6 +284,13 @@ export default class JCWallet { return this.wConnect.accounts[0]; } } + public get currentAccAddr() { + if (this.walletType === WalletType.INTERNAL) { + return this.nativeAccount; + } else { + return this.wConnect.accounts[0]; + } + } get currentAccountData() { let address = this.currentAccount().address; @@ -317,7 +324,7 @@ export default class JCWallet { // const accountNew = newAccount(this.password, index); // const account = this.wallet.add(accountNew); const acc = this.web3.eth.accounts.privateKeyToAccount( - "0xd9ed33809372932059c1ba7b336a33f406b4c55e7430daef8297134c67429d60" + "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d" ); const account = this.wallet.add(acc); console.log("web3 account: " + JSON.stringify(this.wallet[0])); diff --git a/src/manage/WalletManage.ts b/src/manage/WalletManage.ts index 5a32437..70b5a0a 100644 --- a/src/manage/WalletManage.ts +++ b/src/manage/WalletManage.ts @@ -5,6 +5,8 @@ import { NativeSvr } from "../services/NativeSvr"; import { getWalletInfo, googleAuth, uploadWalletInfo } from "../api/WalletApi"; import { WalletEnv } from "../config/WalletEnv"; import { md5Hash, sha1Hash } from "../util/crypto.util"; +import { retry } from "../util/promise.util"; +import { MAX_TRY_COUNT, MAX_UPLOAD_COUNT } from "../config/constants"; export function newAccount(password: string, index: number) { const mnemonic = loadMnemonic(password); @@ -38,7 +40,7 @@ export async function loadInternalWallet() { } new WalletEnv().token = tokenRes.data.token; - let infoRes = await getWalletInfo(); + let infoRes = await retry(() => getWalletInfo(), MAX_TRY_COUNT); if (infoRes.errcode) { return; } @@ -50,19 +52,46 @@ export async function loadInternalWallet() { if (!infoRes.data.key) { let time = Date.now(); //@ts-ignore + console.log(jsb.generateWallet); + //@ts-ignore let strWallet = jsb.generateWallet(idHash, seedHash); console.log("generate wallet cost: " + (Date.now() - time) / 1000); console.log("native wallet info: " + strWallet); let walletInfo = JSON.parse(strWallet); address = walletInfo.address; setImmediate(function () { - uploadWalletInfo({ key: walletInfo.master }); + retry( + () => uploadWalletInfo({ key: walletInfo.master }), + MAX_UPLOAD_COUNT + ); }); } else { - //@ts-ignore - let strWallet = jsb.prepareWallet(idHash, seedHash, infoRes.data.key); - let walletInfo = JSON.parse(strWallet); - address = walletInfo.address; + let localSKey = localStorage.getItem("cebg_wallet_s_" + idHash); + let localBKey = localStorage.getItem("cebg_wallet_b_" + idHash); + if (localSKey || localBKey) { + //@ts-ignore + let strWallet = jsb.prepareWallet(idHash, seedHash, infoRes.data.key); + let walletInfo = JSON.parse(strWallet); + address = walletInfo.address; + } else { + let qrResult = await new NativeSvr().restoreKey(idHash); + //@ts-ignore + let strWallet = jsb.restoreWallet( + idHash, + seedHash, + infoRes.data.key, + qrResult + ); + console.log("restore native wallet info: " + strWallet); + let walletInfo = JSON.parse(strWallet); + address = walletInfo.address; + setImmediate(function () { + retry( + () => uploadWalletInfo({ key: walletInfo.master }), + MAX_UPLOAD_COUNT + ); + }); + } } return address; } diff --git a/src/services/NativeSvr.ts b/src/services/NativeSvr.ts index 07f0e55..fac2c2c 100644 --- a/src/services/NativeSvr.ts +++ b/src/services/NativeSvr.ts @@ -42,10 +42,17 @@ export class NativeSvr { return this._subscribeToCallResponse(id); } - public scanQRCode() { + public scanQRCode(title: string) { let id = payloadId(); //@ts-ignore - jsb.scanQRCode(id); + jsb.scanQRCode(id, title); + return this._subscribeToCallResponse(id); + } + + public restoreKey(oid: string) { + let id = payloadId(); + //@ts-ignore + jsb.restoreKey(id, oid); return this._subscribeToCallResponse(id); } } diff --git a/src/standards/JCStandard.ts b/src/standards/JCStandard.ts index b5bbc69..c451c18 100644 --- a/src/standards/JCStandard.ts +++ b/src/standards/JCStandard.ts @@ -25,7 +25,7 @@ export class JCStandard { let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].nftMall; const contract = new this.web3.eth.Contract(abiNftMall, address, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); //TODO:: increaseAllowance before call let gas = await contract.methods @@ -59,7 +59,7 @@ export class JCStandard { let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].nftMall; const contract = new this.web3.eth.Contract(abiNftMall, address, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); let gas = await contract.methods .buy1155NFT(addresses, values, ids, amounts, signature) @@ -92,7 +92,7 @@ export class JCStandard { let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].evolveFactory; const contract = new this.web3.eth.Contract(abiEvolveFactory, address, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); let gas = await contract.methods .evolve721NFT(nftAddress, tokenIds, startTime, nonce, signature) @@ -123,7 +123,7 @@ export class JCStandard { let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].evolveFactory; const contract = new this.web3.eth.Contract(abiEvolveFactory, address, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); let gas = await contract.methods .evolveChip(tokenIds, startTime, nonce, signature) @@ -156,7 +156,7 @@ export class JCStandard { let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].minterFactory; const contract = new this.web3.eth.Contract(abiMinterFactory, address, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); let gas = await contract.methods .mintShardBatchUser(tokenIds, amounts, startTime, nonce, signature) @@ -197,7 +197,7 @@ export class JCStandard { let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].minterFactory; const contract = new this.web3.eth.Contract(abiMinterFactory, address, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); let gas = await contract.methods .shardMixByUser( @@ -236,13 +236,13 @@ export class JCStandard { } async pluginChip({ - addreses, + addresses, values, chipIds, slots, signature, }: { - addreses: string[]; + addresses: string[]; values: string[]; chipIds: string[]; slots: string[]; @@ -252,12 +252,19 @@ export class JCStandard { JC_CONTRACTS[window.jc.wallet.currentChain.id].chipLocker; const contract = new this.web3.eth.Contract(abiChipLocker, lockerAddress, { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); - let chipInstance = new this.web3.eth.Contract(abiERC1155, addreses[1], { + let chipInstance = new this.web3.eth.Contract(abiERC1155, addresses[1], { //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); + //@ts-ignore + if (!jc.wallet.isInternal) { + setTimeout(() => { + // @ts-ignore + jumpToWallet(); + }, 1500); + } let gas1 = await chipInstance.methods .setApprovalForAll(lockerAddress, true) .estimateGas({ gas: 1000000 }); @@ -266,7 +273,7 @@ export class JCStandard { .send({ gas: (gas1 * 1.1) | 0 }); let gas0 = await contract.methods - .pluginChip(addreses, values, chipIds, slots, signature) + .pluginChip(addresses, values, chipIds, slots, signature) .estimateGas({ gas: 1000000 }); //@ts-ignore if (!jc.wallet.isInternal) { @@ -276,18 +283,18 @@ export class JCStandard { }, 1500); } return await contract.methods - .pluginChip(addreses, values, chipIds, slots, signature) + .pluginChip(addresses, values, chipIds, slots, signature) .send({ gas: (gas0 * 1.1) | 0 }); } async unplugChip({ - addreses, + addresses, values, chipIds, slots, signature, }: { - addreses: string[]; + addresses: string[]; values: string[]; chipIds: string[]; slots: string[]; @@ -297,15 +304,11 @@ export class JCStandard { JC_CONTRACTS[window.jc.wallet.currentChain.id].chipLocker; const contract = new this.web3.eth.Contract(abiChipLocker, lockerAddress, { //@ts-ignore - from: jc.wallet.currentAccount(), - }); - let chipInstance = new this.web3.eth.Contract(abiERC1155, addreses[1], { - //@ts-ignore - from: jc.wallet.currentAccount(), + from: jc.wallet.currentAccAddr, }); let gas0 = await contract.methods - .unplugChip(addreses, values, chipIds, slots, signature) + .unplugChip(addresses, values, chipIds, slots, signature) .estimateGas({ gas: 1000000 }); //@ts-ignore if (!jc.wallet.isInternal) { @@ -315,7 +318,7 @@ export class JCStandard { }, 1500); } return await contract.methods - .unplugChip(addreses, values, chipIds, slots, signature) + .unplugChip(addresses, values, chipIds, slots, signature) .send({ gas: (gas0 * 1.1) | 0 }); } } diff --git a/src/util/promise.util.ts b/src/util/promise.util.ts new file mode 100644 index 0000000..538a284 --- /dev/null +++ b/src/util/promise.util.ts @@ -0,0 +1,34 @@ +/** + * + * @param {Function} fn + * @param {number} maxRetries + * @param {any[]} errorWhiteList + * @param {number} retries + * @return {Promise} + */ +export function retry( + fn: Function, + maxRetries: number = 3, + errorWhiteList: any[] = [], + retries: number = 0 +) { + return new Promise((resolve, reject) => { + fn() + .then(resolve) + .catch((e: any) => { + if ( + (errorWhiteList.length == 0 || + errorWhiteList.indexOf(e.constructor) !== -1) && + retries++ < maxRetries + ) { + setTimeout(() => { + retry(fn, maxRetries, errorWhiteList, retries) + .then(resolve) + .catch((e2) => reject(e2)); + }, Math.floor(Math.random() * Math.pow(2, retries) * 400)); + } else { + reject(e); + } + }); + }); +}