{"version":3,"file":"multicall.mjs","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport { reduceInBatchesSerially } from './assetsUtil';\n\n// https://github.com/mds1/multicall/blob/main/deployments.json\nconst MULTICALL_CONTRACT_BY_CHAINID = {\n  '0x1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xaa36a7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4268': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1b6e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x18fc4a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x45': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1a4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xaa37dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa4ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x66eed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x66eee': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x66eeb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x15f2249': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x89': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x13881': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x13882': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x44d': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x5a2': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x98a': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x64': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x27d8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa86a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa869': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xfa2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xfa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xfaf0': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x15eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xcc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x504': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x505': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x507': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2a15c308d': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x2a15c3083': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x63564c40': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x19': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5535072': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x6c1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x7a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x13': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x10': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x120': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4e454152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x250': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5c2359': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xec0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x42': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x80': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x440': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x257': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Rootstock, bytecode OK and referenced as \"RSK\" in https://www.multicall3.com/deployments\n  '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2328': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x6c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x12': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa516': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5afe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa4ec': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xaef3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x116ea': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x116e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2019': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3e9': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x7d1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x141': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x6a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x28': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1e14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1e15': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1251': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x7f08': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x8ae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x138b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1389': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1388': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1f92': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x14a33': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x14a34': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2105': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x936': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x46a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x46b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x8a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x14f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xd2af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe9ac0ce': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe705': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0xe704': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe708': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2b6f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x39': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x23a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1644': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xdea8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x171': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // HyperEVM (999)\n  '0x3e7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x76adf1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3b9ac9ff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2c': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x2e': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x15b3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x82751': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x8274f': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x82750': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x96f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3cc5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4571': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe99': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x7d0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1297': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1d5e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3a14269b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x561bf78b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x235ddd0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3cd156dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5d456c62': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x79f99296': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x585eb4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x507aaa2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1fc3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x32d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x8a73': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x8a72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x8a71': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xe9ac0d6': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x1069': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x7e5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x53': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x52': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0xe298': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1a8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x94': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2803': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2802': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x28c5f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x28c60': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x13a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4cb2f': '0xdbfa261cd7d17bb40479a0493ad6c0fee435859e',\n  '0x7f93': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xb660': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xb02113d3f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xdad': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xdae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x15b38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x15b32': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x45c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Etherlink mainnet, bytecode OK and referenced in https://www.multicall3.com/deployments\n  '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x1b58': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xc3': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x16fd8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xc7': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x405': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x334': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1ce': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x1cf': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0xa70e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x868b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa0c71fd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x13e31': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa1337': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1f2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xf63': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x144': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n  '0x118': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n  '0x12c': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n  '0x18995f': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n  '0x2b74': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n  '0xfc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x9da': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x137': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x13ed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x24b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xba9302': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x7c8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x138d5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x6d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x343b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x34a1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x3109': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x91b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa96': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x22c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2be3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xbf03': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1b254': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa7b14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2276': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1b9e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x6a63bb8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x15af3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x15af1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xae3f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x531': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x28c61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x28c58': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x1d88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x5b9b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4c7e1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xa53b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1a2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x406': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x2cef': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x18b2': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x182a9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xc4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xfdd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xfde': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x99c0a0f': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x22cf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x310c5': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x659': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // BOB, bytecode OK and referenced in https://www.multicall3.com/deployments\n  '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x31bf8c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x1cbc67bfdc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x98967f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x4f588': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x16db': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x3a': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x59': '0xca11bde05977b3631167028862be2a173976ca11',\n  '0x1e0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x2eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  '0x221': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Injective, contract found but not in multicall3 repo\n  '0x6f0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Hemi, contract found but not in multicall3 repo\n  '0xa867': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Plasma, contract found but not in multicall3 repo\n  '0x2611': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Nonmia, contract found but not in multicall3 repo\n  '0xa6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // XRPL, contract found but not in multicall3 repo\n  '0x15f900': '0x6B5eFbC0C82eBb26CA13a4F11836f36Fc6fdBC5D',\n  // Soneium, contract found but not in multicall3 repo\n  '0x74c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Genesys, contract found but not in multicall3 repo\n  '0x407b': '0x90a2377F233E3461BACa6080d4837837d8762927',\n  // EDU (Animoca)\n  '0xa3c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Abstract\n  '0xab5': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n  // Berachain, contract found but not in multicall3 repo\n  '0x138de': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // MegaETH TESTNET\n  '0x18c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Apechain\n  '0x8173': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Matchain, contract found but not in multicall3 repo\n  '0x2ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Monad TESTNET\n  '0x279f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Katana\n  '0xb67d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Lens, contract found but not in multicall3 repo\n  '0xe8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Plume\n  '0x18232': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Monad Mainnet\n  '0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // XDC, contract found but not in multicall3 repo\n  '0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',\n  // MegaETH TESTNET v2 (timothy chain ID 6343)\n  '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // MegaETH mainnet, contract found matching multicall3 bytecode\n  '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // MSU (contract they deployed by their team for us)\n  '0x10b3e': '0x99423C88EB5723A590b4C644426069042f137B9e',\n  // INK Mainnet\n  '0xdef1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Stable (988)\n  '0x3dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n  // Tempo Testnet Moderato (42431)\n  '0xa5bf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n} as Record<Hex, Hex>;\n\nconst multicallAbi = [\n  {\n    name: 'tryAggregate',\n    type: 'function',\n    stateMutability: 'payable',\n    inputs: [\n      { name: 'requireSuccess', type: 'bool' },\n      {\n        name: 'calls',\n        type: 'tuple[]',\n        components: [\n          { name: 'target', type: 'address' },\n          { name: 'callData', type: 'bytes' },\n        ],\n      },\n    ],\n    outputs: [\n      {\n        name: 'returnData',\n        type: 'tuple[]',\n        components: [\n          { name: 'success', type: 'bool' },\n          { name: 'returnData', type: 'bytes' },\n        ],\n      },\n    ],\n  },\n];\n\n// Multicall3 ABI for aggregate3 function\nconst multicall3Abi = [\n  {\n    name: 'aggregate3',\n    type: 'function',\n    stateMutability: 'payable',\n    inputs: [\n      {\n        name: 'calls',\n        type: 'tuple[]',\n        components: [\n          { name: 'target', type: 'address' },\n          { name: 'allowFailure', type: 'bool' },\n          { name: 'callData', type: 'bytes' },\n        ],\n      },\n    ],\n    outputs: [\n      {\n        name: 'returnData',\n        type: 'tuple[]',\n        components: [\n          { name: 'success', type: 'bool' },\n          { name: 'returnData', type: 'bytes' },\n        ],\n      },\n    ],\n  },\n];\n\nexport type Call = {\n  contract: Contract;\n  functionSignature: string;\n  arguments: unknown[];\n};\n\nexport type MulticallResult = { success: boolean; value: unknown };\n\nexport type Aggregate3Call = {\n  target: string;\n  allowFailure: boolean;\n  callData: string;\n};\n\nexport type Aggregate3Result = {\n  success: boolean;\n  returnData: string;\n};\n\n// Constants for encoded strings and addresses\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst BALANCE_OF_FUNCTION = 'balanceOf(address)';\nconst OWNER_OF_FUNCTION = 'ownerOf(uint256)';\nconst ERC1155_BALANCE_OF_FUNCTION = 'balanceOf(address,uint256)';\nconst GET_ETH_BALANCE_FUNCTION = 'getEthBalance';\nconst GET_SHARES_FUNCTION = 'getShares';\nconst CONVERT_TO_ASSETS_FUNCTION = 'convertToAssets';\n\n// ERC-721 ownerOf ABI\nconst ERC721_OWNER_OF_ABI = [\n  {\n    name: 'ownerOf',\n    type: 'function',\n    inputs: [{ name: 'tokenId', type: 'uint256' }],\n    outputs: [{ name: 'owner', type: 'address' }],\n    stateMutability: 'view',\n  },\n];\n\n// ERC-1155 balanceOf ABI\nconst ERC1155_BALANCE_OF_ABI = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    inputs: [\n      { name: 'account', type: 'address' },\n      { name: 'id', type: 'uint256' },\n    ],\n    outputs: [{ name: 'balance', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n];\n\n// ERC20 balanceOf ABI\nconst ERC20_BALANCE_OF_ABI = [\n  {\n    name: 'balanceOf',\n    type: 'function',\n    inputs: [{ name: 'account', type: 'address' }],\n    outputs: [{ name: '', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n];\n\n// Multicall3 getEthBalance ABI\nconst MULTICALL3_GET_ETH_BALANCE_ABI = [\n  {\n    name: 'getEthBalance',\n    type: 'function',\n    inputs: [{ name: 'addr', type: 'address' }],\n    outputs: [{ name: 'balance', type: 'uint256' }],\n    stateMutability: 'view',\n  },\n];\n\n// Staking contract ABI with both getShares and convertToAssets\nconst STAKING_CONTRACT_ABI = [\n  {\n    inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n    name: 'getShares',\n    outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n  {\n    inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n    name: 'convertToAssets',\n    outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n    stateMutability: 'view',\n    type: 'function',\n  },\n];\n\nconst multicall = async (\n  calls: Call[],\n  multicallAddress: Hex,\n  provider: Web3Provider,\n  maxCallsPerMulticall: number,\n): Promise<MulticallResult[]> => {\n  const multicallContract = new Contract(\n    multicallAddress,\n    multicallAbi,\n    provider,\n  );\n\n  return await reduceInBatchesSerially<Call, MulticallResult[]>({\n    values: calls,\n    batchSize: maxCallsPerMulticall,\n    initialResult: [],\n    eachBatch: async (workingResult, batch) => {\n      const calldata = batch.map((call) => ({\n        target: call.contract.address,\n        callData: call.contract.interface.encodeFunctionData(\n          call.contract.interface.functions[call.functionSignature],\n          call.arguments,\n        ),\n      }));\n\n      const results = await multicallContract.callStatic.tryAggregate(\n        false,\n        calldata,\n      );\n\n      return [\n        ...workingResult,\n        ...results.map(\n          (r: { success: boolean; returnData: string }, i: number) => ({\n            success: r.success,\n            value: r.success\n              ? batch[i].contract.interface.decodeFunctionResult(\n                  batch[i].functionSignature,\n                  r.returnData,\n                )[0]\n              : undefined,\n          }),\n        ),\n      ];\n    },\n  });\n};\n\nconst fallback = async (\n  calls: Call[],\n  maxCallsParallel: number,\n): Promise<MulticallResult[]> => {\n  return await reduceInBatchesSerially<Call, MulticallResult[]>({\n    values: calls,\n    batchSize: maxCallsParallel,\n    initialResult: [],\n    eachBatch: async (workingResult, batch) => {\n      const results = await Promise.allSettled(\n        batch.map((call) =>\n          call.contract[call.functionSignature](...call.arguments),\n        ),\n      );\n      return [\n        ...workingResult,\n        ...results.map((p) => ({\n          success: p.status === 'fulfilled',\n          value: p.status === 'fulfilled' ? p.value : undefined,\n        })),\n      ];\n    },\n  });\n};\n\n/**\n * Executes an array of contract calls. If the chain supports multicalls,\n * the calls will be executed in single RPC requests (up to maxCallsPerMulticall).\n * Otherwise the calls will be executed separately in parallel (up to maxCallsParallel).\n *\n * @param calls - An array of contract calls to execute.\n * @param chainId - The hexadecimal chain id.\n * @param provider - An ethers rpc provider.\n * @param maxCallsPerMulticall - If multicall is supported, the maximum number of calls to exeute in each multicall.\n * @param maxCallsParallel - If multicall is not supported, the maximum number of calls to execute in parallel.\n * @returns An array of results, with a success boolean and value for each call.\n */\nexport const multicallOrFallback = async (\n  calls: Call[],\n  chainId: Hex,\n  provider: Web3Provider,\n  maxCallsPerMulticall = 300,\n  maxCallsParallel = 20,\n): Promise<MulticallResult[]> => {\n  if (calls.length === 0) {\n    return [];\n  }\n\n  const multicallAddress = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n  if (multicallAddress) {\n    try {\n      return await multicall(\n        calls,\n        multicallAddress,\n        provider,\n        maxCallsPerMulticall,\n      );\n    } catch (error: unknown) {\n      // Fallback only on revert\n      // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n      if (\n        !error ||\n        typeof error !== 'object' ||\n        !('code' in error) ||\n        error.code !== 'CALL_EXCEPTION'\n      ) {\n        throw error;\n      }\n    }\n  }\n\n  return await fallback(calls, maxCallsParallel);\n};\n\n/**\n * Execute multiple contract calls using Multicall3's aggregate3 function.\n * This allows for more efficient batch calls with individual failure handling.\n *\n * @param calls - Array of calls to execute via aggregate3\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @returns Promise resolving to array of results from aggregate3\n */\nexport const aggregate3 = async (\n  calls: Aggregate3Call[],\n  chainId: Hex,\n  provider: Web3Provider,\n): Promise<Aggregate3Result[]> => {\n  if (calls.length === 0) {\n    return [];\n  }\n\n  const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n  const multicall3Contract = new Contract(\n    multicall3Address,\n    multicall3Abi,\n    provider,\n  );\n\n  return await multicall3Contract.callStatic.aggregate3(calls);\n};\n\n/**\n * Processes and decodes balance results from aggregate3 calls\n *\n * @param results - Array of results from aggregate3 calls\n * @param callMapping - Array mapping call indices to token and user addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeStaked - Whether to include staked balances\n * @returns Map of token address to map of user address to balance\n */\nconst processBalanceResults = (\n  results: Aggregate3Result[],\n  callMapping: {\n    tokenAddress: string;\n    userAddress: string;\n    callType: 'erc20' | 'native' | 'staking';\n  }[],\n  chainId: Hex,\n  provider: Web3Provider,\n  includeStaked: boolean,\n): {\n  tokenBalances: Record<string, Record<string, BN>>;\n  stakedBalances?: Record<string, BN>;\n} => {\n  const balanceMap: Record<string, Record<string, BN>> = {};\n  const stakedBalanceMap: Record<string, BN> = {};\n\n  // Create contract instances for decoding\n  const erc20Contract = new Contract(\n    ZERO_ADDRESS,\n    ERC20_BALANCE_OF_ABI,\n    provider,\n  );\n\n  const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n  const multicall3Contract = new Contract(\n    multicall3Address,\n    MULTICALL3_GET_ETH_BALANCE_ABI,\n    provider,\n  );\n\n  // Staking contracts are now handled separately in two-step process\n\n  results.forEach((result, index) => {\n    if (result.success) {\n      const { tokenAddress, userAddress, callType } = callMapping[index];\n      if (callType === 'native') {\n        // For native token, decode the getEthBalance result\n        const balanceRaw = multicall3Contract.interface.decodeFunctionResult(\n          GET_ETH_BALANCE_FUNCTION,\n          result.returnData,\n        )[0];\n\n        if (!balanceMap[tokenAddress]) {\n          balanceMap[tokenAddress] = {};\n        }\n        balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n      } else if (callType === 'staking') {\n        // Staking is now handled separately in two-step process\n        // This case should not occur anymore\n        console.warn(\n          'Staking callType found in main processing - this should not happen',\n        );\n      } else {\n        // For ERC20 tokens, decode the balanceOf result\n        const balanceRaw = erc20Contract.interface.decodeFunctionResult(\n          BALANCE_OF_FUNCTION,\n          result.returnData,\n        )[0];\n\n        if (!balanceMap[tokenAddress]) {\n          balanceMap[tokenAddress] = {};\n        }\n        balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n      }\n    }\n  });\n\n  const result: {\n    tokenBalances: Record<string, Record<string, BN>>;\n    stakedBalances?: Record<string, BN>;\n  } = { tokenBalances: balanceMap };\n\n  if (includeStaked && Object.keys(stakedBalanceMap).length > 0) {\n    result.stakedBalances = stakedBalanceMap;\n  }\n\n  return result;\n};\n\n/**\n * Fallback function to get native token balances using individual eth_getBalance calls\n * when Multicall3 is not supported on the chain.\n *\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to balance\n */\nconst getNativeBalancesFallback = async (\n  userAddresses: string[],\n  provider: Web3Provider,\n  maxCallsParallel = 20,\n): Promise<Record<string, BN>> => {\n  const balanceMap: Record<string, BN> = {};\n\n  await reduceInBatchesSerially<string, void>({\n    values: userAddresses,\n    batchSize: maxCallsParallel,\n    initialResult: undefined,\n    eachBatch: async (_, batch) => {\n      const results = await Promise.allSettled(\n        batch.map(async (userAddress) => {\n          const balance = await provider.getBalance(userAddress);\n          return {\n            success: true,\n            balance: new BN(balance.toString()),\n            userAddress,\n          };\n        }),\n      );\n\n      results.forEach((result) => {\n        if (\n          result.status === 'fulfilled' &&\n          result.value.success &&\n          result.value.balance !== null\n        ) {\n          balanceMap[result.value.userAddress] = result.value.balance;\n        }\n      });\n    },\n  });\n\n  return balanceMap;\n};\n\n/**\n * Fallback function to get token balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param tokenAddresses - Array of ERC20 token contract addresses\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of token address to map of user address to balance\n */\nconst getTokenBalancesFallback = async (\n  tokenAddresses: string[],\n  userAddresses: string[],\n  provider: Web3Provider,\n  includeNative: boolean,\n  maxCallsParallel: number,\n): Promise<Record<string, Record<string, BN>>> => {\n  const balanceMap: Record<string, Record<string, BN>> = {};\n\n  // Handle ERC20 token balances using the existing fallback function\n  if (tokenAddresses.length > 0) {\n    const erc20Calls: Call[] = [];\n    const callMapping: { tokenAddress: string; userAddress: string }[] = [];\n\n    tokenAddresses.forEach((tokenAddress) => {\n      userAddresses.forEach((userAddress) => {\n        const contract = new Contract(\n          tokenAddress,\n          ERC20_BALANCE_OF_ABI,\n          provider,\n        );\n        erc20Calls.push({\n          contract,\n          functionSignature: BALANCE_OF_FUNCTION,\n          arguments: [userAddress],\n        });\n        callMapping.push({ tokenAddress, userAddress });\n      });\n    });\n\n    const erc20Results = await fallback(erc20Calls, maxCallsParallel);\n    erc20Results.forEach((result, index) => {\n      if (result.success) {\n        const { tokenAddress, userAddress } = callMapping[index];\n        if (!balanceMap[tokenAddress]) {\n          balanceMap[tokenAddress] = {};\n        }\n        balanceMap[tokenAddress][userAddress] = result.value as BN;\n      }\n    });\n  }\n\n  // Handle native token balances using the native fallback function\n  if (includeNative) {\n    const nativeBalances = await getNativeBalancesFallback(\n      userAddresses,\n      provider,\n      maxCallsParallel,\n    );\n    if (Object.keys(nativeBalances).length > 0) {\n      balanceMap[ZERO_ADDRESS] = nativeBalances;\n    }\n  }\n\n  return balanceMap;\n};\n\n/**\n * Fallback function to get staked balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param userAddresses - Array of user addresses to check staked balances for\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to staked balance\n */\nconst getStakedBalancesFallback = async (\n  userAddresses: string[],\n  chainId: Hex,\n  provider: Web3Provider,\n  maxCallsParallel: number,\n): Promise<Record<string, BN>> => {\n  const stakedBalanceMap: Record<string, BN> = {};\n\n  const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n  if (!stakingContractAddress) {\n    // No staking support for this chain\n    return stakedBalanceMap;\n  }\n\n  const stakingCalls: Call[] = [];\n  const callMapping: { userAddress: string }[] = [];\n\n  userAddresses.forEach((userAddress) => {\n    const contract = new Contract(\n      stakingContractAddress,\n      STAKING_CONTRACT_ABI,\n      provider,\n    );\n    stakingCalls.push({\n      contract,\n      functionSignature: GET_SHARES_FUNCTION,\n      arguments: [userAddress],\n    });\n    callMapping.push({ userAddress });\n  });\n\n  const stakingResults = await fallback(stakingCalls, maxCallsParallel);\n  stakingResults.forEach((result, index) => {\n    if (result.success) {\n      const { userAddress } = callMapping[index];\n      stakedBalanceMap[userAddress] = result.value as BN;\n    }\n  });\n\n  return stakedBalanceMap;\n};\n\n/**\n * Get staked balances for multiple addresses using two-step process:\n * 1. Get shares for all addresses\n * 2. Convert non-zero shares to assets\n *\n * @param userAddresses - Array of user addresses to check\n * @param chainId - Chain ID as hex string\n * @param provider - Ethers provider\n * @returns Promise resolving to map of user address to staked balance\n */\nexport const getStakedBalancesForAddresses = async (\n  userAddresses: string[],\n  chainId: Hex,\n  provider: Web3Provider,\n): Promise<Record<string, BN>> => {\n  const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n  if (!stakingContractAddress) {\n    return {};\n  }\n\n  const stakingContract = new Contract(\n    stakingContractAddress,\n    STAKING_CONTRACT_ABI,\n    provider,\n  );\n\n  try {\n    // Step 1: Get shares for all addresses\n    const shareCalls: Aggregate3Call[] = userAddresses.map((userAddress) => ({\n      target: stakingContractAddress,\n      allowFailure: true,\n      callData: stakingContract.interface.encodeFunctionData(\n        GET_SHARES_FUNCTION,\n        [userAddress],\n      ),\n    }));\n\n    const shareResults = await aggregate3(shareCalls, chainId, provider);\n\n    // Step 2: For addresses with non-zero shares, convert to assets\n    const nonZeroSharesData: { address: string; shares: BN }[] = [];\n    shareResults.forEach((result, index) => {\n      if (result.success) {\n        const sharesRaw = stakingContract.interface.decodeFunctionResult(\n          GET_SHARES_FUNCTION,\n          result.returnData,\n        )[0];\n        const shares = new BN(sharesRaw.toString());\n\n        if (shares.gt(new BN(0))) {\n          nonZeroSharesData.push({\n            address: userAddresses[index],\n            shares,\n          });\n        }\n      }\n    });\n\n    if (nonZeroSharesData.length === 0) {\n      return {};\n    }\n\n    // Step 3: Convert shares to assets for addresses with non-zero shares\n    const assetCalls: Aggregate3Call[] = nonZeroSharesData.map(\n      ({ shares }) => ({\n        target: stakingContractAddress,\n        allowFailure: true,\n        callData: stakingContract.interface.encodeFunctionData(\n          CONVERT_TO_ASSETS_FUNCTION,\n          [shares.toString()],\n        ),\n      }),\n    );\n\n    const assetResults = await aggregate3(assetCalls, chainId, provider);\n\n    // Step 4: Build final result mapping\n    const result: Record<string, BN> = {};\n    assetResults.forEach((assetResult, index) => {\n      if (assetResult.success) {\n        const assetsRaw = stakingContract.interface.decodeFunctionResult(\n          CONVERT_TO_ASSETS_FUNCTION,\n          assetResult.returnData,\n        )[0];\n        const assets = new BN(assetsRaw.toString());\n\n        const { address } = nonZeroSharesData[index];\n        result[address] = assets;\n      }\n    });\n\n    return result;\n  } catch (error) {\n    console.error('Error fetching staked balances:', error);\n    return {};\n  }\n};\n\n/**\n * Get token balances (both ERC20 and native) for multiple addresses using aggregate3.\n * This is more efficient than individual balanceOf calls for multiple addresses and tokens.\n * Native token balances are mapped to the zero address (0x0000000000000000000000000000000000000000).\n *\n * @param accountTokenGroups - Array of objects containing account addresses and their associated token addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param includeStaked - Whether to include staked balances from supported staking contracts (default: false)\n * @returns Promise resolving to object containing tokenBalances map and optional stakedBalances map\n */\nexport const getTokenBalancesForMultipleAddresses = async (\n  accountTokenGroups: { accountAddress: Hex; tokenAddresses: Hex[] }[],\n  chainId: Hex,\n  provider: Web3Provider,\n  includeNative: boolean,\n  includeStaked: boolean,\n): Promise<{\n  tokenBalances: Record<string, Record<string, BN>>;\n  stakedBalances?: Record<string, BN>;\n}> => {\n  // Return early if no groups provided\n  if (accountTokenGroups.length === 0 && !includeNative && !includeStaked) {\n    return { tokenBalances: {} };\n  }\n\n  // Extract unique token addresses and user addresses from groups\n  const uniqueTokenAddresses = Array.from(\n    new Set(accountTokenGroups.flatMap((group) => group.tokenAddresses)),\n  ).filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS); // Exclude native token from ERC20 calls\n\n  const uniqueUserAddresses = Array.from(\n    new Set(accountTokenGroups.map((group) => group.accountAddress)),\n  );\n\n  // Check if Multicall3 is supported on this chain\n  if (!MULTICALL_CONTRACT_BY_CHAINID[chainId]) {\n    // Fallback to individual balance calls when Multicall3 is not supported\n    const tokenBalances = await getTokenBalancesFallback(\n      uniqueTokenAddresses,\n      uniqueUserAddresses,\n      provider,\n      includeNative,\n      20,\n    );\n\n    const result: {\n      tokenBalances: Record<string, Record<string, BN>>;\n      stakedBalances?: Record<string, BN>;\n    } = { tokenBalances };\n\n    // Handle staked balances fallback if requested\n    if (includeStaked) {\n      const stakedBalances = await getStakedBalancesFallback(\n        uniqueUserAddresses,\n        chainId,\n        provider,\n        20,\n      );\n\n      if (Object.keys(stakedBalances).length > 0) {\n        result.stakedBalances = stakedBalances;\n      }\n    }\n\n    return result;\n  }\n\n  try {\n    // Create calls directly from pairs\n    const allCalls: Aggregate3Call[] = [];\n    const allCallMapping: {\n      tokenAddress: string;\n      userAddress: string;\n      callType: 'erc20' | 'native' | 'staking';\n    }[] = [];\n\n    // Create a temporary ERC20 contract for encoding\n    const tempERC20Contract = new Contract(\n      ZERO_ADDRESS,\n      ERC20_BALANCE_OF_ABI,\n      provider,\n    );\n\n    // Create ERC20 balance calls for all account-token combinations\n    accountTokenGroups.forEach((group) => {\n      group.tokenAddresses\n        .filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS)\n        .forEach((tokenAddress) => {\n          allCalls.push({\n            target: tokenAddress,\n            allowFailure: true,\n            callData: tempERC20Contract.interface.encodeFunctionData(\n              BALANCE_OF_FUNCTION,\n              [group.accountAddress],\n            ),\n          });\n          allCallMapping.push({\n            tokenAddress,\n            userAddress: group.accountAddress,\n            callType: 'erc20',\n          });\n        });\n    });\n\n    // Add native token balance calls if requested\n    if (includeNative) {\n      const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n      const multicall3TempContract = new Contract(\n        multicall3Address,\n        MULTICALL3_GET_ETH_BALANCE_ABI,\n        provider,\n      );\n\n      uniqueUserAddresses.forEach((userAddress) => {\n        allCalls.push({\n          target: multicall3Address,\n          allowFailure: true,\n          callData: multicall3TempContract.interface.encodeFunctionData(\n            GET_ETH_BALANCE_FUNCTION,\n            [userAddress],\n          ),\n        });\n        allCallMapping.push({\n          tokenAddress: ZERO_ADDRESS,\n          userAddress,\n          callType: 'native',\n        });\n      });\n    }\n\n    // Note: Staking balances will be handled separately in two steps after token/native calls\n\n    // Execute all calls in batches\n    const maxCallsPerBatch = 300; // Limit calls per batch to avoid gas/size limits\n    const allResults: Aggregate3Result[] = [];\n\n    await reduceInBatchesSerially<Aggregate3Call, void>({\n      values: allCalls,\n      batchSize: maxCallsPerBatch,\n      initialResult: undefined,\n      eachBatch: async (_, batch) => {\n        const batchResults = await aggregate3(batch, chainId, provider);\n        allResults.push(...batchResults);\n      },\n    });\n\n    // Handle staking balances in two steps if requested\n    let stakedBalances: Record<string, BN> = {};\n    if (includeStaked) {\n      stakedBalances = await getStakedBalancesForAddresses(\n        uniqueUserAddresses,\n        chainId,\n        provider,\n      );\n    }\n\n    // Process and return results\n    const result = processBalanceResults(\n      allResults,\n      allCallMapping,\n      chainId,\n      provider,\n      false, // Don't include staked from main processing\n    );\n\n    // Add staked balances to result\n    if (includeStaked && Object.keys(stakedBalances).length > 0) {\n      result.stakedBalances = stakedBalances;\n    }\n\n    return result;\n  } catch (error) {\n    // Fallback only on revert\n    // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n    if (\n      !error ||\n      typeof error !== 'object' ||\n      !('code' in error) ||\n      error.code !== 'CALL_EXCEPTION'\n    ) {\n      throw error;\n    }\n\n    // Fallback to individual balance calls when aggregate3 fails\n    const tokenBalances = await getTokenBalancesFallback(\n      uniqueTokenAddresses,\n      uniqueUserAddresses,\n      provider,\n      includeNative,\n      20,\n    );\n\n    const result: {\n      tokenBalances: Record<string, Record<string, BN>>;\n      stakedBalances?: Record<string, BN>;\n    } = { tokenBalances };\n\n    // Handle staked balances fallback if requested\n    if (includeStaked) {\n      const stakedBalances = await getStakedBalancesFallback(\n        uniqueUserAddresses,\n        chainId,\n        provider,\n        20,\n      );\n\n      if (Object.keys(stakedBalances).length > 0) {\n        result.stakedBalances = stakedBalances;\n      }\n    }\n\n    return result;\n  }\n};\n\nexport type NftOwnershipQuery = {\n  nftAddress: string;\n  tokenId: string;\n  userAddress: string;\n  standard: string | null;\n};\n\nexport type NftOwnershipResult = {\n  nftAddress: string;\n  tokenId: string;\n  isOwned: boolean | undefined;\n};\n\ntype NftCallMeta = { nftIndex: number; callVariant: 'erc721' | 'erc1155' };\n\nconst normalizeNftStandard = (\n  standard: string | null,\n): 'ERC721' | 'ERC1155' | null => {\n  if (!standard) {\n    return null;\n  }\n  const upper = standard.toUpperCase();\n  if (upper === 'ERC721') {\n    return 'ERC721';\n  }\n  if (upper === 'ERC1155') {\n    return 'ERC1155';\n  }\n  return null;\n};\n\nconst getNftOwnershipViaMulticall = async (\n  nfts: NftOwnershipQuery[],\n  chainId: Hex,\n  provider: Web3Provider,\n): Promise<NftOwnershipResult[]> => {\n  const erc721Contract = new Contract(\n    ZERO_ADDRESS,\n    ERC721_OWNER_OF_ABI,\n    provider,\n  );\n  const erc1155Contract = new Contract(\n    ZERO_ADDRESS,\n    ERC1155_BALANCE_OF_ABI,\n    provider,\n  );\n\n  const calls: Aggregate3Call[] = [];\n  const meta: NftCallMeta[] = [];\n\n  // When the standard is known, emit only the relevant call to halve the number\n  // of multicall subcalls. When unknown (null), emit both — ERC-721 first so\n  // the `!== undefined` guard below replicates the original early-return\n  // behavior: once ERC-721 gives a definitive answer, ERC-1155 is skipped.\n  nfts.forEach(({ nftAddress, tokenId, userAddress, standard }, i) => {\n    const normalized = normalizeNftStandard(standard);\n    const tryErc721 = normalized !== 'ERC1155';\n    const tryErc1155 = normalized !== 'ERC721';\n\n    if (tryErc721) {\n      calls.push({\n        target: nftAddress,\n        allowFailure: true,\n        callData: erc721Contract.interface.encodeFunctionData(\n          OWNER_OF_FUNCTION,\n          [tokenId],\n        ),\n      });\n      meta.push({ nftIndex: i, callVariant: 'erc721' });\n    }\n\n    if (tryErc1155) {\n      calls.push({\n        target: nftAddress,\n        allowFailure: true,\n        callData: erc1155Contract.interface.encodeFunctionData(\n          ERC1155_BALANCE_OF_FUNCTION,\n          [userAddress, tokenId],\n        ),\n      });\n      meta.push({ nftIndex: i, callVariant: 'erc1155' });\n    }\n  });\n\n  const maxCallsPerBatch = 300;\n  const allReturnData: Aggregate3Result[] = [];\n  // Batches are processed serially and results are pushed in order, so\n  // allReturnData[i] always corresponds to meta[i]. Do NOT change this to\n  // parallel batching without also reworking the index correspondence.\n  await reduceInBatchesSerially<Aggregate3Call, void>({\n    values: calls,\n    batchSize: maxCallsPerBatch,\n    initialResult: undefined,\n    eachBatch: async (_, batch) => {\n      const batchResults = await aggregate3(batch, chainId, provider);\n      allReturnData.push(...batchResults);\n    },\n  });\n\n  const results: NftOwnershipResult[] = nfts.map(({ nftAddress, tokenId }) => ({\n    nftAddress,\n    tokenId,\n    isOwned: undefined,\n  }));\n\n  allReturnData.forEach(({ success, returnData: data }, i) => {\n    if (!success) {\n      return;\n    }\n    const { nftIndex, callVariant } = meta[i];\n    if (results[nftIndex].isOwned !== undefined) {\n      return;\n    }\n    try {\n      if (callVariant === 'erc721') {\n        const [owner] = erc721Contract.interface.decodeFunctionResult(\n          OWNER_OF_FUNCTION,\n          data,\n        );\n        results[nftIndex].isOwned =\n          owner.toLowerCase() === nfts[nftIndex].userAddress.toLowerCase();\n      } else {\n        const [balance] = erc1155Contract.interface.decodeFunctionResult(\n          ERC1155_BALANCE_OF_FUNCTION,\n          data,\n        );\n        results[nftIndex].isOwned = new BN(balance.toString()).gt(new BN(0));\n      }\n    } catch {\n      // Malformed return data from a non-standard contract; leave isOwned as undefined.\n    }\n  });\n\n  return results;\n};\n\nconst MAX_PARALLEL_NFT_CALLS = 50;\n\nconst getNftOwnershipIndividually = async (\n  nfts: NftOwnershipQuery[],\n  provider: Web3Provider,\n): Promise<NftOwnershipResult[]> => {\n  const erc721Iface = new Contract(ZERO_ADDRESS, ERC721_OWNER_OF_ABI, provider)\n    .interface;\n  const erc1155Iface = new Contract(\n    ZERO_ADDRESS,\n    ERC1155_BALANCE_OF_ABI,\n    provider,\n  ).interface;\n\n  return reduceInBatchesSerially<NftOwnershipQuery, NftOwnershipResult[]>({\n    values: nfts,\n    batchSize: MAX_PARALLEL_NFT_CALLS,\n    initialResult: [],\n    eachBatch: async (workingResult, batch) => {\n      const batchResults = await Promise.all(\n        batch.map(async ({ nftAddress, tokenId, userAddress, standard }) => {\n          let isOwned: boolean | undefined;\n          const normalized = normalizeNftStandard(standard);\n          const tryErc721 = normalized !== 'ERC1155';\n          const tryErc1155 = normalized !== 'ERC721';\n\n          if (tryErc721) {\n            try {\n              const callData = erc721Iface.encodeFunctionData(\n                OWNER_OF_FUNCTION,\n                [tokenId],\n              );\n              const raw = await provider.call({\n                to: nftAddress,\n                data: callData,\n              });\n              const [owner] = erc721Iface.decodeFunctionResult(\n                OWNER_OF_FUNCTION,\n                raw,\n              );\n              isOwned = owner.toLowerCase() === userAddress.toLowerCase();\n            } catch {\n              // ERC-721 unavailable; try ERC-1155 below if applicable.\n            }\n          }\n\n          if (isOwned === undefined && tryErc1155) {\n            try {\n              const callData = erc1155Iface.encodeFunctionData(\n                ERC1155_BALANCE_OF_FUNCTION,\n                [userAddress, tokenId],\n              );\n              const raw = await provider.call({\n                to: nftAddress,\n                data: callData,\n              });\n              const [balance] = erc1155Iface.decodeFunctionResult(\n                ERC1155_BALANCE_OF_FUNCTION,\n                raw,\n              );\n              isOwned = new BN(balance.toString()).gt(new BN(0));\n            } catch {\n              // ownership remains undefined\n            }\n          }\n\n          return { nftAddress, tokenId, isOwned };\n        }),\n      );\n      return [...workingResult, ...batchResults];\n    },\n  });\n};\n\n/**\n * Check ownership for multiple NFTs, using Multicall3 when available to batch\n * all calls into a single RPC request, falling back to individual calls otherwise.\n *\n * @param nfts - Array of NFT queries containing address, tokenId, owner address, and standard.\n * @param chainId - The hexadecimal chain id.\n * @param provider - An ethers rpc provider.\n * @returns Promise resolving to array of ownership results. `isOwned` is `undefined`\n * when ownership could not be determined (e.g. unsupported standard or RPC error).\n */\nexport const getNftOwnershipForMultipleNfts = async (\n  nfts: NftOwnershipQuery[],\n  chainId: Hex,\n  provider: Web3Provider,\n): Promise<NftOwnershipResult[]> => {\n  if (nfts.length === 0) {\n    return [];\n  }\n\n  const results: NftOwnershipResult[] = nfts.map(({ nftAddress, tokenId }) => ({\n    nftAddress,\n    tokenId,\n    isOwned: undefined,\n  }));\n\n  // Filter out NFTs whose standard is explicitly unrecognized (e.g.\n  // CryptoPunks with standard=\"UNKNOWN\"). Such contracts use pre-Solidity-\n  // 0.4.10 bytecode that compiles unrecognized selectors to the INVALID\n  // opcode, which consumes ALL forwarded gas. Including them in a Multicall3\n  // aggregate3 batch causes the entire batch to revert, and calling them\n  // individually also always fails. They stay as isOwned=undefined.\n  //\n  // NFTs with `standard: null` (not yet categorized) are still included\n  // because they are likely valid ERC-721/ERC-1155 contracts.\n  const callable = nfts.reduce<{ nft: NftOwnershipQuery; index: number }[]>(\n    (acc, nft, index) => {\n      const hasExplicitNonStandard =\n        nft.standard !== null && normalizeNftStandard(nft.standard) === null;\n      if (!hasExplicitNonStandard) {\n        acc.push({ nft, index });\n      }\n      return acc;\n    },\n    [],\n  );\n\n  if (callable.length === 0) {\n    return results;\n  }\n\n  const multicallAddress = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n\n  if (multicallAddress) {\n    try {\n      const batchResults = await getNftOwnershipViaMulticall(\n        callable.map(({ nft }) => nft),\n        chainId,\n        provider,\n      );\n      batchResults.forEach((result, batchIndex) => {\n        results[callable[batchIndex].index] = result;\n      });\n      return results;\n    } catch (error) {\n      console.warn(\n        'Multicall3 NFT ownership check failed, falling back to individual calls',\n        error,\n      );\n    }\n  }\n\n  const individualResults = await getNftOwnershipIndividually(\n    callable.map(({ nft }) => nft),\n    provider,\n  );\n  individualResults.forEach((result, batchIndex) => {\n    results[callable[batchIndex].index] = result;\n  });\n\n  return results;\n};\n"]}