@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.
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +20 -0
- package/lib/index.js.map +1 -0
- package/lib/registries/index.d.ts +20 -0
- package/lib/registries/index.d.ts.map +1 -0
- package/lib/registries/index.js +105 -0
- package/lib/registries/index.js.map +1 -0
- package/lib/resolvers/index.d.ts +25 -0
- package/lib/resolvers/index.d.ts.map +1 -0
- package/lib/resolvers/index.js +158 -0
- package/lib/resolvers/index.js.map +1 -0
- package/lib/signers/index.d.ts +20 -0
- package/lib/signers/index.d.ts.map +1 -0
- package/lib/signers/index.js +128 -0
- package/lib/signers/index.js.map +1 -0
- package/lib/types.d.ts +19 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib-es/index.d.ts +4 -0
- package/lib-es/index.d.ts.map +1 -0
- package/lib-es/index.js +4 -0
- package/lib-es/index.js.map +1 -0
- package/lib-es/registries/index.d.ts +20 -0
- package/lib-es/registries/index.d.ts.map +1 -0
- package/lib-es/registries/index.js +99 -0
- package/lib-es/registries/index.js.map +1 -0
- package/lib-es/resolvers/index.d.ts +25 -0
- package/lib-es/resolvers/index.d.ts.map +1 -0
- package/lib-es/resolvers/index.js +150 -0
- package/lib-es/resolvers/index.js.map +1 -0
- package/lib-es/signers/index.d.ts +20 -0
- package/lib-es/signers/index.d.ts.map +1 -0
- package/lib-es/signers/index.js +120 -0
- package/lib-es/signers/index.js.map +1 -0
- package/lib-es/types.d.ts +19 -0
- package/lib-es/types.d.ts.map +1 -0
- package/lib-es/types.js +2 -0
- package/lib-es/types.js.map +1 -0
- package/package.json +89 -0
- package/src/__tests__/unit/registries.unit.test.ts +34 -0
- package/src/__tests__/unit/resolvers.unit.test.ts +72 -0
- package/src/__tests__/unit/signers.unit.test.ts +80 -0
- package/src/index.ts +3 -0
- package/src/registries/index.ts +61 -0
- package/src/resolvers/index.ts +118 -0
- package/src/signers/index.ts +78 -0
- 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"}
|
package/lib-es/types.js
ADDED
|
@@ -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
|
+
});
|