import { BigNumber, ethers } from "ethers";
import {
CallbackType,
triggerContractByContractName,
viewContractByContractName,
} from "@evo/utils/ethers/contractHelper";
import { TransactionResponse } from "@ethersproject/providers";
import { LandId } from "@evo/config/constants";
import { pad0xBegin } from "@evo/utils/common/utils";
/**
* Covert material Id to token Id.
* @param landId Land Id
* @param provider Provider
* @param id Material Id
* @param callback Callback
* @returns any
*/
export const materialIdEncode = async (
landId: LandId,
provider: ethers.providers.Provider,
id: string,
callback?: CallbackType
): Promise<string> => {
const results = await viewContractByContractName(landId, provider, "material", "encode", [id], callback);
return results.length ? (results[0] as BigNumber).toHexString() : ethers.utils.hexValue(0);
};
/**
* Batch get material balance
* @param landId Land Id
* @param provider Provider
* @param accounts Array of address
* @param materialIdList Material token ids
* @param callback Callback
* @returns any
*/
export const materialBalanceOfBatch = async (
landId: LandId,
provider: ethers.providers.Provider,
accounts: string[],
materialIdList: string[],
callback?: CallbackType
): Promise<string[]> => {
const [result] =
(await viewContractByContractName(
landId,
provider,
"material",
"balanceOfBatch",
[accounts, materialIdList.map((materialId) => pad0xBegin(materialId))],
callback
)) || [];
if (Array.isArray(result)) {
return result.map((item) => (BigNumber.isBigNumber(item) ? BigNumber.from(item).toString() : "0"));
}
return new Array(materialIdList.length).fill("0");
};
/**
* Batch transfer material
* @param landId Land Id
* @param signer Signer
* @param from Material owner
* @param to Recipient
* @param materialIdList Array of material token Ids
* @param amounts Array of transfer amounts
* @param data Additional data
* @param callback Callback
* @returns any
*/
export const materialBatchTransfer = (
landId: LandId,
signer: ethers.Signer,
from: string,
to: string,
materialIdList: string[],
amounts: string[],
data = "0x",
callback?: CallbackType
): Promise<TransactionResponse> => {
return triggerContractByContractName(
landId,
signer,
"material",
"safeBatchTransferFrom",
[from, to, materialIdList.map((materialId) => pad0xBegin(materialId)), amounts, data],
callback
);
};