@ledgerhq/domain-service 0.2.0-next.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.
Files changed (49) hide show
  1. package/lib/index.d.ts +4 -0
  2. package/lib/index.d.ts.map +1 -0
  3. package/lib/index.js +20 -0
  4. package/lib/index.js.map +1 -0
  5. package/lib/registries/index.d.ts +20 -0
  6. package/lib/registries/index.d.ts.map +1 -0
  7. package/lib/registries/index.js +105 -0
  8. package/lib/registries/index.js.map +1 -0
  9. package/lib/resolvers/index.d.ts +25 -0
  10. package/lib/resolvers/index.d.ts.map +1 -0
  11. package/lib/resolvers/index.js +158 -0
  12. package/lib/resolvers/index.js.map +1 -0
  13. package/lib/signers/index.d.ts +20 -0
  14. package/lib/signers/index.d.ts.map +1 -0
  15. package/lib/signers/index.js +128 -0
  16. package/lib/signers/index.js.map +1 -0
  17. package/lib/types.d.ts +19 -0
  18. package/lib/types.d.ts.map +1 -0
  19. package/lib/types.js +3 -0
  20. package/lib/types.js.map +1 -0
  21. package/lib-es/index.d.ts +4 -0
  22. package/lib-es/index.d.ts.map +1 -0
  23. package/lib-es/index.js +4 -0
  24. package/lib-es/index.js.map +1 -0
  25. package/lib-es/registries/index.d.ts +20 -0
  26. package/lib-es/registries/index.d.ts.map +1 -0
  27. package/lib-es/registries/index.js +99 -0
  28. package/lib-es/registries/index.js.map +1 -0
  29. package/lib-es/resolvers/index.d.ts +25 -0
  30. package/lib-es/resolvers/index.d.ts.map +1 -0
  31. package/lib-es/resolvers/index.js +150 -0
  32. package/lib-es/resolvers/index.js.map +1 -0
  33. package/lib-es/signers/index.d.ts +20 -0
  34. package/lib-es/signers/index.d.ts.map +1 -0
  35. package/lib-es/signers/index.js +120 -0
  36. package/lib-es/signers/index.js.map +1 -0
  37. package/lib-es/types.d.ts +19 -0
  38. package/lib-es/types.d.ts.map +1 -0
  39. package/lib-es/types.js +2 -0
  40. package/lib-es/types.js.map +1 -0
  41. package/package.json +89 -0
  42. package/src/__tests__/unit/registries.unit.test.ts +34 -0
  43. package/src/__tests__/unit/resolvers.unit.test.ts +72 -0
  44. package/src/__tests__/unit/signers.unit.test.ts +80 -0
  45. package/src/index.ts +3 -0
  46. package/src/registries/index.ts +61 -0
  47. package/src/resolvers/index.ts +118 -0
  48. package/src/signers/index.ts +78 -0
  49. package/src/types.ts +20 -0
@@ -0,0 +1,99 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ var REGISTRIES = [
38
+ {
39
+ name: "ens",
40
+ resolvers: {
41
+ forward: "https://explorers.api.live.ledger.com/blockchain/v4/eth/ens/resolve/{name}",
42
+ reverse: "https://explorers.api.live.ledger.com/blockchain/v4/eth/ens/reverse-resolve/{address}"
43
+ },
44
+ signatures: {
45
+ forward: "https://nft.api.live.ledger.com/v1/names/ens/forward/{name}?=challenge={challenge}",
46
+ reverse: "https://nft.api.live.ledger.com/v1/names/ens/reverse/{address}?=challenge={challenge}"
47
+ },
48
+ patterns: {
49
+ forward: new RegExp(".eth$"),
50
+ reverse: new RegExp("^0x[0-9a-fA-F]{40}$")
51
+ },
52
+ coinTypes: [60]
53
+ },
54
+ ];
55
+ /**
56
+ * Method is voluntarly made async so it can be replaced by a backend call once implemented
57
+ */
58
+ export var getRegistries = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
59
+ return [2 /*return*/, REGISTRIES];
60
+ }); }); };
61
+ /**
62
+ * Get an array of registries compatible with a given domain
63
+ *
64
+ * @param {string} domain
65
+ * @returns {Promise<AddressResolutionResponse[]>}
66
+ */
67
+ export var getRegistriesForDomain = function (domain) { return __awaiter(void 0, void 0, void 0, function () {
68
+ var registries;
69
+ return __generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0: return [4 /*yield*/, getRegistries()];
72
+ case 1:
73
+ registries = _a.sent();
74
+ return [2 /*return*/, registries.filter(function (registry) {
75
+ return registry.patterns.forward.test(domain);
76
+ })];
77
+ }
78
+ });
79
+ }); };
80
+ /**
81
+ * Get an array of registries compatible with a given address
82
+ *
83
+ * @param {string} address
84
+ * @returns {Promise<AddressResolutionResponse[]>}
85
+ */
86
+ export var getRegistriesForAddress = function (address) { return __awaiter(void 0, void 0, void 0, function () {
87
+ var registries;
88
+ return __generator(this, function (_a) {
89
+ switch (_a.label) {
90
+ case 0: return [4 /*yield*/, getRegistries()];
91
+ case 1:
92
+ registries = _a.sent();
93
+ return [2 /*return*/, registries.filter(function (registry) {
94
+ return registry.patterns.reverse.test(address);
95
+ })];
96
+ }
97
+ });
98
+ }); };
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAM,UAAU,GAAe;IAC7B;QACE,IAAI,EAAE,KAAK;QACX,SAAS,EAAE;YACT,OAAO,EACL,4EAA4E;YAC9E,OAAO,EACL,uFAAuF;SAC1F;QACD,UAAU,EAAE;YACV,OAAO,EACL,oFAAoF;YACtF,OAAO,EACL,uFAAuF;SAC1F;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,IAAI,MAAM,CAAC,qBAAqB,CAAC;SAC3C;QACD,SAAS,EAAE,CAAC,EAAE,CAAC;KAChB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,IAAM,aAAa,GAAG;IAAiC,sBAAA,UAAU,EAAA;SAAA,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,IAAM,sBAAsB,GAAG,UACpC,MAAc;;;;oBAEK,qBAAM,aAAa,EAAE,EAAA;;gBAAlC,UAAU,GAAG,SAAqB;gBAExC,sBAAO,UAAU,CAAC,MAAM,CAAC,UAAC,QAAQ;wBAChC,OAAA,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;oBAAtC,CAAsC,CACvC,EAAC;;;KACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,IAAM,uBAAuB,GAAG,UACrC,OAAe;;;;oBAEI,qBAAM,aAAa,EAAE,EAAA;;gBAAlC,UAAU,GAAG,SAAqB;gBAExC,sBAAO,UAAU,CAAC,MAAM,CAAC,UAAC,QAAQ;wBAChC,OAAA,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;oBAAvC,CAAuC,CACxC,EAAC;;;KACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { SupportedRegistries } from "../types";
2
+ type DomainResolutionResponse = {
3
+ registry: SupportedRegistries;
4
+ address: string;
5
+ };
6
+ /**
7
+ * Get an array of addresses for a domain
8
+ *
9
+ * @param {string} domain
10
+ * @returns {Promise<DomainResolutionResponse[]>}
11
+ */
12
+ export declare const resolveDomain: (domain: string, registryName?: SupportedRegistries) => Promise<DomainResolutionResponse[]>;
13
+ type AddressResolutionResponse = {
14
+ registry: SupportedRegistries;
15
+ domain: string;
16
+ };
17
+ /**
18
+ * Get an array of domains for an address
19
+ *
20
+ * @param {string} address
21
+ * @returns {Promise<AddressResolutionResponse[]>}
22
+ */
23
+ export declare const resolveAddress: (address: string, registryName?: SupportedRegistries) => Promise<AddressResolutionResponse[]>;
24
+ export {};
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAO/C,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,WAChB,MAAM,iBACC,mBAAmB,KACjC,QAAQ,wBAAwB,EAAE,CAuCpC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,YAChB,MAAM,iBACA,mBAAmB,KACjC,QAAQ,yBAAyB,EAAE,CAuCrC,CAAC"}
@@ -0,0 +1,150 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { log } from "@ledgerhq/logs";
38
+ import network from "@ledgerhq/live-common/network";
39
+ import { getRegistries, getRegistriesForAddress, getRegistriesForDomain, } from "../registries";
40
+ /**
41
+ * Get an array of addresses for a domain
42
+ *
43
+ * @param {string} domain
44
+ * @returns {Promise<DomainResolutionResponse[]>}
45
+ */
46
+ export var resolveDomain = function (domain, registryName) { return __awaiter(void 0, void 0, void 0, function () {
47
+ var registries, responses;
48
+ return __generator(this, function (_a) {
49
+ switch (_a.label) {
50
+ case 0: return [4 /*yield*/, (function () { return __awaiter(void 0, void 0, void 0, function () {
51
+ var registries_1, registry;
52
+ return __generator(this, function (_a) {
53
+ switch (_a.label) {
54
+ case 0:
55
+ if (!registryName) return [3 /*break*/, 2];
56
+ return [4 /*yield*/, getRegistries()];
57
+ case 1:
58
+ registries_1 = _a.sent();
59
+ registry = registries_1.find(function (r) { return r.name === registryName; });
60
+ return [2 /*return*/, registry ? [registry] : []];
61
+ case 2: return [2 /*return*/, getRegistriesForDomain(domain)];
62
+ }
63
+ });
64
+ }); })()];
65
+ case 1:
66
+ registries = _a.sent();
67
+ responses = Promise.allSettled(registries.map(function (registry) {
68
+ return network({
69
+ method: "GET",
70
+ url: registry.resolvers.forward.replace("{name}", domain)
71
+ });
72
+ }));
73
+ return [2 /*return*/, responses.then(function (promises) {
74
+ return promises.reduce(function (result, promise, index) {
75
+ if (promise.status !== "fulfilled") {
76
+ // ignore 404 error
77
+ if (promise.reason.response.status !== 404) {
78
+ log("domain-service", "failed to resolve a domain", {
79
+ domain: domain,
80
+ error: promise.reason
81
+ });
82
+ }
83
+ return result;
84
+ }
85
+ result.push({
86
+ registry: registries[index].name,
87
+ address: promise.value.data
88
+ });
89
+ return result;
90
+ }, []);
91
+ })];
92
+ }
93
+ });
94
+ }); };
95
+ /**
96
+ * Get an array of domains for an address
97
+ *
98
+ * @param {string} address
99
+ * @returns {Promise<AddressResolutionResponse[]>}
100
+ */
101
+ export var resolveAddress = function (address, registryName) { return __awaiter(void 0, void 0, void 0, function () {
102
+ var registries, responses;
103
+ return __generator(this, function (_a) {
104
+ switch (_a.label) {
105
+ case 0: return [4 /*yield*/, (function () { return __awaiter(void 0, void 0, void 0, function () {
106
+ var registries_2, registry;
107
+ return __generator(this, function (_a) {
108
+ switch (_a.label) {
109
+ case 0:
110
+ if (!registryName) return [3 /*break*/, 2];
111
+ return [4 /*yield*/, getRegistries()];
112
+ case 1:
113
+ registries_2 = _a.sent();
114
+ registry = registries_2.find(function (r) { return r.name === registryName; });
115
+ return [2 /*return*/, registry ? [registry] : []];
116
+ case 2: return [2 /*return*/, getRegistriesForAddress(address)];
117
+ }
118
+ });
119
+ }); })()];
120
+ case 1:
121
+ registries = _a.sent();
122
+ responses = Promise.allSettled(registries.map(function (registry) {
123
+ return network({
124
+ method: "GET",
125
+ url: registry.resolvers.reverse.replace("{address}", address)
126
+ });
127
+ }));
128
+ return [2 /*return*/, responses.then(function (promises) {
129
+ return promises.reduce(function (result, promise, index) {
130
+ if (promise.status !== "fulfilled") {
131
+ // ignore 404 error
132
+ if (promise.reason.response.status !== 404) {
133
+ log("domain-service", "failed to resolve a address", {
134
+ address: address,
135
+ error: promise.reason
136
+ });
137
+ }
138
+ return result;
139
+ }
140
+ result.push({
141
+ registry: registries[index].name,
142
+ domain: promise.value.data
143
+ });
144
+ return result;
145
+ }, []);
146
+ })];
147
+ }
148
+ });
149
+ }); };
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { SupportedRegistries } from "../types";
2
+ /**
3
+ * Get an APDU to sign a domain resolution on the nano
4
+ *
5
+ * @param {string} domain
6
+ * @param {SupportedRegistries} registryName
7
+ * @param {string} challenge
8
+ * @returns {Promise<AddressResolutionResponse[]>}
9
+ */
10
+ export declare const signDomainResolution: (domain: string, registryName: SupportedRegistries, challenge: string) => Promise<string | null>;
11
+ /**
12
+ * Get an APDU to sign an address resolve resolution on the nano
13
+ *
14
+ * @param {string} address
15
+ * @param {SupportedRegistries} registryName
16
+ * @param {string} challenge
17
+ * @returns {Promise<AddressResolutionResponse[]>}
18
+ */
19
+ export declare const signAddressResolution: (address: string, registryName: SupportedRegistries, challenge: string) => Promise<string | null>;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG/C;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,WACvB,MAAM,gBACA,mBAAmB,aACtB,MAAM,KAChB,QAAQ,MAAM,GAAG,IAAI,CAuBvB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,YACvB,MAAM,gBACD,mBAAmB,aACtB,MAAM,KAChB,QAAQ,MAAM,GAAG,IAAI,CAuBvB,CAAC"}
@@ -0,0 +1,120 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { log } from "@ledgerhq/logs";
38
+ import network from "@ledgerhq/live-common/network";
39
+ import { getRegistries } from "../registries";
40
+ /**
41
+ * Get an APDU to sign a domain resolution on the nano
42
+ *
43
+ * @param {string} domain
44
+ * @param {SupportedRegistries} registryName
45
+ * @param {string} challenge
46
+ * @returns {Promise<AddressResolutionResponse[]>}
47
+ */
48
+ export var signDomainResolution = function (domain, registryName, challenge) { return __awaiter(void 0, void 0, void 0, function () {
49
+ var registries, registry, url;
50
+ return __generator(this, function (_a) {
51
+ switch (_a.label) {
52
+ case 0: return [4 /*yield*/, getRegistries()];
53
+ case 1:
54
+ registries = _a.sent();
55
+ registry = registries.find(function (r) { return r.name === registryName; });
56
+ if (!registry)
57
+ return [2 /*return*/, null];
58
+ url = registry.signatures.forward
59
+ .replace("{name}", domain)
60
+ .replace("{challenge}", challenge);
61
+ return [2 /*return*/, network({
62
+ method: "GET",
63
+ url: url
64
+ })
65
+ .then(function (_a) {
66
+ var data = _a.data;
67
+ return data.payload;
68
+ })["catch"](function (error) {
69
+ if (error.status !== 404) {
70
+ log("domain-service", "failed to get APDU for a domain", {
71
+ domain: domain,
72
+ error: error
73
+ });
74
+ }
75
+ return null;
76
+ })];
77
+ }
78
+ });
79
+ }); };
80
+ /**
81
+ * Get an APDU to sign an address resolve resolution on the nano
82
+ *
83
+ * @param {string} address
84
+ * @param {SupportedRegistries} registryName
85
+ * @param {string} challenge
86
+ * @returns {Promise<AddressResolutionResponse[]>}
87
+ */
88
+ export var signAddressResolution = function (address, registryName, challenge) { return __awaiter(void 0, void 0, void 0, function () {
89
+ var registries, registry, url;
90
+ return __generator(this, function (_a) {
91
+ switch (_a.label) {
92
+ case 0: return [4 /*yield*/, getRegistries()];
93
+ case 1:
94
+ registries = _a.sent();
95
+ registry = registries.find(function (r) { return r.name === registryName; });
96
+ if (!registry)
97
+ return [2 /*return*/, null];
98
+ url = registry.signatures.reverse
99
+ .replace("{address}", address)
100
+ .replace("{challenge}", challenge);
101
+ return [2 /*return*/, network({
102
+ method: "GET",
103
+ url: url
104
+ })
105
+ .then(function (_a) {
106
+ var data = _a.data;
107
+ return data.payload;
108
+ })["catch"](function (error) {
109
+ if (error.status !== 404) {
110
+ log("domain-service", "failed to get APDU for an address", {
111
+ address: address,
112
+ error: error
113
+ });
114
+ }
115
+ return null;
116
+ })];
117
+ }
118
+ });
119
+ }); };
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/signers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,OAAO,MAAM,+BAA+B,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAClC,MAAc,EACd,YAAiC,EACjC,SAAiB;;;;oBAEE,qBAAM,aAAa,EAAE,EAAA;;gBAAlC,UAAU,GAAG,SAAqB;gBAClC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,YAAY,EAAvB,CAAuB,CAAC,CAAC;gBACjE,IAAI,CAAC,QAAQ;oBAAE,sBAAO,IAAI,EAAC;gBAErB,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO;qBACpC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;qBACzB,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAErC,sBAAO,OAAO,CAAsB;wBAClC,MAAM,EAAE,KAAK;wBACb,GAAG,KAAA;qBACJ,CAAC;yBACC,IAAI,CAAC,UAAC,EAAQ;4BAAN,IAAI,UAAA;wBAAO,OAAA,IAAI,CAAC,OAAO;oBAAZ,CAAY,CAAC,CAChC,OAAK,CAAA,CAAC,UAAC,KAAK;wBACX,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;4BACxB,GAAG,CAAC,gBAAgB,EAAE,iCAAiC,EAAE;gCACvD,MAAM,QAAA;gCACN,KAAK,OAAA;6BACN,CAAC,CAAC;yBACJ;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,EAAC;;;KACN,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,IAAM,qBAAqB,GAAG,UACnC,OAAe,EACf,YAAiC,EACjC,SAAiB;;;;oBAEE,qBAAM,aAAa,EAAE,EAAA;;gBAAlC,UAAU,GAAG,SAAqB;gBAClC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,YAAY,EAAvB,CAAuB,CAAC,CAAC;gBACjE,IAAI,CAAC,QAAQ;oBAAE,sBAAO,IAAI,EAAC;gBAErB,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO;qBACpC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;qBAC7B,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAErC,sBAAO,OAAO,CAAsB;wBAClC,MAAM,EAAE,KAAK;wBACb,GAAG,KAAA;qBACJ,CAAC;yBACC,IAAI,CAAC,UAAC,EAAQ;4BAAN,IAAI,UAAA;wBAAO,OAAA,IAAI,CAAC,OAAO;oBAAZ,CAAY,CAAC,CAChC,OAAK,CAAA,CAAC,UAAC,KAAK;wBACX,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE;4BACxB,GAAG,CAAC,gBAAgB,EAAE,mCAAmC,EAAE;gCACzD,OAAO,SAAA;gCACP,KAAK,OAAA;6BACN,CAAC,CAAC;yBACJ;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,EAAC;;;KACN,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { CoinType } from "@ledgerhq/types-cryptoassets";
2
+ export type SupportedRegistries = "ens";
3
+ export type Registry = {
4
+ name: SupportedRegistries;
5
+ resolvers: {
6
+ forward: string;
7
+ reverse: string;
8
+ };
9
+ signatures: {
10
+ forward: string;
11
+ reverse: string;
12
+ };
13
+ patterns: {
14
+ forward: RegExp;
15
+ reverse: RegExp;
16
+ };
17
+ coinTypes: CoinType[];
18
+ };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAExC,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "@ledgerhq/domain-service",
3
+ "description": "Ledger service responsible for domain handling",
4
+ "version": "0.2.0-next.0",
5
+ "license": "Apache-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/LedgerHQ/ledger-live.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/LedgerHQ/ledger-live/issues"
12
+ },
13
+ "homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/domain-service",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "main": "lib/index.js",
18
+ "module": "lib-es/index.js",
19
+ "types": "lib/index.d.ts",
20
+ "typesVersions": {
21
+ "*": {
22
+ "*.json": [
23
+ "*.json"
24
+ ],
25
+ "*": [
26
+ "lib/*"
27
+ ],
28
+ "lib/*": [
29
+ "lib/*"
30
+ ],
31
+ "lib-es/*": [
32
+ "lib-es/*"
33
+ ]
34
+ }
35
+ },
36
+ "exports": {
37
+ "./lib/*": "./lib/*.js",
38
+ "./lib/*.js": "./lib/*.js",
39
+ "./lib-es/*": "./lib-es/*.js",
40
+ "./lib-es/*.js": "./lib-es/*.js",
41
+ "./*": {
42
+ "require": "./lib/*.js",
43
+ "default": "./lib-es/*.js"
44
+ },
45
+ "./*.js": {
46
+ "require": "./lib/*.js",
47
+ "default": "./lib-es/*.js"
48
+ },
49
+ "./package.json": "./package.json"
50
+ },
51
+ "files": [
52
+ "lib",
53
+ "lib-es",
54
+ "src"
55
+ ],
56
+ "dependencies": {
57
+ "@ledgerhq/cryptoassets": "^9.1.0-next.0",
58
+ "@ledgerhq/errors": "^6.12.3",
59
+ "@ledgerhq/live-common": "^29.1.0-next.0",
60
+ "@ledgerhq/logs": "^6.10.1"
61
+ },
62
+ "devDependencies": {
63
+ "@types/jest": "^28.1.3",
64
+ "@typescript-eslint/eslint-plugin": "^5.46.1",
65
+ "@typescript-eslint/parser": "^5.46.1",
66
+ "cross-env": "^7.0.3",
67
+ "eslint": "^7.32.0",
68
+ "eslint-config-prettier": "^8.3.0",
69
+ "eslint-config-typescript": "^3.0.0",
70
+ "eslint-formatter-pretty": "^3.0.1",
71
+ "eslint-plugin-prettier": "^3.4.0",
72
+ "eslint-plugin-typescript": "^0.14.0",
73
+ "jest": "^28.1.3",
74
+ "jest-environment-jsdom": "^28.1.3",
75
+ "prettier": "^2.8.1",
76
+ "ts-jest": "^28.0.8",
77
+ "typescript": "^4.9.5",
78
+ "@ledgerhq/types-cryptoassets": "^7.0.0"
79
+ },
80
+ "scripts": {
81
+ "clean": "rm -rf lib lib-es",
82
+ "build": "tsc && tsc -m ES6 --outDir lib-es",
83
+ "prewatch": "pnpm build",
84
+ "watch": "tsc --watch",
85
+ "lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx",
86
+ "lint:fix": "pnpm lint --fix",
87
+ "test": "cross-env TZ=America/New_York jest"
88
+ }
89
+ }
@@ -0,0 +1,34 @@
1
+ import {
2
+ getRegistriesForAddress,
3
+ getRegistriesForDomain,
4
+ } from "../../registries";
5
+
6
+ describe("Domain Service", () => {
7
+ describe("Registries", () => {
8
+ describe("getRegistriesForDomain", () => {
9
+ it("should return a registry for a supported domain (ENS)", async () => {
10
+ expect(await getRegistriesForDomain("vitalik.eth")).toHaveLength(1);
11
+ });
12
+
13
+ it("should return an empty array for an unsupported domain", async () => {
14
+ expect(await getRegistriesForDomain("vitalik.notsupport")).toHaveLength(
15
+ 0
16
+ );
17
+ });
18
+ });
19
+
20
+ describe("getRegistriesForAddress", () => {
21
+ it("should return a registry for a supported domain (ENS)", async () => {
22
+ expect(
23
+ await getRegistriesForAddress(
24
+ "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
25
+ )
26
+ ).toHaveLength(1);
27
+ });
28
+
29
+ it("should return an empty array for an unsupported domain", async () => {
30
+ expect(await getRegistriesForAddress("0x123")).toHaveLength(0);
31
+ });
32
+ });
33
+ });
34
+ });