starknet 1.7.0 → 2.1.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.
@@ -1,4 +1,4 @@
1
- import { getKeyPair, getStarkKey, sign } from '../../src/utils/ellipticCurve';
1
+ import { ec, getKeyPair, getStarkKey, sign, verify } from '../../src/utils/ellipticCurve';
2
2
  import { removeHexPrefix } from '../../src/utils/encode';
3
3
  import { hashCalldata, hashMessage, pedersen } from '../../src/utils/hash';
4
4
  import { toBN, toHex } from '../../src/utils/number';
@@ -20,12 +20,12 @@ test('pedersen()', () => {
20
20
  test('hashCalldata()', () => {
21
21
  const array = ['1', '2', '3', '4'];
22
22
  expect(hashCalldata(array)).toBe(
23
- '0x1439c58e1c389a2ac51f8462ecc0a4ec7f812be1c04e3b82ce2af1c2cf959ef'
23
+ '0x66bd4335902683054d08a0572747ea78ebd9e531536fb43125424ca9f902084'
24
24
  );
25
25
  expect(array).toStrictEqual(['1', '2', '3', '4']);
26
26
 
27
27
  expect(hashCalldata(['1', '2'])).toBe(
28
- '0x2ab889bd35e684623df9b4ea4a4a1f6d9e0ef39b67c1293b8a89dd17e351235'
28
+ '0x501a3a8e6cd4f5241c639c74052aaa34557aafa84dd4ba983d6443c590ab7df'
29
29
  );
30
30
  });
31
31
 
@@ -38,13 +38,25 @@ test('hashMessage()', () => {
38
38
  ['1', '2'],
39
39
  '2'
40
40
  );
41
- expect(hashMsg).toBe('0xf7ec4a68876819eed838be83b5d5dc337081f4a5fb8e421f3d9bdef7c69e9b');
41
+ expect(hashMsg).toBe('0x7f15c38ea577a26f4f553282fcfe4f1feeb8ecfaad8f221ae41abf8224cbddd');
42
42
  const keyPair = getKeyPair(privateKey);
43
43
  const { r, s } = sign(keyPair, removeHexPrefix(hashMsg));
44
44
  expect(r.toString()).toStrictEqual(
45
- toBN('2699852629692218907583414128365108566181098618321049245303767746418549764831').toString()
45
+ toBN('2458502865976494910213617956670505342647705497324144349552978333078363662855').toString()
46
46
  );
47
47
  expect(s.toString()).toStrictEqual(
48
- toBN('2362979021721299440845279407227912881357338080403308888611869245024056250189').toString()
48
+ toBN('3439514492576562277095748549117516048613512930236865921315982886313695689433').toString()
49
49
  );
50
50
  });
51
+
52
+ test('verify signed message()', () => {
53
+ const pk = '0x019800ea6a9a73f94aee6a3d2edf018fc770443e90c7ba121e8303ec6b349279';
54
+ const account = '0x33f45f07e1bd1a51b45fc24ec8c8c9908db9e42191be9e169bfcac0c0d99745';
55
+ const price = '1';
56
+ const hashMsg = pedersen([account, price]);
57
+ const keyPair = getKeyPair(pk);
58
+ const signature = sign(keyPair, removeHexPrefix(hashMsg));
59
+ const pubKey = keyPair.getPublic('hex');
60
+ const pubKeyPair = ec.keyFromPublic(pubKey, 'hex');
61
+ expect(verify(pubKeyPair, removeHexPrefix(hashMsg), signature)).toBe(true);
62
+ });
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs';
2
2
 
3
- import { constants, json, number, stark } from '../../src';
3
+ import { constants, hash, json, number, stark } from '../../src';
4
4
 
5
5
  const { IS_BROWSER } = constants;
6
6
 
@@ -61,13 +61,13 @@ describe('getSelectorFromName()', () => {
61
61
  });
62
62
  describe('computeHashOnElements()', () => {
63
63
  test('should return valid hash for empty array', () => {
64
- const res = stark.computeHashOnElements([]);
64
+ const res = hash.computeHashOnElements([]);
65
65
  expect(res).toMatchInlineSnapshot(
66
66
  `"0x49ee3eba8c1600700ee1b87eb599f16716b0b1022947733551fde4050ca6804"`
67
67
  );
68
68
  });
69
69
  test('should return valid hash for valid array', () => {
70
- const res = stark.computeHashOnElements([
70
+ const res = hash.computeHashOnElements([
71
71
  number.toBN(123782376),
72
72
  number.toBN(213984),
73
73
  number.toBN(128763521321),
@@ -1,16 +1,18 @@
1
1
  import { AddTransactionResponse, CallContractResponse, CallContractTransaction, CompiledContract, GetBlockResponse, GetCodeResponse, GetContractAddressesResponse, GetTransactionResponse, GetTransactionStatusResponse, Transaction } from '../types';
2
2
  import { BigNumberish } from '../utils/number';
3
3
  import { ProviderInterface } from './interface';
4
- declare type NetworkName = 'alpha';
5
- interface ProviderOptions {
6
- network?: NetworkName;
7
- }
4
+ declare type NetworkName = 'mainnet-alpha' | 'georli-alpha';
5
+ declare type ProviderOptions = {
6
+ network: NetworkName;
7
+ } | {
8
+ baseUrl: string;
9
+ };
8
10
  export declare class Provider implements ProviderInterface {
9
11
  baseUrl: string;
10
12
  feederGatewayUrl: string;
11
13
  gatewayUrl: string;
12
14
  constructor(optionsOrProvider?: ProviderOptions | Provider);
13
- protected static getNetworkFromName(name: NetworkName): string;
15
+ protected static getNetworkFromName(name: NetworkName): "http://alpha-mainnet.starknet.io/" | "https://alpha4.starknet.io";
14
16
  /**
15
17
  * Gets the smart contract address on the goerli testnet.
16
18
  *
@@ -60,14 +60,16 @@ function wait(delay) {
60
60
  }
61
61
  var Provider = /** @class */ (function () {
62
62
  function Provider(optionsOrProvider) {
63
+ if (optionsOrProvider === void 0) { optionsOrProvider = { network: 'georli-alpha' }; }
63
64
  if (optionsOrProvider instanceof Provider) {
64
65
  this.baseUrl = optionsOrProvider.baseUrl;
65
66
  this.feederGatewayUrl = optionsOrProvider.feederGatewayUrl;
66
67
  this.gatewayUrl = optionsOrProvider.gatewayUrl;
67
68
  }
68
69
  else {
69
- var _a = (optionsOrProvider || {}).network, network = _a === void 0 ? 'alpha' : _a;
70
- var baseUrl = Provider.getNetworkFromName(network);
70
+ var baseUrl = 'baseUrl' in optionsOrProvider
71
+ ? optionsOrProvider.baseUrl
72
+ : Provider.getNetworkFromName(optionsOrProvider.network);
71
73
  this.baseUrl = baseUrl;
72
74
  this.feederGatewayUrl = baseUrl + "/feeder_gateway";
73
75
  this.gatewayUrl = baseUrl + "/gateway";
@@ -75,9 +77,11 @@ var Provider = /** @class */ (function () {
75
77
  }
76
78
  Provider.getNetworkFromName = function (name) {
77
79
  switch (name) {
78
- case 'alpha':
80
+ case 'mainnet-alpha':
81
+ return 'http://alpha-mainnet.starknet.io/';
82
+ case 'georli-alpha':
79
83
  default:
80
- return 'https://alpha3.starknet.io';
84
+ return 'https://alpha4.starknet.io';
81
85
  }
82
86
  };
83
87
  /**
@@ -296,7 +300,7 @@ var Provider = /** @class */ (function () {
296
300
  });
297
301
  };
298
302
  Provider.prototype.waitForTx = function (txHash, retryInterval) {
299
- if (retryInterval === void 0) { retryInterval = 2000; }
303
+ if (retryInterval === void 0) { retryInterval = 8000; }
300
304
  return __awaiter(this, void 0, void 0, function () {
301
305
  var onchain, res;
302
306
  return __generator(this, function (_a) {
@@ -314,7 +318,9 @@ var Provider = /** @class */ (function () {
314
318
  return [4 /*yield*/, this.getTransactionStatus(txHash)];
315
319
  case 3:
316
320
  res = _a.sent();
317
- if (res.tx_status === 'ACCEPTED_ONCHAIN' || res.tx_status === 'PENDING') {
321
+ if (res.tx_status === 'ACCEPTED_ONCHAIN' ||
322
+ (res.tx_status === 'PENDING' && res.block_hash !== 'pending') // This is needed as of today. In the future there will be a different status for pending transactions.
323
+ ) {
318
324
  onchain = true;
319
325
  }
320
326
  else if (res.tx_status === 'REJECTED') {
@@ -114,14 +114,13 @@ var Signer = /** @class */ (function (_super) {
114
114
  (0, minimalistic_assert_1.default)(!tx.signature, "Adding signatures to a signer tx currently isn't supported");
115
115
  return [4 /*yield*/, this.callContract({
116
116
  contract_address: this.address,
117
- entry_point_selector: (0, stark_1.getSelectorFromName)('get_current_nonce'),
117
+ entry_point_selector: (0, stark_1.getSelectorFromName)('get_nonce'),
118
118
  })];
119
119
  case 1:
120
120
  result = (_b.sent()).result;
121
121
  nonceBn = (0, number_1.toBN)(result[0]);
122
122
  calldataDecimal = (tx.calldata || []).map(function (x) { return (0, number_1.toBN)(x).toString(); });
123
- msgHash = (0, encode_1.addHexPrefix)((0, hash_1.hashMessage)('0', // needs to be walletAddress once it's possible to retrieve address(self) in cairo
124
- tx.contract_address, tx.entry_point_selector, calldataDecimal, nonceBn.toString()));
123
+ msgHash = (0, encode_1.addHexPrefix)((0, hash_1.hashMessage)(this.address, tx.contract_address, tx.entry_point_selector, calldataDecimal, nonceBn.toString()));
125
124
  _a = (0, ellipticCurve_1.sign)(this.keyPair, msgHash), r = _a.r, s = _a.s;
126
125
  return [2 /*return*/, _super.prototype.addTransaction.call(this, {
127
126
  type: 'INVOKE_FUNCTION',
package/dist/types.d.ts CHANGED
@@ -54,14 +54,14 @@ export declare type CallContractResponse = {
54
54
  export declare type GetBlockResponse = {
55
55
  sequence_number: number;
56
56
  state_root: string;
57
- block_id: number;
57
+ block_hash: string;
58
58
  transactions: {
59
59
  [txHash: string]: Transaction;
60
60
  };
61
61
  timestamp: number;
62
62
  transaction_receipts: {
63
63
  [txHash: string]: {
64
- block_id: number;
64
+ block_hash: string;
65
65
  transaction_hash: string;
66
66
  l2_to_l1_messages: {
67
67
  to_address: string;
@@ -73,7 +73,7 @@ export declare type GetBlockResponse = {
73
73
  transaction_index: number;
74
74
  };
75
75
  };
76
- previous_block_id: number;
76
+ previous_block_hash: string;
77
77
  status: Status;
78
78
  };
79
79
  export declare type GetCodeResponse = {
@@ -82,12 +82,12 @@ export declare type GetCodeResponse = {
82
82
  };
83
83
  export declare type GetTransactionStatusResponse = {
84
84
  tx_status: Status;
85
- block_id: number;
85
+ block_hash: string;
86
86
  };
87
87
  export declare type GetTransactionResponse = {
88
88
  status: Status;
89
89
  transaction: Transaction;
90
- block_id: number;
90
+ block_hash: string;
91
91
  block_number: number;
92
92
  transaction_index: number;
93
93
  transaction_hash: string;
@@ -95,5 +95,5 @@ export declare type GetTransactionResponse = {
95
95
  export declare type AddTransactionResponse = {
96
96
  code: TxStatus;
97
97
  transaction_hash: string;
98
- address: string;
98
+ address?: string;
99
99
  };
@@ -84,6 +84,6 @@ function verify(keyPair, msgHash, sig) {
84
84
  (0, number_1.assertInRange)(r, constants_1.ONE, (0, number_1.toBN)((0, encode_1.addHexPrefix)(constants_1.MAX_ECDSA_VAL)), 'r');
85
85
  (0, number_1.assertInRange)(s, constants_1.ONE, (0, number_1.toBN)((0, encode_1.addHexPrefix)(constants_1.EC_ORDER)), 's');
86
86
  (0, number_1.assertInRange)(w, constants_1.ONE, (0, number_1.toBN)((0, encode_1.addHexPrefix)(constants_1.MAX_ECDSA_VAL)), 'w');
87
- return keyPair.verify(msgHash, sig);
87
+ return keyPair.verify(fixMessage(msgHash), sig);
88
88
  }
89
89
  exports.verify = verify;
@@ -9,5 +9,6 @@ import { BigNumberish } from './number';
9
9
  */
10
10
  export declare function starknetKeccak(value: string): BN;
11
11
  export declare function pedersen(input: [BigNumberish, BigNumberish]): string;
12
+ export declare function computeHashOnElements(data: BigNumberish[]): string;
12
13
  export declare function hashCalldata(calldata: string[]): string;
13
14
  export declare function hashMessage(account: string, to: string, selector: string, calldata: string[], nonce: string): string;
@@ -28,7 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  return (mod && mod.__esModule) ? mod : { "default": mod };
29
29
  };
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.hashMessage = exports.hashCalldata = exports.pedersen = exports.starknetKeccak = void 0;
31
+ exports.hashMessage = exports.hashCalldata = exports.computeHashOnElements = exports.pedersen = exports.starknetKeccak = void 0;
32
32
  var keccak_1 = require("ethereum-cryptography/keccak");
33
33
  var minimalistic_assert_1 = __importDefault(require("minimalistic-assert"));
34
34
  var constants_1 = require("../constants");
@@ -69,24 +69,16 @@ function pedersen(input) {
69
69
  return (0, encode_1.addHexPrefix)(point.getX().toString(16));
70
70
  }
71
71
  exports.pedersen = pedersen;
72
+ function computeHashOnElements(data) {
73
+ return __spreadArray(__spreadArray([], __read(data), false), [data.length], false).reduce(function (x, y) { return pedersen([x, y]); }, 0).toString();
74
+ }
75
+ exports.computeHashOnElements = computeHashOnElements;
72
76
  function hashCalldata(calldata) {
73
- var calldataCopy = __spreadArray([], __read(calldata), false);
74
- if (calldataCopy.length === 0) {
75
- return '0';
76
- }
77
- if (calldataCopy.length === 1) {
78
- return calldataCopy[0];
79
- }
80
- // calldata element will always be there as it was checked by an if statement before (!)
81
- var calldataEl = calldataCopy.shift();
82
- return pedersen([hashCalldata(calldataCopy), calldataEl]);
77
+ return computeHashOnElements(calldata);
83
78
  }
84
79
  exports.hashCalldata = hashCalldata;
85
80
  function hashMessage(account, to, selector, calldata, nonce) {
86
- var hash0 = pedersen([account, to]);
87
- var hash1 = pedersen([hash0, selector]);
88
81
  var calldataHash = hashCalldata(calldata);
89
- var hash2 = pedersen([hash1, calldataHash]);
90
- return pedersen([hash2, nonce]);
82
+ return computeHashOnElements([account, to, selector, calldataHash, nonce]);
91
83
  }
92
84
  exports.hashMessage = hashMessage;
@@ -19,4 +19,3 @@ export declare function getSelectorFromName(funcName: string): string;
19
19
  export declare function randomAddress(): string;
20
20
  export declare function makeAddress(input: string): string;
21
21
  export declare function formatSignature(sig?: [BigNumberish, BigNumberish]): [string, string] | [];
22
- export declare function computeHashOnElements(data: BigNumberish[]): BigNumberish;
@@ -1,31 +1,6 @@
1
1
  "use strict";
2
- var __read = (this && this.__read) || function (o, n) {
3
- var m = typeof Symbol === "function" && o[Symbol.iterator];
4
- if (!m) return o;
5
- var i = m.call(o), r, ar = [], e;
6
- try {
7
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
- }
9
- catch (error) { e = { error: error }; }
10
- finally {
11
- try {
12
- if (r && !r.done && (m = i["return"])) m.call(i);
13
- }
14
- finally { if (e) throw e.error; }
15
- }
16
- return ar;
17
- };
18
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
19
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
20
- if (ar || !(i in from)) {
21
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
- ar[i] = from[i];
23
- }
24
- }
25
- return to.concat(ar || Array.prototype.slice.call(from));
26
- };
27
2
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.computeHashOnElements = exports.formatSignature = exports.makeAddress = exports.randomAddress = exports.getSelectorFromName = exports.compressProgram = void 0;
3
+ exports.formatSignature = exports.makeAddress = exports.randomAddress = exports.getSelectorFromName = exports.compressProgram = void 0;
29
4
  var pako_1 = require("pako");
30
5
  var ellipticCurve_1 = require("./ellipticCurve");
31
6
  var encode_1 = require("./encode");
@@ -77,7 +52,3 @@ function formatSignature(sig) {
77
52
  }
78
53
  }
79
54
  exports.formatSignature = formatSignature;
80
- function computeHashOnElements(data) {
81
- return __spreadArray(__spreadArray([], __read(data), false), [data.length], false).reduce(function (x, y) { return (0, hash_1.pedersen)([x, y]); }, 0);
82
- }
83
- exports.computeHashOnElements = computeHashOnElements;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starknet",
3
- "version": "1.7.0",
3
+ "version": "2.1.0",
4
4
  "description": "JavaScript library for StarkNet",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -12,16 +12,22 @@ import {
12
12
  } from '../types';
13
13
  import { BigNumberish } from '../utils/number';
14
14
  import { ProviderInterface } from './interface';
15
- declare type NetworkName = 'alpha';
16
- interface ProviderOptions {
17
- network?: NetworkName;
18
- }
15
+ declare type NetworkName = 'mainnet-alpha' | 'georli-alpha';
16
+ declare type ProviderOptions =
17
+ | {
18
+ network: NetworkName;
19
+ }
20
+ | {
21
+ baseUrl: string;
22
+ };
19
23
  export declare class Provider implements ProviderInterface {
20
24
  baseUrl: string;
21
25
  feederGatewayUrl: string;
22
26
  gatewayUrl: string;
23
27
  constructor(optionsOrProvider?: ProviderOptions | Provider);
24
- protected static getNetworkFromName(name: NetworkName): string;
28
+ protected static getNetworkFromName(
29
+ name: NetworkName
30
+ ): 'http://alpha-mainnet.starknet.io/' | 'https://alpha4.starknet.io';
25
31
  /**
26
32
  * Gets the smart contract address on the goerli testnet.
27
33
  *
@@ -162,14 +162,18 @@ function wait(delay) {
162
162
  }
163
163
  var Provider = /** @class */ (function () {
164
164
  function Provider(optionsOrProvider) {
165
+ if (optionsOrProvider === void 0) {
166
+ optionsOrProvider = { network: 'georli-alpha' };
167
+ }
165
168
  if (optionsOrProvider instanceof Provider) {
166
169
  this.baseUrl = optionsOrProvider.baseUrl;
167
170
  this.feederGatewayUrl = optionsOrProvider.feederGatewayUrl;
168
171
  this.gatewayUrl = optionsOrProvider.gatewayUrl;
169
172
  } else {
170
- var _a = (optionsOrProvider || {}).network,
171
- network = _a === void 0 ? 'alpha' : _a;
172
- var baseUrl = Provider.getNetworkFromName(network);
173
+ var baseUrl =
174
+ 'baseUrl' in optionsOrProvider
175
+ ? optionsOrProvider.baseUrl
176
+ : Provider.getNetworkFromName(optionsOrProvider.network);
173
177
  this.baseUrl = baseUrl;
174
178
  this.feederGatewayUrl = baseUrl + '/feeder_gateway';
175
179
  this.gatewayUrl = baseUrl + '/gateway';
@@ -177,9 +181,11 @@ var Provider = /** @class */ (function () {
177
181
  }
178
182
  Provider.getNetworkFromName = function (name) {
179
183
  switch (name) {
180
- case 'alpha':
184
+ case 'mainnet-alpha':
185
+ return 'http://alpha-mainnet.starknet.io/';
186
+ case 'georli-alpha':
181
187
  default:
182
- return 'https://alpha3.starknet.io';
188
+ return 'https://alpha4.starknet.io';
183
189
  }
184
190
  };
185
191
  /**
@@ -484,7 +490,7 @@ var Provider = /** @class */ (function () {
484
490
  };
485
491
  Provider.prototype.waitForTx = function (txHash, retryInterval) {
486
492
  if (retryInterval === void 0) {
487
- retryInterval = 2000;
493
+ retryInterval = 8000;
488
494
  }
489
495
  return __awaiter(this, void 0, void 0, function () {
490
496
  var onchain, res;
@@ -503,7 +509,10 @@ var Provider = /** @class */ (function () {
503
509
  return [4 /*yield*/, this.getTransactionStatus(txHash)];
504
510
  case 3:
505
511
  res = _a.sent();
506
- if (res.tx_status === 'ACCEPTED_ONCHAIN' || res.tx_status === 'PENDING') {
512
+ if (
513
+ res.tx_status === 'ACCEPTED_ONCHAIN' ||
514
+ (res.tx_status === 'PENDING' && res.block_hash !== 'pending') // This is needed as of today. In the future there will be a different status for pending transactions.
515
+ ) {
507
516
  onchain = true;
508
517
  } else if (res.tx_status === 'REJECTED') {
509
518
  throw Error('REJECTED');
package/signer/default.js CHANGED
@@ -233,7 +233,7 @@ var Signer = /** @class */ (function (_super) {
233
233
  4 /*yield*/,
234
234
  this.callContract({
235
235
  contract_address: this.address,
236
- entry_point_selector: (0, stark_1.getSelectorFromName)('get_current_nonce'),
236
+ entry_point_selector: (0, stark_1.getSelectorFromName)('get_nonce'),
237
237
  }),
238
238
  ];
239
239
  case 1:
@@ -244,7 +244,7 @@ var Signer = /** @class */ (function (_super) {
244
244
  });
245
245
  msgHash = (0, encode_1.addHexPrefix)(
246
246
  (0, hash_1.hashMessage)(
247
- '0', // needs to be walletAddress once it's possible to retrieve address(self) in cairo
247
+ this.address,
248
248
  tx.contract_address,
249
249
  tx.entry_point_selector,
250
250
  calldataDecimal,
@@ -17,11 +17,15 @@ import { BigNumberish, toBN, toHex } from '../utils/number';
17
17
  import { compressProgram, formatSignature, randomAddress } from '../utils/stark';
18
18
  import { ProviderInterface } from './interface';
19
19
 
20
- type NetworkName = 'alpha';
20
+ type NetworkName = 'mainnet-alpha' | 'georli-alpha';
21
21
 
22
- interface ProviderOptions {
23
- network?: NetworkName;
24
- }
22
+ type ProviderOptions =
23
+ | {
24
+ network: NetworkName;
25
+ }
26
+ | {
27
+ baseUrl: string;
28
+ };
25
29
 
26
30
  function wait(delay: number) {
27
31
  return new Promise((res) => setTimeout(res, delay));
@@ -34,14 +38,16 @@ export class Provider implements ProviderInterface {
34
38
 
35
39
  public gatewayUrl: string;
36
40
 
37
- constructor(optionsOrProvider?: ProviderOptions | Provider) {
41
+ constructor(optionsOrProvider: ProviderOptions | Provider = { network: 'georli-alpha' }) {
38
42
  if (optionsOrProvider instanceof Provider) {
39
43
  this.baseUrl = optionsOrProvider.baseUrl;
40
44
  this.feederGatewayUrl = optionsOrProvider.feederGatewayUrl;
41
45
  this.gatewayUrl = optionsOrProvider.gatewayUrl;
42
46
  } else {
43
- const { network = 'alpha' } = optionsOrProvider || {};
44
- const baseUrl = Provider.getNetworkFromName(network);
47
+ const baseUrl =
48
+ 'baseUrl' in optionsOrProvider
49
+ ? optionsOrProvider.baseUrl
50
+ : Provider.getNetworkFromName(optionsOrProvider.network);
45
51
  this.baseUrl = baseUrl;
46
52
  this.feederGatewayUrl = `${baseUrl}/feeder_gateway`;
47
53
  this.gatewayUrl = `${baseUrl}/gateway`;
@@ -50,9 +56,11 @@ export class Provider implements ProviderInterface {
50
56
 
51
57
  protected static getNetworkFromName(name: NetworkName) {
52
58
  switch (name) {
53
- case 'alpha':
59
+ case 'mainnet-alpha':
60
+ return 'http://alpha-mainnet.starknet.io/';
61
+ case 'georli-alpha':
54
62
  default:
55
- return 'https://alpha3.starknet.io';
63
+ return 'https://alpha4.starknet.io';
56
64
  }
57
65
  }
58
66
 
@@ -257,7 +265,7 @@ export class Provider implements ProviderInterface {
257
265
  });
258
266
  }
259
267
 
260
- public async waitForTx(txHash: BigNumberish, retryInterval: number = 2000) {
268
+ public async waitForTx(txHash: BigNumberish, retryInterval: number = 8000) {
261
269
  let onchain = false;
262
270
  while (!onchain) {
263
271
  // eslint-disable-next-line no-await-in-loop
@@ -265,7 +273,10 @@ export class Provider implements ProviderInterface {
265
273
  // eslint-disable-next-line no-await-in-loop
266
274
  const res = await this.getTransactionStatus(txHash);
267
275
 
268
- if (res.tx_status === 'ACCEPTED_ONCHAIN' || res.tx_status === 'PENDING') {
276
+ if (
277
+ res.tx_status === 'ACCEPTED_ONCHAIN' ||
278
+ (res.tx_status === 'PENDING' && res.block_hash !== 'pending') // This is needed as of today. In the future there will be a different status for pending transactions.
279
+ ) {
269
280
  onchain = true;
270
281
  } else if (res.tx_status === 'REJECTED') {
271
282
  throw Error('REJECTED');
@@ -35,14 +35,14 @@ export class Signer extends Provider implements SignerInterface {
35
35
 
36
36
  const { result } = await this.callContract({
37
37
  contract_address: this.address,
38
- entry_point_selector: getSelectorFromName('get_current_nonce'),
38
+ entry_point_selector: getSelectorFromName('get_nonce'),
39
39
  });
40
40
  const nonceBn = toBN(result[0]);
41
41
  const calldataDecimal = (tx.calldata || []).map((x) => toBN(x).toString());
42
42
 
43
43
  const msgHash = addHexPrefix(
44
44
  hashMessage(
45
- '0', // needs to be walletAddress once it's possible to retrieve address(self) in cairo
45
+ this.address,
46
46
  tx.contract_address,
47
47
  tx.entry_point_selector,
48
48
  calldataDecimal,
package/src/types.ts CHANGED
@@ -61,14 +61,14 @@ export type CallContractResponse = {
61
61
  export type GetBlockResponse = {
62
62
  sequence_number: number;
63
63
  state_root: string;
64
- block_id: number;
64
+ block_hash: string;
65
65
  transactions: {
66
66
  [txHash: string]: Transaction;
67
67
  };
68
68
  timestamp: number;
69
69
  transaction_receipts: {
70
70
  [txHash: string]: {
71
- block_id: number;
71
+ block_hash: string;
72
72
  transaction_hash: string;
73
73
  l2_to_l1_messages: {
74
74
  to_address: string;
@@ -80,7 +80,7 @@ export type GetBlockResponse = {
80
80
  transaction_index: number;
81
81
  };
82
82
  };
83
- previous_block_id: number;
83
+ previous_block_hash: string;
84
84
  status: Status;
85
85
  };
86
86
 
@@ -91,13 +91,13 @@ export type GetCodeResponse = {
91
91
 
92
92
  export type GetTransactionStatusResponse = {
93
93
  tx_status: Status;
94
- block_id: number;
94
+ block_hash: string;
95
95
  };
96
96
 
97
97
  export type GetTransactionResponse = {
98
98
  status: Status;
99
99
  transaction: Transaction;
100
- block_id: number;
100
+ block_hash: string;
101
101
  block_number: number;
102
102
  transaction_index: number;
103
103
  transaction_hash: string;
@@ -106,5 +106,5 @@ export type GetTransactionResponse = {
106
106
  export type AddTransactionResponse = {
107
107
  code: TxStatus;
108
108
  transaction_hash: string;
109
- address: string;
109
+ address?: string;
110
110
  };
@@ -88,5 +88,5 @@ export function verify(keyPair: KeyPair, msgHash: string, sig: Signature): boole
88
88
  assertInRange(s, ONE, toBN(addHexPrefix(EC_ORDER)), 's');
89
89
  assertInRange(w, ONE, toBN(addHexPrefix(MAX_ECDSA_VAL)), 'w');
90
90
 
91
- return keyPair.verify(msgHash, sig);
91
+ return keyPair.verify(fixMessage(msgHash), sig);
92
92
  }
package/src/utils/hash.ts CHANGED
@@ -43,17 +43,12 @@ export function pedersen(input: [BigNumberish, BigNumberish]) {
43
43
  return addHexPrefix(point.getX().toString(16));
44
44
  }
45
45
 
46
+ export function computeHashOnElements(data: BigNumberish[]) {
47
+ return [...data, data.length].reduce((x, y) => pedersen([x, y]), 0).toString();
48
+ }
49
+
46
50
  export function hashCalldata(calldata: string[]): string {
47
- const calldataCopy = [...calldata];
48
- if (calldataCopy.length === 0) {
49
- return '0';
50
- }
51
- if (calldataCopy.length === 1) {
52
- return calldataCopy[0];
53
- }
54
- // calldata element will always be there as it was checked by an if statement before (!)
55
- const calldataEl = calldataCopy.shift()!;
56
- return pedersen([hashCalldata(calldataCopy), calldataEl]);
51
+ return computeHashOnElements(calldata);
57
52
  }
58
53
 
59
54
  export function hashMessage(
@@ -63,9 +58,6 @@ export function hashMessage(
63
58
  calldata: string[],
64
59
  nonce: string
65
60
  ) {
66
- const hash0 = pedersen([account, to]);
67
- const hash1 = pedersen([hash0, selector]);
68
61
  const calldataHash = hashCalldata(calldata);
69
- const hash2 = pedersen([hash1, calldataHash]);
70
- return pedersen([hash2, nonce]);
62
+ return computeHashOnElements([account, to, selector, calldataHash, nonce]);
71
63
  }
@@ -3,7 +3,7 @@ import { gzip } from 'pako';
3
3
  import { CompressedProgram, Program } from '../types';
4
4
  import { genKeyPair, getStarkKey } from './ellipticCurve';
5
5
  import { addHexPrefix, btoaUniversal } from './encode';
6
- import { pedersen, starknetKeccak } from './hash';
6
+ import { starknetKeccak } from './hash';
7
7
  import { stringify } from './json';
8
8
  import { BigNumberish, toBN, toHex } from './number';
9
9
 
@@ -49,7 +49,3 @@ export function formatSignature(sig?: [BigNumberish, BigNumberish]): [string, st
49
49
  return [];
50
50
  }
51
51
  }
52
-
53
- export function computeHashOnElements(data: BigNumberish[]) {
54
- return [...data, data.length].reduce((x, y) => pedersen([x, y]), 0);
55
- }
package/tsconfig.json CHANGED
@@ -105,11 +105,12 @@
105
105
  "include": ["src/**/*"],
106
106
  "exclude": ["node_modules"],
107
107
  "typedocOptions": {
108
- "entryPoints": ["src/starknet.ts", "src/types.ts"],
108
+ "entryPoints": "src/index.ts",
109
+ "entryPointStrategy": "expand",
109
110
  "out": "docs",
110
111
  "githubPages": false,
111
112
  "readme": "./README.md",
112
113
  "name": "StarkNet.js Docs",
113
- "sort": "source-order"
114
+ "sort": "required-first"
114
115
  }
115
116
  }