diff --git a/README.md b/README.md index ceba17d..387c452 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,12 @@ Avatar resolver library for both nodejs and browser. -## Note!: ENS-Avatar >= 1.0.0 is only compatible with ethers v6. If your project is using v5, keep your ens-avatar on latest 0.x version. +## Note!: ENS-Avatar >= 1.0.0 is only compatible with ethers v6. If your project is using v5, keep your ens-avatar on latest 0.x version. ## Getting started ### Prerequisites + - Have your web3 provider ready (web3.js, ethers.js) - [Only for node env] Have jsdom installed. @@ -35,16 +36,24 @@ const provider = new StaticJsonRpcProvider( ); ... async function getAvatar() { - const avt = new AvatarResolver(provider); - const avatarURI = await avt.getAvatar('tanrikulu.eth', { /* jsdomWindow: jsdom (on nodejs) */ }); + const resolver = new AvatarResolver(provider); + const avatarURI = await resolver.getAvatar('tanrikulu.eth', { /* jsdomWindow: jsdom (on nodejs) */ }); // avatarURI = https://ipfs.io/ipfs/QmUShgfoZQSHK3TQyuTfUpsc8UfeNfD8KwPUvDBUdZ4nmR } +async function getHeader() { + const resolver = new AvatarResolver(provider); + const headerURI = await resolver.getHeader('tanrikulu.eth', { /* jsdomWindow: jsdom (on nodejs) */ }); + // headerURI = https://ipfs.io/ipfs/QmRFnn6c9rj6NuHenFVyKXb6tuKxynAvGiw7yszQJ2EsjN +} + async function getAvatarMetadata() { - const avt = new AvatarResolver(provider); - const avatarMetadata = await avt.getMetadata('tanrikulu.eth'); + const resolver = new AvatarResolver(provider); + const avatarMetadata = await resolver.getMetadata('tanrikulu.eth'); // avatarMetadata = { image: ... , uri: ... , name: ... , description: ... } - const avatarURI = avtUtils.getImageURI({ metadata /*, jsdomWindow: jsdom (on nodejs) */ }); + const headerMetadata = await resolver.getMetadata('tanrikulu.eth', 'header'); + // headerMetadata = { image: ... , uri: ... , name: ... , description: ... } + const avatarURI = avtUtils.getImageURI({ metadata: avatarMetadata /*, jsdomWindow: jsdom (on nodejs) */ }); // avatarURI = https://ipfs.io/ipfs/QmUShgfoZQSHK3TQyuTfUpsc8UfeNfD8KwPUvDBUdZ4nmR } ``` @@ -52,10 +61,12 @@ async function getAvatarMetadata() { ## Supported avatar specs ### NFTs + - ERC721 - ERC1155 ### URIs + - HTTP - Base64 - IPFS @@ -63,44 +74,54 @@ async function getAvatarMetadata() { ## Options ### Cache _(Default: Disabled)_ + ```js const avt = new AvatarResolver(provider, { cache: 300 }); // 5 min response cache in memory ``` ### Custom IPFS Gateway _(Default: https://ipfs.io)_ + ```js const avt = new AvatarResolver(provider, { ipfs: 'https://dweb.link' }); ``` ### Custom Arweave Gateway _(Default: https://arweave.net)_ + ```js const avt = new AvatarResolver(provider, { arweave: 'https://arweave.net' }); ``` ### Marketplace Api Keys _(Default: {})_ + ```js -const avt = new AvatarResolver(provider, { - apiKey: { - opensea: 'YOUR_API_KEY' - } +const avt = new AvatarResolver(provider, { + apiKey: { + opensea: 'YOUR_API_KEY', + }, }); ``` ### URL DenyList _(Default: [])_ + ```js -const avt = new AvatarResolver(provider, { urlDenyList: ['https://maliciouswebsite.com'] }); +const avt = new AvatarResolver(provider, { + urlDenyList: ['https://maliciouswebsite.com'], +}); ``` ## Demo + - Create .env file with INFURA_KEY env variable - Build the library - Node example + ```bash node example/node.js ENS_NAME ``` - Browser example + ```bash yarn build:demo http-server example diff --git a/package.json b/package.json index 75269db..a5deac1 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "main": "dist/index.js", "module": "dist/index.esm.js", diff --git a/src/index.ts b/src/index.ts index 7bf75b8..15f1747 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,6 +17,7 @@ import { AvatarRequestOpts, AvatarResolverOpts, HeaderRequestOpts, + MediaKey, Spec, } from './types'; @@ -36,7 +37,7 @@ export interface AvatarResolver { options?: AvatarResolverOpts; getAvatar(ens: string, data: AvatarRequestOpts): Promise; getHeader(ens: string, data: HeaderRequestOpts): Promise; - getMetadata(ens: string): Promise; + getMetadata(ens: string, key?: MediaKey): Promise; } export class AvatarResolver implements AvatarResolver { @@ -55,7 +56,7 @@ export class AvatarResolver implements AvatarResolver { } } - async getMetadata(ens: string, key: string = 'avatar') { + async getMetadata(ens: string, key: MediaKey = 'avatar') { // retrieve registrar address and resolver object from ens name const [resolvedAddress, resolver] = await handleSettled([ this.provider.resolveName(ens), @@ -122,7 +123,7 @@ export class AvatarResolver implements AvatarResolver { async _getMedia( ens: string, - mediaKey: string = 'avatar', + mediaKey: MediaKey = 'avatar', data?: HeaderRequestOpts ) { const metadata = await this.getMetadata(ens, mediaKey); diff --git a/src/types.ts b/src/types.ts index 018f3f9..df23003 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,6 +22,8 @@ export interface AxiosAgents { httpsAgent?: Function; } +export type MediaKey = 'avatar' | 'header' | 'banner'; + export interface AvatarResolverOpts { cache?: number; ipfs?: string; @@ -38,7 +40,7 @@ export interface AvatarRequestOpts { export interface HeaderRequestOpts { jsdomWindow?: any; - mediaKey?: 'header' | 'banner'; + mediaKey?: Exclude; } export type Gateways = {