pyth-crosschain/contract_manager/scripts/fetch_fees.ts

65 lines
1.8 KiB
TypeScript

import yargs from "yargs";
import { hideBin } from "yargs/helpers";
import {
AptosPriceFeedContract,
CosmWasmPriceFeedContract,
DefaultStore,
EvmPriceFeedContract,
} from "../src";
const parser = yargs(hideBin(process.argv))
.usage("Usage: $0")
.options({
testnet: {
type: "boolean",
default: false,
desc: "Fetch testnet contract fees instead of mainnet",
},
});
async function main() {
const argv = await parser.argv;
const prices: Record<string, number> = {};
for (const token of Object.values(DefaultStore.tokens)) {
const price = await token.getPriceForMinUnit();
// We're going to ignore the value of tokens that aren't configured
// in the store -- these are likely not worth much anyway.
if (price !== undefined) {
prices[token.id] = price;
}
}
let totalFeeUsd = 0;
for (const contract of Object.values(DefaultStore.contracts)) {
if (contract.getChain().isMainnet() === argv.testnet) continue;
if (
contract instanceof AptosPriceFeedContract ||
contract instanceof EvmPriceFeedContract ||
contract instanceof CosmWasmPriceFeedContract
) {
try {
const fee = await contract.getTotalFee();
let feeUsd = 0;
if (fee.denom !== undefined && prices[fee.denom] !== undefined) {
feeUsd = Number(fee.amount) * prices[fee.denom];
totalFeeUsd += feeUsd;
console.log(
`${contract.getId()} ${fee.amount} ${fee.denom} ($${feeUsd})`
);
} else {
console.log(
`${contract.getId()} ${fee.amount} ${fee.denom} ($ value unknown)`
);
}
} catch (e) {
console.error(`Error fetching fees for ${contract.getId()}`, e);
}
}
}
console.log(`Total fees in USD: $${totalFeeUsd}`);
}
main();