@fanitrade/fani-solana-tokenlist
Version:
Fanitrade Token Registry
224 lines • 17.2 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TokenListContainer = exports.getTokenMetaData = exports.addTokenToList = exports.TokenListProvider = exports.StaticTokenListResolutionStrategy = exports.Strategy = exports.SolanaTokenListResolutionStrategy = exports.CDNTokenListResolutionStrategy = exports.GitHubTokenListResolutionStrategy = exports.CLUSTER_SLUGS = exports.ENV = void 0;
const anchor = __importStar(require("@project-serum/anchor"));
const web3_js_1 = require("@solana/web3.js");
const axios_1 = __importDefault(require("axios"));
const cross_fetch_1 = require("cross-fetch");
const joi_1 = __importDefault(require("joi"));
const Metadata_1 = require("../utils/Metadata");
const sendTokenToSolanaTokenList_1 = require("../utils/sendTokenToSolanaTokenList");
const solana_tokenlist_json_1 = __importDefault(require("./../tokens/solana.tokenlist.json"));
const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');
const schema = joi_1.default.object({
chainId: joi_1.default.number().
required(),
address: joi_1.default.string()
.required(),
symbol: joi_1.default.string()
.required(),
name: joi_1.default.string()
.required(),
decimals: joi_1.default.string().
required(),
logoURI: joi_1.default.string()
.required(),
extensions: joi_1.default.object().optional()
});
var ENV;
(function (ENV) {
ENV[ENV["MainnetBeta"] = 101] = "MainnetBeta";
ENV[ENV["Testnet"] = 102] = "Testnet";
ENV[ENV["Devnet"] = 103] = "Devnet";
})(ENV = exports.ENV || (exports.ENV = {}));
exports.CLUSTER_SLUGS = {
'mainnet-beta': ENV.MainnetBeta,
testnet: ENV.Testnet,
devnet: ENV.Devnet
};
class GitHubTokenListResolutionStrategy {
constructor() {
this.repositories = [
'https://raw.githubusercontent.com/FaniTrade-Investment-L-L-C/fani-token-list/main/src/tokens/solana.tokenlist.json'
];
this.resolve = () => {
return queryJsonFiles(this.repositories);
};
}
}
exports.GitHubTokenListResolutionStrategy = GitHubTokenListResolutionStrategy;
class CDNTokenListResolutionStrategy {
constructor() {
this.repositories = [
'https://cdn.jsdelivr.net/gh/solana-labs/token-list@latest/src/tokens/solana.tokenlist.json'
];
this.resolve = () => {
return queryJsonFiles(this.repositories);
};
}
}
exports.CDNTokenListResolutionStrategy = CDNTokenListResolutionStrategy;
class SolanaTokenListResolutionStrategy {
constructor() {
this.repositories = ['https://token-list.solana.com/solana.tokenlist.json'];
this.resolve = () => {
return queryJsonFiles(this.repositories);
};
}
}
exports.SolanaTokenListResolutionStrategy = SolanaTokenListResolutionStrategy;
const queryJsonFiles = async (files) => {
const responses = (await Promise.all(files.map(async (repo) => {
try {
const response = await cross_fetch_1.fetch(repo);
const json = (await response.json());
return json;
}
catch (_a) {
console.info(`@solana/token-registry: falling back to static repository.`);
return solana_tokenlist_json_1.default;
}
})));
return responses
.map((tokenlist) => tokenlist.tokens || [])
.reduce((acc, arr) => acc.concat(arr), []);
};
var Strategy;
(function (Strategy) {
Strategy["GitHub"] = "GitHub";
Strategy["Static"] = "Static";
Strategy["Solana"] = "Solana";
Strategy["CDN"] = "CDN";
})(Strategy = exports.Strategy || (exports.Strategy = {}));
class StaticTokenListResolutionStrategy {
constructor() {
this.resolve = () => {
return solana_tokenlist_json_1.default.tokens || [];
};
}
}
exports.StaticTokenListResolutionStrategy = StaticTokenListResolutionStrategy;
class TokenListProvider {
constructor() {
this.resolve = async (strategy = Strategy.CDN) => {
return new TokenListContainer(await TokenListProvider.strategies[strategy].resolve());
};
}
}
exports.TokenListProvider = TokenListProvider;
TokenListProvider.strategies = {
[Strategy.GitHub]: new GitHubTokenListResolutionStrategy(),
[Strategy.Static]: new StaticTokenListResolutionStrategy(),
[Strategy.Solana]: new SolanaTokenListResolutionStrategy(),
[Strategy.CDN]: new CDNTokenListResolutionStrategy()
};
async function getMetadata(mint) {
return (await anchor.web3.PublicKey.findProgramAddress([
Buffer.from('metadata'),
TOKEN_METADATA_PROGRAM_ID.toBuffer(),
mint.toBuffer()
], TOKEN_METADATA_PROGRAM_ID))[0];
}
async function addTokenToList(gitAccessToken, tokenDetails) {
// const { address, symbol, name, decimals, logoURI, extensions } = tokenDetails;
console.log(gitAccessToken);
const { error } = schema.validate(Object.assign({}, tokenDetails));
if (error) {
console.log(error);
return ({
status: "Failed",
message: "Error Creating Token",
detail: error.details[0].message
});
}
else {
const isEmpty = Object.values(tokenDetails.extensions).every(x => x === null || x === '');
if (isEmpty) {
delete tokenDetails.extensions;
console.log("deleting extension obj values...");
console.log(tokenDetails);
}
else {
Object.keys(tokenDetails.extensions).forEach((k) => tokenDetails.extensions[k] == '' && delete tokenDetails.extensions[k]);
console.log("deleting unused values");
console.log(tokenDetails);
}
const reuslt = await sendTokenToSolanaTokenList_1.sendToSolanaTokenList(gitAccessToken, tokenDetails);
return reuslt;
}
}
exports.addTokenToList = addTokenToList;
async function getTokenMetaData(connection, mint) {
var _a;
let fetchedData;
const metaData = await getMetadata(new web3_js_1.PublicKey(mint));
const accountInfo = await connection.getParsedAccountInfo(metaData);
const decodedData = Metadata_1.decodeMetadata((_a = accountInfo === null || accountInfo === void 0 ? void 0 : accountInfo.value) === null || _a === void 0 ? void 0 : _a.data);
if (decodedData) {
const url = encodeURI(decodedData.data.uri);
return axios_1.default.get(url.split('%00%00%00%00')[0]).then((res) => {
fetchedData = res.data;
return new Promise(function (resolve) {
resolve(fetchedData);
});
});
}
else {
return {};
// // @ts-ignore
// new Promise(function (resolve, reject) {
// reject({});
// });
}
}
exports.getTokenMetaData = getTokenMetaData;
class TokenListContainer {
constructor(tokenList) {
this.tokenList = tokenList;
this.filterByTag = (tag) => {
return new TokenListContainer(this.tokenList.filter((item) => (item.tags || []).includes(tag)));
};
this.filterByChainId = (chainId) => {
return new TokenListContainer(this.tokenList.filter((item) => item.chainId === chainId));
};
this.excludeByChainId = (chainId) => {
return new TokenListContainer(this.tokenList.filter((item) => item.chainId !== chainId));
};
this.excludeByTag = (tag) => {
return new TokenListContainer(this.tokenList.filter((item) => !(item.tags || []).includes(tag)));
};
this.filterByClusterSlug = (slug) => {
if (slug in exports.CLUSTER_SLUGS) {
return this.filterByChainId(exports.CLUSTER_SLUGS[slug]);
}
throw new Error(`Unknown slug: ${slug}, please use one of ${Object.keys(exports.CLUSTER_SLUGS)}`);
};
this.getList = () => {
return this.tokenList;
};
}
}
exports.TokenListContainer = TokenListContainer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90b2tlbmxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhEQUFnRDtBQUNoRCw2Q0FBd0Q7QUFDeEQsa0RBQTBCO0FBQzFCLDZDQUFvQztBQUNwQyw4Q0FBc0I7QUFFdEIsZ0RBQW1EO0FBQ25ELG9GQUE0RTtBQUM1RSw4RkFBMEQ7QUFDMUQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUN6RCw2Q0FBNkMsQ0FDOUMsQ0FBQztBQUdGLE1BQU0sTUFBTSxHQUFHLGFBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEIsT0FBTyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7UUFDUixRQUFRLEVBQUU7SUFDdkIsT0FBTyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDaEIsUUFBUSxFQUFFO0lBRWYsTUFBTSxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7SUFFdEIsSUFBSSxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7SUFFcEIsUUFBUSxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7UUFDYixRQUFRLEVBQUU7SUFDbkIsT0FBTyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDUixRQUFRLEVBQUU7SUFDdkIsVUFBVSxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDcEMsQ0FBQyxDQUFBO0FBSUYsSUFBWSxHQUlYO0FBSkQsV0FBWSxHQUFHO0lBQ2IsNkNBQWlCLENBQUE7SUFDakIscUNBQWEsQ0FBQTtJQUNiLG1DQUFZLENBQUE7QUFDZCxDQUFDLEVBSlcsR0FBRyxHQUFILFdBQUcsS0FBSCxXQUFHLFFBSWQ7QUErQ1ksUUFBQSxhQUFhLEdBQTBCO0lBQ2xELGNBQWMsRUFBRSxH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