@kodex-data/multicall
Version:
`@kodex-data/multicall` is a JavaScript library that allows you to batch multiple Ethereum read-only calls into a single request, reducing the number of RPC calls and improving performance. It supports the `eth_call` method and the `multicall` contract, w
1,117 lines (1,106 loc) • 38.8 kB
JavaScript
import '@kodex-data/prototypes';
import { Interface, AbiCoder } from '@ethersproject/abi';
import { BigNumber } from '@ethersproject/bignumber';
import { Contract } from '@ethersproject/contracts';
import { ContractFactory, utils, Contract as Contract$1 } from 'ethers';
import BignumberJS from 'bignumber.js';
import { WebSocketProvider, IpcProvider } from '@ethersproject/providers';
import { isObject } from 'lodash';
export { isEmpty, isObject } from 'lodash';
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
const MulticallAbi = [
{
constant: true,
inputs: [
{
components: [
{ internalType: 'address', name: 'target', type: 'address' },
{ internalType: 'bytes', name: 'callData', type: 'bytes' }
],
internalType: 'struct Multicall.Call[]',
name: 'calls',
type: 'tuple[]'
}
],
name: 'aggregate',
outputs: [
{ internalType: 'uint256', name: 'blockNumber', type: 'uint256' },
{ internalType: 'bytes[]', name: 'returnData', type: 'bytes[]' }
],
payable: false,
stateMutability: 'view',
type: 'function'
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [
{ type: 'uint256', name: 'blockNumber', internalType: 'uint256' },
{ type: 'bytes32', name: 'blockHash', internalType: 'bytes32' },
{
type: 'tuple[]',
name: 'returnData',
internalType: 'struct Multicall2.Result[]',
components: [
{ type: 'bool', name: 'success', internalType: 'bool' },
{ type: 'bytes', name: 'returnData', internalType: 'bytes' }
]
}
],
name: 'blockAndAggregate',
inputs: [
{
type: 'tuple[]',
name: 'calls',
internalType: 'struct Multicall2.Call[]',
components: [
{ type: 'address', name: 'target', internalType: 'address' },
{ type: 'bytes', name: 'callData', internalType: 'bytes' }
]
}
],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'bytes32', name: 'blockHash', internalType: 'bytes32' }],
name: 'getBlockHash',
inputs: [{ type: 'uint256', name: 'blockNumber', internalType: 'uint256' }],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'uint256', name: 'blockNumber', internalType: 'uint256' }],
name: 'getBlockNumber',
inputs: [],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'address', name: 'coinbase', internalType: 'address' }],
name: 'getCurrentBlockCoinbase',
inputs: [],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'uint256', name: 'difficulty', internalType: 'uint256' }],
name: 'getCurrentBlockDifficulty',
inputs: [],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'uint256', name: 'gaslimit', internalType: 'uint256' }],
name: 'getCurrentBlockGasLimit',
inputs: [],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'uint256', name: 'timestamp', internalType: 'uint256' }],
name: 'getCurrentBlockTimestamp',
inputs: [],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'uint256', name: 'balance', internalType: 'uint256' }],
name: 'getEthBalance',
inputs: [{ type: 'address', name: 'addr', internalType: 'address' }],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [{ type: 'bytes32', name: 'blockHash', internalType: 'bytes32' }],
name: 'getLastBlockHash',
inputs: [],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [
{
type: 'tuple[]',
name: 'returnData',
internalType: 'struct Multicall2.Result[]',
components: [
{ type: 'bool', name: 'success', internalType: 'bool' },
{ type: 'bytes', name: 'returnData', internalType: 'bytes' }
]
}
],
name: 'tryAggregate',
inputs: [
{ type: 'bool', name: 'requireSuccess', internalType: 'bool' },
{
type: 'tuple[]',
name: 'calls',
internalType: 'struct Multicall2.Call[]',
components: [
{ type: 'address', name: 'target', internalType: 'address' },
{ type: 'bytes', name: 'callData', internalType: 'bytes' }
]
}
],
constant: true
},
{
type: 'function',
stateMutability: 'view',
payable: false,
outputs: [
{ type: 'uint256', name: 'blockNumber', internalType: 'uint256' },
{ type: 'bytes32', name: 'blockHash', internalType: 'bytes32' },
{
type: 'tuple[]',
name: 'returnData',
internalType: 'struct Multicall2.Result[]',
components: [
{ type: 'bool', name: 'success', internalType: 'bool' },
{ type: 'bytes', name: 'returnData', internalType: 'bytes' }
]
}
],
name: 'tryBlockAndAggregate',
inputs: [
{ type: 'bool', name: 'requireSuccess', internalType: 'bool' },
{
type: 'tuple[]',
name: 'calls',
internalType: 'struct Multicall2.Call[]',
components: [
{ type: 'address', name: 'target', internalType: 'address' },
{ type: 'bytes', name: 'callData', internalType: 'bytes' }
]
}
],
constant: true
}
];
const ERC20Abi = [
{
anonymous: false,
inputs: [
{
indexed: true,
internalType: 'address',
name: 'owner',
type: 'address'
},
{
indexed: true,
internalType: 'address',
name: 'spender',
type: 'address'
},
{
indexed: false,
internalType: 'uint256',
name: 'value',
type: 'uint256'
}
],
name: 'Approval',
type: 'event'
},
{
anonymous: false,
inputs: [
{
indexed: true,
internalType: 'address',
name: 'from',
type: 'address'
},
{
indexed: true,
internalType: 'address',
name: 'to',
type: 'address'
},
{
indexed: false,
internalType: 'uint256',
name: 'value',
type: 'uint256'
}
],
name: 'Transfer',
type: 'event'
},
{
inputs: [],
name: 'DOMAIN_SEPARATOR',
outputs: [
{
internalType: 'bytes32',
name: '',
type: 'bytes32'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'owner',
type: 'address'
},
{
internalType: 'address',
name: 'spender',
type: 'address'
}
],
name: 'allowance',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'spender',
type: 'address'
},
{
internalType: 'uint256',
name: 'amount',
type: 'uint256'
}
],
name: 'approve',
outputs: [
{
internalType: 'bool',
name: '',
type: 'bool'
}
],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'account',
type: 'address'
}
],
name: 'balanceOf',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [],
name: 'decimals',
outputs: [
{
internalType: 'uint8',
name: '',
type: 'uint8'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'spender',
type: 'address'
},
{
internalType: 'uint256',
name: 'subtractedValue',
type: 'uint256'
}
],
name: 'decreaseAllowance',
outputs: [
{
internalType: 'bool',
name: '',
type: 'bool'
}
],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'spender',
type: 'address'
},
{
internalType: 'uint256',
name: 'addedValue',
type: 'uint256'
}
],
name: 'increaseAllowance',
outputs: [
{
internalType: 'bool',
name: '',
type: 'bool'
}
],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [],
name: 'name',
outputs: [
{
internalType: 'string',
name: '',
type: 'string'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'owner',
type: 'address'
}
],
name: 'nonces',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'owner',
type: 'address'
},
{
internalType: 'address',
name: 'spender',
type: 'address'
},
{
internalType: 'uint256',
name: 'value',
type: 'uint256'
},
{
internalType: 'uint256',
name: 'deadline',
type: 'uint256'
},
{
internalType: 'uint8',
name: 'v',
type: 'uint8'
},
{
internalType: 'bytes32',
name: 'r',
type: 'bytes32'
},
{
internalType: 'bytes32',
name: 's',
type: 'bytes32'
}
],
name: 'permit',
outputs: [],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [],
name: 'symbol',
outputs: [
{
internalType: 'string',
name: '',
type: 'string'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [],
name: 'totalSupply',
outputs: [
{
internalType: 'uint256',
name: '',
type: 'uint256'
}
],
stateMutability: 'view',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'to',
type: 'address'
},
{
internalType: 'uint256',
name: 'amount',
type: 'uint256'
}
],
name: 'transfer',
outputs: [
{
internalType: 'bool',
name: '',
type: 'bool'
}
],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [
{
internalType: 'address',
name: 'from',
type: 'address'
},
{
internalType: 'address',
name: 'to',
type: 'address'
},
{
internalType: 'uint256',
name: 'amount',
type: 'uint256'
}
],
name: 'transferFrom',
outputs: [
{
internalType: 'bool',
name: '',
type: 'bool'
}
],
stateMutability: 'nonpayable',
type: 'function'
}
];
class MultiCall {
constructor(provider) {
this.operations = [];
this.$fn = {
addOperation: (operation) => {
operation.index = this.operations.length;
if (!operation.sigHash)
operation.sigHash = operation.callData.slice(0, 10);
if (!operation.signature)
operation.signature = operation.abi.format();
this.operations.push(operation);
},
//prettier-ignore
aggregate: (provider = this.provider) => __awaiter(this, void 0, void 0, function* () {
if (!provider)
throw new Error('MultiCall: no provider attached');
if (this.operations.length === 0)
throw new Error(`can not aggregate, no operations added to instance`);
const network = yield provider.getNetwork();
if (!MultiCall.Contracts.has(network.chainId))
throw new Error(`unsupported network provided. chain id: ${network.chainId}`);
const address = MultiCall.Contracts.get(network.chainId);
const contract = new Contract(address, MulticallAbi, provider);
const payloads = this.$fn.toAggregatePayload();
const results = yield contract.aggregate(payloads);
if (results && results.returnData) {
const coder = new AbiCoder();
const resultValues = results.returnData;
if (results.blockNumber instanceof BigNumber) {
this.blockNumber = results.blockNumber;
}
for (const index in this.operations)
try {
const operation = this.operations[index];
const rawValue = resultValues[index];
const decoded = coder.decode(operation.abi.outputs, rawValue);
if (decoded.length < 2)
this.operations[index].resultValue = decoded[0];
else
this.operations[index].resultValue = decoded;
}
catch (error) {
console.warn(`error multicall aggregate`, error);
this.operations[index].resultValue = undefined;
}
}
return this.operations;
}),
toCallParameters: () => {
const targets = this.operations.map((x) => x.target);
const values = this.operations.map((x) => x.value);
const callDatas = this.operations.map((x) => x.callData);
return { targets, values, callDatas };
},
toAggregatePayload: () => {
const { targets, callDatas } = this.$fn.toCallParameters();
const result = [];
targets.map((target, index) => {
result.push([target, callDatas[index]]);
});
return result;
}
};
this.balanceOf = {
add: (token, address) => {
const iface = new Interface(ERC20Abi);
const abi = iface.getFunction('balanceOf');
const sigHash = iface.getSighash(abi);
const callData = iface.encodeFunctionData('balanceOf', [address]);
const signature = iface.functions['balanceOf(address)'].format();
//prettier-ignore
const operation = {
index: this.operations.length, value: BigNumber.from(0),
abi, sigHash, signature, target: token,
callData, parameters: { 0: address }
};
//prettier-ignore
if (!this.operations.find((o) => o.target.addrIsEqual(token) && o.sigHash === sigHash &&
o.parameters[0] && o.parameters[0].isAddress() &&
address.addrIsEqual(o.parameters[0])))
this.operations.push(operation);
},
query: (provider = this.provider) => __awaiter(this, void 0, void 0, function* () {
if (!provider)
throw new Error('MultiCall: no provider attached');
try {
const results = yield this.$fn.aggregate(provider);
return results.map((x) => {
const holder = x.parameters[0];
return {
token: x.target.toChecksumAddress(),
holder: holder.toChecksumAddress(),
value: x.resultValue
};
});
}
catch (error) {
return [];
}
})
};
this.provider = provider;
}
}
MultiCall.MulticallAbi = MulticallAbi;
MultiCall.isBigNumber = (input) => {
return input instanceof BigNumber;
};
MultiCall.isResult = (input) => {
return input && ('0' in input && '1' in input);
};
MultiCall.Contracts = new Map([
[1, '0xeefBa1e63905eF1D7ACbA5a8513c70307C1cE441'],
[3, '0x53C43764255c17BD724F74c4eF150724AC50a3ed'],
[4, '0x42Ad527de7d4e9d9d011aC45B31D8551f8Fe9821'],
[5, '0x77dCa2C955b15e9dE4dbBCf1246B4B85b651e50e'],
[42, '0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6'],
[56, '0xC3821F0b56FA4F4794d5d760f94B812DE261361B'],
[61, '0x2bAADf55fB2177e8d13708a7f09B966f671555Eb'],
[100, '0xB5A6F04357Bfd9A21A8C2D32EE37e08b1BD587F6'],
[250, '0x3E3D6b13E6cC2B159c7bE64e6C87BD2c3E26F3F8'],
[43114, '0xB828C456Fc39AA2370A621AcE52Dc84bEA08ab58'],
[42161, '0x2Ba4C95Ce2d00cE39eAa4Fb50f19024A53c73EF2'],
[10, '0x8D6591F594a5ee3A7AFFf03E6e24b6B866792575'],
[2001, '0x18fA376d92511Dd04090566AB6144847c03557d8'],
[78, '0xa83A64E9a4aFa9378C49d17400836D402145f7a2'],
[200101, '0xBBa0649cb8A6dcf69bc66bd6c5e0950C64F3c724'],
// Add valid chainId / contract address pair as needed
]);
/* Autogenerated file. Do not edit manually. */
const _abi = [
{
inputs: [
{
components: [
{
internalType: "address",
name: "target",
type: "address",
},
{
internalType: "bytes",
name: "callData",
type: "bytes",
},
],
internalType: "struct Multicall2.Call[]",
name: "calls",
type: "tuple[]",
},
],
name: "aggregate",
outputs: [
{
internalType: "uint256",
name: "blockNumber",
type: "uint256",
},
{
internalType: "bytes[]",
name: "returnData",
type: "bytes[]",
},
],
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{
components: [
{
internalType: "address",
name: "target",
type: "address",
},
{
internalType: "bytes",
name: "callData",
type: "bytes",
},
],
internalType: "struct Multicall2.Call[]",
name: "calls",
type: "tuple[]",
},
],
name: "blockAndAggregate",
outputs: [
{
internalType: "uint256",
name: "blockNumber",
type: "uint256",
},
{
internalType: "bytes32",
name: "blockHash",
type: "bytes32",
},
{
components: [
{
internalType: "bool",
name: "success",
type: "bool",
},
{
internalType: "bytes",
name: "returnData",
type: "bytes",
},
],
internalType: "struct Multicall2.Result[]",
name: "returnData",
type: "tuple[]",
},
],
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{
internalType: "uint256",
name: "blockNumber",
type: "uint256",
},
],
name: "getBlockHash",
outputs: [
{
internalType: "bytes32",
name: "blockHash",
type: "bytes32",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "getBlockNumber",
outputs: [
{
internalType: "uint256",
name: "blockNumber",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "getCurrentBlockCoinbase",
outputs: [
{
internalType: "address",
name: "coinbase",
type: "address",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "getCurrentBlockDifficulty",
outputs: [
{
internalType: "uint256",
name: "difficulty",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "getCurrentBlockGasLimit",
outputs: [
{
internalType: "uint256",
name: "gaslimit",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "getCurrentBlockTimestamp",
outputs: [
{
internalType: "uint256",
name: "timestamp",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [
{
internalType: "address",
name: "addr",
type: "address",
},
],
name: "getEthBalance",
outputs: [
{
internalType: "uint256",
name: "balance",
type: "uint256",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "getLastBlockHash",
outputs: [
{
internalType: "bytes32",
name: "blockHash",
type: "bytes32",
},
],
stateMutability: "view",
type: "function",
},
{
inputs: [
{
internalType: "bool",
name: "requireSuccess",
type: "bool",
},
{
components: [
{
internalType: "address",
name: "target",
type: "address",
},
{
internalType: "bytes",
name: "callData",
type: "bytes",
},
],
internalType: "struct Multicall2.Call[]",
name: "calls",
type: "tuple[]",
},
],
name: "tryAggregate",
outputs: [
{
components: [
{
internalType: "bool",
name: "success",
type: "bool",
},
{
internalType: "bytes",
name: "returnData",
type: "bytes",
},
],
internalType: "struct Multicall2.Result[]",
name: "returnData",
type: "tuple[]",
},
],
stateMutability: "nonpayable",
type: "function",
},
{
inputs: [
{
internalType: "bool",
name: "requireSuccess",
type: "bool",
},
{
components: [
{
internalType: "address",
name: "target",
type: "address",
},
{
internalType: "bytes",
name: "callData",
type: "bytes",
},
],
internalType: "struct Multicall2.Call[]",
name: "calls",
type: "tuple[]",
},
],
name: "tryBlockAndAggregate",
outputs: [
{
internalType: "uint256",
name: "blockNumber",
type: "uint256",
},
{
internalType: "bytes32",
name: "blockHash",
type: "bytes32",
},
{
components: [
{
internalType: "bool",
name: "success",
type: "bool",
},
{
internalType: "bytes",
name: "returnData",
type: "bytes",
},
],
internalType: "struct Multicall2.Result[]",
name: "returnData",
type: "tuple[]",
},
],
stateMutability: "nonpayable",
type: "function",
},
];
const _bytecode = "0x608060405234801561001057600080fd5b50610a3a806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806372425d9d1161007157806372425d9d1461013a57806386d516e814610140578063a8b0574e14610146578063bce38bd714610154578063c3077fa914610174578063ee82ac5e1461018757600080fd5b80630f28c97d146100b9578063252dba42146100ce57806327e86d6e146100ef578063399542e9146100f757806342cbb15c146101195780634d2301cc1461011f575b600080fd5b425b6040519081526020015b60405180910390f35b6100e16100dc36600461071e565b610199565b6040516100c592919061088b565b6100bb610359565b61010a610105366004610759565b61036c565b6040516100c5939291906108f4565b436100bb565b6100bb61012d3660046106fd565b6001600160a01b03163190565b446100bb565b456100bb565b6040514181526020016100c5565b610167610162366004610759565b610384565b6040516100c59190610878565b61010a61018236600461071e565b610576565b6100bb6101953660046107ab565b4090565b8051439060609067ffffffffffffffff8111156101c657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156101f957816020015b60608152602001906001900390816101e45790505b50905060005b83518110156103535760008085838151811061022b57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031686848151811061026057634e487b7160e01b600052603260045260246000fd5b602002602001015160200151604051610279919061085c565b6000604051808303816000865af19150503d80600081146102b6576040519150601f19603f3d011682016040523d82523d6000602084013e6102bb565b606091505b5091509150816103125760405162461bcd60e51b815260206004820181905260248201527f4d756c746963616c6c206167677265676174653a2063616c6c206661696c656460448201526064015b60405180910390fd5b8084848151811061033357634e487b7160e01b600052603260045260246000fd5b60200260200101819052505050808061034b906109bd565b9150506101ff565b50915091565b6000610366600143610976565b40905090565b438040606061037b8585610384565b90509250925092565b6060815167ffffffffffffffff8111156103ae57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156103f457816020015b6040805180820190915260008152606060208201528152602001906001900390816103cc5790505b50905060005b825181101561056f5760008084838151811061042657634e487b7160e01b600052603260045260246000fd5b6020026020010151600001516001600160a01b031685848151811061045b57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151604051610474919061085c565b6000604051808303816000865af19150503d80600081146104b1576040519150601f19603f3d011682016040523d82523d6000602084013e6104b6565b606091505b5091509150851561051857816105185760405162461bcd60e51b815260206004820152602160248201527f4d756c746963616c6c32206167677265676174653a2063616c6c206661696c656044820152601960fa1b6064820152608401610309565b604051806040016040528083151581526020018281525084848151811061054f57634e487b7160e01b600052603260045260246000fd5b602002602001018190525050508080610567906109bd565b9150506103fa565b5092915050565b600080606061058660018561036c565b9196909550909350915050565b80356001600160a01b03811681146105aa57600080fd5b919050565b600082601f8301126105bf578081fd5b8135602067ffffffffffffffff808311156105dc576105dc6109ee565b8260051b6105eb838201610945565b8481528381019087850183890186018a1015610605578788fd5b8793505b868410156106425780358581111561061f578889fd5b61062d8b88838d010161064f565b84525060019390930192918501918501610609565b5098975050505050505050565b600060408284031215610660578081fd5b61066861091c565b905061067382610593565b815260208083013567ffffffffffffffff8082111561069157600080fd5b818501915085601f8301126106a557600080fd5b8135818111156106b7576106b76109ee565b6106c9601f8201601f19168501610945565b915080825286848285010111156106df57600080fd5b80848401858401376000908201840152918301919091525092915050565b60006020828403121561070e578081fd5b61071782610593565b9392505050565b60006020828403121561072f578081fd5b813567ffffffffffffffff811115610745578182fd5b610751848285016105af565b949350505050565b6000806040838503121561076b578081fd5b8235801515811461077a578182fd5b9150602083013567ffffffffffffffff811115610795578182fd5b6107a1858286016105af565b9150509250929050565b6000602082840312156107bc578081fd5b5035919050565b600082825180855260208086019550808260051b840101818601855b8481101561082357858303601f190189528151805115158452840151604085850181905261080f81860183610830565b9a86019a94505050908301906001016107df565b5090979650505050505050565b6000815180845261084881602086016020860161098d565b601f01601f19169290920160200192915050565b6000825161086e81846020870161098d565b9190910192915050565b60208152600061071760208301846107c3565b600060408201848352602060408185015281855180845260608601915060608160051b8701019350828701855b828110156108e657605f198887030184526108d4868351610830565b955092840192908401906001016108b8565b509398975050505050505050565b83815282602082015260606040820152600061091360608301846107c3565b95945050505050565b6040805190810167ffffffffffffffff8111828210171561093f5761093f6109ee565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561096e5761096e6109ee565b604052919050565b600082821015610988576109886109d8565b500390565b60005b838110156109a8578181015183820152602001610990565b838111156109b7576000848401525b50505050565b60006000198214156109d1576109d16109d8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212208ce27062f90c79ed7f27c8144012cde5be3698e7a027a31b606eed6da200ac5564736f6c63430008040033";
const isSuperArgs = (xs) => xs.length > 1;
class Multicall2__factory extends ContractFactory {
constructor(...args) {
if (isSuperArgs(args)) {
super(...args);
}
else {
super(_abi, _bytecode, args[0]);
}
}
deploy(overrides) {
return super.deploy(overrides || {});
}
getDeployTransaction(overrides) {
return super.getDeployTransaction(overrides || {});
}
attach(address) {
return super.attach(address);
}
connect(signer) {
return super.connect(signer);
}
static createInterface() {
return new utils.Interface(_abi);
}
static connect(address, signerOrProvider) {
return new Contract$1(address, _abi, signerOrProvider);
}
}
Multicall2__factory.bytecode = _bytecode;
Multicall2__factory.abi = _abi;
function resultToObject(input) {
const keys = Object.keys(input).filter((key) => !key.isNumber());
const result = {};
for (const key of keys) {
const value = input[key];
if (value instanceof BigNumber) {
result[key] = value.toString();
}
else {
result[key] = input[key];
}
}
return result;
}
function formatAllValues(data) {
if (data instanceof BigNumber) {
return data.toString();
}
else if (data instanceof BignumberJS) {
return data.toFixed();
}
else if (typeof data === 'function') {
return null;
}
else if (typeof data === 'string' && data.isAddress()) {
return data.toChecksumAddress();
}
else if (Array.isArray(data)) {
return data.map(formatAllValues);
}
else if (isObject(data)) {
Object.keys(data).map((key) => {
try {
data[key] = formatAllValues(data[key]);
}
catch (error) { }
});
}
return data;
}
function parseAllBigNumbers(data) {
if (data && data['type'] === 'BigNumber') {
return BigNumber.from(data['hex']);
}
else if (Array.isArray(data)) {
return data.map(formatAllValues);
}
else if (isObject(data)) {
Object.keys(data).map((key) => {
try {
data[key] = parseAllBigNumbers(data[key]);
}
catch (error) { }
});
}
return data;
}
function createProvider(urlOrPath) {
if (urlOrPath.startsWith('ws'))
return new WebSocketProvider(urlOrPath);
return new IpcProvider(urlOrPath);
}
const VERSION = '0.0.1-rc.11';
export { ERC20Abi, MultiCall, Multicall2__factory, MulticallAbi, VERSION, createProvider, formatAllValues, parseAllBigNumbers, resultToObject };
//# sourceMappingURL=index.esm.js.map