@pepu-chain/sdk 0.0.0-stage → 0.2.1

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.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +590 -2
  3. package/dist/aa/kernel.cjs +41 -0
  4. package/dist/aa/kernel.cjs.map +1 -0
  5. package/dist/aa/kernel.d.cts +88 -0
  6. package/dist/aa/kernel.d.ts +88 -0
  7. package/dist/aa/kernel.guard.js +15 -0
  8. package/dist/aa/kernel.js +11 -0
  9. package/dist/aa/kernel.js.map +1 -0
  10. package/dist/aa/react-direct.cjs +111 -0
  11. package/dist/aa/react-direct.cjs.map +1 -0
  12. package/dist/aa/react-direct.d.cts +42 -0
  13. package/dist/aa/react-direct.d.ts +42 -0
  14. package/dist/aa/react-direct.guard.js +15 -0
  15. package/dist/aa/react-direct.js +107 -0
  16. package/dist/aa/react-direct.js.map +1 -0
  17. package/dist/aa/react.cjs +152 -0
  18. package/dist/aa/react.cjs.map +1 -0
  19. package/dist/aa/react.d.cts +62 -0
  20. package/dist/aa/react.d.ts +62 -0
  21. package/dist/aa/react.guard.js +15 -0
  22. package/dist/aa/react.js +147 -0
  23. package/dist/aa/react.js.map +1 -0
  24. package/dist/aa.cjs +84 -0
  25. package/dist/aa.cjs.map +1 -0
  26. package/dist/aa.d.cts +85 -0
  27. package/dist/aa.d.ts +85 -0
  28. package/dist/aa.js +11 -0
  29. package/dist/aa.js.map +1 -0
  30. package/dist/api-Dz4sCHH_.d.cts +654 -0
  31. package/dist/api-Dz4sCHH_.d.ts +654 -0
  32. package/dist/calls-BRPjKgjl.d.cts +70 -0
  33. package/dist/calls-z_EQOtFb.d.ts +70 -0
  34. package/dist/chains-DK13zGIp.d.cts +235 -0
  35. package/dist/chains-DK13zGIp.d.ts +235 -0
  36. package/dist/chunk-3XUGQODR.js +194 -0
  37. package/dist/chunk-3XUGQODR.js.map +1 -0
  38. package/dist/chunk-45KSZH26.cjs +145 -0
  39. package/dist/chunk-45KSZH26.cjs.map +1 -0
  40. package/dist/chunk-4GINFJO6.cjs +44 -0
  41. package/dist/chunk-4GINFJO6.cjs.map +1 -0
  42. package/dist/chunk-62M2LKQW.js +136 -0
  43. package/dist/chunk-62M2LKQW.js.map +1 -0
  44. package/dist/chunk-6DSZ4Z2N.js +498 -0
  45. package/dist/chunk-6DSZ4Z2N.js.map +1 -0
  46. package/dist/chunk-7MNJF2OB.cjs +72 -0
  47. package/dist/chunk-7MNJF2OB.cjs.map +1 -0
  48. package/dist/chunk-7PVR7QSE.js +45 -0
  49. package/dist/chunk-7PVR7QSE.js.map +1 -0
  50. package/dist/chunk-A5LP2UCS.cjs +2729 -0
  51. package/dist/chunk-A5LP2UCS.cjs.map +1 -0
  52. package/dist/chunk-AJS4UFQX.cjs +121 -0
  53. package/dist/chunk-AJS4UFQX.cjs.map +1 -0
  54. package/dist/chunk-BGALSKAF.cjs +315 -0
  55. package/dist/chunk-BGALSKAF.cjs.map +1 -0
  56. package/dist/chunk-C2XW44FI.cjs +200 -0
  57. package/dist/chunk-C2XW44FI.cjs.map +1 -0
  58. package/dist/chunk-C7IC36XS.cjs +13 -0
  59. package/dist/chunk-C7IC36XS.cjs.map +1 -0
  60. package/dist/chunk-D52PADVY.js +84 -0
  61. package/dist/chunk-D52PADVY.js.map +1 -0
  62. package/dist/chunk-DH6BFNVJ.cjs +272 -0
  63. package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
  64. package/dist/chunk-DPCZJLB3.cjs +87 -0
  65. package/dist/chunk-DPCZJLB3.cjs.map +1 -0
  66. package/dist/chunk-EHBPIYY4.js +262 -0
  67. package/dist/chunk-EHBPIYY4.js.map +1 -0
  68. package/dist/chunk-ESMNAXUI.js +86 -0
  69. package/dist/chunk-ESMNAXUI.js.map +1 -0
  70. package/dist/chunk-F2R473FR.js +304 -0
  71. package/dist/chunk-F2R473FR.js.map +1 -0
  72. package/dist/chunk-IB2FSPMJ.js +66 -0
  73. package/dist/chunk-IB2FSPMJ.js.map +1 -0
  74. package/dist/chunk-IG7RSL2Y.cjs +178 -0
  75. package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
  76. package/dist/chunk-IY3ALPUJ.js +2716 -0
  77. package/dist/chunk-IY3ALPUJ.js.map +1 -0
  78. package/dist/chunk-J3O2ZGG3.cjs +93 -0
  79. package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
  80. package/dist/chunk-J6UXXHBE.js +37 -0
  81. package/dist/chunk-J6UXXHBE.js.map +1 -0
  82. package/dist/chunk-JLZ4LZ4Z.js +22 -0
  83. package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
  84. package/dist/chunk-K7JSQPZO.cjs +231 -0
  85. package/dist/chunk-K7JSQPZO.cjs.map +1 -0
  86. package/dist/chunk-KJYNF5KH.js +224 -0
  87. package/dist/chunk-KJYNF5KH.js.map +1 -0
  88. package/dist/chunk-KVG3AYYR.js +99 -0
  89. package/dist/chunk-KVG3AYYR.js.map +1 -0
  90. package/dist/chunk-NE3QKDOB.cjs +24 -0
  91. package/dist/chunk-NE3QKDOB.cjs.map +1 -0
  92. package/dist/chunk-NVOPDXTA.cjs +95 -0
  93. package/dist/chunk-NVOPDXTA.cjs.map +1 -0
  94. package/dist/chunk-OH3QMAIB.js +11 -0
  95. package/dist/chunk-OH3QMAIB.js.map +1 -0
  96. package/dist/chunk-PHM3ZORG.cjs +110 -0
  97. package/dist/chunk-PHM3ZORG.cjs.map +1 -0
  98. package/dist/chunk-R5PXQNO3.cjs +209 -0
  99. package/dist/chunk-R5PXQNO3.cjs.map +1 -0
  100. package/dist/chunk-RCMKPJZO.cjs +49 -0
  101. package/dist/chunk-RCMKPJZO.cjs.map +1 -0
  102. package/dist/chunk-SVWRRALU.cjs +17 -0
  103. package/dist/chunk-SVWRRALU.cjs.map +1 -0
  104. package/dist/chunk-T43PQXJD.js +202 -0
  105. package/dist/chunk-T43PQXJD.js.map +1 -0
  106. package/dist/chunk-VBH3JLQ5.js +116 -0
  107. package/dist/chunk-VBH3JLQ5.js.map +1 -0
  108. package/dist/chunk-VF3D6KLQ.cjs +94 -0
  109. package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
  110. package/dist/chunk-VTQIHMF3.js +82 -0
  111. package/dist/chunk-VTQIHMF3.js.map +1 -0
  112. package/dist/chunk-W3JN3YIW.js +15 -0
  113. package/dist/chunk-W3JN3YIW.js.map +1 -0
  114. package/dist/chunk-WANILJZQ.cjs +87 -0
  115. package/dist/chunk-WANILJZQ.cjs.map +1 -0
  116. package/dist/chunk-XC4IBCI2.js +86 -0
  117. package/dist/chunk-XC4IBCI2.js.map +1 -0
  118. package/dist/chunk-YKEWWQEJ.js +165 -0
  119. package/dist/chunk-YKEWWQEJ.js.map +1 -0
  120. package/dist/chunk-YQL7NISX.cjs +515 -0
  121. package/dist/chunk-YQL7NISX.cjs.map +1 -0
  122. package/dist/chunk-ZB6SVBK4.js +89 -0
  123. package/dist/chunk-ZB6SVBK4.js.map +1 -0
  124. package/dist/combo/react.cjs +236 -0
  125. package/dist/combo/react.cjs.map +1 -0
  126. package/dist/combo/react.d.cts +148 -0
  127. package/dist/combo/react.d.ts +148 -0
  128. package/dist/combo/react.guard.js +15 -0
  129. package/dist/combo/react.js +230 -0
  130. package/dist/combo/react.js.map +1 -0
  131. package/dist/combo.cjs +263 -0
  132. package/dist/combo.cjs.map +1 -0
  133. package/dist/combo.d.cts +139 -0
  134. package/dist/combo.d.ts +139 -0
  135. package/dist/combo.guard.js +15 -0
  136. package/dist/combo.js +249 -0
  137. package/dist/combo.js.map +1 -0
  138. package/dist/config-CHjz7ZjZ.d.cts +57 -0
  139. package/dist/config-COjhIZTh.d.ts +57 -0
  140. package/dist/doctor.cjs +354 -0
  141. package/dist/doctor.cjs.map +1 -0
  142. package/dist/doctor.d.cts +177 -0
  143. package/dist/doctor.d.ts +177 -0
  144. package/dist/doctor.js +345 -0
  145. package/dist/doctor.js.map +1 -0
  146. package/dist/erc7677-DOW58QBE.d.cts +111 -0
  147. package/dist/erc7677-DOW58QBE.d.ts +111 -0
  148. package/dist/errors-CgX1vNj7.d.cts +100 -0
  149. package/dist/errors-CgX1vNj7.d.ts +100 -0
  150. package/dist/index.cjs +806 -0
  151. package/dist/index.cjs.map +1 -0
  152. package/dist/index.d.cts +2398 -0
  153. package/dist/index.d.ts +2398 -0
  154. package/dist/index.js +559 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/paymaster/server.cjs +38 -0
  157. package/dist/paymaster/server.cjs.map +1 -0
  158. package/dist/paymaster/server.d.cts +57 -0
  159. package/dist/paymaster/server.d.ts +57 -0
  160. package/dist/paymaster/server.js +36 -0
  161. package/dist/paymaster/server.js.map +1 -0
  162. package/dist/paymaster.cjs +356 -0
  163. package/dist/paymaster.cjs.map +1 -0
  164. package/dist/paymaster.d.cts +1851 -0
  165. package/dist/paymaster.d.ts +1851 -0
  166. package/dist/paymaster.js +289 -0
  167. package/dist/paymaster.js.map +1 -0
  168. package/dist/privy/react.cjs +49 -0
  169. package/dist/privy/react.cjs.map +1 -0
  170. package/dist/privy/react.d.cts +194 -0
  171. package/dist/privy/react.d.ts +194 -0
  172. package/dist/privy/react.guard.js +15 -0
  173. package/dist/privy/react.js +7 -0
  174. package/dist/privy/react.js.map +1 -0
  175. package/dist/privy/server.cjs +44 -0
  176. package/dist/privy/server.cjs.map +1 -0
  177. package/dist/privy/server.d.cts +192 -0
  178. package/dist/privy/server.d.ts +192 -0
  179. package/dist/privy/server.guard.js +15 -0
  180. package/dist/privy/server.js +6 -0
  181. package/dist/privy/server.js.map +1 -0
  182. package/dist/privy/wagmi.d.ts +90 -0
  183. package/dist/privy/wagmi.guard.js +15 -0
  184. package/dist/privy/wagmi.js +55 -0
  185. package/dist/privy/wagmi.js.map +1 -0
  186. package/dist/privy.cjs +34 -0
  187. package/dist/privy.cjs.map +1 -0
  188. package/dist/privy.d.cts +4 -0
  189. package/dist/privy.d.ts +4 -0
  190. package/dist/privy.js +5 -0
  191. package/dist/privy.js.map +1 -0
  192. package/dist/react.cjs +73 -0
  193. package/dist/react.cjs.map +1 -0
  194. package/dist/react.d.cts +66 -0
  195. package/dist/react.d.ts +66 -0
  196. package/dist/react.guard.js +15 -0
  197. package/dist/react.js +68 -0
  198. package/dist/react.js.map +1 -0
  199. package/dist/requirements-C-QiJkL9.d.cts +134 -0
  200. package/dist/requirements-C-QiJkL9.d.ts +134 -0
  201. package/dist/scope-DBRkN7bR.d.cts +94 -0
  202. package/dist/scope-DBRkN7bR.d.ts +94 -0
  203. package/dist/server.cjs +59 -0
  204. package/dist/server.cjs.map +1 -0
  205. package/dist/server.d.cts +208 -0
  206. package/dist/server.d.ts +208 -0
  207. package/dist/server.js +8 -0
  208. package/dist/server.js.map +1 -0
  209. package/dist/session/kernel.cjs +83 -0
  210. package/dist/session/kernel.cjs.map +1 -0
  211. package/dist/session/kernel.d.cts +131 -0
  212. package/dist/session/kernel.d.ts +131 -0
  213. package/dist/session/kernel.guard.js +15 -0
  214. package/dist/session/kernel.js +13 -0
  215. package/dist/session/kernel.js.map +1 -0
  216. package/dist/session/react.cjs +38 -0
  217. package/dist/session/react.cjs.map +1 -0
  218. package/dist/session/react.d.cts +119 -0
  219. package/dist/session/react.d.ts +119 -0
  220. package/dist/session/react.guard.js +15 -0
  221. package/dist/session/react.js +8 -0
  222. package/dist/session/react.js.map +1 -0
  223. package/dist/session/server.cjs +268 -0
  224. package/dist/session/server.cjs.map +1 -0
  225. package/dist/session/server.d.cts +151 -0
  226. package/dist/session/server.d.ts +151 -0
  227. package/dist/session/server.guard.js +15 -0
  228. package/dist/session/server.js +252 -0
  229. package/dist/session/server.js.map +1 -0
  230. package/dist/session.cjs +74 -0
  231. package/dist/session.cjs.map +1 -0
  232. package/dist/session.d.cts +3 -0
  233. package/dist/session.d.ts +3 -0
  234. package/dist/session.js +5 -0
  235. package/dist/session.js.map +1 -0
  236. package/dist/status-Dx9zAFo9.d.ts +327 -0
  237. package/dist/status-wgTM26V7.d.cts +327 -0
  238. package/dist/store-CjmLgp9g.d.cts +64 -0
  239. package/dist/store-CjmLgp9g.d.ts +64 -0
  240. package/dist/types-BEEM7WdG.d.cts +25 -0
  241. package/dist/types-BEEM7WdG.d.ts +25 -0
  242. package/dist/types-BilBTDqK.d.cts +27 -0
  243. package/dist/types-BilBTDqK.d.ts +27 -0
  244. package/package.json +245 -3
@@ -0,0 +1,2398 @@
1
+ import { P as PepuChain } from './chains-DK13zGIp.cjs';
2
+ export { a as PepuChainId, i as isPepuChain, p as pepuChains, b as pepuMainnet, c as pepuTestnet } from './chains-DK13zGIp.cjs';
3
+ import { j as ContractEntry, D as DeployedContract } from './status-wgTM26V7.cjs';
4
+ export { C as CheckSponsorshipOptions, G as GetSponsorshipStatusOptions, k as PendingContract, l as PepuAddressRow, m as PepuContractName, n as PepuContractRegistry, a as PepuKernelStack, S as SponsorshipReport, c as SponsorshipStatus, d as checkSponsorship, o as getContract, g as getKernelAccountAddress, q as getPepuAddressMap, r as getPepuAddresses, f as getPepuKernelStack, h as getSponsorshipStatus, s as isDeployed, t as listContracts, u as pepuContracts } from './status-wgTM26V7.cjs';
5
+ import { Address, Transport, PublicClient, Abi, EIP1193Provider, AddEthereumChainParameter, TransactionRequest, Hex, ContractFunctionParameters, MulticallReturnType, TypedDataDomain } from 'viem';
6
+ export { erc20Abi, erc721Abi } from 'viem';
7
+ export { B as BuildPaymasterRequestOptions, E as Erc7677UserOperation, P as PaymasterContext, a as PaymasterDataRequest, b as PaymasterDataResult, c as PaymasterRpcError, d as PaymasterRpcParams, e as PaymasterRpcResponse, f as PaymasterStubDataRequest, g as PaymasterStubDataResult, h as buildPaymasterContext, i as buildPaymasterDataRequest, j as buildPaymasterStubDataRequest } from './erc7677-DOW58QBE.cjs';
8
+ export { E as ErrorCatalogEntry, d as ErrorExplanation, e as PEPU_ERRORS_DOCS_URL, f as PEPU_ERROR_CATALOG, g as PepuAuthError, a as PepuBundlerError, h as PepuChainError, i as PepuConfigError, P as PepuError, c as PepuErrorCode, j as PepuErrorOptions, b as PepuPaymasterError, k as PepuPolicyError, l as PepuSessionError, m as errorDocsUrl, n as explainError, o as getErrorEntry, t as toErrorBody, p as toErrorResponse, q as toPepuError } from './errors-CgX1vNj7.cjs';
9
+
10
+ /**
11
+ * PepuSwap is PEPU's flagship DEX and a Uniswap V3 fork. This registry is
12
+ * deliberately separate from {@link pepuContracts} in `contracts.ts`:
13
+ * `pepuContracts` tracks *chain infrastructure* (things any app might rely
14
+ * on — Multicall3, the AA stack), while this tracks *one specific
15
+ * application's* deployment. Mixing the two would make `pepuContracts`
16
+ * ambiguous about what counts as "the chain" versus "a dapp on the chain."
17
+ *
18
+ * Mainnet only — PepuSwap has no testnet deployment, and testnet (97740) is
19
+ * out of scope for this package regardless (no faucet exists to fund
20
+ * verification there).
21
+ *
22
+ * Every address below was independently verified on 2026-09-24 with both
23
+ * an `eth_getCode` check (non-empty bytecode) and a successful `eth_call`
24
+ * against a real function — see the doc comment on that contract's ABI file
25
+ * in `./abi/` for the exact call and response. Two addresses
26
+ * (`multicallNonCanonical`, `permit2NonCanonical`) are PepuSwap-specific
27
+ * overrides of otherwise-canonical contracts; do not confuse them with
28
+ * {@link pepuContracts}'s `multicall3`/`permit2` entries, which track the
29
+ * *canonical* versions of those same standards.
30
+ */
31
+ type PepuSwapContractName = "v3Factory" | "swapRouter02" | "universalRouter" | "positionManager" | "quoterV2" | "tickLens" | "v3Migrator" | "v3Staker" | "multicallNonCanonical" | "permit2NonCanonical";
32
+ declare const pepuSwapContracts: Readonly<Record<number, Readonly<Record<PepuSwapContractName, ContractEntry>>>>;
33
+ /** Look up one PepuSwap contract entry for a chain id. */
34
+ declare function getPepuSwapContract(chainId: number, name: PepuSwapContractName): ContractEntry | undefined;
35
+ /** List every tracked PepuSwap contract entry for a chain id, in registry order. */
36
+ declare function listPepuSwapContracts(chainId: number): readonly ContractEntry[];
37
+
38
+ /**
39
+ * Shape mirrors the `TokenInfo` definition in the Uniswap Token List
40
+ * schema (https://uniswap.org/tokenlist.schema.json). Kept as a local
41
+ * type (rather than importing one from `@uniswap/token-lists`) so
42
+ * consumers of `@pepu-chain/sdk` never need that package installed just to
43
+ * typecheck.
44
+ */
45
+ interface PepuTokenInfo {
46
+ readonly chainId: number;
47
+ readonly address: Address;
48
+ readonly name: string;
49
+ readonly symbol: string;
50
+ readonly decimals: number;
51
+ readonly logoURI?: string;
52
+ readonly tags?: readonly string[];
53
+ }
54
+ /** Shape mirrors the top-level Uniswap Token List schema. */
55
+ interface PepuTokenList {
56
+ readonly name: string;
57
+ readonly timestamp: string;
58
+ readonly version: {
59
+ readonly major: number;
60
+ readonly minor: number;
61
+ readonly patch: number;
62
+ };
63
+ readonly tokens: readonly PepuTokenInfo[];
64
+ readonly keywords?: readonly string[];
65
+ }
66
+ /**
67
+ * Canonical Pepe Unchained V2 token list, conforming to the Uniswap Token
68
+ * List schema (see `test/tokens.test.ts` for schema validation against a
69
+ * vendored copy of https://uniswap.org/tokenlist.schema.json).
70
+ *
71
+ * Deliberately minimal: every entry below is a token address independently
72
+ * verified on-chain (see each entry's inline note), not copied from docs or
73
+ * a third-party list without cross-checking. No other token address met
74
+ * that bar at the time this list was written, and none are included here
75
+ * as placeholders. See the README's "Known gaps" section.
76
+ *
77
+ * There is no verified token address for testnet (chain 97740) yet, so
78
+ * this list currently only covers mainnet.
79
+ */
80
+ declare const pepuTokenList: PepuTokenList;
81
+
82
+ /**
83
+ * Create a viem `PublicClient` for a Pepe Unchained V2 chain, defaulting
84
+ * its transport to the chain's first `rpcUrls.default.http` entry.
85
+ *
86
+ * Pass `transport` to use a different RPC endpoint (e.g. an authenticated
87
+ * provider URL) while keeping the rest of the chain definition.
88
+ */
89
+ declare function getPublicClient(chain: PepuChain, options?: {
90
+ transport?: Transport;
91
+ }): PublicClient<Transport, PepuChain>;
92
+
93
+ /** Resource types supported by Blockscout's URL scheme. */
94
+ type ExplorerResourceType = "tx" | "address" | "token" | "block";
95
+ /**
96
+ * Build a Blockscout explorer URL for a transaction hash, address, token
97
+ * address, or block (by number or hash) on a Pepe Unchained V2 chain.
98
+ *
99
+ * Throws if the given chain has no `blockExplorers.default` configured
100
+ * (this is currently the case for {@link pepuTestnet} — see `chains.ts`
101
+ * for why).
102
+ */
103
+ declare function explorerUrl(chain: PepuChain, type: ExplorerResourceType, value: string | number): string;
104
+ /** Build a transaction-page URL. Shorthand for `explorerUrl(chain, "tx", hash)`. */
105
+ declare function txUrl(chain: PepuChain, hash: string): string;
106
+ /** Build an address-page URL. Shorthand for `explorerUrl(chain, "address", address)`. */
107
+ declare function addressUrl(chain: PepuChain, address: string): string;
108
+ /** Build a token-page URL. Shorthand for `explorerUrl(chain, "token", address)`. */
109
+ declare function tokenUrl(chain: PepuChain, address: string): string;
110
+ /** Build a block-page URL, by block number or block hash. Shorthand for `explorerUrl(chain, "block", value)`. */
111
+ declare function blockUrl(chain: PepuChain, blockNumberOrHash: string | number): string;
112
+ /**
113
+ * Convenience bundle of explorer links. pepuscan (Blockscout) has no UserOp
114
+ * pages, so a UserOperation is linked through its bundle `tx` and its
115
+ * `sender` (the smart account address).
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * explorerLinks({ tx: "0xabc", sender: "0xdef" });
120
+ * // { tx: "https://pepuscan.com/tx/0xabc", sender: "https://pepuscan.com/address/0xdef" }
121
+ * ```
122
+ */
123
+ declare function explorerLinks(o: {
124
+ tx?: string;
125
+ address?: string;
126
+ sender?: string;
127
+ token?: string;
128
+ block?: bigint | number | string;
129
+ }, chain?: PepuChain): {
130
+ tx?: string;
131
+ address?: string;
132
+ sender?: string;
133
+ token?: string;
134
+ block?: string;
135
+ };
136
+
137
+ /**
138
+ * A minimal client for pepuscan's (Blockscout's) public REST API —
139
+ * deliberately narrow: **verified-ABI and token-metadata reads only**.
140
+ * Blockscout's API surface is large (transaction history, logs, internal
141
+ * txs, NFTs, account-abstraction data, ...); re-wrapping all of it here
142
+ * would duplicate `@pepu-chain/mcp` (the Blockscout MCP server), which is the
143
+ * right place for that. This client exists only for the two lookups a
144
+ * dapp commonly needs synchronously and that this package's own ABI/token
145
+ * modules can't provide (an address this package hasn't independently
146
+ * verified, or a token not yet in {@link pepuTokenList}).
147
+ *
148
+ * Uses the platform `fetch` (Node 18+, every evergreen browser) — no HTTP
149
+ * client dependency.
150
+ */
151
+ interface PepuscanClient {
152
+ /**
153
+ * Fetch a contract's verified ABI from pepuscan. Resolves `null` if the
154
+ * contract is not verified (a 404 from Blockscout's
155
+ * `/v2/smart-contracts/{address}`) rather than throwing, since "not
156
+ * verified" is an expected, ordinary result — not an error.
157
+ */
158
+ getVerifiedAbi(address: Address): Promise<Abi | null>;
159
+ /**
160
+ * Fetch a token's on-chain metadata from pepuscan
161
+ * (`/v2/tokens/{address}`). Resolves `null` if pepuscan has no record of
162
+ * the address as a token (a 404) — the address may still be a valid
163
+ * contract; it just isn't a token Blockscout has indexed as one.
164
+ */
165
+ getTokenMetadata(address: Address): Promise<PepuscanTokenMetadata | null>;
166
+ }
167
+ /** Token metadata as reported by pepuscan's `/v2/tokens/{address}`. */
168
+ interface PepuscanTokenMetadata {
169
+ readonly address: Address;
170
+ readonly name: string | null;
171
+ readonly symbol: string | null;
172
+ /** `null` for token types that don't have a fixed decimals field (e.g. most ERC-721s). */
173
+ readonly decimals: number | null;
174
+ readonly totalSupply: string | null;
175
+ /** Blockscout's token type string, e.g. `"ERC-20"`, `"ERC-721"`, `"ERC-1155"`. */
176
+ readonly type: string | null;
177
+ }
178
+ /**
179
+ * Create a {@link PepuscanClient} bound to a {@link PepuChain}'s configured
180
+ * Blockscout API URL (`chain.blockExplorers.default.apiUrl`). Throws
181
+ * immediately if the chain has none configured (currently
182
+ * {@link pepuTestnet} — see `chains.ts`) rather than deferring the failure
183
+ * to the first call.
184
+ */
185
+ declare function createPepuscanClient(chain: PepuChain): PepuscanClient;
186
+
187
+ /**
188
+ * Build the parameter object for an EIP-3085 `wallet_addEthereumChain`
189
+ * request from a {@link PepuChain}, so callers don't have to hand-assemble
190
+ * (and risk mistyping) `chainId` hex encoding, `nativeCurrency`, RPC URLs,
191
+ * and explorer URLs themselves.
192
+ *
193
+ * Omits `blockExplorerUrls` entirely when the chain has no configured
194
+ * explorer (currently {@link pepuTestnet} — see `chains.ts`) rather than
195
+ * sending an empty array or a guessed URL.
196
+ */
197
+ declare function toAddEthereumChainParameter(chain: PepuChain): AddEthereumChainParameter;
198
+ /**
199
+ * Switch an EIP-1193 provider (e.g. `window.ethereum`) to a
200
+ * {@link PepuChain}, adding it first via `wallet_addEthereumChain` if the
201
+ * wallet doesn't already recognize the chain (error code `4902` per
202
+ * EIP-3326) — the two-step dance almost every dapp ends up hand-rolling.
203
+ *
204
+ * If you already have a viem `WalletClient`, its own `switchChain`/`addChain`
205
+ * actions work the same way at the RPC level; this helper is for the plainer
206
+ * "I just have an injected provider" case and does the fallback viem's
207
+ * `switchChain` alone does not (see `viem/actions`' `switchChain.js` — it
208
+ * only ever sends `wallet_switchEthereumChain`).
209
+ *
210
+ * Rethrows any other error unchanged (e.g. the user rejecting either
211
+ * prompt), and rethrows the original switch error if the wallet doesn't
212
+ * report the standard `4902` code for an unrecognized chain — some wallets
213
+ * are known to deviate from the EIP-3326 error code, and this helper does
214
+ * not attempt to paper over that.
215
+ */
216
+ declare function switchOrAddPepuChain(provider: EIP1193Provider, chain: PepuChain): Promise<void>;
217
+
218
+ /**
219
+ * PEPU's two-part Nitro gas price, read live from the `ArbGasInfo`
220
+ * precompile (`0x...6C`, fixed on every Arbitrum Orbit/Nitro chain). See
221
+ * {@link explainDualFeeModel} for what each field means and why, on PEPU
222
+ * specifically, one of them is currently zero.
223
+ */
224
+ interface NitroFeeBreakdown {
225
+ /**
226
+ * L2 execution price, in wei per gas unit. This is `perArbGasTotal` from
227
+ * `getPricesInWei()` — `perArbGasBase` (the network's floor) plus
228
+ * `perArbGasCongestion` (demand surcharge, `0` when the chain isn't
229
+ * congested). Tracks the block's own `baseFeePerGas`.
230
+ */
231
+ readonly l2PricePerGasWei: bigint;
232
+ /**
233
+ * L1 data-posting price, in wei per L1-calldata-unit (`perL1CalldataUnit`
234
+ * from `getPricesInWei()`). Verified `0` on PEPU mainnet as of
235
+ * 2026-09-24 — see {@link explainDualFeeModel}.
236
+ */
237
+ readonly l1PricePerCalldataUnitWei: bigint;
238
+ /**
239
+ * `ArbGasInfo`'s own estimate of the L1 base fee it would need to post
240
+ * data at, in wei. Verified `0` on PEPU mainnet as of 2026-09-24,
241
+ * consistent with `l1PricePerCalldataUnitWei` being `0`.
242
+ */
243
+ readonly l1BaseFeeEstimateWei: bigint;
244
+ }
245
+ /**
246
+ * Read the current {@link NitroFeeBreakdown} from the `ArbGasInfo`
247
+ * precompile. One `eth_call` (`getPricesInWei()`) plus one more
248
+ * (`getL1BaseFeeEstimate()`) — no caching, since these can change block to
249
+ * block under load.
250
+ */
251
+ declare function getNitroFeeBreakdown(client: PublicClient<Transport, PepuChain>): Promise<NitroFeeBreakdown>;
252
+ /** Plain-English explanation of Arbitrum Nitro's dual-fee model, as it currently behaves on PEPU. */
253
+ interface DualFeeModelExplanation {
254
+ readonly summary: string;
255
+ readonly l2ExecutionFee: string;
256
+ readonly l1DataPostingFee: string;
257
+ readonly pepuStatus: string;
258
+ }
259
+ /**
260
+ * Explain Arbitrum Nitro's dual-fee gas model in plain English, including
261
+ * how it currently behaves on PEPU specifically (verified live against
262
+ * mainnet 2026-09-24 — see the doc comment on `arbGasInfoAbi` in
263
+ * `./abi/arbGasInfo.ts` for the exact call and response this is based on).
264
+ *
265
+ * This is a static explanation (no network call) — pair it with
266
+ * {@link getNitroFeeBreakdown} for live numbers.
267
+ */
268
+ declare function explainDualFeeModel(): DualFeeModelExplanation;
269
+ /** Result of {@link estimateTransactionCost}. */
270
+ interface TransactionCostEstimate {
271
+ /** Estimated gas units, from `client.estimateGas`. */
272
+ readonly gas: bigint;
273
+ /** L2 execution price per gas unit, in wei, used for this estimate. */
274
+ readonly gasPriceWei: bigint;
275
+ /** `gas * gasPriceWei`, in wei. Does not include an L1 data-posting fee — see {@link explainDualFeeModel}. */
276
+ readonly costWei: bigint;
277
+ /** {@link costWei} formatted with {@link formatPepu}, for direct display. */
278
+ readonly costFormatted: string;
279
+ }
280
+ /**
281
+ * Estimate a transaction's PEPU cost: `client.estimateGas(request)` for the
282
+ * gas units, multiplied by the current L2 execution price
283
+ * (`getNitroFeeBreakdown`'s `l2PricePerGasWei`, which tracks the latest
284
+ * block's `baseFeePerGas`).
285
+ *
286
+ * Deliberately excludes any L1 data-posting fee — see
287
+ * {@link explainDualFeeModel} for why that component reads as `0` on PEPU
288
+ * today, and re-derive this estimate if that ever changes.
289
+ */
290
+ declare function estimateTransactionCost(client: PublicClient<Transport, PepuChain>, request: TransactionRequest & {
291
+ account?: Address;
292
+ }): Promise<TransactionCostEstimate>;
293
+ /** Options for {@link formatPepu}. */
294
+ interface FormatPepuOptions {
295
+ /**
296
+ * Maximum fractional digits to keep after trimming trailing zeros.
297
+ * Default `8` — high enough that typical PEPU gas costs (a low-value
298
+ * token at a 12,500 gwei base fee) don't round down to `"0"`, which is
299
+ * exactly the failure mode a default ETH-style 4-decimal formatter hits
300
+ * here.
301
+ */
302
+ readonly maxDecimals?: number;
303
+ /** Append `" PEPU"` to the result. Default `true`. */
304
+ readonly suffix?: boolean;
305
+ }
306
+ /**
307
+ * Format a wei amount as PEPU, tuned for a low-value token on a chain with
308
+ * a comparatively large (12,500 gwei) base fee — see
309
+ * {@link explainDualFeeModel}. Plain `formatEther`-style formatting (a
310
+ * handful of decimal places, as is reasonable for ETH) collapses typical
311
+ * PEPU amounts to `"0.0000"`; this keeps up to `maxDecimals` significant
312
+ * fractional digits instead, trimming only trailing zeros.
313
+ *
314
+ * This is a display formatter, not an arbitrary-precision one — it does
315
+ * not round-trip back to the exact wei value, and is not meant to.
316
+ */
317
+ declare function formatPepu(wei: bigint, options?: FormatPepuOptions): string;
318
+ /**
319
+ * Format any token amount (smallest unit) as a short decimal string, for any
320
+ * `decimals`. Truncates (never rounds) to `maxFractionDigits` (default 4) and
321
+ * trims trailing zeros, like {@link formatPepu} but without the PEPU suffix and
322
+ * 18-decimals assumption. Display only: it does not round-trip.
323
+ *
324
+ * @example
325
+ * formatUnitsCompact(1_234_567n, 6); // "1.2345"
326
+ * formatUnitsCompact(5n * 10n ** 18n, 18); // "5"
327
+ */
328
+ declare function formatUnitsCompact(value: bigint, decimals: number, maxFractionDigits?: number): string;
329
+ /**
330
+ * Format a wei-per-gas price for display, with an explicit note that
331
+ * PEPU's baseline (~12,500 gwei) is not a congestion spike — see
332
+ * {@link explainDualFeeModel}. Bare "N gwei" output, without that context,
333
+ * is exactly the naive formatting this package's brief calls out as
334
+ * misleading for PEPU.
335
+ */
336
+ declare function formatPepuGasPrice(weiPerGas: bigint): string;
337
+ /**
338
+ * Default safety margin applied on top of a raw gas estimate before
339
+ * {@link maxSendableAmount} computes its answer, in basis points
340
+ * (`2000` = 20%).
341
+ *
342
+ * Why a margin at all: the L2 price behind {@link estimateTransactionCost}
343
+ * (`ArbGasInfo.getPricesInWei().perArbGasTotal`) is read live and tracks
344
+ * the *current* block's `baseFeePerGas`. A "max send" button estimates
345
+ * cost, fills `balance - cost` into the amount field, and then waits for
346
+ * the user to review and confirm — by the time the signed transaction
347
+ * actually lands, at least one block (often more, if the user pauses to
348
+ * look at the number) has passed, and the price can have moved in that
349
+ * gap. Spending every last wei on `value` against a stale estimate is
350
+ * exactly the failure this button exists to prevent: a transaction that
351
+ * reverts for insufficient funds after the user was told this amount was
352
+ * safe.
353
+ *
354
+ * Why 20% specifically: this repo already uses a 20% margin for the
355
+ * sibling problem of gas-*limit* drift between estimate and execution
356
+ * (`templates/game-app/lib/tap-transaction.ts`'s `withGasLimitBuffer`),
357
+ * and that figure — a standard, conservative buffer used broadly across
358
+ * production transaction-sending code, not one tuned from measured PEPU
359
+ * data — is reused here for gas-*price* drift for the same reason. Two
360
+ * things make being generous here cheap specifically on PEPU: (1) this
361
+ * package has only ever observed PEPU's base fee sitting flat at a
362
+ * 12,500 gwei floor with a `0` congestion surcharge (see
363
+ * {@link explainDualFeeModel}), so the realistic gap this margin covers
364
+ * is currently close to zero; and (2) PEPU is a low-value token, so 20%
365
+ * of an already-tiny gas cost is an even tinier absolute amount left
366
+ * unspent. If PEPU's fee market ever becomes genuinely congested
367
+ * (`perArbGasCongestion` reading nonzero), re-derive this default from
368
+ * observed volatility rather than assuming 20% still covers it.
369
+ */
370
+ declare const DEFAULT_MAX_SEND_MARGIN_BPS = 2000;
371
+ /** Options for {@link maxSendableAmount}. */
372
+ interface MaxSendableAmountOptions {
373
+ /** Client to estimate gas against. */
374
+ readonly client: PublicClient<Transport, PepuChain>;
375
+ /**
376
+ * The sender's address — used as `estimateGas`'s `account`, and (when
377
+ * {@link MaxSendableAmountOptions.to} is omitted) as the estimate's
378
+ * destination too. See `to`'s doc comment.
379
+ */
380
+ readonly from: Address;
381
+ /**
382
+ * The transfer's real destination, if the user has typed one in yet.
383
+ * Estimating against the *actual* recipient matters whenever it's a
384
+ * contract with a `receive()`/`fallback()` that does real work — a
385
+ * generic placeholder address would silently under-estimate that case.
386
+ *
387
+ * Omit this (or don't call {@link maxSendableAmount} at all yet — the
388
+ * caller decides when a "recipient" is valid enough to estimate
389
+ * against) before the user has entered a recipient. This function then
390
+ * falls back to estimating a self-transfer (`to: from`), the best
391
+ * available stand-in for "a plain native transfer to *some* EOA," which
392
+ * is what most PEPU sends are.
393
+ */
394
+ readonly to?: Address;
395
+ /**
396
+ * The sender's current native balance, in wei (e.g. from wagmi's
397
+ * `useBalance` or viem's `getBalance`).
398
+ */
399
+ readonly balanceWei: bigint;
400
+ /**
401
+ * Safety margin on top of the raw estimated cost, in basis points.
402
+ * Default {@link DEFAULT_MAX_SEND_MARGIN_BPS} — see its doc comment for
403
+ * why 20%. Must be an integer in `[0, 10000]`.
404
+ */
405
+ readonly marginBps?: number;
406
+ }
407
+ /**
408
+ * Result of {@link maxSendableAmount} — a discriminated union on `status`
409
+ * so callers can't accidentally read `amountWei` off a result where there
410
+ * isn't one.
411
+ */
412
+ type MaxSendableAmountResult = {
413
+ readonly status: "ok";
414
+ /** The amount safe to fill into a "Max" field: `balanceWei - totalReservedWei`. Always `> 0n`. */
415
+ readonly amountWei: bigint;
416
+ /** The gas estimate this result was computed from. */
417
+ readonly estimate: TransactionCostEstimate;
418
+ /** The safety margin on top of `estimate.costWei`, in wei. */
419
+ readonly marginWei: bigint;
420
+ /** `estimate.costWei + marginWei` — the total withheld from `balanceWei`. */
421
+ readonly totalReservedWei: bigint;
422
+ } | {
423
+ /** `balanceWei` was `0` (or negative) — nothing to size a transfer from, no network call was made. */
424
+ readonly status: "zero-balance";
425
+ /** Human-readable explanation, safe to render directly. */
426
+ readonly reason: string;
427
+ } | {
428
+ /** `balanceWei` doesn't cover even `estimate.costWei` plus the margin — a "max" send would be `<= 0`. */
429
+ readonly status: "insufficient-for-gas";
430
+ /** Human-readable explanation, safe to render directly. */
431
+ readonly reason: string;
432
+ /** The gas estimate this result was computed from. */
433
+ readonly estimate: TransactionCostEstimate;
434
+ /** `estimate.costWei + marginWei` — what the balance would have needed to cover. */
435
+ readonly totalReservedWei: bigint;
436
+ };
437
+ /**
438
+ * Compute the largest amount a sender can put in a native transfer's
439
+ * `value` and still expect it to succeed: `balance - estimatedCost -
440
+ * safetyMargin`.
441
+ *
442
+ * This is deliberately not `balance - gasLimit * gasPrice` computed by
443
+ * hand — see {@link explainDualFeeModel} for why that naive formula is
444
+ * wrong on an Arbitrum Nitro chain like PEPU in general (a second,
445
+ * L1-data-posting fee component can apply on top of L2 execution). In
446
+ * practice this function sidesteps the whole question by never
447
+ * reimplementing Nitro's fee math itself: it hands the real transfer off
448
+ * to {@link estimateTransactionCost}, which calls the chain's own
449
+ * `eth_estimateGas` (Nitro-aware by construction — the node, not this
450
+ * package, knows its own fee model) and reads the live L2 price from the
451
+ * `ArbGasInfo` precompile. If PEPU ever starts charging a nonzero L1
452
+ * component too, `estimateTransactionCost` documents exactly where that
453
+ * would need to be added, and this function inherits the fix for free.
454
+ *
455
+ * THE CIRCULARITY THIS AVOIDS: the whole point of this call is to
456
+ * discover what the max `value` should be, so it can't estimate gas
457
+ * using that unknown value. It also can't reuse `balanceWei` as a stand-in
458
+ * `value` for the estimate — most RPCs simulate `eth_estimateGas` against
459
+ * the sender's real current balance, and a `value` equal to the full
460
+ * balance leaves exactly `0` left over to cover the fee with, so the
461
+ * simulation would itself fail with "insufficient funds" instead of
462
+ * returning a usable number. Instead, this estimates with a nominal `1n`
463
+ * wei placeholder. That's a safe stand-in because, for a plain native
464
+ * transfer (no calldata), gas usage doesn't depend on *how much* value
465
+ * moves — only on whether `to` has code that reacts to receiving value at
466
+ * all, which `1n` (any nonzero amount) already exercises. The one case
467
+ * this can still under-estimate: a recipient contract whose
468
+ * `receive()`/`fallback()` branches on the exact `msg.value` it got
469
+ * (e.g. cheaper for small amounts, pricier for large ones) — an inherent
470
+ * limit of estimating "the max" before the max is known, not specific to
471
+ * this implementation.
472
+ *
473
+ * Handles the edge cases a naive subtraction gets wrong:
474
+ * - `balanceWei <= 0n` → `{ status: "zero-balance" }`, no network call.
475
+ * - `balanceWei` covers less than `estimate.costWei` plus the margin →
476
+ * `{ status: "insufficient-for-gas" }` rather than a negative or `0`
477
+ * amount.
478
+ * - Estimation itself failing (bad RPC, reverting recipient, etc.) →
479
+ * this function does not catch that; the returned promise rejects with
480
+ * whatever `estimateTransactionCost`/`client.estimateGas` threw, so a
481
+ * caller can show the real reason instead of silently falling back to a
482
+ * guess.
483
+ *
484
+ * NOT WIRED INTO `templates/consumer-app`: that template's send form
485
+ * dropped its "Max" button rather than consume this helper. The reason
486
+ * isn't a bug here — it's that Privy's transaction confirmation modal
487
+ * runs its own, separately-implemented pre-flight balance check before
488
+ * signing, and on PEPU that check has been observed to be over-conservative
489
+ * enough to reject a transfer this function correctly sized as affordable
490
+ * (e.g. a 0.7748 PEPU balance refused for a 0.2625 PEPU transfer). Since
491
+ * Privy's modal has the final say on whether the transaction goes out, a
492
+ * "Max" fill computed by this function can still bounce there, which makes
493
+ * the button promise something the wallet UI can't reliably deliver. This
494
+ * function stays correct and is still the right tool for any PEPU wallet
495
+ * UI that isn't routing its send flow through Privy's modal — just don't
496
+ * assume the absence of a "Max" button in that one template means this
497
+ * helper is unused or unmaintained.
498
+ */
499
+ declare function maxSendableAmount(options: MaxSendableAmountOptions): Promise<MaxSendableAmountResult>;
500
+
501
+ /**
502
+ * Arbitrum Nitro's `ArbGasInfo` precompile — lives at the same fixed address
503
+ * on every Arbitrum Orbit/Nitro chain, including PEPU. Exposes the L2
504
+ * execution / L1 data-posting fee breakdown that {@link explainDualFeeModel}
505
+ * (`../gas.js`) describes.
506
+ *
507
+ * Verified live against PEPU mainnet 2026-09-24 via `eth_call`:
508
+ * - `getPricesInWei()` returns `(perL2Tx: 0, perL1CalldataUnit: 0,
509
+ * perStorageAllocation: 250000000000000000, perArbGasBase: 12500000000000,
510
+ * perArbGasCongestion: 0, perArbGasTotal: 12500000000000)`. `perArbGasBase`
511
+ * / `perArbGasTotal` (12,500 gwei) match the block's own `baseFeePerGas`
512
+ * at the same height, and `perL1CalldataUnit` is `0` — see the module doc
513
+ * on `../gas.js` for what that means for PEPU's L1 data-posting fee today.
514
+ * - `getL1BaseFeeEstimate()` returns `0`, consistent with the same reading.
515
+ */
516
+ declare const arbGasInfoAbi: readonly [{
517
+ readonly name: "getPricesInWei";
518
+ readonly type: "function";
519
+ readonly stateMutability: "view";
520
+ readonly inputs: readonly [];
521
+ readonly outputs: readonly [{
522
+ readonly type: "uint256";
523
+ readonly name: "perL2Tx";
524
+ }, {
525
+ readonly type: "uint256";
526
+ readonly name: "perL1CalldataUnit";
527
+ }, {
528
+ readonly type: "uint256";
529
+ readonly name: "perStorageAllocation";
530
+ }, {
531
+ readonly type: "uint256";
532
+ readonly name: "perArbGasBase";
533
+ }, {
534
+ readonly type: "uint256";
535
+ readonly name: "perArbGasCongestion";
536
+ }, {
537
+ readonly type: "uint256";
538
+ readonly name: "perArbGasTotal";
539
+ }];
540
+ }, {
541
+ readonly name: "getL1BaseFeeEstimate";
542
+ readonly type: "function";
543
+ readonly stateMutability: "view";
544
+ readonly inputs: readonly [];
545
+ readonly outputs: readonly [{
546
+ readonly type: "uint256";
547
+ }];
548
+ }, {
549
+ readonly name: "getMinimumGasPrice";
550
+ readonly type: "function";
551
+ readonly stateMutability: "view";
552
+ readonly inputs: readonly [];
553
+ readonly outputs: readonly [{
554
+ readonly type: "uint256";
555
+ }];
556
+ }];
557
+ /**
558
+ * Fixed address of the `ArbGasInfo` precompile. Identical on every
559
+ * Arbitrum Orbit/Nitro chain (it's a precompile, not a deployed contract),
560
+ * confirmed responding on PEPU mainnet as noted above.
561
+ */
562
+ declare const ARB_GAS_INFO_ADDRESS: "0x000000000000000000000000000000000000006C";
563
+
564
+ /**
565
+ * ERC-4337 EntryPoint v0.7 ABI — the subset a dapp actually needs to manage
566
+ * a smart account's gas deposit and read its nonce, at the canonical address
567
+ * `0x0000000071727De22E5E9d8BAf0edAc6f37da032` (deployed on PEPU mainnet
568
+ * only; see `pepuContracts.entryPoint07` in `../contracts.js`).
569
+ *
570
+ * This is NOT the full `IEntryPoint` interface (no `handleOps`,
571
+ * `simulateValidation`, etc.) — those are normally called by a bundler, and
572
+ * PEPU has no publicly hosted bundler yet (see `getSponsorshipStatus` in
573
+ * `../aa/status.js`). This ABI only covers deposit/nonce management, which works
574
+ * today with a plain viem wallet client and no bundler at all.
575
+ *
576
+ * Verified live against mainnet 2026-09-24 via `eth_call`:
577
+ * - `getNonce(address,uint192)` for the zero address/key returns `0`.
578
+ * - `balanceOf(address)` for the zero address returns `0`.
579
+ * - `getDepositInfo(address)` for the zero address returns a 5-word
580
+ * (all-zero) tuple, matching the v0.7 `DepositInfo` struct shape
581
+ * `(uint256 deposit, bool staked, uint96 stake, uint32 unstakeDelaySec,
582
+ * uint48 withdrawTime)` field-for-field.
583
+ * `depositTo`/`withdrawTo` share the same `IStakeManager` interface as the
584
+ * verified `getDepositInfo`/`balanceOf` pair and are standard across every
585
+ * EntryPoint version; they were not separately simulated (both mutate
586
+ * state, and simulating a withdrawal from an empty deposit would only prove
587
+ * it reverts, not that it works).
588
+ */
589
+ declare const entryPointV07Abi: readonly [{
590
+ readonly name: "getNonce";
591
+ readonly type: "function";
592
+ readonly stateMutability: "view";
593
+ readonly inputs: readonly [{
594
+ readonly type: "address";
595
+ readonly name: "sender";
596
+ }, {
597
+ readonly type: "uint192";
598
+ readonly name: "key";
599
+ }];
600
+ readonly outputs: readonly [{
601
+ readonly type: "uint256";
602
+ readonly name: "nonce";
603
+ }];
604
+ }, {
605
+ readonly name: "balanceOf";
606
+ readonly type: "function";
607
+ readonly stateMutability: "view";
608
+ readonly inputs: readonly [{
609
+ readonly type: "address";
610
+ readonly name: "account";
611
+ }];
612
+ readonly outputs: readonly [{
613
+ readonly type: "uint256";
614
+ }];
615
+ }, {
616
+ readonly name: "depositTo";
617
+ readonly type: "function";
618
+ readonly stateMutability: "payable";
619
+ readonly inputs: readonly [{
620
+ readonly type: "address";
621
+ readonly name: "account";
622
+ }];
623
+ readonly outputs: readonly [];
624
+ }, {
625
+ readonly name: "withdrawTo";
626
+ readonly type: "function";
627
+ readonly stateMutability: "nonpayable";
628
+ readonly inputs: readonly [{
629
+ readonly type: "address";
630
+ readonly name: "withdrawAddress";
631
+ }, {
632
+ readonly type: "uint256";
633
+ readonly name: "withdrawAmount";
634
+ }];
635
+ readonly outputs: readonly [];
636
+ }, {
637
+ readonly name: "getDepositInfo";
638
+ readonly type: "function";
639
+ readonly stateMutability: "view";
640
+ readonly inputs: readonly [{
641
+ readonly type: "address";
642
+ readonly name: "account";
643
+ }];
644
+ readonly outputs: readonly [{
645
+ readonly type: "tuple";
646
+ readonly components: readonly [{
647
+ readonly type: "uint256";
648
+ readonly name: "deposit";
649
+ }, {
650
+ readonly type: "bool";
651
+ readonly name: "staked";
652
+ }, {
653
+ readonly type: "uint96";
654
+ readonly name: "stake";
655
+ }, {
656
+ readonly type: "uint32";
657
+ readonly name: "unstakeDelaySec";
658
+ }, {
659
+ readonly type: "uint48";
660
+ readonly name: "withdrawTime";
661
+ }];
662
+ readonly name: "info";
663
+ }];
664
+ }, {
665
+ readonly name: "Deposited";
666
+ readonly type: "event";
667
+ readonly inputs: readonly [{
668
+ readonly type: "address";
669
+ readonly name: "account";
670
+ readonly indexed: true;
671
+ }, {
672
+ readonly type: "uint256";
673
+ readonly name: "totalDeposit";
674
+ }];
675
+ }, {
676
+ readonly name: "Withdrawn";
677
+ readonly type: "event";
678
+ readonly inputs: readonly [{
679
+ readonly type: "address";
680
+ readonly name: "account";
681
+ readonly indexed: true;
682
+ }, {
683
+ readonly type: "address";
684
+ readonly name: "withdrawAddress";
685
+ }, {
686
+ readonly type: "uint256";
687
+ readonly name: "amount";
688
+ }];
689
+ }];
690
+
691
+ /**
692
+ * ZeroDev Kernel v3 ECDSA validator module ABI, at
693
+ * `0x845ADb2C711129d4f3966735eD98a9F09fC4cE57` (deployed on PEPU mainnet
694
+ * only; see `pepuContracts.ecdsaValidator` in `../contracts.js`). This is
695
+ * the ERC-7579 validator module that lets a Kernel account be controlled by
696
+ * a plain ECDSA key (the common case — a Privy/embedded-wallet EOA signs
697
+ * UserOperations on behalf of the smart account).
698
+ *
699
+ * Verified live against mainnet 2026-09-24 via `eth_call`:
700
+ * - `ecdsaValidatorStorage(address)`, called with the zero address, returns
701
+ * `address(0)` — the expected result for a kernel account that was never
702
+ * registered, and confirmation the getter itself works.
703
+ * - `isModuleType(1)` returns `true`. `1` is the ERC-7579 `MODULE_TYPE_VALIDATOR`
704
+ * constant, so this independently confirms the contract both implements
705
+ * the standard ERC-7579 `IModule` interface and self-reports as a
706
+ * validator module — not just a contract that happens to expose a
707
+ * same-named storage getter.
708
+ *
709
+ * `onInstall`/`onUninstall` are part of the same ERC-7579 `IModule`
710
+ * interface `isModuleType` confirmed this contract implements; they take a
711
+ * non-trivial `bytes` payload (the encoded owner address) and mutate state,
712
+ * so — like EntryPoint's `depositTo`/`withdrawTo` — they were not
713
+ * separately simulated. Included because a Kernel account's installation
714
+ * flow calls them, so a caller building that flow needs the selectors.
715
+ */
716
+ declare const kernelEcdsaValidatorAbi: readonly [{
717
+ readonly name: "ecdsaValidatorStorage";
718
+ readonly type: "function";
719
+ readonly stateMutability: "view";
720
+ readonly inputs: readonly [{
721
+ readonly type: "address";
722
+ readonly name: "kernel";
723
+ }];
724
+ readonly outputs: readonly [{
725
+ readonly type: "address";
726
+ readonly name: "owner";
727
+ }];
728
+ }, {
729
+ readonly name: "isModuleType";
730
+ readonly type: "function";
731
+ readonly stateMutability: "view";
732
+ readonly inputs: readonly [{
733
+ readonly type: "uint256";
734
+ readonly name: "moduleTypeId";
735
+ }];
736
+ readonly outputs: readonly [{
737
+ readonly type: "bool";
738
+ }];
739
+ }, {
740
+ readonly name: "isInitialized";
741
+ readonly type: "function";
742
+ readonly stateMutability: "view";
743
+ readonly inputs: readonly [{
744
+ readonly type: "address";
745
+ readonly name: "kernel";
746
+ }];
747
+ readonly outputs: readonly [{
748
+ readonly type: "bool";
749
+ }];
750
+ }, {
751
+ readonly name: "onInstall";
752
+ readonly type: "function";
753
+ readonly stateMutability: "payable";
754
+ readonly inputs: readonly [{
755
+ readonly type: "bytes";
756
+ readonly name: "data";
757
+ }];
758
+ readonly outputs: readonly [];
759
+ }, {
760
+ readonly name: "onUninstall";
761
+ readonly type: "function";
762
+ readonly stateMutability: "payable";
763
+ readonly inputs: readonly [{
764
+ readonly type: "bytes";
765
+ readonly name: "data";
766
+ }];
767
+ readonly outputs: readonly [];
768
+ }];
769
+ /**
770
+ * ERC-7579 module type IDs (EIP-7579 §Module Types). `isModuleType` on any
771
+ * conforming module — including {@link kernelEcdsaValidatorAbi}'s contract,
772
+ * confirmed live above — is called with one of these.
773
+ */
774
+ declare const ERC7579_MODULE_TYPE: {
775
+ readonly validator: 1n;
776
+ readonly executor: 2n;
777
+ readonly fallback: 3n;
778
+ readonly hook: 4n;
779
+ };
780
+
781
+ /**
782
+ * ZeroDev Kernel v3 account factory ABI, at
783
+ * `0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419` (deployed on PEPU mainnet
784
+ * only; see `pepuContracts.kernelFactory` in `../contracts.js`).
785
+ *
786
+ * Verified live against mainnet 2026-09-24 via `eth_call`:
787
+ * - `implementation()` returns `0xbAC849bB641841b44E965fb01A4Bf5F074F84B4d` —
788
+ * ZeroDev's Kernel v3.1 singleton implementation address, deployed at the
789
+ * same address on every chain that has it via CREATE2.
790
+ * - `getAddress(bytes,bytes32)`, called with empty `data` and a zero salt,
791
+ * returns a computed address without reverting.
792
+ * - `createAccount(bytes,bytes32)`, simulated (not sent) with the same
793
+ * empty `data` and zero salt via `eth_call`, returns the **same** address
794
+ * `getAddress` computed for those inputs — exactly the counterfactual-
795
+ * address behavior a CREATE2 account factory is supposed to have.
796
+ *
797
+ * What this package does NOT ship: a helper that encodes the `data`
798
+ * argument (Kernel v3.1's `initialize(...)` calldata — root validator,
799
+ * hook, validator data, hook data, init config). No account has ever been
800
+ * created through this factory on PEPU yet (its transaction history is
801
+ * empty as of the verification date above), so there was nothing on-chain
802
+ * to check a hand-rolled encoding against, and guessing one here would be
803
+ * exactly the kind of invented byte layout this package's rules forbid.
804
+ * Use ZeroDev's own `@zerodev/sdk` (or the public Kernel contracts source)
805
+ * to build that payload, then pass the resulting bytes into
806
+ * `getAddress`/`createAccount` from this ABI.
807
+ */
808
+ declare const kernelFactoryAbi: readonly [{
809
+ readonly name: "implementation";
810
+ readonly type: "function";
811
+ readonly stateMutability: "view";
812
+ readonly inputs: readonly [];
813
+ readonly outputs: readonly [{
814
+ readonly type: "address";
815
+ }];
816
+ }, {
817
+ readonly name: "getAddress";
818
+ readonly type: "function";
819
+ readonly stateMutability: "view";
820
+ readonly inputs: readonly [{
821
+ readonly type: "bytes";
822
+ readonly name: "data";
823
+ }, {
824
+ readonly type: "bytes32";
825
+ readonly name: "salt";
826
+ }];
827
+ readonly outputs: readonly [{
828
+ readonly type: "address";
829
+ }];
830
+ }, {
831
+ readonly name: "createAccount";
832
+ readonly type: "function";
833
+ readonly stateMutability: "payable";
834
+ readonly inputs: readonly [{
835
+ readonly type: "bytes";
836
+ readonly name: "data";
837
+ }, {
838
+ readonly type: "bytes32";
839
+ readonly name: "salt";
840
+ }];
841
+ readonly outputs: readonly [{
842
+ readonly type: "address";
843
+ }];
844
+ }];
845
+ /**
846
+ * The verified Kernel v3.1 singleton implementation address that
847
+ * `kernelFactoryAbi`'s `implementation()` resolves to on PEPU mainnet. Same
848
+ * address ZeroDev uses across every chain that has this Kernel version.
849
+ */
850
+ declare const KERNEL_V3_1_IMPLEMENTATION_ADDRESS: "0xbAC849bB641841b44E965fb01A4Bf5F074F84B4d";
851
+
852
+ /**
853
+ * PepuSwap's own multicall contract, at
854
+ * `0x927af2a6B76d2d8206d93004463F8C122701383B` on mainnet (see
855
+ * `pepuSwapContracts.multicallNonCanonical` in `../dex.js`). **Not**
856
+ * Multicall3 and not interchangeable with `pepuContracts.multicall3` — see
857
+ * that entry's notes.
858
+ *
859
+ * A first pass at verifying this contract tried a Multicall2-style
860
+ * `getBlockNumber()` probe, which reverted, and concluded no ABI could be
861
+ * shipped for it. That probe used the wrong function name: pepuscan
862
+ * (Blockscout) has this contract verified as Uniswap's
863
+ * `UniswapInterfaceMulticall` — "a fork of Multicall2 specifically tailored
864
+ * for the Uniswap Interface" — which exposes `getCurrentBlockTimestamp()`
865
+ * and `getEthBalance(address)` instead of Multicall2's `getBlockNumber()`/
866
+ * `getEthBalance()` pair, plus a `multicall(Call[])` that returns
867
+ * `(blockNumber, Result[])` rather than Multicall3's `(success, returnData)[]`
868
+ * shape (its `Call`/`Result` structs also carry a per-call `gasLimit`/
869
+ * `gasUsed`, which neither Multicall2 nor Multicall3 do the same way) — so
870
+ * it is not a drop-in for either.
871
+ *
872
+ * Verified live against mainnet 2026-09-24:
873
+ * - The ABI below is exactly what pepuscan reports as this contract's
874
+ * verified source-matched interface.
875
+ * - `getCurrentBlockTimestamp()` returns a value equal to the current
876
+ * block's own `timestamp` (checked against the same block via
877
+ * `eth_getBlockByNumber`).
878
+ * - `getEthBalance(0x0)` returns a live, non-zero value (the zero address's
879
+ * real native-PEPU balance).
880
+ *
881
+ * `multicall(Call[])` was not independently simulated (it needs real
882
+ * `target`/`callData` values per call to return a meaningful result); the
883
+ * two verified getters above are enough to confirm this is a genuine,
884
+ * matching deployment of the verified source, not a same-address
885
+ * coincidence.
886
+ */
887
+ declare const pepuSwapMulticallAbi: readonly [{
888
+ readonly name: "getCurrentBlockTimestamp";
889
+ readonly type: "function";
890
+ readonly stateMutability: "view";
891
+ readonly inputs: readonly [];
892
+ readonly outputs: readonly [{
893
+ readonly type: "uint256";
894
+ readonly name: "timestamp";
895
+ }];
896
+ }, {
897
+ readonly name: "getEthBalance";
898
+ readonly type: "function";
899
+ readonly stateMutability: "view";
900
+ readonly inputs: readonly [{
901
+ readonly type: "address";
902
+ readonly name: "addr";
903
+ }];
904
+ readonly outputs: readonly [{
905
+ readonly type: "uint256";
906
+ readonly name: "balance";
907
+ }];
908
+ }, {
909
+ readonly name: "multicall";
910
+ readonly type: "function";
911
+ readonly stateMutability: "nonpayable";
912
+ readonly inputs: readonly [{
913
+ readonly type: "tuple[]";
914
+ readonly components: readonly [{
915
+ readonly type: "address";
916
+ readonly name: "target";
917
+ }, {
918
+ readonly type: "uint256";
919
+ readonly name: "gasLimit";
920
+ }, {
921
+ readonly type: "bytes";
922
+ readonly name: "callData";
923
+ }];
924
+ readonly name: "calls";
925
+ }];
926
+ readonly outputs: readonly [{
927
+ readonly type: "uint256";
928
+ readonly name: "blockNumber";
929
+ }, {
930
+ readonly type: "tuple[]";
931
+ readonly components: readonly [{
932
+ readonly type: "bool";
933
+ readonly name: "success";
934
+ }, {
935
+ readonly type: "uint256";
936
+ readonly name: "gasUsed";
937
+ }, {
938
+ readonly type: "bytes";
939
+ readonly name: "returnData";
940
+ }];
941
+ readonly name: "returnData";
942
+ }];
943
+ }];
944
+
945
+ /**
946
+ * PepuSwap's own Permit2 deployment, at
947
+ * `0xB461c05f76d7f919FF7A3Df2B0D2593F56538b4B` on mainnet (see
948
+ * `pepuSwapContracts.permit2` in `../dex.js`).
949
+ *
950
+ * **This is NOT the canonical Permit2** (`0x000000000022D473030F116dDEE9F6B43aC78BA3`).
951
+ * The canonical address is now also deployed on PEPU (see
952
+ * `pepuContracts.permit2` in `../contracts.js`, `status: "deployed"`), but
953
+ * PepuSwap's own frontend was built against this separate, earlier
954
+ * deployment and overrides the canonical address specifically for chain
955
+ * 97741 to point at this contract instead. The two are different contracts
956
+ * with different EIP-712 domains — do not assume a generic
957
+ * canonical-Permit2-aware tool (e.g. a library that hardcodes the canonical
958
+ * address) will interoperate with PepuSwap using it; approvals made against
959
+ * one are not visible to the other.
960
+ *
961
+ * Verified live against mainnet 2026-09-24:
962
+ * - `eth_getCode` returns 18,306 bytes of bytecode.
963
+ * - `DOMAIN_SEPARATOR()` returns a live 32-byte value without reverting —
964
+ * confirming this contract implements Permit2's standard EIP-712 domain
965
+ * separator getter, consistent with a genuine (if non-canonical) Permit2
966
+ * deployment.
967
+ *
968
+ * `allowance`/`approve`/`permit` are Permit2's standard signatures; not
969
+ * separately simulated here (each needs a real token/owner/spender to
970
+ * return a meaningful result). Kept intentionally minimal — this package
971
+ * does not ship a full Permit2 ABI, only enough to recognize and read from
972
+ * this specific deployment.
973
+ */
974
+ declare const pepuSwapPermit2Abi: readonly [{
975
+ readonly name: "DOMAIN_SEPARATOR";
976
+ readonly type: "function";
977
+ readonly stateMutability: "view";
978
+ readonly inputs: readonly [];
979
+ readonly outputs: readonly [{
980
+ readonly type: "bytes32";
981
+ }];
982
+ }, {
983
+ readonly name: "allowance";
984
+ readonly type: "function";
985
+ readonly stateMutability: "view";
986
+ readonly inputs: readonly [{
987
+ readonly type: "address";
988
+ readonly name: "owner";
989
+ }, {
990
+ readonly type: "address";
991
+ readonly name: "token";
992
+ }, {
993
+ readonly type: "address";
994
+ readonly name: "spender";
995
+ }];
996
+ readonly outputs: readonly [{
997
+ readonly type: "uint160";
998
+ readonly name: "amount";
999
+ }, {
1000
+ readonly type: "uint48";
1001
+ readonly name: "expiration";
1002
+ }, {
1003
+ readonly type: "uint48";
1004
+ readonly name: "nonce";
1005
+ }];
1006
+ }, {
1007
+ readonly name: "approve";
1008
+ readonly type: "function";
1009
+ readonly stateMutability: "nonpayable";
1010
+ readonly inputs: readonly [{
1011
+ readonly type: "address";
1012
+ readonly name: "token";
1013
+ }, {
1014
+ readonly type: "address";
1015
+ readonly name: "spender";
1016
+ }, {
1017
+ readonly type: "uint160";
1018
+ readonly name: "amount";
1019
+ }, {
1020
+ readonly type: "uint48";
1021
+ readonly name: "expiration";
1022
+ }];
1023
+ readonly outputs: readonly [];
1024
+ }];
1025
+
1026
+ /**
1027
+ * PepuSwap's `NonfungiblePositionManager` ABI subset, at
1028
+ * `0xe2060CbdE18b5e765c86e5Cd6EE68AF209a9faa7` on mainnet (see
1029
+ * `pepuSwapContracts.positionManager` in `../dex.js`). LP positions on
1030
+ * PepuSwap are ERC-721 tokens minted by this contract — on pepuscan they
1031
+ * show up as "Launchpad V3 Positions NFT" / `UNI-V3-POS`.
1032
+ *
1033
+ * Extends viem's own {@link erc721Abi} (this contract genuinely is an
1034
+ * ERC-721) with the one PepuSwap/Uniswap-V3-specific read, `positions`.
1035
+ *
1036
+ * Verified live against mainnet 2026-09-24:
1037
+ * - `eth_getCode` returns 24,384 bytes of bytecode.
1038
+ * - `factory()` returns the verified `pepuSwapV3FactoryAbi` address.
1039
+ * - `WETH9()` returns the verified WPEPU address.
1040
+ *
1041
+ * `positions(tokenId)` is the standard Uniswap V3 signature; not
1042
+ * independently simulated here since it requires a minted `tokenId`; the
1043
+ * verified getters above confirm this is a genuine, matching deployment.
1044
+ */
1045
+ declare const pepuSwapPositionManagerAbi: readonly [{
1046
+ readonly type: "event";
1047
+ readonly name: "Approval";
1048
+ readonly inputs: readonly [{
1049
+ readonly indexed: true;
1050
+ readonly name: "owner";
1051
+ readonly type: "address";
1052
+ }, {
1053
+ readonly indexed: true;
1054
+ readonly name: "spender";
1055
+ readonly type: "address";
1056
+ }, {
1057
+ readonly indexed: true;
1058
+ readonly name: "tokenId";
1059
+ readonly type: "uint256";
1060
+ }];
1061
+ }, {
1062
+ readonly type: "event";
1063
+ readonly name: "ApprovalForAll";
1064
+ readonly inputs: readonly [{
1065
+ readonly indexed: true;
1066
+ readonly name: "owner";
1067
+ readonly type: "address";
1068
+ }, {
1069
+ readonly indexed: true;
1070
+ readonly name: "operator";
1071
+ readonly type: "address";
1072
+ }, {
1073
+ readonly indexed: false;
1074
+ readonly name: "approved";
1075
+ readonly type: "bool";
1076
+ }];
1077
+ }, {
1078
+ readonly type: "event";
1079
+ readonly name: "Transfer";
1080
+ readonly inputs: readonly [{
1081
+ readonly indexed: true;
1082
+ readonly name: "from";
1083
+ readonly type: "address";
1084
+ }, {
1085
+ readonly indexed: true;
1086
+ readonly name: "to";
1087
+ readonly type: "address";
1088
+ }, {
1089
+ readonly indexed: true;
1090
+ readonly name: "tokenId";
1091
+ readonly type: "uint256";
1092
+ }];
1093
+ }, {
1094
+ readonly type: "function";
1095
+ readonly name: "approve";
1096
+ readonly stateMutability: "payable";
1097
+ readonly inputs: readonly [{
1098
+ readonly name: "spender";
1099
+ readonly type: "address";
1100
+ }, {
1101
+ readonly name: "tokenId";
1102
+ readonly type: "uint256";
1103
+ }];
1104
+ readonly outputs: readonly [];
1105
+ }, {
1106
+ readonly type: "function";
1107
+ readonly name: "balanceOf";
1108
+ readonly stateMutability: "view";
1109
+ readonly inputs: readonly [{
1110
+ readonly name: "account";
1111
+ readonly type: "address";
1112
+ }];
1113
+ readonly outputs: readonly [{
1114
+ readonly type: "uint256";
1115
+ }];
1116
+ }, {
1117
+ readonly type: "function";
1118
+ readonly name: "getApproved";
1119
+ readonly stateMutability: "view";
1120
+ readonly inputs: readonly [{
1121
+ readonly name: "tokenId";
1122
+ readonly type: "uint256";
1123
+ }];
1124
+ readonly outputs: readonly [{
1125
+ readonly type: "address";
1126
+ }];
1127
+ }, {
1128
+ readonly type: "function";
1129
+ readonly name: "isApprovedForAll";
1130
+ readonly stateMutability: "view";
1131
+ readonly inputs: readonly [{
1132
+ readonly name: "owner";
1133
+ readonly type: "address";
1134
+ }, {
1135
+ readonly name: "operator";
1136
+ readonly type: "address";
1137
+ }];
1138
+ readonly outputs: readonly [{
1139
+ readonly type: "bool";
1140
+ }];
1141
+ }, {
1142
+ readonly type: "function";
1143
+ readonly name: "name";
1144
+ readonly stateMutability: "view";
1145
+ readonly inputs: readonly [];
1146
+ readonly outputs: readonly [{
1147
+ readonly type: "string";
1148
+ }];
1149
+ }, {
1150
+ readonly type: "function";
1151
+ readonly name: "ownerOf";
1152
+ readonly stateMutability: "view";
1153
+ readonly inputs: readonly [{
1154
+ readonly name: "tokenId";
1155
+ readonly type: "uint256";
1156
+ }];
1157
+ readonly outputs: readonly [{
1158
+ readonly name: "owner";
1159
+ readonly type: "address";
1160
+ }];
1161
+ }, {
1162
+ readonly type: "function";
1163
+ readonly name: "safeTransferFrom";
1164
+ readonly stateMutability: "payable";
1165
+ readonly inputs: readonly [{
1166
+ readonly name: "from";
1167
+ readonly type: "address";
1168
+ }, {
1169
+ readonly name: "to";
1170
+ readonly type: "address";
1171
+ }, {
1172
+ readonly name: "tokenId";
1173
+ readonly type: "uint256";
1174
+ }];
1175
+ readonly outputs: readonly [];
1176
+ }, {
1177
+ readonly type: "function";
1178
+ readonly name: "safeTransferFrom";
1179
+ readonly stateMutability: "nonpayable";
1180
+ readonly inputs: readonly [{
1181
+ readonly name: "from";
1182
+ readonly type: "address";
1183
+ }, {
1184
+ readonly name: "to";
1185
+ readonly type: "address";
1186
+ }, {
1187
+ readonly name: "id";
1188
+ readonly type: "uint256";
1189
+ }, {
1190
+ readonly name: "data";
1191
+ readonly type: "bytes";
1192
+ }];
1193
+ readonly outputs: readonly [];
1194
+ }, {
1195
+ readonly type: "function";
1196
+ readonly name: "setApprovalForAll";
1197
+ readonly stateMutability: "nonpayable";
1198
+ readonly inputs: readonly [{
1199
+ readonly name: "operator";
1200
+ readonly type: "address";
1201
+ }, {
1202
+ readonly name: "approved";
1203
+ readonly type: "bool";
1204
+ }];
1205
+ readonly outputs: readonly [];
1206
+ }, {
1207
+ readonly type: "function";
1208
+ readonly name: "symbol";
1209
+ readonly stateMutability: "view";
1210
+ readonly inputs: readonly [];
1211
+ readonly outputs: readonly [{
1212
+ readonly type: "string";
1213
+ }];
1214
+ }, {
1215
+ readonly type: "function";
1216
+ readonly name: "tokenByIndex";
1217
+ readonly stateMutability: "view";
1218
+ readonly inputs: readonly [{
1219
+ readonly name: "index";
1220
+ readonly type: "uint256";
1221
+ }];
1222
+ readonly outputs: readonly [{
1223
+ readonly type: "uint256";
1224
+ }];
1225
+ }, {
1226
+ readonly type: "function";
1227
+ readonly name: "tokenByIndex";
1228
+ readonly stateMutability: "view";
1229
+ readonly inputs: readonly [{
1230
+ readonly name: "owner";
1231
+ readonly type: "address";
1232
+ }, {
1233
+ readonly name: "index";
1234
+ readonly type: "uint256";
1235
+ }];
1236
+ readonly outputs: readonly [{
1237
+ readonly name: "tokenId";
1238
+ readonly type: "uint256";
1239
+ }];
1240
+ }, {
1241
+ readonly type: "function";
1242
+ readonly name: "tokenURI";
1243
+ readonly stateMutability: "view";
1244
+ readonly inputs: readonly [{
1245
+ readonly name: "tokenId";
1246
+ readonly type: "uint256";
1247
+ }];
1248
+ readonly outputs: readonly [{
1249
+ readonly type: "string";
1250
+ }];
1251
+ }, {
1252
+ readonly type: "function";
1253
+ readonly name: "totalSupply";
1254
+ readonly stateMutability: "view";
1255
+ readonly inputs: readonly [];
1256
+ readonly outputs: readonly [{
1257
+ readonly type: "uint256";
1258
+ }];
1259
+ }, {
1260
+ readonly type: "function";
1261
+ readonly name: "transferFrom";
1262
+ readonly stateMutability: "payable";
1263
+ readonly inputs: readonly [{
1264
+ readonly name: "sender";
1265
+ readonly type: "address";
1266
+ }, {
1267
+ readonly name: "recipient";
1268
+ readonly type: "address";
1269
+ }, {
1270
+ readonly name: "tokenId";
1271
+ readonly type: "uint256";
1272
+ }];
1273
+ readonly outputs: readonly [];
1274
+ }, {
1275
+ readonly name: "factory";
1276
+ readonly type: "function";
1277
+ readonly stateMutability: "view";
1278
+ readonly inputs: readonly [];
1279
+ readonly outputs: readonly [{
1280
+ readonly type: "address";
1281
+ }];
1282
+ }, {
1283
+ readonly name: "WETH9";
1284
+ readonly type: "function";
1285
+ readonly stateMutability: "view";
1286
+ readonly inputs: readonly [];
1287
+ readonly outputs: readonly [{
1288
+ readonly type: "address";
1289
+ }];
1290
+ }, {
1291
+ readonly name: "positions";
1292
+ readonly type: "function";
1293
+ readonly stateMutability: "view";
1294
+ readonly inputs: readonly [{
1295
+ readonly type: "uint256";
1296
+ readonly name: "tokenId";
1297
+ }];
1298
+ readonly outputs: readonly [{
1299
+ readonly type: "uint96";
1300
+ readonly name: "nonce";
1301
+ }, {
1302
+ readonly type: "address";
1303
+ readonly name: "operator";
1304
+ }, {
1305
+ readonly type: "address";
1306
+ readonly name: "token0";
1307
+ }, {
1308
+ readonly type: "address";
1309
+ readonly name: "token1";
1310
+ }, {
1311
+ readonly type: "uint24";
1312
+ readonly name: "fee";
1313
+ }, {
1314
+ readonly type: "int24";
1315
+ readonly name: "tickLower";
1316
+ }, {
1317
+ readonly type: "int24";
1318
+ readonly name: "tickUpper";
1319
+ }, {
1320
+ readonly type: "uint128";
1321
+ readonly name: "liquidity";
1322
+ }, {
1323
+ readonly type: "uint256";
1324
+ readonly name: "feeGrowthInside0LastX128";
1325
+ }, {
1326
+ readonly type: "uint256";
1327
+ readonly name: "feeGrowthInside1LastX128";
1328
+ }, {
1329
+ readonly type: "uint128";
1330
+ readonly name: "tokensOwed0";
1331
+ }, {
1332
+ readonly type: "uint128";
1333
+ readonly name: "tokensOwed1";
1334
+ }];
1335
+ }];
1336
+
1337
+ /**
1338
+ * PepuSwap's `QuoterV2` ABI subset, at
1339
+ * `0xd647b2D80b48e93613Aa6982b85f8909578b4829` on mainnet (see
1340
+ * `pepuSwapContracts.quoterV2` in `../dex.js`).
1341
+ *
1342
+ * Verified live against mainnet 2026-09-24:
1343
+ * - `eth_getCode` returns 8,273 bytes of bytecode.
1344
+ * - `factory()` returns the verified `pepuSwapV3FactoryAbi` address.
1345
+ * - `WETH9()` returns the verified WPEPU address.
1346
+ *
1347
+ * `quoteExactInputSingle`/`quoteExactOutputSingle` are QuoterV2's standard
1348
+ * signatures. Like the router's swap functions, they weren't independently
1349
+ * simulated here (a quote needs a real, liquid pool + valid amounts to
1350
+ * return a meaningful result, not just "doesn't revert"); the two verified
1351
+ * getters above confirm this is a genuine, matching QuoterV2 deployment.
1352
+ * QuoterV2 is gas-inefficient by design (it's meant to be called off-chain
1353
+ * via `eth_call`, e.g. through `client.simulateContract`) — never send it a
1354
+ * real transaction.
1355
+ */
1356
+ declare const pepuSwapQuoterAbi: readonly [{
1357
+ readonly name: "factory";
1358
+ readonly type: "function";
1359
+ readonly stateMutability: "view";
1360
+ readonly inputs: readonly [];
1361
+ readonly outputs: readonly [{
1362
+ readonly type: "address";
1363
+ }];
1364
+ }, {
1365
+ readonly name: "WETH9";
1366
+ readonly type: "function";
1367
+ readonly stateMutability: "view";
1368
+ readonly inputs: readonly [];
1369
+ readonly outputs: readonly [{
1370
+ readonly type: "address";
1371
+ }];
1372
+ }, {
1373
+ readonly name: "quoteExactInputSingle";
1374
+ readonly type: "function";
1375
+ readonly stateMutability: "nonpayable";
1376
+ readonly inputs: readonly [{
1377
+ readonly type: "tuple";
1378
+ readonly components: readonly [{
1379
+ readonly type: "address";
1380
+ readonly name: "tokenIn";
1381
+ }, {
1382
+ readonly type: "address";
1383
+ readonly name: "tokenOut";
1384
+ }, {
1385
+ readonly type: "uint256";
1386
+ readonly name: "amountIn";
1387
+ }, {
1388
+ readonly type: "uint24";
1389
+ readonly name: "fee";
1390
+ }, {
1391
+ readonly type: "uint160";
1392
+ readonly name: "sqrtPriceLimitX96";
1393
+ }];
1394
+ readonly name: "params";
1395
+ }];
1396
+ readonly outputs: readonly [{
1397
+ readonly type: "uint256";
1398
+ readonly name: "amountOut";
1399
+ }, {
1400
+ readonly type: "uint160";
1401
+ readonly name: "sqrtPriceX96After";
1402
+ }, {
1403
+ readonly type: "uint32";
1404
+ readonly name: "initializedTicksCrossed";
1405
+ }, {
1406
+ readonly type: "uint256";
1407
+ readonly name: "gasEstimate";
1408
+ }];
1409
+ }, {
1410
+ readonly name: "quoteExactOutputSingle";
1411
+ readonly type: "function";
1412
+ readonly stateMutability: "nonpayable";
1413
+ readonly inputs: readonly [{
1414
+ readonly type: "tuple";
1415
+ readonly components: readonly [{
1416
+ readonly type: "address";
1417
+ readonly name: "tokenIn";
1418
+ }, {
1419
+ readonly type: "address";
1420
+ readonly name: "tokenOut";
1421
+ }, {
1422
+ readonly type: "uint256";
1423
+ readonly name: "amount";
1424
+ }, {
1425
+ readonly type: "uint24";
1426
+ readonly name: "fee";
1427
+ }, {
1428
+ readonly type: "uint160";
1429
+ readonly name: "sqrtPriceLimitX96";
1430
+ }];
1431
+ readonly name: "params";
1432
+ }];
1433
+ readonly outputs: readonly [{
1434
+ readonly type: "uint256";
1435
+ readonly name: "amountIn";
1436
+ }, {
1437
+ readonly type: "uint160";
1438
+ readonly name: "sqrtPriceX96After";
1439
+ }, {
1440
+ readonly type: "uint32";
1441
+ readonly name: "initializedTicksCrossed";
1442
+ }, {
1443
+ readonly type: "uint256";
1444
+ readonly name: "gasEstimate";
1445
+ }];
1446
+ }];
1447
+
1448
+ /**
1449
+ * PepuSwap's `SwapRouter02` ABI subset, at
1450
+ * `0x150c3F0f16C3D9EB34351d7af9c961FeDc97A0fb` on mainnet (see
1451
+ * `pepuSwapContracts.swapRouter02` in `../dex.js`).
1452
+ *
1453
+ * Verified live against mainnet 2026-09-24:
1454
+ * - `eth_getCode` returns 24,497 bytes of bytecode.
1455
+ * - `factory()` returns `0x5984B8BF2d4dB9C0aCB1d7924762e4474D80C807` — the
1456
+ * independently-verified {@link pepuSwapV3FactoryAbi} address.
1457
+ * - `WETH9()` returns `0xF9Cf4A16d26979b929Be7176bAc4e7084975FCB8` — the
1458
+ * independently-verified WPEPU address (see `../abi/wpepu.js`).
1459
+ *
1460
+ * `exactInputSingle`/`exactOutputSingle` are Uniswap's standard SwapRouter02
1461
+ * signatures (unchanged across the many chains that run this exact
1462
+ * contract); they were not separately simulated because a real swap needs a
1463
+ * funded, approved caller. The two verified read functions above confirm
1464
+ * this is a genuine, matching SwapRouter02 deployment rather than a
1465
+ * same-address coincidence.
1466
+ */
1467
+ declare const pepuSwapRouterAbi: readonly [{
1468
+ readonly name: "factory";
1469
+ readonly type: "function";
1470
+ readonly stateMutability: "view";
1471
+ readonly inputs: readonly [];
1472
+ readonly outputs: readonly [{
1473
+ readonly type: "address";
1474
+ }];
1475
+ }, {
1476
+ readonly name: "WETH9";
1477
+ readonly type: "function";
1478
+ readonly stateMutability: "view";
1479
+ readonly inputs: readonly [];
1480
+ readonly outputs: readonly [{
1481
+ readonly type: "address";
1482
+ }];
1483
+ }, {
1484
+ readonly name: "exactInputSingle";
1485
+ readonly type: "function";
1486
+ readonly stateMutability: "payable";
1487
+ readonly inputs: readonly [{
1488
+ readonly type: "tuple";
1489
+ readonly components: readonly [{
1490
+ readonly type: "address";
1491
+ readonly name: "tokenIn";
1492
+ }, {
1493
+ readonly type: "address";
1494
+ readonly name: "tokenOut";
1495
+ }, {
1496
+ readonly type: "uint24";
1497
+ readonly name: "fee";
1498
+ }, {
1499
+ readonly type: "address";
1500
+ readonly name: "recipient";
1501
+ }, {
1502
+ readonly type: "uint256";
1503
+ readonly name: "amountIn";
1504
+ }, {
1505
+ readonly type: "uint256";
1506
+ readonly name: "amountOutMinimum";
1507
+ }, {
1508
+ readonly type: "uint160";
1509
+ readonly name: "sqrtPriceLimitX96";
1510
+ }];
1511
+ readonly name: "params";
1512
+ }];
1513
+ readonly outputs: readonly [{
1514
+ readonly type: "uint256";
1515
+ readonly name: "amountOut";
1516
+ }];
1517
+ }, {
1518
+ readonly name: "exactOutputSingle";
1519
+ readonly type: "function";
1520
+ readonly stateMutability: "payable";
1521
+ readonly inputs: readonly [{
1522
+ readonly type: "tuple";
1523
+ readonly components: readonly [{
1524
+ readonly type: "address";
1525
+ readonly name: "tokenIn";
1526
+ }, {
1527
+ readonly type: "address";
1528
+ readonly name: "tokenOut";
1529
+ }, {
1530
+ readonly type: "uint24";
1531
+ readonly name: "fee";
1532
+ }, {
1533
+ readonly type: "address";
1534
+ readonly name: "recipient";
1535
+ }, {
1536
+ readonly type: "uint256";
1537
+ readonly name: "amountOut";
1538
+ }, {
1539
+ readonly type: "uint256";
1540
+ readonly name: "amountInMaximum";
1541
+ }, {
1542
+ readonly type: "uint160";
1543
+ readonly name: "sqrtPriceLimitX96";
1544
+ }];
1545
+ readonly name: "params";
1546
+ }];
1547
+ readonly outputs: readonly [{
1548
+ readonly type: "uint256";
1549
+ readonly name: "amountIn";
1550
+ }];
1551
+ }, {
1552
+ readonly name: "multicall";
1553
+ readonly type: "function";
1554
+ readonly stateMutability: "payable";
1555
+ readonly inputs: readonly [{
1556
+ readonly type: "uint256";
1557
+ readonly name: "deadline";
1558
+ }, {
1559
+ readonly type: "bytes[]";
1560
+ readonly name: "data";
1561
+ }];
1562
+ readonly outputs: readonly [{
1563
+ readonly type: "bytes[]";
1564
+ readonly name: "results";
1565
+ }];
1566
+ }];
1567
+
1568
+ /**
1569
+ * PepuSwap's `TickLens` ABI, at
1570
+ * `0x4EB8aA84c066f9bf210eAfE33B30AE49BfafD9a6` on mainnet (see
1571
+ * `pepuSwapContracts.tickLens` in `../dex.js`). `TickLens` is stateless
1572
+ * (it takes a pool address as an argument to every call rather than storing
1573
+ * one), so it has no zero-argument getter to probe.
1574
+ *
1575
+ * Verified live against mainnet 2026-09-24:
1576
+ * - `eth_getCode` returns 1,385 bytes of bytecode.
1577
+ * - `getPopulatedTicksInWord(pool, wordPosition)` was called against the
1578
+ * real WPEPU/USDT 0.3% pool (`0x4bE3Af53800AADE09201654CD76D55063c7bdE70`)
1579
+ * at the word position derived from that pool's own live `slot0().tick`
1580
+ * and `tickSpacing()`. It returned successfully (an empty populated-ticks
1581
+ * array for that particular word, which is itself a valid, non-reverting
1582
+ * result) — confirming the exact function selector against a real pool.
1583
+ */
1584
+ declare const pepuSwapTickLensAbi: readonly [{
1585
+ readonly name: "getPopulatedTicksInWord";
1586
+ readonly type: "function";
1587
+ readonly stateMutability: "view";
1588
+ readonly inputs: readonly [{
1589
+ readonly type: "address";
1590
+ readonly name: "pool";
1591
+ }, {
1592
+ readonly type: "int16";
1593
+ readonly name: "tickBitmapIndex";
1594
+ }];
1595
+ readonly outputs: readonly [{
1596
+ readonly type: "tuple[]";
1597
+ readonly components: readonly [{
1598
+ readonly type: "int24";
1599
+ readonly name: "tick";
1600
+ }, {
1601
+ readonly type: "int128";
1602
+ readonly name: "liquidityNet";
1603
+ }, {
1604
+ readonly type: "uint128";
1605
+ readonly name: "liquidityGross";
1606
+ }];
1607
+ readonly name: "populatedTicks";
1608
+ }];
1609
+ }];
1610
+
1611
+ /**
1612
+ * PepuSwap's `UniversalRouter` ABI, at
1613
+ * `0x0dE72b751b77d3c74fB96C5fAd0320Cd8d133d36` on mainnet (see
1614
+ * `pepuSwapContracts.universalRouter` in `../dex.js`). UniversalRouter is a
1615
+ * command-dispatcher contract — almost everything routes through the one
1616
+ * `execute` entrypoint below, with a `commands` byte-string selecting which
1617
+ * internal actions run.
1618
+ *
1619
+ * Verified live against mainnet 2026-09-24:
1620
+ * - `eth_getCode` returns 17,958 bytes of bytecode.
1621
+ * - Unlike the other PepuSwap contracts, UniversalRouter does not expose
1622
+ * its configured Permit2/factory addresses through public getters (a
1623
+ * `PERMIT2()`/`V2_FACTORY()`/`V3_FACTORY()`/`poolManager()` probe all
1624
+ * reverted — expected, since a dispatcher contract with no matching
1625
+ * function selector just reverts, it doesn't imply anything is wrong).
1626
+ * - Instead, `execute(bytes,bytes[],uint256)` was called directly via
1627
+ * `eth_call` with an empty `commands` byte-string, an empty `inputs`
1628
+ * array, and a far-future deadline. It returned successfully with no
1629
+ * revert — confirming the exact function selector Uniswap's
1630
+ * `UniversalRouter` uses, dispatched correctly with zero commands to run.
1631
+ */
1632
+ declare const pepuSwapUniversalRouterAbi: readonly [{
1633
+ readonly name: "execute";
1634
+ readonly type: "function";
1635
+ readonly stateMutability: "payable";
1636
+ readonly inputs: readonly [{
1637
+ readonly type: "bytes";
1638
+ readonly name: "commands";
1639
+ }, {
1640
+ readonly type: "bytes[]";
1641
+ readonly name: "inputs";
1642
+ }, {
1643
+ readonly type: "uint256";
1644
+ readonly name: "deadline";
1645
+ }];
1646
+ readonly outputs: readonly [];
1647
+ }];
1648
+
1649
+ /**
1650
+ * PepuSwap's Uniswap V3 core factory ABI, at
1651
+ * `0x5984B8BF2d4dB9C0aCB1d7924762e4474D80C807` on mainnet (see
1652
+ * `pepuSwapContracts.v3Factory` in `../dex.js`). PepuSwap is a Uniswap V3
1653
+ * fork; this is a standard `UniswapV3Factory` ABI subset.
1654
+ *
1655
+ * Verified live against mainnet 2026-09-24:
1656
+ * - `eth_getCode` returns 24,535 bytes of bytecode.
1657
+ * - `owner()` returns a live, non-zero address.
1658
+ * - `getPool(WPEPU, USDT, fee)` returns a real, non-zero pool address for
1659
+ * fee tiers 100/500/3000/10000, and that pool's own `token0()`/`token1()`
1660
+ * independently resolve to USDT/WPEPU.
1661
+ * - Four independent contracts on this chain (SwapRouter02,
1662
+ * NonfungiblePositionManager, QuoterV2, V3Migrator, V3Staker) each
1663
+ * read their own `factory()` immutable and all five return this exact
1664
+ * address — see the notes on each of their ABI files.
1665
+ */
1666
+ declare const pepuSwapV3FactoryAbi: readonly [{
1667
+ readonly name: "owner";
1668
+ readonly type: "function";
1669
+ readonly stateMutability: "view";
1670
+ readonly inputs: readonly [];
1671
+ readonly outputs: readonly [{
1672
+ readonly type: "address";
1673
+ }];
1674
+ }, {
1675
+ readonly name: "getPool";
1676
+ readonly type: "function";
1677
+ readonly stateMutability: "view";
1678
+ readonly inputs: readonly [{
1679
+ readonly type: "address";
1680
+ readonly name: "tokenA";
1681
+ }, {
1682
+ readonly type: "address";
1683
+ readonly name: "tokenB";
1684
+ }, {
1685
+ readonly type: "uint24";
1686
+ readonly name: "fee";
1687
+ }];
1688
+ readonly outputs: readonly [{
1689
+ readonly type: "address";
1690
+ readonly name: "pool";
1691
+ }];
1692
+ }, {
1693
+ readonly name: "feeAmountTickSpacing";
1694
+ readonly type: "function";
1695
+ readonly stateMutability: "view";
1696
+ readonly inputs: readonly [{
1697
+ readonly type: "uint24";
1698
+ readonly name: "fee";
1699
+ }];
1700
+ readonly outputs: readonly [{
1701
+ readonly type: "int24";
1702
+ }];
1703
+ }, {
1704
+ readonly name: "createPool";
1705
+ readonly type: "function";
1706
+ readonly stateMutability: "nonpayable";
1707
+ readonly inputs: readonly [{
1708
+ readonly type: "address";
1709
+ readonly name: "tokenA";
1710
+ }, {
1711
+ readonly type: "address";
1712
+ readonly name: "tokenB";
1713
+ }, {
1714
+ readonly type: "uint24";
1715
+ readonly name: "fee";
1716
+ }];
1717
+ readonly outputs: readonly [{
1718
+ readonly type: "address";
1719
+ readonly name: "pool";
1720
+ }];
1721
+ }, {
1722
+ readonly name: "PoolCreated";
1723
+ readonly type: "event";
1724
+ readonly inputs: readonly [{
1725
+ readonly type: "address";
1726
+ readonly name: "token0";
1727
+ readonly indexed: true;
1728
+ }, {
1729
+ readonly type: "address";
1730
+ readonly name: "token1";
1731
+ readonly indexed: true;
1732
+ }, {
1733
+ readonly type: "uint24";
1734
+ readonly name: "fee";
1735
+ readonly indexed: true;
1736
+ }, {
1737
+ readonly type: "int24";
1738
+ readonly name: "tickSpacing";
1739
+ }, {
1740
+ readonly type: "address";
1741
+ readonly name: "pool";
1742
+ }];
1743
+ }];
1744
+
1745
+ /**
1746
+ * Minimal Uniswap V3 pool ABI for reading a PepuSwap pool's state — enough
1747
+ * to price a pair and locate its liquidity, without the full swap/mint/burn
1748
+ * surface.
1749
+ *
1750
+ * Verified live against mainnet 2026-09-24 against the real WPEPU/USDT
1751
+ * 0.3% pool (`0x4bE3Af53800AADE09201654CD76D55063c7bdE70`, returned by
1752
+ * `pepuSwapV3FactoryAbi`'s `getPool`):
1753
+ * - `slot0()` decodes cleanly into the standard 7-field tuple (a live tick
1754
+ * of 372469 at the time of verification).
1755
+ * - `tickSpacing()` returns `60`, the standard spacing for a 0.3% pool.
1756
+ * - `token0()`/`token1()` return USDT/WPEPU respectively, matching the
1757
+ * factory's `getPool` inputs.
1758
+ */
1759
+ declare const pepuSwapV3PoolAbi: readonly [{
1760
+ readonly name: "token0";
1761
+ readonly type: "function";
1762
+ readonly stateMutability: "view";
1763
+ readonly inputs: readonly [];
1764
+ readonly outputs: readonly [{
1765
+ readonly type: "address";
1766
+ }];
1767
+ }, {
1768
+ readonly name: "token1";
1769
+ readonly type: "function";
1770
+ readonly stateMutability: "view";
1771
+ readonly inputs: readonly [];
1772
+ readonly outputs: readonly [{
1773
+ readonly type: "address";
1774
+ }];
1775
+ }, {
1776
+ readonly name: "fee";
1777
+ readonly type: "function";
1778
+ readonly stateMutability: "view";
1779
+ readonly inputs: readonly [];
1780
+ readonly outputs: readonly [{
1781
+ readonly type: "uint24";
1782
+ }];
1783
+ }, {
1784
+ readonly name: "tickSpacing";
1785
+ readonly type: "function";
1786
+ readonly stateMutability: "view";
1787
+ readonly inputs: readonly [];
1788
+ readonly outputs: readonly [{
1789
+ readonly type: "int24";
1790
+ }];
1791
+ }, {
1792
+ readonly name: "liquidity";
1793
+ readonly type: "function";
1794
+ readonly stateMutability: "view";
1795
+ readonly inputs: readonly [];
1796
+ readonly outputs: readonly [{
1797
+ readonly type: "uint128";
1798
+ }];
1799
+ }, {
1800
+ readonly name: "slot0";
1801
+ readonly type: "function";
1802
+ readonly stateMutability: "view";
1803
+ readonly inputs: readonly [];
1804
+ readonly outputs: readonly [{
1805
+ readonly type: "uint160";
1806
+ readonly name: "sqrtPriceX96";
1807
+ }, {
1808
+ readonly type: "int24";
1809
+ readonly name: "tick";
1810
+ }, {
1811
+ readonly type: "uint16";
1812
+ readonly name: "observationIndex";
1813
+ }, {
1814
+ readonly type: "uint16";
1815
+ readonly name: "observationCardinality";
1816
+ }, {
1817
+ readonly type: "uint16";
1818
+ readonly name: "observationCardinalityNext";
1819
+ }, {
1820
+ readonly type: "uint8";
1821
+ readonly name: "feeProtocol";
1822
+ }, {
1823
+ readonly type: "bool";
1824
+ readonly name: "unlocked";
1825
+ }];
1826
+ }];
1827
+
1828
+ /**
1829
+ * WPEPU (Wrapped Pepe Unchained) ABI.
1830
+ *
1831
+ * WPEPU is a WETH9-style wrapper around the native PEPU gas token, deployed
1832
+ * at `0xF9Cf4A16d26979b929Be7176bAc4e7084975FCB8` on mainnet (see
1833
+ * `pepuTokenList` in `../tokens.js`). This extends viem's own {@link erc20Abi}
1834
+ * with the two WETH9-specific functions and their events, rather than
1835
+ * re-declaring the ERC-20 surface from scratch.
1836
+ *
1837
+ * Verified live against mainnet on 2026-09-24:
1838
+ * - `deposit()` and `withdraw(uint256)` both simulate successfully via
1839
+ * `eth_call` (a zero-value deposit and a zero-amount withdraw), confirming
1840
+ * both selectors exist and don't revert.
1841
+ * - `decimals()` -> `18`, `symbol()` -> `"WPEPU"`, `name()` -> `"Wrapped PEPU"`.
1842
+ * - The contract is verified on pepuscan against the canonical `WETH9`
1843
+ * source.
1844
+ */
1845
+ declare const wpepuAbi: readonly [{
1846
+ readonly type: "event";
1847
+ readonly name: "Approval";
1848
+ readonly inputs: readonly [{
1849
+ readonly indexed: true;
1850
+ readonly name: "owner";
1851
+ readonly type: "address";
1852
+ }, {
1853
+ readonly indexed: true;
1854
+ readonly name: "spender";
1855
+ readonly type: "address";
1856
+ }, {
1857
+ readonly indexed: false;
1858
+ readonly name: "value";
1859
+ readonly type: "uint256";
1860
+ }];
1861
+ }, {
1862
+ readonly type: "event";
1863
+ readonly name: "Transfer";
1864
+ readonly inputs: readonly [{
1865
+ readonly indexed: true;
1866
+ readonly name: "from";
1867
+ readonly type: "address";
1868
+ }, {
1869
+ readonly indexed: true;
1870
+ readonly name: "to";
1871
+ readonly type: "address";
1872
+ }, {
1873
+ readonly indexed: false;
1874
+ readonly name: "value";
1875
+ readonly type: "uint256";
1876
+ }];
1877
+ }, {
1878
+ readonly type: "function";
1879
+ readonly name: "allowance";
1880
+ readonly stateMutability: "view";
1881
+ readonly inputs: readonly [{
1882
+ readonly name: "owner";
1883
+ readonly type: "address";
1884
+ }, {
1885
+ readonly name: "spender";
1886
+ readonly type: "address";
1887
+ }];
1888
+ readonly outputs: readonly [{
1889
+ readonly type: "uint256";
1890
+ }];
1891
+ }, {
1892
+ readonly type: "function";
1893
+ readonly name: "approve";
1894
+ readonly stateMutability: "nonpayable";
1895
+ readonly inputs: readonly [{
1896
+ readonly name: "spender";
1897
+ readonly type: "address";
1898
+ }, {
1899
+ readonly name: "amount";
1900
+ readonly type: "uint256";
1901
+ }];
1902
+ readonly outputs: readonly [{
1903
+ readonly type: "bool";
1904
+ }];
1905
+ }, {
1906
+ readonly type: "function";
1907
+ readonly name: "balanceOf";
1908
+ readonly stateMutability: "view";
1909
+ readonly inputs: readonly [{
1910
+ readonly name: "account";
1911
+ readonly type: "address";
1912
+ }];
1913
+ readonly outputs: readonly [{
1914
+ readonly type: "uint256";
1915
+ }];
1916
+ }, {
1917
+ readonly type: "function";
1918
+ readonly name: "decimals";
1919
+ readonly stateMutability: "view";
1920
+ readonly inputs: readonly [];
1921
+ readonly outputs: readonly [{
1922
+ readonly type: "uint8";
1923
+ }];
1924
+ }, {
1925
+ readonly type: "function";
1926
+ readonly name: "name";
1927
+ readonly stateMutability: "view";
1928
+ readonly inputs: readonly [];
1929
+ readonly outputs: readonly [{
1930
+ readonly type: "string";
1931
+ }];
1932
+ }, {
1933
+ readonly type: "function";
1934
+ readonly name: "symbol";
1935
+ readonly stateMutability: "view";
1936
+ readonly inputs: readonly [];
1937
+ readonly outputs: readonly [{
1938
+ readonly type: "string";
1939
+ }];
1940
+ }, {
1941
+ readonly type: "function";
1942
+ readonly name: "totalSupply";
1943
+ readonly stateMutability: "view";
1944
+ readonly inputs: readonly [];
1945
+ readonly outputs: readonly [{
1946
+ readonly type: "uint256";
1947
+ }];
1948
+ }, {
1949
+ readonly type: "function";
1950
+ readonly name: "transfer";
1951
+ readonly stateMutability: "nonpayable";
1952
+ readonly inputs: readonly [{
1953
+ readonly name: "recipient";
1954
+ readonly type: "address";
1955
+ }, {
1956
+ readonly name: "amount";
1957
+ readonly type: "uint256";
1958
+ }];
1959
+ readonly outputs: readonly [{
1960
+ readonly type: "bool";
1961
+ }];
1962
+ }, {
1963
+ readonly type: "function";
1964
+ readonly name: "transferFrom";
1965
+ readonly stateMutability: "nonpayable";
1966
+ readonly inputs: readonly [{
1967
+ readonly name: "sender";
1968
+ readonly type: "address";
1969
+ }, {
1970
+ readonly name: "recipient";
1971
+ readonly type: "address";
1972
+ }, {
1973
+ readonly name: "amount";
1974
+ readonly type: "uint256";
1975
+ }];
1976
+ readonly outputs: readonly [{
1977
+ readonly type: "bool";
1978
+ }];
1979
+ }, {
1980
+ readonly name: "deposit";
1981
+ readonly type: "function";
1982
+ readonly stateMutability: "payable";
1983
+ readonly inputs: readonly [];
1984
+ readonly outputs: readonly [];
1985
+ }, {
1986
+ readonly name: "withdraw";
1987
+ readonly type: "function";
1988
+ readonly stateMutability: "nonpayable";
1989
+ readonly inputs: readonly [{
1990
+ readonly type: "uint256";
1991
+ readonly name: "amount";
1992
+ }];
1993
+ readonly outputs: readonly [];
1994
+ }, {
1995
+ readonly name: "Deposit";
1996
+ readonly type: "event";
1997
+ readonly inputs: readonly [{
1998
+ readonly type: "address";
1999
+ readonly name: "dst";
2000
+ readonly indexed: true;
2001
+ }, {
2002
+ readonly type: "uint256";
2003
+ readonly name: "amount";
2004
+ }];
2005
+ }, {
2006
+ readonly name: "Withdrawal";
2007
+ readonly type: "event";
2008
+ readonly inputs: readonly [{
2009
+ readonly type: "address";
2010
+ readonly name: "src";
2011
+ readonly indexed: true;
2012
+ }, {
2013
+ readonly type: "uint256";
2014
+ readonly name: "amount";
2015
+ }];
2016
+ }];
2017
+
2018
+ /**
2019
+ * Minimal Multicall3 ABI (aggregate3 plus the common read helpers). Same
2020
+ * interface as canonical mds1/multicall3; on PEPU it lives at the
2021
+ * PEPU-specific `0x9CE19273Ae9c24437DFF512E8DFCAed4E4B001bd`, never at the
2022
+ * canonical `0xcA11...CA11`.
2023
+ */
2024
+ declare const multicall3Abi: readonly [{
2025
+ readonly name: "aggregate3";
2026
+ readonly type: "function";
2027
+ readonly stateMutability: "payable";
2028
+ readonly inputs: readonly [{
2029
+ readonly type: "tuple[]";
2030
+ readonly components: readonly [{
2031
+ readonly type: "address";
2032
+ readonly name: "target";
2033
+ }, {
2034
+ readonly type: "bool";
2035
+ readonly name: "allowFailure";
2036
+ }, {
2037
+ readonly type: "bytes";
2038
+ readonly name: "callData";
2039
+ }];
2040
+ readonly name: "calls";
2041
+ }];
2042
+ readonly outputs: readonly [{
2043
+ readonly type: "tuple[]";
2044
+ readonly components: readonly [{
2045
+ readonly type: "bool";
2046
+ readonly name: "success";
2047
+ }, {
2048
+ readonly type: "bytes";
2049
+ readonly name: "returnData";
2050
+ }];
2051
+ readonly name: "returnData";
2052
+ }];
2053
+ }, {
2054
+ readonly name: "getEthBalance";
2055
+ readonly type: "function";
2056
+ readonly stateMutability: "view";
2057
+ readonly inputs: readonly [{
2058
+ readonly type: "address";
2059
+ readonly name: "addr";
2060
+ }];
2061
+ readonly outputs: readonly [{
2062
+ readonly type: "uint256";
2063
+ readonly name: "balance";
2064
+ }];
2065
+ }, {
2066
+ readonly name: "getBlockNumber";
2067
+ readonly type: "function";
2068
+ readonly stateMutability: "view";
2069
+ readonly inputs: readonly [];
2070
+ readonly outputs: readonly [{
2071
+ readonly type: "uint256";
2072
+ readonly name: "blockNumber";
2073
+ }];
2074
+ }, {
2075
+ readonly name: "getChainId";
2076
+ readonly type: "function";
2077
+ readonly stateMutability: "view";
2078
+ readonly inputs: readonly [];
2079
+ readonly outputs: readonly [{
2080
+ readonly type: "uint256";
2081
+ }];
2082
+ }];
2083
+
2084
+ /**
2085
+ * Canonical Permit2 ABI subset (AllowanceTransfer plus SignatureTransfer
2086
+ * nonce reads). For the canonical `0x000000000022D473030F116dDEE9F6B43aC78BA3`
2087
+ * deployed on PEPU. NOT PepuSwap's separate deployment (see `pepuSwapPermit2Abi`).
2088
+ */
2089
+ declare const permit2Abi: readonly [{
2090
+ readonly name: "DOMAIN_SEPARATOR";
2091
+ readonly type: "function";
2092
+ readonly stateMutability: "view";
2093
+ readonly inputs: readonly [];
2094
+ readonly outputs: readonly [{
2095
+ readonly type: "bytes32";
2096
+ }];
2097
+ }, {
2098
+ readonly name: "allowance";
2099
+ readonly type: "function";
2100
+ readonly stateMutability: "view";
2101
+ readonly inputs: readonly [{
2102
+ readonly type: "address";
2103
+ readonly name: "owner";
2104
+ }, {
2105
+ readonly type: "address";
2106
+ readonly name: "token";
2107
+ }, {
2108
+ readonly type: "address";
2109
+ readonly name: "spender";
2110
+ }];
2111
+ readonly outputs: readonly [{
2112
+ readonly type: "uint160";
2113
+ readonly name: "amount";
2114
+ }, {
2115
+ readonly type: "uint48";
2116
+ readonly name: "expiration";
2117
+ }, {
2118
+ readonly type: "uint48";
2119
+ readonly name: "nonce";
2120
+ }];
2121
+ }, {
2122
+ readonly name: "approve";
2123
+ readonly type: "function";
2124
+ readonly stateMutability: "nonpayable";
2125
+ readonly inputs: readonly [{
2126
+ readonly type: "address";
2127
+ readonly name: "token";
2128
+ }, {
2129
+ readonly type: "address";
2130
+ readonly name: "spender";
2131
+ }, {
2132
+ readonly type: "uint160";
2133
+ readonly name: "amount";
2134
+ }, {
2135
+ readonly type: "uint48";
2136
+ readonly name: "expiration";
2137
+ }];
2138
+ readonly outputs: readonly [];
2139
+ }, {
2140
+ readonly name: "nonceBitmap";
2141
+ readonly type: "function";
2142
+ readonly stateMutability: "view";
2143
+ readonly inputs: readonly [{
2144
+ readonly type: "address";
2145
+ readonly name: "owner";
2146
+ }, {
2147
+ readonly type: "uint256";
2148
+ readonly name: "wordPos";
2149
+ }];
2150
+ readonly outputs: readonly [{
2151
+ readonly type: "uint256";
2152
+ }];
2153
+ }, {
2154
+ readonly name: "invalidateNonces";
2155
+ readonly type: "function";
2156
+ readonly stateMutability: "nonpayable";
2157
+ readonly inputs: readonly [{
2158
+ readonly type: "address";
2159
+ readonly name: "token";
2160
+ }, {
2161
+ readonly type: "address";
2162
+ readonly name: "spender";
2163
+ }, {
2164
+ readonly type: "uint48";
2165
+ readonly name: "newNonce";
2166
+ }];
2167
+ readonly outputs: readonly [];
2168
+ }];
2169
+
2170
+ /**
2171
+ * Hosted-URL swap point. The hosted PEPU bundler and paymaster service run at
2172
+ * bundler.pepeunchained.com and paymaster.pepeunchained.com. Set here, the SDK,
2173
+ * MCP server and docs flip together. Apps can still point at their own
2174
+ * services with the env vars below.
2175
+ *
2176
+ * - `bundlerUrl` is a complete JSON-RPC URL.
2177
+ * - `paymasterBaseUrl` is the paymaster SERVICE base (REST API, `/health`,
2178
+ * `/v2/free-tier`). It is NOT an ERC-7677 URL: v2 serves ERC-7677 at
2179
+ * `<base>/v2/paymaster/<client token>`, so build that with
2180
+ * `hostedErc7677Url` (or `buildErc7677Url`).
2181
+ * - `paymasterUrl` is the default complete ERC-7677 URL. It stays `null`
2182
+ * because every ERC-7677 URL embeds a per-project token; set
2183
+ * `PEPU_PAYMASTER_URL` (or pass a token) to supply one.
2184
+ */
2185
+ declare const PEPU_HOSTED: {
2186
+ readonly bundlerUrl: string | null;
2187
+ readonly paymasterBaseUrl: string | null;
2188
+ readonly paymasterUrl: string | null;
2189
+ };
2190
+ /** Server-side (and script) environment variable names. */
2191
+ declare const PEPU_ENV: {
2192
+ readonly bundlerUrl: "PEPU_BUNDLER_URL";
2193
+ readonly paymasterUrl: "PEPU_PAYMASTER_URL";
2194
+ readonly rpcUrl: "PEPU_RPC_URL";
2195
+ };
2196
+ /** Browser-exposed variants (Next.js `NEXT_PUBLIC_` convention). */
2197
+ declare const PEPU_PUBLIC_ENV: {
2198
+ readonly bundlerUrl: "NEXT_PUBLIC_PEPU_BUNDLER_URL";
2199
+ readonly paymasterUrl: "NEXT_PUBLIC_PEPU_PAYMASTER_URL";
2200
+ readonly rpcUrl: "NEXT_PUBLIC_PEPU_RPC_URL";
2201
+ };
2202
+ interface ResolvePepuEndpointsOptions {
2203
+ bundlerUrl?: string;
2204
+ paymasterUrl?: string;
2205
+ rpcUrl?: string;
2206
+ /**
2207
+ * Environment to read. Defaults to `process.env` when it exists. In browser
2208
+ * bundles frameworks only inline literal `process.env.NEXT_PUBLIC_X`
2209
+ * accesses, so pass them explicitly there.
2210
+ */
2211
+ env?: Record<string, string | undefined>;
2212
+ }
2213
+ interface PepuEndpoints {
2214
+ rpcUrl: string;
2215
+ bundlerUrl: string | null;
2216
+ /** Complete ERC-7677 URL from the option or env, else `null` (it needs a project token). */
2217
+ paymasterUrl: string | null;
2218
+ /**
2219
+ * Paymaster service base for the REST API, probes and ERC-7677 URL building.
2220
+ * From the option or env (a full ERC-7677 URL is reduced to its base), else the hosted base.
2221
+ */
2222
+ paymasterBaseUrl: string | null;
2223
+ /** Highest-precedence origin used for any of the three values. */
2224
+ source: "explicit" | "env" | "hosted-default";
2225
+ }
2226
+ /** Strip a trailing `/v2/paymaster/<token>` or `/paymaster/<token>` and slashes, leaving the service base. */
2227
+ declare function paymasterBaseOf(url: string): string;
2228
+ /**
2229
+ * Resolve endpoints. Precedence per value: explicit option, then env
2230
+ * (server variable, then `NEXT_PUBLIC_` variable), then {@link PEPU_HOSTED}.
2231
+ * Throws PepuConfigError (CONFIG_BAD_URL) naming the variable, never its value.
2232
+ */
2233
+ declare function resolvePepuEndpoints(options?: ResolvePepuEndpointsOptions): PepuEndpoints;
2234
+ /** True once the hosted bundler and the hosted paymaster service have URLs in {@link PEPU_HOSTED}. */
2235
+ declare function isHostedSponsorshipLive(): boolean;
2236
+ /** The public free-tier state route on the hosted paymaster (`GET`, no credentials). */
2237
+ declare function hostedFreeTierUrl(): string;
2238
+
2239
+ /** The canonical Multicall3 address, which is NOT deployed on PEPU. */
2240
+ declare const CANONICAL_MULTICALL3_ADDRESS: "0xcA11bde05977b3631167028862bE2a173976CA11";
2241
+ /**
2242
+ * Guard: throws `MULTICALL3_CANONICAL_ADDRESS` if `address` is the canonical
2243
+ * Multicall3 address (which has no code on PEPU).
2244
+ *
2245
+ * @example
2246
+ * ```ts
2247
+ * assertNotCanonicalMulticall3("0x9CE19273Ae9c24437DFF512E8DFCAed4E4B001bd"); // ok
2248
+ * ```
2249
+ */
2250
+ declare function assertNotCanonicalMulticall3(address: Address): void;
2251
+ /**
2252
+ * The PEPU-specific Multicall3 registry entry. Never the canonical address.
2253
+ *
2254
+ * @example
2255
+ * ```ts
2256
+ * const { address } = getMulticall3(); // 0x9CE19273...01bd
2257
+ * ```
2258
+ */
2259
+ declare function getMulticall3(chainId?: number): DeployedContract;
2260
+ /**
2261
+ * viem `multicall` pinned to the PEPU Multicall3 address.
2262
+ *
2263
+ * @example
2264
+ * ```ts
2265
+ * const [name, supply] = await pepuMulticall(client, [
2266
+ * { address: token, abi: erc20Abi, functionName: "name" },
2267
+ * { address: token, abi: erc20Abi, functionName: "totalSupply" },
2268
+ * ], { allowFailure: false });
2269
+ * ```
2270
+ */
2271
+ declare function pepuMulticall<const T extends readonly ContractFunctionParameters[], A extends boolean = true>(client: PublicClient, calls: T, o?: {
2272
+ allowFailure?: A;
2273
+ blockNumber?: bigint;
2274
+ }): Promise<MulticallReturnType<T, A>>;
2275
+ /**
2276
+ * ABI-encode a Multicall3 `aggregate3` call.
2277
+ *
2278
+ * @example
2279
+ * ```ts
2280
+ * const data = encodeAggregate3([{ target: token, callData: "0x18160ddd" }]);
2281
+ * ```
2282
+ */
2283
+ declare function encodeAggregate3(calls: readonly {
2284
+ target: Address;
2285
+ allowFailure?: boolean;
2286
+ callData: Hex;
2287
+ }[]): Hex;
2288
+ /**
2289
+ * Decode the return data of `aggregate3`.
2290
+ *
2291
+ * @example
2292
+ * ```ts
2293
+ * const results = decodeAggregate3Result(returnData);
2294
+ * results[0]?.success;
2295
+ * ```
2296
+ */
2297
+ declare function decodeAggregate3Result(data: Hex): {
2298
+ success: boolean;
2299
+ returnData: Hex;
2300
+ }[];
2301
+
2302
+ /**
2303
+ * The canonical Permit2 registry entry (`0x000000000022D473...78BA3`).
2304
+ *
2305
+ * @example
2306
+ * ```ts
2307
+ * const { address } = getPermit2();
2308
+ * ```
2309
+ */
2310
+ declare function getPermit2(chainId?: number): DeployedContract;
2311
+ /**
2312
+ * EIP-712 domain for canonical Permit2: name "Permit2" (no version).
2313
+ *
2314
+ * @example
2315
+ * ```ts
2316
+ * const domain = permit2Domain(); // { name: "Permit2", chainId: 97741, verifyingContract }
2317
+ * ```
2318
+ */
2319
+ declare function permit2Domain(chainId?: number): TypedDataDomain;
2320
+ /** Typed-data definition accepted by viem `signTypedData`. */
2321
+ interface Permit2TypedData<P extends string, M extends Record<string, unknown>> {
2322
+ domain: TypedDataDomain;
2323
+ types: Record<string, readonly {
2324
+ name: string;
2325
+ type: string;
2326
+ }[]>;
2327
+ primaryType: P;
2328
+ message: M;
2329
+ }
2330
+ /**
2331
+ * Typed data for Permit2 AllowanceTransfer `PermitSingle`.
2332
+ *
2333
+ * @example
2334
+ * ```ts
2335
+ * const td = buildPermitSingleTypedData({ token, amount: 1n, expiration: 1900000000, nonce: 0, spender, sigDeadline: 1900000000n });
2336
+ * ```
2337
+ */
2338
+ declare function buildPermitSingleTypedData(p: {
2339
+ token: Address;
2340
+ amount: bigint;
2341
+ expiration: number;
2342
+ nonce: number;
2343
+ spender: Address;
2344
+ sigDeadline: bigint;
2345
+ chainId?: number;
2346
+ }): Permit2TypedData<"PermitSingle", {
2347
+ details: {
2348
+ token: Address;
2349
+ amount: bigint;
2350
+ expiration: number;
2351
+ nonce: number;
2352
+ };
2353
+ spender: Address;
2354
+ sigDeadline: bigint;
2355
+ }>;
2356
+ /**
2357
+ * Typed data for Permit2 SignatureTransfer `PermitTransferFrom`.
2358
+ *
2359
+ * @example
2360
+ * ```ts
2361
+ * const td = buildPermitTransferFromTypedData({ token, amount: 1n, spender, nonce: 0n, deadline: 1900000000n });
2362
+ * ```
2363
+ */
2364
+ declare function buildPermitTransferFromTypedData(p: {
2365
+ token: Address;
2366
+ amount: bigint;
2367
+ spender: Address;
2368
+ nonce: bigint;
2369
+ deadline: bigint;
2370
+ chainId?: number;
2371
+ }): Permit2TypedData<"PermitTransferFrom", {
2372
+ permitted: {
2373
+ token: Address;
2374
+ amount: bigint;
2375
+ };
2376
+ spender: Address;
2377
+ nonce: bigint;
2378
+ deadline: bigint;
2379
+ }>;
2380
+ /**
2381
+ * Read the Permit2 AllowanceTransfer allowance for (owner, token, spender).
2382
+ *
2383
+ * @example
2384
+ * ```ts
2385
+ * const { amount, expiration, nonce } = await readPermit2Allowance(client, { owner, token, spender });
2386
+ * ```
2387
+ */
2388
+ declare function readPermit2Allowance(client: PublicClient, o: {
2389
+ owner: Address;
2390
+ token: Address;
2391
+ spender: Address;
2392
+ }): Promise<{
2393
+ amount: bigint;
2394
+ expiration: number;
2395
+ nonce: number;
2396
+ }>;
2397
+
2398
+ export { ARB_GAS_INFO_ADDRESS, CANONICAL_MULTICALL3_ADDRESS, ContractEntry, DEFAULT_MAX_SEND_MARGIN_BPS, DeployedContract, type DualFeeModelExplanation, ERC7579_MODULE_TYPE, type ExplorerResourceType, type FormatPepuOptions, KERNEL_V3_1_IMPLEMENTATION_ADDRESS, type MaxSendableAmountOptions, type MaxSendableAmountResult, type NitroFeeBreakdown, PEPU_ENV, PEPU_HOSTED, PEPU_PUBLIC_ENV, PepuChain, type PepuEndpoints, type PepuSwapContractName, type PepuTokenInfo, type PepuTokenList, type PepuscanClient, type PepuscanTokenMetadata, type Permit2TypedData, type ResolvePepuEndpointsOptions, type TransactionCostEstimate, addressUrl, arbGasInfoAbi, assertNotCanonicalMulticall3, blockUrl, buildPermitSingleTypedData, buildPermitTransferFromTypedData, createPepuscanClient, decodeAggregate3Result, encodeAggregate3, entryPointV07Abi, estimateTransactionCost, explainDualFeeModel, explorerLinks, explorerUrl, formatPepu, formatPepuGasPrice, formatUnitsCompact, getMulticall3, getNitroFeeBreakdown, getPepuSwapContract, getPermit2, getPublicClient, hostedFreeTierUrl, isHostedSponsorshipLive, kernelEcdsaValidatorAbi, kernelFactoryAbi, listPepuSwapContracts, maxSendableAmount, multicall3Abi, paymasterBaseOf, pepuMulticall, pepuSwapContracts, pepuSwapMulticallAbi, pepuSwapPermit2Abi, pepuSwapPositionManagerAbi, pepuSwapQuoterAbi, pepuSwapRouterAbi, pepuSwapTickLensAbi, pepuSwapUniversalRouterAbi, pepuSwapV3FactoryAbi, pepuSwapV3PoolAbi, pepuTokenList, permit2Abi, permit2Domain, readPermit2Allowance, resolvePepuEndpoints, switchOrAddPepuChain, toAddEthereumChainParameter, tokenUrl, txUrl, wpepuAbi };