@pepu-chain/sdk 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +590 -2
- package/dist/aa/kernel.cjs +41 -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.guard.js +15 -0
- package/dist/aa/kernel.js +11 -0
- package/dist/aa/kernel.js.map +1 -0
- package/dist/aa/react-direct.cjs +111 -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.guard.js +15 -0
- package/dist/aa/react-direct.js +107 -0
- package/dist/aa/react-direct.js.map +1 -0
- package/dist/aa/react.cjs +152 -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.guard.js +15 -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-7PVR7QSE.js +45 -0
- package/dist/chunk-7PVR7QSE.js.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-BGALSKAF.cjs +315 -0
- package/dist/chunk-BGALSKAF.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-F2R473FR.js +304 -0
- package/dist/chunk-F2R473FR.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-K7JSQPZO.cjs +231 -0
- package/dist/chunk-K7JSQPZO.cjs.map +1 -0
- package/dist/chunk-KJYNF5KH.js +224 -0
- package/dist/chunk-KJYNF5KH.js.map +1 -0
- package/dist/chunk-KVG3AYYR.js +99 -0
- package/dist/chunk-KVG3AYYR.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-RCMKPJZO.cjs +49 -0
- package/dist/chunk-RCMKPJZO.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-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 +236 -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.guard.js +15 -0
- package/dist/combo/react.js +230 -0
- package/dist/combo/react.js.map +1 -0
- package/dist/combo.cjs +263 -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.guard.js +15 -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 +806 -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 +49 -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.guard.js +15 -0
- package/dist/privy/react.js +7 -0
- package/dist/privy/react.js.map +1 -0
- package/dist/privy/server.cjs +44 -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.guard.js +15 -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.guard.js +15 -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 +73 -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.guard.js +15 -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 +83 -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.guard.js +15 -0
- package/dist/session/kernel.js +13 -0
- package/dist/session/kernel.js.map +1 -0
- package/dist/session/react.cjs +38 -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.guard.js +15 -0
- package/dist/session/react.js +8 -0
- package/dist/session/react.js.map +1 -0
- package/dist/session/server.cjs +268 -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.guard.js +15 -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-Dx9zAFo9.d.ts +327 -0
- package/dist/status-wgTM26V7.d.cts +327 -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 +245 -3
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkA5LP2UCS_cjs = require('./chunk-A5LP2UCS.cjs');
|
|
4
|
+
var chunkK7JSQPZO_cjs = require('./chunk-K7JSQPZO.cjs');
|
|
5
|
+
require('./chunk-VF3D6KLQ.cjs');
|
|
6
|
+
var chunkDPCZJLB3_cjs = require('./chunk-DPCZJLB3.cjs');
|
|
7
|
+
var chunkYQL7NISX_cjs = require('./chunk-YQL7NISX.cjs');
|
|
8
|
+
var viem = require('viem');
|
|
9
|
+
|
|
10
|
+
var U112_MAX = (1n << 112n) - 1n;
|
|
11
|
+
var U128_MAX = (1n << 128n) - 1n;
|
|
12
|
+
var MAX_TARGETS_PER_CALL = 50;
|
|
13
|
+
function resolvePaymasterV2Address(explicit) {
|
|
14
|
+
if (explicit !== void 0) {
|
|
15
|
+
if (!viem.isAddress(explicit, { strict: false })) {
|
|
16
|
+
throw new chunkYQL7NISX_cjs.PepuConfigError("CONFIG_MISSING_ENV", "The v2 paymaster address passed in is not a valid address.");
|
|
17
|
+
}
|
|
18
|
+
return viem.getAddress(explicit);
|
|
19
|
+
}
|
|
20
|
+
const entry = chunkK7JSQPZO_cjs.getContract(chunkDPCZJLB3_cjs.pepuMainnet.id, "paymasterV2");
|
|
21
|
+
if (entry?.status === "deployed") return entry.address;
|
|
22
|
+
throw new chunkYQL7NISX_cjs.PepuConfigError(
|
|
23
|
+
"CONFIG_MISSING_ENV",
|
|
24
|
+
"No v2 paymaster address is configured: the registry's paymasterV2 entry is not deployed. Pass the deployed address explicitly as `paymaster` (GET /v2/contract on the policy service returns it). Never guess one."
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
function computeProjectId(appId) {
|
|
28
|
+
if (typeof appId !== "string" || appId.length === 0 || appId.length > 128) {
|
|
29
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "appId must be a non-empty string of at most 128 characters.");
|
|
30
|
+
}
|
|
31
|
+
return viem.keccak256(viem.stringToBytes(appId));
|
|
32
|
+
}
|
|
33
|
+
var getProjectId = computeProjectId;
|
|
34
|
+
function assertProjectId(projectId) {
|
|
35
|
+
if (!viem.isHex(projectId, { strict: true }) || projectId.length !== 66) {
|
|
36
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "projectId must be a 0x-prefixed 32-byte hex string.");
|
|
37
|
+
}
|
|
38
|
+
return projectId;
|
|
39
|
+
}
|
|
40
|
+
function amount(label, v, max) {
|
|
41
|
+
if (typeof v !== "bigint" || v <= 0n || v > max) {
|
|
42
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", `${label} must be a bigint greater than 0 and within range.`);
|
|
43
|
+
}
|
|
44
|
+
return v;
|
|
45
|
+
}
|
|
46
|
+
function call(to, data, fn, value = 0n) {
|
|
47
|
+
return { to, data, value, function: fn };
|
|
48
|
+
}
|
|
49
|
+
var ZERO = "0x0000000000000000000000000000000000000000";
|
|
50
|
+
async function readProject(client, projectId, options = {}) {
|
|
51
|
+
const paymaster = resolvePaymasterV2Address(options.paymaster);
|
|
52
|
+
const id = assertProjectId(projectId);
|
|
53
|
+
const abi = chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi;
|
|
54
|
+
const [project, reclaim, pendingOwner] = await Promise.all([
|
|
55
|
+
client.readContract({ address: paymaster, abi, functionName: "getProject", args: [id] }),
|
|
56
|
+
client.readContract({ address: paymaster, abi, functionName: "pendingReclaim", args: [id] }),
|
|
57
|
+
client.readContract({ address: paymaster, abi, functionName: "pendingProjectOwner", args: [id] })
|
|
58
|
+
]);
|
|
59
|
+
const [owner, paused, senderDailyLimit, balance, dailyLimit, spentToday, spentDay] = project;
|
|
60
|
+
const [reclaimOwner, executableAt, reclaimSigner] = reclaim;
|
|
61
|
+
const claimed = owner !== ZERO;
|
|
62
|
+
const today = Math.floor((options.now ?? Date.now)() / 1e3 / 86400);
|
|
63
|
+
let targetsAllowed;
|
|
64
|
+
if (options.checkTargets && options.checkTargets.length > 0) {
|
|
65
|
+
const entries = await Promise.all(
|
|
66
|
+
options.checkTargets.map(async (t) => {
|
|
67
|
+
const allowed = await client.readContract({
|
|
68
|
+
address: paymaster,
|
|
69
|
+
abi,
|
|
70
|
+
functionName: "isTargetAllowed",
|
|
71
|
+
args: [id, t]
|
|
72
|
+
});
|
|
73
|
+
return [viem.getAddress(t), allowed];
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
targetsAllowed = Object.fromEntries(entries);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
projectId: id,
|
|
80
|
+
paymaster,
|
|
81
|
+
owner: claimed ? viem.getAddress(owner) : null,
|
|
82
|
+
claimed,
|
|
83
|
+
paused,
|
|
84
|
+
balance,
|
|
85
|
+
dailyLimit,
|
|
86
|
+
senderDailyLimit,
|
|
87
|
+
spentToday: spentDay === today ? spentToday : 0n,
|
|
88
|
+
spentDay,
|
|
89
|
+
limitsConfigured: claimed && dailyLimit > 0n && senderDailyLimit > 0n,
|
|
90
|
+
pendingReclaim: reclaimOwner !== ZERO ? { newOwner: viem.getAddress(reclaimOwner), executableAt, signer: viem.getAddress(reclaimSigner) } : null,
|
|
91
|
+
pendingOwner: pendingOwner !== ZERO ? viem.getAddress(pendingOwner) : null,
|
|
92
|
+
...targetsAllowed ? { targetsAllowed } : {}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function encodeDeposit(projectId, amountWei, options = {}) {
|
|
96
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
97
|
+
const data = viem.encodeFunctionData({
|
|
98
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
99
|
+
functionName: "depositFor",
|
|
100
|
+
args: [assertProjectId(projectId)]
|
|
101
|
+
});
|
|
102
|
+
return call(to, data, "depositFor(bytes32)", amount("amountWei", amountWei, U128_MAX));
|
|
103
|
+
}
|
|
104
|
+
function claimArgs(a) {
|
|
105
|
+
if (!a.appId || a.appId.length > 128) {
|
|
106
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "attestation.appId must be 1 to 128 characters.");
|
|
107
|
+
}
|
|
108
|
+
if (!viem.isAddress(a.newOwner, { strict: false })) {
|
|
109
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "attestation.newOwner is not a valid address.");
|
|
110
|
+
}
|
|
111
|
+
if (!viem.isHex(a.signature)) {
|
|
112
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "attestation.signature must be 0x-prefixed hex.");
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
appId: a.appId,
|
|
116
|
+
newOwner: viem.getAddress(a.newOwner),
|
|
117
|
+
nonce: BigInt(a.nonce),
|
|
118
|
+
deadline: BigInt(a.deadline),
|
|
119
|
+
signature: a.signature
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function encodeClaimProject(attestation, options = {}) {
|
|
123
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
124
|
+
const data = viem.encodeFunctionData({
|
|
125
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
126
|
+
functionName: "claimProject",
|
|
127
|
+
args: [claimArgs(attestation)]
|
|
128
|
+
});
|
|
129
|
+
return call(to, data, "claimProject((string,address,uint256,uint256,bytes))");
|
|
130
|
+
}
|
|
131
|
+
function encodeReclaimProject(attestation, options = {}) {
|
|
132
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
133
|
+
const data = viem.encodeFunctionData({
|
|
134
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
135
|
+
functionName: "reclaimProject",
|
|
136
|
+
args: [claimArgs(attestation)]
|
|
137
|
+
});
|
|
138
|
+
return call(to, data, "reclaimProject((string,address,uint256,uint256,bytes))");
|
|
139
|
+
}
|
|
140
|
+
function encodeClaimFromVerification(verified, options = {}) {
|
|
141
|
+
return verified.action === "reclaimProject" ? encodeReclaimProject(verified.attestation, options) : encodeClaimProject(verified.attestation, options);
|
|
142
|
+
}
|
|
143
|
+
function encodeExecuteReclaim(projectId, options = {}) {
|
|
144
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
145
|
+
const data = viem.encodeFunctionData({
|
|
146
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
147
|
+
functionName: "executeReclaim",
|
|
148
|
+
args: [assertProjectId(projectId)]
|
|
149
|
+
});
|
|
150
|
+
return call(to, data, "executeReclaim(bytes32)");
|
|
151
|
+
}
|
|
152
|
+
function encodeCancelReclaim(projectId, options = {}) {
|
|
153
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
154
|
+
const data = viem.encodeFunctionData({
|
|
155
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
156
|
+
functionName: "cancelReclaim",
|
|
157
|
+
args: [assertProjectId(projectId)]
|
|
158
|
+
});
|
|
159
|
+
return call(to, data, "cancelReclaim(bytes32)");
|
|
160
|
+
}
|
|
161
|
+
function encodeSetTargets(projectId, targets, allowed, options = {}) {
|
|
162
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
163
|
+
if (targets.length === 0 || targets.length > MAX_TARGETS_PER_CALL) {
|
|
164
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", `targets must contain 1 to ${MAX_TARGETS_PER_CALL} addresses per call.`);
|
|
165
|
+
}
|
|
166
|
+
for (const t of targets) {
|
|
167
|
+
if (!viem.isAddress(t, { strict: false })) {
|
|
168
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "targets contains an invalid address.");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const data = viem.encodeFunctionData({
|
|
172
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
173
|
+
functionName: "setTargets",
|
|
174
|
+
args: [assertProjectId(projectId), targets.map((t) => viem.getAddress(t)), allowed]
|
|
175
|
+
});
|
|
176
|
+
return call(to, data, "setTargets(bytes32,address[],bool)");
|
|
177
|
+
}
|
|
178
|
+
function encodeSetDailyLimit(projectId, limitWei, options = {}) {
|
|
179
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
180
|
+
const data = viem.encodeFunctionData({
|
|
181
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
182
|
+
functionName: "setDailyLimit",
|
|
183
|
+
args: [assertProjectId(projectId), amount("limitWei", limitWei, U112_MAX)]
|
|
184
|
+
});
|
|
185
|
+
return call(to, data, "setDailyLimit(bytes32,uint112)");
|
|
186
|
+
}
|
|
187
|
+
function encodeSetSenderDailyLimit(projectId, limitWei, options = {}) {
|
|
188
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
189
|
+
const data = viem.encodeFunctionData({
|
|
190
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
191
|
+
functionName: "setSenderDailyLimit",
|
|
192
|
+
args: [assertProjectId(projectId), amount("limitWei", limitWei, U112_MAX)]
|
|
193
|
+
});
|
|
194
|
+
return call(to, data, "setSenderDailyLimit(bytes32,uint112)");
|
|
195
|
+
}
|
|
196
|
+
function encodeSetPaused(projectId, paused, options = {}) {
|
|
197
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
198
|
+
const data = viem.encodeFunctionData({
|
|
199
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
200
|
+
functionName: "setPaused",
|
|
201
|
+
args: [assertProjectId(projectId), paused]
|
|
202
|
+
});
|
|
203
|
+
return call(to, data, "setPaused(bytes32,bool)");
|
|
204
|
+
}
|
|
205
|
+
function encodeProposeProjectOwner(projectId, newOwner, options = {}) {
|
|
206
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
207
|
+
if (!viem.isAddress(newOwner, { strict: false }) || newOwner === ZERO) {
|
|
208
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "newOwner must be a non-zero valid address.");
|
|
209
|
+
}
|
|
210
|
+
const data = viem.encodeFunctionData({
|
|
211
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
212
|
+
functionName: "proposeProjectOwner",
|
|
213
|
+
args: [assertProjectId(projectId), viem.getAddress(newOwner)]
|
|
214
|
+
});
|
|
215
|
+
return call(to, data, "proposeProjectOwner(bytes32,address)");
|
|
216
|
+
}
|
|
217
|
+
function encodeAcceptProjectOwnership(projectId, options = {}) {
|
|
218
|
+
const to = resolvePaymasterV2Address(options.paymaster);
|
|
219
|
+
const data = viem.encodeFunctionData({
|
|
220
|
+
abi: chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi,
|
|
221
|
+
functionName: "acceptProjectOwnership",
|
|
222
|
+
args: [assertProjectId(projectId)]
|
|
223
|
+
});
|
|
224
|
+
return call(to, data, "acceptProjectOwnership(bytes32)");
|
|
225
|
+
}
|
|
226
|
+
function configureProject(params) {
|
|
227
|
+
if (params.appId === void 0 === (params.projectId === void 0)) {
|
|
228
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "configureProject needs exactly one of appId or projectId.");
|
|
229
|
+
}
|
|
230
|
+
const projectId = params.projectId !== void 0 ? assertProjectId(params.projectId) : computeProjectId(params.appId);
|
|
231
|
+
const o = { paymaster: params.paymaster };
|
|
232
|
+
return {
|
|
233
|
+
projectId,
|
|
234
|
+
calls: [
|
|
235
|
+
encodeSetTargets(projectId, params.targets, true, o),
|
|
236
|
+
encodeSetDailyLimit(projectId, params.dailyLimitWei, o),
|
|
237
|
+
encodeSetSenderDailyLimit(projectId, params.senderDailyLimitWei, o)
|
|
238
|
+
]
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
async function sendPaymasterCalls(walletClient, calls, options = {}) {
|
|
242
|
+
const account = walletClient.account;
|
|
243
|
+
if (!account) {
|
|
244
|
+
throw new chunkYQL7NISX_cjs.PepuConfigError("CONFIG_MISSING_ENV", "The wallet client has no account; create it with an account.");
|
|
245
|
+
}
|
|
246
|
+
const chain = walletClient.chain ?? chunkDPCZJLB3_cjs.pepuMainnet;
|
|
247
|
+
const hashes = [];
|
|
248
|
+
for (const c of calls) {
|
|
249
|
+
const hash = await walletClient.sendTransaction({ account, chain, to: c.to, data: c.data, value: c.value });
|
|
250
|
+
hashes.push(hash);
|
|
251
|
+
if (options.publicClient) {
|
|
252
|
+
const receipt = await options.publicClient.waitForTransactionReceipt({ hash });
|
|
253
|
+
if (receipt.status !== "success") {
|
|
254
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("TX_REVERTED", `Paymaster call ${c.function} reverted (transaction ${hash}).`, {
|
|
255
|
+
details: { hash, function: c.function }
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return hashes;
|
|
261
|
+
}
|
|
262
|
+
async function depositFor(params) {
|
|
263
|
+
if (params.appId === void 0 === (params.projectId === void 0)) {
|
|
264
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError("PAYMASTER_DENIED", "depositFor needs exactly one of appId or projectId.");
|
|
265
|
+
}
|
|
266
|
+
const projectId = params.projectId !== void 0 ? assertProjectId(params.projectId) : computeProjectId(params.appId);
|
|
267
|
+
const tx = encodeDeposit(projectId, params.amountWei, { paymaster: params.paymaster });
|
|
268
|
+
if (params.requireClaimed ?? true) {
|
|
269
|
+
if (!params.publicClient) {
|
|
270
|
+
throw new chunkYQL7NISX_cjs.PepuConfigError(
|
|
271
|
+
"CONFIG_MISSING_ENV",
|
|
272
|
+
"depositFor checks the project is claimed by default and needs a publicClient. Pass publicClient, or requireClaimed: false to fund an unclaimed project."
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
const state = await readProject(params.publicClient, projectId, { paymaster: params.paymaster });
|
|
276
|
+
if (!state.claimed) {
|
|
277
|
+
throw new chunkYQL7NISX_cjs.PepuPaymasterError(
|
|
278
|
+
"PAYMASTER_PROJECT_NOT_CLAIMED",
|
|
279
|
+
"Refusing to deposit: the project is not claimed. Check the app id spelling (it is case-sensitive), or pass requireClaimed: false. Deposits cannot be withdrawn.",
|
|
280
|
+
{ details: { projectId } }
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const [hash] = await sendPaymasterCalls(params.walletClient, [tx]);
|
|
285
|
+
return hash;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
Object.defineProperty(exports, "PAYMASTER_DENIAL_REASONS", {
|
|
289
|
+
enumerable: true,
|
|
290
|
+
get: function () { return chunkA5LP2UCS_cjs.PAYMASTER_DENIAL_REASONS; }
|
|
291
|
+
});
|
|
292
|
+
Object.defineProperty(exports, "PAYMASTER_REASON_CODES", {
|
|
293
|
+
enumerable: true,
|
|
294
|
+
get: function () { return chunkA5LP2UCS_cjs.PAYMASTER_REASON_CODES; }
|
|
295
|
+
});
|
|
296
|
+
Object.defineProperty(exports, "assertApproved", {
|
|
297
|
+
enumerable: true,
|
|
298
|
+
get: function () { return chunkA5LP2UCS_cjs.assertApproved; }
|
|
299
|
+
});
|
|
300
|
+
Object.defineProperty(exports, "buildErc7677Url", {
|
|
301
|
+
enumerable: true,
|
|
302
|
+
get: function () { return chunkA5LP2UCS_cjs.buildErc7677Url; }
|
|
303
|
+
});
|
|
304
|
+
Object.defineProperty(exports, "createPaymasterApi", {
|
|
305
|
+
enumerable: true,
|
|
306
|
+
get: function () { return chunkA5LP2UCS_cjs.createPaymasterApi; }
|
|
307
|
+
});
|
|
308
|
+
Object.defineProperty(exports, "credentialKind", {
|
|
309
|
+
enumerable: true,
|
|
310
|
+
get: function () { return chunkA5LP2UCS_cjs.credentialKind; }
|
|
311
|
+
});
|
|
312
|
+
Object.defineProperty(exports, "decodePaymasterRevert", {
|
|
313
|
+
enumerable: true,
|
|
314
|
+
get: function () { return chunkA5LP2UCS_cjs.decodePaymasterRevert; }
|
|
315
|
+
});
|
|
316
|
+
Object.defineProperty(exports, "hostedErc7677Url", {
|
|
317
|
+
enumerable: true,
|
|
318
|
+
get: function () { return chunkA5LP2UCS_cjs.hostedErc7677Url; }
|
|
319
|
+
});
|
|
320
|
+
Object.defineProperty(exports, "mapPaymasterReason", {
|
|
321
|
+
enumerable: true,
|
|
322
|
+
get: function () { return chunkA5LP2UCS_cjs.mapPaymasterReason; }
|
|
323
|
+
});
|
|
324
|
+
Object.defineProperty(exports, "paymasterReasonToError", {
|
|
325
|
+
enumerable: true,
|
|
326
|
+
get: function () { return chunkA5LP2UCS_cjs.paymasterReasonToError; }
|
|
327
|
+
});
|
|
328
|
+
Object.defineProperty(exports, "pepuSponsoredPaymasterV2Abi", {
|
|
329
|
+
enumerable: true,
|
|
330
|
+
get: function () { return chunkA5LP2UCS_cjs.pepuSponsoredPaymasterV2Abi; }
|
|
331
|
+
});
|
|
332
|
+
Object.defineProperty(exports, "serializeAttestation", {
|
|
333
|
+
enumerable: true,
|
|
334
|
+
get: function () { return chunkA5LP2UCS_cjs.serializeAttestation; }
|
|
335
|
+
});
|
|
336
|
+
exports.computeProjectId = computeProjectId;
|
|
337
|
+
exports.configureProject = configureProject;
|
|
338
|
+
exports.depositFor = depositFor;
|
|
339
|
+
exports.encodeAcceptProjectOwnership = encodeAcceptProjectOwnership;
|
|
340
|
+
exports.encodeCancelReclaim = encodeCancelReclaim;
|
|
341
|
+
exports.encodeClaimFromVerification = encodeClaimFromVerification;
|
|
342
|
+
exports.encodeClaimProject = encodeClaimProject;
|
|
343
|
+
exports.encodeDeposit = encodeDeposit;
|
|
344
|
+
exports.encodeExecuteReclaim = encodeExecuteReclaim;
|
|
345
|
+
exports.encodeProposeProjectOwner = encodeProposeProjectOwner;
|
|
346
|
+
exports.encodeReclaimProject = encodeReclaimProject;
|
|
347
|
+
exports.encodeSetDailyLimit = encodeSetDailyLimit;
|
|
348
|
+
exports.encodeSetPaused = encodeSetPaused;
|
|
349
|
+
exports.encodeSetSenderDailyLimit = encodeSetSenderDailyLimit;
|
|
350
|
+
exports.encodeSetTargets = encodeSetTargets;
|
|
351
|
+
exports.getProjectId = getProjectId;
|
|
352
|
+
exports.readProject = readProject;
|
|
353
|
+
exports.resolvePaymasterV2Address = resolvePaymasterV2Address;
|
|
354
|
+
exports.sendPaymasterCalls = sendPaymasterCalls;
|
|
355
|
+
//# sourceMappingURL=paymaster.cjs.map
|
|
356
|
+
//# sourceMappingURL=paymaster.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/paymaster/onchain.ts"],"names":["isAddress","PepuConfigError","getAddress","getContract","pepuMainnet","PepuPaymasterError","keccak256","stringToBytes","isHex","pepuSponsoredPaymasterV2Abi","encodeFunctionData"],"mappings":"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","file":"paymaster.cjs","sourcesContent":["import { encodeFunctionData, getAddress, isAddress, isHex, keccak256, stringToBytes } from \"viem\";\nimport type { Account, Address, Chain, Hash, Hex, PublicClient, WalletClient } from \"viem\";\n\nimport { pepuMainnet } from \"../chains.js\";\nimport { getContract } from \"../contracts.js\";\nimport { PepuConfigError, PepuPaymasterError } from \"../errors.js\";\nimport { pepuSponsoredPaymasterV2Abi } from \"./abi.js\";\n\n/**\n * v2 (tiered, deposit-only) paymaster on-chain helpers.\n *\n * Facts these helpers encode (services/paymaster/SPONSORSHIP-SPEC.md):\n * - `projectId = keccak256(bytes(appId))`, case-sensitive.\n * - Deposits are one-way. Nobody can withdraw, owner or not. Anyone can `depositFor` any project.\n * - `claimProject` sets ONLY the owner. Nothing is sponsorable until the owner calls `setTargets`,\n * `setDailyLimit` and `setSenderDailyLimit` (see {@link configureProject}). A project with no per-wallet\n * limit (`setSenderDailyLimit`) is rejected on-chain.\n * - The first claim of a project that ALREADY HOLDS deposited funds is pending for the admin change delay (>= 48h):\n * finish it with {@link encodeExecuteReclaim}. An empty project is claimed immediately.\n * - A re-claim of an owned project is timelocked (>= 48h) and the owner can cancel it once per new owner.\n * - Ownership transfer is two-step (propose, then accept).\n *\n * The contract address comes from the registry (`paymasterV2`, the deployed canary: internally reviewed 3x,\n * external audit pending). Every helper takes an explicit `paymaster` address and throws CONFIG_MISSING_ENV when there is none.\n * No transaction is ever sent without the caller's wallet client.\n */\n\nconst U112_MAX = (1n << 112n) - 1n;\nconst U128_MAX = (1n << 128n) - 1n;\nconst MAX_TARGETS_PER_CALL = 50;\n\n/** A transaction a wallet (or smart account batch) can send. */\nexport interface PaymasterCall {\n to: Address;\n data: Hex;\n value: bigint;\n /** Solidity signature, for logs and UIs. */\n function: string;\n}\n\n/** The EIP-712 `ProjectClaim` attestation returned by `POST /v2/projects/verify`. */\nexport interface ProjectClaimAttestation {\n appId: string;\n newOwner: Address;\n nonce: string | bigint;\n deadline: string | bigint;\n signature: Hex;\n}\n\nexport interface PaymasterAddressOption {\n /** v2 paymaster address. Defaults to the registry's `paymasterV2` entry once it is deployed. */\n paymaster?: Address | undefined;\n}\n\n/**\n * Resolve the v2 paymaster address: explicit option first, then the registry. Throws\n * `CONFIG_MISSING_ENV` (never guesses an address) when neither is available.\n *\n * @example\n * ```ts\n * const paymaster = resolvePaymasterV2Address(\"0x1111111111111111111111111111111111111111\");\n * ```\n */\nexport function resolvePaymasterV2Address(explicit?: Address): Address {\n if (explicit !== undefined) {\n if (!isAddress(explicit, { strict: false })) {\n throw new PepuConfigError(\"CONFIG_MISSING_ENV\", \"The v2 paymaster address passed in is not a valid address.\");\n }\n return getAddress(explicit);\n }\n const entry = getContract(pepuMainnet.id, \"paymasterV2\");\n if (entry?.status === \"deployed\") return entry.address;\n throw new PepuConfigError(\n \"CONFIG_MISSING_ENV\",\n \"No v2 paymaster address is configured: the registry's paymasterV2 entry is not deployed. Pass the deployed address explicitly as `paymaster` (GET /v2/contract on the policy service returns it). Never guess one.\",\n );\n}\n\n/**\n * `projectId = keccak256(bytes(appId))`. The app id is used exactly as given, so it is case-sensitive:\n * Privy app ids are lower-case cuids, and a different case is a different project.\n *\n * @example\n * ```ts\n * const projectId = computeProjectId(\"clx0example0app0id\");\n * ```\n */\nexport function computeProjectId(appId: string): Hex {\n if (typeof appId !== \"string\" || appId.length === 0 || appId.length > 128) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"appId must be a non-empty string of at most 128 characters.\");\n }\n return keccak256(stringToBytes(appId));\n}\n\n/** Plan name for {@link computeProjectId}. */\nexport const getProjectId = computeProjectId;\n\nfunction assertProjectId(projectId: Hex): Hex {\n if (!isHex(projectId, { strict: true }) || projectId.length !== 66) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"projectId must be a 0x-prefixed 32-byte hex string.\");\n }\n return projectId;\n}\n\nfunction amount(label: string, v: bigint, max: bigint): bigint {\n if (typeof v !== \"bigint\" || v <= 0n || v > max) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", `${label} must be a bigint greater than 0 and within range.`);\n }\n return v;\n}\n\nfunction call(to: Address, data: Hex, fn: string, value = 0n): PaymasterCall {\n return { to, data, value, function: fn };\n}\n\n/** State of a project, read from the paymaster contract. */\nexport interface ProjectState {\n projectId: Hex;\n paymaster: Address;\n /** `null` when unclaimed. */\n owner: Address | null;\n claimed: boolean;\n paused: boolean;\n /** Deposited, unspent wei. Deposit-only: this can only be spent as gas, never withdrawn. */\n balance: bigint;\n dailyLimit: bigint;\n senderDailyLimit: bigint;\n /** Spent in the current UTC day (0 when the stored day is stale). */\n spentToday: bigint;\n /** Day index (unix seconds / 86400) the stored `spentToday` belongs to. */\n spentDay: number;\n /** True when claimed and both limits are set. Targets are checked via `targetsAllowed`. */\n limitsConfigured: boolean;\n /**\n * Pending timelocked claim, or `null`: a re-claim of an owned project, or (when `claimed` is false) the first\n * claim of a project that already holds funds. Finish it with {@link encodeExecuteReclaim} after `executableAt`.\n */\n pendingReclaim: { newOwner: Address; executableAt: number; signer: Address } | null;\n /** Address proposed in a two-step ownership transfer, or `null`. */\n pendingOwner: Address | null;\n /** Present when `checkTargets` was passed: allowed flag per address (checksummed keys). */\n targetsAllowed?: Record<Address, boolean>;\n}\n\nconst ZERO = \"0x0000000000000000000000000000000000000000\";\n\nexport interface ReadProjectOptions extends PaymasterAddressOption {\n /** Also check these destinations against the on-chain allowlist (one `isTargetAllowed` read each). */\n checkTargets?: readonly Address[];\n /** Clock override for the day rollover (tests). Milliseconds. */\n now?: () => number;\n}\n\n/**\n * Read a project's on-chain state: owner, pause flag, balance, limits, pending re-claim and pending owner.\n *\n * @example\n * ```ts\n * const p = await readProject(publicClient, computeProjectId(appId), { paymaster });\n * if (!p.claimed) console.log(\"claim it first\");\n * ```\n */\nexport async function readProject(\n client: Pick<PublicClient, \"readContract\">,\n projectId: Hex,\n options: ReadProjectOptions = {},\n): Promise<ProjectState> {\n const paymaster = resolvePaymasterV2Address(options.paymaster);\n const id = assertProjectId(projectId);\n const abi = pepuSponsoredPaymasterV2Abi;\n const [project, reclaim, pendingOwner] = await Promise.all([\n client.readContract({ address: paymaster, abi, functionName: \"getProject\", args: [id] }),\n client.readContract({ address: paymaster, abi, functionName: \"pendingReclaim\", args: [id] }),\n client.readContract({ address: paymaster, abi, functionName: \"pendingProjectOwner\", args: [id] }),\n ]);\n const [owner, paused, senderDailyLimit, balance, dailyLimit, spentToday, spentDay] = project;\n const [reclaimOwner, executableAt, reclaimSigner] = reclaim;\n const claimed = owner !== ZERO;\n const today = Math.floor((options.now ?? Date.now)() / 1000 / 86_400);\n\n let targetsAllowed: Record<Address, boolean> | undefined;\n if (options.checkTargets && options.checkTargets.length > 0) {\n const entries = await Promise.all(\n options.checkTargets.map(async (t) => {\n const allowed = await client.readContract({\n address: paymaster,\n abi,\n functionName: \"isTargetAllowed\",\n args: [id, t],\n });\n return [getAddress(t), allowed] as const;\n }),\n );\n targetsAllowed = Object.fromEntries(entries) as Record<Address, boolean>;\n }\n\n return {\n projectId: id,\n paymaster,\n owner: claimed ? getAddress(owner) : null,\n claimed,\n paused,\n balance,\n dailyLimit,\n senderDailyLimit,\n spentToday: spentDay === today ? spentToday : 0n,\n spentDay,\n limitsConfigured: claimed && dailyLimit > 0n && senderDailyLimit > 0n,\n pendingReclaim:\n reclaimOwner !== ZERO ? { newOwner: getAddress(reclaimOwner), executableAt, signer: getAddress(reclaimSigner) } : null,\n pendingOwner: pendingOwner !== ZERO ? getAddress(pendingOwner) : null,\n ...(targetsAllowed ? { targetsAllowed } : {}),\n };\n}\n\n/**\n * Encode `depositFor(projectId)` with native PEPU as `value`. ONE-WAY: nothing can ever withdraw the deposit,\n * and the id is `keccak256` of a case-sensitive app id, so a typo deposits into a project nobody can claim.\n * Prefer {@link depositFor}, which checks the project is claimed first.\n *\n * @example\n * ```ts\n * const tx = encodeDeposit(computeProjectId(appId), 10n ** 18n, { paymaster });\n * ```\n */\nexport function encodeDeposit(projectId: Hex, amountWei: bigint, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"depositFor\",\n args: [assertProjectId(projectId)],\n });\n return call(to, data, \"depositFor(bytes32)\", amount(\"amountWei\", amountWei, U128_MAX));\n}\n\nfunction claimArgs(a: ProjectClaimAttestation) {\n if (!a.appId || a.appId.length > 128) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"attestation.appId must be 1 to 128 characters.\");\n }\n if (!isAddress(a.newOwner, { strict: false })) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"attestation.newOwner is not a valid address.\");\n }\n if (!isHex(a.signature)) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"attestation.signature must be 0x-prefixed hex.\");\n }\n return {\n appId: a.appId,\n newOwner: getAddress(a.newOwner),\n nonce: BigInt(a.nonce),\n deadline: BigInt(a.deadline),\n signature: a.signature,\n };\n}\n\n/**\n * Encode `claimProject(Claim)`. The attestation fixes the owner; anyone may submit the transaction. The claim\n * sets ONLY the owner: follow with {@link configureProject}'s three calls, because nothing is sponsorable\n * until `setTargets`, `setDailyLimit` and `setSenderDailyLimit` have run. If the project already holds deposited\n * funds the claim is PENDING for the on-chain admin change delay (>= 48h): the contract owner or manager can cancel\n * it, and anyone finishes it with {@link encodeExecuteReclaim}.\n *\n * @example\n * ```ts\n * const tx = encodeClaimProject(attestation, { paymaster });\n * await walletClient.sendTransaction({ to: tx.to, data: tx.data });\n * ```\n */\nexport function encodeClaimProject(attestation: ProjectClaimAttestation, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"claimProject\",\n args: [claimArgs(attestation)],\n });\n return call(to, data, \"claimProject((string,address,uint256,uint256,bytes))\");\n}\n\n/**\n * Encode `reclaimProject(Claim)`: a timelocked (>= 48h) re-claim of an already-owned project. The current owner\n * can cancel it ({@link encodeCancelReclaim}); anyone can finish it after the delay ({@link encodeExecuteReclaim}).\n *\n * @example\n * ```ts\n * const tx = encodeReclaimProject(attestation, { paymaster });\n * ```\n */\nexport function encodeReclaimProject(attestation: ProjectClaimAttestation, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"reclaimProject\",\n args: [claimArgs(attestation)],\n });\n return call(to, data, \"reclaimProject((string,address,uint256,uint256,bytes))\");\n}\n\n/**\n * Pick `claimProject` or `reclaimProject` from a `/v2/projects/verify` result (its `action` field) and encode it.\n *\n * @example\n * ```ts\n * const tx = encodeClaimFromVerification(verified, { paymaster });\n * ```\n */\nexport function encodeClaimFromVerification(\n verified: { action: \"claimProject\" | \"reclaimProject\"; attestation: ProjectClaimAttestation },\n options: PaymasterAddressOption = {},\n): PaymasterCall {\n return verified.action === \"reclaimProject\"\n ? encodeReclaimProject(verified.attestation, options)\n : encodeClaimProject(verified.attestation, options);\n}\n\n/**\n * Encode `executeReclaim(projectId)`: completes a pending claim or re-claim once its delay has passed (and before it\n * expires, 30 days later).\n *\n * @example\n * ```ts\n * const tx = encodeExecuteReclaim(projectId, { paymaster });\n * ```\n */\nexport function encodeExecuteReclaim(projectId: Hex, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"executeReclaim\",\n args: [assertProjectId(projectId)],\n });\n return call(to, data, \"executeReclaim(bytes32)\");\n}\n\n/**\n * Encode `cancelReclaim(projectId)`: the current owner cancels a pending re-claim, ONCE per new owner (a second\n * attested re-claim by the same new owner cannot be cancelled). For a pending FIRST claim of an unowned project the\n * contract owner or manager cancels instead.\n *\n * @example\n * ```ts\n * const tx = encodeCancelReclaim(projectId, { paymaster });\n * ```\n */\nexport function encodeCancelReclaim(projectId: Hex, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"cancelReclaim\",\n args: [assertProjectId(projectId)],\n });\n return call(to, data, \"cancelReclaim(bytes32)\");\n}\n\n/**\n * Encode `setTargets(projectId, targets, allowed)`: add or remove destination contracts the project sponsors\n * (at most 50 per call). Owner only.\n *\n * @example\n * ```ts\n * const tx = encodeSetTargets(projectId, [counter], true, { paymaster });\n * ```\n */\nexport function encodeSetTargets(\n projectId: Hex,\n targets: readonly Address[],\n allowed: boolean,\n options: PaymasterAddressOption = {},\n): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n if (targets.length === 0 || targets.length > MAX_TARGETS_PER_CALL) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", `targets must contain 1 to ${MAX_TARGETS_PER_CALL} addresses per call.`);\n }\n for (const t of targets) {\n if (!isAddress(t, { strict: false })) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"targets contains an invalid address.\");\n }\n }\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"setTargets\",\n args: [assertProjectId(projectId), targets.map((t) => getAddress(t)), allowed],\n });\n return call(to, data, \"setTargets(bytes32,address[],bool)\");\n}\n\n/**\n * Encode `setDailyLimit(projectId, limitWei)`: the project's total daily gas budget. Owner only. Must be above\n * zero; a contract-side zero limit means nothing can be spent, and tightening is instant.\n *\n * @example\n * ```ts\n * const tx = encodeSetDailyLimit(projectId, 5n * 10n ** 18n, { paymaster });\n * ```\n */\nexport function encodeSetDailyLimit(projectId: Hex, limitWei: bigint, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"setDailyLimit\",\n args: [assertProjectId(projectId), amount(\"limitWei\", limitWei, U112_MAX)],\n });\n return call(to, data, \"setDailyLimit(bytes32,uint112)\");\n}\n\n/**\n * Encode `setSenderDailyLimit(projectId, limitWei)`: the per-wallet daily gas limit. Owner only.\n *\n * @example\n * ```ts\n * const tx = encodeSetSenderDailyLimit(projectId, 10n ** 17n, { paymaster });\n * ```\n */\nexport function encodeSetSenderDailyLimit(projectId: Hex, limitWei: bigint, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"setSenderDailyLimit\",\n args: [assertProjectId(projectId), amount(\"limitWei\", limitWei, U112_MAX)],\n });\n return call(to, data, \"setSenderDailyLimit(bytes32,uint112)\");\n}\n\n/**\n * Encode `setPaused(projectId, paused)`. Pausing takes effect immediately; it is the project's emergency stop.\n *\n * @example\n * ```ts\n * const stop = encodeSetPaused(projectId, true, { paymaster });\n * ```\n */\nexport function encodeSetPaused(projectId: Hex, paused: boolean, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"setPaused\",\n args: [assertProjectId(projectId), paused],\n });\n return call(to, data, \"setPaused(bytes32,bool)\");\n}\n\n/**\n * Encode `proposeProjectOwner(projectId, newOwner)`: step one of the two-step ownership transfer. The new\n * owner must then call {@link encodeAcceptProjectOwnership}.\n *\n * @example\n * ```ts\n * const tx = encodeProposeProjectOwner(projectId, newOwner, { paymaster });\n * ```\n */\nexport function encodeProposeProjectOwner(projectId: Hex, newOwner: Address, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n if (!isAddress(newOwner, { strict: false }) || newOwner === ZERO) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"newOwner must be a non-zero valid address.\");\n }\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"proposeProjectOwner\",\n args: [assertProjectId(projectId), getAddress(newOwner)],\n });\n return call(to, data, \"proposeProjectOwner(bytes32,address)\");\n}\n\n/**\n * Encode `acceptProjectOwnership(projectId)`: step two of the ownership transfer, sent by the proposed owner.\n *\n * @example\n * ```ts\n * const tx = encodeAcceptProjectOwnership(projectId, { paymaster });\n * ```\n */\nexport function encodeAcceptProjectOwnership(projectId: Hex, options: PaymasterAddressOption = {}): PaymasterCall {\n const to = resolvePaymasterV2Address(options.paymaster);\n const data = encodeFunctionData({\n abi: pepuSponsoredPaymasterV2Abi,\n functionName: \"acceptProjectOwnership\",\n args: [assertProjectId(projectId)],\n });\n return call(to, data, \"acceptProjectOwnership(bytes32)\");\n}\n\nexport interface ConfigureProjectParams extends PaymasterAddressOption {\n /** Give `appId` or `projectId`. */\n appId?: string;\n projectId?: Hex;\n /** Destination contracts to sponsor (the on-chain allowlist). 1 to 50. */\n targets: readonly Address[];\n /** Total daily budget, wei. */\n dailyLimitWei: bigint;\n /** Per-wallet daily budget, wei. */\n senderDailyLimitWei: bigint;\n}\n\n/**\n * The three post-claim configuration calls, in order: `setTargets(allowed = true)`, `setDailyLimit`,\n * `setSenderDailyLimit`. A project spends nothing until all three have run. All three are owner-only calls to\n * the same contract, so a smart account or batched wallet can send them in one transaction; an EOA sends them\n * one after another with {@link sendPaymasterCalls}.\n *\n * @example\n * ```ts\n * const { calls } = configureProject({\n * appId, paymaster,\n * targets: [counter],\n * dailyLimitWei: 5n * 10n ** 18n,\n * senderDailyLimitWei: 10n ** 17n,\n * });\n * await smartAccountClient.sendUserOperation({ calls: calls.map(({ to, data, value }) => ({ to, data, value })) });\n * ```\n */\nexport function configureProject(params: ConfigureProjectParams): { projectId: Hex; calls: PaymasterCall[] } {\n if ((params.appId === undefined) === (params.projectId === undefined)) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"configureProject needs exactly one of appId or projectId.\");\n }\n const projectId = params.projectId !== undefined ? assertProjectId(params.projectId) : computeProjectId(params.appId as string);\n const o = { paymaster: params.paymaster };\n return {\n projectId,\n calls: [\n encodeSetTargets(projectId, params.targets, true, o),\n encodeSetDailyLimit(projectId, params.dailyLimitWei, o),\n encodeSetSenderDailyLimit(projectId, params.senderDailyLimitWei, o),\n ],\n };\n}\n\ntype SendingWallet = Pick<WalletClient, \"sendTransaction\"> & { account?: Account | undefined; chain?: Chain | undefined };\n\n/**\n * Send prepared calls one after another from a wallet client, returning the hashes. When `publicClient` is\n * given it waits for each receipt first (so a later call is not sent after an earlier one failed). The\n * transaction `value` is exactly the call's value; nothing else is added.\n *\n * @example\n * ```ts\n * const hashes = await sendPaymasterCalls(walletClient, calls, { publicClient });\n * ```\n */\nexport async function sendPaymasterCalls(\n walletClient: SendingWallet,\n calls: readonly PaymasterCall[],\n options: { publicClient?: Pick<PublicClient, \"waitForTransactionReceipt\"> } = {},\n): Promise<Hash[]> {\n const account = walletClient.account;\n if (!account) {\n throw new PepuConfigError(\"CONFIG_MISSING_ENV\", \"The wallet client has no account; create it with an account.\");\n }\n const chain = walletClient.chain ?? pepuMainnet;\n const hashes: Hash[] = [];\n for (const c of calls) {\n const hash = await walletClient.sendTransaction({ account, chain, to: c.to, data: c.data, value: c.value });\n hashes.push(hash);\n if (options.publicClient) {\n const receipt = await options.publicClient.waitForTransactionReceipt({ hash });\n if (receipt.status !== \"success\") {\n throw new PepuPaymasterError(\"TX_REVERTED\", `Paymaster call ${c.function} reverted (transaction ${hash}).`, {\n details: { hash, function: c.function },\n });\n }\n }\n }\n return hashes;\n}\n\nexport interface DepositForParams extends PaymasterAddressOption {\n walletClient: SendingWallet;\n /** Give `appId` or `projectId`. */\n appId?: string;\n projectId?: Hex;\n amountWei: bigint;\n /**\n * Default true: read the project first and refuse when it has no owner, which catches a mistyped (case-sensitive)\n * app id before funds go to a project nobody controls. Needs `publicClient`. Pass false to fund a project its\n * owner has not claimed yet (deposits are credited and become spendable after the claim and configuration).\n */\n requireClaimed?: boolean;\n publicClient?: Pick<PublicClient, \"readContract\">;\n}\n\n/**\n * Deposit native PEPU into a project with the caller's wallet. ONE-WAY: nobody can withdraw it afterwards, and\n * anyone may deposit into any project. By default it first confirms the project is claimed.\n *\n * @example\n * ```ts\n * const hash = await depositFor({ walletClient, publicClient, appId, amountWei: 10n ** 18n, paymaster });\n * ```\n */\nexport async function depositFor(params: DepositForParams): Promise<Hash> {\n if ((params.appId === undefined) === (params.projectId === undefined)) {\n throw new PepuPaymasterError(\"PAYMASTER_DENIED\", \"depositFor needs exactly one of appId or projectId.\");\n }\n const projectId = params.projectId !== undefined ? assertProjectId(params.projectId) : computeProjectId(params.appId as string);\n const tx = encodeDeposit(projectId, params.amountWei, { paymaster: params.paymaster });\n if (params.requireClaimed ?? true) {\n if (!params.publicClient) {\n throw new PepuConfigError(\n \"CONFIG_MISSING_ENV\",\n \"depositFor checks the project is claimed by default and needs a publicClient. Pass publicClient, or requireClaimed: false to fund an unclaimed project.\",\n );\n }\n const state = await readProject(params.publicClient, projectId, { paymaster: params.paymaster });\n if (!state.claimed) {\n throw new PepuPaymasterError(\n \"PAYMASTER_PROJECT_NOT_CLAIMED\",\n \"Refusing to deposit: the project is not claimed. Check the app id spelling (it is case-sensitive), or pass requireClaimed: false. Deposits cannot be withdrawn.\",\n { details: { projectId } },\n );\n }\n }\n const [hash] = await sendPaymasterCalls(params.walletClient, [tx]);\n return hash as Hash;\n}\n"]}
|