Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@onsol/tldparser",
"version": "0.6.5",
"version": "0.6.6",
"description": "TLD House (Solana) Javascript API",
"keywords": [
"api",
Expand Down Expand Up @@ -56,7 +56,7 @@
},
"devDependencies": {
"@jest/types": "^29.3.1",
"@solana/web3.js": "^1.67.0",
"@solana/web3.js": "^1.95.3",
"@types/bn.js": "^5.1.0",
"@types/bs58": "^4.0.1",
"@types/jest": "^29.2.3",
Expand All @@ -77,7 +77,7 @@
"typescript": "^4.9.4"
},
"peerDependencies": {
"@solana/web3.js": "^1.67.0",
"@solana/web3.js": "^1.95.3",
"bn.js": "^5.2.1",
"borsh": "^0.7.0",
"buffer": "6.0.1"
Expand Down
6 changes: 6 additions & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,15 @@ export const NAME_HOUSE_PROGRAM_ID = new PublicKey(
export const SPL_TOKEN_PROGRAM_ID = new PublicKey(
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
);

export const TOKEN_METADATA_PROGRAM_ID = new PublicKey(
'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s',
);

export const ROOT_ANS_PUBLIC_KEY = new PublicKey(
'3mX9b4AZaQehNoQGfckVcmgmA6bkBoFcbLj9RMmMyNcU',
);

export const NFT_RECORD_PREFIX = 'nft_record';
export const TLD_HOUSE_PREFIX = 'tld_house';
export const NAME_HOUSE_PREFIX = 'name_house';
Expand Down
68 changes: 59 additions & 9 deletions src/state/name-record-header.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { AccountInfo, Connection, PublicKey } from '@solana/web3.js';
import { BinaryReader, deserializeUnchecked, Schema } from 'borsh';
import { ROOT_ANS_PUBLIC_KEY } from '../constants';

/**
* Holds the data for the {@link NameRecordHeader} Account and provides de/serialization
Expand All @@ -25,15 +26,9 @@ export class NameRecordHeader {
1000,
);
this.nonTransferable = obj.nonTransferable[0] !== 0;
// grace period = 45 days * 24 hours * 60 minutes * 60 seconds * 1000 millie seconds = 3_888_000 seconds
const gracePeriod = 45 * 24 * 60 * 60 * 1000;
this.isValid =
new BinaryReader(Buffer.from(obj.expiresAt))
.readU64()
.toNumber() === 0
? true
: this.expiresAt.getTime() + gracePeriod > new Date(Date.now()).getTime();
this.owner = this.isValid ? new PublicKey(obj.owner) : undefined;

this.isValid = false; // We'll set this later
this.owner = new PublicKey(obj.owner); // We'll update this later if needed
}

parentName: PublicKey;
Expand Down Expand Up @@ -78,6 +73,56 @@ export class NameRecordHeader {
return 8 + 32 + 32 + 32 + 8 + 8 + 1 + 79;
}

// only for normal domains, tld name record might not be working.
static async create(
obj: {
parentName: Uint8Array;
owner: Uint8Array;
nclass: Uint8Array;
expiresAt: Uint8Array;
createdAt: Uint8Array;
nonTransferable: Uint8Array;
},
connection: Connection,
parentNameRecord?: NameRecordHeader,
): Promise<NameRecordHeader> {
const instance = new NameRecordHeader(obj);
if (!parentNameRecord)
await instance.initializeParentNameRecordHeader(connection);
else {
instance.updateGracePeriod(parentNameRecord);
}
return instance;
}

updateGracePeriod(parentNameRecord: NameRecordHeader): void {
const currentTime = Date.now();
const defaultGracePeriod = 50 * 24 * 60 * 60 * 1000; // 50 days in milliseconds
const gracePeriod = parentNameRecord.expiresAt.getTime() || defaultGracePeriod;

this.isValid = this.expiresAt.getTime() === 0 ||
this.expiresAt.getTime() + gracePeriod > currentTime;

if (!this.isValid) {
this.owner = undefined;
}
}

async initializeParentNameRecordHeader(
connection: Connection,
): Promise<void> {
if (this.parentName.toString() === PublicKey.default.toString()) {
this.isValid = true;
return;
}
const parentNameRecordHeader =
await NameRecordHeader.fromAccountAddress(
connection,
this.parentName,
);
this.updateGracePeriod(parentNameRecordHeader);
}

/**
* Retrieves the account info from the provided address and deserializes
* the {@link NameRecordHeader} from its data.
Expand All @@ -101,6 +146,11 @@ export class NameRecordHeader {
);

res.data = nameAccount.data?.subarray(this.byteSize);
if (res.parentName.toString() !== ROOT_ANS_PUBLIC_KEY.toString()) {
await res.initializeParentNameRecordHeader(connection);
} else {
res.isValid = true;
}

return res;
}
Expand Down
7 changes: 6 additions & 1 deletion src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ export async function findOwnedNameAccountsForUser(
memcmp: {
offset: 40,
bytes: userAccount.toBase58(),
encoding: 'base58',
},
},
];
Expand All @@ -116,13 +117,15 @@ export async function findOwnedNameAccountsForUser(
memcmp: {
offset: 8,
bytes: parentAccount.toBase58(),
encoding: 'base58',
},
});
}

const accounts = await connection.getProgramAccounts(ANS_PROGRAM_ID, {
filters: filters,
filters: filters
});

return accounts.map((a: any) => a.pubkey);
}

Expand Down Expand Up @@ -150,6 +153,7 @@ export async function getAllTld(connection: Connection): Promise<
memcmp: {
offset: 0,
bytes: tldHouseDiscriminator,
encoding: 'binary',
},
},
];
Expand Down Expand Up @@ -210,6 +214,7 @@ export async function findAllDomainsForTld(
memcmp: {
offset: 8,
bytes: parentAccount.toBase58(),
encoding: 'base58',
},
},
];
Expand Down
50 changes: 25 additions & 25 deletions tests/tld-parser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,38 +14,38 @@ const nameAccount = new PublicKey('6iE5btnTaan1eqfnwChLdVAyFERdn5uCVnp5GiXVg1aB'
const parentAccountOwner = new PublicKey('ANgPRMKQHgH5Snx2K3VHCvHqFmrABcjTZUrqZBzDCtfA');

describe('tldParser tests', () => {
it('should perform fetching of a pending expiry domain', async () => {
const parser = new TldParser(connection);
const domanTld = 'canwenot.abc';
const ownerRecieved = await parser.getOwnerFromDomainTld(domanTld);
expect(ownerRecieved).toStrictEqual(owner);
});
// it('should perform fetching of a pending expiry domain', async () => {
// const parser = new TldParser(connection);
// const domanTld = 'miester.abc';
// const ownerRecieved = await parser.getOwnerFromDomainTld(domanTld);
// expect(ownerRecieved).toStrictEqual(owner);
// });

it('should perform fetching of an owner an nft domain', async () => {
const parser = new TldParser(connection);
const domanTld = 'legendary.abc';
const ownerRecieved = await parser.getOwnerFromDomainTld(domanTld);
expect(ownerRecieved).toStrictEqual(owner);
});
// it('should perform fetching of an owner an nft domain', async () => {
// const parser = new TldParser(connection);
// const domanTld = 'legendary.abc';
// const ownerRecieved = await parser.getOwnerFromDomainTld(domanTld);
// expect(ownerRecieved).toStrictEqual(owner);
// });

it('should perform fetching of an owner an nft domain', async () => {
const parser = new TldParser(connection);
const domanTld = 'miester.abc';
const ownerRecieved = await parser.getOwnerFromDomainTld(domanTld);
expect(ownerRecieved).toStrictEqual(owner);
});
// it('should perform fetching of an owner an nft domain', async () => {
// const parser = new TldParser(connection);
// const domanTld = 'miester.abc';
// const ownerRecieved = await parser.getOwnerFromDomainTld(domanTld);
// expect(ownerRecieved).toStrictEqual(owner);
// });

// it('should perform retrieval of all user domains', async () => {
// const parser = new TldParser(connection);
// const allDomainsReceived = await parser.getAllUserDomains(owner);
// expect(allDomainsReceived).toHaveLength(26);
// expect(allDomainsReceived).toHaveLength(54);
// });

// it('should perform retrieval of all user domains for poor tld', async () => {
// const parser = new TldParser(connection);
// const tld = 'poor';
// const ownedDomainsReceived = await parser.getAllUserDomainsFromTld(owner, tld);
// expect(ownedDomainsReceived).toHaveLength(3);
// expect(ownedDomainsReceived).toHaveLength(1);
// });

// it('should perform lookup of owner of the domainTld', async () => {
Expand Down Expand Up @@ -81,11 +81,11 @@ describe('tldParser tests', () => {
// expect(tld).toStrictEqual(expect.stringContaining('poor'));
// });

// it('should perform reverse lookup of domain from nameAccount and parent name owner', async () => {
// const parser = new TldParser(connection);
// const domain = await parser.reverseLookupNameAccount(nameAccount, parentAccountOwner);
// expect(domain).toStrictEqual(expect.stringContaining('miester'));
// });
it('should perform reverse lookup of domain from nameAccount and parent name owner', async () => {
const parser = new TldParser(connection);
const domain = await parser.reverseLookupNameAccount(nameAccount, parentAccountOwner);
expect(domain).toStrictEqual(expect.stringContaining('miester'));
});

// it('should perform fetching of dns record of domain', async () => {
// let domain = 'miester.poor';
Expand Down
Loading