增加promise retry机制
This commit is contained in:
parent
5b7a525641
commit
488d41e052
@ -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",
|
||||
},
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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]));
|
||||
|
@ -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 {
|
||||
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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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 });
|
||||
}
|
||||
}
|
||||
|
34
src/util/promise.util.ts
Normal file
34
src/util/promise.util.ts
Normal file
@ -0,0 +1,34 @@
|
||||
/**
|
||||
*
|
||||
* @param {Function} fn
|
||||
* @param {number} maxRetries
|
||||
* @param {any[]} errorWhiteList
|
||||
* @param {number} retries
|
||||
* @return {Promise<T>}
|
||||
*/
|
||||
export function retry<T = any>(
|
||||
fn: Function,
|
||||
maxRetries: number = 3,
|
||||
errorWhiteList: any[] = [],
|
||||
retries: number = 0
|
||||
) {
|
||||
return new Promise<T>((resolve, reject) => {
|
||||
fn()
|
||||
.then(resolve)
|
||||
.catch((e: any) => {
|
||||
if (
|
||||
(errorWhiteList.length == 0 ||
|
||||
errorWhiteList.indexOf(e.constructor) !== -1) &&
|
||||
retries++ < maxRetries
|
||||
) {
|
||||
setTimeout(() => {
|
||||
retry<T>(fn, maxRetries, errorWhiteList, retries)
|
||||
.then(resolve)
|
||||
.catch((e2) => reject(e2));
|
||||
}, Math.floor(Math.random() * Math.pow(2, retries) * 400));
|
||||
} else {
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user