@dahlia-labs/use-ethers
Version:
Multicall extensions to ethers.
73 lines • 2.86 kB
JavaScript
import { Token, TokenAmount } from "@dahlia-labs/token-utils";
import { Interface } from "@ethersproject/abi";
import ERC20_ABI from "./abis/erc20.json";
import { getContract } from "./contracts";
import { fetchMulticalls } from "./index";
export function getTokenInterface() {
return new Interface(ERC20_ABI);
}
export const tokenInterface = getTokenInterface();
export const getTokenContractFromAddress = (address, provider) => getContract(address, ERC20_ABI, provider);
export const getTokenContract = (token, provider) => getContract(token.address, ERC20_ABI, provider);
export const balanceOfMulticall = (token, address) => ({
call: {
target: token.address,
callData: tokenInterface.encodeFunctionData("balanceOf", [address]),
},
parseReturn: (returnData) => new TokenAmount(token, tokenInterface.decodeFunctionResult("balanceOf", returnData).toString()),
});
export const nameMulticall = (tokenAddress) => ({
call: {
target: tokenAddress,
callData: tokenInterface.encodeFunctionData("name"),
},
parseReturn: (returnData) => tokenInterface.decodeFunctionResult("name", returnData).toString(),
});
export const symbolMulticall = (tokenAddress) => ({
call: {
target: tokenAddress,
callData: tokenInterface.encodeFunctionData("symbol"),
},
parseReturn: (returnData) => tokenInterface.decodeFunctionResult("symbol", returnData).toString(),
});
export const decimalsMulticall = (tokenAddress) => ({
call: {
target: tokenAddress,
callData: tokenInterface.encodeFunctionData("decimals"),
},
parseReturn: (returnData) => +tokenInterface.decodeFunctionResult("decimals", returnData).toString(),
});
export const totalSupplyMulticall = (token) => ({
call: {
target: token.address,
callData: tokenInterface.encodeFunctionData("totalSupply"),
},
parseReturn: (returnData) => new TokenAmount(token, tokenInterface
.decodeFunctionResult("totalSupply", returnData)
.toString()),
});
export const allowanceMulticall = (token, address, spender) => ({
call: {
target: token.address,
callData: tokenInterface.encodeFunctionData("allowance", [
address,
spender,
]),
},
parseReturn: (returnData) => new TokenAmount(token, tokenInterface.decodeFunctionResult("allowance", returnData).toString()),
});
export const getToken = async (multicallContract, address, chainId) => {
const multicallData = await fetchMulticalls([
nameMulticall(address),
symbolMulticall(address),
decimalsMulticall(address),
], multicallContract);
return new Token({
chainId,
address,
name: multicallData[0],
symbol: multicallData[1],
decimals: multicallData[2],
});
};
//# sourceMappingURL=token.js.map