{"_id":"@amra-finance/multicall","_rev":"2-2a8e2172b41fbec0d065c22d7d966db3","name":"@amra-finance/multicall","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@amra-finance/multicall","version":"0.1.0","description":"A blockchain state management library for dapps.","contributors":[{"name":"Stefan Ionescu","email":"stefanionescu@protonmail.com"},{"name":"Michael Elliot","email":"mike@makerdao.com"},{"name":"Joshua Levine","email":"joshua@makerdao.com"},{"name":"Lawrence Wang","email":"lawrence@makerdao.com"}],"license":"MIT","keywords":["multicall","amra-finance"],"homepage":"https://github.com/amra-finance/multicall.js#readme","bugs":{"url":"https://github.com/amra-finance/multicall.js/issues"},"repository":{"type":"git","url":"git+https://github.com/amra-finance/multicall.js.git"},"main":"dist/build.cjs.js","module":"dist/build.esm.js","browser":"dist/build.esm.js","browserslist":"> 0.25%, not dead","scripts":{"clean":"rm -rf dist","build":"yarn clean && rollup -c","watch":"yarn clean && rollup -w -c","example":"DEBUG=multicall node_modules/.bin/babel-node examples/es-example.js","test":"jest --runInBand","prepublishOnly":"yarn test && yarn build"},"dependencies":{"cross-fetch":"^3.0.4","debug":"^4.1.1","ethers":"^4.0.27","isomorphic-ws":"^4.0.1","js-sha3":"^0.8.0","lodash":"^4.17.11","ws":"^7.2.0"},"devDependencies":{"@babel/core":"^7.1.2","@babel/node":"^7.0.0","@babel/plugin-external-helpers":"^7.2.0","@babel/plugin-proposal-class-properties":"^7.2.3","@babel/plugin-transform-runtime":"^7.1.0","@babel/preset-env":"^7.1.0","@babel/runtime":"^7.1.2","babel-core":"^7.0.0-bridge.0","babel-jest":"^23.6.0","bignumber.js":"^9.0.0","jest":"^24.5.0","jest-fetch-mock":"^2.1.2","jest-websocket-mock":"^2.0.0","mock-socket":"^9.0.2","rollup":"^0.66.6","rollup-plugin-auto-external":"^2.0.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-babel-minify":"^7.0.0","rollup-plugin-bundle-size":"^1.0.2","rollup-plugin-cleanup":"^3.1.1","rollup-plugin-commonjs":"^9.2.0","rollup-plugin-json":"^3.1.0","rollup-plugin-node-builtins":"^2.1.2","rollup-plugin-node-globals":"^1.4.0","rollup-plugin-node-resolve":"^3.4.0"},"gitHead":"d07d60ecaf0b42f618080d7228e61f84437e6cf2","_id":"@amra-finance/multicall@0.1.0","_nodeVersion":"8.9.4","_npmVersion":"6.8.0","dist":{"integrity":"sha512-/M1n3YlIhB2g+C2ktj/JxRrZ4GBhKx3LsPQsTXr99igVHC2MgL1Ss6XNIKA1IY8CLcqcG//fEQbk0H1VG/Em0g==","shasum":"fab5c5034dd9c76d1fbcdee404d485cb9e411bb7","tarball":"https://registry.npmjs.org/@amra-finance/multicall/-/multicall-0.1.0.tgz","fileCount":13,"unpackedSize":449110,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeDjy+CRA9TVsSAnZWagAAt2MQAJAOJ95vDUbfQ47RCV4O\nMuYYhuMiH57Gy99HYf/AaRRCfRPguU844mKeEvGsJgDD83spslgjQwwA12Pz\nEBi5hM2YCNzFVbWjO3ovFy8JR3q3CsLrDDIHcBeP7AaBvOuBgdsdztqve7F6\nrR2G3Nkeq4Ax0er2UcT2gZ0Oa/2y3+FzHpw5ABvn7rqYWGdq77MSXf7xQ3PQ\nuvR1O54TcnzLmaeX2oqPoTqp2wcoO6UcYoIZVZ1VJUGcbeCLsb/htvnqYb8e\nVXoVCqlABY6xACYJDCOZTt2cb41cl8kG7j14uDD6OH6ZqFJ66UNCzT52kOzx\nRszZSvHj0mSClUvkHeSdvi7iBaRniW+6QnkctwaGw9PT0DwkiwJLPdt5Cuet\nZIw7VW5rQHAlIEFeNwQbou2ylKLp58AOHmD1tem4/P3ummJrdRdIFKKPKgqb\nu9hFp+LHc46iPqi2VnJDOp4aYQSUi3N5MfrS2wKzAbEmIZN5HVykLSBzkom5\n9l4lrk+2SjpucPVQ7AIGq7aKvhKh5uX4Y2atTMEf350ovupAb5mj5xosPCQY\nnXK4UFLjnEELb5chThSRgHE+QAKz+ZrkjPXfiPaZTQPtOX1OxVP5Z3ZSJ2oX\nrbPsWgNuA/ANFuuYAAolNjwEzwv6NlB4t8/LT7h1BYSqDD0eDnGch3HtJ0tC\n3YCw\r\n=E9I5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5AclY32mST7+RJgvAzrfm5mcK9j3pk6eJWgKX4+mkMgIgMYXS5S7LLq0jhJ2VW0xzWKOxNnqGtOqgr7dkUVIlz00="}]},"maintainers":[{"name":"stefanionescu","email":"stefanionescu@protonmail.com"}],"_npmUser":{"name":"stefanionescu","email":"stefanionescu@protonmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/multicall_0.1.0_1577991358111_0.1134379377939505"},"_hasShrinkwrap":false},"0.1.1":{"name":"@amra-finance/multicall","version":"0.1.1","description":"A blockchain state management library for dapps.","contributors":[{"name":"Stefan Ionescu","email":"stefanionescu@protonmail.com"},{"name":"Michael Elliot","email":"mike@makerdao.com"},{"name":"Joshua Levine","email":"joshua@makerdao.com"},{"name":"Lawrence Wang","email":"lawrence@makerdao.com"}],"license":"MIT","keywords":["multicall","amra-finance"],"homepage":"https://github.com/amra-finance/multicall.js#readme","bugs":{"url":"https://github.com/amra-finance/multicall.js/issues"},"repository":{"type":"git","url":"git+https://github.com/amra-finance/multicall.js.git"},"main":"dist/multicall.cjs.js","module":"dist/multicall.esm.js","unpkg":"dist/multicall.umd.js","scripts":{"clean":"rimraf dist","build":"rollup -c","watch":"rollup -w -c","example":"cross-env DEBUG=multicall babel-node --plugins @babel/plugin-transform-modules-commonjs examples/es-example.js","test":"jest","test:debug":"node --inspect-brk node_modules/.bin/jest --runInBand","prepublishOnly":"yarn test && yarn clean && yarn build"},"dependencies":{"@babel/runtime":"^7.7.4","cross-fetch":"^3.0.4","debug":"^4.1.1","ethers":"^4.0.27","invariant":"^2.2.4","isomorphic-ws":"^4.0.1","lodash":"^4.17.11","ws":"^7.2.0"},"devDependencies":{"@babel/cli":"^7.6.0","@babel/core":"^7.6.0","@babel/node":"^7.6.1","@babel/plugin-external-helpers":"^7.2.0","@babel/plugin-transform-runtime":"^7.7.4","@babel/preset-env":"^7.6.0","babel-jest":"^24.9.0","bignumber.js":"^9.0.0","cross-env":"^5.2.1","jest":"^24.9.0","jest-fetch-mock":"^2.1.2","jest-websocket-mock":"^2.0.0","mock-socket":"^9.0.2","rimraf":"^3.0.0","rollup":"^1.20.3","rollup-plugin-babel":"^4.3.3","rollup-plugin-bundle-size":"^1.0.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^3.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-replace":"^2.2.0","rollup-plugin-terser":"^5.1.1"},"sideEffects":false,"gitHead":"c951ae962f6d0336776af0a49f3d85ed863b1245","_id":"@amra-finance/multicall@0.1.1","_nodeVersion":"10.16.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9BAibI1yQsJpEIWu/fPwELEeFYIUIr1xbDdxPlHHwbSsF+t5XC55CmSe4xqSUSfys/tokSEWTmxQxnYxY9Lzmg==","shasum":"11cc5bff0a3108bd2f80cb44f0386ac650bcbe3d","tarball":"https://registry.npmjs.org/@amra-finance/multicall/-/multicall-0.1.1.tgz","fileCount":16,"unpackedSize":1229635,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZOp1CRA9TVsSAnZWagAATroQAIEQiprHrolzUpQDgaOq\n6Fwiap88I0NSieg0YGtoeTevIuWdwICSJkE2xbTDa603SPvsBXmU7mIlxfsE\n2i2og2OU6TxwfmWgtgWYS3hYBtqiI9W2lgmIQ6/i9QtGu35i6s3RKRcLP7bG\nQ7AVx1RtcVnnweUfARLiKdSztGWQCR4s9cU1tACVGIYnBssF8UHPODXcGaWZ\nDwNU4tlKfG2WL1LfPiW6ayUYzTe7OPh59UCaMpuz78Ip4mOQ1ihPQ6Z6elCE\n3S6zJ2v/RRVYo6OOd+Kvj8ytS0Mydb0iFuQ71ftPlezgTeMN3J7uW+mgQ+8f\ntwNMaPDkSHa95IXqHb9txYQmiMaEr/GwtOowlmZl+UV7O3QDdG4R7od4IP+H\n6JkAVq0vDutvcUca21YGwx3uXQXJnKYUFqw8RsGB/E5b5595iAEsh0urIlIy\nqeniUdyekWEWU+s7AOWFo4AAl1CrrN9/Y+efjCzvMMVbz3lxJFUOxbcntnkq\nuBYw1hLyPwYTH010aPROhMMik7juUActl0+eaCXOx1E/SYvNLviJxPGZeTkJ\nyQSr5/gL3UFLzYHvFTCXi0kELUuZuKR4kdtG9mN9DLrjfPEGeLvOg6+vgDG6\n18iOv3veiO4t8NbQy+8ahMF4vC+vABzBBQ/BphUS292zNuE4ha86D2Svm6YY\nb0V3\r\n=OZDs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICclb0eV3kp1PJAVXOpKaZKB0vyjLDuy2CU+N8+xkIfMAiB68ipbYzOh1TGKUF0eTE0JOKOE9zUnvBk7q2c6eS9C6Q=="}]},"maintainers":[{"name":"stefanionescu","email":"stefanionescu@protonmail.com"}],"_npmUser":{"name":"stefanionescu","email":"stefanionescu@protonmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/multicall_0.1.1_1583671924720_0.853411815586046"},"_hasShrinkwrap":false}},"time":{"created":"2020-01-02T18:55:57.872Z","0.1.0":"2020-01-02T18:55:58.300Z","modified":"2022-04-04T13:52:57.854Z","0.1.1":"2020-03-08T12:52:04.916Z"},"maintainers":[{"name":"stefanionescu","email":"stefanionescu@protonmail.com"}],"description":"A blockchain state management library for dapps.","homepage":"https://github.com/amra-finance/multicall.js#readme","keywords":["multicall","amra-finance"],"repository":{"type":"git","url":"git+https://github.com/amra-finance/multicall.js.git"},"contributors":[{"name":"Stefan Ionescu","email":"stefanionescu@protonmail.com"},{"name":"Michael Elliot","email":"mike@makerdao.com"},{"name":"Joshua Levine","email":"joshua@makerdao.com"},{"name":"Lawrence Wang","email":"lawrence@makerdao.com"}],"bugs":{"url":"https://github.com/amra-finance/multicall.js/issues"},"license":"MIT","readme":"# Multicall.js\n\n[![npm version](https://img.shields.io/npm/v/@amra-finance/multicall.svg?style=flat-square)](https://www.npmjs.com/package/@amra-finance/multicall)\n\n**Multicall.js** is a lightweight JavaScript library for interacting with the [multicall](https://github.com/amra-finance/multicall) smart contract.\n\nMulticall allows multiple smart contract constant function calls to be grouped into a single call and the results aggregated into a single result. This reduces the number of separate JSON RPC requests that need to be sent over the network if using a remote node like Infura, and provides the guarantee that all values returned are from the same block. The latest block number is also returned along with the aggregated results.\n\n## Summary\n\n- Get the return value(s) of multiple smart contract function calls in a single call\n- Guarantee that all values are from the same block\n- Use watchers to poll for multiple blockchain state variables/functions\n- Get updates when a watcher detects state has changed\n- Results from out of sync nodes are automatically ignored\n- Get new block updates\n\n## Installation\n\n```bash\nyarn add @amra-finance/multicall\n```\n\n## Usage\n\n```javascript\nimport { createWatcher } from '@amra-finance/multicall';\n\n// Contract addresses used in this example\nconst ARA_TOKEN = '0xaaf64bfcc32d0f15873a02163e7e500671a4ffcd';\nconst ARA_WHALE = '0xdb33dfd3d61308c33c63209845dad3e6bfb2c674';\nconst ARA_FISH = '0x2dfcedcb401557354d0cf174876ab17bfd6f4efd';\n\n// Preset can be 'mainnet', 'kovan', 'rinkeby' or 'goerli'\nconst config = { preset: 'kovan' };\n\n// Create watcher\nconst watcher = createWatcher(\n  [\n    {\n      target: ARA_TOKEN,\n      call: ['balanceOf(address)(uint256)', ARA_WHALE],\n      returns: [['BALANCE_OF_ARA_WHALE', val => val / 10 ** 18]]\n    }\n  ],\n  config\n);\n\n// Subscribe to state updates\nwatcher.subscribe(update => {\nconsole.log(`Update: ${update.type} = ${update.value}`);\n});\n\n// Subscribe to batched state updates\nwatcher.batch().subscribe(updates => {\n  // Handle batched updates here\n  // Updates are returned as { type, value } objects, e.g:\n  // { type: 'BALANCE_OF_ARA_WHALE', value: 70000 }\n});\n\n// Subscribe to new block number updates\nwatcher.onNewBlock(blockNumber => {\n  console.log('New block:', blockNumber);\n});\n\n// Start the watcher polling\nwatcher.start();\n```\n\n```javascript\n// The JSON RPC URL and multicall contract address can also be specified in the config:\nconst config = {\n  rpcUrl: 'https://kovan.infura.io',\n  multicallAddress: '0xc49ab4d7de648a97592ed3d18720e00356b4a806'\n};\n```\n\n```javascript\n// Update the watcher calls using tap()\nconst fetchWaiter = watcher.tap(calls => [\n  // Pass back existing calls...\n  ...calls,\n  // ...plus new calls\n  {\n    target: ARA_TOKEN,\n    call: ['balanceOf(address)(uint256)', ARA_FISH],\n    returns: [['BALANCE_OF_ARA_FISH', val => val / 10 ** 18]]\n  }\n]);\n// This promise resolves when the first fetch completes\nfetchWaiter.then(() => {\n  console.log('Initial fetch completed');\n});\n```\n\n```javascript\n// Recreate the watcher with new calls and config (allowing the network to be changed)\nconst config = { preset: 'mainnet' };\nwatcher.recreate(\n  [\n    {\n      target: ARA_TOKEN,\n      call: ['balanceOf(address)(uint256)', ARA_WHALE],\n      returns: [['BALANCE_OF_ARA_WHALE', val => val / 10 ** 18]]\n    }\n  ],\n  config\n);\n```\n\n## Helper Functions\nSpecial variables and functions (e.g. `addr.balance`, `block.blockhash`, `block.timestamp`) can be accessed by calling their corresponding helper function.\nTo call these helper functions simply omit the `target` property (and it will default to multicall's contract address).\n```javascript\nconst watcher = createWatcher(\n  [\n    {\n      call: [\n        'getBnbBalance(address)(uint256)',\n        '0x72776bb917751225d24c07d0663b3780b2ada67c'\n      ],\n      returns: [['BNB_BALANCE', val => val / 10 ** 18]]\n    },\n    {\n      call: ['getBlockHash(uint256)(bytes32)', 11482494],\n      returns: [['SPECIFIC_BLOCK_HASH_0xFF4DB']]\n    },\n    {\n      call: ['getLastBlockHash()(bytes32)'],\n      returns: [['LAST_BLOCK_HASH']]\n    },\n    {\n      call: ['getCurrentBlockTimestamp()(uint256)'],\n      returns: [['CURRENT_BLOCK_TIMESTAMP']]\n    },\n    {\n      call: ['getCurrentBlockDifficulty()(uint256)'],\n      returns: [['CURRENT_BLOCK_DIFFICULTY']]\n    },\n    {\n      call: ['getCurrentBlockGasLimit()(uint256)'],\n      returns: [['CURRENT_BLOCK_GASLIMIT']]\n    },\n    {\n      call: ['getCurrentBlockCoinbase()(address)'],\n      returns: [['CURRENT_BLOCK_COINBASE']]\n    }\n  ],\n  { preset: 'kovan' }\n);\n```\n\n## Examples\n\nTo run the example in the project, first clone this repo:\n\n```bash\ngit clone https://github.com/amra-finance/multicall.js\n```\n\nThen install the dependencies:\n\n```bash\nyarn\n```\n\nFinally run the example script (`examples/es-example.js`):\n\n```bash\nyarn example\n```\n\n## Test\n\nTo run tests use:\n\n```bash\nyarn test\n```\n","readmeFilename":"README.md"}