Skip to content

Commit

Permalink
feat: getMetdataByOwnerV2
Browse files Browse the repository at this point in the history
  • Loading branch information
vecheslav committed Sep 23, 2021
1 parent 8a415b9 commit 64add73
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 3 deletions.
35 changes: 35 additions & 0 deletions api/src/programs/metadata/accounts/Metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,29 @@ export class Metadata extends Account<MetadataData> {
).map((account) => Metadata.from(account));
}

static async getByMint(connection: Connection, mint: AnyPublicKey) {
return (
await MetadataProgram.getProgramAccounts(connection, {
filters: [
// Filter for MetadataV1 by key
{
memcmp: {
offset: 0,
bytes: bs58.encode(Buffer.from([MetadataKey.MetadataV1])),
},
},
// Filter for assigned to mint
{
memcmp: {
offset: 33,
bytes: new PublicKey(mint).toBase58(),
},
},
],
})
).map((account) => Metadata.from(account));
}

static async getMetdataByOwner(connection: Connection, owner: AnyPublicKey) {
const accounts = await TokenAccount.getTokenAccountsByOwner(connection, owner);
const accountMap = new Map(accounts.map(({ data }) => [data.mint.toString(), data]));
Expand All @@ -152,6 +175,18 @@ export class Metadata extends Account<MetadataData> {
);
}

// TODO: lol
static async getMetdataByOwnerV2(connection: Connection, owner: AnyPublicKey) {
const accounts = await TokenAccount.getTokenAccountsByOwner(connection, owner);
const accountsWithAmount = accounts
.map(({ data }) => data)
.filter(({ amount }) => amount?.toNumber() > 0);

return (
await Promise.all(accountsWithAmount.map(({ mint }) => Metadata.getByMint(connection, mint)))
).flat();
}

async getEdition(connection: Connection) {
const mint = this.data?.mint;
if (!mint) return;
Expand Down
11 changes: 8 additions & 3 deletions examples/node/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,15 @@ const connection = new Connection('devnet');

const run = async () => {
// TODO: just waiting for layer service with combine
console.time('ownedMetadata');
const ownedMetadata = await Metadata.getMetdataByOwner(connection, payer.publicKey);
// console.time('ownedMetadata');
// const ownedMetadata = await Metadata.getMetdataByOwner(connection, payer.publicKey);
// console.log(ownedMetadata);
// console.timeEnd('ownedMetadata');

console.time('ownedMetadata v2');
const ownedMetadata = await Metadata.getMetdataByOwnerV2(connection, payer.publicKey);
console.log(ownedMetadata);
console.timeEnd('ownedMetadata');
console.timeEnd('ownedMetadata v2');

const metadata = await Metadata.load(connection, metadataPubkey);
console.log(metadata);
Expand Down

0 comments on commit 64add73

Please sign in to comment.