starknet 5.9.2 → 5.10.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.js CHANGED
@@ -121,55 +121,27 @@ function assert(condition, message) {
121
121
  }
122
122
  }
123
123
 
124
- // src/utils/hash.ts
125
- var hash_exports = {};
126
- __export(hash_exports, {
127
- calculateContractAddressFromHash: () => calculateContractAddressFromHash,
128
- calculateDeclareTransactionHash: () => calculateDeclareTransactionHash,
129
- calculateDeployAccountTransactionHash: () => calculateDeployAccountTransactionHash,
130
- calculateDeployTransactionHash: () => calculateDeployTransactionHash,
131
- calculateTransactionHash: () => calculateTransactionHash,
132
- calculateTransactionHashCommon: () => calculateTransactionHashCommon,
133
- computeCompiledClassHash: () => computeCompiledClassHash,
134
- computeContractClassHash: () => computeContractClassHash,
135
- computeHashOnElements: () => computeHashOnElements,
136
- computeLegacyContractClassHash: () => computeLegacyContractClassHash,
137
- computeSierraContractClassHash: () => computeSierraContractClassHash,
138
- default: () => computeHintedClassHash,
139
- feeTransactionVersion: () => feeTransactionVersion,
140
- formatSpaces: () => formatSpaces,
141
- getSelector: () => getSelector,
142
- getSelectorFromName: () => getSelectorFromName,
143
- keccakBn: () => keccakBn,
144
- poseidon: () => poseidon,
145
- starknetKeccak: () => starknetKeccak,
146
- transactionVersion: () => transactionVersion,
147
- transactionVersion_2: () => transactionVersion_2
148
- });
149
- var import_micro_starknet = require("micro-starknet");
150
-
151
- // src/constants.ts
152
- var constants_exports = {};
153
- __export(constants_exports, {
154
- ALPHA: () => ALPHA,
155
- API_VERSION: () => API_VERSION,
156
- BETA: () => BETA,
157
- BaseUrl: () => BaseUrl,
158
- CONSTANT_POINTS: () => CONSTANT_POINTS,
159
- EC_ORDER: () => EC_ORDER,
160
- FIELD_GEN: () => FIELD_GEN,
161
- FIELD_PRIME: () => FIELD_PRIME,
162
- FIELD_SIZE: () => FIELD_SIZE,
163
- IS_BROWSER: () => IS_BROWSER,
164
- MASK_250: () => MASK_250,
165
- MASK_251: () => MASK_251,
166
- MAX_ECDSA_VAL: () => MAX_ECDSA_VAL,
167
- NetworkName: () => NetworkName,
168
- StarknetChainId: () => StarknetChainId,
169
- TransactionHashPrefix: () => TransactionHashPrefix,
170
- UDC: () => UDC,
171
- ZERO: () => ZERO
124
+ // src/utils/num.ts
125
+ var num_exports = {};
126
+ __export(num_exports, {
127
+ assertInRange: () => assertInRange,
128
+ bigNumberishArrayToDecimalStringArray: () => bigNumberishArrayToDecimalStringArray,
129
+ bigNumberishArrayToHexadecimalStringArray: () => bigNumberishArrayToHexadecimalStringArray,
130
+ cleanHex: () => cleanHex,
131
+ getDecimalString: () => getDecimalString,
132
+ getHexString: () => getHexString,
133
+ getHexStringArray: () => getHexStringArray,
134
+ hexToBytes: () => hexToBytes,
135
+ hexToDecimalString: () => hexToDecimalString,
136
+ isBigInt: () => isBigInt,
137
+ isHex: () => isHex,
138
+ isStringWholeNumber: () => isStringWholeNumber,
139
+ toBigInt: () => toBigInt,
140
+ toCairoBool: () => toCairoBool,
141
+ toHex: () => toHex,
142
+ toHexString: () => toHexString
172
143
  });
144
+ var import_utils = require("@noble/curves/abstract/utils");
173
145
 
174
146
  // src/utils/encode.ts
175
147
  var encode_exports = {};
@@ -234,7 +206,98 @@ function utf8ToArray(str) {
234
206
  return new TextEncoder().encode(str);
235
207
  }
236
208
 
209
+ // src/utils/num.ts
210
+ function isHex(hex) {
211
+ return /^0x[0-9a-f]*$/i.test(hex);
212
+ }
213
+ function toBigInt(value) {
214
+ return BigInt(value);
215
+ }
216
+ function isBigInt(value) {
217
+ return typeof value === "bigint";
218
+ }
219
+ function toHex(number2) {
220
+ return addHexPrefix(toBigInt(number2).toString(16));
221
+ }
222
+ function hexToDecimalString(hex) {
223
+ return BigInt(addHexPrefix(hex)).toString(10);
224
+ }
225
+ var cleanHex = (hex) => hex.toLowerCase().replace(/^(0x)0+/, "$1");
226
+ function assertInRange(input, lowerBound, upperBound, inputName = "") {
227
+ const messageSuffix = inputName === "" ? "invalid length" : `invalid ${inputName} length`;
228
+ const inputBigInt = BigInt(input);
229
+ const lowerBoundBigInt = BigInt(lowerBound);
230
+ const upperBoundBigInt = BigInt(upperBound);
231
+ assert(
232
+ inputBigInt >= lowerBoundBigInt && inputBigInt <= upperBoundBigInt,
233
+ `Message not signable, ${messageSuffix}.`
234
+ );
235
+ }
236
+ function bigNumberishArrayToDecimalStringArray(rawCalldata) {
237
+ return rawCalldata.map((x) => toBigInt(x).toString(10));
238
+ }
239
+ function bigNumberishArrayToHexadecimalStringArray(rawCalldata) {
240
+ return rawCalldata.map((x) => toHex(x));
241
+ }
242
+ var isStringWholeNumber = (value) => /^\d+$/.test(value);
243
+ var toHexString = (value) => toHex(value);
244
+ function getDecimalString(value) {
245
+ if (isHex(value)) {
246
+ return hexToDecimalString(value);
247
+ }
248
+ if (isStringWholeNumber(value)) {
249
+ return value;
250
+ }
251
+ throw new Error(`${value} need to be hex-string or whole-number-string`);
252
+ }
253
+ function getHexString(value) {
254
+ if (isHex(value)) {
255
+ return value;
256
+ }
257
+ if (isStringWholeNumber(value)) {
258
+ return toHexString(value);
259
+ }
260
+ throw new Error(`${value} need to be hex-string or whole-number-string`);
261
+ }
262
+ function getHexStringArray(value) {
263
+ return value.map((el) => getHexString(el));
264
+ }
265
+ var toCairoBool = (value) => (+value).toString();
266
+ function hexToBytes(value) {
267
+ if (!isHex(value))
268
+ throw new Error(`${value} need to be a hex-string`);
269
+ let adaptedValue = removeHexPrefix(value);
270
+ if (adaptedValue.length % 2 !== 0) {
271
+ adaptedValue = `0${adaptedValue}`;
272
+ }
273
+ return (0, import_utils.hexToBytes)(adaptedValue);
274
+ }
275
+
276
+ // src/utils/selector.ts
277
+ var import_micro_starknet = require("micro-starknet");
278
+
237
279
  // src/constants.ts
280
+ var constants_exports = {};
281
+ __export(constants_exports, {
282
+ ALPHA: () => ALPHA,
283
+ API_VERSION: () => API_VERSION,
284
+ BETA: () => BETA,
285
+ BaseUrl: () => BaseUrl,
286
+ CONSTANT_POINTS: () => CONSTANT_POINTS,
287
+ EC_ORDER: () => EC_ORDER,
288
+ FIELD_GEN: () => FIELD_GEN,
289
+ FIELD_PRIME: () => FIELD_PRIME,
290
+ FIELD_SIZE: () => FIELD_SIZE,
291
+ IS_BROWSER: () => IS_BROWSER,
292
+ MASK_250: () => MASK_250,
293
+ MASK_251: () => MASK_251,
294
+ MAX_ECDSA_VAL: () => MAX_ECDSA_VAL,
295
+ NetworkName: () => NetworkName,
296
+ StarknetChainId: () => StarknetChainId,
297
+ TransactionHashPrefix: () => TransactionHashPrefix,
298
+ UDC: () => UDC,
299
+ ZERO: () => ZERO
300
+ });
238
301
  var ZERO = 0n;
239
302
  var MASK_250 = 2n ** 250n - 1n;
240
303
  var MASK_251 = 2n ** 251n;
@@ -2303,6 +2366,83 @@ var CONSTANT_POINTS = [
2303
2366
  ]
2304
2367
  ];
2305
2368
 
2369
+ // src/utils/selector.ts
2370
+ function keccakBn(value) {
2371
+ const hexWithoutPrefix = removeHexPrefix(toHex(BigInt(value)));
2372
+ const evenHex = hexWithoutPrefix.length % 2 === 0 ? hexWithoutPrefix : `0${hexWithoutPrefix}`;
2373
+ return addHexPrefix((0, import_micro_starknet.keccak)(hexToBytes(addHexPrefix(evenHex))).toString(16));
2374
+ }
2375
+ function keccakHex(value) {
2376
+ return addHexPrefix((0, import_micro_starknet.keccak)(utf8ToArray(value)).toString(16));
2377
+ }
2378
+ function starknetKeccak(value) {
2379
+ const hash = BigInt(keccakHex(value));
2380
+ return hash & MASK_250;
2381
+ }
2382
+ function getSelectorFromName(funcName) {
2383
+ return toHex(starknetKeccak(funcName));
2384
+ }
2385
+ function getSelector(value) {
2386
+ if (isHex(value)) {
2387
+ return value;
2388
+ }
2389
+ if (isStringWholeNumber(value)) {
2390
+ return toHexString(value);
2391
+ }
2392
+ return getSelectorFromName(value);
2393
+ }
2394
+
2395
+ // src/utils/shortString.ts
2396
+ var shortString_exports = {};
2397
+ __export(shortString_exports, {
2398
+ decodeShortString: () => decodeShortString,
2399
+ encodeShortString: () => encodeShortString,
2400
+ isASCII: () => isASCII,
2401
+ isDecimalString: () => isDecimalString,
2402
+ isLongText: () => isLongText,
2403
+ isShortString: () => isShortString,
2404
+ isShortText: () => isShortText,
2405
+ isText: () => isText,
2406
+ splitLongString: () => splitLongString
2407
+ });
2408
+ var TEXT_TO_FELT_MAX_LEN = 31;
2409
+ function isASCII(str) {
2410
+ return /^[\x00-\x7F]*$/.test(str);
2411
+ }
2412
+ function isShortString(str) {
2413
+ return str.length <= TEXT_TO_FELT_MAX_LEN;
2414
+ }
2415
+ function isDecimalString(decim) {
2416
+ return /^[0-9]*$/i.test(decim);
2417
+ }
2418
+ function isText(val) {
2419
+ return typeof val === "string" && !isHex(val) && !isStringWholeNumber(val);
2420
+ }
2421
+ var isShortText = (val) => isText(val) && isShortString(val);
2422
+ var isLongText = (val) => isText(val) && !isShortString(val);
2423
+ function splitLongString(longStr) {
2424
+ const regex = RegExp(`[^]{1,${TEXT_TO_FELT_MAX_LEN}}`, "g");
2425
+ return longStr.match(regex) || [];
2426
+ }
2427
+ function encodeShortString(str) {
2428
+ if (!isASCII(str))
2429
+ throw new Error(`${str} is not an ASCII string`);
2430
+ if (!isShortString(str))
2431
+ throw new Error(`${str} is too long`);
2432
+ return addHexPrefix(str.replace(/./g, (char) => char.charCodeAt(0).toString(16)));
2433
+ }
2434
+ function decodeShortString(str) {
2435
+ if (!isASCII(str))
2436
+ throw new Error(`${str} is not an ASCII string`);
2437
+ if (isHex(str)) {
2438
+ return removeHexPrefix(str).replace(/.{2}/g, (hex) => String.fromCharCode(parseInt(hex, 16)));
2439
+ }
2440
+ if (isDecimalString(str)) {
2441
+ return decodeShortString("0X".concat(BigInt(str).toString(16)));
2442
+ }
2443
+ throw new Error(`${str} is not Hex or decimal`);
2444
+ }
2445
+
2306
2446
  // src/utils/calldata/cairo.ts
2307
2447
  var cairo_exports = {};
2308
2448
  __export(cairo_exports, {
@@ -2324,144 +2464,6 @@ __export(cairo_exports, {
2324
2464
  uint256: () => uint256
2325
2465
  });
2326
2466
 
2327
- // src/utils/num.ts
2328
- var num_exports = {};
2329
- __export(num_exports, {
2330
- assertInRange: () => assertInRange,
2331
- bigNumberishArrayToDecimalStringArray: () => bigNumberishArrayToDecimalStringArray,
2332
- bigNumberishArrayToHexadecimalStringArray: () => bigNumberishArrayToHexadecimalStringArray,
2333
- cleanHex: () => cleanHex,
2334
- getDecimalString: () => getDecimalString,
2335
- getHexString: () => getHexString,
2336
- getHexStringArray: () => getHexStringArray,
2337
- hexToBytes: () => hexToBytes,
2338
- hexToDecimalString: () => hexToDecimalString,
2339
- isBigInt: () => isBigInt,
2340
- isHex: () => isHex,
2341
- isStringWholeNumber: () => isStringWholeNumber,
2342
- toBigInt: () => toBigInt,
2343
- toCairoBool: () => toCairoBool,
2344
- toHex: () => toHex,
2345
- toHexString: () => toHexString
2346
- });
2347
- var import_utils = require("@noble/curves/abstract/utils");
2348
- function isHex(hex) {
2349
- return /^0x[0-9a-f]*$/i.test(hex);
2350
- }
2351
- function toBigInt(value) {
2352
- return BigInt(value);
2353
- }
2354
- function isBigInt(value) {
2355
- return typeof value === "bigint";
2356
- }
2357
- function toHex(number2) {
2358
- return addHexPrefix(toBigInt(number2).toString(16));
2359
- }
2360
- function hexToDecimalString(hex) {
2361
- return BigInt(addHexPrefix(hex)).toString(10);
2362
- }
2363
- var cleanHex = (hex) => hex.toLowerCase().replace(/^(0x)0+/, "$1");
2364
- function assertInRange(input, lowerBound, upperBound, inputName = "") {
2365
- const messageSuffix = inputName === "" ? "invalid length" : `invalid ${inputName} length`;
2366
- const inputBigInt = BigInt(input);
2367
- const lowerBoundBigInt = BigInt(lowerBound);
2368
- const upperBoundBigInt = BigInt(upperBound);
2369
- assert(
2370
- inputBigInt >= lowerBoundBigInt && inputBigInt <= upperBoundBigInt,
2371
- `Message not signable, ${messageSuffix}.`
2372
- );
2373
- }
2374
- function bigNumberishArrayToDecimalStringArray(rawCalldata) {
2375
- return rawCalldata.map((x) => toBigInt(x).toString(10));
2376
- }
2377
- function bigNumberishArrayToHexadecimalStringArray(rawCalldata) {
2378
- return rawCalldata.map((x) => toHex(x));
2379
- }
2380
- var isStringWholeNumber = (value) => /^\d+$/.test(value);
2381
- var toHexString = (value) => toHex(value);
2382
- function getDecimalString(value) {
2383
- if (isHex(value)) {
2384
- return hexToDecimalString(value);
2385
- }
2386
- if (isStringWholeNumber(value)) {
2387
- return value;
2388
- }
2389
- throw new Error(`${value} need to be hex-string or whole-number-string`);
2390
- }
2391
- function getHexString(value) {
2392
- if (isHex(value)) {
2393
- return value;
2394
- }
2395
- if (isStringWholeNumber(value)) {
2396
- return toHexString(value);
2397
- }
2398
- throw new Error(`${value} need to be hex-string or whole-number-string`);
2399
- }
2400
- function getHexStringArray(value) {
2401
- return value.map((el) => getHexString(el));
2402
- }
2403
- var toCairoBool = (value) => (+value).toString();
2404
- function hexToBytes(value) {
2405
- if (!isHex(value))
2406
- throw new Error(`${value} need to be a hex-string`);
2407
- let adaptedValue = removeHexPrefix(value);
2408
- if (adaptedValue.length % 2 !== 0) {
2409
- adaptedValue = `0${adaptedValue}`;
2410
- }
2411
- return (0, import_utils.hexToBytes)(adaptedValue);
2412
- }
2413
-
2414
- // src/utils/shortString.ts
2415
- var shortString_exports = {};
2416
- __export(shortString_exports, {
2417
- decodeShortString: () => decodeShortString,
2418
- encodeShortString: () => encodeShortString,
2419
- isASCII: () => isASCII,
2420
- isDecimalString: () => isDecimalString,
2421
- isLongText: () => isLongText,
2422
- isShortString: () => isShortString,
2423
- isShortText: () => isShortText,
2424
- isText: () => isText,
2425
- splitLongString: () => splitLongString
2426
- });
2427
- var TEXT_TO_FELT_MAX_LEN = 31;
2428
- function isASCII(str) {
2429
- return /^[\x00-\x7F]*$/.test(str);
2430
- }
2431
- function isShortString(str) {
2432
- return str.length <= TEXT_TO_FELT_MAX_LEN;
2433
- }
2434
- function isDecimalString(decim) {
2435
- return /^[0-9]*$/i.test(decim);
2436
- }
2437
- function isText(val) {
2438
- return typeof val === "string" && !isHex(val) && !isStringWholeNumber(val);
2439
- }
2440
- var isShortText = (val) => isText(val) && isShortString(val);
2441
- var isLongText = (val) => isText(val) && !isShortString(val);
2442
- function splitLongString(longStr) {
2443
- const regex = RegExp(`[^]{1,${TEXT_TO_FELT_MAX_LEN}}`, "g");
2444
- return longStr.match(regex) || [];
2445
- }
2446
- function encodeShortString(str) {
2447
- if (!isASCII(str))
2448
- throw new Error(`${str} is not an ASCII string`);
2449
- if (!isShortString(str))
2450
- throw new Error(`${str} is too long`);
2451
- return addHexPrefix(str.replace(/./g, (char) => char.charCodeAt(0).toString(16)));
2452
- }
2453
- function decodeShortString(str) {
2454
- if (!isASCII(str))
2455
- throw new Error(`${str} is not an ASCII string`);
2456
- if (isHex(str)) {
2457
- return removeHexPrefix(str).replace(/.{2}/g, (hex) => String.fromCharCode(parseInt(hex, 16)));
2458
- }
2459
- if (isDecimalString(str)) {
2460
- return decodeShortString("0X".concat(BigInt(str).toString(16)));
2461
- }
2462
- throw new Error(`${str} is not Hex or decimal`);
2463
- }
2464
-
2465
2467
  // src/utils/uint256.ts
2466
2468
  var uint256_exports = {};
2467
2469
  __export(uint256_exports, {
@@ -2501,7 +2503,7 @@ var Uint = /* @__PURE__ */ ((Uint2) => {
2501
2503
  })(Uint || {});
2502
2504
  var isLen = (name) => /_len$/.test(name);
2503
2505
  var isTypeFelt = (type) => type === "felt" || type === "core::felt252";
2504
- var isTypeArray = (type) => /\*/.test(type) || type.includes("core::array::Array::");
2506
+ var isTypeArray = (type) => /\*/.test(type) || type.startsWith("core::array::Array::");
2505
2507
  var isTypeTuple = (type) => /^\(.*\)$/i.test(type);
2506
2508
  var isTypeNamedTuple = (type) => /\(.*\)/i.test(type) && type.includes(":");
2507
2509
  var isTypeStruct = (type, structs) => type in structs;
@@ -2512,7 +2514,7 @@ var isTypeContractAddress = (type) => type === "core::starknet::contract_address
2512
2514
  var isCairo1Type = (type) => type.includes("core::");
2513
2515
  var getArrayType = (type) => {
2514
2516
  if (isCairo1Type(type)) {
2515
- return type.substring(type.indexOf("<") + 1, type.indexOf(">"));
2517
+ return type.substring(type.indexOf("<") + 1, type.lastIndexOf(">"));
2516
2518
  }
2517
2519
  return type.replace("*", "");
2518
2520
  };
@@ -2534,278 +2536,20 @@ function felt(it) {
2534
2536
  if (!isShortString(it))
2535
2537
  throw new Error(
2536
2538
  `${it} is a long string > 31 chars, felt can store short strings, split it to array of short strings`
2537
- );
2538
- const encoded = encodeShortString(it);
2539
- return BigInt(encoded).toString();
2540
- }
2541
- if (typeof it === "string" && isHex(it)) {
2542
- return BigInt(it).toString();
2543
- }
2544
- if (typeof it === "string" && isStringWholeNumber(it)) {
2545
- return it;
2546
- }
2547
- if (typeof it === "boolean") {
2548
- return `${+it}`;
2549
- }
2550
- throw new Error(`${it} can't be computed by felt()`);
2551
- }
2552
-
2553
- // src/utils/ec.ts
2554
- var ec_exports = {};
2555
- __export(ec_exports, {
2556
- starkCurve: () => starkCurve,
2557
- weierstrass: () => weierstrass
2558
- });
2559
- var starkCurve = __toESM(require("micro-starknet"));
2560
- var weierstrass = __toESM(require("@noble/curves/abstract/weierstrass"));
2561
-
2562
- // src/utils/json.ts
2563
- var json_exports = {};
2564
- __export(json_exports, {
2565
- parse: () => parse2,
2566
- parseAlwaysAsBig: () => parseAlwaysAsBig,
2567
- stringify: () => stringify2,
2568
- stringifyAlwaysAsBig: () => stringifyAlwaysAsBig
2569
- });
2570
- var json = __toESM(require("lossless-json"));
2571
- var parseIntAsNumberOrBigInt = (x) => {
2572
- if (!json.isInteger(x))
2573
- return parseFloat(x);
2574
- const v = parseInt(x, 10);
2575
- return Number.isSafeInteger(v) ? v : BigInt(x);
2576
- };
2577
- var parse2 = (x) => json.parse(String(x), null, parseIntAsNumberOrBigInt);
2578
- var parseAlwaysAsBig = (x) => json.parse(String(x), null, json.parseNumberAndBigInt);
2579
- var stringify2 = (...p) => json.stringify(...p);
2580
- var stringifyAlwaysAsBig = stringify2;
2581
-
2582
- // src/utils/hash.ts
2583
- var poseidon = __toESM(require("@noble/curves/abstract/poseidon"));
2584
- var transactionVersion = 1n;
2585
- var transactionVersion_2 = 2n;
2586
- var feeTransactionVersion = 2n ** 128n + transactionVersion;
2587
- function keccakBn(value) {
2588
- const hexWithoutPrefix = removeHexPrefix(toHex(BigInt(value)));
2589
- const evenHex = hexWithoutPrefix.length % 2 === 0 ? hexWithoutPrefix : `0${hexWithoutPrefix}`;
2590
- return addHexPrefix((0, import_micro_starknet.keccak)(hexToBytes(addHexPrefix(evenHex))).toString(16));
2591
- }
2592
- function keccakHex(value) {
2593
- return addHexPrefix((0, import_micro_starknet.keccak)(utf8ToArray(value)).toString(16));
2594
- }
2595
- function starknetKeccak(value) {
2596
- const hash = BigInt(keccakHex(value));
2597
- return hash & MASK_250;
2598
- }
2599
- function getSelectorFromName(funcName) {
2600
- return toHex(starknetKeccak(funcName));
2601
- }
2602
- function getSelector(value) {
2603
- if (isHex(value)) {
2604
- return value;
2605
- }
2606
- if (isStringWholeNumber(value)) {
2607
- return toHexString(value);
2608
- }
2609
- return getSelectorFromName(value);
2610
- }
2611
- function computeHashOnElements(data) {
2612
- return [...data, data.length].reduce((x, y) => starkCurve.pedersen(toBigInt(x), toBigInt(y)), 0).toString();
2613
- }
2614
- function calculateTransactionHashCommon(txHashPrefix, version, contractAddress, entryPointSelector, calldata, maxFee, chainId, additionalData = []) {
2615
- const calldataHash = computeHashOnElements(calldata);
2616
- const dataToHash = [
2617
- txHashPrefix,
2618
- version,
2619
- contractAddress,
2620
- entryPointSelector,
2621
- calldataHash,
2622
- maxFee,
2623
- chainId,
2624
- ...additionalData
2625
- ];
2626
- return computeHashOnElements(dataToHash);
2627
- }
2628
- function calculateDeployTransactionHash(contractAddress, constructorCalldata, version, chainId) {
2629
- return calculateTransactionHashCommon(
2630
- "0x6465706c6f79" /* DEPLOY */,
2631
- version,
2632
- contractAddress,
2633
- getSelectorFromName("constructor"),
2634
- constructorCalldata,
2635
- 0,
2636
- chainId
2637
- );
2638
- }
2639
- function calculateDeclareTransactionHash(classHash, senderAddress, version, maxFee, chainId, nonce, compiledClassHash) {
2640
- return calculateTransactionHashCommon(
2641
- "0x6465636c617265" /* DECLARE */,
2642
- version,
2643
- senderAddress,
2644
- 0,
2645
- [classHash],
2646
- maxFee,
2647
- chainId,
2648
- [nonce, ...compiledClassHash ? [compiledClassHash] : []]
2649
- );
2650
- }
2651
- function calculateDeployAccountTransactionHash(contractAddress, classHash, constructorCalldata, salt, version, maxFee, chainId, nonce) {
2652
- const calldata = [classHash, salt, ...constructorCalldata];
2653
- return calculateTransactionHashCommon(
2654
- "0x6465706c6f795f6163636f756e74" /* DEPLOY_ACCOUNT */,
2655
- version,
2656
- contractAddress,
2657
- 0,
2658
- calldata,
2659
- maxFee,
2660
- chainId,
2661
- [nonce]
2662
- );
2663
- }
2664
- function calculateTransactionHash(contractAddress, version, calldata, maxFee, chainId, nonce) {
2665
- return calculateTransactionHashCommon(
2666
- "0x696e766f6b65" /* INVOKE */,
2667
- version,
2668
- contractAddress,
2669
- 0,
2670
- calldata,
2671
- maxFee,
2672
- chainId,
2673
- [nonce]
2674
- );
2675
- }
2676
- function calculateContractAddressFromHash(salt, classHash, constructorCalldata, deployerAddress) {
2677
- const constructorCalldataHash = computeHashOnElements(constructorCalldata);
2678
- const CONTRACT_ADDRESS_PREFIX = felt("0x535441524b4e45545f434f4e54524143545f41444452455353");
2679
- return computeHashOnElements([
2680
- CONTRACT_ADDRESS_PREFIX,
2681
- deployerAddress,
2682
- salt,
2683
- classHash,
2684
- constructorCalldataHash
2685
- ]);
2686
- }
2687
- function nullSkipReplacer(key, value) {
2688
- if (key === "attributes" || key === "accessible_scopes") {
2689
- return Array.isArray(value) && value.length === 0 ? void 0 : value;
2690
- }
2691
- if (key === "debug_info") {
2692
- return null;
2693
- }
2694
- return value === null ? void 0 : value;
2695
- }
2696
- function formatSpaces(json2) {
2697
- let insideQuotes = false;
2698
- let newString = "";
2699
- for (const char of json2) {
2700
- if (char === '"' && newString.endsWith("\\") === false) {
2701
- insideQuotes = !insideQuotes;
2702
- }
2703
- if (insideQuotes) {
2704
- newString += char;
2705
- } else {
2706
- newString += char === ":" ? ": " : char === "," ? ", " : char;
2707
- }
2708
- }
2709
- return newString;
2710
- }
2711
- function computeHintedClassHash(compiledContract) {
2712
- const { abi, program } = compiledContract;
2713
- const contractClass = { abi, program };
2714
- const serializedJson = formatSpaces(stringify2(contractClass, nullSkipReplacer));
2715
- return addHexPrefix(starkCurve.keccak(utf8ToArray(serializedJson)).toString(16));
2716
- }
2717
- function computeLegacyContractClassHash(contract) {
2718
- const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
2719
- const apiVersion = toHex(API_VERSION);
2720
- const externalEntryPointsHash = computeHashOnElements(
2721
- compiledContract.entry_points_by_type.EXTERNAL.flatMap((e) => [e.selector, e.offset])
2722
- );
2723
- const l1HandlerEntryPointsHash = computeHashOnElements(
2724
- compiledContract.entry_points_by_type.L1_HANDLER.flatMap((e) => [e.selector, e.offset])
2725
- );
2726
- const constructorEntryPointHash = computeHashOnElements(
2727
- compiledContract.entry_points_by_type.CONSTRUCTOR.flatMap((e) => [e.selector, e.offset])
2728
- );
2729
- const builtinsHash = computeHashOnElements(
2730
- compiledContract.program.builtins.map((s) => encodeShortString(s))
2731
- );
2732
- const hintedClassHash = computeHintedClassHash(compiledContract);
2733
- const dataHash = computeHashOnElements(compiledContract.program.data);
2734
- return computeHashOnElements([
2735
- apiVersion,
2736
- externalEntryPointsHash,
2737
- l1HandlerEntryPointsHash,
2738
- constructorEntryPointHash,
2739
- builtinsHash,
2740
- hintedClassHash,
2741
- dataHash
2742
- ]);
2743
- }
2744
- function hashBuiltins(builtins) {
2745
- return (0, import_micro_starknet.poseidonHashMany)(
2746
- builtins.flatMap((it) => {
2747
- return BigInt(encodeShortString(it));
2748
- })
2749
- );
2750
- }
2751
- function hashEntryPoint(data) {
2752
- const base = data.flatMap((it) => {
2753
- return [BigInt(it.selector), BigInt(it.offset), hashBuiltins(it.builtins)];
2754
- });
2755
- return (0, import_micro_starknet.poseidonHashMany)(base);
2756
- }
2757
- function computeCompiledClassHash(casm) {
2758
- const COMPILED_CLASS_VERSION = "COMPILED_CLASS_V1";
2759
- const compiledClassVersion = BigInt(encodeShortString(COMPILED_CLASS_VERSION));
2760
- const externalEntryPointsHash = hashEntryPoint(casm.entry_points_by_type.EXTERNAL);
2761
- const l1Handlers = hashEntryPoint(casm.entry_points_by_type.L1_HANDLER);
2762
- const constructor = hashEntryPoint(casm.entry_points_by_type.CONSTRUCTOR);
2763
- const bytecode = (0, import_micro_starknet.poseidonHashMany)(casm.bytecode.map((it) => BigInt(it)));
2764
- return toHex(
2765
- (0, import_micro_starknet.poseidonHashMany)([
2766
- compiledClassVersion,
2767
- externalEntryPointsHash,
2768
- l1Handlers,
2769
- constructor,
2770
- bytecode
2771
- ])
2772
- );
2773
- }
2774
- function hashEntryPointSierra(data) {
2775
- const base = data.flatMap((it) => {
2776
- return [BigInt(it.selector), BigInt(it.function_idx)];
2777
- });
2778
- return (0, import_micro_starknet.poseidonHashMany)(base);
2779
- }
2780
- function hashAbi(sierra) {
2781
- const indentString = formatSpaces(stringify2(sierra.abi, null));
2782
- return BigInt(addHexPrefix(starkCurve.keccak(utf8ToArray(indentString)).toString(16)));
2783
- }
2784
- function computeSierraContractClassHash(sierra) {
2785
- const CONTRACT_CLASS_VERSION = "CONTRACT_CLASS_V0.1.0";
2786
- const compiledClassVersion = BigInt(encodeShortString(CONTRACT_CLASS_VERSION));
2787
- const externalEntryPointsHash = hashEntryPointSierra(sierra.entry_points_by_type.EXTERNAL);
2788
- const l1Handlers = hashEntryPointSierra(sierra.entry_points_by_type.L1_HANDLER);
2789
- const constructor = hashEntryPointSierra(sierra.entry_points_by_type.CONSTRUCTOR);
2790
- const abiHash = hashAbi(sierra);
2791
- const sierraProgram = (0, import_micro_starknet.poseidonHashMany)(sierra.sierra_program.map((it) => BigInt(it)));
2792
- return toHex(
2793
- (0, import_micro_starknet.poseidonHashMany)([
2794
- compiledClassVersion,
2795
- externalEntryPointsHash,
2796
- l1Handlers,
2797
- constructor,
2798
- abiHash,
2799
- sierraProgram
2800
- ])
2801
- );
2802
- }
2803
- function computeContractClassHash(contract) {
2804
- const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
2805
- if ("sierra_program" in compiledContract) {
2806
- return computeSierraContractClassHash(compiledContract);
2539
+ );
2540
+ const encoded = encodeShortString(it);
2541
+ return BigInt(encoded).toString();
2807
2542
  }
2808
- return computeLegacyContractClassHash(compiledContract);
2543
+ if (typeof it === "string" && isHex(it)) {
2544
+ return BigInt(it).toString();
2545
+ }
2546
+ if (typeof it === "string" && isStringWholeNumber(it)) {
2547
+ return it;
2548
+ }
2549
+ if (typeof it === "boolean") {
2550
+ return `${+it}`;
2551
+ }
2552
+ throw new Error(`${it} can't be computed by felt()`);
2809
2553
  }
2810
2554
 
2811
2555
  // src/utils/calldata/formatter.ts
@@ -2956,7 +2700,12 @@ function parseCalldataValue(element, type, structs) {
2956
2700
  throw Error(`Missing parameter for type ${type}`);
2957
2701
  }
2958
2702
  if (Array.isArray(element)) {
2959
- throw Error(`Array inside array (nD) are not supported by cairo. Element: ${element} ${type}`);
2703
+ const result = [];
2704
+ result.push(felt(element.length));
2705
+ const arrayType = getArrayType(type);
2706
+ return element.reduce((acc, it) => {
2707
+ return acc.concat(parseCalldataValue(it, arrayType, structs));
2708
+ }, result);
2960
2709
  }
2961
2710
  if (structs[type] && structs[type].members.length) {
2962
2711
  const { members } = structs[type];
@@ -2988,17 +2737,7 @@ function parseCalldataField(argsIterator, input, structs) {
2988
2737
  if (typeof value === "string") {
2989
2738
  value = splitLongString(value);
2990
2739
  }
2991
- const result = [];
2992
- result.push(felt(value.length));
2993
- const arrayType = getArrayType(input.type);
2994
- return value.reduce((acc, el) => {
2995
- if (isTypeStruct(arrayType, structs) || isTypeTuple(arrayType) || isTypeArray(arrayType)) {
2996
- acc.push(...parseCalldataValue(el, arrayType, structs));
2997
- } else {
2998
- return acc.concat(parseBaseTypes(arrayType, el));
2999
- }
3000
- return acc;
3001
- }, result);
2740
+ return parseCalldataValue(value, input.type, structs);
3002
2741
  case (isTypeStruct(type, structs) || isTypeTuple(type)):
3003
2742
  return parseCalldataValue(value, type, structs);
3004
2743
  case isTypeUint256(type):
@@ -3028,23 +2767,33 @@ function parseBaseTypes2(type, it) {
3028
2767
  return BigInt(temp);
3029
2768
  }
3030
2769
  }
3031
- function parseResponseStruct(responseIterator, type, structs) {
3032
- if (type in structs && structs[type]) {
3033
- return structs[type].members.reduce((acc, el) => {
3034
- acc[el.name] = parseResponseStruct(responseIterator, el.type, structs);
2770
+ function parseResponseValue(responseIterator, element, structs) {
2771
+ if (element.type in structs && structs[element.type]) {
2772
+ return structs[element.type].members.reduce((acc, el) => {
2773
+ acc[el.name] = parseResponseValue(responseIterator, el, structs);
3035
2774
  return acc;
3036
2775
  }, {});
3037
2776
  }
3038
- if (isTypeTuple(type)) {
3039
- const memberTypes = extractTupleMemberTypes(type);
2777
+ if (isTypeTuple(element.type)) {
2778
+ const memberTypes = extractTupleMemberTypes(element.type);
3040
2779
  return memberTypes.reduce((acc, it, idx) => {
3041
- const tName = (it == null ? void 0 : it.name) ? it.name : idx;
3042
- const tType = (it == null ? void 0 : it.type) ? it.type : it;
3043
- acc[tName] = parseResponseStruct(responseIterator, tType, structs);
2780
+ const name = (it == null ? void 0 : it.name) ? it.name : idx;
2781
+ const type = (it == null ? void 0 : it.type) ? it.type : it;
2782
+ const el = { name, type };
2783
+ acc[name] = parseResponseValue(responseIterator, el, structs);
3044
2784
  return acc;
3045
2785
  }, {});
3046
2786
  }
3047
- return parseBaseTypes2(type, responseIterator);
2787
+ if (isTypeArray(element.type)) {
2788
+ const parsedDataArr = [];
2789
+ const el = { name: "", type: getArrayType(element.type) };
2790
+ const len = BigInt(responseIterator.next().value);
2791
+ while (parsedDataArr.length < len) {
2792
+ parsedDataArr.push(parseResponseValue(responseIterator, el, structs));
2793
+ }
2794
+ return parsedDataArr;
2795
+ }
2796
+ return parseBaseTypes2(element.type, responseIterator);
3048
2797
  }
3049
2798
  function responseParser(responseIterator, output, structs, parsedResult) {
3050
2799
  const { name, type } = output;
@@ -3053,27 +2802,26 @@ function responseParser(responseIterator, output, structs, parsedResult) {
3053
2802
  case isLen(name):
3054
2803
  temp = responseIterator.next().value;
3055
2804
  return BigInt(temp);
2805
+ case (type in structs || isTypeTuple(type)):
2806
+ return parseResponseValue(responseIterator, output, structs);
3056
2807
  case isTypeArray(type):
3057
- const parsedDataArr = [];
3058
2808
  if (isCairo1Type(type)) {
3059
- const arrayType = getArrayType(type);
3060
- const len = BigInt(responseIterator.next().value);
3061
- while (parsedDataArr.length < len) {
3062
- parsedDataArr.push(parseResponseStruct(responseIterator, arrayType, structs));
3063
- }
3064
- return parsedDataArr;
2809
+ return parseResponseValue(responseIterator, output, structs);
3065
2810
  }
2811
+ const parsedDataArr = [];
3066
2812
  if (parsedResult && parsedResult[`${name}_len`]) {
3067
2813
  const arrLen = parsedResult[`${name}_len`];
3068
2814
  while (parsedDataArr.length < arrLen) {
3069
2815
  parsedDataArr.push(
3070
- parseResponseStruct(responseIterator, output.type.replace("*", ""), structs)
2816
+ parseResponseValue(
2817
+ responseIterator,
2818
+ { name, type: output.type.replace("*", "") },
2819
+ structs
2820
+ )
3071
2821
  );
3072
2822
  }
3073
2823
  }
3074
2824
  return parsedDataArr;
3075
- case (type in structs || isTypeTuple(type)):
3076
- return parseResponseStruct(responseIterator, type, structs);
3077
2825
  default:
3078
2826
  return parseBaseTypes2(type, responseIterator);
3079
2827
  }
@@ -3186,6 +2934,11 @@ var validateArray = (parameter, input, structs) => {
3186
2934
  case isTypeBool(baseType):
3187
2935
  parameter.forEach((param) => validateBool(param, input));
3188
2936
  break;
2937
+ case isTypeArray(baseType):
2938
+ parameter.forEach(
2939
+ (param) => validateArray(param, { name: "", type: baseType }, structs)
2940
+ );
2941
+ break;
3189
2942
  default:
3190
2943
  throw new Error(
3191
2944
  `Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`
@@ -3226,120 +2979,382 @@ function validateFields(abiMethod, args, structs) {
3226
2979
  return acc + 1;
3227
2980
  }, 0);
3228
2981
  }
3229
-
3230
- // src/utils/calldata/index.ts
3231
- var CallData = class {
3232
- constructor(abi) {
3233
- this.abi = abi;
3234
- this.structs = CallData.getAbiStruct(abi);
3235
- }
3236
- validate(type, method, args = []) {
3237
- if (type !== "DEPLOY") {
3238
- const invocableFunctionNames = this.abi.filter((abi) => {
3239
- if (abi.type !== "function")
3240
- return false;
3241
- const isView = abi.stateMutability === "view" || abi.state_mutability === "view";
3242
- return type === "INVOKE" ? !isView : isView;
3243
- }).map((abi) => abi.name);
3244
- assert(
3245
- invocableFunctionNames.includes(method),
3246
- `${type === "INVOKE" ? "invocable" : "viewable"} method not found in abi`
3247
- );
3248
- }
3249
- const abiMethod = this.abi.find(
3250
- (abi) => type === "DEPLOY" ? abi.name === method && abi.type === method : abi.name === method && abi.type === "function"
3251
- );
3252
- const inputsLength = CallData.abiInputsLength(abiMethod.inputs);
3253
- if (args.length !== inputsLength) {
3254
- throw Error(
3255
- `Invalid number of arguments, expected ${inputsLength} arguments, but got ${args.length}`
3256
- );
3257
- }
3258
- validateFields(abiMethod, args, this.structs);
2982
+
2983
+ // src/utils/calldata/index.ts
2984
+ var CallData = class {
2985
+ constructor(abi) {
2986
+ this.abi = abi;
2987
+ this.structs = CallData.getAbiStruct(abi);
2988
+ }
2989
+ validate(type, method, args = []) {
2990
+ if (type !== "DEPLOY") {
2991
+ const invocableFunctionNames = this.abi.filter((abi) => {
2992
+ if (abi.type !== "function")
2993
+ return false;
2994
+ const isView = abi.stateMutability === "view" || abi.state_mutability === "view";
2995
+ return type === "INVOKE" ? !isView : isView;
2996
+ }).map((abi) => abi.name);
2997
+ assert(
2998
+ invocableFunctionNames.includes(method),
2999
+ `${type === "INVOKE" ? "invocable" : "viewable"} method not found in abi`
3000
+ );
3001
+ }
3002
+ const abiMethod = this.abi.find(
3003
+ (abi) => type === "DEPLOY" ? abi.name === method && abi.type === method : abi.name === method && abi.type === "function"
3004
+ );
3005
+ const inputsLength = CallData.abiInputsLength(abiMethod.inputs);
3006
+ if (args.length !== inputsLength) {
3007
+ throw Error(
3008
+ `Invalid number of arguments, expected ${inputsLength} arguments, but got ${args.length}`
3009
+ );
3010
+ }
3011
+ validateFields(abiMethod, args, this.structs);
3012
+ }
3013
+ compile(method, args) {
3014
+ const argsIterator = args[Symbol.iterator]();
3015
+ const { inputs } = this.abi.find((abi) => abi.name === method);
3016
+ return inputs.reduce(
3017
+ (acc, input) => isLen(input.name) ? acc : acc.concat(parseCalldataField(argsIterator, input, this.structs)),
3018
+ []
3019
+ );
3020
+ }
3021
+ static compile(rawArgs) {
3022
+ const createTree = (obj) => {
3023
+ const getEntries = (o, prefix = "") => {
3024
+ const oe = Array.isArray(o) ? [o.length.toString(), ...o] : o;
3025
+ return Object.entries(oe).flatMap(([k, v]) => {
3026
+ let value = v;
3027
+ if (isLongText(value))
3028
+ value = splitLongString(value);
3029
+ if (k === "entrypoint")
3030
+ value = getSelectorFromName(value);
3031
+ const kk = Array.isArray(oe) && k === "0" ? "$$len" : k;
3032
+ if (isBigInt(value))
3033
+ return [[`${prefix}${kk}`, felt(value)]];
3034
+ return Object(value) === value ? getEntries(value, `${prefix}${kk}.`) : [[`${prefix}${kk}`, felt(value)]];
3035
+ });
3036
+ };
3037
+ return Object.fromEntries(getEntries(obj));
3038
+ };
3039
+ let callTreeArray;
3040
+ if (!Array.isArray(rawArgs)) {
3041
+ const callTree = createTree(rawArgs);
3042
+ callTreeArray = Object.values(callTree);
3043
+ } else {
3044
+ const callObj = { ...rawArgs };
3045
+ const callTree = createTree(callObj);
3046
+ callTreeArray = Object.values(callTree);
3047
+ }
3048
+ Object.defineProperty(callTreeArray, "__compiled__", {
3049
+ enumerable: false,
3050
+ writable: false,
3051
+ value: true
3052
+ });
3053
+ return callTreeArray;
3054
+ }
3055
+ parse(method, response) {
3056
+ const { outputs } = this.abi.find((abi) => abi.name === method);
3057
+ const responseIterator = response.flat()[Symbol.iterator]();
3058
+ const parsed = outputs.flat().reduce((acc, output, idx) => {
3059
+ const propName = output.name ?? idx;
3060
+ acc[propName] = responseParser(responseIterator, output, this.structs, acc);
3061
+ if (acc[propName] && acc[`${propName}_len`]) {
3062
+ delete acc[`${propName}_len`];
3063
+ }
3064
+ return acc;
3065
+ }, {});
3066
+ return Object.keys(parsed).length === 1 && 0 in parsed ? parsed[0] : parsed;
3067
+ }
3068
+ format(method, response, format) {
3069
+ const parsed = this.parse(method, response);
3070
+ return formatter(parsed, format);
3071
+ }
3072
+ static abiInputsLength(inputs) {
3073
+ return inputs.reduce((acc, input) => !isLen(input.name) ? acc + 1 : acc, 0);
3074
+ }
3075
+ static getAbiStruct(abi) {
3076
+ return abi.filter((abiEntry) => abiEntry.type === "struct").reduce(
3077
+ (acc, abiEntry) => ({
3078
+ ...acc,
3079
+ [abiEntry.name]: abiEntry
3080
+ }),
3081
+ {}
3082
+ );
3083
+ }
3084
+ static toCalldata(rawCalldata = []) {
3085
+ return CallData.compile(rawCalldata);
3086
+ }
3087
+ static toHex(raw = []) {
3088
+ const calldata = CallData.compile(raw);
3089
+ return calldata.map((it) => toHex(it));
3090
+ }
3091
+ };
3092
+
3093
+ // src/utils/fetchPonyfill.ts
3094
+ var import_isomorphic_fetch = __toESM(require("isomorphic-fetch"));
3095
+ var fetchPonyfill_default = typeof window !== "undefined" && window.fetch || typeof global !== "undefined" && global.fetch || import_isomorphic_fetch.default;
3096
+
3097
+ // src/utils/hash.ts
3098
+ var hash_exports = {};
3099
+ __export(hash_exports, {
3100
+ calculateContractAddressFromHash: () => calculateContractAddressFromHash,
3101
+ calculateDeclareTransactionHash: () => calculateDeclareTransactionHash,
3102
+ calculateDeployAccountTransactionHash: () => calculateDeployAccountTransactionHash,
3103
+ calculateDeployTransactionHash: () => calculateDeployTransactionHash,
3104
+ calculateTransactionHash: () => calculateTransactionHash,
3105
+ calculateTransactionHashCommon: () => calculateTransactionHashCommon,
3106
+ computeCompiledClassHash: () => computeCompiledClassHash,
3107
+ computeContractClassHash: () => computeContractClassHash,
3108
+ computeHashOnElements: () => computeHashOnElements,
3109
+ computeLegacyContractClassHash: () => computeLegacyContractClassHash,
3110
+ computeSierraContractClassHash: () => computeSierraContractClassHash,
3111
+ default: () => computeHintedClassHash,
3112
+ feeTransactionVersion: () => feeTransactionVersion,
3113
+ formatSpaces: () => formatSpaces,
3114
+ getSelector: () => getSelector,
3115
+ getSelectorFromName: () => getSelectorFromName,
3116
+ keccakBn: () => keccakBn,
3117
+ poseidon: () => poseidon,
3118
+ starknetKeccak: () => starknetKeccak,
3119
+ transactionVersion: () => transactionVersion,
3120
+ transactionVersion_2: () => transactionVersion_2
3121
+ });
3122
+ var import_micro_starknet2 = require("micro-starknet");
3123
+
3124
+ // src/utils/ec.ts
3125
+ var ec_exports = {};
3126
+ __export(ec_exports, {
3127
+ starkCurve: () => starkCurve,
3128
+ weierstrass: () => weierstrass
3129
+ });
3130
+ var starkCurve = __toESM(require("micro-starknet"));
3131
+ var weierstrass = __toESM(require("@noble/curves/abstract/weierstrass"));
3132
+
3133
+ // src/utils/json.ts
3134
+ var json_exports = {};
3135
+ __export(json_exports, {
3136
+ parse: () => parse2,
3137
+ parseAlwaysAsBig: () => parseAlwaysAsBig,
3138
+ stringify: () => stringify2,
3139
+ stringifyAlwaysAsBig: () => stringifyAlwaysAsBig
3140
+ });
3141
+ var json = __toESM(require("lossless-json"));
3142
+ var parseIntAsNumberOrBigInt = (x) => {
3143
+ if (!json.isInteger(x))
3144
+ return parseFloat(x);
3145
+ const v = parseInt(x, 10);
3146
+ return Number.isSafeInteger(v) ? v : BigInt(x);
3147
+ };
3148
+ var parse2 = (x) => json.parse(String(x), null, parseIntAsNumberOrBigInt);
3149
+ var parseAlwaysAsBig = (x) => json.parse(String(x), null, json.parseNumberAndBigInt);
3150
+ var stringify2 = (...p) => json.stringify(...p);
3151
+ var stringifyAlwaysAsBig = stringify2;
3152
+
3153
+ // src/utils/hash.ts
3154
+ var poseidon = __toESM(require("@noble/curves/abstract/poseidon"));
3155
+ var transactionVersion = 1n;
3156
+ var transactionVersion_2 = 2n;
3157
+ var feeTransactionVersion = 2n ** 128n + transactionVersion;
3158
+ function computeHashOnElements(data) {
3159
+ return [...data, data.length].reduce((x, y) => starkCurve.pedersen(toBigInt(x), toBigInt(y)), 0).toString();
3160
+ }
3161
+ function calculateTransactionHashCommon(txHashPrefix, version, contractAddress, entryPointSelector, calldata, maxFee, chainId, additionalData = []) {
3162
+ const calldataHash = computeHashOnElements(calldata);
3163
+ const dataToHash = [
3164
+ txHashPrefix,
3165
+ version,
3166
+ contractAddress,
3167
+ entryPointSelector,
3168
+ calldataHash,
3169
+ maxFee,
3170
+ chainId,
3171
+ ...additionalData
3172
+ ];
3173
+ return computeHashOnElements(dataToHash);
3174
+ }
3175
+ function calculateDeployTransactionHash(contractAddress, constructorCalldata, version, chainId) {
3176
+ return calculateTransactionHashCommon(
3177
+ "0x6465706c6f79" /* DEPLOY */,
3178
+ version,
3179
+ contractAddress,
3180
+ getSelectorFromName("constructor"),
3181
+ constructorCalldata,
3182
+ 0,
3183
+ chainId
3184
+ );
3185
+ }
3186
+ function calculateDeclareTransactionHash(classHash, senderAddress, version, maxFee, chainId, nonce, compiledClassHash) {
3187
+ return calculateTransactionHashCommon(
3188
+ "0x6465636c617265" /* DECLARE */,
3189
+ version,
3190
+ senderAddress,
3191
+ 0,
3192
+ [classHash],
3193
+ maxFee,
3194
+ chainId,
3195
+ [nonce, ...compiledClassHash ? [compiledClassHash] : []]
3196
+ );
3197
+ }
3198
+ function calculateDeployAccountTransactionHash(contractAddress, classHash, constructorCalldata, salt, version, maxFee, chainId, nonce) {
3199
+ const calldata = [classHash, salt, ...constructorCalldata];
3200
+ return calculateTransactionHashCommon(
3201
+ "0x6465706c6f795f6163636f756e74" /* DEPLOY_ACCOUNT */,
3202
+ version,
3203
+ contractAddress,
3204
+ 0,
3205
+ calldata,
3206
+ maxFee,
3207
+ chainId,
3208
+ [nonce]
3209
+ );
3210
+ }
3211
+ function calculateTransactionHash(contractAddress, version, calldata, maxFee, chainId, nonce) {
3212
+ return calculateTransactionHashCommon(
3213
+ "0x696e766f6b65" /* INVOKE */,
3214
+ version,
3215
+ contractAddress,
3216
+ 0,
3217
+ calldata,
3218
+ maxFee,
3219
+ chainId,
3220
+ [nonce]
3221
+ );
3222
+ }
3223
+ function calculateContractAddressFromHash(salt, classHash, constructorCalldata, deployerAddress) {
3224
+ const compiledCalldata = CallData.compile(constructorCalldata);
3225
+ const constructorCalldataHash = computeHashOnElements(compiledCalldata);
3226
+ const CONTRACT_ADDRESS_PREFIX = felt("0x535441524b4e45545f434f4e54524143545f41444452455353");
3227
+ return computeHashOnElements([
3228
+ CONTRACT_ADDRESS_PREFIX,
3229
+ deployerAddress,
3230
+ salt,
3231
+ classHash,
3232
+ constructorCalldataHash
3233
+ ]);
3234
+ }
3235
+ function nullSkipReplacer(key, value) {
3236
+ if (key === "attributes" || key === "accessible_scopes") {
3237
+ return Array.isArray(value) && value.length === 0 ? void 0 : value;
3259
3238
  }
3260
- compile(method, args) {
3261
- const argsIterator = args[Symbol.iterator]();
3262
- const { inputs } = this.abi.find((abi) => abi.name === method);
3263
- return inputs.reduce(
3264
- (acc, input) => isLen(input.name) ? acc : acc.concat(parseCalldataField(argsIterator, input, this.structs)),
3265
- []
3266
- );
3239
+ if (key === "debug_info") {
3240
+ return null;
3267
3241
  }
3268
- static compile(rawArgs) {
3269
- const createTree = (obj) => {
3270
- const getEntries = (o, prefix = "") => {
3271
- const oe = Array.isArray(o) ? [o.length.toString(), ...o] : o;
3272
- return Object.entries(oe).flatMap(([k, v]) => {
3273
- let value = v;
3274
- if (isLongText(value))
3275
- value = splitLongString(value);
3276
- if (k === "entrypoint")
3277
- value = getSelectorFromName(value);
3278
- const kk = Array.isArray(oe) && k === "0" ? "$$len" : k;
3279
- if (isBigInt(value))
3280
- return [[`${prefix}${kk}`, felt(value)]];
3281
- return Object(value) === value ? getEntries(value, `${prefix}${kk}.`) : [[`${prefix}${kk}`, felt(value)]];
3282
- });
3283
- };
3284
- return Object.fromEntries(getEntries(obj));
3285
- };
3286
- let callTreeArray;
3287
- if (!Array.isArray(rawArgs)) {
3288
- const callTree = createTree(rawArgs);
3289
- callTreeArray = Object.values(callTree);
3242
+ return value === null ? void 0 : value;
3243
+ }
3244
+ function formatSpaces(json2) {
3245
+ let insideQuotes = false;
3246
+ let newString = "";
3247
+ for (const char of json2) {
3248
+ if (char === '"' && newString.endsWith("\\") === false) {
3249
+ insideQuotes = !insideQuotes;
3250
+ }
3251
+ if (insideQuotes) {
3252
+ newString += char;
3290
3253
  } else {
3291
- const callObj = { ...rawArgs };
3292
- const callTree = createTree(callObj);
3293
- callTreeArray = Object.values(callTree);
3254
+ newString += char === ":" ? ": " : char === "," ? ", " : char;
3294
3255
  }
3295
- Object.defineProperty(callTreeArray, "__compiled__", {
3296
- enumerable: false,
3297
- writable: false,
3298
- value: true
3299
- });
3300
- return callTreeArray;
3301
- }
3302
- parse(method, response) {
3303
- const { outputs } = this.abi.find((abi) => abi.name === method);
3304
- const responseIterator = response.flat()[Symbol.iterator]();
3305
- const parsed = outputs.flat().reduce((acc, output, idx) => {
3306
- const propName = output.name ?? idx;
3307
- acc[propName] = responseParser(responseIterator, output, this.structs, acc);
3308
- if (acc[propName] && acc[`${propName}_len`]) {
3309
- delete acc[`${propName}_len`];
3310
- }
3311
- return acc;
3312
- }, {});
3313
- return Object.keys(parsed).length === 1 && 0 in parsed ? parsed[0] : parsed;
3314
- }
3315
- format(method, response, format) {
3316
- const parsed = this.parse(method, response);
3317
- return formatter(parsed, format);
3318
- }
3319
- static abiInputsLength(inputs) {
3320
- return inputs.reduce((acc, input) => !isLen(input.name) ? acc + 1 : acc, 0);
3321
- }
3322
- static getAbiStruct(abi) {
3323
- return abi.filter((abiEntry) => abiEntry.type === "struct").reduce(
3324
- (acc, abiEntry) => ({
3325
- ...acc,
3326
- [abiEntry.name]: abiEntry
3327
- }),
3328
- {}
3329
- );
3330
- }
3331
- static toCalldata(rawCalldata = []) {
3332
- return CallData.compile(rawCalldata);
3333
3256
  }
3334
- static toHex(rawCalldata = []) {
3335
- const calldata = CallData.compile(rawCalldata);
3336
- return calldata.map((it) => toHex(it));
3257
+ return newString;
3258
+ }
3259
+ function computeHintedClassHash(compiledContract) {
3260
+ const { abi, program } = compiledContract;
3261
+ const contractClass = { abi, program };
3262
+ const serializedJson = formatSpaces(stringify2(contractClass, nullSkipReplacer));
3263
+ return addHexPrefix(starkCurve.keccak(utf8ToArray(serializedJson)).toString(16));
3264
+ }
3265
+ function computeLegacyContractClassHash(contract) {
3266
+ const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
3267
+ const apiVersion = toHex(API_VERSION);
3268
+ const externalEntryPointsHash = computeHashOnElements(
3269
+ compiledContract.entry_points_by_type.EXTERNAL.flatMap((e) => [e.selector, e.offset])
3270
+ );
3271
+ const l1HandlerEntryPointsHash = computeHashOnElements(
3272
+ compiledContract.entry_points_by_type.L1_HANDLER.flatMap((e) => [e.selector, e.offset])
3273
+ );
3274
+ const constructorEntryPointHash = computeHashOnElements(
3275
+ compiledContract.entry_points_by_type.CONSTRUCTOR.flatMap((e) => [e.selector, e.offset])
3276
+ );
3277
+ const builtinsHash = computeHashOnElements(
3278
+ compiledContract.program.builtins.map((s) => encodeShortString(s))
3279
+ );
3280
+ const hintedClassHash = computeHintedClassHash(compiledContract);
3281
+ const dataHash = computeHashOnElements(compiledContract.program.data);
3282
+ return computeHashOnElements([
3283
+ apiVersion,
3284
+ externalEntryPointsHash,
3285
+ l1HandlerEntryPointsHash,
3286
+ constructorEntryPointHash,
3287
+ builtinsHash,
3288
+ hintedClassHash,
3289
+ dataHash
3290
+ ]);
3291
+ }
3292
+ function hashBuiltins(builtins) {
3293
+ return (0, import_micro_starknet2.poseidonHashMany)(
3294
+ builtins.flatMap((it) => {
3295
+ return BigInt(encodeShortString(it));
3296
+ })
3297
+ );
3298
+ }
3299
+ function hashEntryPoint(data) {
3300
+ const base = data.flatMap((it) => {
3301
+ return [BigInt(it.selector), BigInt(it.offset), hashBuiltins(it.builtins)];
3302
+ });
3303
+ return (0, import_micro_starknet2.poseidonHashMany)(base);
3304
+ }
3305
+ function computeCompiledClassHash(casm) {
3306
+ const COMPILED_CLASS_VERSION = "COMPILED_CLASS_V1";
3307
+ const compiledClassVersion = BigInt(encodeShortString(COMPILED_CLASS_VERSION));
3308
+ const externalEntryPointsHash = hashEntryPoint(casm.entry_points_by_type.EXTERNAL);
3309
+ const l1Handlers = hashEntryPoint(casm.entry_points_by_type.L1_HANDLER);
3310
+ const constructor = hashEntryPoint(casm.entry_points_by_type.CONSTRUCTOR);
3311
+ const bytecode = (0, import_micro_starknet2.poseidonHashMany)(casm.bytecode.map((it) => BigInt(it)));
3312
+ return toHex(
3313
+ (0, import_micro_starknet2.poseidonHashMany)([
3314
+ compiledClassVersion,
3315
+ externalEntryPointsHash,
3316
+ l1Handlers,
3317
+ constructor,
3318
+ bytecode
3319
+ ])
3320
+ );
3321
+ }
3322
+ function hashEntryPointSierra(data) {
3323
+ const base = data.flatMap((it) => {
3324
+ return [BigInt(it.selector), BigInt(it.function_idx)];
3325
+ });
3326
+ return (0, import_micro_starknet2.poseidonHashMany)(base);
3327
+ }
3328
+ function hashAbi(sierra) {
3329
+ const indentString = formatSpaces(stringify2(sierra.abi, null));
3330
+ return BigInt(addHexPrefix(starkCurve.keccak(utf8ToArray(indentString)).toString(16)));
3331
+ }
3332
+ function computeSierraContractClassHash(sierra) {
3333
+ const CONTRACT_CLASS_VERSION = "CONTRACT_CLASS_V0.1.0";
3334
+ const compiledClassVersion = BigInt(encodeShortString(CONTRACT_CLASS_VERSION));
3335
+ const externalEntryPointsHash = hashEntryPointSierra(sierra.entry_points_by_type.EXTERNAL);
3336
+ const l1Handlers = hashEntryPointSierra(sierra.entry_points_by_type.L1_HANDLER);
3337
+ const constructor = hashEntryPointSierra(sierra.entry_points_by_type.CONSTRUCTOR);
3338
+ const abiHash = hashAbi(sierra);
3339
+ const sierraProgram = (0, import_micro_starknet2.poseidonHashMany)(sierra.sierra_program.map((it) => BigInt(it)));
3340
+ return toHex(
3341
+ (0, import_micro_starknet2.poseidonHashMany)([
3342
+ compiledClassVersion,
3343
+ externalEntryPointsHash,
3344
+ l1Handlers,
3345
+ constructor,
3346
+ abiHash,
3347
+ sierraProgram
3348
+ ])
3349
+ );
3350
+ }
3351
+ function computeContractClassHash(contract) {
3352
+ const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
3353
+ if ("sierra_program" in compiledContract) {
3354
+ return computeSierraContractClassHash(compiledContract);
3337
3355
  }
3338
- };
3339
-
3340
- // src/utils/fetchPonyfill.ts
3341
- var import_isomorphic_fetch = __toESM(require("isomorphic-fetch"));
3342
- var fetchPonyfill_default = typeof window !== "undefined" && window.fetch || typeof global !== "undefined" && global.fetch || import_isomorphic_fetch.default;
3356
+ return computeLegacyContractClassHash(compiledContract);
3357
+ }
3343
3358
 
3344
3359
  // src/utils/contract.ts
3345
3360
  function isSierra(contract) {
@@ -3374,7 +3389,7 @@ __export(stark_exports, {
3374
3389
  signatureToDecimalArray: () => signatureToDecimalArray,
3375
3390
  signatureToHexArray: () => signatureToHexArray
3376
3391
  });
3377
- var import_micro_starknet2 = require("micro-starknet");
3392
+ var import_micro_starknet3 = require("micro-starknet");
3378
3393
  var import_pako = require("pako");
3379
3394
  function compressProgram(jsonProgram) {
3380
3395
  const stringified = typeof jsonProgram === "string" ? jsonProgram : stringify2(jsonProgram);
@@ -3382,8 +3397,8 @@ function compressProgram(jsonProgram) {
3382
3397
  return btoaUniversal(compressedProgram);
3383
3398
  }
3384
3399
  function randomAddress() {
3385
- const randomKeyPair = import_micro_starknet2.utils.randomPrivateKey();
3386
- return (0, import_micro_starknet2.getStarkKey)(randomKeyPair);
3400
+ const randomKeyPair = import_micro_starknet3.utils.randomPrivateKey();
3401
+ return (0, import_micro_starknet3.getStarkKey)(randomKeyPair);
3387
3402
  }
3388
3403
  function makeAddress(input) {
3389
3404
  return addHexPrefix(input).toLowerCase();
@@ -3878,7 +3893,7 @@ var RpcProvider = class {
3878
3893
  return this.fetchEndpoint("starknet_estimateFee", {
3879
3894
  request: {
3880
3895
  type: RPC.TransactionType.DEPLOY_ACCOUNT,
3881
- constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []),
3896
+ constructor_calldata: CallData.toHex(constructorCalldata || []),
3882
3897
  class_hash: toHex(classHash),
3883
3898
  contract_address_salt: toHex(addressSalt || 0),
3884
3899
  signature: signatureToHexArray(signature),
@@ -3915,7 +3930,7 @@ var RpcProvider = class {
3915
3930
  async deployAccountContract({ classHash, constructorCalldata, addressSalt, signature }, details) {
3916
3931
  return this.fetchEndpoint("starknet_addDeployAccountTransaction", {
3917
3932
  deploy_account_transaction: {
3918
- constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []),
3933
+ constructor_calldata: CallData.toHex(constructorCalldata || []),
3919
3934
  class_hash: toHex(classHash),
3920
3935
  contract_address_salt: toHex(addressSalt || 0),
3921
3936
  type: RPC.TransactionType.DEPLOY_ACCOUNT,
@@ -4353,7 +4368,7 @@ var SequencerProvider = class {
4353
4368
  {
4354
4369
  contract_address: contractAddress,
4355
4370
  entry_point_selector: getSelectorFromName(entryPointSelector),
4356
- calldata
4371
+ calldata: CallData.compile(calldata)
4357
4372
  }
4358
4373
  ).then(this.responseParser.parseCallContractResponse);
4359
4374
  }
@@ -4467,7 +4482,7 @@ var SequencerProvider = class {
4467
4482
  {
4468
4483
  type: "INVOKE_FUNCTION" /* INVOKE */,
4469
4484
  sender_address: invocation.contractAddress,
4470
- calldata: invocation.calldata ?? [],
4485
+ calldata: CallData.compile(invocation.calldata ?? []),
4471
4486
  signature: signatureToDecimalArray(invocation.signature),
4472
4487
  version: toHex((invocationDetails == null ? void 0 : invocationDetails.version) || 1),
4473
4488
  nonce: toHex(invocationDetails.nonce)
@@ -4525,7 +4540,7 @@ var SequencerProvider = class {
4525
4540
  res = {
4526
4541
  type: invocation.type,
4527
4542
  sender_address: invocation.contractAddress,
4528
- calldata: invocation.calldata ?? []
4543
+ calldata: CallData.compile(invocation.calldata ?? [])
4529
4544
  };
4530
4545
  } else if (invocation.type === "DECLARE") {
4531
4546
  res = {
@@ -4608,7 +4623,7 @@ ${res.tx_failure_reason.error_message}` : res.tx_status;
4608
4623
  {
4609
4624
  type: "INVOKE_FUNCTION",
4610
4625
  sender_address: invocation.contractAddress,
4611
- calldata: invocation.calldata ?? [],
4626
+ calldata: CallData.compile(invocation.calldata ?? []),
4612
4627
  signature: signatureToDecimalArray(invocation.signature),
4613
4628
  version: toHex((invocationDetails == null ? void 0 : invocationDetails.version) || 1),
4614
4629
  nonce: toHex(invocationDetails.nonce),
@@ -5021,7 +5036,7 @@ var transformCallsToMulticallArrays = (calls) => {
5021
5036
  const callArray = [];
5022
5037
  const calldata = [];
5023
5038
  calls.forEach((call) => {
5024
- const data = call.calldata || [];
5039
+ const data = CallData.compile(call.calldata || []);
5025
5040
  callArray.push({
5026
5041
  to: toBigInt(call.contractAddress).toString(10),
5027
5042
  selector: toBigInt(getSelectorFromName(call.entrypoint)).toString(10),
@@ -5310,7 +5325,7 @@ var Signer = class {
5310
5325
  const msgHash = calculateDeployAccountTransactionHash(
5311
5326
  contractAddress,
5312
5327
  classHash,
5313
- constructorCalldata,
5328
+ CallData.compile(constructorCalldata),
5314
5329
  addressSalt,
5315
5330
  version,
5316
5331
  maxFee,
@@ -5366,10 +5381,12 @@ function parseUDCEvent(txReceipt) {
5366
5381
 
5367
5382
  // src/account/default.ts
5368
5383
  var Account = class extends Provider {
5369
- constructor(providerOrOptions, address, pkOrSigner) {
5384
+ constructor(providerOrOptions, address, pkOrSigner, cairoVersion = "0") {
5370
5385
  super(providerOrOptions);
5386
+ this.deploySelf = this.deployAccount;
5371
5387
  this.address = address.toLowerCase();
5372
5388
  this.signer = typeof pkOrSigner === "string" || pkOrSigner instanceof Uint8Array ? new Signer(pkOrSigner) : pkOrSigner;
5389
+ this.cairoVersion = cairoVersion;
5373
5390
  }
5374
5391
  async getNonce(blockIdentifier) {
5375
5392
  return super.getNonceForAddress(this.address, blockIdentifier);
@@ -5377,7 +5394,7 @@ var Account = class extends Provider {
5377
5394
  async estimateFee(calls, estimateFeeDetails) {
5378
5395
  return this.estimateInvokeFee(calls, estimateFeeDetails);
5379
5396
  }
5380
- async estimateInvokeFee(calls, { nonce: providedNonce, blockIdentifier, skipValidate, cairoVersion } = {}) {
5397
+ async estimateInvokeFee(calls, { nonce: providedNonce, blockIdentifier, skipValidate } = {}) {
5381
5398
  const transactions = Array.isArray(calls) ? calls : [calls];
5382
5399
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5383
5400
  const version = toBigInt(feeTransactionVersion);
@@ -5388,7 +5405,7 @@ var Account = class extends Provider {
5388
5405
  maxFee: ZERO,
5389
5406
  version,
5390
5407
  chainId,
5391
- cairoVersion: cairoVersion ?? "0"
5408
+ cairoVersion: this.cairoVersion
5392
5409
  };
5393
5410
  const invocation = await this.buildInvocation(transactions, signerDetails);
5394
5411
  const response = await super.getInvokeEstimateFee(
@@ -5403,7 +5420,7 @@ var Account = class extends Provider {
5403
5420
  suggestedMaxFee
5404
5421
  };
5405
5422
  }
5406
- async estimateDeclareFee({ contract, classHash: providedClassHash, casm, compiledClassHash }, { blockIdentifier, nonce: providedNonce, skipValidate, cairoVersion } = {}) {
5423
+ async estimateDeclareFee({ contract, classHash: providedClassHash, casm, compiledClassHash }, { blockIdentifier, nonce: providedNonce, skipValidate } = {}) {
5407
5424
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5408
5425
  const version = !isSierra(contract) ? toBigInt(feeTransactionVersion) : transactionVersion_2;
5409
5426
  const chainId = await this.getChainId();
@@ -5415,7 +5432,7 @@ var Account = class extends Provider {
5415
5432
  version,
5416
5433
  walletAddress: this.address,
5417
5434
  maxFee: ZERO,
5418
- cairoVersion: cairoVersion ?? "0"
5435
+ cairoVersion: this.cairoVersion
5419
5436
  }
5420
5437
  );
5421
5438
  const response = await super.getDeclareEstimateFee(
@@ -5435,7 +5452,7 @@ var Account = class extends Provider {
5435
5452
  addressSalt = 0,
5436
5453
  constructorCalldata = [],
5437
5454
  contractAddress: providedContractAddress
5438
- }, { blockIdentifier, skipValidate, cairoVersion } = {}) {
5455
+ }, { blockIdentifier, skipValidate } = {}) {
5439
5456
  const version = toBigInt(feeTransactionVersion);
5440
5457
  const nonce = ZERO;
5441
5458
  const chainId = await this.getChainId();
@@ -5447,7 +5464,7 @@ var Account = class extends Provider {
5447
5464
  version,
5448
5465
  walletAddress: this.address,
5449
5466
  maxFee: ZERO,
5450
- cairoVersion: cairoVersion ?? "0"
5467
+ cairoVersion: this.cairoVersion
5451
5468
  }
5452
5469
  );
5453
5470
  const response = await super.getDeployAccountEstimateFee(
@@ -5466,7 +5483,7 @@ var Account = class extends Provider {
5466
5483
  const calls = this.buildUDCContractPayload(payload);
5467
5484
  return this.estimateInvokeFee(calls, transactionsDetail);
5468
5485
  }
5469
- async estimateFeeBulk(transactions, { nonce: providedNonce, blockIdentifier, cairoVersion } = {}) {
5486
+ async estimateFeeBulk(transactions, { nonce: providedNonce, blockIdentifier } = {}) {
5470
5487
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5471
5488
  const version = toBigInt(feeTransactionVersion);
5472
5489
  const chainId = await this.getChainId();
@@ -5478,7 +5495,7 @@ var Account = class extends Provider {
5478
5495
  maxFee: ZERO,
5479
5496
  version,
5480
5497
  chainId,
5481
- cairoVersion: cairoVersion ?? "0"
5498
+ cairoVersion: this.cairoVersion
5482
5499
  };
5483
5500
  const txPayload = transaction.payload;
5484
5501
  let res;
@@ -5536,7 +5553,7 @@ var Account = class extends Provider {
5536
5553
  });
5537
5554
  }
5538
5555
  async buildInvocation(call, signerDetails) {
5539
- const calldata = getExecuteCalldata(call, signerDetails.cairoVersion);
5556
+ const calldata = getExecuteCalldata(call, this.cairoVersion);
5540
5557
  const signature = await this.signer.signTransaction(call, signerDetails);
5541
5558
  return {
5542
5559
  contractAddress: this.address,
@@ -5553,17 +5570,16 @@ var Account = class extends Provider {
5553
5570
  );
5554
5571
  const version = toBigInt(transactionVersion);
5555
5572
  const chainId = await this.getChainId();
5556
- const cairoVersion = transactionsDetail.cairoVersion ?? "0";
5557
5573
  const signerDetails = {
5558
5574
  walletAddress: this.address,
5559
5575
  nonce,
5560
5576
  maxFee,
5561
5577
  version,
5562
5578
  chainId,
5563
- cairoVersion
5579
+ cairoVersion: this.cairoVersion
5564
5580
  };
5565
5581
  const signature = await this.signer.signTransaction(transactions, signerDetails, abis);
5566
- const calldata = getExecuteCalldata(transactions, cairoVersion);
5582
+ const calldata = getExecuteCalldata(transactions, this.cairoVersion);
5567
5583
  return this.invokeFunction(
5568
5584
  { contractAddress: this.address, calldata, signature },
5569
5585
  {
@@ -5573,6 +5589,18 @@ var Account = class extends Provider {
5573
5589
  }
5574
5590
  );
5575
5591
  }
5592
+ async declareIfNot(payload, transactionsDetail = {}) {
5593
+ const declareContractPayload = extractContractHashes(payload);
5594
+ try {
5595
+ await this.getClassByHash(declareContractPayload.classHash);
5596
+ } catch (error) {
5597
+ return this.declare(payload, transactionsDetail);
5598
+ }
5599
+ return {
5600
+ transaction_hash: "",
5601
+ class_hash: declareContractPayload.classHash
5602
+ };
5603
+ }
5576
5604
  async declare(payload, transactionsDetail = {}) {
5577
5605
  const declareContractPayload = extractContractHashes(payload);
5578
5606
  const details = {};
@@ -5589,7 +5617,7 @@ var Account = class extends Provider {
5589
5617
  const declareContractTransaction = await this.buildDeclarePayload(declareContractPayload, {
5590
5618
  ...details,
5591
5619
  walletAddress: this.address,
5592
- cairoVersion: transactionsDetail.cairoVersion ?? "0"
5620
+ cairoVersion: this.cairoVersion
5593
5621
  });
5594
5622
  return this.declareContract(declareContractTransaction, details);
5595
5623
  }
@@ -5625,10 +5653,7 @@ var Account = class extends Provider {
5625
5653
  });
5626
5654
  const calls = params.map((it) => it.call);
5627
5655
  const addresses = params.map((it) => it.address);
5628
- const invokeResponse = await this.execute(calls, void 0, {
5629
- ...details,
5630
- cairoVersion: "0"
5631
- });
5656
+ const invokeResponse = await this.execute(calls, void 0, details);
5632
5657
  return {
5633
5658
  ...invokeResponse,
5634
5659
  contract_address: addresses
@@ -5643,15 +5668,18 @@ var Account = class extends Provider {
5643
5668
  }
5644
5669
  async declareAndDeploy(payload, details) {
5645
5670
  const { constructorCalldata, salt, unique } = payload;
5646
- const { transaction_hash, class_hash } = await this.declare(payload, details);
5647
- const declare = await this.waitForTransaction(transaction_hash, {
5648
- successStates: ["ACCEPTED_ON_L2" /* ACCEPTED_ON_L2 */]
5649
- });
5671
+ let declare = await this.declareIfNot(payload, details);
5672
+ if (declare.transaction_hash !== "") {
5673
+ const tx = await this.waitForTransaction(declare.transaction_hash, {
5674
+ successStates: ["ACCEPTED_ON_L2" /* ACCEPTED_ON_L2 */]
5675
+ });
5676
+ declare = { ...declare, ...tx };
5677
+ }
5650
5678
  const deploy = await this.deployContract(
5651
- { classHash: class_hash, salt, unique, constructorCalldata },
5679
+ { classHash: declare.class_hash, salt, unique, constructorCalldata },
5652
5680
  details
5653
5681
  );
5654
- return { declare: { ...declare, class_hash }, deploy };
5682
+ return { declare: { ...declare }, deploy };
5655
5683
  }
5656
5684
  async deployAccount({
5657
5685
  classHash,
@@ -5667,13 +5695,18 @@ var Account = class extends Provider {
5667
5695
  const maxFee = transactionsDetail.maxFee ?? await this.getSuggestedMaxFee(
5668
5696
  {
5669
5697
  type: "DEPLOY_ACCOUNT" /* DEPLOY_ACCOUNT */,
5670
- payload: { classHash, constructorCalldata, addressSalt, contractAddress }
5698
+ payload: {
5699
+ classHash,
5700
+ constructorCalldata: compiledCalldata,
5701
+ addressSalt,
5702
+ contractAddress
5703
+ }
5671
5704
  },
5672
5705
  transactionsDetail
5673
5706
  );
5674
5707
  const signature = await this.signer.signDeployAccountTransaction({
5675
5708
  classHash,
5676
- constructorCalldata,
5709
+ constructorCalldata: compiledCalldata,
5677
5710
  contractAddress,
5678
5711
  addressSalt,
5679
5712
  chainId,
@@ -5771,12 +5804,12 @@ var Account = class extends Provider {
5771
5804
  version,
5772
5805
  nonce,
5773
5806
  addressSalt,
5774
- constructorCalldata
5807
+ constructorCalldata: compiledCalldata
5775
5808
  });
5776
5809
  return {
5777
5810
  classHash,
5778
5811
  addressSalt,
5779
- constructorCalldata,
5812
+ constructorCalldata: compiledCalldata,
5780
5813
  signature
5781
5814
  };
5782
5815
  }
@@ -5803,7 +5836,7 @@ var Account = class extends Provider {
5803
5836
  });
5804
5837
  return calls;
5805
5838
  }
5806
- async simulateTransaction(calls, { nonce: providedNonce, blockIdentifier, skipValidate, cairoVersion } = {}) {
5839
+ async simulateTransaction(calls, { nonce: providedNonce, blockIdentifier, skipValidate } = {}) {
5807
5840
  const transactions = Array.isArray(calls) ? calls : [calls];
5808
5841
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5809
5842
  const version = toBigInt(feeTransactionVersion);
@@ -5814,7 +5847,7 @@ var Account = class extends Provider {
5814
5847
  maxFee: ZERO,
5815
5848
  version,
5816
5849
  chainId,
5817
- cairoVersion: cairoVersion ?? "0"
5850
+ cairoVersion: this.cairoVersion
5818
5851
  };
5819
5852
  const invocation = await this.buildInvocation(transactions, signerDetails);
5820
5853
  const response = await super.getSimulateTransaction(