bostrom-mcp/src/services/economy.ts

import { lcdGet } from "../clients/lcd.js";

export async function getBalances(address: string) {
  const result = await lcdGet<{
    balances: Array<{ denom: string; amount: string }>;
  }>(`/cosmos/bank/v1beta1/balances/${address}`);
  return result.balances;
}

export async function getSupply(denom: string) {
  const result = await lcdGet<{
    amount: { denom: string; amount: string };
  }>(`/cosmos/bank/v1beta1/supply/by_denom?denom=${encodeURIComponent(denom)}`);
  return result.amount;
}

export async function getMintPrice() {
  try {
    return await lcdGet("/cyber/resources/v1beta1/resources/params");
  } catch {
    try {
      return await lcdGet("/cyber/resources/v1beta1/params");
    } catch {
      return { error: "Resources endpoint not available on this LCD node" };
    }
  }
}

export async function getStaking(address: string) {
  const [delegations, rewards, unbonding] = await Promise.all([
    lcdGet<{
      delegation_responses: Array<{
        delegation: { validator_address: string; shares: string };
        balance: { denom: string; amount: string };
      }>;
    }>(`/cosmos/staking/v1beta1/delegations/${address}`).catch(() => ({
      delegation_responses: [],
    })),
    lcdGet<{
      total: Array<{ denom: string; amount: string }>;
      rewards: Array<{
        validator_address: string;
        reward: Array<{ denom: string; amount: string }>;
      }>;
    }>(
      `/cosmos/distribution/v1beta1/delegators/${address}/rewards`,
    ).catch(() => ({ total: [], rewards: [] })),
    lcdGet<{
      unbonding_responses: Array<{
        validator_address: string;
        entries: Array<{ balance: string; completion_time: string }>;
      }>;
    }>(
      `/cosmos/staking/v1beta1/delegators/${address}/unbonding_delegations`,
    ).catch(() => ({ unbonding_responses: [] })),
  ]);

  return {
    delegations: delegations.delegation_responses.map((d) => ({
      validator: d.delegation.validator_address,
      amount: d.balance,
    })),
    total_rewards: rewards.total,
    rewards_by_validator: rewards.rewards?.map((r) => ({
      validator: r.validator_address,
      reward: r.reward,
    })),
    unbonding: unbonding.unbonding_responses,
  };
}

export async function getPools() {
  try {
    return await lcdGet("/cosmos/liquidity/v1beta1/pools");
  } catch {
    try {
      return await lcdGet("/osmosis/gamm/v1beta1/pools");
    } catch {
      return { error: "Liquidity pools endpoint not available" };
    }
  }
}

export async function getInflation() {
  const [inflation, params] = await Promise.all([
    lcdGet<{ inflation: string }>("/cosmos/mint/v1beta1/inflation").catch(
      () => ({ inflation: "unknown" }),
    ),
    lcdGet("/cosmos/mint/v1beta1/params").catch(() => null),
  ]);
  return { inflation: inflation.inflation, params };
}

Synonyms

bostrom-mcp/src/tools/economy.ts

Neighbours