一些跟链交互的方法增加估算gas消耗的功能

This commit is contained in:
cebgcontract 2022-12-16 15:49:01 +08:00
parent 06a91b3e36
commit 86822fcad9
6 changed files with 357 additions and 157 deletions

View File

@ -21,7 +21,6 @@ import { WALLET_STORAGE_KEY_NAME } from "./config/constants";
import { DEFALUT_TOKENS } from "./config/chain_config";
import {
loadInternalWallet,
newMnemonic,
restoreWalletByMnemonic,
} from "./manage/WalletManage";
import { buildLoginSignMsg, signLogin } from "./util/sign.util";
@ -32,6 +31,7 @@ import { getJCErc721Info, getTypeByAddress, UNKNOW } from "./util/chain.util";
import { JCStandard } from "./standards/JCStandard";
import { NativeSvr } from "./services/NativeSvr";
import { ChainCommon } from "./standards/ChainCommon";
import { fromTokenMinimalUnit } from "./util/number.util";
var global =
(typeof globalThis !== "undefined" && globalThis) ||
@ -393,7 +393,14 @@ export default class JCWallet {
return address;
}
public async sendEth(to: string, amount: number | string) {
public async generateGasShow(gas: any) {
let price = await this.web3.eth.getGasPrice();
let ehtBN = this.web3.utils.toBN(price).mul(this.web3.utils.toBN(gas));
let eth = fromTokenMinimalUnit(ehtBN, 18);
return { gas, price, eth };
}
public async sendEth(to: string, amount: number | string, estimate: number) {
let from = this.currentAccAddr;
const amountToSend = this.web3.utils.toWei(amount + "", "ether");
let gas = await this.web3.eth.estimateGas({
@ -401,7 +408,15 @@ export default class JCWallet {
to,
value: amountToSend,
});
this.web3.eth.sendTransaction({ from, to, gas, value: amountToSend });
if (estimate) {
return this.generateGasShow(gas);
}
return this.web3.eth.sendTransaction({
from,
to,
gas,
value: amountToSend,
});
}
public async getBalance(account?: string) {
@ -470,13 +485,19 @@ export default class JCWallet {
return result;
}
public async sendErc20(address: string, to: string, amount: string) {
public async sendErc20(
address: string,
to: string,
amount: string,
estimate: number
) {
let from = this.currentAccAddr;
let result = await this.erc20Standard.transfer({
address,
from,
to,
amount,
estimate,
});
return result;
}
@ -544,15 +565,20 @@ export default class JCWallet {
return nfts;
}
public async sendNFT(address: string, to: string, tokenId: string) {
public async sendNFT(
address: string,
to: string,
tokenId: string,
estimate: number
) {
let from = this.currentAccAddr;
let result = await this.erc721Standard.transfer({
return this.erc721Standard.transfer({
address,
from,
to,
tokenId,
estimate,
});
return result;
}
public async erc1155Info(address: string) {}
@ -562,8 +588,24 @@ export default class JCWallet {
account = this.currentAccAddr;
}
}
//TODO::
public async sendErc1155() {}
public async sendErc1155(
address: string,
to: string,
tokenIds: string[],
amounts: string[],
estimate: number
) {
let from = this.currentAccAddr;
return this.erc1155Standard.transferBatch({
address,
from,
to,
tokenIds,
amounts,
estimate,
});
}
}
// window.jc = window.jc || {wallet: new JCWallet()};

View File

@ -1,6 +1,8 @@
import Web3 from "web3";
import { BN } from "ethereumjs-util";
export const SAMPLE_GAS = 1000000;
export class ChainCommon {
private web3: Web3;

View File

@ -1,14 +1,12 @@
import Web3 from "web3";
import { abiERC1155 } from "../abis/abiERC1155";
import { timeoutFetch } from "../util/net.util";
import { getFormattedIpfsUrl } from "../util/wallet.util";
import Web3 from 'web3';
import { abiERC1155 } from '../abis/abiERC1155';
import { timeoutFetch } from '../util/net.util';
import { getFormattedIpfsUrl } from '../util/wallet.util';
export const ERC1155 = 'ERC1155';
export const ERC1155_INTERFACE_ID = '0xd9b67a26';
export const ERC1155_METADATA_URI_INTERFACE_ID = '0x0e89341c';
export const ERC1155_TOKEN_RECEIVER_INTERFACE_ID = '0x4e2312e0';
export const ERC1155 = "ERC1155";
export const ERC1155_INTERFACE_ID = "0xd9b67a26";
export const ERC1155_METADATA_URI_INTERFACE_ID = "0x0e89341c";
export const ERC1155_TOKEN_RECEIVER_INTERFACE_ID = "0x4e2312e0";
export class ERC1155Standard {
private web3: Web3;
@ -24,11 +22,11 @@ export class ERC1155Standard {
* @returns Promise resolving to whether the contract implements ERC1155 URI Metadata interface.
*/
contractSupportsURIMetadataInterface = async (
address: string,
address: string
): Promise<boolean> => {
return this.contractSupportsInterface(
address,
ERC1155_METADATA_URI_INTERFACE_ID,
ERC1155_METADATA_URI_INTERFACE_ID
);
};
@ -39,11 +37,11 @@ export class ERC1155Standard {
* @returns Promise resolving to whether the contract implements ERC1155 Token Receiver interface.
*/
contractSupportsTokenReceiverInterface = async (
address: string,
address: string
): Promise<boolean> => {
return this.contractSupportsInterface(
address,
ERC1155_TOKEN_RECEIVER_INTERFACE_ID,
ERC1155_TOKEN_RECEIVER_INTERFACE_ID
);
};
@ -54,7 +52,7 @@ export class ERC1155Standard {
* @returns Promise resolving to whether the contract implements the base ERC1155 interface.
*/
contractSupportsBase1155Interface = async (
address: string,
address: string
): Promise<boolean> => {
return this.contractSupportsInterface(address, ERC1155_INTERFACE_ID);
};
@ -69,14 +67,16 @@ export class ERC1155Standard {
getTokenURI = async (address: string, tokenId: string): Promise<string> => {
const contract = new this.web3.eth.Contract(abiERC1155, address);
return new Promise<string>((resolve, reject) => {
contract.methods.tokenURI(tokenId).call( (error: Error, result: string) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
});
contract.methods
.tokenURI(tokenId)
.call((error: Error, result: string) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
});
});
};
@ -91,18 +91,22 @@ export class ERC1155Standard {
getBalanceOf = async (
contractAddress: string,
address: string,
tokenId: string,
tokenId: string
): Promise<number> => {
const contract = new this.web3.eth.Contract(abiERC1155, address);
return new Promise<number>((resolve, reject) => {
contract.methods.balanceOf(address, tokenId, (error: Error, result: number) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
contract.methods.balanceOf(
address,
tokenId,
(error: Error, result: number) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
}
resolve(result);
});
);
});
};
@ -123,7 +127,7 @@ export class ERC1155Standard {
from: string,
to: string,
id: string,
value: string,
value: string
): Promise<void> => {
const contract = new this.web3.eth.Contract(abiERC1155, operator);
return new Promise<void>((resolve, reject) => {
@ -140,7 +144,7 @@ export class ERC1155Standard {
return;
}
resolve(result);
},
}
);
});
};
@ -154,7 +158,7 @@ export class ERC1155Standard {
*/
private contractSupportsInterface = async (
address: string,
interfaceId: string,
interfaceId: string
): Promise<boolean> => {
const contract = new this.web3.eth.Contract(abiERC1155, address);
return new Promise<boolean>((resolve, reject) => {
@ -167,7 +171,7 @@ export class ERC1155Standard {
return;
}
resolve(result);
},
}
);
});
};
@ -183,7 +187,7 @@ export class ERC1155Standard {
getDetails = async (
address: string,
ipfsGateway: string,
tokenId?: string,
tokenId?: string
): Promise<{
standard: string;
tokenURI: string | undefined;
@ -198,7 +202,7 @@ export class ERC1155Standard {
if (tokenId) {
tokenURI = await this.getTokenURI(address, tokenId);
if (tokenURI.startsWith('ipfs://')) {
if (tokenURI.startsWith("ipfs://")) {
tokenURI = getFormattedIpfsUrl(ipfsGateway, tokenURI, true);
}
@ -206,7 +210,7 @@ export class ERC1155Standard {
const response = await timeoutFetch(tokenURI);
const object = await response.json();
image = object?.image;
if (image?.startsWith('ipfs://')) {
if (image?.startsWith("ipfs://")) {
image = getFormattedIpfsUrl(ipfsGateway, image, true);
}
} catch {
@ -221,4 +225,39 @@ export class ERC1155Standard {
image,
};
};
async transferBatch({
address,
from,
to,
tokenIds,
amounts,
gas,
estimate,
}: {
address: string;
from: string;
to: string;
tokenIds: string[];
amounts: string[];
gas?: number;
estimate: number;
}) {
const contract = new this.web3.eth.Contract(abiERC1155, address);
if (!gas) {
gas = await contract.methods
.safeBatchTransferFrom(from, to, tokenIds, amounts)
.estimateGas({ gas: 1000000 });
}
gas = gas * 1.1;
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
return contract.methods
.safeBatchTransferFrom(from, to, tokenIds, amounts)
.send({
from,
gas,
});
}
}

View File

@ -146,18 +146,29 @@ export class ERC20Standard {
to,
amount,
gas,
estimate,
}: {
address: string;
from: string;
to: string;
amount: number | string;
gas?: number;
estimate: number;
}) {
const contract = new this.web3.eth.Contract(abiERC20, address);
const amountBN = Web3.utils.toBN(Web3.utils.toWei(amount + ""));
if (!gas) {
gas = await contract.methods
.transfer(to, amountBN)
.estimateGas({ gas: 1000000 });
}
gas = gas * 1.1;
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
return contract.methods.transfer(to, amountBN).send({
from,
gas: gas || 1000000,
gas,
});
}
}

View File

@ -1,13 +1,12 @@
import Web3 from 'web3';
import Web3 from "web3";
import { abiERC721 } from "../abis/abiERC721";
import { timeoutFetch } from '../util/net.util';
import { getFormattedIpfsUrl } from '../util/wallet.util';
import { timeoutFetch } from "../util/net.util";
import { getFormattedIpfsUrl } from "../util/wallet.util";
export const ERC721 = 'ERC721';
export const ERC721_INTERFACE_ID = '0x80ac58cd';
export const ERC721_METADATA_INTERFACE_ID = '0x5b5e139f';
export const ERC721_ENUMERABLE_INTERFACE_ID = '0x780e9d63';
export const ERC721 = "ERC721";
export const ERC721_INTERFACE_ID = "0x80ac58cd";
export const ERC721_METADATA_INTERFACE_ID = "0x5b5e139f";
export const ERC721_ENUMERABLE_INTERFACE_ID = "0x780e9d63";
export class ERC721Standard {
private web3: Web3;
@ -23,11 +22,11 @@ export class ERC721Standard {
* @returns Promise resolving to whether the contract implements ERC721Metadata interface.
*/
contractSupportsMetadataInterface = async (
address: string,
address: string
): Promise<boolean> => {
return this.contractSupportsInterface(
address,
ERC721_METADATA_INTERFACE_ID,
ERC721_METADATA_INTERFACE_ID
);
};
@ -38,11 +37,11 @@ export class ERC721Standard {
* @returns Promise resolving to whether the contract implements ERC721Enumerable interface.
*/
contractSupportsEnumerableInterface = async (
address: string,
address: string
): Promise<boolean> => {
return this.contractSupportsInterface(
address,
ERC721_ENUMERABLE_INTERFACE_ID,
ERC721_ENUMERABLE_INTERFACE_ID
);
};
@ -53,7 +52,7 @@ export class ERC721Standard {
* @returns Promise resolving to whether the contract implements ERC721 interface.
*/
contractSupportsBase721Interface = async (
address: string,
address: string
): Promise<boolean> => {
return this.contractSupportsInterface(address, ERC721_INTERFACE_ID);
};
@ -69,21 +68,20 @@ export class ERC721Standard {
getCollectibleTokenId = async (
address: string,
selectedAddress: string,
index: number,
index: number
): Promise<string> => {
const contract = new this.web3.eth.Contract(abiERC721, address);
return new Promise<string>((resolve, reject) => {
contract.methods.tokenOfOwnerByIndex(
selectedAddress,
index).call((error: Error, result: string) => {
contract.methods
.tokenOfOwnerByIndex(selectedAddress, index)
.call((error: Error, result: string) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
},
);
});
});
};
@ -93,16 +91,16 @@ export class ERC721Standard {
): Promise<number> => {
const contract = new this.web3.eth.Contract(abiERC721, address);
return new Promise<number>((resolve, reject) => {
contract.methods.balanceOf(
selectedAddress).call((error: Error, result: number) => {
contract.methods
.balanceOf(selectedAddress)
.call((error: Error, result: number) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
},
);
});
});
};
@ -116,20 +114,22 @@ export class ERC721Standard {
getTokenURI = async (address: string, tokenId: string): Promise<string> => {
const contract = new this.web3.eth.Contract(abiERC721, address);
const supportsMetadata = await this.contractSupportsMetadataInterface(
address,
address
);
if (!supportsMetadata) {
throw new Error('Contract does not support ERC721 metadata interface.');
throw new Error("Contract does not support ERC721 metadata interface.");
}
return new Promise<string>((resolve, reject) => {
contract.methods.tokenURI(tokenId).call( (error: Error, result: string) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
});
contract.methods
.tokenURI(tokenId)
.call((error: Error, result: string) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
});
});
};
@ -183,7 +183,7 @@ export class ERC721Standard {
async getOwnerOf(address: string, tokenId: string): Promise<string> {
const contract = new this.web3.eth.Contract(abiERC721, address);
return new Promise<string>((resolve, reject) => {
contract.methods.ownerOf(tokenId).call( (error: Error, result: string) => {
contract.methods.ownerOf(tokenId).call((error: Error, result: string) => {
/* istanbul ignore if */
if (error) {
reject(error);
@ -203,20 +203,20 @@ export class ERC721Standard {
*/
private contractSupportsInterface = async (
address: string,
interfaceId: string,
interfaceId: string
): Promise<boolean> => {
const contract = new this.web3.eth.Contract(abiERC721, address);
return new Promise<boolean>((resolve, reject) => {
contract.methods.supportsInterface(
interfaceId).call((error: Error, result: boolean) => {
contract.methods
.supportsInterface(interfaceId)
.call((error: Error, result: boolean) => {
/* istanbul ignore if */
if (error) {
reject(error);
return;
}
resolve(result);
},
);
});
});
};
@ -231,7 +231,7 @@ export class ERC721Standard {
getDetails = async (
address: string,
ipfsGateway: string,
tokenId?: string,
tokenId?: string
): Promise<{
standard: string;
tokenURI: string | undefined;
@ -262,14 +262,14 @@ export class ERC721Standard {
if (tokenId) {
try {
tokenURI = await this.getTokenURI(address, tokenId);
if (tokenURI.startsWith('ipfs://')) {
if (tokenURI.startsWith("ipfs://")) {
tokenURI = getFormattedIpfsUrl(ipfsGateway, tokenURI, true);
}
const response = await timeoutFetch(tokenURI);
const object = await response.json();
image = object ? object.image : ''
if (image.startsWith('ipfs://')) {
image = object ? object.image : "";
if (image.startsWith("ipfs://")) {
image = getFormattedIpfsUrl(ipfsGateway, image, true);
}
} catch {
@ -286,24 +286,34 @@ export class ERC721Standard {
};
};
async transfer({
address,
from,
to,
tokenId,
gas,
estimate,
}: {
address: string;
from: string;
to: string;
tokenId: string;
gas?: number;
estimate: number;
}) {
const contract = new this.web3.eth.Contract(abiERC721, address);
if (!gas) {
gas = await contract.methods
.safeTransferFrom(from, to, tokenId)
.estimateGas({ gas: 1000000 });
}
gas = gas * 1.1;
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
return contract.methods.safeTransferFrom(from, to, tokenId).send({
from,
gas: gas || 1000000,
gas,
});
}
}
}

View File

@ -5,6 +5,7 @@ import { abiERC1155 } from "../abis/abiERC1155";
import { abiEvolveFactory } from "../abis/abiUserEvolveFactory";
import { abiMinterFactory } from "../abis/abiUserMinterFactory";
import { JC_CONTRACTS } from "../config/chain_config";
import { SAMPLE_GAS } from "./ChainCommon";
export class JCStandard {
private web3: Web3;
@ -17,28 +18,33 @@ export class JCStandard {
addresses,
values,
signature,
gas,
estimate,
}: {
addresses: string[];
values: string[];
signature: string;
gas?: number;
estimate: number;
}) {
let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].nftMall;
const contract = new this.web3.eth.Contract(abiNftMall, address, {
//@ts-ignore
from: jc.wallet.currentAccAddr,
});
//TODO:: increaseAllowance before call
let gas;
try {
gas = await contract.methods
.buy721NFT(addresses, values, signature)
.estimateGas({ gas: 1000000 });
} catch (err) {
console.log("estimategas with error: " + JSON.stringify(err));
if (!gas) {
try {
gas = await contract.methods
.buy721NFT(addresses, values, signature)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
gas = gas || 1000000;
//@ts-ignore
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
//@ts-ignore
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
@ -55,7 +61,7 @@ export class JCStandard {
}
return contract.methods
.buy721NFT(addresses, values, signature)
.send({ gas: (gas * 1.1) | 0 });
.send({ gas });
}
async buyNft1155({
@ -64,24 +70,36 @@ export class JCStandard {
ids,
amounts,
signature,
gas,
estimate,
}: {
addresses: string[];
values: string[];
ids: string[];
amounts: string[];
signature: string;
gas?: number;
estimate: number;
}) {
let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].nftMall;
const contract = new this.web3.eth.Contract(abiNftMall, address, {
//@ts-ignore
from: jc.wallet.currentAccAddr,
});
let gas = await contract.methods
.buy1155NFT(addresses, values, ids, amounts, signature)
.estimateGas({ gas: 1000000 });
gas = gas || 1000000;
if (!gas) {
try {
gas = await contract.methods
.buy1155NFT(addresses, values, ids, amounts, signature)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
//@ts-ignore
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
//@ts-ignore
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
@ -97,7 +115,7 @@ export class JCStandard {
}
return contract.methods
.buy1155NFT(addresses, values, ids, amounts, signature)
.send({ gas: (gas * 1.1) | 0 });
.send({ gas });
}
async evolve721NFT({
@ -106,24 +124,36 @@ export class JCStandard {
startTime,
nonce,
signature,
gas,
estimate,
}: {
nftAddress: string;
tokenIds: string[];
startTime: number;
nonce: string;
signature: string;
gas?: number;
estimate: number;
}) {
let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].evolveFactory;
const contract = new this.web3.eth.Contract(abiEvolveFactory, address, {
//@ts-ignore
from: jc.wallet.currentAccAddr,
});
let gas = await contract.methods
.evolve721NFT(nftAddress, tokenIds, startTime, nonce, signature)
.estimateGas({ gas: 1000000 });
gas = gas || 1000000;
if (!gas) {
try {
gas = await contract.methods
.evolve721NFT(nftAddress, tokenIds, startTime, nonce, signature)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
//@ts-ignore
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
//@ts-ignore
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
@ -147,23 +177,35 @@ export class JCStandard {
startTime,
nonce,
signature,
gas,
estimate,
}: {
tokenIds: string[];
startTime: number;
nonce: string;
signature: string;
gas?: number;
estimate: number;
}) {
let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].evolveFactory;
const contract = new this.web3.eth.Contract(abiEvolveFactory, address, {
//@ts-ignore
from: jc.wallet.currentAccAddr,
});
let gas = await contract.methods
.evolveChip(tokenIds, startTime, nonce, signature)
.estimateGas({ gas: 1000000 });
gas = gas || 1000000;
if (gas) {
try {
gas = await contract.methods
.evolveChip(tokenIds, startTime, nonce, signature)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
//@ts-ignore
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
//@ts-ignore
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
@ -179,7 +221,7 @@ export class JCStandard {
}
return contract.methods
.evolveChip(tokenIds, startTime, nonce, signature)
.send({ gas: (gas * 1.1) | 0 });
.send({ gas });
}
async mintShardBatchUser({
@ -188,24 +230,36 @@ export class JCStandard {
startTime,
nonce,
signature,
gas,
estimate,
}: {
tokenIds: string[];
amounts: number[];
startTime: number;
nonce: string;
signature: string;
gas?: number;
estimate: number;
}) {
let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].minterFactory;
const contract = new this.web3.eth.Contract(abiMinterFactory, address, {
//@ts-ignore
from: jc.wallet.currentAccAddr,
});
let gas = await contract.methods
.mintShardBatchUser(tokenIds, amounts, startTime, nonce, signature)
.estimateGas({ gas: 1000000 });
gas = gas || 1000000;
if (!gas) {
try {
gas = await contract.methods
.mintShardBatchUser(tokenIds, amounts, startTime, nonce, signature)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
//@ts-ignore
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
//@ts-ignore
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
@ -221,7 +275,7 @@ export class JCStandard {
}
return contract.methods
.mintShardBatchUser(tokenIds, amounts, startTime, nonce, signature)
.send({ gas: (gas * 1.1) | 0 });
.send({ gas });
}
async shardMixByUser({
@ -234,6 +288,8 @@ export class JCStandard {
startTime,
nonce,
signature,
gas,
estimate,
}: {
tokenId: string;
nftType: number;
@ -244,28 +300,38 @@ export class JCStandard {
startTime: number;
nonce: string;
signature: string;
gas?: number;
estimate: number;
}) {
let address = JC_CONTRACTS[window.jc.wallet.currentChain.id].minterFactory;
const contract = new this.web3.eth.Contract(abiMinterFactory, address, {
//@ts-ignore
from: jc.wallet.currentAccAddr,
});
let gas = await contract.methods
.shardMixByUser(
tokenId,
nftType,
payToken,
payAmount,
ids,
amounts,
startTime,
nonce,
signature
)
.estimateGas({ gas: 1000000 });
gas = gas || 1000000;
if (!gas) {
try {
let gas = await contract.methods
.shardMixByUser(
tokenId,
nftType,
payToken,
payAmount,
ids,
amounts,
startTime,
nonce,
signature
)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
//@ts-ignore
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
//@ts-ignore
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
@ -292,7 +358,7 @@ export class JCStandard {
nonce,
signature
)
.send({ gas: (gas * 1.1) | 0 });
.send({ gas });
}
async pluginChip({
@ -301,12 +367,16 @@ export class JCStandard {
chipIds,
slots,
signature,
gas,
estimate,
}: {
addresses: string[];
values: string[];
chipIds: string[];
slots: string[];
signature: string;
gas?: number;
estimate: number;
}) {
let lockerAddress =
JC_CONTRACTS[window.jc.wallet.currentChain.id].chipLocker;
@ -322,11 +392,31 @@ export class JCStandard {
jumpToWallet();
}, 1500);
}
let gas1 = await chipInstance.methods
.setApprovalForAll(lockerAddress, true)
.estimateGas({ gas: 1000000 });
gas1 = gas1 || 1000000;
let gas1 = SAMPLE_GAS;
let gas0 = SAMPLE_GAS;
try {
gas1 = await chipInstance.methods
.setApprovalForAll(lockerAddress, true)
.estimateGas({ gas: SAMPLE_GAS });
gas0 = await contract.methods
.pluginChip(addresses, values, chipIds, slots, signature)
.estimateGas({ gas: SAMPLE_GAS });
} catch (err) {}
if (!gas) {
gas1 = gas1 ? gas1 * 1.1 : SAMPLE_GAS;
gas0 = gas0 ? gas0 * 1.1 : SAMPLE_GAS;
gas = gas0 + gas1;
} else {
gas0 = gas - gas1;
}
if (gas < gas1) {
throw "gas is too low";
}
if (jc.wallet.isInternal) {
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas1);
if (!ethEnough) {
throw "eth not enough";
@ -334,12 +424,8 @@ export class JCStandard {
}
await chipInstance.methods
.setApprovalForAll(lockerAddress, true)
.send({ gas: (gas1 * 1.1) | 0 });
.send({ gas: gas1 });
let gas0 = await contract.methods
.pluginChip(addresses, values, chipIds, slots, signature)
.estimateGas({ gas: 1000000 });
gas0 = gas0 || 1000000;
if (jc.wallet.isInternal) {
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas0);
if (!ethEnough) {
@ -354,7 +440,7 @@ export class JCStandard {
}
return await contract.methods
.pluginChip(addresses, values, chipIds, slots, signature)
.send({ gas: (gas0 * 1.1) | 0 });
.send({ gas: gas0 });
}
async unplugChip({
@ -363,28 +449,38 @@ export class JCStandard {
chipIds,
slots,
signature,
gas,
estimate,
}: {
addresses: string[];
values: string[];
chipIds: string[];
slots: string[];
signature: string;
gas?: number;
estimate: number;
}) {
let lockerAddress =
JC_CONTRACTS[window.jc.wallet.currentChain.id].chipLocker;
const contract = new this.web3.eth.Contract(abiChipLocker, lockerAddress, {
from: jc.wallet.currentAccAddr,
});
let gas0 = 1000000;
try {
gas0 = await contract.methods
.unplugChip(addresses, values, chipIds, slots, signature)
.estimateGas({ gas: 1000000 });
} catch (err) {
console.log(err);
if (!gas) {
try {
gas = await contract.methods
.unplugChip(addresses, values, chipIds, slots, signature)
.estimateGas({ gas: 1000000 });
} catch (err) {
console.log(err);
}
gas = gas ? gas * 1.1 : SAMPLE_GAS;
}
if (jc.wallet.isInternal) {
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas0);
if (estimate) {
return jc.wallet.generateGasShow(gas);
}
let ethEnough = await jc.wallet.chainCommon.checkEthEnough(gas);
if (!ethEnough) {
throw "eth not enough";
}
@ -397,6 +493,6 @@ export class JCStandard {
}
return await contract.methods
.unplugChip(addresses, values, chipIds, slots, signature)
.send({ gas: (gas0 * 1.1) | 0 });
.send({ gas });
}
}