Skip to content

Commit

Permalink
Merge pull request #645 from liquality/feat/nft-providers
Browse files Browse the repository at this point in the history
Feat/nft providers
  • Loading branch information
bradleySuira committed Apr 20, 2023
2 parents 2c94a55 + f170fbb commit 61a195c
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 223 deletions.
2 changes: 1 addition & 1 deletion packages/evm/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export { EnsProvider } from './naming/EnsProvider';
export { EvmNetworks } from './networks';
export { CovalentNftProvider } from './nft/CovalentNftProvider';
export { EvmNftProvider } from './nft/EvmNftProvider';
export { MoralisNftProvider } from './nft/MoralisNftProvider';
export { InfuraNftProvider } from './nft/InfuraNftProvider';
export { OpenSeaNftProvider } from './nft/OpenSeaNftProvider';
export { EvmBaseSwapProvider } from './swap/EvmBaseSwapProvider';
export { EvmSwapProvider } from './swap/EvmSwapProvider';
Expand Down
62 changes: 62 additions & 0 deletions packages/evm/lib/nft/InfuraNftProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { HttpClient } from '@chainify/client';
import { NFTAsset } from '@chainify/types';
import { BaseProvider } from '@ethersproject/providers';
import { NftProviderConfig, NftTypes } from '../types';
import { EvmBaseWalletProvider } from '../wallet/EvmBaseWalletProvider';
import { EvmNftProvider } from './EvmNftProvider';

export class InfuraNftProvider extends EvmNftProvider {
private readonly _config: NftProviderConfig;
private readonly _httpClient: HttpClient;

constructor(walletProvider: EvmBaseWalletProvider<BaseProvider>, config: NftProviderConfig) {
super(walletProvider);
this._config = config;

this._httpClient = new HttpClient({
baseURL: config.url,
transformResponse: undefined,
headers: { Authorization: `Basic ${this._config.apiKey}` },
});
}

async fetch(): Promise<NFTAsset[]> {
const [userAddress, network] = await Promise.all([this.walletProvider.getAddress(), this.walletProvider.getConnectedNetwork()]);

const chainId = Number(network.chainId);
const { data } = await this._httpClient.nodeGet(`/networks/${chainId}/accounts/${userAddress.toString()}/assets/nfts`);
return data.reduce((result: NFTAsset[], nft: { contract: any; tokenId: any; supply: any; type: any; metadata: any }) => {
const { contract, tokenId, supply, type, metadata } = nft;
if (type in NftTypes && contract) {
this.cache[contract] = {
contract: this.schemas[type].attach(contract),
schema: type as NftTypes,
};
const _image = metadata?.image?.replace('ipfs://', 'https://ipfs.io/ipfs/') || '';
const nftAsset: NFTAsset = {
asset_contract: {
address: contract,
name: metadata?.name,
symbol: '',
},
collection: {
name: metadata?.name,
},
token_id: tokenId,
amount: supply,
standard: type,
name: metadata?.name,
description: metadata?.attributes.find((i: any) => i.trait_type === 'Description')?.value,
image_original_url: _image,
image_preview_url: _image,
image_thumbnail_url: _image,
external_link: '',
};

result.push(nftAsset);
}

return result;
}, []);
}
}
73 changes: 0 additions & 73 deletions packages/evm/lib/nft/MoralisNftProvider.ts

This file was deleted.

3 changes: 1 addition & 2 deletions packages/evm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@
"@ethersproject/wallet": "5.7.0",
"@liquality/fee-suggestions": "2.0.2",
"@metamask/eth-sig-util": "4.0.1",
"ethers": "5.7.0",
"moralis": "1.8.0"
"ethers": "5.7.0"
},
"devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.4",
Expand Down
107 changes: 53 additions & 54 deletions packages/solana/lib/nft/SolanaNftProvider.ts
Original file line number Diff line number Diff line change
@@ -1,76 +1,75 @@
import { HttpClient, Nft, Wallet } from '@chainify/client';
import { Nft, Wallet } from '@chainify/client';
import { UnsupportedMethodError } from '@chainify/errors';
import { AddressType, AssetTypes, BigNumber, ChainId, NFTAsset, Transaction } from '@chainify/types';
import { BaseProvider } from '@ethersproject/providers';
import Moralis from 'moralis/node';
import { SolanaWalletProvider } from '../wallet/SolanaWalletProvider';

type MoralisConfig = {
url: string;
apiKey: string;
appId: string;
};
// type ProviderConfig = {
// url: string;
// apiKey: string;
// appId: string;
// };

export class SolanaNftProvider extends Nft<BaseProvider, SolanaWalletProvider> {
private _config: MoralisConfig;
private readonly _httpClient: HttpClient;
// private _config: MoralisConfig;
// private readonly _httpClient: HttpClient;

constructor(walletProvider: Wallet<BaseProvider, SolanaWalletProvider>, config: MoralisConfig) {
constructor(walletProvider: Wallet<BaseProvider, SolanaWalletProvider>) {
super(walletProvider);
this._config = config;
this._httpClient = new HttpClient({});
// this._config = config;
// this._httpClient = new HttpClient({});
}

async fetch(): Promise<NFTAsset[]> {
if (!Moralis.applicationId) {
await Moralis.start({ masterKey: this._config.apiKey, serverUrl: this._config.url, appId: this._config.appId });
}
// if (!Moralis.applicationId) {
// await Moralis.start({ masterKey: this._config.apiKey, serverUrl: this._config.url, appId: this._config.appId });
// }

const [userAddress, network] = await Promise.all([this.walletProvider.getAddress(), this.walletProvider.getConnectedNetwork()]);
const nftsOptions = {
address: userAddress.toString(),
network: network.isTestnet ? 'devnet' : ('mainnet' as any),
};
const nftBalance = await Moralis.SolanaAPI.account.getNFTs(nftsOptions);
// const [userAddress, network] = await Promise.all([this.walletProvider.getAddress(), this.walletProvider.getConnectedNetwork()]);
// const nftsOptions = {
// address: userAddress.toString(),
// network: network.isTestnet ? 'devnet' : ('mainnet' as any),
// };
// const nftBalance = await Moralis.SolanaAPI.account.getNFTs(nftsOptions);

const nftAssets: NFTAsset[] = [];

for (const nft of nftBalance) {
const metadataOptions = {
...nftsOptions,
address: nft.mint,
};
// for (const nft of nftBalance) {
// const metadataOptions = {
// ...nftsOptions,
// address: nft.mint,
// };

const nftMetadata = await Moralis.SolanaAPI.nft.getNFTMetadata(metadataOptions);
// const nftMetadata = await Moralis.SolanaAPI.nft.getNFTMetadata(metadataOptions);

const { mint, symbol } = nftMetadata;
try {
const data = await this._httpClient.nodeGet(nftMetadata.metaplex.metadataUri);
const nftAsset = {
token_id: data.edition,
asset_contract: {
address: mint,
name: data.name,
symbol: symbol,
image_url: data.image,
external_link: data.external_url,
},
collection: {
name: data.collection?.name || data.name,
},
description: data.description,
external_link: data.external_url,
image_original_url: data.image,
image_preview_url: data.image,
image_thumbnail_url: data.image,
name: data.name,
};
// const { mint, symbol } = nftMetadata;
// try {
// const data = await this._httpClient.nodeGet(nftMetadata.metaplex.metadataUri);
// const nftAsset = {
// token_id: data.edition,
// asset_contract: {
// address: mint,
// name: data.name,
// symbol: symbol,
// image_url: data.image,
// external_link: data.external_url,
// },
// collection: {
// name: data.collection?.name || data.name,
// },
// description: data.description,
// external_link: data.external_url,
// image_original_url: data.image,
// image_preview_url: data.image,
// image_thumbnail_url: data.image,
// name: data.name,
// };

nftAssets.push(nftAsset);
} catch (err) {
nftAssets.push({ asset_contract: { address: mint, symbol }, collection: { name: symbol } });
}
}
// nftAssets.push(nftAsset);
// } catch (err) {
// nftAssets.push({ asset_contract: { address: mint, symbol }, collection: { name: symbol } });
// }
// }

return nftAssets;
}
Expand Down

0 comments on commit 61a195c

Please sign in to comment.