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.mjs CHANGED
@@ -50,55 +50,27 @@ function assert(condition, message) {
50
50
  }
51
51
  }
52
52
 
53
- // src/utils/hash.ts
54
- var hash_exports = {};
55
- __export(hash_exports, {
56
- calculateContractAddressFromHash: () => calculateContractAddressFromHash,
57
- calculateDeclareTransactionHash: () => calculateDeclareTransactionHash,
58
- calculateDeployAccountTransactionHash: () => calculateDeployAccountTransactionHash,
59
- calculateDeployTransactionHash: () => calculateDeployTransactionHash,
60
- calculateTransactionHash: () => calculateTransactionHash,
61
- calculateTransactionHashCommon: () => calculateTransactionHashCommon,
62
- computeCompiledClassHash: () => computeCompiledClassHash,
63
- computeContractClassHash: () => computeContractClassHash,
64
- computeHashOnElements: () => computeHashOnElements,
65
- computeLegacyContractClassHash: () => computeLegacyContractClassHash,
66
- computeSierraContractClassHash: () => computeSierraContractClassHash,
67
- default: () => computeHintedClassHash,
68
- feeTransactionVersion: () => feeTransactionVersion,
69
- formatSpaces: () => formatSpaces,
70
- getSelector: () => getSelector,
71
- getSelectorFromName: () => getSelectorFromName,
72
- keccakBn: () => keccakBn,
73
- poseidon: () => poseidon,
74
- starknetKeccak: () => starknetKeccak,
75
- transactionVersion: () => transactionVersion,
76
- transactionVersion_2: () => transactionVersion_2
77
- });
78
- import { keccak, poseidonHashMany } from "micro-starknet";
79
-
80
- // src/constants.ts
81
- var constants_exports = {};
82
- __export(constants_exports, {
83
- ALPHA: () => ALPHA,
84
- API_VERSION: () => API_VERSION,
85
- BETA: () => BETA,
86
- BaseUrl: () => BaseUrl,
87
- CONSTANT_POINTS: () => CONSTANT_POINTS,
88
- EC_ORDER: () => EC_ORDER,
89
- FIELD_GEN: () => FIELD_GEN,
90
- FIELD_PRIME: () => FIELD_PRIME,
91
- FIELD_SIZE: () => FIELD_SIZE,
92
- IS_BROWSER: () => IS_BROWSER,
93
- MASK_250: () => MASK_250,
94
- MASK_251: () => MASK_251,
95
- MAX_ECDSA_VAL: () => MAX_ECDSA_VAL,
96
- NetworkName: () => NetworkName,
97
- StarknetChainId: () => StarknetChainId,
98
- TransactionHashPrefix: () => TransactionHashPrefix,
99
- UDC: () => UDC,
100
- ZERO: () => ZERO
53
+ // src/utils/num.ts
54
+ var num_exports = {};
55
+ __export(num_exports, {
56
+ assertInRange: () => assertInRange,
57
+ bigNumberishArrayToDecimalStringArray: () => bigNumberishArrayToDecimalStringArray,
58
+ bigNumberishArrayToHexadecimalStringArray: () => bigNumberishArrayToHexadecimalStringArray,
59
+ cleanHex: () => cleanHex,
60
+ getDecimalString: () => getDecimalString,
61
+ getHexString: () => getHexString,
62
+ getHexStringArray: () => getHexStringArray,
63
+ hexToBytes: () => hexToBytes,
64
+ hexToDecimalString: () => hexToDecimalString,
65
+ isBigInt: () => isBigInt,
66
+ isHex: () => isHex,
67
+ isStringWholeNumber: () => isStringWholeNumber,
68
+ toBigInt: () => toBigInt,
69
+ toCairoBool: () => toCairoBool,
70
+ toHex: () => toHex,
71
+ toHexString: () => toHexString
101
72
  });
73
+ import { hexToBytes as hexToBytesNoble } from "@noble/curves/abstract/utils";
102
74
 
103
75
  // src/utils/encode.ts
104
76
  var encode_exports = {};
@@ -163,7 +135,98 @@ function utf8ToArray(str) {
163
135
  return new TextEncoder().encode(str);
164
136
  }
165
137
 
138
+ // src/utils/num.ts
139
+ function isHex(hex) {
140
+ return /^0x[0-9a-f]*$/i.test(hex);
141
+ }
142
+ function toBigInt(value) {
143
+ return BigInt(value);
144
+ }
145
+ function isBigInt(value) {
146
+ return typeof value === "bigint";
147
+ }
148
+ function toHex(number2) {
149
+ return addHexPrefix(toBigInt(number2).toString(16));
150
+ }
151
+ function hexToDecimalString(hex) {
152
+ return BigInt(addHexPrefix(hex)).toString(10);
153
+ }
154
+ var cleanHex = (hex) => hex.toLowerCase().replace(/^(0x)0+/, "$1");
155
+ function assertInRange(input, lowerBound, upperBound, inputName = "") {
156
+ const messageSuffix = inputName === "" ? "invalid length" : `invalid ${inputName} length`;
157
+ const inputBigInt = BigInt(input);
158
+ const lowerBoundBigInt = BigInt(lowerBound);
159
+ const upperBoundBigInt = BigInt(upperBound);
160
+ assert(
161
+ inputBigInt >= lowerBoundBigInt && inputBigInt <= upperBoundBigInt,
162
+ `Message not signable, ${messageSuffix}.`
163
+ );
164
+ }
165
+ function bigNumberishArrayToDecimalStringArray(rawCalldata) {
166
+ return rawCalldata.map((x) => toBigInt(x).toString(10));
167
+ }
168
+ function bigNumberishArrayToHexadecimalStringArray(rawCalldata) {
169
+ return rawCalldata.map((x) => toHex(x));
170
+ }
171
+ var isStringWholeNumber = (value) => /^\d+$/.test(value);
172
+ var toHexString = (value) => toHex(value);
173
+ function getDecimalString(value) {
174
+ if (isHex(value)) {
175
+ return hexToDecimalString(value);
176
+ }
177
+ if (isStringWholeNumber(value)) {
178
+ return value;
179
+ }
180
+ throw new Error(`${value} need to be hex-string or whole-number-string`);
181
+ }
182
+ function getHexString(value) {
183
+ if (isHex(value)) {
184
+ return value;
185
+ }
186
+ if (isStringWholeNumber(value)) {
187
+ return toHexString(value);
188
+ }
189
+ throw new Error(`${value} need to be hex-string or whole-number-string`);
190
+ }
191
+ function getHexStringArray(value) {
192
+ return value.map((el) => getHexString(el));
193
+ }
194
+ var toCairoBool = (value) => (+value).toString();
195
+ function hexToBytes(value) {
196
+ if (!isHex(value))
197
+ throw new Error(`${value} need to be a hex-string`);
198
+ let adaptedValue = removeHexPrefix(value);
199
+ if (adaptedValue.length % 2 !== 0) {
200
+ adaptedValue = `0${adaptedValue}`;
201
+ }
202
+ return hexToBytesNoble(adaptedValue);
203
+ }
204
+
205
+ // src/utils/selector.ts
206
+ import { keccak } from "micro-starknet";
207
+
166
208
  // src/constants.ts
209
+ var constants_exports = {};
210
+ __export(constants_exports, {
211
+ ALPHA: () => ALPHA,
212
+ API_VERSION: () => API_VERSION,
213
+ BETA: () => BETA,
214
+ BaseUrl: () => BaseUrl,
215
+ CONSTANT_POINTS: () => CONSTANT_POINTS,
216
+ EC_ORDER: () => EC_ORDER,
217
+ FIELD_GEN: () => FIELD_GEN,
218
+ FIELD_PRIME: () => FIELD_PRIME,
219
+ FIELD_SIZE: () => FIELD_SIZE,
220
+ IS_BROWSER: () => IS_BROWSER,
221
+ MASK_250: () => MASK_250,
222
+ MASK_251: () => MASK_251,
223
+ MAX_ECDSA_VAL: () => MAX_ECDSA_VAL,
224
+ NetworkName: () => NetworkName,
225
+ StarknetChainId: () => StarknetChainId,
226
+ TransactionHashPrefix: () => TransactionHashPrefix,
227
+ UDC: () => UDC,
228
+ ZERO: () => ZERO
229
+ });
167
230
  var ZERO = 0n;
168
231
  var MASK_250 = 2n ** 250n - 1n;
169
232
  var MASK_251 = 2n ** 251n;
@@ -2232,6 +2295,83 @@ var CONSTANT_POINTS = [
2232
2295
  ]
2233
2296
  ];
2234
2297
 
2298
+ // src/utils/selector.ts
2299
+ function keccakBn(value) {
2300
+ const hexWithoutPrefix = removeHexPrefix(toHex(BigInt(value)));
2301
+ const evenHex = hexWithoutPrefix.length % 2 === 0 ? hexWithoutPrefix : `0${hexWithoutPrefix}`;
2302
+ return addHexPrefix(keccak(hexToBytes(addHexPrefix(evenHex))).toString(16));
2303
+ }
2304
+ function keccakHex(value) {
2305
+ return addHexPrefix(keccak(utf8ToArray(value)).toString(16));
2306
+ }
2307
+ function starknetKeccak(value) {
2308
+ const hash = BigInt(keccakHex(value));
2309
+ return hash & MASK_250;
2310
+ }
2311
+ function getSelectorFromName(funcName) {
2312
+ return toHex(starknetKeccak(funcName));
2313
+ }
2314
+ function getSelector(value) {
2315
+ if (isHex(value)) {
2316
+ return value;
2317
+ }
2318
+ if (isStringWholeNumber(value)) {
2319
+ return toHexString(value);
2320
+ }
2321
+ return getSelectorFromName(value);
2322
+ }
2323
+
2324
+ // src/utils/shortString.ts
2325
+ var shortString_exports = {};
2326
+ __export(shortString_exports, {
2327
+ decodeShortString: () => decodeShortString,
2328
+ encodeShortString: () => encodeShortString,
2329
+ isASCII: () => isASCII,
2330
+ isDecimalString: () => isDecimalString,
2331
+ isLongText: () => isLongText,
2332
+ isShortString: () => isShortString,
2333
+ isShortText: () => isShortText,
2334
+ isText: () => isText,
2335
+ splitLongString: () => splitLongString
2336
+ });
2337
+ var TEXT_TO_FELT_MAX_LEN = 31;
2338
+ function isASCII(str) {
2339
+ return /^[\x00-\x7F]*$/.test(str);
2340
+ }
2341
+ function isShortString(str) {
2342
+ return str.length <= TEXT_TO_FELT_MAX_LEN;
2343
+ }
2344
+ function isDecimalString(decim) {
2345
+ return /^[0-9]*$/i.test(decim);
2346
+ }
2347
+ function isText(val) {
2348
+ return typeof val === "string" && !isHex(val) && !isStringWholeNumber(val);
2349
+ }
2350
+ var isShortText = (val) => isText(val) && isShortString(val);
2351
+ var isLongText = (val) => isText(val) && !isShortString(val);
2352
+ function splitLongString(longStr) {
2353
+ const regex = RegExp(`[^]{1,${TEXT_TO_FELT_MAX_LEN}}`, "g");
2354
+ return longStr.match(regex) || [];
2355
+ }
2356
+ function encodeShortString(str) {
2357
+ if (!isASCII(str))
2358
+ throw new Error(`${str} is not an ASCII string`);
2359
+ if (!isShortString(str))
2360
+ throw new Error(`${str} is too long`);
2361
+ return addHexPrefix(str.replace(/./g, (char) => char.charCodeAt(0).toString(16)));
2362
+ }
2363
+ function decodeShortString(str) {
2364
+ if (!isASCII(str))
2365
+ throw new Error(`${str} is not an ASCII string`);
2366
+ if (isHex(str)) {
2367
+ return removeHexPrefix(str).replace(/.{2}/g, (hex) => String.fromCharCode(parseInt(hex, 16)));
2368
+ }
2369
+ if (isDecimalString(str)) {
2370
+ return decodeShortString("0X".concat(BigInt(str).toString(16)));
2371
+ }
2372
+ throw new Error(`${str} is not Hex or decimal`);
2373
+ }
2374
+
2235
2375
  // src/utils/calldata/cairo.ts
2236
2376
  var cairo_exports = {};
2237
2377
  __export(cairo_exports, {
@@ -2253,144 +2393,6 @@ __export(cairo_exports, {
2253
2393
  uint256: () => uint256
2254
2394
  });
2255
2395
 
2256
- // src/utils/num.ts
2257
- var num_exports = {};
2258
- __export(num_exports, {
2259
- assertInRange: () => assertInRange,
2260
- bigNumberishArrayToDecimalStringArray: () => bigNumberishArrayToDecimalStringArray,
2261
- bigNumberishArrayToHexadecimalStringArray: () => bigNumberishArrayToHexadecimalStringArray,
2262
- cleanHex: () => cleanHex,
2263
- getDecimalString: () => getDecimalString,
2264
- getHexString: () => getHexString,
2265
- getHexStringArray: () => getHexStringArray,
2266
- hexToBytes: () => hexToBytes,
2267
- hexToDecimalString: () => hexToDecimalString,
2268
- isBigInt: () => isBigInt,
2269
- isHex: () => isHex,
2270
- isStringWholeNumber: () => isStringWholeNumber,
2271
- toBigInt: () => toBigInt,
2272
- toCairoBool: () => toCairoBool,
2273
- toHex: () => toHex,
2274
- toHexString: () => toHexString
2275
- });
2276
- import { hexToBytes as hexToBytesNoble } from "@noble/curves/abstract/utils";
2277
- function isHex(hex) {
2278
- return /^0x[0-9a-f]*$/i.test(hex);
2279
- }
2280
- function toBigInt(value) {
2281
- return BigInt(value);
2282
- }
2283
- function isBigInt(value) {
2284
- return typeof value === "bigint";
2285
- }
2286
- function toHex(number2) {
2287
- return addHexPrefix(toBigInt(number2).toString(16));
2288
- }
2289
- function hexToDecimalString(hex) {
2290
- return BigInt(addHexPrefix(hex)).toString(10);
2291
- }
2292
- var cleanHex = (hex) => hex.toLowerCase().replace(/^(0x)0+/, "$1");
2293
- function assertInRange(input, lowerBound, upperBound, inputName = "") {
2294
- const messageSuffix = inputName === "" ? "invalid length" : `invalid ${inputName} length`;
2295
- const inputBigInt = BigInt(input);
2296
- const lowerBoundBigInt = BigInt(lowerBound);
2297
- const upperBoundBigInt = BigInt(upperBound);
2298
- assert(
2299
- inputBigInt >= lowerBoundBigInt && inputBigInt <= upperBoundBigInt,
2300
- `Message not signable, ${messageSuffix}.`
2301
- );
2302
- }
2303
- function bigNumberishArrayToDecimalStringArray(rawCalldata) {
2304
- return rawCalldata.map((x) => toBigInt(x).toString(10));
2305
- }
2306
- function bigNumberishArrayToHexadecimalStringArray(rawCalldata) {
2307
- return rawCalldata.map((x) => toHex(x));
2308
- }
2309
- var isStringWholeNumber = (value) => /^\d+$/.test(value);
2310
- var toHexString = (value) => toHex(value);
2311
- function getDecimalString(value) {
2312
- if (isHex(value)) {
2313
- return hexToDecimalString(value);
2314
- }
2315
- if (isStringWholeNumber(value)) {
2316
- return value;
2317
- }
2318
- throw new Error(`${value} need to be hex-string or whole-number-string`);
2319
- }
2320
- function getHexString(value) {
2321
- if (isHex(value)) {
2322
- return value;
2323
- }
2324
- if (isStringWholeNumber(value)) {
2325
- return toHexString(value);
2326
- }
2327
- throw new Error(`${value} need to be hex-string or whole-number-string`);
2328
- }
2329
- function getHexStringArray(value) {
2330
- return value.map((el) => getHexString(el));
2331
- }
2332
- var toCairoBool = (value) => (+value).toString();
2333
- function hexToBytes(value) {
2334
- if (!isHex(value))
2335
- throw new Error(`${value} need to be a hex-string`);
2336
- let adaptedValue = removeHexPrefix(value);
2337
- if (adaptedValue.length % 2 !== 0) {
2338
- adaptedValue = `0${adaptedValue}`;
2339
- }
2340
- return hexToBytesNoble(adaptedValue);
2341
- }
2342
-
2343
- // src/utils/shortString.ts
2344
- var shortString_exports = {};
2345
- __export(shortString_exports, {
2346
- decodeShortString: () => decodeShortString,
2347
- encodeShortString: () => encodeShortString,
2348
- isASCII: () => isASCII,
2349
- isDecimalString: () => isDecimalString,
2350
- isLongText: () => isLongText,
2351
- isShortString: () => isShortString,
2352
- isShortText: () => isShortText,
2353
- isText: () => isText,
2354
- splitLongString: () => splitLongString
2355
- });
2356
- var TEXT_TO_FELT_MAX_LEN = 31;
2357
- function isASCII(str) {
2358
- return /^[\x00-\x7F]*$/.test(str);
2359
- }
2360
- function isShortString(str) {
2361
- return str.length <= TEXT_TO_FELT_MAX_LEN;
2362
- }
2363
- function isDecimalString(decim) {
2364
- return /^[0-9]*$/i.test(decim);
2365
- }
2366
- function isText(val) {
2367
- return typeof val === "string" && !isHex(val) && !isStringWholeNumber(val);
2368
- }
2369
- var isShortText = (val) => isText(val) && isShortString(val);
2370
- var isLongText = (val) => isText(val) && !isShortString(val);
2371
- function splitLongString(longStr) {
2372
- const regex = RegExp(`[^]{1,${TEXT_TO_FELT_MAX_LEN}}`, "g");
2373
- return longStr.match(regex) || [];
2374
- }
2375
- function encodeShortString(str) {
2376
- if (!isASCII(str))
2377
- throw new Error(`${str} is not an ASCII string`);
2378
- if (!isShortString(str))
2379
- throw new Error(`${str} is too long`);
2380
- return addHexPrefix(str.replace(/./g, (char) => char.charCodeAt(0).toString(16)));
2381
- }
2382
- function decodeShortString(str) {
2383
- if (!isASCII(str))
2384
- throw new Error(`${str} is not an ASCII string`);
2385
- if (isHex(str)) {
2386
- return removeHexPrefix(str).replace(/.{2}/g, (hex) => String.fromCharCode(parseInt(hex, 16)));
2387
- }
2388
- if (isDecimalString(str)) {
2389
- return decodeShortString("0X".concat(BigInt(str).toString(16)));
2390
- }
2391
- throw new Error(`${str} is not Hex or decimal`);
2392
- }
2393
-
2394
2396
  // src/utils/uint256.ts
2395
2397
  var uint256_exports = {};
2396
2398
  __export(uint256_exports, {
@@ -2430,7 +2432,7 @@ var Uint = /* @__PURE__ */ ((Uint2) => {
2430
2432
  })(Uint || {});
2431
2433
  var isLen = (name) => /_len$/.test(name);
2432
2434
  var isTypeFelt = (type) => type === "felt" || type === "core::felt252";
2433
- var isTypeArray = (type) => /\*/.test(type) || type.includes("core::array::Array::");
2435
+ var isTypeArray = (type) => /\*/.test(type) || type.startsWith("core::array::Array::");
2434
2436
  var isTypeTuple = (type) => /^\(.*\)$/i.test(type);
2435
2437
  var isTypeNamedTuple = (type) => /\(.*\)/i.test(type) && type.includes(":");
2436
2438
  var isTypeStruct = (type, structs) => type in structs;
@@ -2441,7 +2443,7 @@ var isTypeContractAddress = (type) => type === "core::starknet::contract_address
2441
2443
  var isCairo1Type = (type) => type.includes("core::");
2442
2444
  var getArrayType = (type) => {
2443
2445
  if (isCairo1Type(type)) {
2444
- return type.substring(type.indexOf("<") + 1, type.indexOf(">"));
2446
+ return type.substring(type.indexOf("<") + 1, type.lastIndexOf(">"));
2445
2447
  }
2446
2448
  return type.replace("*", "");
2447
2449
  };
@@ -2468,273 +2470,15 @@ function felt(it) {
2468
2470
  return BigInt(encoded).toString();
2469
2471
  }
2470
2472
  if (typeof it === "string" && isHex(it)) {
2471
- return BigInt(it).toString();
2472
- }
2473
- if (typeof it === "string" && isStringWholeNumber(it)) {
2474
- return it;
2475
- }
2476
- if (typeof it === "boolean") {
2477
- return `${+it}`;
2478
- }
2479
- throw new Error(`${it} can't be computed by felt()`);
2480
- }
2481
-
2482
- // src/utils/ec.ts
2483
- var ec_exports = {};
2484
- __export(ec_exports, {
2485
- starkCurve: () => starkCurve,
2486
- weierstrass: () => weierstrass
2487
- });
2488
- import * as starkCurve from "micro-starknet";
2489
- import * as weierstrass from "@noble/curves/abstract/weierstrass";
2490
-
2491
- // src/utils/json.ts
2492
- var json_exports = {};
2493
- __export(json_exports, {
2494
- parse: () => parse2,
2495
- parseAlwaysAsBig: () => parseAlwaysAsBig,
2496
- stringify: () => stringify2,
2497
- stringifyAlwaysAsBig: () => stringifyAlwaysAsBig
2498
- });
2499
- import * as json from "lossless-json";
2500
- var parseIntAsNumberOrBigInt = (x) => {
2501
- if (!json.isInteger(x))
2502
- return parseFloat(x);
2503
- const v = parseInt(x, 10);
2504
- return Number.isSafeInteger(v) ? v : BigInt(x);
2505
- };
2506
- var parse2 = (x) => json.parse(String(x), null, parseIntAsNumberOrBigInt);
2507
- var parseAlwaysAsBig = (x) => json.parse(String(x), null, json.parseNumberAndBigInt);
2508
- var stringify2 = (...p) => json.stringify(...p);
2509
- var stringifyAlwaysAsBig = stringify2;
2510
-
2511
- // src/utils/hash.ts
2512
- import * as poseidon from "@noble/curves/abstract/poseidon";
2513
- var transactionVersion = 1n;
2514
- var transactionVersion_2 = 2n;
2515
- var feeTransactionVersion = 2n ** 128n + transactionVersion;
2516
- function keccakBn(value) {
2517
- const hexWithoutPrefix = removeHexPrefix(toHex(BigInt(value)));
2518
- const evenHex = hexWithoutPrefix.length % 2 === 0 ? hexWithoutPrefix : `0${hexWithoutPrefix}`;
2519
- return addHexPrefix(keccak(hexToBytes(addHexPrefix(evenHex))).toString(16));
2520
- }
2521
- function keccakHex(value) {
2522
- return addHexPrefix(keccak(utf8ToArray(value)).toString(16));
2523
- }
2524
- function starknetKeccak(value) {
2525
- const hash = BigInt(keccakHex(value));
2526
- return hash & MASK_250;
2527
- }
2528
- function getSelectorFromName(funcName) {
2529
- return toHex(starknetKeccak(funcName));
2530
- }
2531
- function getSelector(value) {
2532
- if (isHex(value)) {
2533
- return value;
2534
- }
2535
- if (isStringWholeNumber(value)) {
2536
- return toHexString(value);
2537
- }
2538
- return getSelectorFromName(value);
2539
- }
2540
- function computeHashOnElements(data) {
2541
- return [...data, data.length].reduce((x, y) => starkCurve.pedersen(toBigInt(x), toBigInt(y)), 0).toString();
2542
- }
2543
- function calculateTransactionHashCommon(txHashPrefix, version, contractAddress, entryPointSelector, calldata, maxFee, chainId, additionalData = []) {
2544
- const calldataHash = computeHashOnElements(calldata);
2545
- const dataToHash = [
2546
- txHashPrefix,
2547
- version,
2548
- contractAddress,
2549
- entryPointSelector,
2550
- calldataHash,
2551
- maxFee,
2552
- chainId,
2553
- ...additionalData
2554
- ];
2555
- return computeHashOnElements(dataToHash);
2556
- }
2557
- function calculateDeployTransactionHash(contractAddress, constructorCalldata, version, chainId) {
2558
- return calculateTransactionHashCommon(
2559
- "0x6465706c6f79" /* DEPLOY */,
2560
- version,
2561
- contractAddress,
2562
- getSelectorFromName("constructor"),
2563
- constructorCalldata,
2564
- 0,
2565
- chainId
2566
- );
2567
- }
2568
- function calculateDeclareTransactionHash(classHash, senderAddress, version, maxFee, chainId, nonce, compiledClassHash) {
2569
- return calculateTransactionHashCommon(
2570
- "0x6465636c617265" /* DECLARE */,
2571
- version,
2572
- senderAddress,
2573
- 0,
2574
- [classHash],
2575
- maxFee,
2576
- chainId,
2577
- [nonce, ...compiledClassHash ? [compiledClassHash] : []]
2578
- );
2579
- }
2580
- function calculateDeployAccountTransactionHash(contractAddress, classHash, constructorCalldata, salt, version, maxFee, chainId, nonce) {
2581
- const calldata = [classHash, salt, ...constructorCalldata];
2582
- return calculateTransactionHashCommon(
2583
- "0x6465706c6f795f6163636f756e74" /* DEPLOY_ACCOUNT */,
2584
- version,
2585
- contractAddress,
2586
- 0,
2587
- calldata,
2588
- maxFee,
2589
- chainId,
2590
- [nonce]
2591
- );
2592
- }
2593
- function calculateTransactionHash(contractAddress, version, calldata, maxFee, chainId, nonce) {
2594
- return calculateTransactionHashCommon(
2595
- "0x696e766f6b65" /* INVOKE */,
2596
- version,
2597
- contractAddress,
2598
- 0,
2599
- calldata,
2600
- maxFee,
2601
- chainId,
2602
- [nonce]
2603
- );
2604
- }
2605
- function calculateContractAddressFromHash(salt, classHash, constructorCalldata, deployerAddress) {
2606
- const constructorCalldataHash = computeHashOnElements(constructorCalldata);
2607
- const CONTRACT_ADDRESS_PREFIX = felt("0x535441524b4e45545f434f4e54524143545f41444452455353");
2608
- return computeHashOnElements([
2609
- CONTRACT_ADDRESS_PREFIX,
2610
- deployerAddress,
2611
- salt,
2612
- classHash,
2613
- constructorCalldataHash
2614
- ]);
2615
- }
2616
- function nullSkipReplacer(key, value) {
2617
- if (key === "attributes" || key === "accessible_scopes") {
2618
- return Array.isArray(value) && value.length === 0 ? void 0 : value;
2619
- }
2620
- if (key === "debug_info") {
2621
- return null;
2622
- }
2623
- return value === null ? void 0 : value;
2624
- }
2625
- function formatSpaces(json2) {
2626
- let insideQuotes = false;
2627
- let newString = "";
2628
- for (const char of json2) {
2629
- if (char === '"' && newString.endsWith("\\") === false) {
2630
- insideQuotes = !insideQuotes;
2631
- }
2632
- if (insideQuotes) {
2633
- newString += char;
2634
- } else {
2635
- newString += char === ":" ? ": " : char === "," ? ", " : char;
2636
- }
2637
- }
2638
- return newString;
2639
- }
2640
- function computeHintedClassHash(compiledContract) {
2641
- const { abi, program } = compiledContract;
2642
- const contractClass = { abi, program };
2643
- const serializedJson = formatSpaces(stringify2(contractClass, nullSkipReplacer));
2644
- return addHexPrefix(starkCurve.keccak(utf8ToArray(serializedJson)).toString(16));
2645
- }
2646
- function computeLegacyContractClassHash(contract) {
2647
- const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
2648
- const apiVersion = toHex(API_VERSION);
2649
- const externalEntryPointsHash = computeHashOnElements(
2650
- compiledContract.entry_points_by_type.EXTERNAL.flatMap((e) => [e.selector, e.offset])
2651
- );
2652
- const l1HandlerEntryPointsHash = computeHashOnElements(
2653
- compiledContract.entry_points_by_type.L1_HANDLER.flatMap((e) => [e.selector, e.offset])
2654
- );
2655
- const constructorEntryPointHash = computeHashOnElements(
2656
- compiledContract.entry_points_by_type.CONSTRUCTOR.flatMap((e) => [e.selector, e.offset])
2657
- );
2658
- const builtinsHash = computeHashOnElements(
2659
- compiledContract.program.builtins.map((s) => encodeShortString(s))
2660
- );
2661
- const hintedClassHash = computeHintedClassHash(compiledContract);
2662
- const dataHash = computeHashOnElements(compiledContract.program.data);
2663
- return computeHashOnElements([
2664
- apiVersion,
2665
- externalEntryPointsHash,
2666
- l1HandlerEntryPointsHash,
2667
- constructorEntryPointHash,
2668
- builtinsHash,
2669
- hintedClassHash,
2670
- dataHash
2671
- ]);
2672
- }
2673
- function hashBuiltins(builtins) {
2674
- return poseidonHashMany(
2675
- builtins.flatMap((it) => {
2676
- return BigInt(encodeShortString(it));
2677
- })
2678
- );
2679
- }
2680
- function hashEntryPoint(data) {
2681
- const base = data.flatMap((it) => {
2682
- return [BigInt(it.selector), BigInt(it.offset), hashBuiltins(it.builtins)];
2683
- });
2684
- return poseidonHashMany(base);
2685
- }
2686
- function computeCompiledClassHash(casm) {
2687
- const COMPILED_CLASS_VERSION = "COMPILED_CLASS_V1";
2688
- const compiledClassVersion = BigInt(encodeShortString(COMPILED_CLASS_VERSION));
2689
- const externalEntryPointsHash = hashEntryPoint(casm.entry_points_by_type.EXTERNAL);
2690
- const l1Handlers = hashEntryPoint(casm.entry_points_by_type.L1_HANDLER);
2691
- const constructor = hashEntryPoint(casm.entry_points_by_type.CONSTRUCTOR);
2692
- const bytecode = poseidonHashMany(casm.bytecode.map((it) => BigInt(it)));
2693
- return toHex(
2694
- poseidonHashMany([
2695
- compiledClassVersion,
2696
- externalEntryPointsHash,
2697
- l1Handlers,
2698
- constructor,
2699
- bytecode
2700
- ])
2701
- );
2702
- }
2703
- function hashEntryPointSierra(data) {
2704
- const base = data.flatMap((it) => {
2705
- return [BigInt(it.selector), BigInt(it.function_idx)];
2706
- });
2707
- return poseidonHashMany(base);
2708
- }
2709
- function hashAbi(sierra) {
2710
- const indentString = formatSpaces(stringify2(sierra.abi, null));
2711
- return BigInt(addHexPrefix(starkCurve.keccak(utf8ToArray(indentString)).toString(16)));
2712
- }
2713
- function computeSierraContractClassHash(sierra) {
2714
- const CONTRACT_CLASS_VERSION = "CONTRACT_CLASS_V0.1.0";
2715
- const compiledClassVersion = BigInt(encodeShortString(CONTRACT_CLASS_VERSION));
2716
- const externalEntryPointsHash = hashEntryPointSierra(sierra.entry_points_by_type.EXTERNAL);
2717
- const l1Handlers = hashEntryPointSierra(sierra.entry_points_by_type.L1_HANDLER);
2718
- const constructor = hashEntryPointSierra(sierra.entry_points_by_type.CONSTRUCTOR);
2719
- const abiHash = hashAbi(sierra);
2720
- const sierraProgram = poseidonHashMany(sierra.sierra_program.map((it) => BigInt(it)));
2721
- return toHex(
2722
- poseidonHashMany([
2723
- compiledClassVersion,
2724
- externalEntryPointsHash,
2725
- l1Handlers,
2726
- constructor,
2727
- abiHash,
2728
- sierraProgram
2729
- ])
2730
- );
2731
- }
2732
- function computeContractClassHash(contract) {
2733
- const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
2734
- if ("sierra_program" in compiledContract) {
2735
- return computeSierraContractClassHash(compiledContract);
2473
+ return BigInt(it).toString();
2736
2474
  }
2737
- return computeLegacyContractClassHash(compiledContract);
2475
+ if (typeof it === "string" && isStringWholeNumber(it)) {
2476
+ return it;
2477
+ }
2478
+ if (typeof it === "boolean") {
2479
+ return `${+it}`;
2480
+ }
2481
+ throw new Error(`${it} can't be computed by felt()`);
2738
2482
  }
2739
2483
 
2740
2484
  // src/utils/calldata/formatter.ts
@@ -2885,7 +2629,12 @@ function parseCalldataValue(element, type, structs) {
2885
2629
  throw Error(`Missing parameter for type ${type}`);
2886
2630
  }
2887
2631
  if (Array.isArray(element)) {
2888
- throw Error(`Array inside array (nD) are not supported by cairo. Element: ${element} ${type}`);
2632
+ const result = [];
2633
+ result.push(felt(element.length));
2634
+ const arrayType = getArrayType(type);
2635
+ return element.reduce((acc, it) => {
2636
+ return acc.concat(parseCalldataValue(it, arrayType, structs));
2637
+ }, result);
2889
2638
  }
2890
2639
  if (structs[type] && structs[type].members.length) {
2891
2640
  const { members } = structs[type];
@@ -2917,17 +2666,7 @@ function parseCalldataField(argsIterator, input, structs) {
2917
2666
  if (typeof value === "string") {
2918
2667
  value = splitLongString(value);
2919
2668
  }
2920
- const result = [];
2921
- result.push(felt(value.length));
2922
- const arrayType = getArrayType(input.type);
2923
- return value.reduce((acc, el) => {
2924
- if (isTypeStruct(arrayType, structs) || isTypeTuple(arrayType) || isTypeArray(arrayType)) {
2925
- acc.push(...parseCalldataValue(el, arrayType, structs));
2926
- } else {
2927
- return acc.concat(parseBaseTypes(arrayType, el));
2928
- }
2929
- return acc;
2930
- }, result);
2669
+ return parseCalldataValue(value, input.type, structs);
2931
2670
  case (isTypeStruct(type, structs) || isTypeTuple(type)):
2932
2671
  return parseCalldataValue(value, type, structs);
2933
2672
  case isTypeUint256(type):
@@ -2957,23 +2696,33 @@ function parseBaseTypes2(type, it) {
2957
2696
  return BigInt(temp);
2958
2697
  }
2959
2698
  }
2960
- function parseResponseStruct(responseIterator, type, structs) {
2961
- if (type in structs && structs[type]) {
2962
- return structs[type].members.reduce((acc, el) => {
2963
- acc[el.name] = parseResponseStruct(responseIterator, el.type, structs);
2699
+ function parseResponseValue(responseIterator, element, structs) {
2700
+ if (element.type in structs && structs[element.type]) {
2701
+ return structs[element.type].members.reduce((acc, el) => {
2702
+ acc[el.name] = parseResponseValue(responseIterator, el, structs);
2964
2703
  return acc;
2965
2704
  }, {});
2966
2705
  }
2967
- if (isTypeTuple(type)) {
2968
- const memberTypes = extractTupleMemberTypes(type);
2706
+ if (isTypeTuple(element.type)) {
2707
+ const memberTypes = extractTupleMemberTypes(element.type);
2969
2708
  return memberTypes.reduce((acc, it, idx) => {
2970
- const tName = (it == null ? void 0 : it.name) ? it.name : idx;
2971
- const tType = (it == null ? void 0 : it.type) ? it.type : it;
2972
- acc[tName] = parseResponseStruct(responseIterator, tType, structs);
2709
+ const name = (it == null ? void 0 : it.name) ? it.name : idx;
2710
+ const type = (it == null ? void 0 : it.type) ? it.type : it;
2711
+ const el = { name, type };
2712
+ acc[name] = parseResponseValue(responseIterator, el, structs);
2973
2713
  return acc;
2974
2714
  }, {});
2975
2715
  }
2976
- return parseBaseTypes2(type, responseIterator);
2716
+ if (isTypeArray(element.type)) {
2717
+ const parsedDataArr = [];
2718
+ const el = { name: "", type: getArrayType(element.type) };
2719
+ const len = BigInt(responseIterator.next().value);
2720
+ while (parsedDataArr.length < len) {
2721
+ parsedDataArr.push(parseResponseValue(responseIterator, el, structs));
2722
+ }
2723
+ return parsedDataArr;
2724
+ }
2725
+ return parseBaseTypes2(element.type, responseIterator);
2977
2726
  }
2978
2727
  function responseParser(responseIterator, output, structs, parsedResult) {
2979
2728
  const { name, type } = output;
@@ -2982,27 +2731,26 @@ function responseParser(responseIterator, output, structs, parsedResult) {
2982
2731
  case isLen(name):
2983
2732
  temp = responseIterator.next().value;
2984
2733
  return BigInt(temp);
2734
+ case (type in structs || isTypeTuple(type)):
2735
+ return parseResponseValue(responseIterator, output, structs);
2985
2736
  case isTypeArray(type):
2986
- const parsedDataArr = [];
2987
2737
  if (isCairo1Type(type)) {
2988
- const arrayType = getArrayType(type);
2989
- const len = BigInt(responseIterator.next().value);
2990
- while (parsedDataArr.length < len) {
2991
- parsedDataArr.push(parseResponseStruct(responseIterator, arrayType, structs));
2992
- }
2993
- return parsedDataArr;
2738
+ return parseResponseValue(responseIterator, output, structs);
2994
2739
  }
2740
+ const parsedDataArr = [];
2995
2741
  if (parsedResult && parsedResult[`${name}_len`]) {
2996
2742
  const arrLen = parsedResult[`${name}_len`];
2997
2743
  while (parsedDataArr.length < arrLen) {
2998
2744
  parsedDataArr.push(
2999
- parseResponseStruct(responseIterator, output.type.replace("*", ""), structs)
2745
+ parseResponseValue(
2746
+ responseIterator,
2747
+ { name, type: output.type.replace("*", "") },
2748
+ structs
2749
+ )
3000
2750
  );
3001
2751
  }
3002
2752
  }
3003
2753
  return parsedDataArr;
3004
- case (type in structs || isTypeTuple(type)):
3005
- return parseResponseStruct(responseIterator, type, structs);
3006
2754
  default:
3007
2755
  return parseBaseTypes2(type, responseIterator);
3008
2756
  }
@@ -3115,6 +2863,11 @@ var validateArray = (parameter, input, structs) => {
3115
2863
  case isTypeBool(baseType):
3116
2864
  parameter.forEach((param) => validateBool(param, input));
3117
2865
  break;
2866
+ case isTypeArray(baseType):
2867
+ parameter.forEach(
2868
+ (param) => validateArray(param, { name: "", type: baseType }, structs)
2869
+ );
2870
+ break;
3118
2871
  default:
3119
2872
  throw new Error(
3120
2873
  `Validate Unhandled: argument ${input.name}, type ${input.type}, value ${parameter}`
@@ -3155,120 +2908,382 @@ function validateFields(abiMethod, args, structs) {
3155
2908
  return acc + 1;
3156
2909
  }, 0);
3157
2910
  }
3158
-
3159
- // src/utils/calldata/index.ts
3160
- var CallData = class {
3161
- constructor(abi) {
3162
- this.abi = abi;
3163
- this.structs = CallData.getAbiStruct(abi);
3164
- }
3165
- validate(type, method, args = []) {
3166
- if (type !== "DEPLOY") {
3167
- const invocableFunctionNames = this.abi.filter((abi) => {
3168
- if (abi.type !== "function")
3169
- return false;
3170
- const isView = abi.stateMutability === "view" || abi.state_mutability === "view";
3171
- return type === "INVOKE" ? !isView : isView;
3172
- }).map((abi) => abi.name);
3173
- assert(
3174
- invocableFunctionNames.includes(method),
3175
- `${type === "INVOKE" ? "invocable" : "viewable"} method not found in abi`
3176
- );
3177
- }
3178
- const abiMethod = this.abi.find(
3179
- (abi) => type === "DEPLOY" ? abi.name === method && abi.type === method : abi.name === method && abi.type === "function"
3180
- );
3181
- const inputsLength = CallData.abiInputsLength(abiMethod.inputs);
3182
- if (args.length !== inputsLength) {
3183
- throw Error(
3184
- `Invalid number of arguments, expected ${inputsLength} arguments, but got ${args.length}`
3185
- );
3186
- }
3187
- validateFields(abiMethod, args, this.structs);
2911
+
2912
+ // src/utils/calldata/index.ts
2913
+ var CallData = class {
2914
+ constructor(abi) {
2915
+ this.abi = abi;
2916
+ this.structs = CallData.getAbiStruct(abi);
2917
+ }
2918
+ validate(type, method, args = []) {
2919
+ if (type !== "DEPLOY") {
2920
+ const invocableFunctionNames = this.abi.filter((abi) => {
2921
+ if (abi.type !== "function")
2922
+ return false;
2923
+ const isView = abi.stateMutability === "view" || abi.state_mutability === "view";
2924
+ return type === "INVOKE" ? !isView : isView;
2925
+ }).map((abi) => abi.name);
2926
+ assert(
2927
+ invocableFunctionNames.includes(method),
2928
+ `${type === "INVOKE" ? "invocable" : "viewable"} method not found in abi`
2929
+ );
2930
+ }
2931
+ const abiMethod = this.abi.find(
2932
+ (abi) => type === "DEPLOY" ? abi.name === method && abi.type === method : abi.name === method && abi.type === "function"
2933
+ );
2934
+ const inputsLength = CallData.abiInputsLength(abiMethod.inputs);
2935
+ if (args.length !== inputsLength) {
2936
+ throw Error(
2937
+ `Invalid number of arguments, expected ${inputsLength} arguments, but got ${args.length}`
2938
+ );
2939
+ }
2940
+ validateFields(abiMethod, args, this.structs);
2941
+ }
2942
+ compile(method, args) {
2943
+ const argsIterator = args[Symbol.iterator]();
2944
+ const { inputs } = this.abi.find((abi) => abi.name === method);
2945
+ return inputs.reduce(
2946
+ (acc, input) => isLen(input.name) ? acc : acc.concat(parseCalldataField(argsIterator, input, this.structs)),
2947
+ []
2948
+ );
2949
+ }
2950
+ static compile(rawArgs) {
2951
+ const createTree = (obj) => {
2952
+ const getEntries = (o, prefix = "") => {
2953
+ const oe = Array.isArray(o) ? [o.length.toString(), ...o] : o;
2954
+ return Object.entries(oe).flatMap(([k, v]) => {
2955
+ let value = v;
2956
+ if (isLongText(value))
2957
+ value = splitLongString(value);
2958
+ if (k === "entrypoint")
2959
+ value = getSelectorFromName(value);
2960
+ const kk = Array.isArray(oe) && k === "0" ? "$$len" : k;
2961
+ if (isBigInt(value))
2962
+ return [[`${prefix}${kk}`, felt(value)]];
2963
+ return Object(value) === value ? getEntries(value, `${prefix}${kk}.`) : [[`${prefix}${kk}`, felt(value)]];
2964
+ });
2965
+ };
2966
+ return Object.fromEntries(getEntries(obj));
2967
+ };
2968
+ let callTreeArray;
2969
+ if (!Array.isArray(rawArgs)) {
2970
+ const callTree = createTree(rawArgs);
2971
+ callTreeArray = Object.values(callTree);
2972
+ } else {
2973
+ const callObj = { ...rawArgs };
2974
+ const callTree = createTree(callObj);
2975
+ callTreeArray = Object.values(callTree);
2976
+ }
2977
+ Object.defineProperty(callTreeArray, "__compiled__", {
2978
+ enumerable: false,
2979
+ writable: false,
2980
+ value: true
2981
+ });
2982
+ return callTreeArray;
2983
+ }
2984
+ parse(method, response) {
2985
+ const { outputs } = this.abi.find((abi) => abi.name === method);
2986
+ const responseIterator = response.flat()[Symbol.iterator]();
2987
+ const parsed = outputs.flat().reduce((acc, output, idx) => {
2988
+ const propName = output.name ?? idx;
2989
+ acc[propName] = responseParser(responseIterator, output, this.structs, acc);
2990
+ if (acc[propName] && acc[`${propName}_len`]) {
2991
+ delete acc[`${propName}_len`];
2992
+ }
2993
+ return acc;
2994
+ }, {});
2995
+ return Object.keys(parsed).length === 1 && 0 in parsed ? parsed[0] : parsed;
2996
+ }
2997
+ format(method, response, format) {
2998
+ const parsed = this.parse(method, response);
2999
+ return formatter(parsed, format);
3000
+ }
3001
+ static abiInputsLength(inputs) {
3002
+ return inputs.reduce((acc, input) => !isLen(input.name) ? acc + 1 : acc, 0);
3003
+ }
3004
+ static getAbiStruct(abi) {
3005
+ return abi.filter((abiEntry) => abiEntry.type === "struct").reduce(
3006
+ (acc, abiEntry) => ({
3007
+ ...acc,
3008
+ [abiEntry.name]: abiEntry
3009
+ }),
3010
+ {}
3011
+ );
3012
+ }
3013
+ static toCalldata(rawCalldata = []) {
3014
+ return CallData.compile(rawCalldata);
3015
+ }
3016
+ static toHex(raw = []) {
3017
+ const calldata = CallData.compile(raw);
3018
+ return calldata.map((it) => toHex(it));
3019
+ }
3020
+ };
3021
+
3022
+ // src/utils/fetchPonyfill.ts
3023
+ import isomorphicFetch from "isomorphic-fetch";
3024
+ var fetchPonyfill_default = typeof window !== "undefined" && window.fetch || typeof global !== "undefined" && global.fetch || isomorphicFetch;
3025
+
3026
+ // src/utils/hash.ts
3027
+ var hash_exports = {};
3028
+ __export(hash_exports, {
3029
+ calculateContractAddressFromHash: () => calculateContractAddressFromHash,
3030
+ calculateDeclareTransactionHash: () => calculateDeclareTransactionHash,
3031
+ calculateDeployAccountTransactionHash: () => calculateDeployAccountTransactionHash,
3032
+ calculateDeployTransactionHash: () => calculateDeployTransactionHash,
3033
+ calculateTransactionHash: () => calculateTransactionHash,
3034
+ calculateTransactionHashCommon: () => calculateTransactionHashCommon,
3035
+ computeCompiledClassHash: () => computeCompiledClassHash,
3036
+ computeContractClassHash: () => computeContractClassHash,
3037
+ computeHashOnElements: () => computeHashOnElements,
3038
+ computeLegacyContractClassHash: () => computeLegacyContractClassHash,
3039
+ computeSierraContractClassHash: () => computeSierraContractClassHash,
3040
+ default: () => computeHintedClassHash,
3041
+ feeTransactionVersion: () => feeTransactionVersion,
3042
+ formatSpaces: () => formatSpaces,
3043
+ getSelector: () => getSelector,
3044
+ getSelectorFromName: () => getSelectorFromName,
3045
+ keccakBn: () => keccakBn,
3046
+ poseidon: () => poseidon,
3047
+ starknetKeccak: () => starknetKeccak,
3048
+ transactionVersion: () => transactionVersion,
3049
+ transactionVersion_2: () => transactionVersion_2
3050
+ });
3051
+ import { poseidonHashMany } from "micro-starknet";
3052
+
3053
+ // src/utils/ec.ts
3054
+ var ec_exports = {};
3055
+ __export(ec_exports, {
3056
+ starkCurve: () => starkCurve,
3057
+ weierstrass: () => weierstrass
3058
+ });
3059
+ import * as starkCurve from "micro-starknet";
3060
+ import * as weierstrass from "@noble/curves/abstract/weierstrass";
3061
+
3062
+ // src/utils/json.ts
3063
+ var json_exports = {};
3064
+ __export(json_exports, {
3065
+ parse: () => parse2,
3066
+ parseAlwaysAsBig: () => parseAlwaysAsBig,
3067
+ stringify: () => stringify2,
3068
+ stringifyAlwaysAsBig: () => stringifyAlwaysAsBig
3069
+ });
3070
+ import * as json from "lossless-json";
3071
+ var parseIntAsNumberOrBigInt = (x) => {
3072
+ if (!json.isInteger(x))
3073
+ return parseFloat(x);
3074
+ const v = parseInt(x, 10);
3075
+ return Number.isSafeInteger(v) ? v : BigInt(x);
3076
+ };
3077
+ var parse2 = (x) => json.parse(String(x), null, parseIntAsNumberOrBigInt);
3078
+ var parseAlwaysAsBig = (x) => json.parse(String(x), null, json.parseNumberAndBigInt);
3079
+ var stringify2 = (...p) => json.stringify(...p);
3080
+ var stringifyAlwaysAsBig = stringify2;
3081
+
3082
+ // src/utils/hash.ts
3083
+ import * as poseidon from "@noble/curves/abstract/poseidon";
3084
+ var transactionVersion = 1n;
3085
+ var transactionVersion_2 = 2n;
3086
+ var feeTransactionVersion = 2n ** 128n + transactionVersion;
3087
+ function computeHashOnElements(data) {
3088
+ return [...data, data.length].reduce((x, y) => starkCurve.pedersen(toBigInt(x), toBigInt(y)), 0).toString();
3089
+ }
3090
+ function calculateTransactionHashCommon(txHashPrefix, version, contractAddress, entryPointSelector, calldata, maxFee, chainId, additionalData = []) {
3091
+ const calldataHash = computeHashOnElements(calldata);
3092
+ const dataToHash = [
3093
+ txHashPrefix,
3094
+ version,
3095
+ contractAddress,
3096
+ entryPointSelector,
3097
+ calldataHash,
3098
+ maxFee,
3099
+ chainId,
3100
+ ...additionalData
3101
+ ];
3102
+ return computeHashOnElements(dataToHash);
3103
+ }
3104
+ function calculateDeployTransactionHash(contractAddress, constructorCalldata, version, chainId) {
3105
+ return calculateTransactionHashCommon(
3106
+ "0x6465706c6f79" /* DEPLOY */,
3107
+ version,
3108
+ contractAddress,
3109
+ getSelectorFromName("constructor"),
3110
+ constructorCalldata,
3111
+ 0,
3112
+ chainId
3113
+ );
3114
+ }
3115
+ function calculateDeclareTransactionHash(classHash, senderAddress, version, maxFee, chainId, nonce, compiledClassHash) {
3116
+ return calculateTransactionHashCommon(
3117
+ "0x6465636c617265" /* DECLARE */,
3118
+ version,
3119
+ senderAddress,
3120
+ 0,
3121
+ [classHash],
3122
+ maxFee,
3123
+ chainId,
3124
+ [nonce, ...compiledClassHash ? [compiledClassHash] : []]
3125
+ );
3126
+ }
3127
+ function calculateDeployAccountTransactionHash(contractAddress, classHash, constructorCalldata, salt, version, maxFee, chainId, nonce) {
3128
+ const calldata = [classHash, salt, ...constructorCalldata];
3129
+ return calculateTransactionHashCommon(
3130
+ "0x6465706c6f795f6163636f756e74" /* DEPLOY_ACCOUNT */,
3131
+ version,
3132
+ contractAddress,
3133
+ 0,
3134
+ calldata,
3135
+ maxFee,
3136
+ chainId,
3137
+ [nonce]
3138
+ );
3139
+ }
3140
+ function calculateTransactionHash(contractAddress, version, calldata, maxFee, chainId, nonce) {
3141
+ return calculateTransactionHashCommon(
3142
+ "0x696e766f6b65" /* INVOKE */,
3143
+ version,
3144
+ contractAddress,
3145
+ 0,
3146
+ calldata,
3147
+ maxFee,
3148
+ chainId,
3149
+ [nonce]
3150
+ );
3151
+ }
3152
+ function calculateContractAddressFromHash(salt, classHash, constructorCalldata, deployerAddress) {
3153
+ const compiledCalldata = CallData.compile(constructorCalldata);
3154
+ const constructorCalldataHash = computeHashOnElements(compiledCalldata);
3155
+ const CONTRACT_ADDRESS_PREFIX = felt("0x535441524b4e45545f434f4e54524143545f41444452455353");
3156
+ return computeHashOnElements([
3157
+ CONTRACT_ADDRESS_PREFIX,
3158
+ deployerAddress,
3159
+ salt,
3160
+ classHash,
3161
+ constructorCalldataHash
3162
+ ]);
3163
+ }
3164
+ function nullSkipReplacer(key, value) {
3165
+ if (key === "attributes" || key === "accessible_scopes") {
3166
+ return Array.isArray(value) && value.length === 0 ? void 0 : value;
3188
3167
  }
3189
- compile(method, args) {
3190
- const argsIterator = args[Symbol.iterator]();
3191
- const { inputs } = this.abi.find((abi) => abi.name === method);
3192
- return inputs.reduce(
3193
- (acc, input) => isLen(input.name) ? acc : acc.concat(parseCalldataField(argsIterator, input, this.structs)),
3194
- []
3195
- );
3168
+ if (key === "debug_info") {
3169
+ return null;
3196
3170
  }
3197
- static compile(rawArgs) {
3198
- const createTree = (obj) => {
3199
- const getEntries = (o, prefix = "") => {
3200
- const oe = Array.isArray(o) ? [o.length.toString(), ...o] : o;
3201
- return Object.entries(oe).flatMap(([k, v]) => {
3202
- let value = v;
3203
- if (isLongText(value))
3204
- value = splitLongString(value);
3205
- if (k === "entrypoint")
3206
- value = getSelectorFromName(value);
3207
- const kk = Array.isArray(oe) && k === "0" ? "$$len" : k;
3208
- if (isBigInt(value))
3209
- return [[`${prefix}${kk}`, felt(value)]];
3210
- return Object(value) === value ? getEntries(value, `${prefix}${kk}.`) : [[`${prefix}${kk}`, felt(value)]];
3211
- });
3212
- };
3213
- return Object.fromEntries(getEntries(obj));
3214
- };
3215
- let callTreeArray;
3216
- if (!Array.isArray(rawArgs)) {
3217
- const callTree = createTree(rawArgs);
3218
- callTreeArray = Object.values(callTree);
3171
+ return value === null ? void 0 : value;
3172
+ }
3173
+ function formatSpaces(json2) {
3174
+ let insideQuotes = false;
3175
+ let newString = "";
3176
+ for (const char of json2) {
3177
+ if (char === '"' && newString.endsWith("\\") === false) {
3178
+ insideQuotes = !insideQuotes;
3179
+ }
3180
+ if (insideQuotes) {
3181
+ newString += char;
3219
3182
  } else {
3220
- const callObj = { ...rawArgs };
3221
- const callTree = createTree(callObj);
3222
- callTreeArray = Object.values(callTree);
3183
+ newString += char === ":" ? ": " : char === "," ? ", " : char;
3223
3184
  }
3224
- Object.defineProperty(callTreeArray, "__compiled__", {
3225
- enumerable: false,
3226
- writable: false,
3227
- value: true
3228
- });
3229
- return callTreeArray;
3230
- }
3231
- parse(method, response) {
3232
- const { outputs } = this.abi.find((abi) => abi.name === method);
3233
- const responseIterator = response.flat()[Symbol.iterator]();
3234
- const parsed = outputs.flat().reduce((acc, output, idx) => {
3235
- const propName = output.name ?? idx;
3236
- acc[propName] = responseParser(responseIterator, output, this.structs, acc);
3237
- if (acc[propName] && acc[`${propName}_len`]) {
3238
- delete acc[`${propName}_len`];
3239
- }
3240
- return acc;
3241
- }, {});
3242
- return Object.keys(parsed).length === 1 && 0 in parsed ? parsed[0] : parsed;
3243
- }
3244
- format(method, response, format) {
3245
- const parsed = this.parse(method, response);
3246
- return formatter(parsed, format);
3247
- }
3248
- static abiInputsLength(inputs) {
3249
- return inputs.reduce((acc, input) => !isLen(input.name) ? acc + 1 : acc, 0);
3250
- }
3251
- static getAbiStruct(abi) {
3252
- return abi.filter((abiEntry) => abiEntry.type === "struct").reduce(
3253
- (acc, abiEntry) => ({
3254
- ...acc,
3255
- [abiEntry.name]: abiEntry
3256
- }),
3257
- {}
3258
- );
3259
- }
3260
- static toCalldata(rawCalldata = []) {
3261
- return CallData.compile(rawCalldata);
3262
3185
  }
3263
- static toHex(rawCalldata = []) {
3264
- const calldata = CallData.compile(rawCalldata);
3265
- return calldata.map((it) => toHex(it));
3186
+ return newString;
3187
+ }
3188
+ function computeHintedClassHash(compiledContract) {
3189
+ const { abi, program } = compiledContract;
3190
+ const contractClass = { abi, program };
3191
+ const serializedJson = formatSpaces(stringify2(contractClass, nullSkipReplacer));
3192
+ return addHexPrefix(starkCurve.keccak(utf8ToArray(serializedJson)).toString(16));
3193
+ }
3194
+ function computeLegacyContractClassHash(contract) {
3195
+ const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
3196
+ const apiVersion = toHex(API_VERSION);
3197
+ const externalEntryPointsHash = computeHashOnElements(
3198
+ compiledContract.entry_points_by_type.EXTERNAL.flatMap((e) => [e.selector, e.offset])
3199
+ );
3200
+ const l1HandlerEntryPointsHash = computeHashOnElements(
3201
+ compiledContract.entry_points_by_type.L1_HANDLER.flatMap((e) => [e.selector, e.offset])
3202
+ );
3203
+ const constructorEntryPointHash = computeHashOnElements(
3204
+ compiledContract.entry_points_by_type.CONSTRUCTOR.flatMap((e) => [e.selector, e.offset])
3205
+ );
3206
+ const builtinsHash = computeHashOnElements(
3207
+ compiledContract.program.builtins.map((s) => encodeShortString(s))
3208
+ );
3209
+ const hintedClassHash = computeHintedClassHash(compiledContract);
3210
+ const dataHash = computeHashOnElements(compiledContract.program.data);
3211
+ return computeHashOnElements([
3212
+ apiVersion,
3213
+ externalEntryPointsHash,
3214
+ l1HandlerEntryPointsHash,
3215
+ constructorEntryPointHash,
3216
+ builtinsHash,
3217
+ hintedClassHash,
3218
+ dataHash
3219
+ ]);
3220
+ }
3221
+ function hashBuiltins(builtins) {
3222
+ return poseidonHashMany(
3223
+ builtins.flatMap((it) => {
3224
+ return BigInt(encodeShortString(it));
3225
+ })
3226
+ );
3227
+ }
3228
+ function hashEntryPoint(data) {
3229
+ const base = data.flatMap((it) => {
3230
+ return [BigInt(it.selector), BigInt(it.offset), hashBuiltins(it.builtins)];
3231
+ });
3232
+ return poseidonHashMany(base);
3233
+ }
3234
+ function computeCompiledClassHash(casm) {
3235
+ const COMPILED_CLASS_VERSION = "COMPILED_CLASS_V1";
3236
+ const compiledClassVersion = BigInt(encodeShortString(COMPILED_CLASS_VERSION));
3237
+ const externalEntryPointsHash = hashEntryPoint(casm.entry_points_by_type.EXTERNAL);
3238
+ const l1Handlers = hashEntryPoint(casm.entry_points_by_type.L1_HANDLER);
3239
+ const constructor = hashEntryPoint(casm.entry_points_by_type.CONSTRUCTOR);
3240
+ const bytecode = poseidonHashMany(casm.bytecode.map((it) => BigInt(it)));
3241
+ return toHex(
3242
+ poseidonHashMany([
3243
+ compiledClassVersion,
3244
+ externalEntryPointsHash,
3245
+ l1Handlers,
3246
+ constructor,
3247
+ bytecode
3248
+ ])
3249
+ );
3250
+ }
3251
+ function hashEntryPointSierra(data) {
3252
+ const base = data.flatMap((it) => {
3253
+ return [BigInt(it.selector), BigInt(it.function_idx)];
3254
+ });
3255
+ return poseidonHashMany(base);
3256
+ }
3257
+ function hashAbi(sierra) {
3258
+ const indentString = formatSpaces(stringify2(sierra.abi, null));
3259
+ return BigInt(addHexPrefix(starkCurve.keccak(utf8ToArray(indentString)).toString(16)));
3260
+ }
3261
+ function computeSierraContractClassHash(sierra) {
3262
+ const CONTRACT_CLASS_VERSION = "CONTRACT_CLASS_V0.1.0";
3263
+ const compiledClassVersion = BigInt(encodeShortString(CONTRACT_CLASS_VERSION));
3264
+ const externalEntryPointsHash = hashEntryPointSierra(sierra.entry_points_by_type.EXTERNAL);
3265
+ const l1Handlers = hashEntryPointSierra(sierra.entry_points_by_type.L1_HANDLER);
3266
+ const constructor = hashEntryPointSierra(sierra.entry_points_by_type.CONSTRUCTOR);
3267
+ const abiHash = hashAbi(sierra);
3268
+ const sierraProgram = poseidonHashMany(sierra.sierra_program.map((it) => BigInt(it)));
3269
+ return toHex(
3270
+ poseidonHashMany([
3271
+ compiledClassVersion,
3272
+ externalEntryPointsHash,
3273
+ l1Handlers,
3274
+ constructor,
3275
+ abiHash,
3276
+ sierraProgram
3277
+ ])
3278
+ );
3279
+ }
3280
+ function computeContractClassHash(contract) {
3281
+ const compiledContract = typeof contract === "string" ? parse2(contract) : contract;
3282
+ if ("sierra_program" in compiledContract) {
3283
+ return computeSierraContractClassHash(compiledContract);
3266
3284
  }
3267
- };
3268
-
3269
- // src/utils/fetchPonyfill.ts
3270
- import isomorphicFetch from "isomorphic-fetch";
3271
- var fetchPonyfill_default = typeof window !== "undefined" && window.fetch || typeof global !== "undefined" && global.fetch || isomorphicFetch;
3285
+ return computeLegacyContractClassHash(compiledContract);
3286
+ }
3272
3287
 
3273
3288
  // src/utils/contract.ts
3274
3289
  function isSierra(contract) {
@@ -3807,7 +3822,7 @@ var RpcProvider = class {
3807
3822
  return this.fetchEndpoint("starknet_estimateFee", {
3808
3823
  request: {
3809
3824
  type: RPC.TransactionType.DEPLOY_ACCOUNT,
3810
- constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []),
3825
+ constructor_calldata: CallData.toHex(constructorCalldata || []),
3811
3826
  class_hash: toHex(classHash),
3812
3827
  contract_address_salt: toHex(addressSalt || 0),
3813
3828
  signature: signatureToHexArray(signature),
@@ -3844,7 +3859,7 @@ var RpcProvider = class {
3844
3859
  async deployAccountContract({ classHash, constructorCalldata, addressSalt, signature }, details) {
3845
3860
  return this.fetchEndpoint("starknet_addDeployAccountTransaction", {
3846
3861
  deploy_account_transaction: {
3847
- constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []),
3862
+ constructor_calldata: CallData.toHex(constructorCalldata || []),
3848
3863
  class_hash: toHex(classHash),
3849
3864
  contract_address_salt: toHex(addressSalt || 0),
3850
3865
  type: RPC.TransactionType.DEPLOY_ACCOUNT,
@@ -4282,7 +4297,7 @@ var SequencerProvider = class {
4282
4297
  {
4283
4298
  contract_address: contractAddress,
4284
4299
  entry_point_selector: getSelectorFromName(entryPointSelector),
4285
- calldata
4300
+ calldata: CallData.compile(calldata)
4286
4301
  }
4287
4302
  ).then(this.responseParser.parseCallContractResponse);
4288
4303
  }
@@ -4396,7 +4411,7 @@ var SequencerProvider = class {
4396
4411
  {
4397
4412
  type: "INVOKE_FUNCTION" /* INVOKE */,
4398
4413
  sender_address: invocation.contractAddress,
4399
- calldata: invocation.calldata ?? [],
4414
+ calldata: CallData.compile(invocation.calldata ?? []),
4400
4415
  signature: signatureToDecimalArray(invocation.signature),
4401
4416
  version: toHex((invocationDetails == null ? void 0 : invocationDetails.version) || 1),
4402
4417
  nonce: toHex(invocationDetails.nonce)
@@ -4454,7 +4469,7 @@ var SequencerProvider = class {
4454
4469
  res = {
4455
4470
  type: invocation.type,
4456
4471
  sender_address: invocation.contractAddress,
4457
- calldata: invocation.calldata ?? []
4472
+ calldata: CallData.compile(invocation.calldata ?? [])
4458
4473
  };
4459
4474
  } else if (invocation.type === "DECLARE") {
4460
4475
  res = {
@@ -4537,7 +4552,7 @@ ${res.tx_failure_reason.error_message}` : res.tx_status;
4537
4552
  {
4538
4553
  type: "INVOKE_FUNCTION",
4539
4554
  sender_address: invocation.contractAddress,
4540
- calldata: invocation.calldata ?? [],
4555
+ calldata: CallData.compile(invocation.calldata ?? []),
4541
4556
  signature: signatureToDecimalArray(invocation.signature),
4542
4557
  version: toHex((invocationDetails == null ? void 0 : invocationDetails.version) || 1),
4543
4558
  nonce: toHex(invocationDetails.nonce),
@@ -4950,7 +4965,7 @@ var transformCallsToMulticallArrays = (calls) => {
4950
4965
  const callArray = [];
4951
4966
  const calldata = [];
4952
4967
  calls.forEach((call) => {
4953
- const data = call.calldata || [];
4968
+ const data = CallData.compile(call.calldata || []);
4954
4969
  callArray.push({
4955
4970
  to: toBigInt(call.contractAddress).toString(10),
4956
4971
  selector: toBigInt(getSelectorFromName(call.entrypoint)).toString(10),
@@ -5239,7 +5254,7 @@ var Signer = class {
5239
5254
  const msgHash = calculateDeployAccountTransactionHash(
5240
5255
  contractAddress,
5241
5256
  classHash,
5242
- constructorCalldata,
5257
+ CallData.compile(constructorCalldata),
5243
5258
  addressSalt,
5244
5259
  version,
5245
5260
  maxFee,
@@ -5295,10 +5310,12 @@ function parseUDCEvent(txReceipt) {
5295
5310
 
5296
5311
  // src/account/default.ts
5297
5312
  var Account = class extends Provider {
5298
- constructor(providerOrOptions, address, pkOrSigner) {
5313
+ constructor(providerOrOptions, address, pkOrSigner, cairoVersion = "0") {
5299
5314
  super(providerOrOptions);
5315
+ this.deploySelf = this.deployAccount;
5300
5316
  this.address = address.toLowerCase();
5301
5317
  this.signer = typeof pkOrSigner === "string" || pkOrSigner instanceof Uint8Array ? new Signer(pkOrSigner) : pkOrSigner;
5318
+ this.cairoVersion = cairoVersion;
5302
5319
  }
5303
5320
  async getNonce(blockIdentifier) {
5304
5321
  return super.getNonceForAddress(this.address, blockIdentifier);
@@ -5306,7 +5323,7 @@ var Account = class extends Provider {
5306
5323
  async estimateFee(calls, estimateFeeDetails) {
5307
5324
  return this.estimateInvokeFee(calls, estimateFeeDetails);
5308
5325
  }
5309
- async estimateInvokeFee(calls, { nonce: providedNonce, blockIdentifier, skipValidate, cairoVersion } = {}) {
5326
+ async estimateInvokeFee(calls, { nonce: providedNonce, blockIdentifier, skipValidate } = {}) {
5310
5327
  const transactions = Array.isArray(calls) ? calls : [calls];
5311
5328
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5312
5329
  const version = toBigInt(feeTransactionVersion);
@@ -5317,7 +5334,7 @@ var Account = class extends Provider {
5317
5334
  maxFee: ZERO,
5318
5335
  version,
5319
5336
  chainId,
5320
- cairoVersion: cairoVersion ?? "0"
5337
+ cairoVersion: this.cairoVersion
5321
5338
  };
5322
5339
  const invocation = await this.buildInvocation(transactions, signerDetails);
5323
5340
  const response = await super.getInvokeEstimateFee(
@@ -5332,7 +5349,7 @@ var Account = class extends Provider {
5332
5349
  suggestedMaxFee
5333
5350
  };
5334
5351
  }
5335
- async estimateDeclareFee({ contract, classHash: providedClassHash, casm, compiledClassHash }, { blockIdentifier, nonce: providedNonce, skipValidate, cairoVersion } = {}) {
5352
+ async estimateDeclareFee({ contract, classHash: providedClassHash, casm, compiledClassHash }, { blockIdentifier, nonce: providedNonce, skipValidate } = {}) {
5336
5353
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5337
5354
  const version = !isSierra(contract) ? toBigInt(feeTransactionVersion) : transactionVersion_2;
5338
5355
  const chainId = await this.getChainId();
@@ -5344,7 +5361,7 @@ var Account = class extends Provider {
5344
5361
  version,
5345
5362
  walletAddress: this.address,
5346
5363
  maxFee: ZERO,
5347
- cairoVersion: cairoVersion ?? "0"
5364
+ cairoVersion: this.cairoVersion
5348
5365
  }
5349
5366
  );
5350
5367
  const response = await super.getDeclareEstimateFee(
@@ -5364,7 +5381,7 @@ var Account = class extends Provider {
5364
5381
  addressSalt = 0,
5365
5382
  constructorCalldata = [],
5366
5383
  contractAddress: providedContractAddress
5367
- }, { blockIdentifier, skipValidate, cairoVersion } = {}) {
5384
+ }, { blockIdentifier, skipValidate } = {}) {
5368
5385
  const version = toBigInt(feeTransactionVersion);
5369
5386
  const nonce = ZERO;
5370
5387
  const chainId = await this.getChainId();
@@ -5376,7 +5393,7 @@ var Account = class extends Provider {
5376
5393
  version,
5377
5394
  walletAddress: this.address,
5378
5395
  maxFee: ZERO,
5379
- cairoVersion: cairoVersion ?? "0"
5396
+ cairoVersion: this.cairoVersion
5380
5397
  }
5381
5398
  );
5382
5399
  const response = await super.getDeployAccountEstimateFee(
@@ -5395,7 +5412,7 @@ var Account = class extends Provider {
5395
5412
  const calls = this.buildUDCContractPayload(payload);
5396
5413
  return this.estimateInvokeFee(calls, transactionsDetail);
5397
5414
  }
5398
- async estimateFeeBulk(transactions, { nonce: providedNonce, blockIdentifier, cairoVersion } = {}) {
5415
+ async estimateFeeBulk(transactions, { nonce: providedNonce, blockIdentifier } = {}) {
5399
5416
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5400
5417
  const version = toBigInt(feeTransactionVersion);
5401
5418
  const chainId = await this.getChainId();
@@ -5407,7 +5424,7 @@ var Account = class extends Provider {
5407
5424
  maxFee: ZERO,
5408
5425
  version,
5409
5426
  chainId,
5410
- cairoVersion: cairoVersion ?? "0"
5427
+ cairoVersion: this.cairoVersion
5411
5428
  };
5412
5429
  const txPayload = transaction.payload;
5413
5430
  let res;
@@ -5465,7 +5482,7 @@ var Account = class extends Provider {
5465
5482
  });
5466
5483
  }
5467
5484
  async buildInvocation(call, signerDetails) {
5468
- const calldata = getExecuteCalldata(call, signerDetails.cairoVersion);
5485
+ const calldata = getExecuteCalldata(call, this.cairoVersion);
5469
5486
  const signature = await this.signer.signTransaction(call, signerDetails);
5470
5487
  return {
5471
5488
  contractAddress: this.address,
@@ -5482,17 +5499,16 @@ var Account = class extends Provider {
5482
5499
  );
5483
5500
  const version = toBigInt(transactionVersion);
5484
5501
  const chainId = await this.getChainId();
5485
- const cairoVersion = transactionsDetail.cairoVersion ?? "0";
5486
5502
  const signerDetails = {
5487
5503
  walletAddress: this.address,
5488
5504
  nonce,
5489
5505
  maxFee,
5490
5506
  version,
5491
5507
  chainId,
5492
- cairoVersion
5508
+ cairoVersion: this.cairoVersion
5493
5509
  };
5494
5510
  const signature = await this.signer.signTransaction(transactions, signerDetails, abis);
5495
- const calldata = getExecuteCalldata(transactions, cairoVersion);
5511
+ const calldata = getExecuteCalldata(transactions, this.cairoVersion);
5496
5512
  return this.invokeFunction(
5497
5513
  { contractAddress: this.address, calldata, signature },
5498
5514
  {
@@ -5502,6 +5518,18 @@ var Account = class extends Provider {
5502
5518
  }
5503
5519
  );
5504
5520
  }
5521
+ async declareIfNot(payload, transactionsDetail = {}) {
5522
+ const declareContractPayload = extractContractHashes(payload);
5523
+ try {
5524
+ await this.getClassByHash(declareContractPayload.classHash);
5525
+ } catch (error) {
5526
+ return this.declare(payload, transactionsDetail);
5527
+ }
5528
+ return {
5529
+ transaction_hash: "",
5530
+ class_hash: declareContractPayload.classHash
5531
+ };
5532
+ }
5505
5533
  async declare(payload, transactionsDetail = {}) {
5506
5534
  const declareContractPayload = extractContractHashes(payload);
5507
5535
  const details = {};
@@ -5518,7 +5546,7 @@ var Account = class extends Provider {
5518
5546
  const declareContractTransaction = await this.buildDeclarePayload(declareContractPayload, {
5519
5547
  ...details,
5520
5548
  walletAddress: this.address,
5521
- cairoVersion: transactionsDetail.cairoVersion ?? "0"
5549
+ cairoVersion: this.cairoVersion
5522
5550
  });
5523
5551
  return this.declareContract(declareContractTransaction, details);
5524
5552
  }
@@ -5554,10 +5582,7 @@ var Account = class extends Provider {
5554
5582
  });
5555
5583
  const calls = params.map((it) => it.call);
5556
5584
  const addresses = params.map((it) => it.address);
5557
- const invokeResponse = await this.execute(calls, void 0, {
5558
- ...details,
5559
- cairoVersion: "0"
5560
- });
5585
+ const invokeResponse = await this.execute(calls, void 0, details);
5561
5586
  return {
5562
5587
  ...invokeResponse,
5563
5588
  contract_address: addresses
@@ -5572,15 +5597,18 @@ var Account = class extends Provider {
5572
5597
  }
5573
5598
  async declareAndDeploy(payload, details) {
5574
5599
  const { constructorCalldata, salt, unique } = payload;
5575
- const { transaction_hash, class_hash } = await this.declare(payload, details);
5576
- const declare = await this.waitForTransaction(transaction_hash, {
5577
- successStates: ["ACCEPTED_ON_L2" /* ACCEPTED_ON_L2 */]
5578
- });
5600
+ let declare = await this.declareIfNot(payload, details);
5601
+ if (declare.transaction_hash !== "") {
5602
+ const tx = await this.waitForTransaction(declare.transaction_hash, {
5603
+ successStates: ["ACCEPTED_ON_L2" /* ACCEPTED_ON_L2 */]
5604
+ });
5605
+ declare = { ...declare, ...tx };
5606
+ }
5579
5607
  const deploy = await this.deployContract(
5580
- { classHash: class_hash, salt, unique, constructorCalldata },
5608
+ { classHash: declare.class_hash, salt, unique, constructorCalldata },
5581
5609
  details
5582
5610
  );
5583
- return { declare: { ...declare, class_hash }, deploy };
5611
+ return { declare: { ...declare }, deploy };
5584
5612
  }
5585
5613
  async deployAccount({
5586
5614
  classHash,
@@ -5596,13 +5624,18 @@ var Account = class extends Provider {
5596
5624
  const maxFee = transactionsDetail.maxFee ?? await this.getSuggestedMaxFee(
5597
5625
  {
5598
5626
  type: "DEPLOY_ACCOUNT" /* DEPLOY_ACCOUNT */,
5599
- payload: { classHash, constructorCalldata, addressSalt, contractAddress }
5627
+ payload: {
5628
+ classHash,
5629
+ constructorCalldata: compiledCalldata,
5630
+ addressSalt,
5631
+ contractAddress
5632
+ }
5600
5633
  },
5601
5634
  transactionsDetail
5602
5635
  );
5603
5636
  const signature = await this.signer.signDeployAccountTransaction({
5604
5637
  classHash,
5605
- constructorCalldata,
5638
+ constructorCalldata: compiledCalldata,
5606
5639
  contractAddress,
5607
5640
  addressSalt,
5608
5641
  chainId,
@@ -5700,12 +5733,12 @@ var Account = class extends Provider {
5700
5733
  version,
5701
5734
  nonce,
5702
5735
  addressSalt,
5703
- constructorCalldata
5736
+ constructorCalldata: compiledCalldata
5704
5737
  });
5705
5738
  return {
5706
5739
  classHash,
5707
5740
  addressSalt,
5708
- constructorCalldata,
5741
+ constructorCalldata: compiledCalldata,
5709
5742
  signature
5710
5743
  };
5711
5744
  }
@@ -5732,7 +5765,7 @@ var Account = class extends Provider {
5732
5765
  });
5733
5766
  return calls;
5734
5767
  }
5735
- async simulateTransaction(calls, { nonce: providedNonce, blockIdentifier, skipValidate, cairoVersion } = {}) {
5768
+ async simulateTransaction(calls, { nonce: providedNonce, blockIdentifier, skipValidate } = {}) {
5736
5769
  const transactions = Array.isArray(calls) ? calls : [calls];
5737
5770
  const nonce = toBigInt(providedNonce ?? await this.getNonce());
5738
5771
  const version = toBigInt(feeTransactionVersion);
@@ -5743,7 +5776,7 @@ var Account = class extends Provider {
5743
5776
  maxFee: ZERO,
5744
5777
  version,
5745
5778
  chainId,
5746
- cairoVersion: cairoVersion ?? "0"
5779
+ cairoVersion: this.cairoVersion
5747
5780
  };
5748
5781
  const invocation = await this.buildInvocation(transactions, signerDetails);
5749
5782
  const response = await super.getSimulateTransaction(