import { Currency, Token } from '@uniswap/sdk-core' import { Tags, TokenInfo } from '@uniswap/token-lists' import { TokenList } from '@uniswap/token-lists/dist/types' import { isAddress } from '../../utils' type TagDetails = Tags[keyof Tags] export interface TagInfo extends TagDetails { id: string } /** * Token instances created from token info on a token list. */ export class WrappedTokenInfo implements Token { public readonly isNative: false = false public readonly isToken: true = true public readonly list: TokenList public readonly tokenInfo: TokenInfo constructor(tokenInfo: TokenInfo, list: TokenList) { this.tokenInfo = tokenInfo this.list = list } private _checksummedAddress: string | null = null public get address(): string { if (this._checksummedAddress) return this._checksummedAddress const checksummedAddress = isAddress(this.tokenInfo.address) if (!checksummedAddress) throw new Error(`Invalid token address: ${this.tokenInfo.address}`) return (this._checksummedAddress = checksummedAddress) } public get chainId(): number { return this.tokenInfo.chainId } public get decimals(): number { return this.tokenInfo.decimals } public get name(): string { return this.tokenInfo.name } public get symbol(): string { return this.tokenInfo.symbol } public get logoURI(): string | undefined { return this.tokenInfo.logoURI } private _tags: TagInfo[] | null = null public get tags(): TagInfo[] { if (this._tags !== null) return this._tags if (!this.tokenInfo.tags) return (this._tags = []) const listTags = this.list.tags if (!listTags) return (this._tags = []) return (this._tags = this.tokenInfo.tags.map((tagId) => { return { ...listTags[tagId], id: tagId, } })) } equals(other: Currency): boolean { return other.chainId === this.chainId && other.isToken && other.address.toLowerCase() === this.address.toLowerCase() } sortsBefore(other: Token): boolean { if (this.equals(other)) throw new Error('Addresses should not be equal') return this.address.toLowerCase() < other.address.toLowerCase() } public get wrapped(): Token { return this } }