@bonfida/spl-name-service 0.1.39 → 0.1.42
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/dist/record.js +1 -1
- package/dist/record.js.map +1 -1
- package/dist/utils.d.ts +11 -1
- package/dist/utils.js +28 -5
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/record.ts +1 -1
- package/src/utils.ts +28 -7
- package/tests/all-registered.test.ts +12 -0
- package/tests/records.test.ts +1 -1
- package/tests/reverse-lookup.test.ts +14 -0
package/dist/record.js
CHANGED
|
@@ -13,7 +13,7 @@ const state_1 = require("./state");
|
|
|
13
13
|
*/
|
|
14
14
|
const getRecord = async (connection, domain, record) => {
|
|
15
15
|
var _a, _b;
|
|
16
|
-
const { pubkey } = await (0, utils_1.getDomainKey)(record + "." + domain);
|
|
16
|
+
const { pubkey } = await (0, utils_1.getDomainKey)(record + "." + domain, true);
|
|
17
17
|
let { registry } = await state_1.NameRegistryState.retrieve(connection, pubkey);
|
|
18
18
|
// Remove trailling 0s
|
|
19
19
|
const idx = (_a = registry.data) === null || _a === void 0 ? void 0 : _a.indexOf(0x00);
|
package/dist/record.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,mCAAuC;AACvC,mCAA4C;AAE5C;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,KAAK,EAC5B,UAAsB,EACtB,MAAc,EACd,MAAc,EACd,EAAE;;IACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,oBAAY,EAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../src/record.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export declare const findSubdomains: (connection: Connection, parentKey: PublicK
|
|
|
22
22
|
* @param domain The domain to compute the public key for (e.g `bonfida.sol`, `dex.bonfida.sol`)
|
|
23
23
|
* @returns
|
|
24
24
|
*/
|
|
25
|
-
export declare const getDomainKey: (domain: string) => Promise<{
|
|
25
|
+
export declare const getDomainKey: (domain: string, record?: boolean) => Promise<{
|
|
26
26
|
isSub: boolean;
|
|
27
27
|
parent: PublicKey;
|
|
28
28
|
pubkey: PublicKey;
|
|
@@ -40,3 +40,13 @@ export declare const getDomainKey: (domain: string) => Promise<{
|
|
|
40
40
|
* @returns
|
|
41
41
|
*/
|
|
42
42
|
export declare function getAllDomains(connection: Connection, wallet: PublicKey): Promise<PublicKey[]>;
|
|
43
|
+
/**
|
|
44
|
+
* This function can be used to retrieve all the registered `.sol` domains.
|
|
45
|
+
* The account data is sliced to avoid enormous payload and only the owner is returned
|
|
46
|
+
* @param connection The Solana RPC connection object
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
export declare const getAllRegisteredDomains: (connection: Connection) => Promise<{
|
|
50
|
+
pubkey: PublicKey;
|
|
51
|
+
account: import("@solana/web3.js").AccountInfo<Buffer>;
|
|
52
|
+
}[]>;
|
package/dist/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getAllDomains = exports.getDomainKey = exports.findSubdomains = exports.performReverseLookupBatch = exports.getDNSRecordAddress = exports.performReverseLookup = exports.getNameAccountKey = exports.getHashedName = exports.getNameOwner = void 0;
|
|
6
|
+
exports.getAllRegisteredDomains = exports.getAllDomains = exports.getDomainKey = exports.findSubdomains = exports.performReverseLookupBatch = exports.getDNSRecordAddress = exports.performReverseLookup = exports.getNameAccountKey = exports.getHashedName = exports.getNameOwner = void 0;
|
|
7
7
|
const web3_js_1 = require("@solana/web3.js");
|
|
8
8
|
const bn_js_1 = __importDefault(require("bn.js"));
|
|
9
9
|
const sha2_1 = require("@ethersproject/sha2");
|
|
@@ -60,11 +60,10 @@ async function getDNSRecordAddress(nameAccount, type) {
|
|
|
60
60
|
}
|
|
61
61
|
exports.getDNSRecordAddress = getDNSRecordAddress;
|
|
62
62
|
async function performReverseLookupBatch(connection, nameAccounts) {
|
|
63
|
-
const [centralState] = await web3_js_1.PublicKey.findProgramAddress([constants_1.NAME_PROGRAM_ID.toBuffer()], constants_1.NAME_PROGRAM_ID);
|
|
64
63
|
let reverseLookupAccounts = [];
|
|
65
64
|
for (let nameAccount of nameAccounts) {
|
|
66
65
|
const hashedReverseLookup = await getHashedName(nameAccount.toBase58());
|
|
67
|
-
const reverseLookupAccount = await getNameAccountKey(hashedReverseLookup,
|
|
66
|
+
const reverseLookupAccount = await getNameAccountKey(hashedReverseLookup, constants_2.REVERSE_LOOKUP_CLASS);
|
|
68
67
|
reverseLookupAccounts.push(reverseLookupAccount);
|
|
69
68
|
}
|
|
70
69
|
let names = await state_1.NameRegistryState.retrieveBatch(connection, reverseLookupAccounts);
|
|
@@ -114,13 +113,14 @@ const _derive = async (name, parent = constants_1.ROOT_DOMAIN_ACCOUNT) => {
|
|
|
114
113
|
* @param domain The domain to compute the public key for (e.g `bonfida.sol`, `dex.bonfida.sol`)
|
|
115
114
|
* @returns
|
|
116
115
|
*/
|
|
117
|
-
const getDomainKey = async (domain) => {
|
|
116
|
+
const getDomainKey = async (domain, record = false) => {
|
|
118
117
|
if (domain.endsWith(".sol")) {
|
|
119
118
|
domain = domain.slice(0, -4);
|
|
120
119
|
}
|
|
121
120
|
const splitted = domain.split(".");
|
|
122
121
|
if (splitted.length === 2) {
|
|
123
|
-
const
|
|
122
|
+
const prefix = Buffer.from([record ? 1 : 0]).toString();
|
|
123
|
+
const sub = prefix.concat(splitted[0]);
|
|
124
124
|
const { pubkey: parentKey } = await _derive(splitted[1]);
|
|
125
125
|
const result = await _derive(sub, parentKey);
|
|
126
126
|
return { ...result, isSub: true, parent: parentKey };
|
|
@@ -159,4 +159,27 @@ async function getAllDomains(connection, wallet) {
|
|
|
159
159
|
return accounts.map((a) => a.pubkey);
|
|
160
160
|
}
|
|
161
161
|
exports.getAllDomains = getAllDomains;
|
|
162
|
+
/**
|
|
163
|
+
* This function can be used to retrieve all the registered `.sol` domains.
|
|
164
|
+
* The account data is sliced to avoid enormous payload and only the owner is returned
|
|
165
|
+
* @param connection The Solana RPC connection object
|
|
166
|
+
* @returns
|
|
167
|
+
*/
|
|
168
|
+
const getAllRegisteredDomains = async (connection) => {
|
|
169
|
+
const filters = [
|
|
170
|
+
{
|
|
171
|
+
memcmp: {
|
|
172
|
+
offset: 0,
|
|
173
|
+
bytes: constants_1.ROOT_DOMAIN_ACCOUNT.toBase58(),
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
const dataSlice = { offset: 32, length: 32 };
|
|
178
|
+
const accounts = await connection.getProgramAccounts(constants_1.NAME_PROGRAM_ID, {
|
|
179
|
+
dataSlice,
|
|
180
|
+
filters,
|
|
181
|
+
});
|
|
182
|
+
return accounts;
|
|
183
|
+
};
|
|
184
|
+
exports.getAllRegisteredDomains = getAllRegisteredDomains;
|
|
162
185
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/record.ts
CHANGED
|
@@ -15,7 +15,7 @@ export const getRecord = async (
|
|
|
15
15
|
domain: string,
|
|
16
16
|
record: Record
|
|
17
17
|
) => {
|
|
18
|
-
const { pubkey } = await getDomainKey(record + "." + domain);
|
|
18
|
+
const { pubkey } = await getDomainKey(record + "." + domain, true);
|
|
19
19
|
let { registry } = await NameRegistryState.retrieve(connection, pubkey);
|
|
20
20
|
|
|
21
21
|
// Remove trailling 0s
|
package/src/utils.ts
CHANGED
|
@@ -83,16 +83,12 @@ export async function performReverseLookupBatch(
|
|
|
83
83
|
connection: Connection,
|
|
84
84
|
nameAccounts: PublicKey[]
|
|
85
85
|
): Promise<(string | undefined)[]> {
|
|
86
|
-
const [centralState] = await PublicKey.findProgramAddress(
|
|
87
|
-
[NAME_PROGRAM_ID.toBuffer()],
|
|
88
|
-
NAME_PROGRAM_ID
|
|
89
|
-
);
|
|
90
86
|
let reverseLookupAccounts: PublicKey[] = [];
|
|
91
87
|
for (let nameAccount of nameAccounts) {
|
|
92
88
|
const hashedReverseLookup = await getHashedName(nameAccount.toBase58());
|
|
93
89
|
const reverseLookupAccount = await getNameAccountKey(
|
|
94
90
|
hashedReverseLookup,
|
|
95
|
-
|
|
91
|
+
REVERSE_LOOKUP_CLASS
|
|
96
92
|
);
|
|
97
93
|
reverseLookupAccounts.push(reverseLookupAccount);
|
|
98
94
|
}
|
|
@@ -159,13 +155,14 @@ const _derive = async (
|
|
|
159
155
|
* @param domain The domain to compute the public key for (e.g `bonfida.sol`, `dex.bonfida.sol`)
|
|
160
156
|
* @returns
|
|
161
157
|
*/
|
|
162
|
-
export const getDomainKey = async (domain: string) => {
|
|
158
|
+
export const getDomainKey = async (domain: string, record = false) => {
|
|
163
159
|
if (domain.endsWith(".sol")) {
|
|
164
160
|
domain = domain.slice(0, -4);
|
|
165
161
|
}
|
|
166
162
|
const splitted = domain.split(".");
|
|
167
163
|
if (splitted.length === 2) {
|
|
168
|
-
const
|
|
164
|
+
const prefix = Buffer.from([record ? 1 : 0]).toString();
|
|
165
|
+
const sub = prefix.concat(splitted[0]);
|
|
169
166
|
const { pubkey: parentKey } = await _derive(splitted[1]);
|
|
170
167
|
const result = await _derive(sub, parentKey);
|
|
171
168
|
return { ...result, isSub: true, parent: parentKey };
|
|
@@ -205,3 +202,27 @@ export async function getAllDomains(
|
|
|
205
202
|
});
|
|
206
203
|
return accounts.map((a) => a.pubkey);
|
|
207
204
|
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* This function can be used to retrieve all the registered `.sol` domains.
|
|
208
|
+
* The account data is sliced to avoid enormous payload and only the owner is returned
|
|
209
|
+
* @param connection The Solana RPC connection object
|
|
210
|
+
* @returns
|
|
211
|
+
*/
|
|
212
|
+
export const getAllRegisteredDomains = async (connection: Connection) => {
|
|
213
|
+
const filters = [
|
|
214
|
+
{
|
|
215
|
+
memcmp: {
|
|
216
|
+
offset: 0,
|
|
217
|
+
bytes: ROOT_DOMAIN_ACCOUNT.toBase58(),
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
];
|
|
221
|
+
const dataSlice = { offset: 32, length: 32 };
|
|
222
|
+
|
|
223
|
+
const accounts = await connection.getProgramAccounts(NAME_PROGRAM_ID, {
|
|
224
|
+
dataSlice,
|
|
225
|
+
filters,
|
|
226
|
+
});
|
|
227
|
+
return accounts;
|
|
228
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { test, expect, jest } from "@jest/globals";
|
|
2
|
+
import { getAllRegisteredDomains } from "../src/utils";
|
|
3
|
+
import { clusterApiUrl, Connection } from "@solana/web3.js";
|
|
4
|
+
|
|
5
|
+
jest.setTimeout(4 * 60_000);
|
|
6
|
+
|
|
7
|
+
const connection = new Connection(clusterApiUrl("mainnet-beta"));
|
|
8
|
+
|
|
9
|
+
test("All registered", async () => {
|
|
10
|
+
const registered = await getAllRegisteredDomains(connection);
|
|
11
|
+
expect(registered.length).toBeGreaterThan(130_000);
|
|
12
|
+
});
|
package/tests/records.test.ts
CHANGED
|
@@ -7,7 +7,7 @@ jest.setTimeout(20_000);
|
|
|
7
7
|
const connection = new Connection(clusterApiUrl("mainnet-beta"));
|
|
8
8
|
const domain = "🍍";
|
|
9
9
|
|
|
10
|
-
test("Records", () => {
|
|
10
|
+
test("Records", async () => {
|
|
11
11
|
record.getIpfsRecord(connection, domain).then((e) => {
|
|
12
12
|
expect(e.data?.toString()).toBe(
|
|
13
13
|
"QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { test, jest } from "@jest/globals";
|
|
2
|
+
import { performReverseLookupBatch } from "../src/utils";
|
|
3
|
+
import { Connection, clusterApiUrl, PublicKey } from "@solana/web3.js";
|
|
4
|
+
|
|
5
|
+
jest.setTimeout(5_000);
|
|
6
|
+
|
|
7
|
+
const connection = new Connection(clusterApiUrl("mainnet-beta"));
|
|
8
|
+
const domain = new PublicKey("Crf8hzfthWGbGbLTVCiqRqV5MVnbpHB1L9KQMd6gsinb");
|
|
9
|
+
|
|
10
|
+
test("Reverse lookup", async () => {
|
|
11
|
+
return performReverseLookupBatch(connection, [domain]).then((e) =>
|
|
12
|
+
expect(e).toStrictEqual(["bonfida"])
|
|
13
|
+
);
|
|
14
|
+
});
|