diff --git a/js/package-lock.json b/js/package-lock.json index 37f5711..acf79b4 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bonfida/spl-name-service", - "version": "2.3.1", + "version": "2.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bonfida/spl-name-service", - "version": "2.3.1", + "version": "2.3.2", "license": "MIT", "dependencies": { "@bonfida/sns-records": "0.0.1-alpha.8", diff --git a/js/package.json b/js/package.json index af823cc..3edf4b5 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "@bonfida/spl-name-service", - "version": "2.3.1", + "version": "2.3.2", "license": "MIT", "files": [ "dist" diff --git a/js/src/utils.ts b/js/src/utils.ts index 21dd8e3..a20c19e 100644 --- a/js/src/utils.ts +++ b/js/src/utils.ts @@ -112,7 +112,7 @@ export const findSubdomains = async ( parentKey: PublicKey, ): Promise => { // Fetch reverse accounts - const filtersReverse: MemcmpFilter[] = [ + const filtersRevs: MemcmpFilter[] = [ { memcmp: { offset: 0, @@ -126,19 +126,40 @@ export const findSubdomains = async ( }, }, ]; - const reverse = await connection.getProgramAccounts(NAME_PROGRAM_ID, { - filters: filtersReverse, + const reverses = await connection.getProgramAccounts(NAME_PROGRAM_ID, { + filters: filtersRevs, }); - const parent = await reverseLookup(connection, parentKey); - const subs = reverse.map( - (e) => e.account.data.slice(97).toString("utf-8")?.split("\0").join(""), + const filtersSubs: MemcmpFilter[] = [ + { + memcmp: { + offset: 0, + bytes: parentKey.toBase58(), + }, + }, + ]; + const subs = await connection.getProgramAccounts(NAME_PROGRAM_ID, { + filters: filtersSubs, + dataSlice: { offset: 0, length: 0 }, + }); + + const map = new Map( + reverses.map((e) => [ + e.pubkey.toBase58(), + deserializeReverse(e.account.data.slice(96)), + ]), ); - const keys = subs.map((e) => getDomainKeySync(e + "." + parent).pubkey); - const subsAcc = await connection.getMultipleAccountsInfo(keys); + const result: string[] = []; + subs.forEach((e) => { + const revKey = getReverseKeyFromDomainKey(e.pubkey, parentKey).toBase58(); + const rev = map.get(revKey); + if (!!rev) { + result.push(rev.replace("\0", "")); + } + }); - return subs.filter((_, idx) => !!subsAcc[idx]); + return result; }; const _deriveSync = ( diff --git a/js/tests/sub.test.ts b/js/tests/sub.test.ts index 3b29806..25b3a7b 100644 --- a/js/tests/sub.test.ts +++ b/js/tests/sub.test.ts @@ -4,6 +4,7 @@ import { Connection, PublicKey, Transaction } from "@solana/web3.js"; import { createSubdomain, transferSubdomain } from "../src/bindings"; import { randomBytes } from "crypto"; import { VAULT_OWNER } from "../src/constants"; +import { findSubdomains, getDomainKeySync } from "../src/utils"; jest.setTimeout(20_000); @@ -15,7 +16,7 @@ test("Create sub", async () => { connection, randomBytes(10).toString("hex") + ".bonfida", new PublicKey("HKKp49qGWXd639QsuH7JiLijfVW5UtCVY4s1n2HANwEA"), - 2_000 + 2_000, ); tx.add(...ix); const { blockhash } = await connection.getLatestBlockhash(); @@ -29,13 +30,13 @@ test("Transfer sub", async () => { let tx = new Transaction(); const owner = new PublicKey("J6QDztZCegYTWnGUYtjqVS9d7AZoS43UbEQmMcdGeP5s"); const parentOwner = new PublicKey( - "J6QDztZCegYTWnGUYtjqVS9d7AZoS43UbEQmMcdGeP5s" + "J6QDztZCegYTWnGUYtjqVS9d7AZoS43UbEQmMcdGeP5s", ); let ix = await transferSubdomain( connection, "test.0x33.sol", PublicKey.default, - false + false, ); tx.add(ix); let blockhash = (await connection.getLatestBlockhash()).blockhash; @@ -49,7 +50,7 @@ test("Transfer sub", async () => { connection, "test.0x33.sol", PublicKey.default, - true + true, ); tx.add(ix); blockhash = (await connection.getLatestBlockhash()).blockhash; @@ -58,3 +59,12 @@ test("Transfer sub", async () => { res = await connection.simulateTransaction(tx); expect(res.value.err).toBe(null); }); + +test("Find sub domain", async () => { + const subs = await findSubdomains( + connection, + getDomainKeySync("bonfida").pubkey, + ); + const expectedSub = ["dex", "naming", "test"]; + subs.sort().forEach((e, idx) => expect(e).toBe(expectedSub[idx])); +});