@reown/appkit-controllers
Version:
The full stack toolkit to build onchain app UX.
183 lines • 6.29 kB
JavaScript
import { proxy } from 'valtio/vanilla';
import { ConstantsUtil } from '@reown/appkit-common';
import { ApiController } from '../controllers/ApiController.js';
import { AssetController } from '../controllers/AssetController.js';
import { OptionsController } from '../controllers/OptionsController.js';
const namespaceImageIds = {
// Ethereum
eip155: 'ba0ba0cd-17c6-4806-ad93-f9d174f17900',
// Solana
solana: 'a1b58899-f671-4276-6a5e-56ca5bd59700',
// Polkadot
polkadot: '',
// Bitcoin
bip122: '0b4838db-0161-4ffe-022d-532bf03dba00',
// Cosmos
cosmos: '',
// Sui
sui: '',
// Stacks
stacks: '',
// TON
ton: '20f673c0-095e-49b2-07cf-eb5049dcf600',
// TRON
tron: '3502bb86-cc4e-420f-a387-59ea63a28b00'
};
// -- State --------------------------------------------- //
const state = proxy({
networkImagePromises: {},
tokenImagePromises: {}
});
// -- Util ---------------------------------------- //
export const AssetUtil = {
async fetchWalletImage(imageId) {
if (!imageId) {
return undefined;
}
await ApiController._fetchWalletImage(imageId);
return this.getWalletImageById(imageId);
},
async fetchNetworkImage(imageId) {
if (!imageId) {
return undefined;
}
const existingImage = this.getNetworkImageById(imageId);
// Check if the image already exists
if (existingImage) {
return existingImage;
}
// Check if the promise is already created
if (!state.networkImagePromises[imageId]) {
state.networkImagePromises[imageId] = ApiController._fetchNetworkImage(imageId);
}
await state.networkImagePromises[imageId];
return this.getNetworkImageById(imageId);
},
/**
* Fetches the token image for the given image ID.
* @param imageId - The image id of the token.
* @returns The token image.
*/
async fetchTokenImage(imageId) {
if (!imageId) {
return undefined;
}
if (!state.tokenImagePromises[imageId]) {
state.tokenImagePromises[imageId] = ApiController._fetchTokenImage(imageId);
}
await state.tokenImagePromises[imageId];
return this.getTokenImage(imageId);
},
getWalletImageById(imageId) {
if (!imageId) {
return undefined;
}
return AssetController.state.walletImages[imageId];
},
getWalletImage(wallet) {
if (wallet?.image_url) {
return wallet?.image_url;
}
if (wallet?.image_id) {
return AssetController.state.walletImages[wallet.image_id];
}
return undefined;
},
getNetworkImage(network) {
if (network?.assets?.imageUrl) {
return network?.assets?.imageUrl;
}
if (network?.assets?.imageId) {
return AssetController.state.networkImages[network.assets.imageId];
}
return undefined;
},
getNetworkImageById(imageId) {
if (!imageId) {
return undefined;
}
return AssetController.state.networkImages[imageId];
},
getConnectorImage(connector) {
if (connector?.imageUrl) {
return connector.imageUrl;
}
if (connector?.info?.icon) {
return connector.info.icon;
}
if (connector?.imageId) {
return AssetController.state.connectorImages[connector.imageId];
}
return undefined;
},
getChainImage(chain) {
return AssetController.state.networkImages[namespaceImageIds[chain]];
},
getTokenImage(symbol) {
if (!symbol) {
return undefined;
}
return AssetController.state.tokenImages[symbol];
},
/**
* Get the explorer wallet's image URL for the given image ID.
* @param imageId - The image id of the wallet.
* @returns The image URL for the wallet.
*/
getWalletImageUrl(imageId) {
if (!imageId) {
return '';
}
const { projectId, sdkType, sdkVersion } = OptionsController.state;
const url = new URL(`${ConstantsUtil.W3M_API_URL}/getWalletImage/${imageId}`);
url.searchParams.set('projectId', projectId);
url.searchParams.set('st', sdkType);
url.searchParams.set('sv', sdkVersion);
return url.toString();
},
/**
* Get the public asset's image URL with the given image ID.
* @param imageId - The image id of the asset.
* @returns The image URL for the asset.
*/
getAssetImageUrl(imageId) {
if (!imageId) {
return '';
}
const { projectId, sdkType, sdkVersion } = OptionsController.state;
const url = new URL(`${ConstantsUtil.W3M_API_URL}/public/getAssetImage/${imageId}`);
url.searchParams.set('projectId', projectId);
url.searchParams.set('st', sdkType);
url.searchParams.set('sv', sdkVersion);
return url.toString();
},
/**
* Get the image URL for the given chain namespace.
* @param chainNamespace - The chain namespace to get the image URL for.
* @returns The image URL for the chain namespace.
*/
getChainNamespaceImageUrl(chainNamespace) {
return this.getAssetImageUrl(namespaceImageIds[chainNamespace]);
},
/**
* Get the image id for the given token and namespace.
* @param token - The token address or 'native' to get the image id for.
* @param namespace - The namespace to get the image id for.
* @returns The image URL for the token.
*/
async getImageByToken(token, namespace) {
if (token === 'native') {
const imageId = ConstantsUtil.NATIVE_IMAGE_IDS_BY_NAMESPACE[namespace] ?? null;
if (!imageId) {
return undefined;
}
return AssetUtil.fetchNetworkImage(imageId);
}
const [, symbol] = Object.entries(ConstantsUtil.TOKEN_SYMBOLS_BY_ADDRESS).find(([address]) => address.toLowerCase() === token.toLowerCase()) ?? [];
if (!symbol) {
return undefined;
}
return AssetUtil.fetchTokenImage(symbol);
}
};
//# sourceMappingURL=AssetUtil.js.map