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.
- package/CHANGELOG.md +34 -1
- package/README.md +56 -5
- package/__mocks__/ArgentAccount.json +42401 -49045
- package/__mocks__/ERC20.json +3721 -3274
- package/__mocks__/Readme.md +2 -0
- package/__tests__/account.test.ts +6 -6
- package/__tests__/provider.test.ts +5 -5
- package/__tests__/signer.test.ts +1 -1
- package/__tests__/utils/__snapshots__/utils.browser.test.ts.snap +2 -2
- package/__tests__/utils/__snapshots__/utils.test.ts.snap +2 -2
- package/__tests__/utils/ellipticalCurve.test.ts +18 -6
- package/__tests__/utils/utils.test.ts +3 -3
- package/dist/provider/default.d.ts +7 -5
- package/dist/provider/default.js +12 -6
- package/dist/signer/default.js +2 -3
- package/dist/types.d.ts +6 -6
- package/dist/utils/ellipticCurve.js +1 -1
- package/dist/utils/hash.d.ts +1 -0
- package/dist/utils/hash.js +7 -15
- package/dist/utils/stark.d.ts +0 -1
- package/dist/utils/stark.js +1 -30
- package/package.json +1 -1
- package/provider/default.d.ts +11 -5
- package/provider/default.js +16 -7
- package/signer/default.js +2 -2
- package/src/provider/default.ts +22 -11
- package/src/signer/default.ts +2 -2
- package/src/types.ts +6 -6
- package/src/utils/ellipticCurve.ts +1 -1
- package/src/utils/hash.ts +6 -14
- package/src/utils/stark.ts +1 -5
- package/tsconfig.json +3 -2
- package/types.d.ts +6 -6
- package/utils/ellipticCurve.js +1 -1
- package/utils/hash.d.ts +1 -0
- package/utils/hash.js +16 -15
- package/utils/stark.d.ts +0 -1
- package/utils/stark.js +1 -45
|
@@ -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
|
-
'
|
|
23
|
+
'0x66bd4335902683054d08a0572747ea78ebd9e531536fb43125424ca9f902084'
|
|
24
24
|
);
|
|
25
25
|
expect(array).toStrictEqual(['1', '2', '3', '4']);
|
|
26
26
|
|
|
27
27
|
expect(hashCalldata(['1', '2'])).toBe(
|
|
28
|
-
'
|
|
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('
|
|
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('
|
|
45
|
+
toBN('2458502865976494910213617956670505342647705497324144349552978333078363662855').toString()
|
|
46
46
|
);
|
|
47
47
|
expect(s.toString()).toStrictEqual(
|
|
48
|
-
toBN('
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
6
|
-
network
|
|
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):
|
|
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
|
*
|
package/dist/provider/default.js
CHANGED
|
@@ -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
|
|
70
|
-
|
|
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://
|
|
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 =
|
|
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' ||
|
|
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') {
|
package/dist/signer/default.js
CHANGED
|
@@ -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)('
|
|
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)(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
+
block_hash: string;
|
|
86
86
|
};
|
|
87
87
|
export declare type GetTransactionResponse = {
|
|
88
88
|
status: Status;
|
|
89
89
|
transaction: Transaction;
|
|
90
|
-
|
|
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
|
|
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;
|
package/dist/utils/hash.d.ts
CHANGED
|
@@ -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;
|
package/dist/utils/hash.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
90
|
-
return pedersen([hash2, nonce]);
|
|
82
|
+
return computeHashOnElements([account, to, selector, calldataHash, nonce]);
|
|
91
83
|
}
|
|
92
84
|
exports.hashMessage = hashMessage;
|
package/dist/utils/stark.d.ts
CHANGED
|
@@ -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;
|
package/dist/utils/stark.js
CHANGED
|
@@ -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.
|
|
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
package/provider/default.d.ts
CHANGED
|
@@ -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
|
-
|
|
17
|
-
|
|
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(
|
|
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
|
*
|
package/provider/default.js
CHANGED
|
@@ -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
|
|
171
|
-
|
|
172
|
-
|
|
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://
|
|
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 =
|
|
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 (
|
|
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)('
|
|
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
|
-
|
|
247
|
+
this.address,
|
|
248
248
|
tx.contract_address,
|
|
249
249
|
tx.entry_point_selector,
|
|
250
250
|
calldataDecimal,
|
package/src/provider/default.ts
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
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
|
|
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
|
|
44
|
-
|
|
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://
|
|
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 =
|
|
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 (
|
|
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');
|
package/src/signer/default.ts
CHANGED
|
@@ -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('
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
94
|
+
block_hash: string;
|
|
95
95
|
};
|
|
96
96
|
|
|
97
97
|
export type GetTransactionResponse = {
|
|
98
98
|
status: Status;
|
|
99
99
|
transaction: Transaction;
|
|
100
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
70
|
-
return pedersen([hash2, nonce]);
|
|
62
|
+
return computeHashOnElements([account, to, selector, calldataHash, nonce]);
|
|
71
63
|
}
|
package/src/utils/stark.ts
CHANGED
|
@@ -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 {
|
|
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":
|
|
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": "
|
|
114
|
+
"sort": "required-first"
|
|
114
115
|
}
|
|
115
116
|
}
|