Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
FlatWhiteWithSugar committed Feb 9, 2025
2 parents c634a17 + 7b6cb54 commit 16e41da
Show file tree
Hide file tree
Showing 68 changed files with 2,005 additions and 2,445 deletions.
49 changes: 37 additions & 12 deletions .github/workflows/utility/chain_registry.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -210,19 +210,30 @@ export function setFileProperty(chainName, file, property, value) {
export function getIBCFileProperty(chainName1, chainName2, property) {
const chain1Directory = chainNameToDirectoryMap.get(chainName1);
const chain2Directory = chainNameToDirectoryMap.get(chainName2);
if(chain1Directory && chain2Directory) {
if(path.join(chain1Directory, "..") == path.join(chain2Directory, "..")) {
const ibcDirectory = path.join(chain1Directory, "..", "_IBC");
let list = [chainName1, chainName2];
list = list.sort();
const fileName = list[0] + '-' + list[1] + '.json';
const filePath = path.join(ibcDirectory, fileName);
const FILE_EXISTS = fs.existsSync(filePath);
if(FILE_EXISTS) {
return readJsonFile(filePath)[property];
}
}
if (!chain1Directory || !chain2Directory) {
return; // One or both chains are missing from the directory map
}


// Check which directory has the _IBC folder
let ibcDirectory;
if (fs.existsSync(path.join(chain1Directory, "..", "_IBC"))) {
ibcDirectory = path.join(chain1Directory, "..", "_IBC");
} else if (fs.existsSync(path.join(chain2Directory, "..", "_IBC"))) {
ibcDirectory = path.join(chain2Directory, "..", "_IBC");
} else {
return; // No _IBC directory found
}

// Ensure file ordering is consistent
let list = [chainName1, chainName2].sort();
const fileName = `${list[0]}-${list[1]}.json`;
const filePath = path.join(ibcDirectory, fileName);

if (fs.existsSync(filePath)) {
return readJsonFile(filePath)[property];
}

}

export function getAssetProperty(chainName, baseDenom, property) {
Expand Down Expand Up @@ -324,6 +335,20 @@ export function getAssetPropertyWithTraceCustom(chainName, baseDenom, property,
return getAssetPropertyWithTraceCustom(originAsset.chainName, originAsset.baseDenom, property, types);
}

export function getAssetPropertyFromOriginWithTraceCustom(chainName, baseDenom, property, types) {
if (property === "traces") { return; }
let traces = getAssetProperty(chainName, baseDenom, "traces");
if (!traces) { return getAssetProperty(chainName, baseDenom, property); }
if (!types.includes(traces[traces.length - 1].type)) {
return getAssetProperty(chainName, baseDenom, property);
}
let originAsset = {
chainName: traces[traces.length - 1].counterparty.chain_name,
baseDenom: traces[traces.length - 1].counterparty.base_denom
}
return getAssetPropertyFromOriginWithTraceCustom(originAsset.chainName, originAsset.baseDenom, property, types);
}

export function getAssetPropertyWithTraceIBC(chainName, baseDenom, property) {
let value = getAssetProperty(chainName, baseDenom, property);
if (!value) {
Expand Down
43 changes: 43 additions & 0 deletions .github/workflows/utility/coingecko_data.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import fs from 'fs/promises';

const COINGECKO_API_URL = 'https://api.coingecko.com/api/v3/coins/list';
const COINGECKO_JSON_PATH = './state/coingecko.json';

export const coingecko_data = {
api_response: null,
state: {
coingecko_data: []
}
}
export let coingecko_api_response = {};

export async function fetchCoingeckoData() {
console.log("fetching CoinGecko data...");
try {
const response = await fetch(COINGECKO_API_URL);
coingecko_data.api_response = await response.json();
} catch (error) {
console.error('Error fetching Coingecko data:', error);
}
}

export async function loadCoingeckoState() {
try {
const data = await fs.readFile(COINGECKO_JSON_PATH, 'utf8');
return JSON.parse(data);
} catch (error) {
if (error.code === 'ENOENT') {
return { coingecko_data: [] }; // Return empty structure if file doesn't exist
}
throw error;
}
}

export async function saveCoingeckoState(data) {
await fs.writeFile(COINGECKO_JSON_PATH, JSON.stringify(data, null, 2));
}

function main() {
return;
}

76 changes: 42 additions & 34 deletions .github/workflows/utility/state/coingecko.json
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,10 @@
"chain_name": "cosmoshub",
"base_denom": "uatom"
},
{
"chain_name": "mantrachain",
"base_denom": "ibc/A4DB47A9D3CF9A068D454513891B526702455D3EF08FB9EB558C561F9DC2B701"
},
{
"chain_name": "pryzm",
"base_denom": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2"
Expand Down Expand Up @@ -470,7 +474,7 @@
},
{
"coingecko_id": "dragon-coin-2",
"_comment": "Dragon $DGN",
"_comment": "Dragon Coin $DGN",
"assets": [
{
"chain_name": "dungeon",
Expand Down Expand Up @@ -1044,6 +1048,42 @@
}
]
},
{
"coingecko_id": "ondo-us-dollar-yield",
"_comment": "Ondo US Dollar Yield $USDY",
"assets": [
{
"chain_name": "mantrachain",
"base_denom": "ibc/6749D16BC09F419C090C330FC751FFF1C96143DB7A4D2FCAEC2F348A3E17618A"
},
{
"chain_name": "noble",
"base_denom": "ausdy"
}
]
},
{
"coingecko_id": "osmosis",
"_comment": "Osmosis $OSMO",
"assets": [
{
"chain_name": "mantrachain",
"base_denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518"
},
{
"chain_name": "osmosis",
"base_denom": "uosmo"
},
{
"chain_name": "pryzm",
"base_denom": "ibc/13B2C536BB057AC79D5616B8EA1B9540EC1F2170718CAFF6F0083C966FFFED0B"
},
{
"chain_name": "teritori",
"base_denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518"
}
]
},
{
"coingecko_id": "cacao",
"_comment": "Cacao $CACAO",
Expand Down Expand Up @@ -1214,16 +1254,6 @@
}
]
},
{
"coingecko_id": "ondo-us-dollar-yield",
"_comment": "Ondo US Dollar Yield $USDY",
"assets": [
{
"chain_name": "noble",
"base_denom": "ausdy"
}
]
},
{
"coingecko_id": "nolus",
"_comment": "Nolus $NLS",
Expand Down Expand Up @@ -1348,24 +1378,6 @@
}
]
},
{
"coingecko_id": "osmosis",
"_comment": "Osmosis $OSMO",
"assets": [
{
"chain_name": "osmosis",
"base_denom": "uosmo"
},
{
"chain_name": "pryzm",
"base_denom": "ibc/13B2C536BB057AC79D5616B8EA1B9540EC1F2170718CAFF6F0083C966FFFED0B"
},
{
"chain_name": "teritori",
"base_denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518"
}
]
},
{
"coingecko_id": "ion",
"_comment": "Ion DAO $ION",
Expand Down Expand Up @@ -1732,7 +1744,7 @@
},
{
"coingecko_id": "sifchain",
"_comment": "Sifchain Rowan $ROWAN",
"_comment": "Sifchain $ROWAN",
"assets": [
{
"chain_name": "sifchain",
Expand Down Expand Up @@ -2047,10 +2059,6 @@
{
"chain_name": "ethereum",
"base_denom": "0x6b175474e89094c44da98b954eedeac495271d0f"
},
{
"chain_name": "ethereum",
"base_denom": "0x83F20F44975D03b1b09e64809B757c47f942BEeA"
}
]
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,44 +1,18 @@
import fs from 'fs/promises';
import * as coingecko from './coingecko_data.mjs';
import * as chain_reg from './chain_registry.mjs';

const COINGECKO_API_URL = 'https://api.coingecko.com/api/v3/coins/list';
const COINGECKO_JSON_PATH = './state/coingecko.json';
let coingecko_data = coingecko.coingecko_data;

let coingecko_api_response = null;

chain_reg.setup("../../..");

async function fetchCoingeckoData() {
try {
const response = await fetch(COINGECKO_API_URL);
coingecko_api_response = await response.json();
} catch (error) {
console.error('Error fetching Coingecko data:', error);
}
}

export async function loadCoingeckoState() {
try {
const data = await fs.readFile(COINGECKO_JSON_PATH, 'utf8');
return JSON.parse(data);
} catch (error) {
if (error.code === 'ENOENT') {
return { coingecko_data: [] }; // Return empty structure if file doesn't exist
}
throw error;
}
}

async function saveCoingeckoState(data) {
await fs.writeFile(COINGECKO_JSON_PATH, JSON.stringify(data, null, 2));
function getAssetPointers(networkType = "mainnet") {
//let assetPointers = chain_reg.getAssetPointersByNetworkType(networkType);
let assetPointers = chain_reg.getAssetPointers();
return assetPointers;
}


async function removeInvalidCoingeckoIds() {

//const assetPointers = getAllAssetPointers(); // Replace with your function
await fetchCoingeckoData();
const validCoingeckoIds = new Set(coingecko_api_response.map(entry => entry.id));
await coingecko.fetchCoingeckoData();
const validCoingeckoIds = new Set(coingecko_data?.api_response.map(entry => entry.id));

const assetPointers = getAssetPointers();
for (const asset of assetPointers) {
Expand All @@ -55,8 +29,8 @@ async function generateCoingeckoStateFile() {
const coingeckoState = {};//await loadCoingeckoState();// Use this for validation
coingeckoState.coingecko_data = [];

await fetchCoingeckoData();
if (!coingecko_api_response) {
await coingecko.fetchCoingeckoData();
if (!coingecko_data?.api_response) {
console.log("No CoinGecko API Response");
return;
}
Expand All @@ -66,7 +40,7 @@ async function generateCoingeckoStateFile() {
const coingecko_id = chain_reg.getAssetProperty(asset.chain_name, asset.base_denom, "coingecko_id");
if (!coingecko_id) { continue; }

const coingeckoEntry = coingecko_api_response.find(entry => entry.id === coingecko_id);
const coingeckoEntry = coingecko_data?.api_response?.find(entry => entry.id === coingecko_id);
if (!coingeckoEntry) {
console.log(`Missing Coingecko ID: ${coingecko_id} for asset`, asset);
continue;
Expand All @@ -77,21 +51,21 @@ async function generateCoingeckoStateFile() {

if (
registryName !== coingeckoEntry.name
&&
&&
registrySymbol.toUpperCase() !== coingeckoEntry.symbol.toUpperCase()
) {
console.warn(`Warning: Mismatch of both Name and Symbol for Coingecko ID ${coingecko_id}. Registry: "${registryName} $${registrySymbol}", Coingecko: "${coingeckoEntry.name} $${coingeckoEntry.symbol.toUpperCase()}"`);
}

let coingeckoDataEntry = coingeckoState.coingecko_data.find(entry => entry.coingecko_id === coingecko_id);
let coingeckoDataEntry = coingecko_data?.state?.coingecko_data?.find(entry => entry.coingecko_id === coingecko_id);
if (!coingeckoDataEntry) {
coingeckoDataEntry = {
coingecko_id,
//_comment: `${coingeckoEntry.name} $${coingeckoEntry.symbol.toUpperCase()}`,
_comment: `${chain_reg.getAssetProperty(asset.chain_name, asset.base_denom, "name")} $${chain_reg.getAssetProperty(asset.chain_name, asset.base_denom, "symbol")}`,
assets: []
};
coingeckoState.coingecko_data.push(coingeckoDataEntry);
coingecko_data?.state?.coingecko_data?.push(coingeckoDataEntry);
}

const assetExists = coingeckoDataEntry.assets.some(a => a.chain_name === asset.chain_name && a.base_denom === asset.base_denom);
Expand All @@ -100,20 +74,15 @@ async function generateCoingeckoStateFile() {
}
}

await saveCoingeckoState(coingeckoState);
await coingecko.saveCoingeckoState(coingecko_data?.state);
}

function getAssetPointers() {
const networkType = "mainnet";
let assetPointers = chain_reg.getAssetPointersByNetworkType(networkType);
return assetPointers;
function main() {
return;
}

(async function main() {
})();


if (process.argv.length > 2) {
chain_reg.setup("../../..");
const command = process.argv[2];
if (command === 'generateCoingeckoStateFile') {
generateCoingeckoStateFile();
Expand All @@ -124,4 +93,4 @@ if (process.argv.length > 2) {
}
} else {
main();
}
}
Loading

0 comments on commit 16e41da

Please sign in to comment.