@keplr-wallet/hooks-starknet 0.12.157-rc.0 → 0.12.158-rc.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/build/tx/errors.d.ts +6 -0
- package/build/tx/errors.js +17 -1
- package/build/tx/errors.js.map +1 -1
- package/build/tx/recipient.d.ts +19 -2
- package/build/tx/recipient.js +265 -14
- package/build/tx/recipient.js.map +1 -1
- package/build/tx/types.d.ts +6 -0
- package/package.json +16 -15
- package/src/tx/errors.ts +16 -0
- package/src/tx/recipient.ts +348 -19
- package/src/tx/types.ts +7 -0
package/build/tx/errors.d.ts
CHANGED
|
@@ -46,3 +46,9 @@ export declare class InvalidHexError extends Error {
|
|
|
46
46
|
export declare class MemoSuspectMnemonicInclusion extends Error {
|
|
47
47
|
constructor(m: string);
|
|
48
48
|
}
|
|
49
|
+
export declare class StarknetIDIsFetchingError extends Error {
|
|
50
|
+
constructor(m: string);
|
|
51
|
+
}
|
|
52
|
+
export declare class StarknetIDFailedToFetchError extends Error {
|
|
53
|
+
constructor(m: string);
|
|
54
|
+
}
|
package/build/tx/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MemoSuspectMnemonicInclusion = exports.InvalidHexError = exports.NotSupportedCurrencyError = exports.UnknownCurrencyError = exports.InsufficientFeeError = exports.NotLoadedFeeError = exports.InsufficientAmountError = exports.NegativeAmountError = exports.ZeroAmountError = exports.InvalidNumberAmountError = exports.EmptyAmountError = exports.ICNSFailedToFetchError = exports.ICNSIsFetchingError = exports.InvalidBech32Error = exports.EmptyAddressError = exports.AccountNotDeployed = void 0;
|
|
3
|
+
exports.StarknetIDFailedToFetchError = exports.StarknetIDIsFetchingError = exports.MemoSuspectMnemonicInclusion = exports.InvalidHexError = exports.NotSupportedCurrencyError = exports.UnknownCurrencyError = exports.InsufficientFeeError = exports.NotLoadedFeeError = exports.InsufficientAmountError = exports.NegativeAmountError = exports.ZeroAmountError = exports.InvalidNumberAmountError = exports.EmptyAmountError = exports.ICNSFailedToFetchError = exports.ICNSIsFetchingError = exports.InvalidBech32Error = exports.EmptyAddressError = exports.AccountNotDeployed = void 0;
|
|
4
4
|
class AccountNotDeployed extends Error {
|
|
5
5
|
constructor(m) {
|
|
6
6
|
super(m);
|
|
@@ -129,4 +129,20 @@ class MemoSuspectMnemonicInclusion extends Error {
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
exports.MemoSuspectMnemonicInclusion = MemoSuspectMnemonicInclusion;
|
|
132
|
+
class StarknetIDIsFetchingError extends Error {
|
|
133
|
+
constructor(m) {
|
|
134
|
+
super(m);
|
|
135
|
+
// Set the prototype explicitly.
|
|
136
|
+
Object.setPrototypeOf(this, StarknetIDIsFetchingError.prototype);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.StarknetIDIsFetchingError = StarknetIDIsFetchingError;
|
|
140
|
+
class StarknetIDFailedToFetchError extends Error {
|
|
141
|
+
constructor(m) {
|
|
142
|
+
super(m);
|
|
143
|
+
// Set the prototype explicitly.
|
|
144
|
+
Object.setPrototypeOf(this, StarknetIDFailedToFetchError.prototype);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.StarknetIDFailedToFetchError = StarknetIDFailedToFetchError;
|
|
132
148
|
//# sourceMappingURL=errors.js.map
|
package/build/tx/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/tx/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/tx/errors.ts"],"names":[],"mappings":"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"}
|
package/build/tx/recipient.d.ts
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
import { IRecipientConfig, UIProperties } from "./types";
|
|
1
|
+
import { IRecipientConfig, IRecipientConfigWithStarknetID, UIProperties } from "./types";
|
|
2
2
|
import { TxChainSetter } from "./chain";
|
|
3
3
|
import { ChainGetter } from "@keplr-wallet/stores";
|
|
4
|
-
|
|
4
|
+
interface StarknetIDFetchData {
|
|
5
|
+
isFetching: boolean;
|
|
6
|
+
starknetHexAddress?: string;
|
|
7
|
+
error?: Error;
|
|
8
|
+
}
|
|
9
|
+
export declare class RecipientConfig extends TxChainSetter implements IRecipientConfig, IRecipientConfigWithStarknetID {
|
|
5
10
|
protected _value: string;
|
|
11
|
+
protected _starknetID: {
|
|
12
|
+
networkName: string;
|
|
13
|
+
namingContractAddress: string;
|
|
14
|
+
} | undefined;
|
|
15
|
+
protected _starknetIDFetchDataMap: Map<string, StarknetIDFetchData>;
|
|
6
16
|
constructor(chainGetter: ChainGetter, initialChainId: string);
|
|
17
|
+
setStarknetID(chainId: string): void;
|
|
18
|
+
protected getStarknetIDFetchData(username: string): StarknetIDFetchData;
|
|
19
|
+
get isStarknetIDEnabled(): boolean;
|
|
20
|
+
get isStarknetID(): boolean;
|
|
21
|
+
get isStarknetIDFetching(): boolean;
|
|
22
|
+
get starknetExpectedDomain(): string;
|
|
7
23
|
get recipient(): string;
|
|
8
24
|
get uiProperties(): UIProperties;
|
|
9
25
|
get value(): string;
|
|
10
26
|
setValue(value: string): void;
|
|
11
27
|
}
|
|
12
28
|
export declare const useRecipientConfig: (chainGetter: ChainGetter, chainId: string) => RecipientConfig;
|
|
29
|
+
export {};
|
package/build/tx/recipient.js
CHANGED
|
@@ -12,18 +12,234 @@ const mobx_1 = require("mobx");
|
|
|
12
12
|
const errors_1 = require("./errors");
|
|
13
13
|
const react_1 = require("react");
|
|
14
14
|
const buffer_1 = require("buffer/");
|
|
15
|
+
const simple_fetch_1 = require("@keplr-wallet/simple-fetch");
|
|
16
|
+
const starknet_1 = require("starknet");
|
|
17
|
+
const networkToNamingContractAddress = {
|
|
18
|
+
[starknet_1.constants.NetworkName.SN_MAIN]: "0x6ac597f8116f886fa1c97a23fa4e08299975ecaf6b598873ca6792b9bbfb678",
|
|
19
|
+
[starknet_1.constants.NetworkName.SN_SEPOLIA]: "0x0707f09bc576bd7cfee59694846291047e965f4184fe13dac62c56759b3b6fa7",
|
|
20
|
+
};
|
|
21
|
+
const basicAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789-";
|
|
22
|
+
const basicSizePlusOne = BigInt(basicAlphabet.length + 1);
|
|
23
|
+
const bigAlphabet = "这来";
|
|
24
|
+
const basicAlphabetSize = BigInt(basicAlphabet.length);
|
|
25
|
+
const bigAlphabetSize = BigInt(bigAlphabet.length);
|
|
26
|
+
// Reference: https://github.com/lfglabs-dev/starknetid.js/blob/main/packages/core/src/utils.ts
|
|
27
|
+
function isStarkDomain(domain) {
|
|
28
|
+
return /^(?:[a-z0-9-]{1,48}(?:[a-z0-9-]{1,48}[a-z0-9-])?\.)*[a-z0-9-]{1,48}\.stark$/.test(domain);
|
|
29
|
+
}
|
|
30
|
+
function encodeDomain(domain) {
|
|
31
|
+
if (!domain)
|
|
32
|
+
return [BigInt(0)];
|
|
33
|
+
const encoded = [];
|
|
34
|
+
for (const subdomain of domain.replace(".stark", "").split("."))
|
|
35
|
+
encoded.push(encode(subdomain));
|
|
36
|
+
return encoded;
|
|
37
|
+
}
|
|
38
|
+
function extractStars(str) {
|
|
39
|
+
let k = 0;
|
|
40
|
+
while (str.endsWith(bigAlphabet[bigAlphabet.length - 1])) {
|
|
41
|
+
str = str.substring(0, str.length - 1);
|
|
42
|
+
k += 1;
|
|
43
|
+
}
|
|
44
|
+
return [str, k];
|
|
45
|
+
}
|
|
46
|
+
function encode(decoded) {
|
|
47
|
+
let encoded = BigInt(0);
|
|
48
|
+
let multiplier = BigInt(1);
|
|
49
|
+
if (!decoded) {
|
|
50
|
+
return encoded;
|
|
51
|
+
}
|
|
52
|
+
if (decoded.endsWith(bigAlphabet[0] + basicAlphabet[1])) {
|
|
53
|
+
const [str, k] = extractStars(decoded.substring(0, decoded.length - 2));
|
|
54
|
+
decoded = str + bigAlphabet[bigAlphabet.length - 1].repeat(2 * (k + 1));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const [str, k] = extractStars(decoded);
|
|
58
|
+
if (k)
|
|
59
|
+
decoded =
|
|
60
|
+
str + bigAlphabet[bigAlphabet.length - 1].repeat(1 + 2 * (k - 1));
|
|
61
|
+
}
|
|
62
|
+
for (let i = 0; i < decoded.length; i += 1) {
|
|
63
|
+
const char = decoded[i];
|
|
64
|
+
const index = basicAlphabet.indexOf(char);
|
|
65
|
+
const bnIndex = BigInt(basicAlphabet.indexOf(char));
|
|
66
|
+
if (index !== -1) {
|
|
67
|
+
// add encoded + multiplier * index
|
|
68
|
+
if (i === decoded.length - 1 && decoded[i] === basicAlphabet[0]) {
|
|
69
|
+
encoded += multiplier * basicAlphabetSize;
|
|
70
|
+
multiplier *= basicSizePlusOne;
|
|
71
|
+
// add 0
|
|
72
|
+
multiplier *= basicSizePlusOne;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
encoded += multiplier * bnIndex;
|
|
76
|
+
multiplier *= basicSizePlusOne;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (bigAlphabet.indexOf(char) !== -1) {
|
|
80
|
+
// add encoded + multiplier * (basicAlphabetSize)
|
|
81
|
+
encoded += multiplier * basicAlphabetSize;
|
|
82
|
+
multiplier *= basicSizePlusOne;
|
|
83
|
+
// add encoded + multiplier * index
|
|
84
|
+
const newid = (i === decoded.length - 1 ? 1 : 0) + bigAlphabet.indexOf(char);
|
|
85
|
+
encoded += multiplier * BigInt(newid);
|
|
86
|
+
multiplier *= bigAlphabetSize;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return encoded;
|
|
90
|
+
}
|
|
91
|
+
function isStarknetHexAddress(address) {
|
|
92
|
+
if (!address.startsWith("0x")) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const hex = address.replace("0x", "");
|
|
96
|
+
const buf = buffer_1.Buffer.from(hex, "hex");
|
|
97
|
+
if (buf.length !== 32) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
if (hex.toLowerCase() !== buf.toString("hex").toLowerCase()) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
15
105
|
class RecipientConfig extends chain_1.TxChainSetter {
|
|
16
106
|
constructor(chainGetter, initialChainId) {
|
|
17
107
|
super(chainGetter, initialChainId);
|
|
18
108
|
this._value = "";
|
|
109
|
+
// Deep equal check is required to avoid infinite re-render.
|
|
110
|
+
this._starknetID = undefined;
|
|
111
|
+
// Key is {chain identifier}/{starknet username}
|
|
112
|
+
this._starknetIDFetchDataMap = new Map();
|
|
19
113
|
(0, mobx_1.makeObservable)(this);
|
|
20
114
|
}
|
|
115
|
+
setStarknetID(chainId) {
|
|
116
|
+
const split = chainId.split(":"); // `starknet:networkName`
|
|
117
|
+
if (split.length < 2) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const networkName = split[1];
|
|
121
|
+
if (!networkName) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const namingContractAddress = networkToNamingContractAddress[networkName];
|
|
125
|
+
if (!namingContractAddress) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this._starknetID = {
|
|
129
|
+
networkName,
|
|
130
|
+
namingContractAddress,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
getStarknetIDFetchData(username) {
|
|
134
|
+
var _a;
|
|
135
|
+
const modularChainInfo = this.chainGetter.getModularChain(this.chainId);
|
|
136
|
+
if (!("starknet" in modularChainInfo)) {
|
|
137
|
+
throw new Error(`${this.chainId} is not starknet chain`);
|
|
138
|
+
}
|
|
139
|
+
if (!this._starknetID) {
|
|
140
|
+
throw new Error("Starknet ID is not set");
|
|
141
|
+
}
|
|
142
|
+
if (!isStarkDomain(username)) {
|
|
143
|
+
return {
|
|
144
|
+
isFetching: false,
|
|
145
|
+
error: new Error("Invalid domain for Starknet ID"),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const key = `${this.chainId}/${username}`;
|
|
149
|
+
if (!this._starknetIDFetchDataMap.has(key)) {
|
|
150
|
+
(0, mobx_1.runInAction)(() => {
|
|
151
|
+
this._starknetIDFetchDataMap.set(key, {
|
|
152
|
+
isFetching: true,
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
const domain = encodeDomain(username).map((v) => v.toString(10));
|
|
156
|
+
(0, simple_fetch_1.simpleFetch)(modularChainInfo.starknet.rpc, "", {
|
|
157
|
+
method: "POST",
|
|
158
|
+
headers: {
|
|
159
|
+
"content-type": "application/json",
|
|
160
|
+
},
|
|
161
|
+
body: JSON.stringify({
|
|
162
|
+
jsonrpc: "2.0",
|
|
163
|
+
id: "1",
|
|
164
|
+
method: "starknet_call",
|
|
165
|
+
params: [
|
|
166
|
+
{
|
|
167
|
+
contract_address: this._starknetID.namingContractAddress,
|
|
168
|
+
calldata: starknet_1.CallData.toHex({ domain, hint: [] }),
|
|
169
|
+
entry_point_selector: "0x2e269d930f6d7ab92b15ce8ff9f5e63709391617e3465fff79ba6baf278ce60", // selector.getSelectorFromName("domain_to_address"),
|
|
170
|
+
},
|
|
171
|
+
"latest",
|
|
172
|
+
],
|
|
173
|
+
}),
|
|
174
|
+
signal: new AbortController().signal,
|
|
175
|
+
})
|
|
176
|
+
.then((resp) => {
|
|
177
|
+
if (resp.data.error && resp.data.error.message) {
|
|
178
|
+
throw new errors_1.StarknetIDIsFetchingError(resp.data.error.message);
|
|
179
|
+
}
|
|
180
|
+
const data = resp.data.result;
|
|
181
|
+
if (!data) {
|
|
182
|
+
throw new errors_1.StarknetIDIsFetchingError("no address found");
|
|
183
|
+
}
|
|
184
|
+
const rawHexAddr = data[0];
|
|
185
|
+
if (rawHexAddr === "0x0") {
|
|
186
|
+
throw new errors_1.StarknetIDIsFetchingError("no address found");
|
|
187
|
+
}
|
|
188
|
+
const addr = "0x" + rawHexAddr.replace("0x", "").padStart(64, "0");
|
|
189
|
+
if (!isStarknetHexAddress(addr)) {
|
|
190
|
+
throw new errors_1.StarknetIDIsFetchingError("no address found");
|
|
191
|
+
}
|
|
192
|
+
(0, mobx_1.runInAction)(() => {
|
|
193
|
+
this._starknetIDFetchDataMap.set(key, {
|
|
194
|
+
isFetching: false,
|
|
195
|
+
starknetHexAddress: addr,
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
})
|
|
199
|
+
.catch((error) => {
|
|
200
|
+
(0, mobx_1.runInAction)(() => {
|
|
201
|
+
this._starknetIDFetchDataMap.set(key, {
|
|
202
|
+
isFetching: false,
|
|
203
|
+
error,
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return (_a = this._starknetIDFetchDataMap.get(key)) !== null && _a !== void 0 ? _a : { isFetching: false };
|
|
209
|
+
}
|
|
210
|
+
get isStarknetIDEnabled() {
|
|
211
|
+
return !!this._starknetID;
|
|
212
|
+
}
|
|
213
|
+
get isStarknetID() {
|
|
214
|
+
if (this.isStarknetIDEnabled) {
|
|
215
|
+
const parsed = this.value.trim().split(".");
|
|
216
|
+
return parsed.length > 1 && parsed[parsed.length - 1] === "stark";
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
get isStarknetIDFetching() {
|
|
221
|
+
if (!this.isStarknetIDEnabled || !this.isStarknetID) {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
return this.getStarknetIDFetchData(this.value.trim()).isFetching;
|
|
225
|
+
}
|
|
226
|
+
get starknetExpectedDomain() {
|
|
227
|
+
return "stark";
|
|
228
|
+
}
|
|
21
229
|
get recipient() {
|
|
22
230
|
const rawRecipient = this.value.trim();
|
|
23
231
|
const modularChainInfo = this.modularChainInfo;
|
|
24
232
|
if (!("starknet" in modularChainInfo)) {
|
|
25
233
|
throw new Error("Chain doesn't support the starknet");
|
|
26
234
|
}
|
|
235
|
+
if (this.isStarknetIDEnabled && this.isStarknetID) {
|
|
236
|
+
try {
|
|
237
|
+
return (this.getStarknetIDFetchData(rawRecipient).starknetHexAddress || "");
|
|
238
|
+
}
|
|
239
|
+
catch (_a) {
|
|
240
|
+
return "";
|
|
241
|
+
}
|
|
242
|
+
}
|
|
27
243
|
return rawRecipient;
|
|
28
244
|
}
|
|
29
245
|
get uiProperties() {
|
|
@@ -33,25 +249,44 @@ class RecipientConfig extends chain_1.TxChainSetter {
|
|
|
33
249
|
error: new errors_1.EmptyAddressError("Address is empty"),
|
|
34
250
|
};
|
|
35
251
|
}
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
252
|
+
if (this.isStarknetIDEnabled && this.isStarknetID) {
|
|
253
|
+
try {
|
|
254
|
+
const fetched = this.getStarknetIDFetchData(rawRecipient);
|
|
255
|
+
if (fetched.isFetching) {
|
|
256
|
+
return {
|
|
257
|
+
loadingState: "loading-block",
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
if (fetched.error) {
|
|
261
|
+
if (fetched.error instanceof errors_1.StarknetIDIsFetchingError) {
|
|
262
|
+
return {
|
|
263
|
+
error: new errors_1.StarknetIDFailedToFetchError("Failed to fetch the address from Starknet ID"),
|
|
264
|
+
loadingState: fetched.isFetching ? "loading-block" : undefined,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
error: fetched.error,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
if (!fetched.starknetHexAddress) {
|
|
272
|
+
return {
|
|
273
|
+
error: new errors_1.StarknetIDFailedToFetchError("Failed to fetch the address from Starknet ID"),
|
|
274
|
+
loadingState: fetched.isFetching ? "loading-block" : undefined,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
return {};
|
|
48
278
|
}
|
|
49
|
-
|
|
279
|
+
catch (e) {
|
|
50
280
|
return {
|
|
51
|
-
error:
|
|
281
|
+
error: e,
|
|
52
282
|
};
|
|
53
283
|
}
|
|
54
284
|
}
|
|
285
|
+
if (!isStarknetHexAddress(rawRecipient)) {
|
|
286
|
+
return {
|
|
287
|
+
error: new errors_1.InvalidHexError("Invalid hex address for chain"),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
55
290
|
return {};
|
|
56
291
|
}
|
|
57
292
|
get value() {
|
|
@@ -64,6 +299,21 @@ class RecipientConfig extends chain_1.TxChainSetter {
|
|
|
64
299
|
__decorate([
|
|
65
300
|
mobx_1.observable
|
|
66
301
|
], RecipientConfig.prototype, "_value", void 0);
|
|
302
|
+
__decorate([
|
|
303
|
+
mobx_1.observable.struct
|
|
304
|
+
], RecipientConfig.prototype, "_starknetID", void 0);
|
|
305
|
+
__decorate([
|
|
306
|
+
mobx_1.observable.shallow
|
|
307
|
+
], RecipientConfig.prototype, "_starknetIDFetchDataMap", void 0);
|
|
308
|
+
__decorate([
|
|
309
|
+
mobx_1.action
|
|
310
|
+
], RecipientConfig.prototype, "setStarknetID", null);
|
|
311
|
+
__decorate([
|
|
312
|
+
mobx_1.computed
|
|
313
|
+
], RecipientConfig.prototype, "isStarknetID", null);
|
|
314
|
+
__decorate([
|
|
315
|
+
mobx_1.computed
|
|
316
|
+
], RecipientConfig.prototype, "isStarknetIDFetching", null);
|
|
67
317
|
__decorate([
|
|
68
318
|
mobx_1.computed
|
|
69
319
|
], RecipientConfig.prototype, "uiProperties", null);
|
|
@@ -74,6 +324,7 @@ exports.RecipientConfig = RecipientConfig;
|
|
|
74
324
|
const useRecipientConfig = (chainGetter, chainId) => {
|
|
75
325
|
const [config] = (0, react_1.useState)(() => new RecipientConfig(chainGetter, chainId));
|
|
76
326
|
config.setChain(chainId);
|
|
327
|
+
config.setStarknetID(chainId);
|
|
77
328
|
return config;
|
|
78
329
|
};
|
|
79
330
|
exports.useRecipientConfig = useRecipientConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipient.js","sourceRoot":"","sources":["../../src/tx/recipient.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"recipient.js","sourceRoot":"","sources":["../../src/tx/recipient.ts"],"names":[],"mappings":"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"}
|
package/build/tx/types.d.ts
CHANGED
|
@@ -40,6 +40,12 @@ export interface IRecipientConfig extends ITxChainSetter {
|
|
|
40
40
|
recipient: string;
|
|
41
41
|
uiProperties: UIProperties;
|
|
42
42
|
}
|
|
43
|
+
export interface IRecipientConfigWithStarknetID extends IRecipientConfig {
|
|
44
|
+
readonly isStarknetIDEnabled: boolean;
|
|
45
|
+
readonly isStarknetID: boolean;
|
|
46
|
+
readonly starknetExpectedDomain: string;
|
|
47
|
+
readonly isStarknetIDFetching: boolean;
|
|
48
|
+
}
|
|
43
49
|
export interface IAmountConfig extends ITxChainSetter {
|
|
44
50
|
amount: CoinPretty[];
|
|
45
51
|
value: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keplr-wallet/hooks-starknet",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.158-rc.0",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"author": "chainapsis",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@ethersproject/address": "^5.7.0",
|
|
20
20
|
"@ethersproject/providers": "^5.7.0",
|
|
21
|
-
"@keplr-wallet/background": "0.12.
|
|
22
|
-
"@keplr-wallet/common": "0.12.
|
|
23
|
-
"@keplr-wallet/cosmos": "0.12.
|
|
24
|
-
"@keplr-wallet/crypto": "0.12.
|
|
25
|
-
"@keplr-wallet/proto-types": "0.12.
|
|
26
|
-
"@keplr-wallet/simple-fetch": "0.12.
|
|
27
|
-
"@keplr-wallet/stores": "0.12.
|
|
28
|
-
"@keplr-wallet/stores-etc": "0.12.
|
|
29
|
-
"@keplr-wallet/stores-eth": "0.12.
|
|
30
|
-
"@keplr-wallet/stores-starknet": "0.12.
|
|
31
|
-
"@keplr-wallet/types": "0.12.
|
|
32
|
-
"@keplr-wallet/unit": "0.12.
|
|
21
|
+
"@keplr-wallet/background": "0.12.158-rc.0",
|
|
22
|
+
"@keplr-wallet/common": "0.12.158-rc.0",
|
|
23
|
+
"@keplr-wallet/cosmos": "0.12.158-rc.0",
|
|
24
|
+
"@keplr-wallet/crypto": "0.12.158-rc.0",
|
|
25
|
+
"@keplr-wallet/proto-types": "0.12.158-rc.0",
|
|
26
|
+
"@keplr-wallet/simple-fetch": "0.12.158-rc.0",
|
|
27
|
+
"@keplr-wallet/stores": "0.12.158-rc.0",
|
|
28
|
+
"@keplr-wallet/stores-etc": "0.12.158-rc.0",
|
|
29
|
+
"@keplr-wallet/stores-eth": "0.12.158-rc.0",
|
|
30
|
+
"@keplr-wallet/stores-starknet": "0.12.158-rc.0",
|
|
31
|
+
"@keplr-wallet/types": "0.12.158-rc.0",
|
|
32
|
+
"@keplr-wallet/unit": "0.12.158-rc.0",
|
|
33
33
|
"buffer": "^6.0.3",
|
|
34
34
|
"long": "^4.0.0",
|
|
35
35
|
"utility-types": "^3.10.0"
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"mobx": "^6",
|
|
39
39
|
"mobx-utils": "^6",
|
|
40
|
-
"react": "^16.8.0 || ^17 || ^18"
|
|
40
|
+
"react": "^16.8.0 || ^17 || ^18",
|
|
41
|
+
"starknet": "^6"
|
|
41
42
|
},
|
|
42
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "bb665e095302f27112e7a8897d8edd8830607aec"
|
|
43
44
|
}
|
package/src/tx/errors.ts
CHANGED
|
@@ -125,3 +125,19 @@ export class MemoSuspectMnemonicInclusion extends Error {
|
|
|
125
125
|
Object.setPrototypeOf(this, MemoSuspectMnemonicInclusion.prototype);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
|
+
|
|
129
|
+
export class StarknetIDIsFetchingError extends Error {
|
|
130
|
+
constructor(m: string) {
|
|
131
|
+
super(m);
|
|
132
|
+
// Set the prototype explicitly.
|
|
133
|
+
Object.setPrototypeOf(this, StarknetIDIsFetchingError.prototype);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export class StarknetIDFailedToFetchError extends Error {
|
|
138
|
+
constructor(m: string) {
|
|
139
|
+
super(m);
|
|
140
|
+
// Set the prototype explicitly.
|
|
141
|
+
Object.setPrototypeOf(this, StarknetIDFailedToFetchError.prototype);
|
|
142
|
+
}
|
|
143
|
+
}
|
package/src/tx/recipient.ts
CHANGED
|
@@ -1,21 +1,312 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
IRecipientConfig,
|
|
3
|
+
IRecipientConfigWithStarknetID,
|
|
4
|
+
UIProperties,
|
|
5
|
+
} from "./types";
|
|
2
6
|
import { TxChainSetter } from "./chain";
|
|
3
7
|
import { ChainGetter } from "@keplr-wallet/stores";
|
|
4
|
-
import {
|
|
5
|
-
|
|
8
|
+
import {
|
|
9
|
+
action,
|
|
10
|
+
computed,
|
|
11
|
+
makeObservable,
|
|
12
|
+
observable,
|
|
13
|
+
runInAction,
|
|
14
|
+
} from "mobx";
|
|
15
|
+
import {
|
|
16
|
+
EmptyAddressError,
|
|
17
|
+
InvalidHexError,
|
|
18
|
+
StarknetIDFailedToFetchError,
|
|
19
|
+
StarknetIDIsFetchingError,
|
|
20
|
+
} from "./errors";
|
|
6
21
|
import { useState } from "react";
|
|
7
22
|
import { Buffer } from "buffer/";
|
|
23
|
+
import { simpleFetch } from "@keplr-wallet/simple-fetch";
|
|
24
|
+
import { CallData, constants } from "starknet";
|
|
8
25
|
|
|
9
|
-
|
|
26
|
+
interface StarknetIDFetchData {
|
|
27
|
+
isFetching: boolean;
|
|
28
|
+
starknetHexAddress?: string;
|
|
29
|
+
error?: Error;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const networkToNamingContractAddress = {
|
|
33
|
+
[constants.NetworkName.SN_MAIN]:
|
|
34
|
+
"0x6ac597f8116f886fa1c97a23fa4e08299975ecaf6b598873ca6792b9bbfb678",
|
|
35
|
+
[constants.NetworkName.SN_SEPOLIA]:
|
|
36
|
+
"0x0707f09bc576bd7cfee59694846291047e965f4184fe13dac62c56759b3b6fa7",
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const basicAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789-";
|
|
40
|
+
const basicSizePlusOne = BigInt(basicAlphabet.length + 1);
|
|
41
|
+
const bigAlphabet = "这来";
|
|
42
|
+
const basicAlphabetSize = BigInt(basicAlphabet.length);
|
|
43
|
+
const bigAlphabetSize = BigInt(bigAlphabet.length);
|
|
44
|
+
|
|
45
|
+
// Reference: https://github.com/lfglabs-dev/starknetid.js/blob/main/packages/core/src/utils.ts
|
|
46
|
+
function isStarkDomain(domain: string): boolean {
|
|
47
|
+
return /^(?:[a-z0-9-]{1,48}(?:[a-z0-9-]{1,48}[a-z0-9-])?\.)*[a-z0-9-]{1,48}\.stark$/.test(
|
|
48
|
+
domain
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function encodeDomain(domain: string | undefined | null): bigint[] {
|
|
53
|
+
if (!domain) return [BigInt(0)];
|
|
54
|
+
|
|
55
|
+
const encoded = [];
|
|
56
|
+
for (const subdomain of domain.replace(".stark", "").split("."))
|
|
57
|
+
encoded.push(encode(subdomain));
|
|
58
|
+
return encoded;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function extractStars(str: string): [string, number] {
|
|
62
|
+
let k = 0;
|
|
63
|
+
while (str.endsWith(bigAlphabet[bigAlphabet.length - 1])) {
|
|
64
|
+
str = str.substring(0, str.length - 1);
|
|
65
|
+
k += 1;
|
|
66
|
+
}
|
|
67
|
+
return [str, k];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function encode(decoded: string | undefined): bigint {
|
|
71
|
+
let encoded = BigInt(0);
|
|
72
|
+
let multiplier = BigInt(1);
|
|
73
|
+
|
|
74
|
+
if (!decoded) {
|
|
75
|
+
return encoded;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (decoded.endsWith(bigAlphabet[0] + basicAlphabet[1])) {
|
|
79
|
+
const [str, k] = extractStars(decoded.substring(0, decoded.length - 2));
|
|
80
|
+
decoded = str + bigAlphabet[bigAlphabet.length - 1].repeat(2 * (k + 1));
|
|
81
|
+
} else {
|
|
82
|
+
const [str, k] = extractStars(decoded);
|
|
83
|
+
if (k)
|
|
84
|
+
decoded =
|
|
85
|
+
str + bigAlphabet[bigAlphabet.length - 1].repeat(1 + 2 * (k - 1));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
for (let i = 0; i < decoded.length; i += 1) {
|
|
89
|
+
const char = decoded[i];
|
|
90
|
+
const index = basicAlphabet.indexOf(char);
|
|
91
|
+
const bnIndex = BigInt(basicAlphabet.indexOf(char));
|
|
92
|
+
|
|
93
|
+
if (index !== -1) {
|
|
94
|
+
// add encoded + multiplier * index
|
|
95
|
+
if (i === decoded.length - 1 && decoded[i] === basicAlphabet[0]) {
|
|
96
|
+
encoded += multiplier * basicAlphabetSize;
|
|
97
|
+
multiplier *= basicSizePlusOne;
|
|
98
|
+
// add 0
|
|
99
|
+
multiplier *= basicSizePlusOne;
|
|
100
|
+
} else {
|
|
101
|
+
encoded += multiplier * bnIndex;
|
|
102
|
+
multiplier *= basicSizePlusOne;
|
|
103
|
+
}
|
|
104
|
+
} else if (bigAlphabet.indexOf(char) !== -1) {
|
|
105
|
+
// add encoded + multiplier * (basicAlphabetSize)
|
|
106
|
+
encoded += multiplier * basicAlphabetSize;
|
|
107
|
+
multiplier *= basicSizePlusOne;
|
|
108
|
+
// add encoded + multiplier * index
|
|
109
|
+
const newid =
|
|
110
|
+
(i === decoded.length - 1 ? 1 : 0) + bigAlphabet.indexOf(char);
|
|
111
|
+
encoded += multiplier * BigInt(newid);
|
|
112
|
+
multiplier *= bigAlphabetSize;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return encoded;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function isStarknetHexAddress(address: string): boolean {
|
|
120
|
+
if (!address.startsWith("0x")) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const hex = address.replace("0x", "");
|
|
125
|
+
const buf = Buffer.from(hex, "hex");
|
|
126
|
+
if (buf.length !== 32) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
if (hex.toLowerCase() !== buf.toString("hex").toLowerCase()) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export class RecipientConfig
|
|
137
|
+
extends TxChainSetter
|
|
138
|
+
implements IRecipientConfig, IRecipientConfigWithStarknetID
|
|
139
|
+
{
|
|
10
140
|
@observable
|
|
11
141
|
protected _value: string = "";
|
|
12
142
|
|
|
143
|
+
// Deep equal check is required to avoid infinite re-render.
|
|
144
|
+
@observable.struct
|
|
145
|
+
protected _starknetID:
|
|
146
|
+
| {
|
|
147
|
+
networkName: string;
|
|
148
|
+
namingContractAddress: string;
|
|
149
|
+
}
|
|
150
|
+
| undefined = undefined;
|
|
151
|
+
|
|
152
|
+
// Key is {chain identifier}/{starknet username}
|
|
153
|
+
@observable.shallow
|
|
154
|
+
protected _starknetIDFetchDataMap = new Map<string, StarknetIDFetchData>();
|
|
155
|
+
|
|
13
156
|
constructor(chainGetter: ChainGetter, initialChainId: string) {
|
|
14
157
|
super(chainGetter, initialChainId);
|
|
15
158
|
|
|
16
159
|
makeObservable(this);
|
|
17
160
|
}
|
|
18
161
|
|
|
162
|
+
@action
|
|
163
|
+
setStarknetID(chainId: string) {
|
|
164
|
+
const split = chainId.split(":"); // `starknet:networkName`
|
|
165
|
+
if (split.length < 2) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const networkName = split[1] as constants.NetworkName;
|
|
170
|
+
if (!networkName) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const namingContractAddress = networkToNamingContractAddress[networkName];
|
|
175
|
+
if (!namingContractAddress) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
this._starknetID = {
|
|
180
|
+
networkName,
|
|
181
|
+
namingContractAddress,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
protected getStarknetIDFetchData(username: string): StarknetIDFetchData {
|
|
186
|
+
const modularChainInfo = this.chainGetter.getModularChain(this.chainId);
|
|
187
|
+
if (!("starknet" in modularChainInfo)) {
|
|
188
|
+
throw new Error(`${this.chainId} is not starknet chain`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (!this._starknetID) {
|
|
192
|
+
throw new Error("Starknet ID is not set");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (!isStarkDomain(username)) {
|
|
196
|
+
return {
|
|
197
|
+
isFetching: false,
|
|
198
|
+
error: new Error("Invalid domain for Starknet ID"),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const key = `${this.chainId}/${username}`;
|
|
203
|
+
|
|
204
|
+
if (!this._starknetIDFetchDataMap.has(key)) {
|
|
205
|
+
runInAction(() => {
|
|
206
|
+
this._starknetIDFetchDataMap.set(key, {
|
|
207
|
+
isFetching: true,
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
const domain = encodeDomain(username).map((v) => v.toString(10));
|
|
212
|
+
|
|
213
|
+
simpleFetch<{
|
|
214
|
+
jsonrpc: "2.0";
|
|
215
|
+
result?: string[];
|
|
216
|
+
id: string;
|
|
217
|
+
error?: {
|
|
218
|
+
code?: number;
|
|
219
|
+
message?: string;
|
|
220
|
+
};
|
|
221
|
+
}>(modularChainInfo.starknet.rpc, "", {
|
|
222
|
+
method: "POST",
|
|
223
|
+
headers: {
|
|
224
|
+
"content-type": "application/json",
|
|
225
|
+
},
|
|
226
|
+
body: JSON.stringify({
|
|
227
|
+
jsonrpc: "2.0",
|
|
228
|
+
id: "1",
|
|
229
|
+
method: "starknet_call",
|
|
230
|
+
params: [
|
|
231
|
+
{
|
|
232
|
+
contract_address: this._starknetID.namingContractAddress,
|
|
233
|
+
calldata: CallData.toHex({ domain, hint: [] }),
|
|
234
|
+
entry_point_selector:
|
|
235
|
+
"0x2e269d930f6d7ab92b15ce8ff9f5e63709391617e3465fff79ba6baf278ce60", // selector.getSelectorFromName("domain_to_address"),
|
|
236
|
+
},
|
|
237
|
+
"latest",
|
|
238
|
+
],
|
|
239
|
+
}),
|
|
240
|
+
signal: new AbortController().signal,
|
|
241
|
+
})
|
|
242
|
+
.then((resp) => {
|
|
243
|
+
if (resp.data.error && resp.data.error.message) {
|
|
244
|
+
throw new StarknetIDIsFetchingError(resp.data.error.message);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const data = resp.data.result;
|
|
248
|
+
if (!data) {
|
|
249
|
+
throw new StarknetIDIsFetchingError("no address found");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const rawHexAddr = data[0];
|
|
253
|
+
if (rawHexAddr === "0x0") {
|
|
254
|
+
throw new StarknetIDIsFetchingError("no address found");
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const addr = "0x" + rawHexAddr.replace("0x", "").padStart(64, "0");
|
|
258
|
+
|
|
259
|
+
if (!isStarknetHexAddress(addr)) {
|
|
260
|
+
throw new StarknetIDIsFetchingError("no address found");
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
runInAction(() => {
|
|
264
|
+
this._starknetIDFetchDataMap.set(key, {
|
|
265
|
+
isFetching: false,
|
|
266
|
+
starknetHexAddress: addr,
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
})
|
|
270
|
+
.catch((error) => {
|
|
271
|
+
runInAction(() => {
|
|
272
|
+
this._starknetIDFetchDataMap.set(key, {
|
|
273
|
+
isFetching: false,
|
|
274
|
+
error,
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return this._starknetIDFetchDataMap.get(key) ?? { isFetching: false };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
get isStarknetIDEnabled(): boolean {
|
|
284
|
+
return !!this._starknetID;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
@computed
|
|
288
|
+
get isStarknetID(): boolean {
|
|
289
|
+
if (this.isStarknetIDEnabled) {
|
|
290
|
+
const parsed = this.value.trim().split(".");
|
|
291
|
+
return parsed.length > 1 && parsed[parsed.length - 1] === "stark";
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return false;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
@computed
|
|
298
|
+
get isStarknetIDFetching(): boolean {
|
|
299
|
+
if (!this.isStarknetIDEnabled || !this.isStarknetID) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return this.getStarknetIDFetchData(this.value.trim()).isFetching;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
get starknetExpectedDomain(): string {
|
|
307
|
+
return "stark";
|
|
308
|
+
}
|
|
309
|
+
|
|
19
310
|
get recipient(): string {
|
|
20
311
|
const rawRecipient = this.value.trim();
|
|
21
312
|
|
|
@@ -24,6 +315,16 @@ export class RecipientConfig extends TxChainSetter implements IRecipientConfig {
|
|
|
24
315
|
throw new Error("Chain doesn't support the starknet");
|
|
25
316
|
}
|
|
26
317
|
|
|
318
|
+
if (this.isStarknetIDEnabled && this.isStarknetID) {
|
|
319
|
+
try {
|
|
320
|
+
return (
|
|
321
|
+
this.getStarknetIDFetchData(rawRecipient).starknetHexAddress || ""
|
|
322
|
+
);
|
|
323
|
+
} catch {
|
|
324
|
+
return "";
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
27
328
|
return rawRecipient;
|
|
28
329
|
}
|
|
29
330
|
|
|
@@ -37,27 +338,54 @@ export class RecipientConfig extends TxChainSetter implements IRecipientConfig {
|
|
|
37
338
|
};
|
|
38
339
|
}
|
|
39
340
|
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
44
|
-
}
|
|
341
|
+
if (this.isStarknetIDEnabled && this.isStarknetID) {
|
|
342
|
+
try {
|
|
343
|
+
const fetched = this.getStarknetIDFetchData(rawRecipient);
|
|
45
344
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
345
|
+
if (fetched.isFetching) {
|
|
346
|
+
return {
|
|
347
|
+
loadingState: "loading-block",
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (fetched.error) {
|
|
352
|
+
if (fetched.error instanceof StarknetIDIsFetchingError) {
|
|
353
|
+
return {
|
|
354
|
+
error: new StarknetIDFailedToFetchError(
|
|
355
|
+
"Failed to fetch the address from Starknet ID"
|
|
356
|
+
),
|
|
357
|
+
loadingState: fetched.isFetching ? "loading-block" : undefined,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return {
|
|
362
|
+
error: fetched.error,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (!fetched.starknetHexAddress) {
|
|
367
|
+
return {
|
|
368
|
+
error: new StarknetIDFailedToFetchError(
|
|
369
|
+
"Failed to fetch the address from Starknet ID"
|
|
370
|
+
),
|
|
371
|
+
loadingState: fetched.isFetching ? "loading-block" : undefined,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return {};
|
|
376
|
+
} catch (e) {
|
|
55
377
|
return {
|
|
56
|
-
error:
|
|
378
|
+
error: e,
|
|
57
379
|
};
|
|
58
380
|
}
|
|
59
381
|
}
|
|
60
382
|
|
|
383
|
+
if (!isStarknetHexAddress(rawRecipient)) {
|
|
384
|
+
return {
|
|
385
|
+
error: new InvalidHexError("Invalid hex address for chain"),
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
61
389
|
return {};
|
|
62
390
|
}
|
|
63
391
|
|
|
@@ -77,6 +405,7 @@ export const useRecipientConfig = (
|
|
|
77
405
|
) => {
|
|
78
406
|
const [config] = useState(() => new RecipientConfig(chainGetter, chainId));
|
|
79
407
|
config.setChain(chainId);
|
|
408
|
+
config.setStarknetID(chainId);
|
|
80
409
|
|
|
81
410
|
return config;
|
|
82
411
|
};
|
package/src/tx/types.ts
CHANGED
|
@@ -64,6 +64,13 @@ export interface IRecipientConfig extends ITxChainSetter {
|
|
|
64
64
|
uiProperties: UIProperties;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
export interface IRecipientConfigWithStarknetID extends IRecipientConfig {
|
|
68
|
+
readonly isStarknetIDEnabled: boolean;
|
|
69
|
+
readonly isStarknetID: boolean;
|
|
70
|
+
readonly starknetExpectedDomain: string;
|
|
71
|
+
readonly isStarknetIDFetching: boolean;
|
|
72
|
+
}
|
|
73
|
+
|
|
67
74
|
export interface IAmountConfig extends ITxChainSetter {
|
|
68
75
|
amount: CoinPretty[];
|
|
69
76
|
|