@pancakeswap/multicall 1.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG;IACvD,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAA"}
package/package.json CHANGED
@@ -1,26 +1,23 @@
1
1
  {
2
2
  "name": "@pancakeswap/multicall",
3
- "version": "1.0.0",
3
+ "version": "3.0.0",
4
4
  "sideEffects": false,
5
- "scripts": {
6
- "build": "tsup",
7
- "dev": "tsup --watch",
8
- "prepublishOnly": "yarn run build",
9
- "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
10
- },
11
- "peerDependencies": {
12
- "@pancakeswap/sdk": "^3.2.0"
13
- },
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "module": "dist/index.mjs",
14
11
  "dependencies": {
15
- "@ethersproject/abi": "^5.0.0",
16
- "@ethersproject/contracts": "^5.0.0",
17
- "@ethersproject/providers": "^5.0.0"
12
+ "viem": "^1.2.9",
13
+ "@pancakeswap/sdk": "5.4.1"
18
14
  },
19
15
  "devDependencies": {
20
- "@pancakeswap/sdk": "*",
21
- "tsconfig": "*",
22
- "tsup": "^6.6.3",
23
- "typescript": "^4.9.4"
16
+ "tsup": "^6.7.0",
17
+ "typescript": "^5.1.3",
18
+ "vitest": "^0.27.2",
19
+ "@pancakeswap/tsconfig": "0.0.0",
20
+ "@pancakeswap/utils": "5.0.2"
24
21
  },
25
22
  "exports": {
26
23
  "./package.json": "./package.json",
@@ -29,5 +26,12 @@
29
26
  "import": "./dist/index.mjs",
30
27
  "require": "./dist/index.js"
31
28
  }
29
+ },
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "test": "vitest --run",
34
+ "coverage": "vitest run --coverage",
35
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
32
36
  }
33
- }
37
+ }
@@ -1,16 +0,0 @@
1
- warning package.json: No license field
2
- $ tsup
3
- CLI Building entry: {"index":"index.ts"}
4
- CLI Using tsconfig: tsconfig.json
5
- CLI tsup v6.6.3
6
- CLI Using tsup config: /home/runner/work/pancake-frontend/pancake-frontend/packages/multicall/tsup.config.ts
7
- CLI Target: node14
8
- ESM Build start
9
- CJS Build start
10
- CJS dist/index.js 10.71 KB
11
- CJS ⚡️ Build success in 389ms
12
- ESM dist/index.mjs 10.57 KB
13
- ESM ⚡️ Build success in 391ms
14
- DTS Build start
15
- DTS ⚡️ Build success in 9625ms
16
- DTS dist/index.d.ts 2.03 KB
package/CHANGELOG.md DELETED
@@ -1,18 +0,0 @@
1
- # @pancakeswap/multicall
2
-
3
- ## 1.0.0
4
-
5
- ### Minor Changes
6
-
7
- - 65fbb250a: Bump version
8
-
9
- ### Patch Changes
10
-
11
- - Updated dependencies [65fbb250a]
12
- - @pancakeswap/sdk@3.2.0
13
-
14
- ## 0.0.2
15
-
16
- ### Patch Changes
17
-
18
- - 1e4a4b27c: Base multicall feature
package/Multicall.json DELETED
@@ -1,236 +0,0 @@
1
- [
2
- {
3
- "inputs": [
4
- {
5
- "components": [
6
- { "internalType": "address", "name": "target", "type": "address" },
7
- { "internalType": "bytes", "name": "callData", "type": "bytes" }
8
- ],
9
- "internalType": "struct Multicall3.Call[]",
10
- "name": "calls",
11
- "type": "tuple[]"
12
- }
13
- ],
14
- "name": "aggregate",
15
- "outputs": [
16
- { "internalType": "uint256", "name": "blockNumber", "type": "uint256" },
17
- { "internalType": "bytes[]", "name": "returnData", "type": "bytes[]" }
18
- ],
19
- "stateMutability": "payable",
20
- "type": "function"
21
- },
22
- {
23
- "inputs": [
24
- {
25
- "components": [
26
- { "internalType": "address", "name": "target", "type": "address" },
27
- { "internalType": "bool", "name": "allowFailure", "type": "bool" },
28
- { "internalType": "bytes", "name": "callData", "type": "bytes" }
29
- ],
30
- "internalType": "struct Multicall3.Call3[]",
31
- "name": "calls",
32
- "type": "tuple[]"
33
- }
34
- ],
35
- "name": "aggregate3",
36
- "outputs": [
37
- {
38
- "components": [
39
- { "internalType": "bool", "name": "success", "type": "bool" },
40
- { "internalType": "bytes", "name": "returnData", "type": "bytes" }
41
- ],
42
- "internalType": "struct Multicall3.Result[]",
43
- "name": "returnData",
44
- "type": "tuple[]"
45
- }
46
- ],
47
- "stateMutability": "payable",
48
- "type": "function"
49
- },
50
- {
51
- "inputs": [
52
- {
53
- "components": [
54
- { "internalType": "address", "name": "target", "type": "address" },
55
- { "internalType": "bool", "name": "allowFailure", "type": "bool" },
56
- { "internalType": "uint256", "name": "value", "type": "uint256" },
57
- { "internalType": "bytes", "name": "callData", "type": "bytes" }
58
- ],
59
- "internalType": "struct Multicall3.Call3Value[]",
60
- "name": "calls",
61
- "type": "tuple[]"
62
- }
63
- ],
64
- "name": "aggregate3Value",
65
- "outputs": [
66
- {
67
- "components": [
68
- { "internalType": "bool", "name": "success", "type": "bool" },
69
- { "internalType": "bytes", "name": "returnData", "type": "bytes" }
70
- ],
71
- "internalType": "struct Multicall3.Result[]",
72
- "name": "returnData",
73
- "type": "tuple[]"
74
- }
75
- ],
76
- "stateMutability": "payable",
77
- "type": "function"
78
- },
79
- {
80
- "inputs": [
81
- {
82
- "components": [
83
- { "internalType": "address", "name": "target", "type": "address" },
84
- { "internalType": "bytes", "name": "callData", "type": "bytes" }
85
- ],
86
- "internalType": "struct Multicall3.Call[]",
87
- "name": "calls",
88
- "type": "tuple[]"
89
- }
90
- ],
91
- "name": "blockAndAggregate",
92
- "outputs": [
93
- { "internalType": "uint256", "name": "blockNumber", "type": "uint256" },
94
- { "internalType": "bytes32", "name": "blockHash", "type": "bytes32" },
95
- {
96
- "components": [
97
- { "internalType": "bool", "name": "success", "type": "bool" },
98
- { "internalType": "bytes", "name": "returnData", "type": "bytes" }
99
- ],
100
- "internalType": "struct Multicall3.Result[]",
101
- "name": "returnData",
102
- "type": "tuple[]"
103
- }
104
- ],
105
- "stateMutability": "payable",
106
- "type": "function"
107
- },
108
- {
109
- "inputs": [],
110
- "name": "getBasefee",
111
- "outputs": [{ "internalType": "uint256", "name": "basefee", "type": "uint256" }],
112
- "stateMutability": "view",
113
- "type": "function"
114
- },
115
- {
116
- "inputs": [{ "internalType": "uint256", "name": "blockNumber", "type": "uint256" }],
117
- "name": "getBlockHash",
118
- "outputs": [{ "internalType": "bytes32", "name": "blockHash", "type": "bytes32" }],
119
- "stateMutability": "view",
120
- "type": "function"
121
- },
122
- {
123
- "inputs": [],
124
- "name": "getBlockNumber",
125
- "outputs": [{ "internalType": "uint256", "name": "blockNumber", "type": "uint256" }],
126
- "stateMutability": "view",
127
- "type": "function"
128
- },
129
- {
130
- "inputs": [],
131
- "name": "getChainId",
132
- "outputs": [{ "internalType": "uint256", "name": "chainid", "type": "uint256" }],
133
- "stateMutability": "view",
134
- "type": "function"
135
- },
136
- {
137
- "inputs": [],
138
- "name": "getCurrentBlockCoinbase",
139
- "outputs": [{ "internalType": "address", "name": "coinbase", "type": "address" }],
140
- "stateMutability": "view",
141
- "type": "function"
142
- },
143
- {
144
- "inputs": [],
145
- "name": "getCurrentBlockDifficulty",
146
- "outputs": [{ "internalType": "uint256", "name": "difficulty", "type": "uint256" }],
147
- "stateMutability": "view",
148
- "type": "function"
149
- },
150
- {
151
- "inputs": [],
152
- "name": "getCurrentBlockGasLimit",
153
- "outputs": [{ "internalType": "uint256", "name": "gaslimit", "type": "uint256" }],
154
- "stateMutability": "view",
155
- "type": "function"
156
- },
157
- {
158
- "inputs": [],
159
- "name": "getCurrentBlockTimestamp",
160
- "outputs": [{ "internalType": "uint256", "name": "timestamp", "type": "uint256" }],
161
- "stateMutability": "view",
162
- "type": "function"
163
- },
164
- {
165
- "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }],
166
- "name": "getEthBalance",
167
- "outputs": [{ "internalType": "uint256", "name": "balance", "type": "uint256" }],
168
- "stateMutability": "view",
169
- "type": "function"
170
- },
171
- {
172
- "inputs": [],
173
- "name": "getLastBlockHash",
174
- "outputs": [{ "internalType": "bytes32", "name": "blockHash", "type": "bytes32" }],
175
- "stateMutability": "view",
176
- "type": "function"
177
- },
178
- {
179
- "inputs": [
180
- { "internalType": "bool", "name": "requireSuccess", "type": "bool" },
181
- {
182
- "components": [
183
- { "internalType": "address", "name": "target", "type": "address" },
184
- { "internalType": "bytes", "name": "callData", "type": "bytes" }
185
- ],
186
- "internalType": "struct Multicall3.Call[]",
187
- "name": "calls",
188
- "type": "tuple[]"
189
- }
190
- ],
191
- "name": "tryAggregate",
192
- "outputs": [
193
- {
194
- "components": [
195
- { "internalType": "bool", "name": "success", "type": "bool" },
196
- { "internalType": "bytes", "name": "returnData", "type": "bytes" }
197
- ],
198
- "internalType": "struct Multicall3.Result[]",
199
- "name": "returnData",
200
- "type": "tuple[]"
201
- }
202
- ],
203
- "stateMutability": "payable",
204
- "type": "function"
205
- },
206
- {
207
- "inputs": [
208
- { "internalType": "bool", "name": "requireSuccess", "type": "bool" },
209
- {
210
- "components": [
211
- { "internalType": "address", "name": "target", "type": "address" },
212
- { "internalType": "bytes", "name": "callData", "type": "bytes" }
213
- ],
214
- "internalType": "struct Multicall3.Call[]",
215
- "name": "calls",
216
- "type": "tuple[]"
217
- }
218
- ],
219
- "name": "tryBlockAndAggregate",
220
- "outputs": [
221
- { "internalType": "uint256", "name": "blockNumber", "type": "uint256" },
222
- { "internalType": "bytes32", "name": "blockHash", "type": "bytes32" },
223
- {
224
- "components": [
225
- { "internalType": "bool", "name": "success", "type": "bool" },
226
- { "internalType": "bytes", "name": "returnData", "type": "bytes" }
227
- ],
228
- "internalType": "struct Multicall3.Result[]",
229
- "name": "returnData",
230
- "type": "tuple[]"
231
- }
232
- ],
233
- "stateMutability": "payable",
234
- "type": "function"
235
- }
236
- ]
package/index.ts DELETED
@@ -1,165 +0,0 @@
1
- import { Interface, Fragment } from '@ethersproject/abi'
2
- import { CallOverrides, Contract } from '@ethersproject/contracts'
3
- import { Provider } from '@ethersproject/providers'
4
- import { ChainId } from '@pancakeswap/sdk'
5
- import type { Multicallv2Typed, Multicallv3Typed } from '@pancakeswap/utils/abitype'
6
-
7
- import multicallAbi from './Multicall.json'
8
-
9
- export type TMulticallv3Typed = typeof Multicallv3Typed
10
- export type TMulticallv2Typed = typeof Multicallv2Typed
11
-
12
- export const multicallAddresses = {
13
- 1: '0xcA11bde05977b3631167028862bE2a173976CA11',
14
- 4: '0xcA11bde05977b3631167028862bE2a173976CA11',
15
- 5: '0xcA11bde05977b3631167028862bE2a173976CA11',
16
- 56: '0xcA11bde05977b3631167028862bE2a173976CA11',
17
- 97: '0xcA11bde05977b3631167028862bE2a173976CA11',
18
- }
19
-
20
- export const getMulticallContract = (chainId: ChainId, provider: Provider) => {
21
- if (multicallAddresses[chainId]) {
22
- return new Contract(multicallAddresses[chainId], multicallAbi, provider)
23
- }
24
- return null
25
- }
26
-
27
- export interface Call {
28
- address: string // Address of the contract
29
- name: string // Function name on the contract (example: balanceOf)
30
- params?: any[] // Function params
31
- }
32
-
33
- export interface MulticallOptions extends CallOverrides {
34
- requireSuccess?: boolean
35
- }
36
-
37
- /**
38
- * Multicall V2 uses the new "tryAggregate" function. It is different in 2 ways
39
- *
40
- * 1. If "requireSuccess" is false multicall will not bail out if one of the calls fails
41
- * 2. The return includes a boolean whether the call was successful e.g. [wasSuccessful, callResult]
42
- */
43
- interface MulticallV2Params {
44
- abi: any[] | any
45
- calls: Call[]
46
- chainId?: ChainId
47
- options?: MulticallOptions
48
- provider?: Provider
49
- }
50
-
51
- export interface CallV3 extends Call {
52
- abi: any[]
53
- allowFailure?: boolean
54
- }
55
-
56
- interface MulticallV3Params {
57
- calls: CallV3[]
58
- chainId?: ChainId
59
- allowFailure?: boolean
60
- overrides?: CallOverrides
61
- }
62
-
63
- export type MultiCallV2 = <T = any>(params: MulticallV2Params) => Promise<T>
64
- export type MultiCall = <T = any>(abi: any[], calls: Call[], chainId?: ChainId) => Promise<T>
65
-
66
- export function createMulticall<TProvider extends Provider>(
67
- provider: ({ chainId }: { chainId?: number | undefined }) => TProvider,
68
- ) {
69
- const multicall: MultiCall = async (abi: any[], calls: Call[], chainId = ChainId.BSC) => {
70
- const multi = getMulticallContract(chainId, provider({ chainId }))
71
- if (!multi) throw new Error(`Multicall Provider missing for ${chainId}`)
72
- const itf = new Interface(abi)
73
-
74
- const calldata = calls.map((call) => ({
75
- target: call.address.toLowerCase(),
76
- callData: itf.encodeFunctionData(call.name, call.params),
77
- }))
78
- const { returnData } = await multi.callStatic.aggregate(calldata)
79
-
80
- const res = returnData.map((call: any, i: number) => itf.decodeFunctionResult(calls[i].name, call))
81
-
82
- return res as any
83
- }
84
-
85
- const multicallv2: MultiCallV2 = async ({ abi, calls, chainId = ChainId.BSC, options, provider: _provider }) => {
86
- const { requireSuccess = true, ...overrides } = options || {}
87
- const multi = getMulticallContract(chainId, _provider || provider({ chainId }))
88
- if (!multi) throw new Error(`Multicall Provider missing for ${chainId}`)
89
- const itf = new Interface(abi)
90
-
91
- const calldata = calls.map((call) => ({
92
- target: call.address.toLowerCase(),
93
- callData: itf.encodeFunctionData(call.name, call.params),
94
- }))
95
-
96
- const returnData = await multi.callStatic.tryAggregate(requireSuccess, calldata, overrides)
97
- const res = returnData.map((call: any, i: number) => {
98
- const [result, data] = call
99
- return result && data !== '0x' ? itf.decodeFunctionResult(calls[i].name, data) : null
100
- })
101
-
102
- return res as any
103
- }
104
-
105
- const multicallv3 = async ({ calls, chainId = ChainId.BSC, allowFailure, overrides }: MulticallV3Params) => {
106
- const multi = getMulticallContract(chainId, provider({ chainId }))
107
- if (!multi) throw new Error(`Multicall Provider missing for ${chainId}`)
108
- const interfaceCache = new WeakMap()
109
- const _calls = calls.map(({ abi, address, name, params, allowFailure: _allowFailure }) => {
110
- let itf = interfaceCache.get(abi)
111
- if (!itf) {
112
- itf = new Interface(abi)
113
- interfaceCache.set(abi, itf)
114
- }
115
- if (!itf.fragments.some((fragment: Fragment) => fragment.name === name))
116
- console.error(`${name} missing on ${address}`)
117
- const callData = itf.encodeFunctionData(name, params ?? [])
118
- return {
119
- target: address.toLowerCase(),
120
- allowFailure: allowFailure || _allowFailure,
121
- callData,
122
- }
123
- })
124
-
125
- const result = await multi.callStatic.aggregate3(_calls, ...(overrides ? [overrides] : []))
126
-
127
- return result.map((call: any, i: number) => {
128
- const { returnData, success } = call
129
- if (!success || returnData === '0x') return null
130
- const { abi, name } = calls[i]
131
- const itf = interfaceCache.get(abi)
132
- const decoded = itf?.decodeFunctionResult(name, returnData)
133
- return decoded
134
- })
135
- }
136
-
137
- const multicallv3Typed: typeof Multicallv3Typed = async ({ calls, allowFailure, chainId, overrides }) => {
138
- return multicallv3({
139
- // @ts-ignore
140
- calls,
141
- allowFailure,
142
- chainId,
143
- overrides,
144
- })
145
- }
146
-
147
- const multicallv2Typed: typeof Multicallv2Typed = async ({ abi, calls, chainId, options }) => {
148
- return multicallv2({
149
- // @ts-ignore
150
- abi,
151
- // @ts-ignore
152
- calls,
153
- chainId,
154
- options,
155
- })
156
- }
157
-
158
- return {
159
- multicall,
160
- multicallv2,
161
- multicallv3,
162
- multicallv3Typed,
163
- multicallv2Typed,
164
- }
165
- }
package/tsconfig.json DELETED
@@ -1,11 +0,0 @@
1
- {
2
- "extends": "tsconfig/base",
3
- "include": ["./index.ts"],
4
- "compilerOptions": {
5
- "outDir": "./dist",
6
- "esModuleInterop": true,
7
- "resolveJsonModule": true,
8
- "isolatedModules": true,
9
- "skipLibCheck": true
10
- }
11
- }
package/tsup.config.ts DELETED
@@ -1,11 +0,0 @@
1
- import { defineConfig } from 'tsup'
2
-
3
- export default defineConfig({
4
- entry: {
5
- index: 'index.ts',
6
- },
7
- format: ['esm', 'cjs'],
8
- dts: true,
9
- treeshake: true,
10
- splitting: true,
11
- })