@keplr-wallet/hooks-starknet 0.12.157 → 0.12.158-rc.1

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.
@@ -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
+ }
@@ -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
@@ -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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"}
@@ -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
- export declare class RecipientConfig extends TxChainSetter implements IRecipientConfig {
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 {};
@@ -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 (!rawRecipient.startsWith("0x")) {
37
- return {
38
- error: new errors_1.InvalidHexError("Invalid hex address for chain"),
39
- };
40
- }
41
- {
42
- const hex = rawRecipient.replace("0x", "");
43
- const buf = buffer_1.Buffer.from(hex, "hex");
44
- if (buf.length !== 32) {
45
- return {
46
- error: new errors_1.InvalidHexError("Invalid hex address for chain"),
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
- if (hex.toLowerCase() !== buf.toString("hex").toLowerCase()) {
279
+ catch (e) {
50
280
  return {
51
- error: new errors_1.InvalidHexError("Invalid hex address for chain"),
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":";;;;;;;;;AACA,mCAAwC;AAExC,+BAAoE;AACpE,qCAA8D;AAC9D,iCAAiC;AACjC,oCAAiC;AAEjC,MAAa,eAAgB,SAAQ,qBAAa;IAIhD,YAAY,WAAwB,EAAE,cAAsB;QAC1D,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAH3B,WAAM,GAAW,EAAE,CAAC;QAK5B,IAAA,qBAAc,EAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,SAAS;QACX,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC/C,IAAI,CAAC,CAAC,UAAU,IAAI,gBAAgB,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACvD;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAGD,IAAI,YAAY;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEvC,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;gBACL,KAAK,EAAE,IAAI,0BAAiB,CAAC,kBAAkB,CAAC;aACjD,CAAC;SACH;QAED,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAClC,OAAO;gBACL,KAAK,EAAE,IAAI,wBAAe,CAAC,+BAA+B,CAAC;aAC5D,CAAC;SACH;QAED;YACE,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE;gBACrB,OAAO;oBACL,KAAK,EAAE,IAAI,wBAAe,CAAC,+BAA+B,CAAC;iBAC5D,CAAC;aACH;YACD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC3D,OAAO;oBACL,KAAK,EAAE,IAAI,wBAAe,CAAC,+BAA+B,CAAC;iBAC5D,CAAC;aACH;SACF;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAGD,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;CACF;AA7DW;IADT,iBAAU;+CACmB;AAoB9B;IADC,eAAQ;mDAgCR;AAOD;IADC,aAAM;+CAGN;AA9DH,0CA+DC;AAEM,MAAM,kBAAkB,GAAG,CAChC,WAAwB,EACxB,OAAe,EACf,EAAE;IACF,MAAM,CAAC,MAAM,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B"}
1
+ {"version":3,"file":"recipient.js","sourceRoot":"","sources":["../../src/tx/recipient.ts"],"names":[],"mappings":";;;;;;;;;AAKA,mCAAwC;AAExC,+BAMc;AACd,qCAKkB;AAClB,iCAAiC;AACjC,oCAAiC;AACjC,6DAAyD;AACzD,uCAA+C;AAQ/C,MAAM,8BAA8B,GAAG;IACrC,CAAC,oBAAS,CAAC,WAAW,CAAC,OAAO,CAAC,EAC7B,mEAAmE;IACrE,CAAC,oBAAS,CAAC,WAAW,CAAC,UAAU,CAAC,EAChC,oEAAoE;CACvE,CAAC;AAEF,MAAM,aAAa,GAAG,uCAAuC,CAAC;AAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,iBAAiB,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AACvD,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD,+FAA+F;AAC/F,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,6EAA6E,CAAC,IAAI,CACvF,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAiC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;QACxD,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC,IAAI,CAAC,CAAC;KACR;IACD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,OAA2B;IACzC,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,OAAO,CAAC;KAChB;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,GAAG,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACzE;SAAM;QACL,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,OAAO;gBACL,GAAG,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACvE;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,mCAAmC;YACnC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE;gBAC/D,OAAO,IAAI,UAAU,GAAG,iBAAiB,CAAC;gBAC1C,UAAU,IAAI,gBAAgB,CAAC;gBAC/B,QAAQ;gBACR,UAAU,IAAI,gBAAgB,CAAC;aAChC;iBAAM;gBACL,OAAO,IAAI,UAAU,GAAG,OAAO,CAAC;gBAChC,UAAU,IAAI,gBAAgB,CAAC;aAChC;SACF;aAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAC3C,iDAAiD;YACjD,OAAO,IAAI,UAAU,GAAG,iBAAiB,CAAC;YAC1C,UAAU,IAAI,gBAAgB,CAAC;YAC/B,mCAAmC;YACnC,MAAM,KAAK,GACT,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjE,OAAO,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,UAAU,IAAI,eAAe,CAAC;SAC/B;KACF;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC7B,OAAO,KAAK,CAAC;KACd;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE;QACrB,OAAO,KAAK,CAAC;KACd;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE;QAC3D,OAAO,KAAK,CAAC;KACd;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAa,eACX,SAAQ,qBAAa;IAmBrB,YAAY,WAAwB,EAAE,cAAsB;QAC1D,KAAK,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAhB3B,WAAM,GAAW,EAAE,CAAC;QAE9B,4DAA4D;QAElD,gBAAW,GAKL,SAAS,CAAC;QAE1B,gDAAgD;QAEtC,4BAAuB,GAAG,IAAI,GAAG,EAA+B,CAAC;QAKzE,IAAA,qBAAc,EAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAGD,aAAa,CAAC,OAAe;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,yBAAyB;QAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,OAAO;SACR;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAA0B,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;SACR;QAED,MAAM,qBAAqB,GAAG,8BAA8B,CAAC,WAAW,CAAC,CAAC;QAC1E,IAAI,CAAC,qBAAqB,EAAE;YAC1B,OAAO;SACR;QAED,IAAI,CAAC,WAAW,GAAG;YACjB,WAAW;YACX,qBAAqB;SACtB,CAAC;IACJ,CAAC;IAES,sBAAsB,CAAC,QAAgB;;QAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,UAAU,IAAI,gBAAgB,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,wBAAwB,CAAC,CAAC;SAC1D;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;YAC5B,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,IAAI,KAAK,CAAC,gCAAgC,CAAC;aACnD,CAAC;SACH;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;QAE1C,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC1C,IAAA,kBAAW,EAAC,GAAG,EAAE;gBACf,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE;oBACpC,UAAU,EAAE,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAEjE,IAAA,0BAAW,EAQR,gBAAgB,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE;gBACpC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,GAAG;oBACP,MAAM,EAAE,eAAe;oBACvB,MAAM,EAAE;wBACN;4BACE,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,qBAAqB;4BACxD,QAAQ,EAAE,mBAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;4BAC9C,oBAAoB,EAClB,mEAAmE,EAAE,qDAAqD;yBAC7H;wBACD,QAAQ;qBACT;iBACF,CAAC;gBACF,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;aACrC,CAAC;iBACC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACb,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;oBAC9C,MAAM,IAAI,kCAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;iBAC9D;gBAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9B,IAAI,CAAC,IAAI,EAAE;oBACT,MAAM,IAAI,kCAAyB,CAAC,kBAAkB,CAAC,CAAC;iBACzD;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,UAAU,KAAK,KAAK,EAAE;oBACxB,MAAM,IAAI,kCAAyB,CAAC,kBAAkB,CAAC,CAAC;iBACzD;gBAED,MAAM,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBAEnE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE;oBAC/B,MAAM,IAAI,kCAAyB,CAAC,kBAAkB,CAAC,CAAC;iBACzD;gBAED,IAAA,kBAAW,EAAC,GAAG,EAAE;oBACf,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE;wBACpC,UAAU,EAAE,KAAK;wBACjB,kBAAkB,EAAE,IAAI;qBACzB,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,IAAA,kBAAW,EAAC,GAAG,EAAE;oBACf,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,EAAE;wBACpC,UAAU,EAAE,KAAK;wBACjB,KAAK;qBACN,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;SACN;QAED,OAAO,MAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAGD,IAAI,YAAY;QACd,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC;SACnE;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,IAAI,oBAAoB;QACtB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACnD,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC;IACnE,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,SAAS;QACX,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC/C,IAAI,CAAC,CAAC,UAAU,IAAI,gBAAgB,CAAC,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;SACvD;QAED,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,EAAE;YACjD,IAAI;gBACF,OAAO,CACL,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC,kBAAkB,IAAI,EAAE,CACnE,CAAC;aACH;YAAC,WAAM;gBACN,OAAO,EAAE,CAAC;aACX;SACF;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAGD,IAAI,YAAY;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEvC,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;gBACL,KAAK,EAAE,IAAI,0BAAiB,CAAC,kBAAkB,CAAC;aACjD,CAAC;SACH;QAED,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,EAAE;YACjD,IAAI;gBACF,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;gBAE1D,IAAI,OAAO,CAAC,UAAU,EAAE;oBACtB,OAAO;wBACL,YAAY,EAAE,eAAe;qBAC9B,CAAC;iBACH;gBAED,IAAI,OAAO,CAAC,KAAK,EAAE;oBACjB,IAAI,OAAO,CAAC,KAAK,YAAY,kCAAyB,EAAE;wBACtD,OAAO;4BACL,KAAK,EAAE,IAAI,qCAA4B,CACrC,8CAA8C,CAC/C;4BACD,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;yBAC/D,CAAC;qBACH;oBAED,OAAO;wBACL,KAAK,EAAE,OAAO,CAAC,KAAK;qBACrB,CAAC;iBACH;gBAED,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;oBAC/B,OAAO;wBACL,KAAK,EAAE,IAAI,qCAA4B,CACrC,8CAA8C,CAC/C;wBACD,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;qBAC/D,CAAC;iBACH;gBAED,OAAO,EAAE,CAAC;aACX;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO;oBACL,KAAK,EAAE,CAAC;iBACT,CAAC;aACH;SACF;QAED,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE;YACvC,OAAO;gBACL,KAAK,EAAE,IAAI,wBAAe,CAAC,+BAA+B,CAAC;aAC5D,CAAC;SACH;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAGD,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;CACF;AAnQW;IADT,iBAAU;+CACmB;AAIpB;IADT,iBAAU,CAAC,MAAM;oDAMQ;AAIhB;IADT,iBAAU,CAAC,OAAO;gEACwD;AAS3E;IADC,aAAM;oDAqBN;AAyGD;IADC,eAAQ;mDAQR;AAGD;IADC,eAAQ;2DAOR;AA4BD;IADC,eAAQ;mDA2DR;AAOD;IADC,aAAM;+CAGN;AAvQH,0CAwQC;AAEM,MAAM,kBAAkB,GAAG,CAChC,WAAwB,EACxB,OAAe,EACf,EAAE;IACF,MAAM,CAAC,MAAM,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AATW,QAAA,kBAAkB,sBAS7B"}
@@ -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.157",
3
+ "version": "0.12.158-rc.1",
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.157",
22
- "@keplr-wallet/common": "0.12.157",
23
- "@keplr-wallet/cosmos": "0.12.157",
24
- "@keplr-wallet/crypto": "0.12.157",
25
- "@keplr-wallet/proto-types": "0.12.157",
26
- "@keplr-wallet/simple-fetch": "0.12.157",
27
- "@keplr-wallet/stores": "0.12.157",
28
- "@keplr-wallet/stores-etc": "0.12.157",
29
- "@keplr-wallet/stores-eth": "0.12.157",
30
- "@keplr-wallet/stores-starknet": "0.12.157",
31
- "@keplr-wallet/types": "0.12.157",
32
- "@keplr-wallet/unit": "0.12.157",
21
+ "@keplr-wallet/background": "0.12.158-rc.1",
22
+ "@keplr-wallet/common": "0.12.158-rc.1",
23
+ "@keplr-wallet/cosmos": "0.12.158-rc.1",
24
+ "@keplr-wallet/crypto": "0.12.158-rc.1",
25
+ "@keplr-wallet/proto-types": "0.12.158-rc.1",
26
+ "@keplr-wallet/simple-fetch": "0.12.158-rc.1",
27
+ "@keplr-wallet/stores": "0.12.158-rc.1",
28
+ "@keplr-wallet/stores-etc": "0.12.158-rc.1",
29
+ "@keplr-wallet/stores-eth": "0.12.158-rc.1",
30
+ "@keplr-wallet/stores-starknet": "0.12.158-rc.1",
31
+ "@keplr-wallet/types": "0.12.158-rc.1",
32
+ "@keplr-wallet/unit": "0.12.158-rc.1",
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": "da9235916faacedb2a6473d5346ac718855618d3"
43
+ "gitHead": "6fbd0ddc528e8188d950c1b9841538a7104ccbfa"
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
+ }
@@ -1,21 +1,312 @@
1
- import { IRecipientConfig, UIProperties } from "./types";
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 { action, computed, makeObservable, observable } from "mobx";
5
- import { EmptyAddressError, InvalidHexError } from "./errors";
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
- export class RecipientConfig extends TxChainSetter implements IRecipientConfig {
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 (!rawRecipient.startsWith("0x")) {
41
- return {
42
- error: new InvalidHexError("Invalid hex address for chain"),
43
- };
44
- }
341
+ if (this.isStarknetIDEnabled && this.isStarknetID) {
342
+ try {
343
+ const fetched = this.getStarknetIDFetchData(rawRecipient);
45
344
 
46
- {
47
- const hex = rawRecipient.replace("0x", "");
48
- const buf = Buffer.from(hex, "hex");
49
- if (buf.length !== 32) {
50
- return {
51
- error: new InvalidHexError("Invalid hex address for chain"),
52
- };
53
- }
54
- if (hex.toLowerCase() !== buf.toString("hex").toLowerCase()) {
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: new InvalidHexError("Invalid hex address for chain"),
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