Skip to content

Commit

Permalink
added a way to load a single soul name details
Browse files Browse the repository at this point in the history
  • Loading branch information
H34D committed Nov 11, 2022
1 parent 5d1b71d commit 87bd729
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 41 deletions.
5 changes: 3 additions & 2 deletions docs/classes/Masa.md
Expand Up @@ -154,8 +154,9 @@ ___
| `burn` | (`soulName`: `string`) => `Promise`<`void`\> |
| `create` | (`soulName`: `string`, `duration`: `number`, `paymentMethod`: [`PaymentMethod`](../modules.md#paymentmethod)) => `Promise`<`void`\> |
| `getRegistrationPrice` | (`soulName`: `string`, `duration`: `number`, `paymentMethod`: [`PaymentMethod`](../modules.md#paymentmethod)) => `Promise`<`string` \| `BigNumber`\> |
| `list` | (`address?`: `string`) => `Promise`<`undefined` \| { `index`: `string` = nameIndex; `metadata`: `undefined` \| [`ISoulName`](../interfaces/ISoulName.md) ; `tokenDetails`: [`string`, `BigNumber`, `BigNumber`, `BigNumber`, `boolean`] & { `active`: `boolean` ; `expirationDate`: `BigNumber` ; `identityId`: `BigNumber` ; `sbtName`: `string` ; `tokenId`: `BigNumber` } ; `tokenUri`: `string` }[]\> |
| `loadSoulNamesByIdentityId` | (`identityId`: `BigNumber`) => `Promise`<{ `index`: `string` = nameIndex; `metadata`: `undefined` \| [`ISoulName`](../interfaces/ISoulName.md) ; `tokenDetails`: [`string`, `BigNumber`, `BigNumber`, `BigNumber`, `boolean`] & { `active`: `boolean` ; `expirationDate`: `BigNumber` ; `identityId`: `BigNumber` ; `sbtName`: `string` ; `tokenId`: `BigNumber` } ; `tokenUri`: `string` }[]\> |
| `list` | (`address?`: `string`) => `Promise`<`undefined` \| { `index`: `number` ; `metadata`: `undefined` \| [`ISoulName`](../interfaces/ISoulName.md) ; `tokenDetails`: [`string`, `BigNumber`, `BigNumber`, `BigNumber`, `boolean`] & { `active`: `boolean` ; `expirationDate`: `BigNumber` ; `identityId`: `BigNumber` ; `sbtName`: `string` ; `tokenId`: `BigNumber` } ; `tokenUri`: `string` }[]\> |
| `loadSoulNameByName` | (`soulName`: `string`) => `Promise`<{ `metadata`: `undefined` \| [`ISoulName`](../interfaces/ISoulName.md) ; `owner`: `string` ; `tokenDetails`: [`string`, `BigNumber`, `BigNumber`, `BigNumber`, `boolean`] & { `active`: `boolean` ; `expirationDate`: `BigNumber` ; `identityId`: `BigNumber` ; `sbtName`: `string` ; `tokenId`: `BigNumber` } ; `tokenUri`: `string` }\> |
| `loadSoulNamesByIdentityId` | (`identityId`: `BigNumber`) => `Promise`<{ `index`: `number` ; `metadata`: `undefined` \| [`ISoulName`](../interfaces/ISoulName.md) ; `tokenDetails`: [`string`, `BigNumber`, `BigNumber`, `BigNumber`, `boolean`] & { `active`: `boolean` ; `expirationDate`: `BigNumber` ; `identityId`: `BigNumber` ; `sbtName`: `string` ; `tokenId`: `BigNumber` } ; `tokenUri`: `string` }[]\> |
| `send` | (`soulName`: `string`, `receiver`: `string`) => `Promise`<`void`\> |

___
Expand Down
91 changes: 54 additions & 37 deletions src/soul-name/list.ts
Expand Up @@ -2,53 +2,70 @@ import Masa from "../masa";
import { BigNumber } from "ethers";
import { ISoulName } from "../interface";

export const loadSoulNameByName = async (masa: Masa, soulName: string) => {
const identityContracts = await masa.contracts.loadIdentityContracts();

const tokenDetails = await identityContracts.SoulNameContract.getTokenData(
soulName
);

const owner = await identityContracts.SoulNameContract.ownerOf(
tokenDetails.tokenId
);

const tokenUri = await identityContracts.SoulNameContract[
"tokenURI(uint256)"
](tokenDetails.tokenId);

let metadata;
try {
const metadataResponse = await masa.arweaveClient.transactions
.getData(tokenUri.replace("ar://", ""), {
decode: true,
string: true,
})
.catch(() => {
// ignore
});

metadata = JSON.parse(metadataResponse as string) as ISoulName;
} catch {
// ignore
}

return {
owner,
tokenUri,
tokenDetails,
metadata,
};
};

export const loadSoulNamesByIdentityId = async (
masa: Masa,
identityId: BigNumber
) => {
const soulNameDetails = [];

const identityContracts = await masa.contracts.loadIdentityContracts();

const soulNames = await identityContracts.SoulNameContract[
"getSoulNames(uint256)"
](identityId);

// todo parallelize this
for (const nameIndex in soulNames) {
const tokenDetails = await identityContracts.SoulNameContract.getTokenData(
soulNames[nameIndex]
);

const tokenUri = await identityContracts.SoulNameContract[
"tokenURI(uint256)"
](tokenDetails.tokenId);

let metadata;
try {
const metadataResponse = await masa.arweaveClient.transactions
.getData(tokenUri.replace("ar://", ""), {
decode: true,
string: true,
})
.catch(() => {
// ignore
});

metadata = JSON.parse(metadataResponse as string) as ISoulName;
} catch {
// ignore
}

soulNameDetails.push({
index: nameIndex,
tokenUri,
tokenDetails,
metadata,
});
}
return await Promise.all(
soulNames.map(async (soulName, index) => {
const { tokenUri, tokenDetails, metadata } = await loadSoulNameByName(
masa,
soulName
);

return soulNameDetails;
return {
index,
tokenUri,
tokenDetails,
metadata,
};
})
);
};

export const listSoulNames = async (masa: Masa, address?: string) => {
Expand All @@ -61,7 +78,7 @@ export const listSoulNames = async (masa: Masa, address?: string) => {
const soulNames = await loadSoulNamesByIdentityId(masa, identityId);

for (const soulName of soulNames) {
console.log(`\nToken: ${parseInt(soulName.index) + 1}`);
console.log(`\nToken: ${soulName.index + 1}`);
console.log(`Name: ${soulName.tokenDetails.sbtName}`);
console.log(`Token ID: ${soulName.tokenDetails.tokenId.toNumber()}`);
console.log(`Identity ID: ${soulName.tokenDetails.identityId.toNumber()}`);
Expand Down
9 changes: 7 additions & 2 deletions src/soul-name/soul-names.ts
Expand Up @@ -3,8 +3,12 @@ import { PaymentMethod } from "../contracts";
import Masa from "../masa";
import { burnSoulName } from "./burn";
import { createSoulName, getRegistrationPrice } from "./create";
import { listSoulNames, loadSoulNamesByIdentityId } from "./list";
import { sendSoulName } from "./send"
import {
listSoulNames,
loadSoulNameByName,
loadSoulNamesByIdentityId,
} from "./list";
import { sendSoulName } from "./send";

export const soulNames = (masa: Masa) => ({
getRegistrationPrice: (
Expand All @@ -15,6 +19,7 @@ export const soulNames = (masa: Masa) => ({
list: (address?: string) => listSoulNames(masa, address),
loadSoulNamesByIdentityId: (identityId: BigNumber) =>
loadSoulNamesByIdentityId(masa, identityId),
loadSoulNameByName: (soulName: string) => loadSoulNameByName(masa, soulName),
create: (soulName: string, duration: number, paymentMethod: PaymentMethod) =>
createSoulName(masa, soulName, duration, paymentMethod),
burn: (soulName: string) => burnSoulName(masa, soulName),
Expand Down

0 comments on commit 87bd729

Please sign in to comment.