import { toSvg } from 'jdenticon'; import btoa from 'btoa'; import { ProfilePictureConfig } from './types'; export const PROFILE_PICTURE_PROGRAM = '0xce6e31b36eb24693cf7a0cff0754a4b791828bd1'; export const PROFILE_PICTURE_STATE = '0x88b01f117518ac98c7dec183c5f0a4d54e64898b'; const canBeResized = (url) => { return !( url.includes('.svg') || url.endsWith('.svg') || url.endsWith('=svg') || url.endsWith('.gif') || url.endsWith('=gif') || url.startsWith('data:') ); }; export const getResizedImageUrl = (url, options = { width: 100 }, resizable = true) => { if (!url) { return false; } if (!canBeResized(url) || !resizable) { return url; } const optionsString = Object.keys(options) .map((item) => `${encodeURIComponent(item)}=${encodeURIComponent(options[item])}`) .join(','); return `https://aptos-cdn.com/cdn-cgi/image/${optionsString}/${url}`; }; export function generateUrl( url: string | null, ownerAddress: string, config: ProfilePictureConfig ): string { if (url) { if (config.resize) { return getResizedImageUrl(url, config.resize, config.resizable); } return url; } if (config.fallback) { const svg = toSvg(ownerAddress.toString(), 100); return `data:image/svg+xml;base64,${btoa(svg)}`; } return 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaGVpZ2h0PSIxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgaWQ9ImJvcmRlcnMtYW5kLWJhY2tncm91bmRzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LDQpIj48cGF0aCBkPSJtMCAwaDEwdjFoLTl2MTRoMXYxaC0yeiIvPjxwYXRoIGQ9Im0xMCA0aDR2M2gtMXYtMmgtM3oiLz48cGF0aCBkPSJtMTQgMTZ2LTZoLTF2NWgtNXYxeiIvPjxwYXRoIGQ9Im0xMiAxNHYtM2gtMXYyaC0ydjF6IiBmaWxsPSIjYmNiY2MzIi8+PHBhdGggZD0ibTEwIDBoMXYxaDF2MWgxdjFoMXYxaC0xdi0xaC0xdi0xaC0xdjJoLTF6IiBmaWxsPSIjODc4Nzg3Ii8+PHBhdGggZD0ibTIgMmg4djNoMnYyaC00djVoLTJ2MWgtMnYxaC0yeiIgZmlsbD0iI2JjYmNjMyIvPjwvZz48ZyBpZD0ibGVmdGV5ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNSw0KSI+PHBhdGggZD0ibTUgM2gydjNoLTN2LTJoMXYxaDF2LTFoLTF6IiBmaWxsPSIjMDA4OTFlIi8+PHBhdGggZD0ibTUgNGgxdjFoLTF6IiBmaWxsPSIjMDBmMjQ4Ii8+PHBhdGggZD0ibTcgNGgxdjJoLTF2MWgtMnYtMWgyeiIvPjwvZz48ZyBpZD0icmlnaHRleWUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUsNCkiPjxwYXRoIGQ9Im04IDdoM3YyaC0xdi0xaC0xdjFoMXYxaC0yeiIgZmlsbD0iIzAwNjRmYiIvPjxwYXRoIGQ9Im05IDhoMXYxaC0xeiIgZmlsbD0iIzAwZmJmZSIvPjxwYXRoIGQ9Im0xMCA5aDF2MWgtMXoiIGZpbGw9IiMwMDMyOTMiLz48cGF0aCBkPSJtMTEgN2gxdjJoLTF6Ii8+PHBhdGggZD0ibTggMTBoMnYxaC0yeiIvPjwvZz48ZyBpZD0ibW91dGgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUsNCkiPjxwYXRoIGQ9Im0zIDhoMXYxaDF2MWgxdjFoMXYxaC0xdi0xaC0xdi0xaC0xdi0xaC0xeiIgZmlsbD0iI2ZmMzkwMCIvPjxwYXRoIGQ9Im0zIDloMXYxaDF2MWgxdjFoLTN6IiBmaWxsPSIjZjczYWUxIi8+PHBhdGggZD0ibTMgMTJoM3YxaC0zeiIvPjwvZz48L3N2Zz4='; } export async function getMetadataFromUrl(url: string) { try { let imageUri = url?.startsWith('ipfs://') ? `https://ipfs.io/ipfs/${url?.split('ipfs://')[1]}` : url; const response = await fetch(imageUri); if (response.status >= 300) { return null; } return (await response.json()) || null; } catch (err) { return null; } } export async function getContentTypeFromUrl(url: string) { let contentType = 'image/jpg'; try { const response = await fetch(url, { method: 'HEAD' }); contentType = response.headers.get('Content-Type') || ''; } catch (err) {} return contentType; } export function canResizeContentType(contentType: string) { return contentType !== 'image/gif'; } // TODO: Remove when mainnet is live. export async function getProgramId(): Promise< Record< string, { program_id: string; global_state: string; } > > { try { const res = await fetch('https://sui-pfp.risewallet.io'); return await res.json(); } catch (e) {} return { devnet: { program_id: PROFILE_PICTURE_PROGRAM, global_state: PROFILE_PICTURE_STATE } }; } export function getNetwork(fullnode: string): string { const isMainnet = fullnode.includes('mainnet'); const isTestnet = fullnode.includes('testnet'); const network = isMainnet ? 'mainnet' : isTestnet ? 'testnet' : 'devnet'; return network; }