@chipi-stack/backend 14.3.1 → 14.6.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/dist/index.d.mts +1536 -7
- package/dist/index.d.ts +1536 -7
- package/dist/index.js +2445 -318
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2379 -333
- package/dist/index.mjs.map +1 -1
- package/dist/skuPurchases.js +406 -19
- package/dist/skuPurchases.js.map +1 -1
- package/dist/skuPurchases.mjs +406 -19
- package/dist/skuPurchases.mjs.map +1 -1
- package/dist/transactions.js +406 -19
- package/dist/transactions.js.map +1 -1
- package/dist/transactions.mjs +406 -19
- package/dist/transactions.mjs.map +1 -1
- package/dist/wallets-CYCLyyXY.d.mts +221 -0
- package/dist/wallets-DxKnh21Q.d.ts +221 -0
- package/dist/wallets.d.mts +3 -56
- package/dist/wallets.d.ts +3 -56
- package/dist/wallets.js +901 -32
- package/dist/wallets.js.map +1 -1
- package/dist/wallets.mjs +901 -32
- package/dist/wallets.mjs.map +1 -1
- package/package.json +9 -4
package/dist/skuPurchases.mjs
CHANGED
|
@@ -1,27 +1,398 @@
|
|
|
1
|
-
import { Chain, STARKNET_CONTRACTS } from '@chipi-stack/types';
|
|
2
|
-
import { formatAmount, SKU_CONTRACTS, CARRIER_IDS, SERVICE_TYPES, API_ENDPOINTS, WALLET_RPC_ENDPOINTS, WALLET_CLASS_HASHES } from '@chipi-stack/shared';
|
|
3
|
-
import { CallData, cairo, hash, RpcProvider, Account } from 'starknet';
|
|
4
1
|
import CryptoES from 'crypto-es';
|
|
2
|
+
import { hash, CallData, cairo, ec, shortString, RpcProvider, Account } from 'starknet';
|
|
3
|
+
import { formatAmount, SKU_CONTRACTS, CARRIER_IDS, SERVICE_TYPES, API_ENDPOINTS, WALLET_RPC_ENDPOINTS, WALLET_CLASS_HASHES } from '@chipi-stack/shared';
|
|
4
|
+
import { Chain, STARKNET_CONTRACTS } from '@chipi-stack/types';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
+
var __esm = (fn, res) => function __init() {
|
|
9
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
+
};
|
|
11
|
+
var __export = (target, all) => {
|
|
12
|
+
for (var name in all)
|
|
13
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
14
|
+
};
|
|
15
|
+
var decryptPrivateKey;
|
|
16
|
+
var init_encryption = __esm({
|
|
17
|
+
"src/lib/encryption.ts"() {
|
|
18
|
+
decryptPrivateKey = (encryptedPrivateKey, password) => {
|
|
19
|
+
if (!encryptedPrivateKey || !password) {
|
|
20
|
+
throw new Error("Encrypted private key and password are required");
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);
|
|
24
|
+
const decrypted = bytes.toString(CryptoES.enc.Utf8);
|
|
25
|
+
if (!decrypted) {
|
|
26
|
+
throw new Error("Decryption resulted in empty string");
|
|
27
|
+
}
|
|
28
|
+
return decrypted;
|
|
29
|
+
} catch (error) {
|
|
30
|
+
if (error instanceof Error) {
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Decryption failed: ${error}`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// src/encryption.ts
|
|
40
|
+
var init_encryption2 = __esm({
|
|
41
|
+
"src/encryption.ts"() {
|
|
42
|
+
init_encryption();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
function toBigInt(x) {
|
|
46
|
+
if (typeof x === "bigint") return x;
|
|
47
|
+
if (typeof x === "number") return BigInt(x);
|
|
48
|
+
return BigInt(x);
|
|
49
|
+
}
|
|
50
|
+
function poseidonSpan(values) {
|
|
51
|
+
const felts = values.map((v) => typeof v === "bigint" ? "0x" + v.toString(16) : v);
|
|
52
|
+
return BigInt(hash.computePoseidonHashOnElements(felts));
|
|
53
|
+
}
|
|
54
|
+
function hashCall(call) {
|
|
55
|
+
const calldataFelts = CallData.toHex(
|
|
56
|
+
Array.isArray(call.calldata) ? call.calldata : [call.calldata]
|
|
57
|
+
);
|
|
58
|
+
const calldataItems = calldataFelts.map((x) => BigInt(x));
|
|
59
|
+
const calldataHash = poseidonSpan(calldataItems);
|
|
60
|
+
return poseidonSpan([
|
|
61
|
+
CALL_TYPE_HASH_REV1,
|
|
62
|
+
toBigInt(call.contractAddress),
|
|
63
|
+
toBigInt(hash.getSelectorFromName(call.entrypoint)),
|
|
64
|
+
calldataHash
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
function hashCalls(calls) {
|
|
68
|
+
const callHashes = calls.map(hashCall);
|
|
69
|
+
return poseidonSpan(callHashes);
|
|
70
|
+
}
|
|
71
|
+
function hashStarknetDomain(chainIdFelt) {
|
|
72
|
+
return poseidonSpan([
|
|
73
|
+
STARKNET_DOMAIN_TYPE_HASH_REV1,
|
|
74
|
+
BigInt(OE_DOMAIN_NAME),
|
|
75
|
+
OE_DOMAIN_VERSION,
|
|
76
|
+
toBigInt(chainIdFelt),
|
|
77
|
+
OE_DOMAIN_REVISION
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
function hashOutsideExecutionStruct(oe) {
|
|
81
|
+
const callsArrayHash = hashCalls(oe.calls);
|
|
82
|
+
return poseidonSpan([
|
|
83
|
+
OUTSIDE_EXECUTION_TYPE_HASH_REV1,
|
|
84
|
+
toBigInt(oe.caller),
|
|
85
|
+
toBigInt(oe.nonce),
|
|
86
|
+
oe.execute_after,
|
|
87
|
+
oe.execute_before,
|
|
88
|
+
callsArrayHash
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
function computeSnip12Hash(oe, contractAddress, chainIdFelt) {
|
|
92
|
+
const domainHash = hashStarknetDomain(chainIdFelt);
|
|
93
|
+
const structHash = hashOutsideExecutionStruct(oe);
|
|
94
|
+
return poseidonSpan([
|
|
95
|
+
BigInt(STARKNET_MESSAGE_PREFIX),
|
|
96
|
+
domainHash,
|
|
97
|
+
toBigInt(contractAddress),
|
|
98
|
+
structHash
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
function snip12HashToHexAsciiBytes(h) {
|
|
102
|
+
const hex = h.toString(16).padStart(64, "0");
|
|
103
|
+
return new TextEncoder().encode(hex);
|
|
104
|
+
}
|
|
105
|
+
var OUTSIDE_EXECUTION_TYPE_HASH_REV1, CALL_TYPE_HASH_REV1, STARKNET_DOMAIN_TYPE_HASH_REV1, STARKNET_MESSAGE_PREFIX, OE_DOMAIN_NAME, OE_DOMAIN_VERSION, OE_DOMAIN_REVISION, SIG_VERSION_V2_SNIP12, SIG_VERSION_V2_THRESHOLD;
|
|
106
|
+
var init_snip12_hash = __esm({
|
|
107
|
+
"src/shhh/snip12-hash.ts"() {
|
|
108
|
+
OUTSIDE_EXECUTION_TYPE_HASH_REV1 = 0x5a4b49e17039355cd95d1f0981d75901191d1319b1f4b05a9a791d218d7e0cn;
|
|
109
|
+
CALL_TYPE_HASH_REV1 = 0x3635c7f2a7ba93844c0d064e18e487f35ab90f7c39d00f186a781fc3f0c2ca9n;
|
|
110
|
+
STARKNET_DOMAIN_TYPE_HASH_REV1 = 0x1ff2f602e42168014d405a94f75e8a93d640751d71d16311266e140d8b0a210n;
|
|
111
|
+
STARKNET_MESSAGE_PREFIX = shortString.encodeShortString("StarkNet Message");
|
|
112
|
+
OE_DOMAIN_NAME = shortString.encodeShortString("Account.execute_from_outside");
|
|
113
|
+
OE_DOMAIN_VERSION = 2n;
|
|
114
|
+
OE_DOMAIN_REVISION = 1n;
|
|
115
|
+
shortString.encodeShortString("V1_HEX_ASCII");
|
|
116
|
+
SIG_VERSION_V2_SNIP12 = shortString.encodeShortString("V2_SNIP12");
|
|
117
|
+
SIG_VERSION_V2_THRESHOLD = shortString.encodeShortString("V2_THRESHOLD");
|
|
118
|
+
BigInt(
|
|
119
|
+
"0x1d1144bb2138366ff28d8e9ab57456b1d332ac42196230c3a602003c89872"
|
|
120
|
+
);
|
|
121
|
+
BigInt(
|
|
122
|
+
"0x94c5a761f34b25a4e603c651ac0e1fc4fad9cdb5517f7fa1bb54044c7e5ef8"
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
var init_threshold = __esm({
|
|
127
|
+
"src/shhh/threshold.ts"() {
|
|
128
|
+
init_snip12_hash();
|
|
129
|
+
BigInt(SIG_VERSION_V2_SNIP12);
|
|
130
|
+
BigInt(SIG_VERSION_V2_THRESHOLD);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
function buildOutsideExecution(params) {
|
|
134
|
+
const nowSec = BigInt(Math.floor(Date.now() / 1e3));
|
|
135
|
+
const after = params.executeAfter ?? nowSec - BigInt(OE_EXECUTE_AFTER_CLOCK_SKEW_BUFFER);
|
|
136
|
+
const before = params.executeBefore ?? nowSec + BigInt(MAX_OE_VALIDITY_WINDOW_SECONDS) - BigInt(OE_EXECUTE_AFTER_CLOCK_SKEW_BUFFER);
|
|
137
|
+
if (before <= after) {
|
|
138
|
+
throw new Error(
|
|
139
|
+
`executeBefore (${before}) must be strictly greater than executeAfter (${after}).`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if (before - after > BigInt(MAX_OE_VALIDITY_WINDOW_SECONDS)) {
|
|
143
|
+
throw new Error(
|
|
144
|
+
`OE validity window ${before - after}s exceeds max ${MAX_OE_VALIDITY_WINDOW_SECONDS}s (audit M-2). Adjust executeBefore.`
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
caller: params.caller ?? ANY_CALLER_FELT,
|
|
149
|
+
nonce: params.nonce,
|
|
150
|
+
execute_after: after,
|
|
151
|
+
execute_before: before,
|
|
152
|
+
calls: params.calls
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function computeOeHash(oe, accountAddress, chainId) {
|
|
156
|
+
return computeSnip12Hash(oe, accountAddress, chainId);
|
|
157
|
+
}
|
|
158
|
+
function wrapV2Snip12Envelope(params) {
|
|
159
|
+
const tag = typeof params.kindTag === "bigint" ? params.kindTag : BigInt(shortString.encodeShortString(params.kindTag));
|
|
160
|
+
return [
|
|
161
|
+
BigInt(SIG_VERSION_V2_SNIP12),
|
|
162
|
+
params.ownerId,
|
|
163
|
+
tag,
|
|
164
|
+
...params.payload.map((v) => typeof v === "bigint" ? v : BigInt(v))
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
var ANY_CALLER_FELT, MAX_OE_VALIDITY_WINDOW_SECONDS, OE_EXECUTE_AFTER_CLOCK_SKEW_BUFFER;
|
|
168
|
+
var init_oe = __esm({
|
|
169
|
+
"src/shhh/oe.ts"() {
|
|
170
|
+
init_snip12_hash();
|
|
171
|
+
init_threshold();
|
|
172
|
+
ANY_CALLER_FELT = BigInt(shortString.encodeShortString("ANY_CALLER"));
|
|
173
|
+
MAX_OE_VALIDITY_WINDOW_SECONDS = 2 * 60 * 60;
|
|
174
|
+
OE_EXECUTE_AFTER_CLOCK_SKEW_BUFFER = 60;
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
var init_compute_wallet_address = __esm({
|
|
178
|
+
"src/shhh/compute-wallet-address.ts"() {
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
function buildStarkEnvelope(params) {
|
|
182
|
+
const pkHex = "0x" + (typeof params.privateKey === "bigint" ? params.privateKey : BigInt(params.privateKey)).toString(16).padStart(64, "0");
|
|
183
|
+
const sig = ec.starkCurve.sign("0x" + params.messageHash.toString(16), pkHex);
|
|
184
|
+
const r = BigInt("0x" + sig.r.toString(16));
|
|
185
|
+
const s = BigInt("0x" + sig.s.toString(16));
|
|
186
|
+
const ownerIndex = params.ownerIndex ?? 0n;
|
|
187
|
+
if (ownerIndex < 0n || ownerIndex >= 0x100000000n) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`buildStarkEnvelope: ownerIndex ${ownerIndex} is out of u32 range [0, 2^32). owner_id is the u32 INDEX into the wallet's owner_set (0 for primary, 1 for second, etc.); do NOT pass an owner_commitment or pubkey here.`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
return wrapV2Snip12Envelope({
|
|
193
|
+
ownerId: ownerIndex,
|
|
194
|
+
kindTag: STARK_KIND_TAG,
|
|
195
|
+
payload: [r, s]
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
var STARK_KIND_TAG;
|
|
199
|
+
var init_stark = __esm({
|
|
200
|
+
"src/shhh/signers/stark.ts"() {
|
|
201
|
+
init_compute_wallet_address();
|
|
202
|
+
init_oe();
|
|
203
|
+
STARK_KIND_TAG = "STARK";
|
|
204
|
+
BigInt(shortString.encodeShortString(STARK_KIND_TAG));
|
|
10
205
|
}
|
|
206
|
+
});
|
|
207
|
+
async function ensureGaragaInit() {
|
|
208
|
+
if (garagaInitPromise) return garagaInitPromise;
|
|
209
|
+
const attempt = (async () => {
|
|
210
|
+
const garaga = await import('garaga');
|
|
211
|
+
await garaga.init();
|
|
212
|
+
return garaga;
|
|
213
|
+
})();
|
|
214
|
+
garagaInitPromise = attempt;
|
|
11
215
|
try {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
216
|
+
return await attempt;
|
|
217
|
+
} catch (err) {
|
|
218
|
+
if (garagaInitPromise === attempt) garagaInitPromise = null;
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function bytesToLeBigInt(bytes) {
|
|
223
|
+
let x = 0n;
|
|
224
|
+
for (let i = bytes.length - 1; i >= 0; i--) x = x << 8n | BigInt(bytes[i]);
|
|
225
|
+
return x;
|
|
226
|
+
}
|
|
227
|
+
function ed25519SignedBytes(messageHash) {
|
|
228
|
+
return snip12HashToHexAsciiBytes(messageHash);
|
|
229
|
+
}
|
|
230
|
+
async function buildEd25519Envelope(params) {
|
|
231
|
+
const ownerIndex = params.ownerIndex ?? 0n;
|
|
232
|
+
if (ownerIndex < 0n || ownerIndex >= 0x100000000n) {
|
|
233
|
+
throw new Error(
|
|
234
|
+
`buildEd25519Envelope: ownerIndex ${ownerIndex} is out of u32 range [0, 2^32). owner_id is the u32 INDEX into the wallet's owner_set (0 for primary, 1 for second, etc.); do NOT pass an owner_commitment or pubkey here.`
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
if (params.privateKey.length !== 32) {
|
|
238
|
+
throw new Error(
|
|
239
|
+
`Ed25519 private key must be exactly 32 bytes; got ${params.privateKey.length}.`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
const ed = await import('@noble/ed25519');
|
|
243
|
+
const garaga = await ensureGaragaInit();
|
|
244
|
+
const publicKey = await ed.getPublicKeyAsync(params.privateKey);
|
|
245
|
+
const signedBytes = ed25519SignedBytes(params.messageHash);
|
|
246
|
+
const signature = await ed.signAsync(signedBytes, params.privateKey);
|
|
247
|
+
const R = signature.slice(0, 32);
|
|
248
|
+
const s = signature.slice(32, 64);
|
|
249
|
+
const payload = garaga.eddsaCalldataBuilder(
|
|
250
|
+
bytesToLeBigInt(R),
|
|
251
|
+
bytesToLeBigInt(s),
|
|
252
|
+
bytesToLeBigInt(publicKey),
|
|
253
|
+
signedBytes,
|
|
254
|
+
false
|
|
255
|
+
);
|
|
256
|
+
return wrapV2Snip12Envelope({
|
|
257
|
+
ownerId: ownerIndex,
|
|
258
|
+
kindTag: ED25519_KIND_TAG,
|
|
259
|
+
payload
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
var ED25519_KIND_TAG, garagaInitPromise;
|
|
263
|
+
var init_ed25519 = __esm({
|
|
264
|
+
"src/shhh/signers/ed25519.ts"() {
|
|
265
|
+
init_compute_wallet_address();
|
|
266
|
+
init_oe();
|
|
267
|
+
init_snip12_hash();
|
|
268
|
+
ED25519_KIND_TAG = "ED25519";
|
|
269
|
+
BigInt(shortString.encodeShortString(ED25519_KIND_TAG));
|
|
270
|
+
garagaInitPromise = null;
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
// src/shhh/execute-paymaster-raw.ts
|
|
275
|
+
var execute_paymaster_raw_exports = {};
|
|
276
|
+
__export(execute_paymaster_raw_exports, {
|
|
277
|
+
executeShhhSponsoredRaw: () => executeShhhSponsoredRaw,
|
|
278
|
+
resolveShhhChainId: () => resolveShhhChainId,
|
|
279
|
+
serializeExecuteFromOutsideV2Calldata: () => serializeExecuteFromOutsideV2Calldata
|
|
280
|
+
});
|
|
281
|
+
function resolveShhhChainId(params) {
|
|
282
|
+
if (params.override !== void 0) {
|
|
283
|
+
return typeof params.override === "bigint" ? "0x" + params.override.toString(16) : params.override;
|
|
284
|
+
}
|
|
285
|
+
const url = (params.baseUrl ?? "").toLowerCase();
|
|
286
|
+
if (url.includes("sepolia")) return SN_SEPOLIA_CHAIN_ID;
|
|
287
|
+
return SN_MAIN_CHAIN_ID;
|
|
288
|
+
}
|
|
289
|
+
function serializeExecuteFromOutsideV2Calldata(params) {
|
|
290
|
+
const out = [];
|
|
291
|
+
const oe = params.outsideExecution;
|
|
292
|
+
const toBig = (v) => typeof v === "bigint" ? v : BigInt(v);
|
|
293
|
+
out.push(toBig(oe.caller));
|
|
294
|
+
out.push(toBig(oe.nonce));
|
|
295
|
+
out.push(oe.execute_after);
|
|
296
|
+
out.push(oe.execute_before);
|
|
297
|
+
out.push(BigInt(oe.calls.length));
|
|
298
|
+
for (const call of oe.calls) {
|
|
299
|
+
out.push(BigInt(call.contractAddress));
|
|
300
|
+
out.push(BigInt(hash.getSelectorFromName(call.entrypoint)));
|
|
301
|
+
const callData = Array.isArray(call.calldata) ? call.calldata : [];
|
|
302
|
+
out.push(BigInt(callData.length));
|
|
303
|
+
for (const datum of callData) {
|
|
304
|
+
out.push(typeof datum === "bigint" ? datum : BigInt(datum));
|
|
16
305
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
306
|
+
}
|
|
307
|
+
out.push(BigInt(params.signature.length));
|
|
308
|
+
for (const sigFelt of params.signature) {
|
|
309
|
+
out.push(sigFelt);
|
|
310
|
+
}
|
|
311
|
+
return out.map((v) => "0x" + v.toString(16));
|
|
312
|
+
}
|
|
313
|
+
function newOeNonce() {
|
|
314
|
+
const tsMs = BigInt(Date.now());
|
|
315
|
+
const rand = BigInt(Math.floor(Math.random() * 16777215));
|
|
316
|
+
return tsMs << 24n | rand;
|
|
317
|
+
}
|
|
318
|
+
async function executeShhhSponsoredRaw(params) {
|
|
319
|
+
const signerKind = params.signerKind ?? "STARK";
|
|
320
|
+
const SDK_SHIPPED_OE_KINDS = ["STARK", "ED25519"];
|
|
321
|
+
if (!SDK_SHIPPED_OE_KINDS.includes(signerKind)) {
|
|
322
|
+
throw new Error(
|
|
323
|
+
`SHHH signerKind="${signerKind}" is not yet shipped from the SDK (Wave B ships STARK + ED25519). Wait for the follow-up PR that adds external-rooted (MetaMask, Phantom, passkey, Apple) signing.`
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
const privateKeyHex = decryptPrivateKey(params.wallet.encryptedPrivateKey, params.encryptKey);
|
|
327
|
+
if (!privateKeyHex) {
|
|
328
|
+
throw new Error(
|
|
329
|
+
"Failed to decrypt private key for SHHH OE. Verify the encryptKey matches the one used at wallet creation."
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
const oe = buildOutsideExecution({
|
|
333
|
+
nonce: params.nonce ?? newOeNonce(),
|
|
334
|
+
calls: params.calls,
|
|
335
|
+
caller: ANY_CALLER_FELT
|
|
336
|
+
});
|
|
337
|
+
const chainId = resolveShhhChainId({
|
|
338
|
+
override: params.chainId,
|
|
339
|
+
baseUrl: params.client.baseUrl
|
|
340
|
+
});
|
|
341
|
+
const messageHash = computeOeHash(oe, params.wallet.publicKey, chainId);
|
|
342
|
+
let signature;
|
|
343
|
+
if (signerKind === "STARK") {
|
|
344
|
+
signature = buildStarkEnvelope({
|
|
345
|
+
privateKey: privateKeyHex,
|
|
346
|
+
messageHash
|
|
347
|
+
});
|
|
348
|
+
} else {
|
|
349
|
+
const edKeyHex = privateKeyHex.startsWith("0x") ? privateKeyHex.slice(2) : privateKeyHex;
|
|
350
|
+
if (edKeyHex.length !== 64) {
|
|
351
|
+
throw new Error(
|
|
352
|
+
`SHHH ED25519 private key is ${edKeyHex.length} hex chars; expected 64 (32 raw bytes). The stored ciphertext does not look like a Chipi-held Ed25519 key \u2014 check wallet provenance.`
|
|
353
|
+
);
|
|
21
354
|
}
|
|
22
|
-
|
|
355
|
+
const edPrivKey = Uint8Array.from(Buffer.from(edKeyHex, "hex"));
|
|
356
|
+
signature = await buildEd25519Envelope({
|
|
357
|
+
privateKey: edPrivKey,
|
|
358
|
+
messageHash
|
|
359
|
+
});
|
|
23
360
|
}
|
|
24
|
-
|
|
361
|
+
const calldata = serializeExecuteFromOutsideV2Calldata({
|
|
362
|
+
outsideExecution: oe,
|
|
363
|
+
signature
|
|
364
|
+
});
|
|
365
|
+
const response = await params.client.post({
|
|
366
|
+
endpoint: "/transactions/execute-sponsored-raw",
|
|
367
|
+
bearerToken: params.bearerToken,
|
|
368
|
+
body: {
|
|
369
|
+
accountAddress: params.wallet.publicKey,
|
|
370
|
+
calldata,
|
|
371
|
+
signerKind,
|
|
372
|
+
...params.externalUserId ? { externalUserId: params.externalUserId } : {}
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
if (!response || !response.transactionHash) {
|
|
376
|
+
throw new Error(
|
|
377
|
+
"execute-sponsored-raw response missing transactionHash. Check the chipi-back logs for upstream paymaster errors."
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
return response.transactionHash;
|
|
381
|
+
}
|
|
382
|
+
var SN_MAIN_CHAIN_ID, SN_SEPOLIA_CHAIN_ID;
|
|
383
|
+
var init_execute_paymaster_raw = __esm({
|
|
384
|
+
"src/shhh/execute-paymaster-raw.ts"() {
|
|
385
|
+
init_encryption2();
|
|
386
|
+
init_oe();
|
|
387
|
+
init_stark();
|
|
388
|
+
init_ed25519();
|
|
389
|
+
SN_MAIN_CHAIN_ID = "0x534e5f4d41494e";
|
|
390
|
+
SN_SEPOLIA_CHAIN_ID = "0x534e5f5345504f4c4941";
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
// src/execute-paymaster-transaction.ts
|
|
395
|
+
init_encryption2();
|
|
25
396
|
function normalizeSignature(signature) {
|
|
26
397
|
if (Array.isArray(signature)) {
|
|
27
398
|
if (signature.length < 2) {
|
|
@@ -61,6 +432,22 @@ var executePaymasterTransaction = async ({
|
|
|
61
432
|
);
|
|
62
433
|
}
|
|
63
434
|
const walletType = wallet.walletType ?? "READY";
|
|
435
|
+
if (walletType === "SHHH") {
|
|
436
|
+
const { executeShhhSponsoredRaw: executeShhhSponsoredRaw2 } = await Promise.resolve().then(() => (init_execute_paymaster_raw(), execute_paymaster_raw_exports));
|
|
437
|
+
const shhhSignerKind = (wallet.signerKind ?? "STARK") || "STARK";
|
|
438
|
+
return await executeShhhSponsoredRaw2({
|
|
439
|
+
client,
|
|
440
|
+
bearerToken,
|
|
441
|
+
wallet: {
|
|
442
|
+
publicKey: wallet.publicKey,
|
|
443
|
+
encryptedPrivateKey: wallet.encryptedPrivateKey,
|
|
444
|
+
walletType: wallet.walletType
|
|
445
|
+
},
|
|
446
|
+
encryptKey,
|
|
447
|
+
calls,
|
|
448
|
+
signerKind: shhhSignerKind
|
|
449
|
+
});
|
|
450
|
+
}
|
|
64
451
|
const isKnownType = Object.prototype.hasOwnProperty.call(WALLET_RPC_ENDPOINTS, walletType) && Object.prototype.hasOwnProperty.call(WALLET_CLASS_HASHES, walletType);
|
|
65
452
|
const rpcUrl = isKnownType ? WALLET_RPC_ENDPOINTS[walletType] : WALLET_RPC_ENDPOINTS["CHIPI"];
|
|
66
453
|
const accountClassHash = isKnownType ? WALLET_CLASS_HASHES[walletType] : WALLET_CLASS_HASHES["CHIPI"];
|
|
@@ -273,9 +660,9 @@ var ChipiTransactions = class {
|
|
|
273
660
|
/**
|
|
274
661
|
* Get on-chain transaction status
|
|
275
662
|
*/
|
|
276
|
-
async getTransactionStatus(
|
|
663
|
+
async getTransactionStatus(hash5, bearerToken) {
|
|
277
664
|
return this.client.get({
|
|
278
|
-
endpoint: `${API_ENDPOINTS.TRANSACTIONS}/${
|
|
665
|
+
endpoint: `${API_ENDPOINTS.TRANSACTIONS}/${hash5}/status`,
|
|
279
666
|
bearerToken
|
|
280
667
|
});
|
|
281
668
|
}
|