@pepu-chain/sdk 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +565 -2
- package/dist/aa/kernel.cjs +40 -0
- package/dist/aa/kernel.cjs.map +1 -0
- package/dist/aa/kernel.d.cts +88 -0
- package/dist/aa/kernel.d.ts +88 -0
- package/dist/aa/kernel.js +11 -0
- package/dist/aa/kernel.js.map +1 -0
- package/dist/aa/react-direct.cjs +110 -0
- package/dist/aa/react-direct.cjs.map +1 -0
- package/dist/aa/react-direct.d.cts +42 -0
- package/dist/aa/react-direct.d.ts +42 -0
- package/dist/aa/react-direct.js +107 -0
- package/dist/aa/react-direct.js.map +1 -0
- package/dist/aa/react.cjs +151 -0
- package/dist/aa/react.cjs.map +1 -0
- package/dist/aa/react.d.cts +62 -0
- package/dist/aa/react.d.ts +62 -0
- package/dist/aa/react.js +147 -0
- package/dist/aa/react.js.map +1 -0
- package/dist/aa.cjs +84 -0
- package/dist/aa.cjs.map +1 -0
- package/dist/aa.d.cts +85 -0
- package/dist/aa.d.ts +85 -0
- package/dist/aa.js +11 -0
- package/dist/aa.js.map +1 -0
- package/dist/api-Dz4sCHH_.d.cts +654 -0
- package/dist/api-Dz4sCHH_.d.ts +654 -0
- package/dist/calls-BRPjKgjl.d.cts +70 -0
- package/dist/calls-z_EQOtFb.d.ts +70 -0
- package/dist/chains-DK13zGIp.d.cts +235 -0
- package/dist/chains-DK13zGIp.d.ts +235 -0
- package/dist/chunk-3XUGQODR.js +194 -0
- package/dist/chunk-3XUGQODR.js.map +1 -0
- package/dist/chunk-45KSZH26.cjs +145 -0
- package/dist/chunk-45KSZH26.cjs.map +1 -0
- package/dist/chunk-4GINFJO6.cjs +44 -0
- package/dist/chunk-4GINFJO6.cjs.map +1 -0
- package/dist/chunk-62M2LKQW.js +136 -0
- package/dist/chunk-62M2LKQW.js.map +1 -0
- package/dist/chunk-6DSZ4Z2N.js +498 -0
- package/dist/chunk-6DSZ4Z2N.js.map +1 -0
- package/dist/chunk-7MNJF2OB.cjs +72 -0
- package/dist/chunk-7MNJF2OB.cjs.map +1 -0
- package/dist/chunk-A5LP2UCS.cjs +2729 -0
- package/dist/chunk-A5LP2UCS.cjs.map +1 -0
- package/dist/chunk-AJS4UFQX.cjs +121 -0
- package/dist/chunk-AJS4UFQX.cjs.map +1 -0
- package/dist/chunk-C2XW44FI.cjs +200 -0
- package/dist/chunk-C2XW44FI.cjs.map +1 -0
- package/dist/chunk-C7IC36XS.cjs +13 -0
- package/dist/chunk-C7IC36XS.cjs.map +1 -0
- package/dist/chunk-D52PADVY.js +84 -0
- package/dist/chunk-D52PADVY.js.map +1 -0
- package/dist/chunk-DH6BFNVJ.cjs +272 -0
- package/dist/chunk-DH6BFNVJ.cjs.map +1 -0
- package/dist/chunk-DPCZJLB3.cjs +87 -0
- package/dist/chunk-DPCZJLB3.cjs.map +1 -0
- package/dist/chunk-EHBPIYY4.js +262 -0
- package/dist/chunk-EHBPIYY4.js.map +1 -0
- package/dist/chunk-ESMNAXUI.js +86 -0
- package/dist/chunk-ESMNAXUI.js.map +1 -0
- package/dist/chunk-ET3P6TX6.cjs +49 -0
- package/dist/chunk-ET3P6TX6.cjs.map +1 -0
- package/dist/chunk-FCXSP2YF.js +219 -0
- package/dist/chunk-FCXSP2YF.js.map +1 -0
- package/dist/chunk-IB2FSPMJ.js +66 -0
- package/dist/chunk-IB2FSPMJ.js.map +1 -0
- package/dist/chunk-IG7RSL2Y.cjs +178 -0
- package/dist/chunk-IG7RSL2Y.cjs.map +1 -0
- package/dist/chunk-IY3ALPUJ.js +2716 -0
- package/dist/chunk-IY3ALPUJ.js.map +1 -0
- package/dist/chunk-J3O2ZGG3.cjs +93 -0
- package/dist/chunk-J3O2ZGG3.cjs.map +1 -0
- package/dist/chunk-J6UXXHBE.js +37 -0
- package/dist/chunk-J6UXXHBE.js.map +1 -0
- package/dist/chunk-JLZ4LZ4Z.js +22 -0
- package/dist/chunk-JLZ4LZ4Z.js.map +1 -0
- package/dist/chunk-KIIFL4VM.js +274 -0
- package/dist/chunk-KIIFL4VM.js.map +1 -0
- package/dist/chunk-KVG3AYYR.js +99 -0
- package/dist/chunk-KVG3AYYR.js.map +1 -0
- package/dist/chunk-MBA4CLA5.js +45 -0
- package/dist/chunk-MBA4CLA5.js.map +1 -0
- package/dist/chunk-NE3QKDOB.cjs +24 -0
- package/dist/chunk-NE3QKDOB.cjs.map +1 -0
- package/dist/chunk-NVOPDXTA.cjs +95 -0
- package/dist/chunk-NVOPDXTA.cjs.map +1 -0
- package/dist/chunk-OH3QMAIB.js +11 -0
- package/dist/chunk-OH3QMAIB.js.map +1 -0
- package/dist/chunk-PHM3ZORG.cjs +110 -0
- package/dist/chunk-PHM3ZORG.cjs.map +1 -0
- package/dist/chunk-R5PXQNO3.cjs +209 -0
- package/dist/chunk-R5PXQNO3.cjs.map +1 -0
- package/dist/chunk-SLW7FRTL.cjs +285 -0
- package/dist/chunk-SLW7FRTL.cjs.map +1 -0
- package/dist/chunk-SVWRRALU.cjs +17 -0
- package/dist/chunk-SVWRRALU.cjs.map +1 -0
- package/dist/chunk-T43PQXJD.js +202 -0
- package/dist/chunk-T43PQXJD.js.map +1 -0
- package/dist/chunk-TIEAZYHF.cjs +225 -0
- package/dist/chunk-TIEAZYHF.cjs.map +1 -0
- package/dist/chunk-VBH3JLQ5.js +116 -0
- package/dist/chunk-VBH3JLQ5.js.map +1 -0
- package/dist/chunk-VF3D6KLQ.cjs +94 -0
- package/dist/chunk-VF3D6KLQ.cjs.map +1 -0
- package/dist/chunk-VTQIHMF3.js +82 -0
- package/dist/chunk-VTQIHMF3.js.map +1 -0
- package/dist/chunk-W3JN3YIW.js +15 -0
- package/dist/chunk-W3JN3YIW.js.map +1 -0
- package/dist/chunk-WANILJZQ.cjs +87 -0
- package/dist/chunk-WANILJZQ.cjs.map +1 -0
- package/dist/chunk-XC4IBCI2.js +86 -0
- package/dist/chunk-XC4IBCI2.js.map +1 -0
- package/dist/chunk-YKEWWQEJ.js +165 -0
- package/dist/chunk-YKEWWQEJ.js.map +1 -0
- package/dist/chunk-YQL7NISX.cjs +515 -0
- package/dist/chunk-YQL7NISX.cjs.map +1 -0
- package/dist/chunk-ZB6SVBK4.js +89 -0
- package/dist/chunk-ZB6SVBK4.js.map +1 -0
- package/dist/combo/react.cjs +235 -0
- package/dist/combo/react.cjs.map +1 -0
- package/dist/combo/react.d.cts +148 -0
- package/dist/combo/react.d.ts +148 -0
- package/dist/combo/react.js +230 -0
- package/dist/combo/react.js.map +1 -0
- package/dist/combo.cjs +262 -0
- package/dist/combo.cjs.map +1 -0
- package/dist/combo.d.cts +139 -0
- package/dist/combo.d.ts +139 -0
- package/dist/combo.js +249 -0
- package/dist/combo.js.map +1 -0
- package/dist/config-CHjz7ZjZ.d.cts +57 -0
- package/dist/config-COjhIZTh.d.ts +57 -0
- package/dist/doctor.cjs +354 -0
- package/dist/doctor.cjs.map +1 -0
- package/dist/doctor.d.cts +177 -0
- package/dist/doctor.d.ts +177 -0
- package/dist/doctor.js +345 -0
- package/dist/doctor.js.map +1 -0
- package/dist/erc7677-DOW58QBE.d.cts +111 -0
- package/dist/erc7677-DOW58QBE.d.ts +111 -0
- package/dist/errors-CgX1vNj7.d.cts +100 -0
- package/dist/errors-CgX1vNj7.d.ts +100 -0
- package/dist/index.cjs +802 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2398 -0
- package/dist/index.d.ts +2398 -0
- package/dist/index.js +559 -0
- package/dist/index.js.map +1 -0
- package/dist/paymaster/server.cjs +38 -0
- package/dist/paymaster/server.cjs.map +1 -0
- package/dist/paymaster/server.d.cts +57 -0
- package/dist/paymaster/server.d.ts +57 -0
- package/dist/paymaster/server.js +36 -0
- package/dist/paymaster/server.js.map +1 -0
- package/dist/paymaster.cjs +356 -0
- package/dist/paymaster.cjs.map +1 -0
- package/dist/paymaster.d.cts +1851 -0
- package/dist/paymaster.d.ts +1851 -0
- package/dist/paymaster.js +289 -0
- package/dist/paymaster.js.map +1 -0
- package/dist/privy/react.cjs +48 -0
- package/dist/privy/react.cjs.map +1 -0
- package/dist/privy/react.d.cts +194 -0
- package/dist/privy/react.d.ts +194 -0
- package/dist/privy/react.js +7 -0
- package/dist/privy/react.js.map +1 -0
- package/dist/privy/server.cjs +43 -0
- package/dist/privy/server.cjs.map +1 -0
- package/dist/privy/server.d.cts +192 -0
- package/dist/privy/server.d.ts +192 -0
- package/dist/privy/server.js +6 -0
- package/dist/privy/server.js.map +1 -0
- package/dist/privy/wagmi.d.ts +90 -0
- package/dist/privy/wagmi.js +55 -0
- package/dist/privy/wagmi.js.map +1 -0
- package/dist/privy.cjs +34 -0
- package/dist/privy.cjs.map +1 -0
- package/dist/privy.d.cts +4 -0
- package/dist/privy.d.ts +4 -0
- package/dist/privy.js +5 -0
- package/dist/privy.js.map +1 -0
- package/dist/react.cjs +72 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +66 -0
- package/dist/react.d.ts +66 -0
- package/dist/react.js +68 -0
- package/dist/react.js.map +1 -0
- package/dist/requirements-C-QiJkL9.d.cts +134 -0
- package/dist/requirements-C-QiJkL9.d.ts +134 -0
- package/dist/scope-DBRkN7bR.d.cts +94 -0
- package/dist/scope-DBRkN7bR.d.ts +94 -0
- package/dist/server.cjs +59 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +208 -0
- package/dist/server.d.ts +208 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/session/kernel.cjs +82 -0
- package/dist/session/kernel.cjs.map +1 -0
- package/dist/session/kernel.d.cts +131 -0
- package/dist/session/kernel.d.ts +131 -0
- package/dist/session/kernel.js +13 -0
- package/dist/session/kernel.js.map +1 -0
- package/dist/session/react.cjs +37 -0
- package/dist/session/react.cjs.map +1 -0
- package/dist/session/react.d.cts +119 -0
- package/dist/session/react.d.ts +119 -0
- package/dist/session/react.js +8 -0
- package/dist/session/react.js.map +1 -0
- package/dist/session/server.cjs +267 -0
- package/dist/session/server.cjs.map +1 -0
- package/dist/session/server.d.cts +151 -0
- package/dist/session/server.d.ts +151 -0
- package/dist/session/server.js +252 -0
- package/dist/session/server.js.map +1 -0
- package/dist/session.cjs +74 -0
- package/dist/session.cjs.map +1 -0
- package/dist/session.d.cts +3 -0
- package/dist/session.d.ts +3 -0
- package/dist/session.js +5 -0
- package/dist/session.js.map +1 -0
- package/dist/status-CmOsyPmO.d.cts +295 -0
- package/dist/status-DwkkOrGQ.d.ts +295 -0
- package/dist/store-CjmLgp9g.d.cts +64 -0
- package/dist/store-CjmLgp9g.d.ts +64 -0
- package/dist/types-BEEM7WdG.d.cts +25 -0
- package/dist/types-BEEM7WdG.d.ts +25 -0
- package/dist/types-BilBTDqK.d.cts +27 -0
- package/dist/types-BilBTDqK.d.ts +27 -0
- package/package.json +209 -3
package/dist/index.d.cts
ADDED
|
@@ -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-CmOsyPmO.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 getPepuAddresses, f as getPepuKernelStack, h as getSponsorshipStatus, r as isDeployed, s as listContracts, t as pepuContracts } from './status-CmOsyPmO.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 };
|